1*61046927SAndroid Build Coastguard Worker /* 2*61046927SAndroid Build Coastguard Worker * Copyright 2011 Christoph Bumiller 3*61046927SAndroid Build Coastguard Worker * 4*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a 5*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"), 6*61046927SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation 7*61046927SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8*61046927SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the 9*61046927SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions: 10*61046927SAndroid Build Coastguard Worker * 11*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice shall be included in 12*61046927SAndroid Build Coastguard Worker * all copies or substantial portions of the Software. 13*61046927SAndroid Build Coastguard Worker * 14*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15*61046927SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17*61046927SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 18*61046927SAndroid Build Coastguard Worker * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19*61046927SAndroid Build Coastguard Worker * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20*61046927SAndroid Build Coastguard Worker * OTHER DEALINGS IN THE SOFTWARE. 21*61046927SAndroid Build Coastguard Worker */ 22*61046927SAndroid Build Coastguard Worker 23*61046927SAndroid Build Coastguard Worker #ifndef __NV50_IR_H__ 24*61046927SAndroid Build Coastguard Worker #define __NV50_IR_H__ 25*61046927SAndroid Build Coastguard Worker 26*61046927SAndroid Build Coastguard Worker #include <stdio.h> 27*61046927SAndroid Build Coastguard Worker #include <stdlib.h> 28*61046927SAndroid Build Coastguard Worker #include <stdint.h> 29*61046927SAndroid Build Coastguard Worker #include <deque> 30*61046927SAndroid Build Coastguard Worker #include <list> 31*61046927SAndroid Build Coastguard Worker #include <unordered_set> 32*61046927SAndroid Build Coastguard Worker #include <vector> 33*61046927SAndroid Build Coastguard Worker 34*61046927SAndroid Build Coastguard Worker #include "nv50_ir_util.h" 35*61046927SAndroid Build Coastguard Worker #include "nv50_ir_graph.h" 36*61046927SAndroid Build Coastguard Worker 37*61046927SAndroid Build Coastguard Worker #include "nv50_ir_driver.h" 38*61046927SAndroid Build Coastguard Worker 39*61046927SAndroid Build Coastguard Worker namespace nv50_ir { 40*61046927SAndroid Build Coastguard Worker 41*61046927SAndroid Build Coastguard Worker enum operation 42*61046927SAndroid Build Coastguard Worker { 43*61046927SAndroid Build Coastguard Worker OP_NOP = 0, 44*61046927SAndroid Build Coastguard Worker OP_PHI, 45*61046927SAndroid Build Coastguard Worker OP_UNION, // unify a new definition and several source values 46*61046927SAndroid Build Coastguard Worker OP_SPLIT, // $r0d -> { $r0, $r1 } ($r0d and $r0/$r1 will be coalesced) 47*61046927SAndroid Build Coastguard Worker OP_MERGE, // opposite of split, e.g. combine 2 32 bit into a 64 bit value 48*61046927SAndroid Build Coastguard Worker OP_MOV, // simple copy, no modifiers allowed 49*61046927SAndroid Build Coastguard Worker OP_LOAD, 50*61046927SAndroid Build Coastguard Worker OP_STORE, 51*61046927SAndroid Build Coastguard Worker OP_ADD, // NOTE: add u64 + u32 is legal for targets w/o 64-bit integer adds 52*61046927SAndroid Build Coastguard Worker OP_SUB, 53*61046927SAndroid Build Coastguard Worker OP_MUL, 54*61046927SAndroid Build Coastguard Worker OP_DIV, 55*61046927SAndroid Build Coastguard Worker OP_MOD, 56*61046927SAndroid Build Coastguard Worker OP_MAD, 57*61046927SAndroid Build Coastguard Worker OP_FMA, 58*61046927SAndroid Build Coastguard Worker OP_SAD, // abs(src0 - src1) + src2 59*61046927SAndroid Build Coastguard Worker OP_SHLADD, 60*61046927SAndroid Build Coastguard Worker // extended multiply-add (GM107+), does a lot of things. 61*61046927SAndroid Build Coastguard Worker // see envytools for detailed documentation 62*61046927SAndroid Build Coastguard Worker OP_XMAD, 63*61046927SAndroid Build Coastguard Worker OP_ABS, 64*61046927SAndroid Build Coastguard Worker OP_NEG, 65*61046927SAndroid Build Coastguard Worker OP_NOT, 66*61046927SAndroid Build Coastguard Worker OP_AND, 67*61046927SAndroid Build Coastguard Worker OP_OR, 68*61046927SAndroid Build Coastguard Worker OP_XOR, 69*61046927SAndroid Build Coastguard Worker OP_LOP3_LUT, 70*61046927SAndroid Build Coastguard Worker OP_SHL, 71*61046927SAndroid Build Coastguard Worker OP_SHR, 72*61046927SAndroid Build Coastguard Worker OP_SHF, 73*61046927SAndroid Build Coastguard Worker OP_MAX, 74*61046927SAndroid Build Coastguard Worker OP_MIN, 75*61046927SAndroid Build Coastguard Worker OP_SAT, // CLAMP(f32, 0.0, 1.0) 76*61046927SAndroid Build Coastguard Worker OP_CEIL, 77*61046927SAndroid Build Coastguard Worker OP_FLOOR, 78*61046927SAndroid Build Coastguard Worker OP_TRUNC, 79*61046927SAndroid Build Coastguard Worker OP_CVT, 80*61046927SAndroid Build Coastguard Worker OP_SET_AND, // dst = (src0 CMP src1) & src2 81*61046927SAndroid Build Coastguard Worker OP_SET_OR, 82*61046927SAndroid Build Coastguard Worker OP_SET_XOR, 83*61046927SAndroid Build Coastguard Worker OP_SET, 84*61046927SAndroid Build Coastguard Worker OP_SELP, // dst = src2 ? src0 : src1 85*61046927SAndroid Build Coastguard Worker OP_SLCT, // dst = (src2 CMP 0) ? src0 : src1 86*61046927SAndroid Build Coastguard Worker OP_RCP, 87*61046927SAndroid Build Coastguard Worker OP_RSQ, 88*61046927SAndroid Build Coastguard Worker OP_LG2, 89*61046927SAndroid Build Coastguard Worker OP_SIN, 90*61046927SAndroid Build Coastguard Worker OP_COS, 91*61046927SAndroid Build Coastguard Worker OP_EX2, 92*61046927SAndroid Build Coastguard Worker OP_PRESIN, 93*61046927SAndroid Build Coastguard Worker OP_PREEX2, 94*61046927SAndroid Build Coastguard Worker OP_SQRT, 95*61046927SAndroid Build Coastguard Worker OP_BRA, 96*61046927SAndroid Build Coastguard Worker OP_CALL, 97*61046927SAndroid Build Coastguard Worker OP_RET, 98*61046927SAndroid Build Coastguard Worker OP_CONT, 99*61046927SAndroid Build Coastguard Worker OP_BREAK, 100*61046927SAndroid Build Coastguard Worker OP_PRERET, 101*61046927SAndroid Build Coastguard Worker OP_PRECONT, 102*61046927SAndroid Build Coastguard Worker OP_PREBREAK, 103*61046927SAndroid Build Coastguard Worker OP_BRKPT, // breakpoint (not related to loops) 104*61046927SAndroid Build Coastguard Worker OP_JOINAT, // push control flow convergence point 105*61046927SAndroid Build Coastguard Worker OP_JOIN, // converge 106*61046927SAndroid Build Coastguard Worker OP_DISCARD, 107*61046927SAndroid Build Coastguard Worker OP_EXIT, 108*61046927SAndroid Build Coastguard Worker OP_MEMBAR, // memory barrier (mfence, lfence, sfence) 109*61046927SAndroid Build Coastguard Worker OP_VFETCH, // indirection 0 in attribute space, indirection 1 is vertex base 110*61046927SAndroid Build Coastguard Worker OP_PFETCH, // fetch base address of vertex src0 (immediate) [+ src1] 111*61046927SAndroid Build Coastguard Worker OP_AFETCH, // fetch base address of shader input (a[%r1+0x10]) 112*61046927SAndroid Build Coastguard Worker OP_EXPORT, 113*61046927SAndroid Build Coastguard Worker OP_LINTERP, 114*61046927SAndroid Build Coastguard Worker OP_PINTERP, 115*61046927SAndroid Build Coastguard Worker OP_EMIT, // emit vertex 116*61046927SAndroid Build Coastguard Worker OP_RESTART, // restart primitive 117*61046927SAndroid Build Coastguard Worker OP_FINAL, // finish emitting primitives 118*61046927SAndroid Build Coastguard Worker OP_TEX, 119*61046927SAndroid Build Coastguard Worker OP_TXB, // texture bias 120*61046927SAndroid Build Coastguard Worker OP_TXL, // texture lod 121*61046927SAndroid Build Coastguard Worker OP_TXF, // texel fetch 122*61046927SAndroid Build Coastguard Worker OP_TXQ, // texture size query 123*61046927SAndroid Build Coastguard Worker OP_TXD, // texture derivatives 124*61046927SAndroid Build Coastguard Worker OP_TXG, // texture gather 125*61046927SAndroid Build Coastguard Worker OP_TXLQ, // texture query lod 126*61046927SAndroid Build Coastguard Worker OP_TEXCSAA, // texture op for coverage sampling 127*61046927SAndroid Build Coastguard Worker OP_TEXPREP, // turn cube map array into 2d array coordinates 128*61046927SAndroid Build Coastguard Worker OP_SULDB, // surface load (raw) 129*61046927SAndroid Build Coastguard Worker OP_SULDP, // surface load (formatted) 130*61046927SAndroid Build Coastguard Worker OP_SUSTB, // surface store (raw) 131*61046927SAndroid Build Coastguard Worker OP_SUSTP, // surface store (formatted) 132*61046927SAndroid Build Coastguard Worker OP_SUREDB, 133*61046927SAndroid Build Coastguard Worker OP_SUREDP, // surface reduction (atomic op) 134*61046927SAndroid Build Coastguard Worker OP_SULEA, // surface load effective address 135*61046927SAndroid Build Coastguard Worker OP_SUBFM, // surface bitfield manipulation 136*61046927SAndroid Build Coastguard Worker OP_SUCLAMP, // clamp surface coordinates 137*61046927SAndroid Build Coastguard Worker OP_SUEAU, // surface effective address 138*61046927SAndroid Build Coastguard Worker OP_SUQ, // surface query 139*61046927SAndroid Build Coastguard Worker OP_MADSP, // special integer multiply-add 140*61046927SAndroid Build Coastguard Worker OP_TEXBAR, // texture dependency barrier 141*61046927SAndroid Build Coastguard Worker OP_DFDX, 142*61046927SAndroid Build Coastguard Worker OP_DFDY, 143*61046927SAndroid Build Coastguard Worker OP_RDSV, // read system value 144*61046927SAndroid Build Coastguard Worker OP_PIXLD, // get info about raster object or surfaces 145*61046927SAndroid Build Coastguard Worker OP_QUADOP, 146*61046927SAndroid Build Coastguard Worker OP_QUADON, 147*61046927SAndroid Build Coastguard Worker OP_QUADPOP, 148*61046927SAndroid Build Coastguard Worker OP_POPCNT, // bitcount(src0 & src1) 149*61046927SAndroid Build Coastguard Worker OP_INSBF, // insert first src1[8:15] bits of src0 into src2 at src1[0:7] 150*61046927SAndroid Build Coastguard Worker OP_EXTBF, // place bits [K,K+N) of src0 into dst, src1 = 0xNNKK 151*61046927SAndroid Build Coastguard Worker OP_BFIND, // find highest/lowest set bit 152*61046927SAndroid Build Coastguard Worker OP_BREV, // bitfield reverse 153*61046927SAndroid Build Coastguard Worker OP_BMSK, // bitfield mask 154*61046927SAndroid Build Coastguard Worker OP_PERMT, // dst = bytes from src2,src0 selected by src1 (nvc0's src order) 155*61046927SAndroid Build Coastguard Worker OP_SGXT, 156*61046927SAndroid Build Coastguard Worker OP_ATOM, 157*61046927SAndroid Build Coastguard Worker OP_BAR, // execution barrier, sources = { id, thread count, predicate } 158*61046927SAndroid Build Coastguard Worker OP_VADD, // byte/word vector operations 159*61046927SAndroid Build Coastguard Worker OP_VAVG, 160*61046927SAndroid Build Coastguard Worker OP_VMIN, 161*61046927SAndroid Build Coastguard Worker OP_VMAX, 162*61046927SAndroid Build Coastguard Worker OP_VSAD, 163*61046927SAndroid Build Coastguard Worker OP_VSET, 164*61046927SAndroid Build Coastguard Worker OP_VSHR, 165*61046927SAndroid Build Coastguard Worker OP_VSHL, 166*61046927SAndroid Build Coastguard Worker OP_VSEL, 167*61046927SAndroid Build Coastguard Worker OP_CCTL, // cache control 168*61046927SAndroid Build Coastguard Worker OP_SHFL, // warp shuffle 169*61046927SAndroid Build Coastguard Worker OP_VOTE, 170*61046927SAndroid Build Coastguard Worker OP_BUFQ, // buffer query 171*61046927SAndroid Build Coastguard Worker OP_WARPSYNC, 172*61046927SAndroid Build Coastguard Worker OP_LAST 173*61046927SAndroid Build Coastguard Worker }; 174*61046927SAndroid Build Coastguard Worker 175*61046927SAndroid Build Coastguard Worker // various instruction-specific modifier definitions Instruction::subOp 176*61046927SAndroid Build Coastguard Worker // MOV_FINAL marks a MOV originating from an EXPORT (used for placing TEXBARs) 177*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_MUL_HIGH 1 178*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_EMIT_RESTART 1 179*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_LDC_IL 1 180*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_LDC_IS 2 181*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_LDC_ISL 3 182*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_SHIFT_WRAP 1 183*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_SHIFT_HIGH 2 184*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_EMU_PRERET 1 185*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_TEXBAR(n) n 186*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_MOV_FINAL 1 187*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_EXTBF_REV 1 188*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_BFIND_SAMT 1 189*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_RCPRSQ_64H 1 190*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_PERMT_F4E 1 191*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_PERMT_B4E 2 192*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_PERMT_RC8 3 193*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_PERMT_ECL 4 194*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_PERMT_ECR 5 195*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_PERMT_RC16 6 196*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_BAR_SYNC 0 197*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_BAR_ARRIVE 1 198*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_BAR_RED_AND 2 199*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_BAR_RED_OR 3 200*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_BAR_RED_POPC 4 201*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_MEMBAR_L 1 202*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_MEMBAR_S 2 203*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_MEMBAR_M 3 204*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_MEMBAR_CTA (0 << 2) 205*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_MEMBAR_GL (1 << 2) 206*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_MEMBAR_SYS (2 << 2) 207*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_MEMBAR_DIR(m) ((m) & 0x3) 208*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_MEMBAR_SCOPE(m) ((m) & ~0x3) 209*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_MEMBAR(d,s) \ 210*61046927SAndroid Build Coastguard Worker (NV50_IR_SUBOP_MEMBAR_##d | NV50_IR_SUBOP_MEMBAR_##s) 211*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_ATOM_ADD 0 212*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_ATOM_MIN 1 213*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_ATOM_MAX 2 214*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_ATOM_INC 3 215*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_ATOM_DEC 4 216*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_ATOM_AND 5 217*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_ATOM_OR 6 218*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_ATOM_XOR 7 219*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_ATOM_CAS 8 220*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_ATOM_EXCH 9 221*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_CCTL_IV 5 222*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_CCTL_IVALL 6 223*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_SUST_IGN 0 224*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_SUST_TRAP 1 225*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_SUST_SDCL 3 226*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_SULD_ZERO 0 227*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_SULD_TRAP 1 228*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_SULD_SDCL 3 229*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_SUBFM_3D 1 230*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_SUCLAMP_2D 0x10 231*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_SUCLAMP_SD(r, d) (( 0 + (r)) | ((d == 2) ? 0x10 : 0)) 232*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_SUCLAMP_PL(r, d) (( 5 + (r)) | ((d == 2) ? 0x10 : 0)) 233*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_SUCLAMP_BL(r, d) ((10 + (r)) | ((d == 2) ? 0x10 : 0)) 234*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_PIXLD_COUNT 0 235*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_PIXLD_COVMASK 1 236*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_PIXLD_COVERED 2 237*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_PIXLD_OFFSET 3 238*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_PIXLD_CENT_OFFSET 4 239*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_PIXLD_SAMPLEID 5 240*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_SHFL_IDX 0 241*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_SHFL_UP 1 242*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_SHFL_DOWN 2 243*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_SHFL_BFLY 3 244*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_LOAD_LOCKED 1 245*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_STORE_UNLOCKED 2 246*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_MADSP_SD 0xffff 247*61046927SAndroid Build Coastguard Worker // Yes, we could represent those with DataType. 248*61046927SAndroid Build Coastguard Worker // Or put the type into operation and have a couple 1000 values in that enum. 249*61046927SAndroid Build Coastguard Worker // This will have to do for now. 250*61046927SAndroid Build Coastguard Worker // The bitfields are supposed to correspond to nve4 ISA. 251*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_MADSP(a,b,c) (((c) << 8) | ((b) << 4) | (a)) 252*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_V1(d,a,b) (((d) << 10) | ((b) << 5) | (a) | 0x0000) 253*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_V2(d,a,b) (((d) << 10) | ((b) << 5) | (a) | 0x4000) 254*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_V4(d,a,b) (((d) << 10) | ((b) << 5) | (a) | 0x8000) 255*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_Vn(n) ((n) >> 14) 256*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_VOTE_ALL 0 257*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_VOTE_ANY 1 258*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_VOTE_UNI 2 259*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_LOP3_LUT_SRC0 0xf0 260*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_LOP3_LUT_SRC1 0xcc 261*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_LOP3_LUT_SRC2 0xaa 262*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_LOP3_LUT(exp) ({ \ 263*61046927SAndroid Build Coastguard Worker uint8_t a = NV50_IR_SUBOP_LOP3_LUT_SRC0; \ 264*61046927SAndroid Build Coastguard Worker uint8_t b = NV50_IR_SUBOP_LOP3_LUT_SRC1; \ 265*61046927SAndroid Build Coastguard Worker uint8_t c = NV50_IR_SUBOP_LOP3_LUT_SRC2; \ 266*61046927SAndroid Build Coastguard Worker (uint8_t)(exp); \ 267*61046927SAndroid Build Coastguard Worker }) 268*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_BMSK_C (0 << 0) 269*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_BMSK_W (1 << 0) 270*61046927SAndroid Build Coastguard Worker 271*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_MINMAX_LOW 1 272*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_MINMAX_MED 2 273*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_MINMAX_HIGH 3 274*61046927SAndroid Build Coastguard Worker 275*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_SHF_L (0 << 0) 276*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_SHF_R (1 << 0) 277*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_SHF_LO (0 << 1) 278*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_SHF_HI (1 << 1) 279*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_SHF_C (0 << 2) 280*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_SHF_W (1 << 2) 281*61046927SAndroid Build Coastguard Worker 282*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_VFETCH_PHYS 1 283*61046927SAndroid Build Coastguard Worker 284*61046927SAndroid Build Coastguard Worker // xmad(src0, src1, 0) << 16 + src2 285*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_XMAD_PSL (1 << 0) 286*61046927SAndroid Build Coastguard Worker // (xmad(src0, src1, src2) & 0xffff) | (src1 << 16) 287*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_XMAD_MRG (1 << 1) 288*61046927SAndroid Build Coastguard Worker // xmad(src0, src1, src2.lo) 289*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_XMAD_CLO (1 << 2) 290*61046927SAndroid Build Coastguard Worker // xmad(src0, src1, src2.hi) 291*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_XMAD_CHI (2 << 2) 292*61046927SAndroid Build Coastguard Worker // if both operands to the multiplication are non-zero, subtract 65536 for each 293*61046927SAndroid Build Coastguard Worker // negative operand 294*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_XMAD_CSFU (3 << 2) 295*61046927SAndroid Build Coastguard Worker // xmad(src0, src1, src2) + src1 << 16 296*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_XMAD_CBCC (4 << 2) 297*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_XMAD_CMODE_SHIFT 2 298*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_XMAD_CMODE_MASK (0x7 << NV50_IR_SUBOP_XMAD_CMODE_SHIFT) 299*61046927SAndroid Build Coastguard Worker 300*61046927SAndroid Build Coastguard Worker // use the high 16 bits instead of the low 16 bits for the multiplication. 301*61046927SAndroid Build Coastguard Worker // if the instruction's sType is signed, sign extend the operand from 16 bits 302*61046927SAndroid Build Coastguard Worker // to 32 before multiplication. 303*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_XMAD_H1_SHIFT 5 304*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_XMAD_H1(i) (1 << (NV50_IR_SUBOP_XMAD_H1_SHIFT + (i))) 305*61046927SAndroid Build Coastguard Worker #define NV50_IR_SUBOP_XMAD_H1_MASK (0x3 << NV50_IR_SUBOP_XMAD_H1_SHIFT) 306*61046927SAndroid Build Coastguard Worker 307*61046927SAndroid Build Coastguard Worker enum DataType 308*61046927SAndroid Build Coastguard Worker { 309*61046927SAndroid Build Coastguard Worker TYPE_NONE, 310*61046927SAndroid Build Coastguard Worker TYPE_U8, 311*61046927SAndroid Build Coastguard Worker TYPE_S8, 312*61046927SAndroid Build Coastguard Worker TYPE_U16, 313*61046927SAndroid Build Coastguard Worker TYPE_S16, 314*61046927SAndroid Build Coastguard Worker TYPE_U32, 315*61046927SAndroid Build Coastguard Worker TYPE_S32, 316*61046927SAndroid Build Coastguard Worker TYPE_U64, // 64 bit operations are only lowered after register allocation 317*61046927SAndroid Build Coastguard Worker TYPE_S64, 318*61046927SAndroid Build Coastguard Worker TYPE_F16, 319*61046927SAndroid Build Coastguard Worker TYPE_F32, 320*61046927SAndroid Build Coastguard Worker TYPE_F64, 321*61046927SAndroid Build Coastguard Worker TYPE_B96, 322*61046927SAndroid Build Coastguard Worker TYPE_B128 323*61046927SAndroid Build Coastguard Worker }; 324*61046927SAndroid Build Coastguard Worker 325*61046927SAndroid Build Coastguard Worker enum CondCode 326*61046927SAndroid Build Coastguard Worker { 327*61046927SAndroid Build Coastguard Worker CC_FL = 0, 328*61046927SAndroid Build Coastguard Worker CC_NEVER = CC_FL, // when used with FILE_FLAGS 329*61046927SAndroid Build Coastguard Worker CC_LT = 1, 330*61046927SAndroid Build Coastguard Worker CC_EQ = 2, 331*61046927SAndroid Build Coastguard Worker CC_NOT_P = CC_EQ, // when used with FILE_PREDICATE 332*61046927SAndroid Build Coastguard Worker CC_LE = 3, 333*61046927SAndroid Build Coastguard Worker CC_GT = 4, 334*61046927SAndroid Build Coastguard Worker CC_NE = 5, 335*61046927SAndroid Build Coastguard Worker CC_P = CC_NE, 336*61046927SAndroid Build Coastguard Worker CC_GE = 6, 337*61046927SAndroid Build Coastguard Worker CC_TR = 7, 338*61046927SAndroid Build Coastguard Worker CC_ALWAYS = CC_TR, 339*61046927SAndroid Build Coastguard Worker CC_U = 8, 340*61046927SAndroid Build Coastguard Worker CC_LTU = 9, 341*61046927SAndroid Build Coastguard Worker CC_EQU = 10, 342*61046927SAndroid Build Coastguard Worker CC_LEU = 11, 343*61046927SAndroid Build Coastguard Worker CC_GTU = 12, 344*61046927SAndroid Build Coastguard Worker CC_NEU = 13, 345*61046927SAndroid Build Coastguard Worker CC_GEU = 14, 346*61046927SAndroid Build Coastguard Worker CC_NO = 0x10, 347*61046927SAndroid Build Coastguard Worker CC_NC = 0x11, 348*61046927SAndroid Build Coastguard Worker CC_NS = 0x12, 349*61046927SAndroid Build Coastguard Worker CC_NA = 0x13, 350*61046927SAndroid Build Coastguard Worker CC_A = 0x14, 351*61046927SAndroid Build Coastguard Worker CC_S = 0x15, 352*61046927SAndroid Build Coastguard Worker CC_C = 0x16, 353*61046927SAndroid Build Coastguard Worker CC_O = 0x17 354*61046927SAndroid Build Coastguard Worker }; 355*61046927SAndroid Build Coastguard Worker 356*61046927SAndroid Build Coastguard Worker enum RoundMode 357*61046927SAndroid Build Coastguard Worker { 358*61046927SAndroid Build Coastguard Worker ROUND_N, // nearest 359*61046927SAndroid Build Coastguard Worker ROUND_M, // towards -inf 360*61046927SAndroid Build Coastguard Worker ROUND_Z, // towards 0 361*61046927SAndroid Build Coastguard Worker ROUND_P, // towards +inf 362*61046927SAndroid Build Coastguard Worker ROUND_NI, // nearest integer 363*61046927SAndroid Build Coastguard Worker ROUND_MI, // to integer towards -inf 364*61046927SAndroid Build Coastguard Worker ROUND_ZI, // to integer towards 0 365*61046927SAndroid Build Coastguard Worker ROUND_PI, // to integer towards +inf 366*61046927SAndroid Build Coastguard Worker }; 367*61046927SAndroid Build Coastguard Worker 368*61046927SAndroid Build Coastguard Worker enum CacheMode 369*61046927SAndroid Build Coastguard Worker { 370*61046927SAndroid Build Coastguard Worker CACHE_CA, // cache at all levels 371*61046927SAndroid Build Coastguard Worker CACHE_WB = CACHE_CA, // cache write back 372*61046927SAndroid Build Coastguard Worker CACHE_CG, // cache at global level 373*61046927SAndroid Build Coastguard Worker CACHE_CS, // cache streaming 374*61046927SAndroid Build Coastguard Worker CACHE_CV, // cache as volatile 375*61046927SAndroid Build Coastguard Worker CACHE_WT = CACHE_CV // cache write-through 376*61046927SAndroid Build Coastguard Worker }; 377*61046927SAndroid Build Coastguard Worker 378*61046927SAndroid Build Coastguard Worker enum DataFile 379*61046927SAndroid Build Coastguard Worker { 380*61046927SAndroid Build Coastguard Worker FILE_NULL = 0, 381*61046927SAndroid Build Coastguard Worker FILE_GPR, 382*61046927SAndroid Build Coastguard Worker FILE_PREDICATE, // boolean predicate 383*61046927SAndroid Build Coastguard Worker FILE_FLAGS, // zero/sign/carry/overflow bits 384*61046927SAndroid Build Coastguard Worker FILE_ADDRESS, 385*61046927SAndroid Build Coastguard Worker FILE_BARRIER, 386*61046927SAndroid Build Coastguard Worker LAST_REGISTER_FILE = FILE_BARRIER, 387*61046927SAndroid Build Coastguard Worker FILE_IMMEDIATE, 388*61046927SAndroid Build Coastguard Worker FILE_MEMORY_CONST, 389*61046927SAndroid Build Coastguard Worker FILE_SHADER_INPUT, 390*61046927SAndroid Build Coastguard Worker FILE_SHADER_OUTPUT, 391*61046927SAndroid Build Coastguard Worker FILE_MEMORY_BUFFER, 392*61046927SAndroid Build Coastguard Worker FILE_MEMORY_GLOBAL, 393*61046927SAndroid Build Coastguard Worker FILE_MEMORY_SHARED, 394*61046927SAndroid Build Coastguard Worker FILE_MEMORY_LOCAL, 395*61046927SAndroid Build Coastguard Worker FILE_SYSTEM_VALUE, 396*61046927SAndroid Build Coastguard Worker FILE_THREAD_STATE, // "special" barrier registers 397*61046927SAndroid Build Coastguard Worker DATA_FILE_COUNT 398*61046927SAndroid Build Coastguard Worker }; 399*61046927SAndroid Build Coastguard Worker 400*61046927SAndroid Build Coastguard Worker enum TexTarget 401*61046927SAndroid Build Coastguard Worker { 402*61046927SAndroid Build Coastguard Worker TEX_TARGET_1D, 403*61046927SAndroid Build Coastguard Worker TEX_TARGET_2D, 404*61046927SAndroid Build Coastguard Worker TEX_TARGET_2D_MS, 405*61046927SAndroid Build Coastguard Worker TEX_TARGET_3D, 406*61046927SAndroid Build Coastguard Worker TEX_TARGET_CUBE, 407*61046927SAndroid Build Coastguard Worker TEX_TARGET_1D_SHADOW, 408*61046927SAndroid Build Coastguard Worker TEX_TARGET_2D_SHADOW, 409*61046927SAndroid Build Coastguard Worker TEX_TARGET_CUBE_SHADOW, 410*61046927SAndroid Build Coastguard Worker TEX_TARGET_1D_ARRAY, 411*61046927SAndroid Build Coastguard Worker TEX_TARGET_2D_ARRAY, 412*61046927SAndroid Build Coastguard Worker TEX_TARGET_2D_MS_ARRAY, 413*61046927SAndroid Build Coastguard Worker TEX_TARGET_CUBE_ARRAY, 414*61046927SAndroid Build Coastguard Worker TEX_TARGET_1D_ARRAY_SHADOW, 415*61046927SAndroid Build Coastguard Worker TEX_TARGET_2D_ARRAY_SHADOW, 416*61046927SAndroid Build Coastguard Worker TEX_TARGET_RECT, 417*61046927SAndroid Build Coastguard Worker TEX_TARGET_RECT_SHADOW, 418*61046927SAndroid Build Coastguard Worker TEX_TARGET_CUBE_ARRAY_SHADOW, 419*61046927SAndroid Build Coastguard Worker TEX_TARGET_BUFFER, 420*61046927SAndroid Build Coastguard Worker TEX_TARGET_COUNT 421*61046927SAndroid Build Coastguard Worker }; 422*61046927SAndroid Build Coastguard Worker 423*61046927SAndroid Build Coastguard Worker enum ImgFormat 424*61046927SAndroid Build Coastguard Worker { 425*61046927SAndroid Build Coastguard Worker FMT_RGBA32F, 426*61046927SAndroid Build Coastguard Worker FMT_RGBA16F, 427*61046927SAndroid Build Coastguard Worker FMT_RG32F, 428*61046927SAndroid Build Coastguard Worker FMT_RG16F, 429*61046927SAndroid Build Coastguard Worker FMT_R11G11B10F, 430*61046927SAndroid Build Coastguard Worker FMT_R32F, 431*61046927SAndroid Build Coastguard Worker FMT_R16F, 432*61046927SAndroid Build Coastguard Worker 433*61046927SAndroid Build Coastguard Worker FMT_RGBA32UI, 434*61046927SAndroid Build Coastguard Worker FMT_RGBA16UI, 435*61046927SAndroid Build Coastguard Worker FMT_RGB10A2UI, 436*61046927SAndroid Build Coastguard Worker FMT_RGBA8UI, 437*61046927SAndroid Build Coastguard Worker FMT_RG32UI, 438*61046927SAndroid Build Coastguard Worker FMT_RG16UI, 439*61046927SAndroid Build Coastguard Worker FMT_RG8UI, 440*61046927SAndroid Build Coastguard Worker FMT_R32UI, 441*61046927SAndroid Build Coastguard Worker FMT_R16UI, 442*61046927SAndroid Build Coastguard Worker FMT_R8UI, 443*61046927SAndroid Build Coastguard Worker 444*61046927SAndroid Build Coastguard Worker FMT_RGBA32I, 445*61046927SAndroid Build Coastguard Worker FMT_RGBA16I, 446*61046927SAndroid Build Coastguard Worker FMT_RGBA8I, 447*61046927SAndroid Build Coastguard Worker FMT_RG32I, 448*61046927SAndroid Build Coastguard Worker FMT_RG16I, 449*61046927SAndroid Build Coastguard Worker FMT_RG8I, 450*61046927SAndroid Build Coastguard Worker FMT_R32I, 451*61046927SAndroid Build Coastguard Worker FMT_R16I, 452*61046927SAndroid Build Coastguard Worker FMT_R8I, 453*61046927SAndroid Build Coastguard Worker 454*61046927SAndroid Build Coastguard Worker FMT_RGBA16, 455*61046927SAndroid Build Coastguard Worker FMT_RGB10A2, 456*61046927SAndroid Build Coastguard Worker FMT_RGBA8, 457*61046927SAndroid Build Coastguard Worker FMT_RG16, 458*61046927SAndroid Build Coastguard Worker FMT_RG8, 459*61046927SAndroid Build Coastguard Worker FMT_R16, 460*61046927SAndroid Build Coastguard Worker FMT_R8, 461*61046927SAndroid Build Coastguard Worker 462*61046927SAndroid Build Coastguard Worker FMT_RGBA16_SNORM, 463*61046927SAndroid Build Coastguard Worker FMT_RGBA8_SNORM, 464*61046927SAndroid Build Coastguard Worker FMT_RG16_SNORM, 465*61046927SAndroid Build Coastguard Worker FMT_RG8_SNORM, 466*61046927SAndroid Build Coastguard Worker FMT_R16_SNORM, 467*61046927SAndroid Build Coastguard Worker FMT_R8_SNORM, 468*61046927SAndroid Build Coastguard Worker 469*61046927SAndroid Build Coastguard Worker FMT_BGRA8, 470*61046927SAndroid Build Coastguard Worker 471*61046927SAndroid Build Coastguard Worker IMG_FORMAT_COUNT, 472*61046927SAndroid Build Coastguard Worker }; 473*61046927SAndroid Build Coastguard Worker 474*61046927SAndroid Build Coastguard Worker enum ImgType { 475*61046927SAndroid Build Coastguard Worker UINT, 476*61046927SAndroid Build Coastguard Worker SINT, 477*61046927SAndroid Build Coastguard Worker UNORM, 478*61046927SAndroid Build Coastguard Worker SNORM, 479*61046927SAndroid Build Coastguard Worker FLOAT, 480*61046927SAndroid Build Coastguard Worker }; 481*61046927SAndroid Build Coastguard Worker 482*61046927SAndroid Build Coastguard Worker enum SVSemantic 483*61046927SAndroid Build Coastguard Worker { 484*61046927SAndroid Build Coastguard Worker SV_POSITION, // WPOS 485*61046927SAndroid Build Coastguard Worker SV_VERTEX_ID, 486*61046927SAndroid Build Coastguard Worker SV_INSTANCE_ID, 487*61046927SAndroid Build Coastguard Worker SV_INVOCATION_ID, 488*61046927SAndroid Build Coastguard Worker SV_PRIMITIVE_ID, 489*61046927SAndroid Build Coastguard Worker SV_VERTEX_COUNT, // gl_PatchVerticesIn 490*61046927SAndroid Build Coastguard Worker SV_LAYER, 491*61046927SAndroid Build Coastguard Worker SV_VIEWPORT_INDEX, 492*61046927SAndroid Build Coastguard Worker SV_VIEWPORT_MASK, 493*61046927SAndroid Build Coastguard Worker SV_YDIR, 494*61046927SAndroid Build Coastguard Worker SV_FACE, 495*61046927SAndroid Build Coastguard Worker SV_POINT_SIZE, 496*61046927SAndroid Build Coastguard Worker SV_POINT_COORD, 497*61046927SAndroid Build Coastguard Worker SV_CLIP_DISTANCE, 498*61046927SAndroid Build Coastguard Worker SV_SAMPLE_INDEX, 499*61046927SAndroid Build Coastguard Worker SV_SAMPLE_POS, 500*61046927SAndroid Build Coastguard Worker SV_SAMPLE_MASK, 501*61046927SAndroid Build Coastguard Worker SV_TESS_OUTER, 502*61046927SAndroid Build Coastguard Worker SV_TESS_INNER, 503*61046927SAndroid Build Coastguard Worker SV_TESS_COORD, 504*61046927SAndroid Build Coastguard Worker SV_TID, 505*61046927SAndroid Build Coastguard Worker SV_COMBINED_TID, 506*61046927SAndroid Build Coastguard Worker SV_CTAID, 507*61046927SAndroid Build Coastguard Worker SV_NTID, 508*61046927SAndroid Build Coastguard Worker SV_GRIDID, 509*61046927SAndroid Build Coastguard Worker SV_NCTAID, 510*61046927SAndroid Build Coastguard Worker SV_LANEID, 511*61046927SAndroid Build Coastguard Worker SV_PHYSID, 512*61046927SAndroid Build Coastguard Worker SV_NPHYSID, 513*61046927SAndroid Build Coastguard Worker SV_CLOCK, 514*61046927SAndroid Build Coastguard Worker SV_LBASE, 515*61046927SAndroid Build Coastguard Worker SV_SBASE, 516*61046927SAndroid Build Coastguard Worker SV_VERTEX_STRIDE, 517*61046927SAndroid Build Coastguard Worker SV_INVOCATION_INFO, 518*61046927SAndroid Build Coastguard Worker SV_THREAD_KILL, 519*61046927SAndroid Build Coastguard Worker SV_BASEVERTEX, 520*61046927SAndroid Build Coastguard Worker SV_BASEINSTANCE, 521*61046927SAndroid Build Coastguard Worker SV_DRAWID, 522*61046927SAndroid Build Coastguard Worker SV_WORK_DIM, 523*61046927SAndroid Build Coastguard Worker SV_LANEMASK_EQ, 524*61046927SAndroid Build Coastguard Worker SV_LANEMASK_LT, 525*61046927SAndroid Build Coastguard Worker SV_LANEMASK_LE, 526*61046927SAndroid Build Coastguard Worker SV_LANEMASK_GT, 527*61046927SAndroid Build Coastguard Worker SV_LANEMASK_GE, 528*61046927SAndroid Build Coastguard Worker SV_UNDEFINED, 529*61046927SAndroid Build Coastguard Worker SV_LAST 530*61046927SAndroid Build Coastguard Worker }; 531*61046927SAndroid Build Coastguard Worker 532*61046927SAndroid Build Coastguard Worker enum TSSemantic 533*61046927SAndroid Build Coastguard Worker { 534*61046927SAndroid Build Coastguard Worker // 0-15 are fixed ones on Volta/Turing 535*61046927SAndroid Build Coastguard Worker TS_THREAD_STATE_ENUM0 = 0, 536*61046927SAndroid Build Coastguard Worker TS_THREAD_STATE_ENUM1 = 1, 537*61046927SAndroid Build Coastguard Worker TS_THREAD_STATE_ENUM2 = 2, 538*61046927SAndroid Build Coastguard Worker TS_THREAD_STATE_ENUM3 = 3, 539*61046927SAndroid Build Coastguard Worker TS_THREAD_STATE_ENUM4 = 4, 540*61046927SAndroid Build Coastguard Worker TS_TRAP_RETURN_PC_LO = 5, 541*61046927SAndroid Build Coastguard Worker TS_TRAP_RETURN_PC_HI = 6, 542*61046927SAndroid Build Coastguard Worker TS_TRAP_RETURN_MASK = 7, 543*61046927SAndroid Build Coastguard Worker TS_MEXITED = 8, 544*61046927SAndroid Build Coastguard Worker TS_MKILL = 9, 545*61046927SAndroid Build Coastguard Worker TS_MACTIVE = 10, 546*61046927SAndroid Build Coastguard Worker TS_MATEXIT = 11, 547*61046927SAndroid Build Coastguard Worker TS_OPT_STACK = 12, 548*61046927SAndroid Build Coastguard Worker TS_API_CALL_DEPTH = 13, 549*61046927SAndroid Build Coastguard Worker TS_ATEXIT_PC_LO = 14, 550*61046927SAndroid Build Coastguard Worker TS_ATEXIT_PC_HI = 15, 551*61046927SAndroid Build Coastguard Worker // special ones to make our life easier 552*61046927SAndroid Build Coastguard Worker TS_PQUAD_MACTIVE, 553*61046927SAndroid Build Coastguard Worker }; 554*61046927SAndroid Build Coastguard Worker 555*61046927SAndroid Build Coastguard Worker class Program; 556*61046927SAndroid Build Coastguard Worker class Function; 557*61046927SAndroid Build Coastguard Worker class BasicBlock; 558*61046927SAndroid Build Coastguard Worker 559*61046927SAndroid Build Coastguard Worker class Target; 560*61046927SAndroid Build Coastguard Worker 561*61046927SAndroid Build Coastguard Worker class Instruction; 562*61046927SAndroid Build Coastguard Worker class CmpInstruction; 563*61046927SAndroid Build Coastguard Worker class TexInstruction; 564*61046927SAndroid Build Coastguard Worker class FlowInstruction; 565*61046927SAndroid Build Coastguard Worker 566*61046927SAndroid Build Coastguard Worker class Value; 567*61046927SAndroid Build Coastguard Worker class LValue; 568*61046927SAndroid Build Coastguard Worker class Symbol; 569*61046927SAndroid Build Coastguard Worker class ImmediateValue; 570*61046927SAndroid Build Coastguard Worker 571*61046927SAndroid Build Coastguard Worker struct Storage 572*61046927SAndroid Build Coastguard Worker { 573*61046927SAndroid Build Coastguard Worker DataFile file; 574*61046927SAndroid Build Coastguard Worker int8_t fileIndex; // signed, may be indirect for CONST[] 575*61046927SAndroid Build Coastguard Worker uint8_t size; // this should match the Instruction type's size 576*61046927SAndroid Build Coastguard Worker DataType type; // mainly for pretty printing 577*61046927SAndroid Build Coastguard Worker union { 578*61046927SAndroid Build Coastguard Worker uint64_t u64; // immediate values 579*61046927SAndroid Build Coastguard Worker uint32_t u32; 580*61046927SAndroid Build Coastguard Worker uint16_t u16; 581*61046927SAndroid Build Coastguard Worker uint8_t u8; 582*61046927SAndroid Build Coastguard Worker int64_t s64; 583*61046927SAndroid Build Coastguard Worker int32_t s32; 584*61046927SAndroid Build Coastguard Worker int16_t s16; 585*61046927SAndroid Build Coastguard Worker int8_t s8; 586*61046927SAndroid Build Coastguard Worker float f32; 587*61046927SAndroid Build Coastguard Worker double f64; 588*61046927SAndroid Build Coastguard Worker int32_t offset; // offset from 0 (base of address space) 589*61046927SAndroid Build Coastguard Worker int32_t id; // register id (< 0 if virtual/unassigned, in units <= 4) 590*61046927SAndroid Build Coastguard Worker struct { 591*61046927SAndroid Build Coastguard Worker SVSemantic sv; 592*61046927SAndroid Build Coastguard Worker int index; 593*61046927SAndroid Build Coastguard Worker } sv; 594*61046927SAndroid Build Coastguard Worker TSSemantic ts; 595*61046927SAndroid Build Coastguard Worker } data; 596*61046927SAndroid Build Coastguard Worker }; 597*61046927SAndroid Build Coastguard Worker 598*61046927SAndroid Build Coastguard Worker // precedence: NOT after SAT after NEG after ABS 599*61046927SAndroid Build Coastguard Worker #define NV50_IR_MOD_ABS (1 << 0) 600*61046927SAndroid Build Coastguard Worker #define NV50_IR_MOD_NEG (1 << 1) 601*61046927SAndroid Build Coastguard Worker #define NV50_IR_MOD_SAT (1 << 2) 602*61046927SAndroid Build Coastguard Worker #define NV50_IR_MOD_NOT (1 << 3) 603*61046927SAndroid Build Coastguard Worker #define NV50_IR_MOD_NEG_ABS (NV50_IR_MOD_NEG | NV50_IR_MOD_ABS) 604*61046927SAndroid Build Coastguard Worker 605*61046927SAndroid Build Coastguard Worker #define NV50_IR_INTERP_MODE_MASK 0x3 606*61046927SAndroid Build Coastguard Worker #define NV50_IR_INTERP_LINEAR (0 << 0) 607*61046927SAndroid Build Coastguard Worker #define NV50_IR_INTERP_PERSPECTIVE (1 << 0) 608*61046927SAndroid Build Coastguard Worker #define NV50_IR_INTERP_FLAT (2 << 0) 609*61046927SAndroid Build Coastguard Worker #define NV50_IR_INTERP_SC (3 << 0) // what exactly is that ? 610*61046927SAndroid Build Coastguard Worker #define NV50_IR_INTERP_SAMPLE_MASK 0xc 611*61046927SAndroid Build Coastguard Worker #define NV50_IR_INTERP_DEFAULT (0 << 2) 612*61046927SAndroid Build Coastguard Worker #define NV50_IR_INTERP_CENTROID (1 << 2) 613*61046927SAndroid Build Coastguard Worker #define NV50_IR_INTERP_OFFSET (2 << 2) 614*61046927SAndroid Build Coastguard Worker #define NV50_IR_INTERP_SAMPLEID (3 << 2) 615*61046927SAndroid Build Coastguard Worker 616*61046927SAndroid Build Coastguard Worker // do we really want this to be a class ? 617*61046927SAndroid Build Coastguard Worker class Modifier 618*61046927SAndroid Build Coastguard Worker { 619*61046927SAndroid Build Coastguard Worker public: Modifier()620*61046927SAndroid Build Coastguard Worker Modifier() : bits(0) { } Modifier(unsigned int m)621*61046927SAndroid Build Coastguard Worker Modifier(unsigned int m) : bits(m) { } 622*61046927SAndroid Build Coastguard Worker Modifier(operation op); 623*61046927SAndroid Build Coastguard Worker 624*61046927SAndroid Build Coastguard Worker // @return new Modifier applying a after b (asserts if unrepresentable) 625*61046927SAndroid Build Coastguard Worker Modifier operator*(const Modifier) const; 626*61046927SAndroid Build Coastguard Worker Modifier operator*=(const Modifier m) { *this = *this * m; return *this; } 627*61046927SAndroid Build Coastguard Worker Modifier operator==(const Modifier m) const { return m.bits == bits; } 628*61046927SAndroid Build Coastguard Worker Modifier operator!=(const Modifier m) const { return m.bits != bits; } 629*61046927SAndroid Build Coastguard Worker 630*61046927SAndroid Build Coastguard Worker inline Modifier operator&(const Modifier m) const { return bits & m.bits; } 631*61046927SAndroid Build Coastguard Worker inline Modifier operator|(const Modifier m) const { return bits | m.bits; } 632*61046927SAndroid Build Coastguard Worker inline Modifier operator^(const Modifier m) const { return bits ^ m.bits; } 633*61046927SAndroid Build Coastguard Worker 634*61046927SAndroid Build Coastguard Worker operation getOp() const; 635*61046927SAndroid Build Coastguard Worker neg()636*61046927SAndroid Build Coastguard Worker inline int neg() const { return (bits & NV50_IR_MOD_NEG) ? 1 : 0; } abs()637*61046927SAndroid Build Coastguard Worker inline int abs() const { return (bits & NV50_IR_MOD_ABS) ? 1 : 0; } 638*61046927SAndroid Build Coastguard Worker 639*61046927SAndroid Build Coastguard Worker inline operator bool() const { return bits ? true : false; } 640*61046927SAndroid Build Coastguard Worker 641*61046927SAndroid Build Coastguard Worker void applyTo(ImmediateValue &imm) const; 642*61046927SAndroid Build Coastguard Worker 643*61046927SAndroid Build Coastguard Worker int print(char *buf, size_t size) const; 644*61046927SAndroid Build Coastguard Worker 645*61046927SAndroid Build Coastguard Worker private: 646*61046927SAndroid Build Coastguard Worker uint8_t bits; 647*61046927SAndroid Build Coastguard Worker }; 648*61046927SAndroid Build Coastguard Worker 649*61046927SAndroid Build Coastguard Worker class ValueRef 650*61046927SAndroid Build Coastguard Worker { 651*61046927SAndroid Build Coastguard Worker public: 652*61046927SAndroid Build Coastguard Worker ValueRef(Value * = NULL); 653*61046927SAndroid Build Coastguard Worker ValueRef(const ValueRef&); 654*61046927SAndroid Build Coastguard Worker ~ValueRef(); 655*61046927SAndroid Build Coastguard Worker 656*61046927SAndroid Build Coastguard Worker ValueRef& operator=(const ValueRef&) = delete; 657*61046927SAndroid Build Coastguard Worker exists()658*61046927SAndroid Build Coastguard Worker inline bool exists() const { return value != NULL; } 659*61046927SAndroid Build Coastguard Worker 660*61046927SAndroid Build Coastguard Worker void set(Value *); 661*61046927SAndroid Build Coastguard Worker void set(const ValueRef&); get()662*61046927SAndroid Build Coastguard Worker inline Value *get() const { return value; } 663*61046927SAndroid Build Coastguard Worker inline Value *rep() const; 664*61046927SAndroid Build Coastguard Worker getInsn()665*61046927SAndroid Build Coastguard Worker inline Instruction *getInsn() const { return insn; } setInsn(Instruction * inst)666*61046927SAndroid Build Coastguard Worker inline void setInsn(Instruction *inst) { insn = inst; } 667*61046927SAndroid Build Coastguard Worker isIndirect(int dim)668*61046927SAndroid Build Coastguard Worker inline bool isIndirect(int dim) const { return indirect[dim] >= 0; } 669*61046927SAndroid Build Coastguard Worker inline const ValueRef *getIndirect(int dim) const; 670*61046927SAndroid Build Coastguard Worker 671*61046927SAndroid Build Coastguard Worker inline DataFile getFile() const; 672*61046927SAndroid Build Coastguard Worker inline unsigned getSize() const; 673*61046927SAndroid Build Coastguard Worker 674*61046927SAndroid Build Coastguard Worker // SSA: return eventual (traverse MOVs) literal value, if it exists 675*61046927SAndroid Build Coastguard Worker bool getImmediate(ImmediateValue&) const; 676*61046927SAndroid Build Coastguard Worker 677*61046927SAndroid Build Coastguard Worker public: 678*61046927SAndroid Build Coastguard Worker Modifier mod; 679*61046927SAndroid Build Coastguard Worker int8_t indirect[2]; // >= 0 if relative to lvalue in insn->src(indirect[i]) 680*61046927SAndroid Build Coastguard Worker 681*61046927SAndroid Build Coastguard Worker bool usedAsPtr; // for printing 682*61046927SAndroid Build Coastguard Worker 683*61046927SAndroid Build Coastguard Worker private: 684*61046927SAndroid Build Coastguard Worker Value *value; 685*61046927SAndroid Build Coastguard Worker Instruction *insn; 686*61046927SAndroid Build Coastguard Worker }; 687*61046927SAndroid Build Coastguard Worker 688*61046927SAndroid Build Coastguard Worker class ValueDef 689*61046927SAndroid Build Coastguard Worker { 690*61046927SAndroid Build Coastguard Worker public: 691*61046927SAndroid Build Coastguard Worker ValueDef(Value * = NULL); 692*61046927SAndroid Build Coastguard Worker ValueDef(const ValueDef&); 693*61046927SAndroid Build Coastguard Worker ~ValueDef(); 694*61046927SAndroid Build Coastguard Worker 695*61046927SAndroid Build Coastguard Worker ValueDef& operator=(const ValueDef&) = delete; 696*61046927SAndroid Build Coastguard Worker exists()697*61046927SAndroid Build Coastguard Worker inline bool exists() const { return value != NULL; } 698*61046927SAndroid Build Coastguard Worker get()699*61046927SAndroid Build Coastguard Worker inline Value *get() const { return value; } 700*61046927SAndroid Build Coastguard Worker inline Value *rep() const; 701*61046927SAndroid Build Coastguard Worker void set(Value *); 702*61046927SAndroid Build Coastguard Worker bool mayReplace(const ValueRef &); 703*61046927SAndroid Build Coastguard Worker void replace(const ValueRef &, bool doSet); // replace all uses of the old value 704*61046927SAndroid Build Coastguard Worker getInsn()705*61046927SAndroid Build Coastguard Worker inline Instruction *getInsn() const { return insn; } setInsn(Instruction * inst)706*61046927SAndroid Build Coastguard Worker inline void setInsn(Instruction *inst) { insn = inst; } 707*61046927SAndroid Build Coastguard Worker 708*61046927SAndroid Build Coastguard Worker inline DataFile getFile() const; 709*61046927SAndroid Build Coastguard Worker inline unsigned getSize() const; 710*61046927SAndroid Build Coastguard Worker 711*61046927SAndroid Build Coastguard Worker inline void setSSA(LValue *); 712*61046927SAndroid Build Coastguard Worker inline const LValue *preSSA() const; 713*61046927SAndroid Build Coastguard Worker 714*61046927SAndroid Build Coastguard Worker private: 715*61046927SAndroid Build Coastguard Worker Value *value; // should make this LValue * ... 716*61046927SAndroid Build Coastguard Worker LValue *origin; // pre SSA value 717*61046927SAndroid Build Coastguard Worker Instruction *insn; 718*61046927SAndroid Build Coastguard Worker }; 719*61046927SAndroid Build Coastguard Worker 720*61046927SAndroid Build Coastguard Worker class Value 721*61046927SAndroid Build Coastguard Worker { 722*61046927SAndroid Build Coastguard Worker public: 723*61046927SAndroid Build Coastguard Worker Value(); ~Value()724*61046927SAndroid Build Coastguard Worker virtual ~Value() { } 725*61046927SAndroid Build Coastguard Worker 726*61046927SAndroid Build Coastguard Worker Value(const Value&) = delete; 727*61046927SAndroid Build Coastguard Worker Value& operator=(const Value&) = delete; 728*61046927SAndroid Build Coastguard Worker 729*61046927SAndroid Build Coastguard Worker virtual Value *clone(ClonePolicy<Function>&) const = 0; 730*61046927SAndroid Build Coastguard Worker 731*61046927SAndroid Build Coastguard Worker virtual int print(char *, size_t, DataType ty = TYPE_NONE) const = 0; 732*61046927SAndroid Build Coastguard Worker 733*61046927SAndroid Build Coastguard Worker virtual bool equals(const Value *, bool strict = false) const; 734*61046927SAndroid Build Coastguard Worker virtual bool interfers(const Value *) const; isUniform()735*61046927SAndroid Build Coastguard Worker virtual bool isUniform() const { return true; } 736*61046927SAndroid Build Coastguard Worker rep()737*61046927SAndroid Build Coastguard Worker inline Value *rep() const { return join; } 738*61046927SAndroid Build Coastguard Worker 739*61046927SAndroid Build Coastguard Worker inline Instruction *getUniqueInsn() const; 740*61046927SAndroid Build Coastguard Worker inline Instruction *getInsn() const; // use when uniqueness is certain 741*61046927SAndroid Build Coastguard Worker refCount()742*61046927SAndroid Build Coastguard Worker inline int refCount() { return uses.size(); } 743*61046927SAndroid Build Coastguard Worker 744*61046927SAndroid Build Coastguard Worker inline LValue *asLValue(); 745*61046927SAndroid Build Coastguard Worker inline Symbol *asSym(); 746*61046927SAndroid Build Coastguard Worker inline ImmediateValue *asImm(); 747*61046927SAndroid Build Coastguard Worker inline const Symbol *asSym() const; 748*61046927SAndroid Build Coastguard Worker inline const ImmediateValue *asImm() const; 749*61046927SAndroid Build Coastguard Worker inFile(DataFile f)750*61046927SAndroid Build Coastguard Worker inline bool inFile(DataFile f) const { return reg.file == f; } 751*61046927SAndroid Build Coastguard Worker 752*61046927SAndroid Build Coastguard Worker static inline Value *get(Iterator&); 753*61046927SAndroid Build Coastguard Worker 754*61046927SAndroid Build Coastguard Worker std::unordered_set<ValueRef *> uses; 755*61046927SAndroid Build Coastguard Worker std::list<ValueDef *> defs; 756*61046927SAndroid Build Coastguard Worker typedef std::unordered_set<ValueRef *>::iterator UseIterator; 757*61046927SAndroid Build Coastguard Worker typedef std::unordered_set<ValueRef *>::const_iterator UseCIterator; 758*61046927SAndroid Build Coastguard Worker typedef std::list<ValueDef *>::iterator DefIterator; 759*61046927SAndroid Build Coastguard Worker typedef std::list<ValueDef *>::const_iterator DefCIterator; 760*61046927SAndroid Build Coastguard Worker 761*61046927SAndroid Build Coastguard Worker int id; 762*61046927SAndroid Build Coastguard Worker Storage reg; 763*61046927SAndroid Build Coastguard Worker 764*61046927SAndroid Build Coastguard Worker // TODO: these should be in LValue: 765*61046927SAndroid Build Coastguard Worker Interval livei; 766*61046927SAndroid Build Coastguard Worker Value *join; 767*61046927SAndroid Build Coastguard Worker }; 768*61046927SAndroid Build Coastguard Worker 769*61046927SAndroid Build Coastguard Worker class LValue : public Value 770*61046927SAndroid Build Coastguard Worker { 771*61046927SAndroid Build Coastguard Worker public: 772*61046927SAndroid Build Coastguard Worker LValue(Function *, DataFile file); 773*61046927SAndroid Build Coastguard Worker LValue(Function *, LValue *); ~LValue()774*61046927SAndroid Build Coastguard Worker ~LValue() { } 775*61046927SAndroid Build Coastguard Worker 776*61046927SAndroid Build Coastguard Worker virtual bool isUniform() const; 777*61046927SAndroid Build Coastguard Worker 778*61046927SAndroid Build Coastguard Worker virtual LValue *clone(ClonePolicy<Function>&) const; 779*61046927SAndroid Build Coastguard Worker 780*61046927SAndroid Build Coastguard Worker virtual int print(char *, size_t, DataType ty = TYPE_NONE) const; 781*61046927SAndroid Build Coastguard Worker 782*61046927SAndroid Build Coastguard Worker public: 783*61046927SAndroid Build Coastguard Worker unsigned compMask : 8; // compound/component mask 784*61046927SAndroid Build Coastguard Worker unsigned compound : 1; // used by RA, value involved in split/merge 785*61046927SAndroid Build Coastguard Worker unsigned ssa : 1; 786*61046927SAndroid Build Coastguard Worker unsigned fixedReg : 1; // set & used by RA, earlier just use (id < 0) 787*61046927SAndroid Build Coastguard Worker unsigned noSpill : 1; // do not spill (e.g. if spill temporary already) 788*61046927SAndroid Build Coastguard Worker }; 789*61046927SAndroid Build Coastguard Worker 790*61046927SAndroid Build Coastguard Worker class Symbol : public Value 791*61046927SAndroid Build Coastguard Worker { 792*61046927SAndroid Build Coastguard Worker public: 793*61046927SAndroid Build Coastguard Worker Symbol(Program *, DataFile file = FILE_MEMORY_CONST, uint8_t fileIdx = 0); ~Symbol()794*61046927SAndroid Build Coastguard Worker ~Symbol() { } 795*61046927SAndroid Build Coastguard Worker 796*61046927SAndroid Build Coastguard Worker virtual Symbol *clone(ClonePolicy<Function>&) const; 797*61046927SAndroid Build Coastguard Worker 798*61046927SAndroid Build Coastguard Worker virtual bool equals(const Value *that, bool strict) const; 799*61046927SAndroid Build Coastguard Worker 800*61046927SAndroid Build Coastguard Worker virtual bool isUniform() const; 801*61046927SAndroid Build Coastguard Worker 802*61046927SAndroid Build Coastguard Worker virtual int print(char *, size_t, DataType ty = TYPE_NONE) const; 803*61046927SAndroid Build Coastguard Worker 804*61046927SAndroid Build Coastguard Worker // print with indirect values 805*61046927SAndroid Build Coastguard Worker int print(char *, size_t, Value *, Value *, DataType ty = TYPE_NONE) const; 806*61046927SAndroid Build Coastguard Worker 807*61046927SAndroid Build Coastguard Worker inline void setFile(DataFile file, uint8_t fileIndex = 0) 808*61046927SAndroid Build Coastguard Worker { 809*61046927SAndroid Build Coastguard Worker reg.file = file; 810*61046927SAndroid Build Coastguard Worker reg.fileIndex = fileIndex; 811*61046927SAndroid Build Coastguard Worker } 812*61046927SAndroid Build Coastguard Worker 813*61046927SAndroid Build Coastguard Worker inline void setOffset(int32_t offset); 814*61046927SAndroid Build Coastguard Worker inline void setAddress(Symbol *base, int32_t offset); 815*61046927SAndroid Build Coastguard Worker inline void setSV(SVSemantic sv, uint32_t idx = 0); 816*61046927SAndroid Build Coastguard Worker getBase()817*61046927SAndroid Build Coastguard Worker inline const Symbol *getBase() const { return baseSym; } 818*61046927SAndroid Build Coastguard Worker 819*61046927SAndroid Build Coastguard Worker private: 820*61046927SAndroid Build Coastguard Worker Symbol *baseSym; // array base for Symbols representing array elements 821*61046927SAndroid Build Coastguard Worker }; 822*61046927SAndroid Build Coastguard Worker 823*61046927SAndroid Build Coastguard Worker class ImmediateValue : public Value 824*61046927SAndroid Build Coastguard Worker { 825*61046927SAndroid Build Coastguard Worker public: ImmediateValue()826*61046927SAndroid Build Coastguard Worker ImmediateValue() { } 827*61046927SAndroid Build Coastguard Worker ImmediateValue(Program *, uint32_t); 828*61046927SAndroid Build Coastguard Worker ImmediateValue(Program *, float); 829*61046927SAndroid Build Coastguard Worker ImmediateValue(Program *, double); 830*61046927SAndroid Build Coastguard Worker // NOTE: not added to program with 831*61046927SAndroid Build Coastguard Worker ImmediateValue(const ImmediateValue *, DataType ty); ~ImmediateValue()832*61046927SAndroid Build Coastguard Worker ~ImmediateValue() { }; 833*61046927SAndroid Build Coastguard Worker 834*61046927SAndroid Build Coastguard Worker virtual ImmediateValue *clone(ClonePolicy<Function>&) const; 835*61046927SAndroid Build Coastguard Worker 836*61046927SAndroid Build Coastguard Worker virtual bool equals(const Value *that, bool strict) const; 837*61046927SAndroid Build Coastguard Worker 838*61046927SAndroid Build Coastguard Worker // these only work if 'type' is valid (we mostly use untyped literals): 839*61046927SAndroid Build Coastguard Worker bool isInteger(const int ival) const; // ival is cast to this' type 840*61046927SAndroid Build Coastguard Worker bool isNegative() const; 841*61046927SAndroid Build Coastguard Worker bool isPow2() const; 842*61046927SAndroid Build Coastguard Worker 843*61046927SAndroid Build Coastguard Worker void applyLog2(); 844*61046927SAndroid Build Coastguard Worker 845*61046927SAndroid Build Coastguard Worker // for constant folding: 846*61046927SAndroid Build Coastguard Worker ImmediateValue operator+(const ImmediateValue&) const; 847*61046927SAndroid Build Coastguard Worker ImmediateValue operator-(const ImmediateValue&) const; 848*61046927SAndroid Build Coastguard Worker ImmediateValue operator*(const ImmediateValue&) const; 849*61046927SAndroid Build Coastguard Worker ImmediateValue operator/(const ImmediateValue&) const; 850*61046927SAndroid Build Coastguard Worker 851*61046927SAndroid Build Coastguard Worker ImmediateValue& operator=(const ImmediateValue&); // only sets value ! 852*61046927SAndroid Build Coastguard Worker 853*61046927SAndroid Build Coastguard Worker bool compare(CondCode cc, float fval) const; 854*61046927SAndroid Build Coastguard Worker 855*61046927SAndroid Build Coastguard Worker virtual int print(char *, size_t, DataType ty = TYPE_NONE) const; 856*61046927SAndroid Build Coastguard Worker }; 857*61046927SAndroid Build Coastguard Worker 858*61046927SAndroid Build Coastguard Worker class Instruction 859*61046927SAndroid Build Coastguard Worker { 860*61046927SAndroid Build Coastguard Worker public: 861*61046927SAndroid Build Coastguard Worker Instruction(); 862*61046927SAndroid Build Coastguard Worker Instruction(Function *, operation, DataType); 863*61046927SAndroid Build Coastguard Worker virtual ~Instruction(); 864*61046927SAndroid Build Coastguard Worker 865*61046927SAndroid Build Coastguard Worker Instruction(const Instruction&) = delete; 866*61046927SAndroid Build Coastguard Worker Instruction& operator=(const Instruction&) = delete; 867*61046927SAndroid Build Coastguard Worker 868*61046927SAndroid Build Coastguard Worker virtual Instruction *clone(ClonePolicy<Function>&, 869*61046927SAndroid Build Coastguard Worker Instruction * = NULL) const; 870*61046927SAndroid Build Coastguard Worker 871*61046927SAndroid Build Coastguard Worker void setDef(int i, Value *); 872*61046927SAndroid Build Coastguard Worker void setSrc(int s, Value *); 873*61046927SAndroid Build Coastguard Worker void setSrc(int s, const ValueRef&); 874*61046927SAndroid Build Coastguard Worker void swapSources(int a, int b); 875*61046927SAndroid Build Coastguard Worker void moveSources(int s, int delta); 876*61046927SAndroid Build Coastguard Worker bool setIndirect(int s, int dim, Value *); 877*61046927SAndroid Build Coastguard Worker src(int s)878*61046927SAndroid Build Coastguard Worker inline ValueRef& src(int s) { return srcs[s]; } def(int s)879*61046927SAndroid Build Coastguard Worker inline ValueDef& def(int s) { return defs[s]; } src(int s)880*61046927SAndroid Build Coastguard Worker inline const ValueRef& src(int s) const { return srcs[s]; } def(int s)881*61046927SAndroid Build Coastguard Worker inline const ValueDef& def(int s) const { return defs[s]; } 882*61046927SAndroid Build Coastguard Worker getDef(int d)883*61046927SAndroid Build Coastguard Worker inline Value *getDef(int d) const { return defs[d].get(); } getSrc(int s)884*61046927SAndroid Build Coastguard Worker inline Value *getSrc(int s) const { return srcs[s].get(); } 885*61046927SAndroid Build Coastguard Worker inline Value *getIndirect(int s, int dim) const; 886*61046927SAndroid Build Coastguard Worker defExists(unsigned d)887*61046927SAndroid Build Coastguard Worker inline bool defExists(unsigned d) const 888*61046927SAndroid Build Coastguard Worker { 889*61046927SAndroid Build Coastguard Worker return d < defs.size() && defs[d].exists(); 890*61046927SAndroid Build Coastguard Worker } srcExists(unsigned s)891*61046927SAndroid Build Coastguard Worker inline bool srcExists(unsigned s) const 892*61046927SAndroid Build Coastguard Worker { 893*61046927SAndroid Build Coastguard Worker return s < srcs.size() && srcs[s].exists(); 894*61046927SAndroid Build Coastguard Worker } 895*61046927SAndroid Build Coastguard Worker 896*61046927SAndroid Build Coastguard Worker inline bool constrainedDefs() const; 897*61046927SAndroid Build Coastguard Worker 898*61046927SAndroid Build Coastguard Worker bool setPredicate(CondCode ccode, Value *); 899*61046927SAndroid Build Coastguard Worker inline Value *getPredicate() const; 900*61046927SAndroid Build Coastguard Worker bool writesPredicate() const; isPredicated()901*61046927SAndroid Build Coastguard Worker inline bool isPredicated() const { return predSrc >= 0; } 902*61046927SAndroid Build Coastguard Worker 903*61046927SAndroid Build Coastguard Worker inline void setFlagsSrc(int s, Value *); 904*61046927SAndroid Build Coastguard Worker inline void setFlagsDef(int d, Value *); usesFlags()905*61046927SAndroid Build Coastguard Worker inline bool usesFlags() const { return flagsSrc >= 0; } 906*61046927SAndroid Build Coastguard Worker defCount()907*61046927SAndroid Build Coastguard Worker unsigned int defCount() const { return defs.size(); }; 908*61046927SAndroid Build Coastguard Worker unsigned int defCount(unsigned int mask, bool singleFile = false) const; srcCount()909*61046927SAndroid Build Coastguard Worker unsigned int srcCount() const { return srcs.size(); }; 910*61046927SAndroid Build Coastguard Worker unsigned int srcCount(unsigned int mask, bool singleFile = false) const; 911*61046927SAndroid Build Coastguard Worker 912*61046927SAndroid Build Coastguard Worker // save & remove / set indirect[0,1] and predicate source 913*61046927SAndroid Build Coastguard Worker void takeExtraSources(int s, Value *[3]); 914*61046927SAndroid Build Coastguard Worker void putExtraSources(int s, Value *[3]); 915*61046927SAndroid Build Coastguard Worker setType(DataType type)916*61046927SAndroid Build Coastguard Worker inline void setType(DataType type) { dType = sType = type; } 917*61046927SAndroid Build Coastguard Worker setType(DataType dtype,DataType stype)918*61046927SAndroid Build Coastguard Worker inline void setType(DataType dtype, DataType stype) 919*61046927SAndroid Build Coastguard Worker { 920*61046927SAndroid Build Coastguard Worker dType = dtype; 921*61046927SAndroid Build Coastguard Worker sType = stype; 922*61046927SAndroid Build Coastguard Worker } 923*61046927SAndroid Build Coastguard Worker isPseudo()924*61046927SAndroid Build Coastguard Worker inline bool isPseudo() const { return op < OP_MOV; } 925*61046927SAndroid Build Coastguard Worker bool isDead() const; 926*61046927SAndroid Build Coastguard Worker bool isNop() const; 927*61046927SAndroid Build Coastguard Worker bool isCommutationLegal(const Instruction *) const; // must be adjacent ! 928*61046927SAndroid Build Coastguard Worker bool isActionEqual(const Instruction *) const; 929*61046927SAndroid Build Coastguard Worker bool isResultEqual(const Instruction *) const; 930*61046927SAndroid Build Coastguard Worker 931*61046927SAndroid Build Coastguard Worker // check whether the defs interfere with srcs and defs of another instruction 932*61046927SAndroid Build Coastguard Worker bool canCommuteDefDef(const Instruction *) const; 933*61046927SAndroid Build Coastguard Worker bool canCommuteDefSrc(const Instruction *) const; 934*61046927SAndroid Build Coastguard Worker 935*61046927SAndroid Build Coastguard Worker void print() const; 936*61046927SAndroid Build Coastguard Worker 937*61046927SAndroid Build Coastguard Worker inline CmpInstruction *asCmp(); 938*61046927SAndroid Build Coastguard Worker inline TexInstruction *asTex(); 939*61046927SAndroid Build Coastguard Worker inline FlowInstruction *asFlow(); 940*61046927SAndroid Build Coastguard Worker inline const TexInstruction *asTex() const; 941*61046927SAndroid Build Coastguard Worker inline const CmpInstruction *asCmp() const; 942*61046927SAndroid Build Coastguard Worker inline const FlowInstruction *asFlow() const; 943*61046927SAndroid Build Coastguard Worker 944*61046927SAndroid Build Coastguard Worker public: 945*61046927SAndroid Build Coastguard Worker Instruction *next; 946*61046927SAndroid Build Coastguard Worker Instruction *prev; 947*61046927SAndroid Build Coastguard Worker int id; 948*61046927SAndroid Build Coastguard Worker int serial; // CFG order 949*61046927SAndroid Build Coastguard Worker 950*61046927SAndroid Build Coastguard Worker operation op; 951*61046927SAndroid Build Coastguard Worker DataType dType; // destination or defining type 952*61046927SAndroid Build Coastguard Worker DataType sType; // source or secondary type 953*61046927SAndroid Build Coastguard Worker CondCode cc; 954*61046927SAndroid Build Coastguard Worker RoundMode rnd; 955*61046927SAndroid Build Coastguard Worker CacheMode cache; 956*61046927SAndroid Build Coastguard Worker 957*61046927SAndroid Build Coastguard Worker uint16_t subOp; // quadop, 1 for mul-high, etc. 958*61046927SAndroid Build Coastguard Worker 959*61046927SAndroid Build Coastguard Worker unsigned encSize : 5; // encoding size in bytes 960*61046927SAndroid Build Coastguard Worker unsigned saturate : 1; // to [0.0f, 1.0f] 961*61046927SAndroid Build Coastguard Worker unsigned join : 1; // converge control flow (use OP_JOIN until end) 962*61046927SAndroid Build Coastguard Worker unsigned fixed : 1; // prevent dead code elimination 963*61046927SAndroid Build Coastguard Worker unsigned terminator : 1; // end of basic block 964*61046927SAndroid Build Coastguard Worker unsigned ftz : 1; // flush denormal to zero 965*61046927SAndroid Build Coastguard Worker unsigned dnz : 1; // denormals, NaN are zero 966*61046927SAndroid Build Coastguard Worker unsigned ipa : 4; // interpolation mode 967*61046927SAndroid Build Coastguard Worker unsigned lanes : 4; 968*61046927SAndroid Build Coastguard Worker unsigned perPatch : 1; 969*61046927SAndroid Build Coastguard Worker unsigned exit : 1; // terminate program after insn 970*61046927SAndroid Build Coastguard Worker unsigned mask : 4; // for vector ops 971*61046927SAndroid Build Coastguard Worker // prevent algebraic optimisations that aren't bit-for-bit identical 972*61046927SAndroid Build Coastguard Worker unsigned precise : 1; 973*61046927SAndroid Build Coastguard Worker 974*61046927SAndroid Build Coastguard Worker int8_t postFactor; // MUL/DIV(if < 0) by 1 << postFactor 975*61046927SAndroid Build Coastguard Worker 976*61046927SAndroid Build Coastguard Worker int8_t predSrc; 977*61046927SAndroid Build Coastguard Worker int8_t flagsDef; 978*61046927SAndroid Build Coastguard Worker int8_t flagsSrc; 979*61046927SAndroid Build Coastguard Worker 980*61046927SAndroid Build Coastguard Worker uint32_t sched; // scheduling data (NOTE: maybe move to separate storage) 981*61046927SAndroid Build Coastguard Worker 982*61046927SAndroid Build Coastguard Worker BasicBlock *bb; 983*61046927SAndroid Build Coastguard Worker 984*61046927SAndroid Build Coastguard Worker protected: 985*61046927SAndroid Build Coastguard Worker std::deque<ValueDef> defs; // no gaps ! 986*61046927SAndroid Build Coastguard Worker std::deque<ValueRef> srcs; // no gaps ! 987*61046927SAndroid Build Coastguard Worker 988*61046927SAndroid Build Coastguard Worker // instruction specific methods: 989*61046927SAndroid Build Coastguard Worker // (don't want to subclass, would need more constructors and memory pools) 990*61046927SAndroid Build Coastguard Worker public: setInterpolate(unsigned int mode)991*61046927SAndroid Build Coastguard Worker inline void setInterpolate(unsigned int mode) { ipa = mode; } 992*61046927SAndroid Build Coastguard Worker getInterpMode()993*61046927SAndroid Build Coastguard Worker unsigned int getInterpMode() const { return ipa & 0x3; } getSampleMode()994*61046927SAndroid Build Coastguard Worker unsigned int getSampleMode() const { return ipa & 0xc; } 995*61046927SAndroid Build Coastguard Worker 996*61046927SAndroid Build Coastguard Worker private: 997*61046927SAndroid Build Coastguard Worker void init(); 998*61046927SAndroid Build Coastguard Worker }; 999*61046927SAndroid Build Coastguard Worker 1000*61046927SAndroid Build Coastguard Worker enum TexQuery 1001*61046927SAndroid Build Coastguard Worker { 1002*61046927SAndroid Build Coastguard Worker TXQ_DIMS, /* x, y, z, levels */ 1003*61046927SAndroid Build Coastguard Worker TXQ_TYPE, /* ?, ?, samples, ? */ 1004*61046927SAndroid Build Coastguard Worker TXQ_SAMPLE_POSITION, 1005*61046927SAndroid Build Coastguard Worker TXQ_FILTER, 1006*61046927SAndroid Build Coastguard Worker TXQ_LOD, 1007*61046927SAndroid Build Coastguard Worker TXQ_WRAP, 1008*61046927SAndroid Build Coastguard Worker TXQ_BORDER_COLOUR 1009*61046927SAndroid Build Coastguard Worker }; 1010*61046927SAndroid Build Coastguard Worker 1011*61046927SAndroid Build Coastguard Worker class TexInstruction : public Instruction 1012*61046927SAndroid Build Coastguard Worker { 1013*61046927SAndroid Build Coastguard Worker public: 1014*61046927SAndroid Build Coastguard Worker class Target 1015*61046927SAndroid Build Coastguard Worker { 1016*61046927SAndroid Build Coastguard Worker public: target(targ)1017*61046927SAndroid Build Coastguard Worker Target(TexTarget targ = TEX_TARGET_1D) : target(targ) { } 1018*61046927SAndroid Build Coastguard Worker getName()1019*61046927SAndroid Build Coastguard Worker const char *getName() const { return descTable[target].name; } getArgCount()1020*61046927SAndroid Build Coastguard Worker unsigned int getArgCount() const { return descTable[target].argc; } getDim()1021*61046927SAndroid Build Coastguard Worker unsigned int getDim() const { return descTable[target].dim; } isArray()1022*61046927SAndroid Build Coastguard Worker int isArray() const { return descTable[target].array ? 1 : 0; } isCube()1023*61046927SAndroid Build Coastguard Worker int isCube() const { return descTable[target].cube ? 1 : 0; } isShadow()1024*61046927SAndroid Build Coastguard Worker int isShadow() const { return descTable[target].shadow ? 1 : 0; } isMS()1025*61046927SAndroid Build Coastguard Worker int isMS() const { 1026*61046927SAndroid Build Coastguard Worker return target == TEX_TARGET_2D_MS || target == TEX_TARGET_2D_MS_ARRAY; } clearMS()1027*61046927SAndroid Build Coastguard Worker void clearMS() { 1028*61046927SAndroid Build Coastguard Worker if (isMS()) { 1029*61046927SAndroid Build Coastguard Worker if (isArray()) 1030*61046927SAndroid Build Coastguard Worker target = TEX_TARGET_2D_ARRAY; 1031*61046927SAndroid Build Coastguard Worker else 1032*61046927SAndroid Build Coastguard Worker target = TEX_TARGET_2D; 1033*61046927SAndroid Build Coastguard Worker } 1034*61046927SAndroid Build Coastguard Worker } 1035*61046927SAndroid Build Coastguard Worker 1036*61046927SAndroid Build Coastguard Worker Target& operator=(TexTarget targ) 1037*61046927SAndroid Build Coastguard Worker { 1038*61046927SAndroid Build Coastguard Worker assert(targ < TEX_TARGET_COUNT); 1039*61046927SAndroid Build Coastguard Worker target = targ; 1040*61046927SAndroid Build Coastguard Worker return *this; 1041*61046927SAndroid Build Coastguard Worker } 1042*61046927SAndroid Build Coastguard Worker 1043*61046927SAndroid Build Coastguard Worker inline bool operator==(TexTarget targ) const { return target == targ; } 1044*61046927SAndroid Build Coastguard Worker inline bool operator!=(TexTarget targ) const { return target != targ; } 1045*61046927SAndroid Build Coastguard Worker getEnum()1046*61046927SAndroid Build Coastguard Worker enum TexTarget getEnum() const { return target; } 1047*61046927SAndroid Build Coastguard Worker 1048*61046927SAndroid Build Coastguard Worker private: 1049*61046927SAndroid Build Coastguard Worker struct Desc 1050*61046927SAndroid Build Coastguard Worker { 1051*61046927SAndroid Build Coastguard Worker char name[19]; 1052*61046927SAndroid Build Coastguard Worker uint8_t dim; 1053*61046927SAndroid Build Coastguard Worker uint8_t argc; 1054*61046927SAndroid Build Coastguard Worker bool array; 1055*61046927SAndroid Build Coastguard Worker bool cube; 1056*61046927SAndroid Build Coastguard Worker bool shadow; 1057*61046927SAndroid Build Coastguard Worker }; 1058*61046927SAndroid Build Coastguard Worker 1059*61046927SAndroid Build Coastguard Worker static const struct Desc descTable[TEX_TARGET_COUNT]; 1060*61046927SAndroid Build Coastguard Worker 1061*61046927SAndroid Build Coastguard Worker private: 1062*61046927SAndroid Build Coastguard Worker enum TexTarget target; 1063*61046927SAndroid Build Coastguard Worker }; 1064*61046927SAndroid Build Coastguard Worker 1065*61046927SAndroid Build Coastguard Worker public: 1066*61046927SAndroid Build Coastguard Worker struct ImgFormatDesc 1067*61046927SAndroid Build Coastguard Worker { 1068*61046927SAndroid Build Coastguard Worker char name[19]; 1069*61046927SAndroid Build Coastguard Worker uint8_t components; 1070*61046927SAndroid Build Coastguard Worker uint8_t bits[4]; 1071*61046927SAndroid Build Coastguard Worker ImgType type; 1072*61046927SAndroid Build Coastguard Worker bool bgra; 1073*61046927SAndroid Build Coastguard Worker }; 1074*61046927SAndroid Build Coastguard Worker 1075*61046927SAndroid Build Coastguard Worker static const struct ImgFormatDesc formatTable[IMG_FORMAT_COUNT]; 1076*61046927SAndroid Build Coastguard Worker static const struct ImgFormatDesc *translateImgFormat( 1077*61046927SAndroid Build Coastguard Worker enum pipe_format format); 1078*61046927SAndroid Build Coastguard Worker 1079*61046927SAndroid Build Coastguard Worker public: 1080*61046927SAndroid Build Coastguard Worker TexInstruction(Function *, operation); 1081*61046927SAndroid Build Coastguard Worker virtual ~TexInstruction(); 1082*61046927SAndroid Build Coastguard Worker 1083*61046927SAndroid Build Coastguard Worker virtual TexInstruction *clone(ClonePolicy<Function>&, 1084*61046927SAndroid Build Coastguard Worker Instruction * = NULL) const; 1085*61046927SAndroid Build Coastguard Worker setTexture(Target targ,uint8_t r,uint8_t s)1086*61046927SAndroid Build Coastguard Worker inline void setTexture(Target targ, uint8_t r, uint8_t s) 1087*61046927SAndroid Build Coastguard Worker { 1088*61046927SAndroid Build Coastguard Worker tex.r = r; 1089*61046927SAndroid Build Coastguard Worker tex.s = s; 1090*61046927SAndroid Build Coastguard Worker tex.target = targ; 1091*61046927SAndroid Build Coastguard Worker } 1092*61046927SAndroid Build Coastguard Worker 1093*61046927SAndroid Build Coastguard Worker void setIndirectR(Value *); 1094*61046927SAndroid Build Coastguard Worker void setIndirectS(Value *); 1095*61046927SAndroid Build Coastguard Worker inline Value *getIndirectR() const; 1096*61046927SAndroid Build Coastguard Worker inline Value *getIndirectS() const; 1097*61046927SAndroid Build Coastguard Worker 1098*61046927SAndroid Build Coastguard Worker public: 1099*61046927SAndroid Build Coastguard Worker struct { 1100*61046927SAndroid Build Coastguard Worker Target target; 1101*61046927SAndroid Build Coastguard Worker 1102*61046927SAndroid Build Coastguard Worker uint16_t r; 1103*61046927SAndroid Build Coastguard Worker uint16_t s; 1104*61046927SAndroid Build Coastguard Worker int8_t rIndirectSrc; 1105*61046927SAndroid Build Coastguard Worker int8_t sIndirectSrc; 1106*61046927SAndroid Build Coastguard Worker 1107*61046927SAndroid Build Coastguard Worker uint8_t mask; 1108*61046927SAndroid Build Coastguard Worker uint8_t gatherComp; 1109*61046927SAndroid Build Coastguard Worker 1110*61046927SAndroid Build Coastguard Worker bool liveOnly; // only execute on live pixels of a quad (optimization) 1111*61046927SAndroid Build Coastguard Worker bool levelZero; 1112*61046927SAndroid Build Coastguard Worker bool derivAll; 1113*61046927SAndroid Build Coastguard Worker bool bindless; 1114*61046927SAndroid Build Coastguard Worker 1115*61046927SAndroid Build Coastguard Worker int8_t useOffsets; // 0, 1, or 4 for textureGatherOffsets 1116*61046927SAndroid Build Coastguard Worker int8_t offset[3]; // only used on nv50 1117*61046927SAndroid Build Coastguard Worker 1118*61046927SAndroid Build Coastguard Worker enum TexQuery query; 1119*61046927SAndroid Build Coastguard Worker const struct ImgFormatDesc *format; 1120*61046927SAndroid Build Coastguard Worker 1121*61046927SAndroid Build Coastguard Worker bool scalar; // for GM107s TEXS, TLDS, TLD4S 1122*61046927SAndroid Build Coastguard Worker } tex; 1123*61046927SAndroid Build Coastguard Worker 1124*61046927SAndroid Build Coastguard Worker ValueRef dPdx[3]; 1125*61046927SAndroid Build Coastguard Worker ValueRef dPdy[3]; 1126*61046927SAndroid Build Coastguard Worker ValueRef offset[4][3]; 1127*61046927SAndroid Build Coastguard Worker }; 1128*61046927SAndroid Build Coastguard Worker 1129*61046927SAndroid Build Coastguard Worker class CmpInstruction : public Instruction 1130*61046927SAndroid Build Coastguard Worker { 1131*61046927SAndroid Build Coastguard Worker public: 1132*61046927SAndroid Build Coastguard Worker CmpInstruction(Function *, operation); 1133*61046927SAndroid Build Coastguard Worker 1134*61046927SAndroid Build Coastguard Worker virtual CmpInstruction *clone(ClonePolicy<Function>&, 1135*61046927SAndroid Build Coastguard Worker Instruction * = NULL) const; 1136*61046927SAndroid Build Coastguard Worker setCondition(CondCode cond)1137*61046927SAndroid Build Coastguard Worker void setCondition(CondCode cond) { setCond = cond; } getCondition()1138*61046927SAndroid Build Coastguard Worker CondCode getCondition() const { return setCond; } 1139*61046927SAndroid Build Coastguard Worker 1140*61046927SAndroid Build Coastguard Worker public: 1141*61046927SAndroid Build Coastguard Worker CondCode setCond; 1142*61046927SAndroid Build Coastguard Worker }; 1143*61046927SAndroid Build Coastguard Worker 1144*61046927SAndroid Build Coastguard Worker class FlowInstruction : public Instruction 1145*61046927SAndroid Build Coastguard Worker { 1146*61046927SAndroid Build Coastguard Worker public: 1147*61046927SAndroid Build Coastguard Worker FlowInstruction(Function *, operation, void *target); 1148*61046927SAndroid Build Coastguard Worker 1149*61046927SAndroid Build Coastguard Worker virtual FlowInstruction *clone(ClonePolicy<Function>&, 1150*61046927SAndroid Build Coastguard Worker Instruction * = NULL) const; 1151*61046927SAndroid Build Coastguard Worker 1152*61046927SAndroid Build Coastguard Worker public: 1153*61046927SAndroid Build Coastguard Worker unsigned allWarp : 1; 1154*61046927SAndroid Build Coastguard Worker unsigned absolute : 1; 1155*61046927SAndroid Build Coastguard Worker unsigned limit : 1; 1156*61046927SAndroid Build Coastguard Worker unsigned builtin : 1; // true for calls to emulation code 1157*61046927SAndroid Build Coastguard Worker unsigned indirect : 1; // target in src(0) 1158*61046927SAndroid Build Coastguard Worker 1159*61046927SAndroid Build Coastguard Worker union { 1160*61046927SAndroid Build Coastguard Worker BasicBlock *bb; 1161*61046927SAndroid Build Coastguard Worker int builtin; 1162*61046927SAndroid Build Coastguard Worker Function *fn; 1163*61046927SAndroid Build Coastguard Worker } target; 1164*61046927SAndroid Build Coastguard Worker }; 1165*61046927SAndroid Build Coastguard Worker 1166*61046927SAndroid Build Coastguard Worker class BasicBlock 1167*61046927SAndroid Build Coastguard Worker { 1168*61046927SAndroid Build Coastguard Worker public: 1169*61046927SAndroid Build Coastguard Worker BasicBlock(Function *); 1170*61046927SAndroid Build Coastguard Worker ~BasicBlock(); 1171*61046927SAndroid Build Coastguard Worker 1172*61046927SAndroid Build Coastguard Worker BasicBlock(const BasicBlock&) = delete; 1173*61046927SAndroid Build Coastguard Worker BasicBlock& operator=(const BasicBlock&) = delete; 1174*61046927SAndroid Build Coastguard Worker 1175*61046927SAndroid Build Coastguard Worker BasicBlock *clone(ClonePolicy<Function>&) const; 1176*61046927SAndroid Build Coastguard Worker getId()1177*61046927SAndroid Build Coastguard Worker inline int getId() const { return id; } getInsnCount()1178*61046927SAndroid Build Coastguard Worker inline unsigned int getInsnCount() const { return numInsns; } isTerminated()1179*61046927SAndroid Build Coastguard Worker inline bool isTerminated() const { return exit && exit->terminator; } 1180*61046927SAndroid Build Coastguard Worker 1181*61046927SAndroid Build Coastguard Worker bool dominatedBy(BasicBlock *bb); 1182*61046927SAndroid Build Coastguard Worker inline bool reachableBy(const BasicBlock *by, const BasicBlock *term); 1183*61046927SAndroid Build Coastguard Worker 1184*61046927SAndroid Build Coastguard Worker // returns mask of conditional out blocks 1185*61046927SAndroid Build Coastguard Worker // e.g. 3 for IF { .. } ELSE { .. } ENDIF, 1 for IF { .. } ENDIF 1186*61046927SAndroid Build Coastguard Worker unsigned int initiatesSimpleConditional() const; 1187*61046927SAndroid Build Coastguard Worker 1188*61046927SAndroid Build Coastguard Worker public: getFunction()1189*61046927SAndroid Build Coastguard Worker Function *getFunction() const { return func; } getProgram()1190*61046927SAndroid Build Coastguard Worker Program *getProgram() const { return program; } 1191*61046927SAndroid Build Coastguard Worker getEntry()1192*61046927SAndroid Build Coastguard Worker Instruction *getEntry() const { return entry; } // first non-phi instruction getPhi()1193*61046927SAndroid Build Coastguard Worker Instruction *getPhi() const { return phi; } getFirst()1194*61046927SAndroid Build Coastguard Worker Instruction *getFirst() const { return phi ? phi : entry; } getExit()1195*61046927SAndroid Build Coastguard Worker Instruction *getExit() const { return exit; } 1196*61046927SAndroid Build Coastguard Worker 1197*61046927SAndroid Build Coastguard Worker void insertHead(Instruction *); 1198*61046927SAndroid Build Coastguard Worker void insertTail(Instruction *); 1199*61046927SAndroid Build Coastguard Worker void insertBefore(Instruction *, Instruction *); 1200*61046927SAndroid Build Coastguard Worker void insertAfter(Instruction *, Instruction *); 1201*61046927SAndroid Build Coastguard Worker void remove(Instruction *); 1202*61046927SAndroid Build Coastguard Worker void permuteAdjacent(Instruction *, Instruction *); 1203*61046927SAndroid Build Coastguard Worker 1204*61046927SAndroid Build Coastguard Worker BasicBlock *idom() const; 1205*61046927SAndroid Build Coastguard Worker 1206*61046927SAndroid Build Coastguard Worker // NOTE: currently does not rebuild the dominator tree 1207*61046927SAndroid Build Coastguard Worker BasicBlock *splitBefore(Instruction *, bool attach = true); 1208*61046927SAndroid Build Coastguard Worker BasicBlock *splitAfter(Instruction *, bool attach = true); 1209*61046927SAndroid Build Coastguard Worker getDF()1210*61046927SAndroid Build Coastguard Worker DLList& getDF() { return df; } iterDF()1211*61046927SAndroid Build Coastguard Worker DLList::Iterator iterDF() { return df.iterator(); } 1212*61046927SAndroid Build Coastguard Worker 1213*61046927SAndroid Build Coastguard Worker static inline BasicBlock *get(Iterator&); 1214*61046927SAndroid Build Coastguard Worker static inline BasicBlock *get(Graph::Node *); 1215*61046927SAndroid Build Coastguard Worker 1216*61046927SAndroid Build Coastguard Worker public: 1217*61046927SAndroid Build Coastguard Worker Graph::Node cfg; // first edge is branch *taken* (the ELSE branch) 1218*61046927SAndroid Build Coastguard Worker Graph::Node dom; 1219*61046927SAndroid Build Coastguard Worker 1220*61046927SAndroid Build Coastguard Worker BitSet liveSet; 1221*61046927SAndroid Build Coastguard Worker BitSet defSet; 1222*61046927SAndroid Build Coastguard Worker 1223*61046927SAndroid Build Coastguard Worker uint32_t binPos; 1224*61046927SAndroid Build Coastguard Worker uint32_t binSize; 1225*61046927SAndroid Build Coastguard Worker 1226*61046927SAndroid Build Coastguard Worker Instruction *joinAt; // for quick reference 1227*61046927SAndroid Build Coastguard Worker 1228*61046927SAndroid Build Coastguard Worker bool explicitCont; // loop headers: true if loop contains continue stmts 1229*61046927SAndroid Build Coastguard Worker 1230*61046927SAndroid Build Coastguard Worker private: 1231*61046927SAndroid Build Coastguard Worker int id; 1232*61046927SAndroid Build Coastguard Worker DLList df; 1233*61046927SAndroid Build Coastguard Worker 1234*61046927SAndroid Build Coastguard Worker Instruction *phi; 1235*61046927SAndroid Build Coastguard Worker Instruction *entry; 1236*61046927SAndroid Build Coastguard Worker Instruction *exit; 1237*61046927SAndroid Build Coastguard Worker 1238*61046927SAndroid Build Coastguard Worker unsigned int numInsns; 1239*61046927SAndroid Build Coastguard Worker 1240*61046927SAndroid Build Coastguard Worker private: 1241*61046927SAndroid Build Coastguard Worker Function *func; 1242*61046927SAndroid Build Coastguard Worker Program *program; 1243*61046927SAndroid Build Coastguard Worker 1244*61046927SAndroid Build Coastguard Worker void splitCommon(Instruction *, BasicBlock *, bool attach); 1245*61046927SAndroid Build Coastguard Worker }; 1246*61046927SAndroid Build Coastguard Worker 1247*61046927SAndroid Build Coastguard Worker class Function 1248*61046927SAndroid Build Coastguard Worker { 1249*61046927SAndroid Build Coastguard Worker public: 1250*61046927SAndroid Build Coastguard Worker Function(Program *, const char *name, uint32_t label); 1251*61046927SAndroid Build Coastguard Worker ~Function(); 1252*61046927SAndroid Build Coastguard Worker 1253*61046927SAndroid Build Coastguard Worker Function(const Function&) = delete; 1254*61046927SAndroid Build Coastguard Worker Function& operator=(const Function&) = delete; 1255*61046927SAndroid Build Coastguard Worker 1256*61046927SAndroid Build Coastguard Worker static inline Function *get(Graph::Node *node); 1257*61046927SAndroid Build Coastguard Worker getProgram()1258*61046927SAndroid Build Coastguard Worker inline Program *getProgram() const { return prog; } getName()1259*61046927SAndroid Build Coastguard Worker inline const char *getName() const { return name; } getId()1260*61046927SAndroid Build Coastguard Worker inline int getId() const { return id; } getLabel()1261*61046927SAndroid Build Coastguard Worker inline uint32_t getLabel() const { return label; } 1262*61046927SAndroid Build Coastguard Worker 1263*61046927SAndroid Build Coastguard Worker void print(); 1264*61046927SAndroid Build Coastguard Worker void printLiveIntervals() const; 1265*61046927SAndroid Build Coastguard Worker void printCFGraph(const char *filePath); 1266*61046927SAndroid Build Coastguard Worker 1267*61046927SAndroid Build Coastguard Worker bool setEntry(BasicBlock *); 1268*61046927SAndroid Build Coastguard Worker bool setExit(BasicBlock *); 1269*61046927SAndroid Build Coastguard Worker 1270*61046927SAndroid Build Coastguard Worker unsigned int orderInstructions(ArrayList&); 1271*61046927SAndroid Build Coastguard Worker add(BasicBlock * bb,int & id)1272*61046927SAndroid Build Coastguard Worker inline void add(BasicBlock *bb, int& id) { allBBlocks.insert(bb, id); } add(Instruction * insn,int & id)1273*61046927SAndroid Build Coastguard Worker inline void add(Instruction *insn, int& id) { allInsns.insert(insn, id); } add(LValue * lval,int & id)1274*61046927SAndroid Build Coastguard Worker inline void add(LValue *lval, int& id) { allLValues.insert(lval, id); } 1275*61046927SAndroid Build Coastguard Worker 1276*61046927SAndroid Build Coastguard Worker inline LValue *getLValue(int id); 1277*61046927SAndroid Build Coastguard Worker 1278*61046927SAndroid Build Coastguard Worker void buildLiveSets(); 1279*61046927SAndroid Build Coastguard Worker bool convertToSSA(); 1280*61046927SAndroid Build Coastguard Worker 1281*61046927SAndroid Build Coastguard Worker public: 1282*61046927SAndroid Build Coastguard Worker std::deque<ValueDef> ins; 1283*61046927SAndroid Build Coastguard Worker std::deque<ValueRef> outs; 1284*61046927SAndroid Build Coastguard Worker std::deque<Value *> clobbers; 1285*61046927SAndroid Build Coastguard Worker 1286*61046927SAndroid Build Coastguard Worker Graph cfg; 1287*61046927SAndroid Build Coastguard Worker Graph::Node *cfgExit; 1288*61046927SAndroid Build Coastguard Worker Graph *domTree; 1289*61046927SAndroid Build Coastguard Worker Graph::Node call; // node in the call graph 1290*61046927SAndroid Build Coastguard Worker 1291*61046927SAndroid Build Coastguard Worker BasicBlock **bbArray; // BBs in emission order 1292*61046927SAndroid Build Coastguard Worker int bbCount; 1293*61046927SAndroid Build Coastguard Worker 1294*61046927SAndroid Build Coastguard Worker unsigned int loopNestingBound; 1295*61046927SAndroid Build Coastguard Worker int regClobberMax; 1296*61046927SAndroid Build Coastguard Worker 1297*61046927SAndroid Build Coastguard Worker uint32_t binPos; 1298*61046927SAndroid Build Coastguard Worker uint32_t binSize; 1299*61046927SAndroid Build Coastguard Worker 1300*61046927SAndroid Build Coastguard Worker uint32_t tlsBase; // base address for l[] space (if no stack pointer is used) 1301*61046927SAndroid Build Coastguard Worker uint32_t tlsSize; 1302*61046927SAndroid Build Coastguard Worker 1303*61046927SAndroid Build Coastguard Worker ArrayList allBBlocks; 1304*61046927SAndroid Build Coastguard Worker ArrayList allInsns; 1305*61046927SAndroid Build Coastguard Worker ArrayList allLValues; 1306*61046927SAndroid Build Coastguard Worker 1307*61046927SAndroid Build Coastguard Worker private: 1308*61046927SAndroid Build Coastguard Worker void buildLiveSetsPreSSA(BasicBlock *, const int sequence); 1309*61046927SAndroid Build Coastguard Worker void buildDefSetsPreSSA(BasicBlock *bb, const int seq); 1310*61046927SAndroid Build Coastguard Worker 1311*61046927SAndroid Build Coastguard Worker private: 1312*61046927SAndroid Build Coastguard Worker uint32_t label; 1313*61046927SAndroid Build Coastguard Worker int id; 1314*61046927SAndroid Build Coastguard Worker const char *const name; 1315*61046927SAndroid Build Coastguard Worker Program *prog; 1316*61046927SAndroid Build Coastguard Worker }; 1317*61046927SAndroid Build Coastguard Worker 1318*61046927SAndroid Build Coastguard Worker enum CGStage 1319*61046927SAndroid Build Coastguard Worker { 1320*61046927SAndroid Build Coastguard Worker CG_STAGE_PRE_SSA, 1321*61046927SAndroid Build Coastguard Worker CG_STAGE_SSA, // expected directly before register allocation 1322*61046927SAndroid Build Coastguard Worker CG_STAGE_POST_RA 1323*61046927SAndroid Build Coastguard Worker }; 1324*61046927SAndroid Build Coastguard Worker 1325*61046927SAndroid Build Coastguard Worker class Program 1326*61046927SAndroid Build Coastguard Worker { 1327*61046927SAndroid Build Coastguard Worker public: 1328*61046927SAndroid Build Coastguard Worker enum Type 1329*61046927SAndroid Build Coastguard Worker { 1330*61046927SAndroid Build Coastguard Worker TYPE_VERTEX, 1331*61046927SAndroid Build Coastguard Worker TYPE_TESSELLATION_CONTROL, 1332*61046927SAndroid Build Coastguard Worker TYPE_TESSELLATION_EVAL, 1333*61046927SAndroid Build Coastguard Worker TYPE_GEOMETRY, 1334*61046927SAndroid Build Coastguard Worker TYPE_FRAGMENT, 1335*61046927SAndroid Build Coastguard Worker TYPE_COMPUTE 1336*61046927SAndroid Build Coastguard Worker }; 1337*61046927SAndroid Build Coastguard Worker 1338*61046927SAndroid Build Coastguard Worker Program(Type type, Target *targ); 1339*61046927SAndroid Build Coastguard Worker ~Program(); 1340*61046927SAndroid Build Coastguard Worker 1341*61046927SAndroid Build Coastguard Worker Program(const Program&) = delete; 1342*61046927SAndroid Build Coastguard Worker Program& operator=(const Program&) = delete; 1343*61046927SAndroid Build Coastguard Worker 1344*61046927SAndroid Build Coastguard Worker void print(); 1345*61046927SAndroid Build Coastguard Worker getType()1346*61046927SAndroid Build Coastguard Worker Type getType() const { return progType; } 1347*61046927SAndroid Build Coastguard Worker add(Function * fn,int & id)1348*61046927SAndroid Build Coastguard Worker inline void add(Function *fn, int& id) { allFuncs.insert(fn, id); } del(Function * fn,int & id)1349*61046927SAndroid Build Coastguard Worker inline void del(Function *fn, int& id) { allFuncs.remove(id); } add(Value * rval,int & id)1350*61046927SAndroid Build Coastguard Worker inline void add(Value *rval, int& id) { allRValues.insert(rval, id); } 1351*61046927SAndroid Build Coastguard Worker 1352*61046927SAndroid Build Coastguard Worker bool makeFromNIR(struct nv50_ir_prog_info *, 1353*61046927SAndroid Build Coastguard Worker struct nv50_ir_prog_info_out *); 1354*61046927SAndroid Build Coastguard Worker bool convertToSSA(); 1355*61046927SAndroid Build Coastguard Worker bool optimizeSSA(int level); 1356*61046927SAndroid Build Coastguard Worker bool optimizePostRA(int level); 1357*61046927SAndroid Build Coastguard Worker bool registerAllocation(); 1358*61046927SAndroid Build Coastguard Worker bool emitBinary(struct nv50_ir_prog_info_out *); 1359*61046927SAndroid Build Coastguard Worker getTarget()1360*61046927SAndroid Build Coastguard Worker const Target *getTarget() const { return target; } 1361*61046927SAndroid Build Coastguard Worker 1362*61046927SAndroid Build Coastguard Worker private: 1363*61046927SAndroid Build Coastguard Worker Type progType; 1364*61046927SAndroid Build Coastguard Worker Target *target; 1365*61046927SAndroid Build Coastguard Worker 1366*61046927SAndroid Build Coastguard Worker public: 1367*61046927SAndroid Build Coastguard Worker Function *main; 1368*61046927SAndroid Build Coastguard Worker Graph calls; 1369*61046927SAndroid Build Coastguard Worker 1370*61046927SAndroid Build Coastguard Worker ArrayList allFuncs; 1371*61046927SAndroid Build Coastguard Worker ArrayList allRValues; 1372*61046927SAndroid Build Coastguard Worker 1373*61046927SAndroid Build Coastguard Worker uint32_t *code; 1374*61046927SAndroid Build Coastguard Worker uint32_t binSize; 1375*61046927SAndroid Build Coastguard Worker uint32_t tlsSize; // size required for FILE_MEMORY_LOCAL 1376*61046927SAndroid Build Coastguard Worker 1377*61046927SAndroid Build Coastguard Worker int maxGPR; 1378*61046927SAndroid Build Coastguard Worker bool fp64; 1379*61046927SAndroid Build Coastguard Worker bool persampleInvocation; 1380*61046927SAndroid Build Coastguard Worker 1381*61046927SAndroid Build Coastguard Worker MemoryPool mem_Instruction; 1382*61046927SAndroid Build Coastguard Worker MemoryPool mem_CmpInstruction; 1383*61046927SAndroid Build Coastguard Worker MemoryPool mem_TexInstruction; 1384*61046927SAndroid Build Coastguard Worker MemoryPool mem_FlowInstruction; 1385*61046927SAndroid Build Coastguard Worker MemoryPool mem_LValue; 1386*61046927SAndroid Build Coastguard Worker MemoryPool mem_Symbol; 1387*61046927SAndroid Build Coastguard Worker MemoryPool mem_ImmediateValue; 1388*61046927SAndroid Build Coastguard Worker 1389*61046927SAndroid Build Coastguard Worker uint32_t dbgFlags; 1390*61046927SAndroid Build Coastguard Worker uint8_t optLevel; 1391*61046927SAndroid Build Coastguard Worker 1392*61046927SAndroid Build Coastguard Worker void *targetPriv; // e.g. to carry information between passes 1393*61046927SAndroid Build Coastguard Worker 1394*61046927SAndroid Build Coastguard Worker const struct nv50_ir_prog_info *driver; // for driver configuration 1395*61046927SAndroid Build Coastguard Worker const struct nv50_ir_prog_info_out *driver_out; // for driver configuration 1396*61046927SAndroid Build Coastguard Worker 1397*61046927SAndroid Build Coastguard Worker void releaseInstruction(Instruction *); 1398*61046927SAndroid Build Coastguard Worker void releaseValue(Value *); 1399*61046927SAndroid Build Coastguard Worker }; 1400*61046927SAndroid Build Coastguard Worker 1401*61046927SAndroid Build Coastguard Worker // TODO: add const version 1402*61046927SAndroid Build Coastguard Worker class Pass 1403*61046927SAndroid Build Coastguard Worker { 1404*61046927SAndroid Build Coastguard Worker public: 1405*61046927SAndroid Build Coastguard Worker bool run(Program *, bool ordered = false, bool skipPhi = false); 1406*61046927SAndroid Build Coastguard Worker bool run(Function *, bool ordered = false, bool skipPhi = false); 1407*61046927SAndroid Build Coastguard Worker 1408*61046927SAndroid Build Coastguard Worker private: 1409*61046927SAndroid Build Coastguard Worker bool doRun(Program *, bool ordered, bool skipPhi); 1410*61046927SAndroid Build Coastguard Worker bool doRun(Function *, bool ordered, bool skipPhi); 1411*61046927SAndroid Build Coastguard Worker 1412*61046927SAndroid Build Coastguard Worker protected: 1413*61046927SAndroid Build Coastguard Worker // return false to continue with next entity on next higher level visit(Function *)1414*61046927SAndroid Build Coastguard Worker virtual bool visit(Function *) { return true; } visit(BasicBlock *)1415*61046927SAndroid Build Coastguard Worker virtual bool visit(BasicBlock *) { return true; } visit(Instruction *)1416*61046927SAndroid Build Coastguard Worker virtual bool visit(Instruction *) { return false; } 1417*61046927SAndroid Build Coastguard Worker 1418*61046927SAndroid Build Coastguard Worker bool err; 1419*61046927SAndroid Build Coastguard Worker Function *func; 1420*61046927SAndroid Build Coastguard Worker Program *prog; 1421*61046927SAndroid Build Coastguard Worker }; 1422*61046927SAndroid Build Coastguard Worker 1423*61046927SAndroid Build Coastguard Worker // ============================================================================= 1424*61046927SAndroid Build Coastguard Worker 1425*61046927SAndroid Build Coastguard Worker #include "nv50_ir_inlines.h" 1426*61046927SAndroid Build Coastguard Worker 1427*61046927SAndroid Build Coastguard Worker } // namespace nv50_ir 1428*61046927SAndroid Build Coastguard Worker 1429*61046927SAndroid Build Coastguard Worker #endif // __NV50_IR_H__ 1430