1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2011 Christoph Bumiller 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included in 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * all copies or substantial portions of the Software. 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE. 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern "C" { 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi/tgsi_dump.h" 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi/tgsi_scan.h" 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nv50_ir.h" 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nv50_ir_util.h" 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nv50_ir_build_util.h" 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnamespace tgsi { 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass Source; 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic nv50_ir::operation translateOpcode(uint opcode); 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic nv50_ir::DataFile translateFile(uint file); 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic nv50_ir::TexTarget translateTexture(uint texTarg); 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic nv50_ir::SVSemantic translateSysVal(uint sysval); 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass Instruction 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic: 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Instruction(const struct tgsi_full_instruction *inst) : insn(inst) { } 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org class SrcRegister 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org public: 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SrcRegister(const struct tgsi_full_src_register *src) 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org : reg(src->Register), 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fsr(src) 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { } 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SrcRegister(const struct tgsi_src_register& src) : reg(src), fsr(NULL) { } 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_src_register offsetToSrc(struct tgsi_texture_offset off) 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_src_register reg; 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(®, 0, sizeof(reg)); 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reg.Index = off.Index; 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reg.File = off.File; 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reg.SwizzleX = off.SwizzleX; 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reg.SwizzleY = off.SwizzleY; 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reg.SwizzleZ = off.SwizzleZ; 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return reg; 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SrcRegister(const struct tgsi_texture_offset& off) : 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reg(offsetToSrc(off)), 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fsr(NULL) 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { } 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint getFile() const { return reg.File; } 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool is2D() const { return reg.Dimension; } 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool isIndirect(int dim) const 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (dim && fsr) ? fsr->Dimension.Indirect : reg.Indirect; 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int getIndex(int dim) const 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (dim && fsr) ? fsr->Dimension.Index : reg.Index; 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int getSwizzle(int chan) const 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return tgsi_util_get_src_register_swizzle(®, chan); 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50_ir::Modifier getMod(int chan) const; 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SrcRegister getIndirect(int dim) const 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(fsr && isIndirect(dim)); 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dim) 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return SrcRegister(fsr->DimIndirect); 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return SrcRegister(fsr->Indirect); 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t getValueU32(int c, const struct nv50_ir_prog_info *info) const 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(reg.File == TGSI_FILE_IMMEDIATE); 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!reg.Absolute); 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!reg.Negate); 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return info->immd.data[reg.Index * 4 + getSwizzle(c)]; 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org private: 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct tgsi_src_register reg; 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct tgsi_full_src_register *fsr; 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }; 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org class DstRegister 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org public: 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DstRegister(const struct tgsi_full_dst_register *dst) 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org : reg(dst->Register), 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fdr(dst) 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { } 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DstRegister(const struct tgsi_dst_register& dst) : reg(dst), fdr(NULL) { } 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint getFile() const { return reg.File; } 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool is2D() const { return reg.Dimension; } 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool isIndirect(int dim) const 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (dim && fdr) ? fdr->Dimension.Indirect : reg.Indirect; 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int getIndex(int dim) const 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (dim && fdr) ? fdr->Dimension.Dimension : reg.Index; 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int getMask() const { return reg.WriteMask; } 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool isMasked(int chan) const { return !(getMask() & (1 << chan)); } 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SrcRegister getIndirect(int dim) const 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(fdr && isIndirect(dim)); 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dim) 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return SrcRegister(fdr->DimIndirect); 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return SrcRegister(fdr->Indirect); 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org private: 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct tgsi_dst_register reg; 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct tgsi_full_dst_register *fdr; 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }; 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inline uint getOpcode() const { return insn->Instruction.Opcode; } 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int srcCount() const { return insn->Instruction.NumSrcRegs; } 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int dstCount() const { return insn->Instruction.NumDstRegs; } 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // mask of used components of source s 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int srcMask(unsigned int s) const; 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SrcRegister getSrc(unsigned int s) const 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(s < srcCount()); 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return SrcRegister(&insn->Src[s]); 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DstRegister getDst(unsigned int d) const 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(d < dstCount()); 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return DstRegister(&insn->Dst[d]); 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SrcRegister getTexOffset(unsigned int i) const 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(i < TGSI_FULL_MAX_TEX_OFFSETS); 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return SrcRegister(insn->TexOffsets[i]); 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int getNumTexOffsets() const { return insn->Texture.NumOffsets; } 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool checkDstSrcAliasing() const; 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inline nv50_ir::operation getOP() const { 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return translateOpcode(getOpcode()); } 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50_ir::DataType inferSrcType() const; 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50_ir::DataType inferDstType() const; 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50_ir::CondCode getSetCond() const; 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50_ir::TexInstruction::Target getTexture(const Source *, int s) const; 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inline uint getLabel() { return insn->Label.Label; } 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned getSaturate() const { return insn->Instruction.Saturate; } 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void print() const 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dump_instruction(insn, 1); 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprivate: 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct tgsi_full_instruction *insn; 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgunsigned int Instruction::srcMask(unsigned int s) const 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int mask = insn->Dst[0].Register.WriteMask; 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (insn->Instruction.Opcode) { 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_COS: 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SIN: 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (mask & 0x8) | ((mask & 0x7) ? 0x1 : 0x0); 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_DP2: 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0x3; 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_DP3: 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0x7; 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_DP4: 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_DPH: 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_KIL: /* WriteMask ignored */ 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0xf; 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_DST: 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return mask & (s ? 0xa : 0x6); 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_EX2: 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_EXP: 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_LG2: 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_LOG: 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_POW: 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_RCP: 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_RSQ: 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SCS: 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0x1; 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_IF: 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0x1; 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_LIT: 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0xb; 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_TEX: 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_TXB: 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_TXD: 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_TXL: 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_TXP: 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct tgsi_instruction_texture *tex = &insn->Texture; 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(insn->Instruction.Texture); 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask = 0x7; 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn->Instruction.Opcode != TGSI_OPCODE_TEX && 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->Instruction.Opcode != TGSI_OPCODE_TXD) 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask |= 0x8; /* bias, lod or proj */ 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (tex->Texture) { 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_1D: 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask &= 0x9; 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_SHADOW1D: 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask &= 0xd; 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_1D_ARRAY: 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_2D: 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_RECT: 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask &= 0xb; 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return mask; 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_XPD: 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int x = 0; 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask & 1) x |= 0x6; 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask & 2) x |= 0x5; 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask & 4) x |= 0x3; 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return x; 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return mask; 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_ir::Modifier Instruction::SrcRegister::getMod(int chan) const 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50_ir::Modifier m(0); 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg.Absolute) 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org m = m | nv50_ir::Modifier(NV50_IR_MOD_ABS); 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg.Negate) 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org m = m | nv50_ir::Modifier(NV50_IR_MOD_NEG); 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return m; 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic nv50_ir::DataFile translateFile(uint file) 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (file) { 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_CONSTANT: return nv50_ir::FILE_MEMORY_CONST; 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_INPUT: return nv50_ir::FILE_SHADER_INPUT; 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_OUTPUT: return nv50_ir::FILE_SHADER_OUTPUT; 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_TEMPORARY: return nv50_ir::FILE_GPR; 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_ADDRESS: return nv50_ir::FILE_ADDRESS; 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_PREDICATE: return nv50_ir::FILE_PREDICATE; 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_IMMEDIATE: return nv50_ir::FILE_IMMEDIATE; 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_SYSTEM_VALUE: return nv50_ir::FILE_SYSTEM_VALUE; 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_IMMEDIATE_ARRAY: return nv50_ir::FILE_IMMEDIATE; 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_TEMPORARY_ARRAY: return nv50_ir::FILE_MEMORY_LOCAL; 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_RESOURCE: return nv50_ir::FILE_MEMORY_GLOBAL; 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_SAMPLER: 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_NULL: 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return nv50_ir::FILE_NULL; 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic nv50_ir::SVSemantic translateSysVal(uint sysval) 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (sysval) { 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SEMANTIC_FACE: return nv50_ir::SV_FACE; 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SEMANTIC_PSIZE: return nv50_ir::SV_POINT_SIZE; 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SEMANTIC_PRIMID: return nv50_ir::SV_PRIMITIVE_ID; 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SEMANTIC_INSTANCEID: return nv50_ir::SV_INSTANCE_ID; 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SEMANTIC_VERTEXID: return nv50_ir::SV_VERTEX_ID; 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return nv50_ir::SV_CLOCK; 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NV50_IR_TEX_TARG_CASE(a, b) \ 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_##a: return nv50_ir::TEX_TARGET_##b; 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic nv50_ir::TexTarget translateTexture(uint tex) 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (tex) { 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_TEX_TARG_CASE(1D, 1D); 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_TEX_TARG_CASE(2D, 2D); 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_TEX_TARG_CASE(3D, 3D); 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_TEX_TARG_CASE(CUBE, CUBE); 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_TEX_TARG_CASE(RECT, RECT); 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_TEX_TARG_CASE(1D_ARRAY, 1D_ARRAY); 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_TEX_TARG_CASE(2D_ARRAY, 2D_ARRAY); 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_TEX_TARG_CASE(SHADOW1D, 1D_SHADOW); 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_TEX_TARG_CASE(SHADOW2D, 2D_SHADOW); 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_TEX_TARG_CASE(SHADOW1D_ARRAY, 1D_ARRAY_SHADOW); 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_TEX_TARG_CASE(SHADOW2D_ARRAY, 2D_ARRAY_SHADOW); 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_TEX_TARG_CASE(SHADOWCUBE, CUBE_SHADOW); 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_TEX_TARG_CASE(SHADOWRECT, RECT_SHADOW); 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_TEX_TARG_CASE(BUFFER, BUFFER); 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TEXTURE_UNKNOWN: 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"invalid texture target"); 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return nv50_ir::TEX_TARGET_2D; 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_ir::DataType Instruction::inferSrcType() const 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (getOpcode()) { 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_AND: 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_OR: 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_XOR: 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_NOT: 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_U2F: 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_UADD: 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_UDIV: 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_UMOD: 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_UMAD: 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_UMUL: 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_UMAX: 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_UMIN: 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_USEQ: 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_USGE: 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_USLT: 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_USNE: 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_USHR: 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_UCMP: 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return nv50_ir::TYPE_U32; 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_I2F: 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_IDIV: 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_IMAX: 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_IMIN: 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_IABS: 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_INEG: 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_ISGE: 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_ISHR: 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_ISLT: 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_ISSG: 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SAD: // not sure about SAD, but no one has a float version 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_MOD: 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_UARL: 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return nv50_ir::TYPE_S32; 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return nv50_ir::TYPE_F32; 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_ir::DataType Instruction::inferDstType() const 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (getOpcode()) { 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_F2U: return nv50_ir::TYPE_U32; 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_F2I: return nv50_ir::TYPE_S32; 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_I2F: 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_U2F: 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return nv50_ir::TYPE_F32; 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return inferSrcType(); 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_ir::CondCode Instruction::getSetCond() const 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org using namespace nv50_ir; 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (getOpcode()) { 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SLT: 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_ISLT: 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_USLT: 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return CC_LT; 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SLE: 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return CC_LE; 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SGE: 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_ISGE: 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_USGE: 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return CC_GE; 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SGT: 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return CC_GT; 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SEQ: 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_USEQ: 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return CC_EQ; 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SNE: 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return CC_NEU; 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_USNE: 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return CC_NE; 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SFL: 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return CC_NEVER; 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_STR: 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return CC_ALWAYS; 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NV50_IR_OPCODE_CASE(a, b) case TGSI_OPCODE_##a: return nv50_ir::OP_##b 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic nv50_ir::operation translateOpcode(uint opcode) 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (opcode) { 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(ARL, SHL); 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(MOV, MOV); 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(RCP, RCP); 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(RSQ, RSQ); 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(MUL, MUL); 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(ADD, ADD); 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(MIN, MIN); 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(MAX, MAX); 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(SLT, SET); 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(SGE, SET); 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(MAD, MAD); 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(SUB, SUB); 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(FLR, FLOOR); 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(ROUND, CVT); 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(EX2, EX2); 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(LG2, LG2); 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(POW, POW); 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(ABS, ABS); 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(COS, COS); 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(DDX, DFDX); 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(DDY, DFDY); 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(KILP, DISCARD); 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(SEQ, SET); 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(SFL, SET); 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(SGT, SET); 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(SIN, SIN); 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(SLE, SET); 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(SNE, SET); 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(STR, SET); 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(TEX, TEX); 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(TXD, TXD); 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(TXP, TEX); 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(BRA, BRA); 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(CAL, CALL); 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(RET, RET); 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(CMP, SLCT); 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(TXB, TXB); 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(DIV, DIV); 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(TXL, TXL); 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(CEIL, CEIL); 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(I2F, CVT); 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(NOT, NOT); 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(TRUNC, TRUNC); 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(SHL, SHL); 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(AND, AND); 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(OR, OR); 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(MOD, MOD); 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(XOR, XOR); 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(SAD, SAD); 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(TXF, TXF); 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(TXQ, TXQ); 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(EMIT, EMIT); 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(ENDPRIM, RESTART); 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(KIL, DISCARD); 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(F2I, CVT); 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(IDIV, DIV); 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(IMAX, MAX); 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(IMIN, MIN); 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(IABS, ABS); 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(INEG, NEG); 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(ISGE, SET); 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(ISHR, SHR); 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(ISLT, SET); 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(F2U, CVT); 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(U2F, CVT); 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(UADD, ADD); 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(UDIV, DIV); 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(UMAD, MAD); 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(UMAX, MAX); 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(UMIN, MIN); 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(UMOD, MOD); 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(UMUL, MUL); 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(USEQ, SET); 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(USGE, SET); 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(USHR, SHR); 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(USLT, SET); 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(USNE, SET); 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(LOAD, TXF); 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(SAMPLE, TEX); 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(SAMPLE_B, TXB); 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(SAMPLE_C, TEX); 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(SAMPLE_C_LZ, TEX); 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(SAMPLE_D, TXD); 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(SAMPLE_L, TXL); 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(GATHER4, TXG); 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(SVIEWINFO, TXQ); 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NV50_IR_OPCODE_CASE(END, EXIT); 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return nv50_ir::OP_NOP; 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool Instruction::checkDstSrcAliasing() const 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn->Dst[0].Register.Indirect) // no danger if indirect, using memory 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (int s = 0; s < TGSI_FULL_MAX_SRC_REGISTERS; ++s) { 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn->Src[s].Register.File == TGSI_FILE_NULL) 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn->Src[s].Register.File == insn->Dst[0].Register.File && 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->Src[s].Register.Index == insn->Dst[0].Register.Index) 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return true; 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass Source 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic: 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Source(struct nv50_ir_prog_info *); 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ~Source(); 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic: 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool scanSource(); 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned fileSize(unsigned file) const { return scan.file_max[file] + 1; } 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic: 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_shader_info scan; 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_full_instruction *insns; 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct tgsi_token *tokens; 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct nv50_ir_prog_info *info; 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50_ir::DynArray tempArrays; 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org nv50_ir::DynArray immdArrays; 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int tempArrayCount; 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int immdArrayCount; 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool mainTempsInLMem; 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int clipVertexOutput; 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint8_t *samplerViewTargets; // TGSI_TEXTURE_* 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned samplerViewCount; 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprivate: 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int inferSysValDirection(unsigned sn) const; 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool scanDeclaration(const struct tgsi_full_declaration *); 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool scanInstruction(const struct tgsi_full_instruction *); 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void scanProperty(const struct tgsi_full_property *); 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void scanImmediate(const struct tgsi_full_immediate *); 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inline bool isEdgeFlagPassthrough(const Instruction&) const; 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgSource::Source(struct nv50_ir_prog_info *prog) : info(prog) 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tokens = (const struct tgsi_token *)info->bin.source; 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (prog->dbgFlags & NV50_IR_DEBUG_BASIC) 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_dump(tokens, 0); 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org samplerViewTargets = NULL; 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mainTempsInLMem = FALSE; 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgSource::~Source() 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insns) 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(insns); 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (info->immd.data) 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(info->immd.data); 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (info->immd.type) 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(info->immd.type); 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (samplerViewTargets) 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org delete[] samplerViewTargets; 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool Source::scanSource() 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned insnCount = 0; 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct tgsi_parse_context parse; 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_scan_shader(tokens, &scan); 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insns = (struct tgsi_full_instruction *)MALLOC(scan.num_instructions * 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeof(insns[0])); 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!insns) 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clipVertexOutput = -1; 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org samplerViewCount = scan.file_max[TGSI_FILE_SAMPLER_VIEW] + 1; 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org samplerViewTargets = new uint8_t[samplerViewCount]; 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->immd.bufSize = 0; 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tempArrayCount = 0; 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org immdArrayCount = 0; 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->numInputs = scan.file_max[TGSI_FILE_INPUT] + 1; 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->numOutputs = scan.file_max[TGSI_FILE_OUTPUT] + 1; 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->numSysVals = scan.file_max[TGSI_FILE_SYSTEM_VALUE] + 1; 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (info->type == PIPE_SHADER_FRAGMENT) { 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->prop.fp.writesDepth = scan.writes_z; 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->prop.fp.usesDiscard = scan.uses_kill; 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (info->type == PIPE_SHADER_GEOMETRY) { 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->prop.gp.instanceCount = 1; // default value 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->immd.data = (uint32_t *)MALLOC(scan.immediate_count * 16); 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->immd.type = (ubyte *)MALLOC(scan.immediate_count * sizeof(ubyte)); 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_parse_init(&parse, tokens); 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (!tgsi_parse_end_of_tokens(&parse)) { 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_parse_token(&parse); 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (parse.FullToken.Token.Type) { 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TOKEN_TYPE_IMMEDIATE: 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org scanImmediate(&parse.FullToken.FullImmediate); 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TOKEN_TYPE_DECLARATION: 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org scanDeclaration(&parse.FullToken.FullDeclaration); 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TOKEN_TYPE_INSTRUCTION: 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insns[insnCount++] = parse.FullToken.FullInstruction; 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org scanInstruction(&parse.FullToken.FullInstruction); 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_TOKEN_TYPE_PROPERTY: 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org scanProperty(&parse.FullToken.FullProperty); 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INFO("unknown TGSI token type: %d\n", parse.FullToken.Token.Type); 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi_parse_free(&parse); 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mainTempsInLMem) 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->bin.tlsSpace += (scan.file_max[TGSI_FILE_TEMPORARY] + 1) * 16; 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (info->io.genUserClip > 0) { 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->io.clipDistanceMask = (1 << info->io.genUserClip) - 1; 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (unsigned int n = 0; n < ((info->io.genUserClip + 3) / 4); ++n) { 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int i = info->numOutputs++; 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->out[i].id = i; 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->out[i].sn = TGSI_SEMANTIC_CLIPDIST; 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->out[i].si = n; 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->out[i].mask = info->io.clipDistanceMask >> (n * 4); 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return info->assignSlots(info) == 0; 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid Source::scanProperty(const struct tgsi_full_property *prop) 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (prop->Property.PropertyName) { 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_PROPERTY_GS_OUTPUT_PRIM: 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->prop.gp.outputPrim = prop->u[0].Data; 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_PROPERTY_GS_INPUT_PRIM: 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->prop.gp.inputPrim = prop->u[0].Data; 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_PROPERTY_GS_MAX_OUTPUT_VERTICES: 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->prop.gp.maxVertices = prop->u[0].Data; 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_PROPERTY_GS_INSTANCE_COUNT: 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->prop.gp.instanceCount = prop->u[0].Data; 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS: 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->prop.fp.separateFragData = TRUE; 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_PROPERTY_FS_COORD_ORIGIN: 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_PROPERTY_FS_COORD_PIXEL_CENTER: 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // we don't care 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_PROPERTY_VS_PROHIBIT_UCPS: 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->io.genUserClip = -1; 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INFO("unhandled TGSI property %d\n", prop->Property.PropertyName); 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid Source::scanImmediate(const struct tgsi_full_immediate *imm) 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned n = info->immd.count++; 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(n < scan.immediate_count); 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (int c = 0; c < 4; ++c) 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->immd.data[n * 4 + c] = imm->u[c].Uint; 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->immd.type[n] = imm->Immediate.DataType; 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint Source::inferSysValDirection(unsigned sn) const 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (sn) { 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SEMANTIC_INSTANCEID: 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SEMANTIC_VERTEXID: 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 1; 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SEMANTIC_LAYER: 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SEMANTIC_VIEWPORTINDEX: 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SEMANTIC_PRIMID: 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (info->type == PIPE_SHADER_FRAGMENT) ? 1 : 0; 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool Source::scanDeclaration(const struct tgsi_full_declaration *decl) 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned sn = TGSI_SEMANTIC_GENERIC; 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned si = 0; 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned first = decl->Range.First, last = decl->Range.Last; 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (decl->Declaration.Semantic) { 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sn = decl->Semantic.Name; 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org si = decl->Semantic.Index; 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (decl->Declaration.File) { 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_INPUT: 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (info->type == PIPE_SHADER_VERTEX) { 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // all vertex attributes are equal 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = first; i <= last; ++i) { 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->in[i].sn = TGSI_SEMANTIC_GENERIC; 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->in[i].si = i; 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = first; i <= last; ++i, ++si) { 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->in[i].id = i; 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->in[i].sn = sn; 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->in[i].si = si; 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (info->type == PIPE_SHADER_FRAGMENT) { 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // translate interpolation mode 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (decl->Interp.Interpolate) { 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_INTERPOLATE_CONSTANT: 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->in[i].flat = 1; 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_INTERPOLATE_COLOR: 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->in[i].sc = 1; 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_INTERPOLATE_LINEAR: 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->in[i].linear = 1; 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (decl->Interp.Centroid) 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->in[i].centroid = 1; 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_OUTPUT: 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = first; i <= last; ++i, ++si) { 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (sn) { 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SEMANTIC_POSITION: 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (info->type == PIPE_SHADER_FRAGMENT) 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->io.fragDepth = i; 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (clipVertexOutput < 0) 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clipVertexOutput = i; 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SEMANTIC_COLOR: 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (info->type == PIPE_SHADER_FRAGMENT) 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->prop.fp.numColourResults++; 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SEMANTIC_EDGEFLAG: 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->io.edgeFlagOut = i; 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SEMANTIC_CLIPVERTEX: 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clipVertexOutput = i; 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SEMANTIC_CLIPDIST: 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->io.clipDistanceMask |= 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org decl->Declaration.UsageMask << (si * 4); 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->io.genUserClip = -1; 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->out[i].id = i; 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->out[i].sn = sn; 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->out[i].si = si; 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_SYSTEM_VALUE: 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (sn) { 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SEMANTIC_INSTANCEID: 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->io.instanceId = first; 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SEMANTIC_VERTEXID: 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->io.vertexId = first; 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = first; i <= last; ++i, ++si) { 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->sv[i].sn = sn; 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->sv[i].si = si; 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->sv[i].input = inferSysValDirection(sn); 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_SAMPLER_VIEW: 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = first; i <= last; ++i) 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org samplerViewTargets[i] = decl->SamplerView.Resource; 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_IMMEDIATE_ARRAY: 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (decl->Dim.Index2D >= immdArrayCount) 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org immdArrayCount = decl->Dim.Index2D + 1; 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org immdArrays[decl->Dim.Index2D].u32 = (last + 1) << 2; 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int c; 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t base, count; 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (decl->Declaration.UsageMask) { 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 0x1: c = 1; break; 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 0x3: c = 2; break; 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c = 4; 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org immdArrays[decl->Dim.Index2D].u32 |= c; 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count = (last + 1) * c; 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org base = info->immd.bufSize / 4; 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->immd.bufSize = (info->immd.bufSize + count * 4 + 0xf) & ~0xf; 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->immd.buf = (uint32_t *)REALLOC(info->immd.buf, base * 4, 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->immd.bufSize); 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // NOTE: this assumes array declarations are ordered by Dim.Index2D 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < count; ++i) 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->immd.buf[base + i] = decl->ImmediateData.u[i].Uint; 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_TEMPORARY_ARRAY: 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (decl->Dim.Index2D >= tempArrayCount) 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tempArrayCount = decl->Dim.Index2D + 1; 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tempArrays[decl->Dim.Index2D].u32 = (last + 1) << 2; 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int c; 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t count; 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (decl->Declaration.UsageMask) { 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 0x1: c = 1; break; 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 0x3: c = 2; break; 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c = 4; 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tempArrays[decl->Dim.Index2D].u32 |= c; 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org count = (last + 1) * c; 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->bin.tlsSpace += (info->bin.tlsSpace + count * 4 + 0xf) & ~0xf; 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_NULL: 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_TEMPORARY: 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_ADDRESS: 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_CONSTANT: 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_IMMEDIATE: 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_PREDICATE: 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_SAMPLER: 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ERROR("unhandled TGSI_FILE %d\n", decl->Declaration.File); 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return true; 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orginline bool Source::isEdgeFlagPassthrough(const Instruction& insn) const 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return insn.getOpcode() == TGSI_OPCODE_MOV && 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn.getDst(0).getIndex(0) == info->io.edgeFlagOut && 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn.getSrc(0).getFile() == TGSI_FILE_INPUT; 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool Source::scanInstruction(const struct tgsi_full_instruction *inst) 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Instruction insn(inst); 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn.dstCount()) { 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn.getDst(0).getFile() == TGSI_FILE_OUTPUT) { 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Instruction::DstRegister dst = insn.getDst(0); 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst.isIndirect(0)) 959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (unsigned i = 0; i < info->numOutputs; ++i) 960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->out[i].mask = 0xf; 961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->out[dst.getIndex(0)].mask |= dst.getMask(); 963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (info->out[dst.getIndex(0)].sn == TGSI_SEMANTIC_PSIZE) 965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->out[dst.getIndex(0)].mask &= 1; 966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (isEdgeFlagPassthrough(insn)) 968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->io.edgeFlagIn = insn.getSrc(0).getIndex(0); 969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn.getDst(0).getFile() == TGSI_FILE_TEMPORARY) { 971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn.getDst(0).isIndirect(0)) 972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mainTempsInLMem = TRUE; 973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (unsigned s = 0; s < insn.srcCount(); ++s) { 977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Instruction::SrcRegister src = insn.getSrc(s); 978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (src.getFile() == TGSI_FILE_TEMPORARY) 979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (src.isIndirect(0)) 980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mainTempsInLMem = TRUE; 981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (src.getFile() != TGSI_FILE_INPUT) 982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned mask = insn.srcMask(s); 984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (src.isIndirect(0)) { 986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (unsigned i = 0; i < info->numInputs; ++i) 987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->in[i].mask = 0xf; 988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (unsigned c = 0; c < 4; ++c) { 990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(mask & (1 << c))) 991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int k = src.getSwizzle(c); 993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i = src.getIndex(0); 994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (info->in[i].sn != TGSI_SEMANTIC_FOG || k == TGSI_SWIZZLE_X) 995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (k <= TGSI_SWIZZLE_W) 996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->in[i].mask |= 1 << k; 997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return true; 1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnv50_ir::TexInstruction::Target 1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgInstruction::getTexture(const tgsi::Source *code, int s) const 1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (getSrc(s).getFile()) { 1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_SAMPLER_VIEW: { 1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // XXX: indirect access 1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int r = getSrc(s).getIndex(0); 1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(r < code->samplerViewCount); 1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return translateTexture(code->samplerViewTargets[r]); 1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return translateTexture(insn->Texture.Texture); 1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} // namespace tgsi 1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnamespace { 1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgusing namespace nv50_ir; 1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass Converter : public BuildUtil 1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic: 1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Converter(Program *, const tgsi::Source *); 1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ~Converter(); 1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool run(); 1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprivate: 1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct Subroutine 1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Subroutine(Function *f) : f(f) { } 1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Function *f; 1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ValueMap values; 1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }; 1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Value *getVertexBase(int s); 1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DataArray *getArrayForFile(unsigned file, int idx); 1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Value *fetchSrc(int s, int c); 1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Value *acquireDst(int d, int c); 1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void storeDst(int d, int c, Value *); 1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Value *fetchSrc(const tgsi::Instruction::SrcRegister src, int c, Value *ptr); 1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void storeDst(const tgsi::Instruction::DstRegister dst, int c, 1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Value *val, Value *ptr); 1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Value *applySrcMod(Value *, int s, int c); 1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Symbol *makeSym(uint file, int fileIndex, int idx, int c, uint32_t addr); 1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Symbol *srcToSym(tgsi::Instruction::SrcRegister, int c); 1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Symbol *dstToSym(tgsi::Instruction::DstRegister, int c); 1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool handleInstruction(const struct tgsi_full_instruction *); 1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void exportOutputs(); 1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inline Subroutine *getSubroutine(unsigned ip); 1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inline Subroutine *getSubroutine(Function *); 1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inline bool isEndOfSubroutine(uint ip); 1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void loadProjTexCoords(Value *dst[4], Value *src[4], unsigned int mask); 1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // R,S,L,C,Dx,Dy encode TGSI sources for respective values (0xSf for auto) 1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void setTexRS(TexInstruction *, unsigned int& s, int R, int S); 1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void handleTEX(Value *dst0[4], int R, int S, int L, int C, int Dx, int Dy); 1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void handleTXF(Value *dst0[4], int R); 1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void handleTXQ(Value *dst0[4], enum TexQuery); 1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void handleLIT(Value *dst0[4]); 1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void handleUserClipPlanes(); 1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Value *interpolate(tgsi::Instruction::SrcRegister, int c, Value *ptr); 1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void insertConvergenceOps(BasicBlock *conv, BasicBlock *fork); 1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Value *buildDot(int dim); 1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org class BindArgumentsPass : public Pass { 1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org public: 1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BindArgumentsPass(Converter &conv) : conv(conv) { } 1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org private: 1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Converter &conv; 1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Subroutine *sub; 1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org template<typename T> inline void 1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org updateCallArgs(Instruction *i, void (Instruction::*setArg)(int, Value *), 1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org T (Function::*proto)); 1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org template<typename T> inline void 1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org updatePrototype(BitSet *set, void (Function::*updateSet)(), 1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org T (Function::*proto)); 1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org protected: 1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool visit(Function *); 1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool visit(BasicBlock *bb) { return false; } 1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }; 1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprivate: 1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct tgsi::Source *code; 1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct nv50_ir_prog_info *info; 1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct { 1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org std::map<unsigned, Subroutine> map; 1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Subroutine *cur; 1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } sub; 1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint ip; // instruction pointer 1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi::Instruction tgsi; 1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DataType dstTy; 1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DataType srcTy; 1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DataArray tData; // TGSI_FILE_TEMPORARY 1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DataArray aData; // TGSI_FILE_ADDRESS 1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DataArray pData; // TGSI_FILE_PREDICATE 1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DataArray oData; // TGSI_FILE_OUTPUT (if outputs in registers) 1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org std::vector<DataArray> lData; // TGSI_FILE_TEMPORARY_ARRAY 1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org std::vector<DataArray> iData; // TGSI_FILE_IMMEDIATE_ARRAY 1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Value *zero; 1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Value *fragCoord[4]; 1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Value *clipVtx[4]; 1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Value *vtxBase[5]; // base address of vertex in primitive (for TP/GP) 1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint8_t vtxBaseValid; 1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Stack condBBs; // fork BB, then else clause BB 1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Stack joinBBs; // fork BB, for inserting join ops on ENDIF 1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Stack loopBBs; // loop headers 1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Stack breakBBs; // end of / after loop 1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgSymbol * 1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::srcToSym(tgsi::Instruction::SrcRegister src, int c) 1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int swz = src.getSwizzle(c); 1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return makeSym(src.getFile(), 1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src.is2D() ? src.getIndex(1) : 0, 1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src.isIndirect(0) ? -1 : src.getIndex(0), swz, 1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src.getIndex(0) * 16 + swz * 4); 1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgSymbol * 1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::dstToSym(tgsi::Instruction::DstRegister dst, int c) 1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return makeSym(dst.getFile(), 1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst.is2D() ? dst.getIndex(1) : 0, 1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst.isIndirect(0) ? -1 : dst.getIndex(0), c, 1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst.getIndex(0) * 16 + c * 4); 1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgSymbol * 1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::makeSym(uint tgsiFile, int fileIdx, int idx, int c, uint32_t address) 1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Symbol *sym = new_Symbol(prog, tgsi::translateFile(tgsiFile)); 1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sym->reg.fileIndex = fileIdx; 1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (idx >= 0) { 1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sym->reg.file == FILE_SHADER_INPUT) 1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sym->setOffset(info->in[idx].slot[c] * 4); 1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sym->reg.file == FILE_SHADER_OUTPUT) 1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sym->setOffset(info->out[idx].slot[c] * 4); 1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sym->reg.file == FILE_SYSTEM_VALUE) 1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sym->setSV(tgsi::translateSysVal(info->sv[idx].sn), c); 1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sym->setOffset(address); 1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sym->setOffset(address); 1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return sym; 1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline uint8_t 1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtranslateInterpMode(const struct nv50_ir_varying *var, operation& op) 1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint8_t mode = NV50_IR_INTERP_PERSPECTIVE; 1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (var->flat) 1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mode = NV50_IR_INTERP_FLAT; 1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (var->linear) 1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mode = NV50_IR_INTERP_LINEAR; 1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (var->sc) 1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mode = NV50_IR_INTERP_SC; 1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org op = (mode == NV50_IR_INTERP_PERSPECTIVE || mode == NV50_IR_INTERP_SC) 1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ? OP_PINTERP : OP_LINTERP; 1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (var->centroid) 1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mode |= NV50_IR_INTERP_CENTROID; 1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return mode; 1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgValue * 1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::interpolate(tgsi::Instruction::SrcRegister src, int c, Value *ptr) 1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org operation op; 1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // XXX: no way to know interpolation mode if we don't know what's accessed 1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint8_t mode = translateInterpMode(&info->in[ptr ? 0 : 1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src.getIndex(0)], op); 1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Instruction *insn = new_Instruction(func, op, TYPE_F32); 1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->setDef(0, getScratch()); 1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->setSrc(0, srcToSym(src, c)); 1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (op == OP_PINTERP) 1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->setSrc(1, fragCoord[3]); 1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ptr) 1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->setIndirect(0, 0, ptr); 1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->setInterpolate(mode); 1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bb->insertTail(insn); 1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return insn->getDef(0); 1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgValue * 1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::applySrcMod(Value *val, int s, int c) 1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Modifier m = tgsi.getSrc(s).getMod(c); 1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DataType ty = tgsi.inferSrcType(); 1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (m & Modifier(NV50_IR_MOD_ABS)) 1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val = mkOp1v(OP_ABS, ty, getScratch(), val); 1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (m & Modifier(NV50_IR_MOD_NEG)) 1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val = mkOp1v(OP_NEG, ty, getScratch(), val); 1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return val; 1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgValue * 1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::getVertexBase(int s) 1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(s < 5); 1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(vtxBaseValid & (1 << s))) { 1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int index = tgsi.getSrc(s).getIndex(1); 1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Value *rel = NULL; 1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tgsi.getSrc(s).isIndirect(1)) 1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rel = fetchSrc(tgsi.getSrc(s).getIndirect(1), 0, NULL); 1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtxBaseValid |= 1 << s; 1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtxBase[s] = mkOp2v(OP_PFETCH, TYPE_U32, getSSA(), mkImm(index), rel); 1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return vtxBase[s]; 1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgValue * 1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::fetchSrc(int s, int c) 1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Value *res; 1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Value *ptr = NULL, *dimRel = NULL; 1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi::Instruction::SrcRegister src = tgsi.getSrc(s); 1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (src.isIndirect(0)) 1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ptr = fetchSrc(src.getIndirect(0), 0, NULL); 1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (src.is2D()) { 1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (src.getFile()) { 1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_INPUT: 1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dimRel = getVertexBase(s); 1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_CONSTANT: 1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // on NVC0, this is valid and c{I+J}[k] == cI[(J << 16) + k] 1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (src.isIndirect(1)) 1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dimRel = fetchSrc(src.getIndirect(1), 0, 0); 1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res = fetchSrc(src, c, ptr); 1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dimRel) 1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res->getInsn()->setIndirect(0, 1, dimRel); 1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return applySrcMod(res, s, c); 1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::DataArray * 1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::getArrayForFile(unsigned file, int idx) 1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (file) { 1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_TEMPORARY: 1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return &tData; 1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_PREDICATE: 1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return &pData; 1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_ADDRESS: 1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return &aData; 1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_TEMPORARY_ARRAY: 1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(idx < code->tempArrayCount); 1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return &lData[idx]; 1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_IMMEDIATE_ARRAY: 1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(idx < code->immdArrayCount); 1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return &iData[idx]; 1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_OUTPUT: 1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(prog->getType() == Program::TYPE_FRAGMENT); 1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return &oData; 1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"invalid/unhandled TGSI source file"); 1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgValue * 1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::fetchSrc(tgsi::Instruction::SrcRegister src, int c, Value *ptr) 1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int idx2d = src.is2D() ? src.getIndex(1) : 0; 1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int idx = src.getIndex(0); 1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int swz = src.getSwizzle(c); 1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (src.getFile()) { 1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_IMMEDIATE: 1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!ptr); 1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return loadImm(NULL, info->immd.data[idx * 4 + swz]); 1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_CONSTANT: 1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return mkLoad(TYPE_U32, srcToSym(src, c), ptr); 1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_INPUT: 1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (prog->getType() == Program::TYPE_FRAGMENT) { 1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // don't load masked inputs, won't be assigned a slot 1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ptr && !(info->in[idx].mask & (1 << swz))) 1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return loadImm(NULL, swz == TGSI_SWIZZLE_W ? 1.0f : 0.0f); 1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ptr && info->in[idx].sn == TGSI_SEMANTIC_FACE) 1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return mkOp1v(OP_RDSV, TYPE_F32, getSSA(), mkSysVal(SV_FACE, 0)); 1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return interpolate(src, c, ptr); 1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return mkLoad(TYPE_U32, srcToSym(src, c), ptr); 1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_OUTPUT: 1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"load from output file"); 1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_FILE_SYSTEM_VALUE: 1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!ptr); 1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return mkOp1v(OP_RDSV, TYPE_U32, getSSA(), srcToSym(src, c)); 1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return getArrayForFile(src.getFile(), idx2d)->load( 1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sub.cur->values, idx, swz, ptr); 1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgValue * 1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::acquireDst(int d, int c) 1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const tgsi::Instruction::DstRegister dst = tgsi.getDst(d); 1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned f = dst.getFile(); 1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int idx = dst.getIndex(0); 1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int idx2d = dst.is2D() ? dst.getIndex(1) : 0; 1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst.isMasked(c) || f == TGSI_FILE_RESOURCE) 1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst.isIndirect(0) || 1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org f == TGSI_FILE_TEMPORARY_ARRAY || 1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org f == TGSI_FILE_SYSTEM_VALUE || 1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (f == TGSI_FILE_OUTPUT && prog->getType() != Program::TYPE_FRAGMENT)) 1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return getScratch(); 1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return getArrayForFile(f, idx2d)-> acquire(sub.cur->values, idx, c); 1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::storeDst(int d, int c, Value *val) 1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const tgsi::Instruction::DstRegister dst = tgsi.getDst(d); 1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (tgsi.getSaturate()) { 1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SAT_NONE: 1377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SAT_ZERO_ONE: 1379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp1(OP_SAT, dstTy, val, val); 1380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_SAT_MINUS_PLUS_ONE: 1382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp2(OP_MAX, dstTy, val, val, mkImm(-1.0f)); 1383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp2(OP_MIN, dstTy, val, val, mkImm(+1.0f)); 1384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"invalid saturation mode"); 1387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Value *ptr = dst.isIndirect(0) ? 1391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fetchSrc(dst.getIndirect(0), 0, NULL) : NULL; 1392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (info->io.genUserClip > 0 && 1394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst.getFile() == TGSI_FILE_OUTPUT && 1395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !dst.isIndirect(0) && dst.getIndex(0) == code->clipVertexOutput) { 1396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkMov(clipVtx[c], val); 1397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val = clipVtx[c]; 1398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org storeDst(dst, c, val, ptr); 1401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::storeDst(const tgsi::Instruction::DstRegister dst, int c, 1405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Value *val, Value *ptr) 1406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned f = dst.getFile(); 1408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int idx = dst.getIndex(0); 1409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int idx2d = dst.is2D() ? dst.getIndex(1) : 0; 1410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (f == TGSI_FILE_SYSTEM_VALUE) { 1412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!ptr); 1413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp2(OP_WRSV, TYPE_U32, NULL, dstToSym(dst, c), val); 1414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 1415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (f == TGSI_FILE_OUTPUT && prog->getType() != Program::TYPE_FRAGMENT) { 1416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ptr || (info->out[idx].mask & (1 << c))) 1417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkStore(OP_EXPORT, TYPE_U32, dstToSym(dst, c), ptr, val); 1418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 1419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (f == TGSI_FILE_TEMPORARY || 1420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org f == TGSI_FILE_TEMPORARY_ARRAY || 1421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org f == TGSI_FILE_PREDICATE || 1422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org f == TGSI_FILE_ADDRESS || 1423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org f == TGSI_FILE_OUTPUT) { 1424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org getArrayForFile(f, idx2d)->store(sub.cur->values, idx, c, ptr, val); 1425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"invalid dst file"); 1427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FOR_EACH_DST_ENABLED_CHANNEL(d, chan, inst) \ 1431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (chan = 0; chan < 4; ++chan) \ 1432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!inst.getDst(d).isMasked(chan)) 1433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgValue * 1435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::buildDot(int dim) 1436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dim > 0); 1438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Value *src0 = fetchSrc(0, 0), *src1 = fetchSrc(1, 0); 1440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Value *dotp = getScratch(); 1441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp2(OP_MUL, TYPE_F32, dotp, src0, src1); 1443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (int c = 1; c < dim; ++c) { 1445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = fetchSrc(0, c); 1446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src1 = fetchSrc(1, c); 1447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp3(OP_MAD, TYPE_F32, dotp, src0, src1, dotp); 1448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return dotp; 1450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::insertConvergenceOps(BasicBlock *conv, BasicBlock *fork) 1454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FlowInstruction *join = new_FlowInstruction(func, OP_JOIN, NULL); 1456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org join->fixed = 1; 1457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org conv->insertHead(join); 1458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fork->joinAt = new_FlowInstruction(func, OP_JOINAT, conv); 1460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fork->insertBefore(fork->getExit(), fork->joinAt); 1461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::setTexRS(TexInstruction *tex, unsigned int& s, int R, int S) 1465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned rIdx = 0, sIdx = 0; 1467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (R >= 0) 1469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rIdx = tgsi.getSrc(R).getIndex(0); 1470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (S >= 0) 1471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sIdx = tgsi.getSrc(S).getIndex(0); 1472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex->setTexture(tgsi.getTexture(code, R), rIdx, sIdx); 1474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tgsi.getSrc(R).isIndirect(0)) { 1476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex->tex.rIndirectSrc = s; 1477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex->setSrc(s++, fetchSrc(tgsi.getSrc(R).getIndirect(0), 0, NULL)); 1478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (S >= 0 && tgsi.getSrc(S).isIndirect(0)) { 1480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex->tex.sIndirectSrc = s; 1481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex->setSrc(s++, fetchSrc(tgsi.getSrc(S).getIndirect(0), 0, NULL)); 1482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::handleTXQ(Value *dst0[4], enum TexQuery query) 1487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TexInstruction *tex = new_TexInstruction(func, OP_TXQ); 1489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex->tex.query = query; 1490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int c, d; 1491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (d = 0, c = 0; c < 4; ++c) { 1493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dst0[c]) 1494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 1495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex->tex.mask |= 1 << c; 1496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex->setDef(d++, dst0[c]); 1497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tex->setSrc((c = 0), fetchSrc(0, 0)); // mip level 1499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setTexRS(tex, c, 1, -1); 1501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bb->insertTail(tex); 1503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::loadProjTexCoords(Value *dst[4], Value *src[4], unsigned int mask) 1507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Value *proj = fetchSrc(0, 3); 1509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Instruction *insn = proj->getUniqueInsn(); 1510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int c; 1511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn->op == OP_PINTERP) { 1513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bb->insertTail(insn = cloneForward(func, insn)); 1514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->op = OP_LINTERP; 1515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->setInterpolate(NV50_IR_INTERP_LINEAR | insn->getSampleMode()); 1516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->setSrc(1, NULL); 1517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org proj = insn->getDef(0); 1518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org proj = mkOp1v(OP_RCP, TYPE_F32, getSSA(), proj); 1520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (c = 0; c < 4; ++c) { 1522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(mask & (1 << c))) 1523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 1524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((insn = src[c]->getUniqueInsn())->op != OP_PINTERP) 1525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 1526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask &= ~(1 << c); 1527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bb->insertTail(insn = cloneForward(func, insn)); 1529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->setInterpolate(NV50_IR_INTERP_PERSPECTIVE | insn->getSampleMode()); 1530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->setSrc(1, proj); 1531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[c] = insn->getDef(0); 1532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!mask) 1534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org proj = mkOp1v(OP_RCP, TYPE_F32, getSSA(), fetchSrc(0, 3)); 1537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (c = 0; c < 4; ++c) 1539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask & (1 << c)) 1540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[c] = mkOp2v(OP_MUL, TYPE_F32, getSSA(), src[c], proj); 1541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// order of nv50 ir sources: x y z layer lod/bias shadow 1544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// order of TGSI TEX sources: x y z layer shadow lod/bias 1545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// lowering will finally set the hw specific order (like array first on nvc0) 1546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::handleTEX(Value *dst[4], int R, int S, int L, int C, int Dx, int Dy) 1548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Value *val; 1550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Value *arg[4], *src[8]; 1551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Value *lod = NULL, *shd = NULL; 1552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int s, c, d; 1553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TexInstruction *texi = new_TexInstruction(func, tgsi.getOP()); 1554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TexInstruction::Target tgt = tgsi.getTexture(code, R); 1556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (s = 0; s < tgt.getArgCount(); ++s) 1558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org arg[s] = src[s] = fetchSrc(0, s); 1559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (texi->op == OP_TXL || texi->op == OP_TXB) 1561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lod = fetchSrc(L >> 4, L & 3); 1562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (C == 0x0f) 1564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org C = 0x00 | MAX2(tgt.getArgCount(), 2); // guess DC src 1565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tgt.isShadow()) 1567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shd = fetchSrc(C >> 4, C & 3); 1568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (texi->op == OP_TXD) { 1570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (c = 0; c < tgt.getDim(); ++c) { 1571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texi->dPdx[c].set(fetchSrc(Dx >> 4, (Dx & 3) + c)); 1572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texi->dPdy[c].set(fetchSrc(Dy >> 4, (Dy & 3) + c)); 1573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // cube textures don't care about projection value, it's divided out 1577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tgsi.getOpcode() == TGSI_OPCODE_TXP && !tgt.isCube() && !tgt.isArray()) { 1578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int n = tgt.getDim(); 1579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (shd) { 1580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org arg[n] = shd; 1581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ++n; 1582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(tgt.getDim() == tgt.getArgCount()); 1583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org loadProjTexCoords(src, arg, (1 << n) - 1); 1585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (shd) 1586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org shd = src[n - 1]; 1587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tgt.isCube()) { 1590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (c = 0; c < 3; ++c) 1591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src[c] = mkOp1v(OP_ABS, TYPE_F32, getSSA(), arg[c]); 1592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val = getScratch(); 1593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp2(OP_MAX, TYPE_F32, val, src[0], src[1]); 1594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp2(OP_MAX, TYPE_F32, val, src[2], val); 1595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp1(OP_RCP, TYPE_F32, val, val); 1596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (c = 0; c < 3; ++c) 1597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src[c] = mkOp2v(OP_MUL, TYPE_F32, getSSA(), arg[c], val); 1598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (c = 0, d = 0; c < 4; ++c) { 1601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst[c]) { 1602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texi->setDef(d++, dst[c]); 1603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texi->tex.mask |= 1 << c; 1604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // NOTE: maybe hook up def too, for CSE 1606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (s = 0; s < tgt.getArgCount(); ++s) 1609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texi->setSrc(s, src[s]); 1610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (lod) 1611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texi->setSrc(s++, lod); 1612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (shd) 1613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texi->setSrc(s++, shd); 1614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setTexRS(texi, s, R, S); 1616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tgsi.getOpcode() == TGSI_OPCODE_SAMPLE_C_LZ) 1618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texi->tex.levelZero = true; 1619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bb->insertTail(texi); 1621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// 1st source: xyz = coordinates, w = lod 1624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// 2nd source: offset 1625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::handleTXF(Value *dst[4], int R) 1627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TexInstruction *texi = new_TexInstruction(func, tgsi.getOP()); 1629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int c, d, s; 1630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texi->tex.target = tgsi.getTexture(code, R); 1632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (c = 0, d = 0; c < 4; ++c) { 1634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst[c]) { 1635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texi->setDef(d++, dst[c]); 1636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texi->tex.mask |= 1 << c; 1637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (c = 0; c < texi->tex.target.getArgCount(); ++c) 1640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texi->setSrc(c, fetchSrc(0, c)); 1641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texi->setSrc(c++, fetchSrc(0, 3)); // lod 1642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setTexRS(texi, c, R, -1); 1644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (s = 0; s < tgsi.getNumTexOffsets(); ++s) { 1646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (c = 0; c < 3; ++c) { 1647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texi->tex.offset[s][c] = tgsi.getTexOffset(s).getValueU32(c, info); 1648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (texi->tex.offset[s][c]) 1649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texi->tex.useOffsets = s + 1; 1650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bb->insertTail(texi); 1654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::handleLIT(Value *dst0[4]) 1658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Value *val0 = NULL; 1660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int mask = tgsi.getDst(0).getMask(); 1661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask & (1 << 0)) 1663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org loadImm(dst0[0], 1.0f); 1664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask & (1 << 3)) 1666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org loadImm(dst0[3], 1.0f); 1667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask & (3 << 1)) { 1669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val0 = getScratch(); 1670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp2(OP_MAX, TYPE_F32, val0, fetchSrc(0, 0), zero); 1671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask & (1 << 1)) 1672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkMov(dst0[1], val0); 1673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask & (1 << 2)) { 1676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Value *src1 = fetchSrc(0, 1), *src3 = fetchSrc(0, 3); 1677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Value *val1 = getScratch(), *val3 = getScratch(); 1678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Value *pos128 = loadImm(NULL, +127.999999f); 1680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Value *neg128 = loadImm(NULL, -127.999999f); 1681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp2(OP_MAX, TYPE_F32, val1, src1, zero); 1683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp2(OP_MAX, TYPE_F32, val3, src3, neg128); 1684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp2(OP_MIN, TYPE_F32, val3, val3, pos128); 1685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp2(OP_POW, TYPE_F32, val3, val1, val3); 1686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkCmp(OP_SLCT, CC_GT, TYPE_F32, dst0[2], val3, zero, val0); 1688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::Subroutine * 1692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::getSubroutine(unsigned ip) 1693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org std::map<unsigned, Subroutine>::iterator it = sub.map.find(ip); 1695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (it == sub.map.end()) 1697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org it = sub.map.insert(std::make_pair( 1698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ip, Subroutine(new Function(prog, "SUB", ip)))).first; 1699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return &it->second; 1701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::Subroutine * 1704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::getSubroutine(Function *f) 1705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned ip = f->getLabel(); 1707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org std::map<unsigned, Subroutine>::iterator it = sub.map.find(ip); 1708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (it == sub.map.end()) 1710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org it = sub.map.insert(std::make_pair(ip, Subroutine(f))).first; 1711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return &it->second; 1713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool 1716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::isEndOfSubroutine(uint ip) 1717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(ip < code->scan.num_instructions); 1719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi::Instruction insn(&code->insns[ip]); 1720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (insn.getOpcode() == TGSI_OPCODE_END || 1721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn.getOpcode() == TGSI_OPCODE_ENDSUB || 1722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // does END occur at end of main or the very end ? 1723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn.getOpcode() == TGSI_OPCODE_BGNSUB); 1724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool 1727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::handleInstruction(const struct tgsi_full_instruction *insn) 1728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Value *dst0[4], *rDst0[4]; 1730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Value *src0, *src1, *src2; 1731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Value *val0, *val1; 1732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int c; 1733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi = tgsi::Instruction(insn); 1735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool useScratchDst = tgsi.checkDstSrcAliasing(); 1737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org operation op = tgsi.getOP(); 1739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstTy = tgsi.inferDstType(); 1740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcTy = tgsi.inferSrcType(); 1741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int mask = tgsi.dstCount() ? tgsi.getDst(0).getMask() : 0; 1743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tgsi.dstCount()) { 1745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (c = 0; c < 4; ++c) { 1746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rDst0[c] = acquireDst(0, c); 1747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst0[c] = (useScratchDst && rDst0[c]) ? getScratch() : rDst0[c]; 1748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (tgsi.getOpcode()) { 1752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_ADD: 1753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_UADD: 1754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_AND: 1755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_DIV: 1756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_IDIV: 1757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_UDIV: 1758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_MAX: 1759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_MIN: 1760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_IMAX: 1761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_IMIN: 1762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_UMAX: 1763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_UMIN: 1764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_MOD: 1765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_UMOD: 1766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_MUL: 1767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_UMUL: 1768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_OR: 1769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_POW: 1770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SHL: 1771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_ISHR: 1772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_USHR: 1773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SUB: 1774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_XOR: 1775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) { 1776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = fetchSrc(0, c); 1777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src1 = fetchSrc(1, c); 1778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp2(op, dstTy, dst0[c], src0, src1); 1779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_MAD: 1782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_UMAD: 1783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SAD: 1784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) { 1785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = fetchSrc(0, c); 1786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src1 = fetchSrc(1, c); 1787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src2 = fetchSrc(2, c); 1788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp3(op, dstTy, dst0[c], src0, src1, src2); 1789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_MOV: 1792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_ABS: 1793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_CEIL: 1794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_FLR: 1795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_TRUNC: 1796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_RCP: 1797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_IABS: 1798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_INEG: 1799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_NOT: 1800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_DDX: 1801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_DDY: 1802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) 1803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp1(op, dstTy, dst0[c], fetchSrc(0, c)); 1804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_RSQ: 1806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = fetchSrc(0, 0); 1807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val0 = getScratch(); 1808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp1(OP_ABS, TYPE_F32, val0, src0); 1809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp1(OP_RSQ, TYPE_F32, val0, val0); 1810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) 1811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkMov(dst0[c], val0); 1812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_ARL: 1814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) { 1815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = fetchSrc(0, c); 1816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkCvt(OP_CVT, TYPE_S32, dst0[c], TYPE_F32, src0)->rnd = ROUND_M; 1817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp2(OP_SHL, TYPE_U32, dst0[c], dst0[c], mkImm(4)); 1818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_UARL: 1821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) 1822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp2(OP_SHL, TYPE_U32, dst0[c], fetchSrc(0, c), mkImm(4)); 1823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_EX2: 1825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_LG2: 1826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val0 = mkOp1(op, TYPE_F32, getScratch(), fetchSrc(0, 0))->getDef(0); 1827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) 1828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp1(OP_MOV, TYPE_F32, dst0[c], val0); 1829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_COS: 1831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SIN: 1832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val0 = getScratch(); 1833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask & 7) { 1834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp1(OP_PRESIN, TYPE_F32, val0, fetchSrc(0, 0)); 1835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp1(op, TYPE_F32, val0, val0); 1836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (c = 0; c < 3; ++c) 1837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst0[c]) 1838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkMov(dst0[c], val0); 1839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst0[3]) { 1841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp1(OP_PRESIN, TYPE_F32, val0, fetchSrc(0, 3)); 1842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp1(op, TYPE_F32, dst0[3], val0); 1843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SCS: 1846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask & 3) { 1847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val0 = mkOp1v(OP_PRESIN, TYPE_F32, getSSA(), fetchSrc(0, 0)); 1848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst0[0]) 1849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp1(OP_COS, TYPE_F32, dst0[0], val0); 1850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst0[1]) 1851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp1(OP_SIN, TYPE_F32, dst0[1], val0); 1852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst0[2]) 1854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org loadImm(dst0[2], 0.0f); 1855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst0[3]) 1856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org loadImm(dst0[3], 1.0f); 1857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_EXP: 1859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = fetchSrc(0, 0); 1860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val0 = mkOp1v(OP_FLOOR, TYPE_F32, getSSA(), src0); 1861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst0[1]) 1862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp2(OP_SUB, TYPE_F32, dst0[1], src0, val0); 1863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst0[0]) 1864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp1(OP_EX2, TYPE_F32, dst0[0], val0); 1865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst0[2]) 1866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp1(OP_EX2, TYPE_F32, dst0[2], src0); 1867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst0[3]) 1868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org loadImm(dst0[3], 1.0f); 1869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_LOG: 1871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = mkOp1v(OP_ABS, TYPE_F32, getSSA(), fetchSrc(0, 0)); 1872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val0 = mkOp1v(OP_LG2, TYPE_F32, dst0[2] ? dst0[2] : getSSA(), src0); 1873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst0[0] || dst0[1]) 1874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val1 = mkOp1v(OP_FLOOR, TYPE_F32, dst0[0] ? dst0[0] : getSSA(), val0); 1875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst0[1]) { 1876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp1(OP_EX2, TYPE_F32, dst0[1], val1); 1877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp1(OP_RCP, TYPE_F32, dst0[1], dst0[1]); 1878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp2(OP_MUL, TYPE_F32, dst0[1], dst0[1], src0); 1879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst0[3]) 1881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org loadImm(dst0[3], 1.0f); 1882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_DP2: 1884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val0 = buildDot(2); 1885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) 1886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkMov(dst0[c], val0); 1887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_DP3: 1889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val0 = buildDot(3); 1890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) 1891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkMov(dst0[c], val0); 1892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_DP4: 1894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val0 = buildDot(4); 1895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) 1896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkMov(dst0[c], val0); 1897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_DPH: 1899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val0 = buildDot(3); 1900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src1 = fetchSrc(1, 3); 1901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp2(OP_ADD, TYPE_F32, val0, val0, src1); 1902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) 1903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkMov(dst0[c], val0); 1904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_DST: 1906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst0[0]) 1907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org loadImm(dst0[0], 1.0f); 1908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst0[1]) { 1909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = fetchSrc(0, 1); 1910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src1 = fetchSrc(1, 1); 1911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp2(OP_MUL, TYPE_F32, dst0[1], src0, src1); 1912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst0[2]) 1914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkMov(dst0[2], fetchSrc(0, 2)); 1915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst0[3]) 1916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkMov(dst0[3], fetchSrc(1, 3)); 1917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_LRP: 1919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) { 1920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = fetchSrc(0, c); 1921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src1 = fetchSrc(1, c); 1922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src2 = fetchSrc(2, c); 1923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp3(OP_MAD, TYPE_F32, dst0[c], 1924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp2v(OP_SUB, TYPE_F32, getSSA(), src1, src2), src0, src2); 1925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_LIT: 1928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org handleLIT(dst0); 1929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_XPD: 1931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) { 1932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (c < 3) { 1933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val0 = getSSA(); 1934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = fetchSrc(1, (c + 1) % 3); 1935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src1 = fetchSrc(0, (c + 2) % 3); 1936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp2(OP_MUL, TYPE_F32, val0, src0, src1); 1937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp1(OP_NEG, TYPE_F32, val0, val0); 1938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = fetchSrc(0, (c + 1) % 3); 1940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src1 = fetchSrc(1, (c + 2) % 3); 1941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp3(OP_MAD, TYPE_F32, dst0[c], src0, src1, val0); 1942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org loadImm(dst0[c], 1.0f); 1944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_ISSG: 1948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SSG: 1949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) { 1950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = fetchSrc(0, c); 1951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val0 = getScratch(); 1952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val1 = getScratch(); 1953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkCmp(OP_SET, CC_GT, srcTy, val0, src0, zero); 1954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkCmp(OP_SET, CC_LT, srcTy, val1, src0, zero); 1955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (srcTy == TYPE_F32) 1956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp2(OP_SUB, TYPE_F32, dst0[c], val0, val1); 1957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp2(OP_SUB, TYPE_S32, dst0[c], val1, val0); 1959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_UCMP: 1962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_CMP: 1963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) { 1964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = fetchSrc(0, c); 1965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src1 = fetchSrc(1, c); 1966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src2 = fetchSrc(2, c); 1967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (src1 == src2) 1968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkMov(dst0[c], src1); 1969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkCmp(OP_SLCT, (srcTy == TYPE_F32) ? CC_LT : CC_NE, 1971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcTy, dst0[c], src1, src2, src0); 1972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_FRC: 1975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) { 1976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = fetchSrc(0, c); 1977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val0 = getScratch(); 1978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp1(OP_FLOOR, TYPE_F32, val0, src0); 1979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp2(OP_SUB, TYPE_F32, dst0[c], src0, val0); 1980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_ROUND: 1983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) 1984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkCvt(OP_CVT, TYPE_F32, dst0[c], TYPE_F32, fetchSrc(0, c)) 1985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ->rnd = ROUND_NI; 1986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_CLAMP: 1988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) { 1989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = fetchSrc(0, c); 1990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src1 = fetchSrc(1, c); 1991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src2 = fetchSrc(2, c); 1992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val0 = getScratch(); 1993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp2(OP_MIN, TYPE_F32, val0, src0, src1); 1994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp2(OP_MAX, TYPE_F32, dst0[c], val0, src2); 1995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SLT: 1998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SGE: 1999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SEQ: 2000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SFL: 2001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SGT: 2002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SLE: 2003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SNE: 2004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_STR: 2005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_ISGE: 2006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_ISLT: 2007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_USEQ: 2008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_USGE: 2009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_USLT: 2010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_USNE: 2011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) { 2012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = fetchSrc(0, c); 2013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src1 = fetchSrc(1, c); 2014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkCmp(op, tgsi.getSetCond(), dstTy, dst0[c], src0, src1); 2015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_KIL: 2018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val0 = new_LValue(func, FILE_PREDICATE); 2019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (c = 0; c < 4; ++c) { 2020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkCmp(OP_SET, CC_LT, TYPE_F32, val0, fetchSrc(0, c), zero); 2021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp(OP_DISCARD, TYPE_NONE, NULL)->setPredicate(CC_P, val0); 2022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_KILP: 2025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp(OP_DISCARD, TYPE_NONE, NULL); 2026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_TEX: 2028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_TXB: 2029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_TXL: 2030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_TXP: 2031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // R S L C Dx Dy 2032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org handleTEX(dst0, 1, 1, 0x03, 0x0f, 0x00, 0x00); 2033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_TXD: 2035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org handleTEX(dst0, 3, 3, 0x03, 0x0f, 0x10, 0x20); 2036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SAMPLE: 2038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SAMPLE_B: 2039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SAMPLE_D: 2040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SAMPLE_L: 2041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SAMPLE_C: 2042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SAMPLE_C_LZ: 2043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org handleTEX(dst0, 1, 2, 0x30, 0x31, 0x40, 0x50); 2044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_TXF: 2046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_LOAD: 2047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org handleTXF(dst0, 1); 2048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_TXQ: 2050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SVIEWINFO: 2051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org handleTXQ(dst0, TXQ_DIMS); 2052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_F2I: 2054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_F2U: 2055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) 2056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkCvt(OP_CVT, dstTy, dst0[c], srcTy, fetchSrc(0, c))->rnd = ROUND_Z; 2057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_I2F: 2059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_U2F: 2060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) 2061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkCvt(OP_CVT, dstTy, dst0[c], srcTy, fetchSrc(0, c)); 2062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_EMIT: 2064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_ENDPRIM: 2065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // get vertex stream if specified (must be immediate) 2066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src0 = tgsi.srcCount() ? 2067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkImm(tgsi.getSrc(0).getValueU32(0, info)) : zero; 2068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp1(op, TYPE_U32, NULL, src0)->fixed = 1; 2069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_IF: 2071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 2072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BasicBlock *ifBB = new BasicBlock(func); 2073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bb->cfg.attach(&ifBB->cfg, Graph::Edge::TREE); 2075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org condBBs.push(bb); 2076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org joinBBs.push(bb); 2077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkFlow(OP_BRA, NULL, CC_NOT_P, fetchSrc(0, 0)); 2079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setPosition(ifBB, true); 2081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_ELSE: 2084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 2085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BasicBlock *elseBB = new BasicBlock(func); 2086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BasicBlock *forkBB = reinterpret_cast<BasicBlock *>(condBBs.pop().u.p); 2087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org forkBB->cfg.attach(&elseBB->cfg, Graph::Edge::TREE); 2089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org condBBs.push(bb); 2090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org forkBB->getExit()->asFlow()->target.bb = elseBB; 2092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!bb->isTerminated()) 2093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkFlow(OP_BRA, NULL, CC_ALWAYS, NULL); 2094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setPosition(elseBB, true); 2096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_ENDIF: 2099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 2100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BasicBlock *convBB = new BasicBlock(func); 2101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BasicBlock *prevBB = reinterpret_cast<BasicBlock *>(condBBs.pop().u.p); 2102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BasicBlock *forkBB = reinterpret_cast<BasicBlock *>(joinBBs.pop().u.p); 2103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!bb->isTerminated()) { 2105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // we only want join if none of the clauses ended with CONT/BREAK/RET 2106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (prevBB->getExit()->op == OP_BRA && joinBBs.getSize() < 6) 2107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insertConvergenceOps(convBB, forkBB); 2108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkFlow(OP_BRA, convBB, CC_ALWAYS, NULL); 2109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bb->cfg.attach(&convBB->cfg, Graph::Edge::FORWARD); 2110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (prevBB->getExit()->op == OP_BRA) { 2113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prevBB->cfg.attach(&convBB->cfg, Graph::Edge::FORWARD); 2114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prevBB->getExit()->asFlow()->target.bb = convBB; 2115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setPosition(convBB, true); 2117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_BGNLOOP: 2120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 2121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BasicBlock *lbgnBB = new BasicBlock(func); 2122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BasicBlock *lbrkBB = new BasicBlock(func); 2123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org loopBBs.push(lbgnBB); 2125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org breakBBs.push(lbrkBB); 2126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (loopBBs.getSize() > func->loopNestingBound) 2127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org func->loopNestingBound++; 2128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkFlow(OP_PREBREAK, lbrkBB, CC_ALWAYS, NULL); 2130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bb->cfg.attach(&lbgnBB->cfg, Graph::Edge::TREE); 2132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setPosition(lbgnBB, true); 2133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkFlow(OP_PRECONT, lbgnBB, CC_ALWAYS, NULL); 2134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_ENDLOOP: 2137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 2138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BasicBlock *loopBB = reinterpret_cast<BasicBlock *>(loopBBs.pop().u.p); 2139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!bb->isTerminated()) { 2141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkFlow(OP_CONT, loopBB, CC_ALWAYS, NULL); 2142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bb->cfg.attach(&loopBB->cfg, Graph::Edge::BACK); 2143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setPosition(reinterpret_cast<BasicBlock *>(breakBBs.pop().u.p), true); 2145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_BRK: 2148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 2149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bb->isTerminated()) 2150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BasicBlock *brkBB = reinterpret_cast<BasicBlock *>(breakBBs.peek().u.p); 2152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkFlow(OP_BREAK, brkBB, CC_ALWAYS, NULL); 2153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bb->cfg.attach(&brkBB->cfg, Graph::Edge::CROSS); 2154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_CONT: 2157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 2158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bb->isTerminated()) 2159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BasicBlock *contBB = reinterpret_cast<BasicBlock *>(loopBBs.peek().u.p); 2161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkFlow(OP_CONT, contBB, CC_ALWAYS, NULL); 2162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org contBB->explicitCont = true; 2163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bb->cfg.attach(&contBB->cfg, Graph::Edge::BACK); 2164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_BGNSUB: 2167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 2168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Subroutine *s = getSubroutine(ip); 2169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BasicBlock *entry = new BasicBlock(s->f); 2170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BasicBlock *leave = new BasicBlock(s->f); 2171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // multiple entrypoints possible, keep the graph connected 2173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (prog->getType() == Program::TYPE_COMPUTE) 2174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prog->main->call.attach(&s->f->call, Graph::Edge::TREE); 2175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sub.cur = s; 2177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->f->setEntry(entry); 2178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s->f->setExit(leave); 2179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setPosition(entry, true); 2180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return true; 2181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_ENDSUB: 2183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 2184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sub.cur = getSubroutine(prog->main); 2185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setPosition(BasicBlock::get(sub.cur->f->cfg.getRoot()), true); 2186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return true; 2187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_CAL: 2189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 2190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Subroutine *s = getSubroutine(tgsi.getLabel()); 2191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkFlow(OP_CALL, s->f, CC_ALWAYS, NULL); 2192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org func->call.attach(&s->f->call, Graph::Edge::TREE); 2193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return true; 2194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_RET: 2196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 2197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bb->isTerminated()) 2198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return true; 2199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BasicBlock *leave = BasicBlock::get(func->cfgExit); 2200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!isEndOfSubroutine(ip + 1)) { 2202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // insert a PRERET at the entry if this is an early return 2203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // (only needed for sharing code in the epilogue) 2204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BasicBlock *pos = getBB(); 2205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setPosition(BasicBlock::get(func->cfg.getRoot()), false); 2206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkFlow(OP_PRERET, leave, CC_ALWAYS, NULL)->fixed = 1; 2207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setPosition(pos, true); 2208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkFlow(OP_RET, NULL, CC_ALWAYS, NULL)->fixed = 1; 2210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bb->cfg.attach(&leave->cfg, Graph::Edge::CROSS); 2211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_END: 2214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 2215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // attach and generate epilogue code 2216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BasicBlock *epilogue = BasicBlock::get(func->cfgExit); 2217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bb->cfg.attach(&epilogue->cfg, Graph::Edge::TREE); 2218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setPosition(epilogue, true); 2219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (prog->getType() == Program::TYPE_FRAGMENT) 2220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org exportOutputs(); 2221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (info->io.genUserClip > 0) 2222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org handleUserClipPlanes(); 2223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp(OP_EXIT, TYPE_NONE, NULL)->terminator = 1; 2224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_SWITCH: 2227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TGSI_OPCODE_CASE: 2228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ERROR("switch/case opcode encountered, should have been lowered\n"); 2229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org abort(); 2230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 2232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ERROR("unhandled TGSI opcode: %u\n", tgsi.getOpcode()); 2233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 2234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (tgsi.dstCount()) { 2238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (c = 0; c < 4; ++c) { 2239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!dst0[c]) 2240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 2241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dst0[c] != rDst0[c]) 2242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkMov(rDst0[c], dst0[c]); 2243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org storeDst(0, c, rDst0[c]); 2244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtxBaseValid = 0; 2247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return true; 2249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 2252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::handleUserClipPlanes() 2253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Value *res[8]; 2255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int n, i, c; 2256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (c = 0; c < 4; ++c) { 2258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < info->io.genUserClip; ++i) { 2259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Symbol *sym = mkSymbol(FILE_MEMORY_CONST, info->io.ucpBinding, 2260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TYPE_F32, info->io.ucpBase + i * 16 + c * 4); 2261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Value *ucp = mkLoad(TYPE_F32, sym, NULL); 2262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (c == 0) 2263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res[i] = mkOp2v(OP_MUL, TYPE_F32, getScratch(), clipVtx[c], ucp); 2264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 2265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp3(OP_MAD, TYPE_F32, res[i], clipVtx[c], ucp, res[i]); 2266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int first = info->numOutputs - (info->io.genUserClip + 3) / 4; 2270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < info->io.genUserClip; ++i) { 2272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org n = i / 4 + first; 2273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c = i % 4; 2274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Symbol *sym = 2275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkSymbol(FILE_SHADER_OUTPUT, 0, TYPE_F32, info->out[n].slot[c] * 4); 2276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkStore(OP_EXPORT, TYPE_F32, sym, NULL, res[i]); 2277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 2281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::exportOutputs() 2282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (unsigned int i = 0; i < info->numOutputs; ++i) { 2284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (unsigned int c = 0; c < 4; ++c) { 2285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!oData.exists(sub.cur->values, i, c)) 2286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 2287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Symbol *sym = mkSymbol(FILE_SHADER_OUTPUT, 0, TYPE_F32, 2288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info->out[i].slot[c] * 4); 2289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Value *val = oData.load(sub.cur->values, i, c, NULL); 2290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (val) 2291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkStore(OP_EXPORT, TYPE_F32, sym, NULL, val); 2292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::Converter(Program *ir, const tgsi::Source *code) : BuildUtil(ir), 2297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code(code), 2298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi(NULL), 2299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tData(this), aData(this), pData(this), oData(this) 2300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info = code->info; 2302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const DataFile tFile = code->mainTempsInLMem ? FILE_MEMORY_LOCAL : FILE_GPR; 2304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned tSize = code->fileSize(TGSI_FILE_TEMPORARY); 2306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned pSize = code->fileSize(TGSI_FILE_PREDICATE); 2307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned aSize = code->fileSize(TGSI_FILE_ADDRESS); 2308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned oSize = code->fileSize(TGSI_FILE_OUTPUT); 2309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tData.setup(TGSI_FILE_TEMPORARY, 0, 0, tSize, 4, 4, tFile, 0); 2311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pData.setup(TGSI_FILE_PREDICATE, 0, 0, pSize, 4, 4, FILE_PREDICATE, 0); 2312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org aData.setup(TGSI_FILE_ADDRESS, 0, 0, aSize, 4, 4, FILE_ADDRESS, 0); 2313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org oData.setup(TGSI_FILE_OUTPUT, 0, 0, oSize, 4, 4, FILE_GPR, 0); 2314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (int vol = 0, i = 0; i < code->tempArrayCount; ++i) { 2316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int len = code->tempArrays[i].u32 >> 2; 2317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dim = code->tempArrays[i].u32 & 3; 2318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lData.push_back(DataArray(this)); 2320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lData.back().setup(TGSI_FILE_TEMPORARY_ARRAY, i, vol, len, dim, 4, 2321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FILE_MEMORY_LOCAL, 0); 2322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vol += (len * dim * 4 + 0xf) & ~0xf; 2324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (int vol = 0, i = 0; i < code->immdArrayCount; ++i) { 2327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int len = code->immdArrays[i].u32 >> 2; 2328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int dim = code->immdArrays[i].u32 & 3; 2329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lData.push_back(DataArray(this)); 2331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lData.back().setup(TGSI_FILE_IMMEDIATE_ARRAY, i, vol, len, dim, 4, 2332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FILE_MEMORY_CONST, 14); 2333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vol += (len * dim * 4 + 0xf) & ~0xf; 2335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org zero = mkImm((uint32_t)0); 2338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vtxBaseValid = 0; 2340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::~Converter() 2343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtemplate<typename T> inline void 2347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::BindArgumentsPass::updateCallArgs( 2348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Instruction *i, void (Instruction::*setArg)(int, Value *), 2349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org T (Function::*proto)) 2350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Function *g = i->asFlow()->target.fn; 2352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Subroutine *subg = conv.getSubroutine(g); 2353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (unsigned a = 0; a < (g->*proto).size(); ++a) { 2355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Value *v = (g->*proto)[a].get(); 2356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const Converter::Location &l = subg->values.l.find(v)->second; 2357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Converter::DataArray *array = conv.getArrayForFile(l.array, l.arrayIdx); 2358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (i->*setArg)(a, array->acquire(sub->values, l.i, l.c)); 2360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtemplate<typename T> inline void 2364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::BindArgumentsPass::updatePrototype( 2365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BitSet *set, void (Function::*updateSet)(), T (Function::*proto)) 2366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (func->*updateSet)(); 2368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (unsigned i = 0; i < set->getSize(); ++i) { 2370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Value *v = func->getLValue(i); 2371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // only include values with a matching TGSI register 2373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (set->test(i) && sub->values.l.find(v) != sub->values.l.end()) 2374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (func->*proto).push_back(v); 2375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool 2379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::BindArgumentsPass::visit(Function *f) 2380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sub = conv.getSubroutine(f); 2382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (ArrayList::Iterator bi = f->allBBlocks.iterator(); 2384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !bi.end(); bi.next()) { 2385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (Instruction *i = BasicBlock::get(bi)->getFirst(); 2386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i; i = i->next) { 2387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->op == OP_CALL && !i->asFlow()->builtin) { 2388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org updateCallArgs(i, &Instruction::setSrc, &Function::ins); 2389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org updateCallArgs(i, &Instruction::setDef, &Function::outs); 2390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (func == prog->main && prog->getType() != Program::TYPE_COMPUTE) 2395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return true; 2396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org updatePrototype(&BasicBlock::get(f->cfg.getRoot())->liveSet, 2397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &Function::buildLiveSets, &Function::ins); 2398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org updatePrototype(&BasicBlock::get(f->cfgExit)->defSet, 2399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &Function::buildDefSets, &Function::outs); 2400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return true; 2402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool 2405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::run() 2406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BasicBlock *entry = new BasicBlock(prog->main); 2408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BasicBlock *leave = new BasicBlock(prog->main); 2409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prog->main->setEntry(entry); 2411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prog->main->setExit(leave); 2412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setPosition(entry, true); 2414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sub.cur = getSubroutine(prog->main); 2415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (info->io.genUserClip > 0) { 2417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (int c = 0; c < 4; ++c) 2418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clipVtx[c] = getScratch(); 2419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (prog->getType() == Program::TYPE_FRAGMENT) { 2422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Symbol *sv = mkSysVal(SV_POSITION, 3); 2423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fragCoord[3] = mkOp1v(OP_RDSV, TYPE_F32, getSSA(), sv); 2424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mkOp1(OP_RCP, TYPE_F32, fragCoord[3], fragCoord[3]); 2425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (ip = 0; ip < code->scan.num_instructions; ++ip) { 2428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!handleInstruction(&code->insns[ip])) 2429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 2430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!BindArgumentsPass(*this).run(prog)) 2433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 2434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return true; 2436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} // unnamed namespace 2439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnamespace nv50_ir { 2441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool 2443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgProgram::makeFromTGSI(struct nv50_ir_prog_info *info) 2444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tgsi::Source src(info); 2446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!src.scanSource()) 2447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 2448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tlsSize = info->bin.tlsSpace; 2449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Converter builder(this, &src); 2451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return builder.run(); 2452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} // namespace nv50_ir 2455