1d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller/* 2d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * Copyright 2011 Christoph Bumiller 3d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * 4d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * Permission is hereby granted, free of charge, to any person obtaining a 5d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * copy of this software and associated documentation files (the "Software"), 6d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * to deal in the Software without restriction, including without limitation 7d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * and/or sell copies of the Software, and to permit persons to whom the 9d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * Software is furnished to do so, subject to the following conditions: 10d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * 11d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * The above copyright notice and this permission notice shall be included in 12d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * all copies or substantial portions of the Software. 13d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * 14d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 18d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 19d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * SOFTWARE. 21d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller */ 2257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 2357594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerextern "C" { 2457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#include "tgsi/tgsi_dump.h" 2557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#include "tgsi/tgsi_scan.h" 2657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 2757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 2857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#include "nv50_ir.h" 2957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#include "nv50_ir_util.h" 3057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#include "nv50_ir_build_util.h" 3157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 3257594065c30feec9376be9b2132659f7d87362eeChristoph Bumillernamespace tgsi { 3357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 3457594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerclass Source; 3557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 3657594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerstatic nv50_ir::operation translateOpcode(uint opcode); 3757594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerstatic nv50_ir::DataFile translateFile(uint file); 3857594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerstatic nv50_ir::TexTarget translateTexture(uint texTarg); 3957594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerstatic nv50_ir::SVSemantic translateSysVal(uint sysval); 4057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 4157594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerclass Instruction 4257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 4357594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerpublic: 4457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Instruction(const struct tgsi_full_instruction *inst) : insn(inst) { } 4557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 4657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller class SrcRegister 4757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 4857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller public: 4957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller SrcRegister(const struct tgsi_full_src_register *src) 5057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller : reg(src->Register), 5157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller fsr(src) 5257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { } 5357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 5457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller SrcRegister(const struct tgsi_src_register& src) : reg(src), fsr(NULL) { } 5557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 5657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller struct tgsi_src_register offsetToSrc(struct tgsi_texture_offset off) 5757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 5857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller struct tgsi_src_register reg; 5957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller memset(®, 0, sizeof(reg)); 6057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller reg.Index = off.Index; 6157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller reg.File = off.File; 6257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller reg.SwizzleX = off.SwizzleX; 6357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller reg.SwizzleY = off.SwizzleY; 6457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller reg.SwizzleZ = off.SwizzleZ; 6557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return reg; 6657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 6757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 6857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller SrcRegister(const struct tgsi_texture_offset& off) : 6957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller reg(offsetToSrc(off)), 7057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller fsr(NULL) 7157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { } 7257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 7357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller uint getFile() const { return reg.File; } 7457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 7557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bool is2D() const { return reg.Dimension; } 7657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 7757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bool isIndirect(int dim) const 7857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 7957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return (dim && fsr) ? fsr->Dimension.Indirect : reg.Indirect; 8057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 8157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 8257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller int getIndex(int dim) const 8357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 8457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return (dim && fsr) ? fsr->Dimension.Index : reg.Index; 8557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 8657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 8757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller int getSwizzle(int chan) const 8857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 8957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return tgsi_util_get_src_register_swizzle(®, chan); 9057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 9157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 9257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller nv50_ir::Modifier getMod(int chan) const; 9357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 9457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller SrcRegister getIndirect(int dim) const 9557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 9657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(fsr && isIndirect(dim)); 9757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dim) 9857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return SrcRegister(fsr->DimIndirect); 9957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return SrcRegister(fsr->Indirect); 10057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 10157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 10257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller uint32_t getValueU32(int c, const struct nv50_ir_prog_info *info) const 10357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 10457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(reg.File == TGSI_FILE_IMMEDIATE); 10557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(!reg.Absolute); 10657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(!reg.Negate); 10757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return info->immd.data[reg.Index * 4 + getSwizzle(c)]; 10857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 10957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 11057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller private: 11157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const struct tgsi_src_register reg; 11257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const struct tgsi_full_src_register *fsr; 11357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller }; 11457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 11557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller class DstRegister 11657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 11757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller public: 11857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller DstRegister(const struct tgsi_full_dst_register *dst) 11957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller : reg(dst->Register), 12057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller fdr(dst) 12157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { } 12257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 12357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller DstRegister(const struct tgsi_dst_register& dst) : reg(dst), fdr(NULL) { } 12457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 12557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller uint getFile() const { return reg.File; } 12657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 12757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bool is2D() const { return reg.Dimension; } 12857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 12957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bool isIndirect(int dim) const 13057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 13157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return (dim && fdr) ? fdr->Dimension.Indirect : reg.Indirect; 13257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 13357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 13457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller int getIndex(int dim) const 13557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 13657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return (dim && fdr) ? fdr->Dimension.Dimension : reg.Index; 13757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 13857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 13957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned int getMask() const { return reg.WriteMask; } 14057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 14157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bool isMasked(int chan) const { return !(getMask() & (1 << chan)); } 14257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 14357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller SrcRegister getIndirect(int dim) const 14457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 14557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(fdr && isIndirect(dim)); 14657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dim) 14757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return SrcRegister(fdr->DimIndirect); 14857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return SrcRegister(fdr->Indirect); 14957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 15057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 15157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller private: 15257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const struct tgsi_dst_register reg; 15357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const struct tgsi_full_dst_register *fdr; 15457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller }; 15557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 15657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller inline uint getOpcode() const { return insn->Instruction.Opcode; } 15757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 15857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned int srcCount() const { return insn->Instruction.NumSrcRegs; } 15957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned int dstCount() const { return insn->Instruction.NumDstRegs; } 16057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 16157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller // mask of used components of source s 16257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned int srcMask(unsigned int s) const; 16357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 16457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller SrcRegister getSrc(unsigned int s) const 16557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 16657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(s < srcCount()); 16757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return SrcRegister(&insn->Src[s]); 16857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 16957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 17057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller DstRegister getDst(unsigned int d) const 17157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 17257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(d < dstCount()); 17357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return DstRegister(&insn->Dst[d]); 17457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 17557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 17657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller SrcRegister getTexOffset(unsigned int i) const 17757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 17857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(i < TGSI_FULL_MAX_TEX_OFFSETS); 17957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return SrcRegister(insn->TexOffsets[i]); 18057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 18157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 18257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned int getNumTexOffsets() const { return insn->Texture.NumOffsets; } 18357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 18457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bool checkDstSrcAliasing() const; 18557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 18657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller inline nv50_ir::operation getOP() const { 18757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return translateOpcode(getOpcode()); } 18857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 18957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller nv50_ir::DataType inferSrcType() const; 19057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller nv50_ir::DataType inferDstType() const; 19157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 19257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller nv50_ir::CondCode getSetCond() const; 19357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 19457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller nv50_ir::TexInstruction::Target getTexture(const Source *, int s) const; 19557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 19657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller inline uint getLabel() { return insn->Label.Label; } 19757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 19857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned getSaturate() const { return insn->Instruction.Saturate; } 19957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 20057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void print() const 20157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 20257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tgsi_dump_instruction(insn, 1); 20357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 20457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 20557594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerprivate: 20657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const struct tgsi_full_instruction *insn; 20757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}; 20857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 20957594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerunsigned int Instruction::srcMask(unsigned int s) const 21057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 21157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned int mask = insn->Dst[0].Register.WriteMask; 21257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 21357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (insn->Instruction.Opcode) { 21457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_COS: 21557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SIN: 21657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return (mask & 0x8) | ((mask & 0x7) ? 0x1 : 0x0); 217c51f8e2790e9f1aed51133ca0e33dac236fba4a0Christoph Bumiller case TGSI_OPCODE_DP2: 218c51f8e2790e9f1aed51133ca0e33dac236fba4a0Christoph Bumiller return 0x3; 21957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_DP3: 22057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return 0x7; 22157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_DP4: 22257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_DPH: 22357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_KIL: /* WriteMask ignored */ 22457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return 0xf; 22557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_DST: 22657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return mask & (s ? 0xa : 0x6); 22757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_EX2: 22857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_EXP: 22957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_LG2: 23057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_LOG: 23157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_POW: 23257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_RCP: 23357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_RSQ: 23457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SCS: 23557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return 0x1; 23657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_IF: 23757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return 0x1; 23857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_LIT: 23957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return 0xb; 24057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_TEX: 24157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_TXB: 24257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_TXD: 24357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_TXL: 24457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_TXP: 24557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 24657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const struct tgsi_instruction_texture *tex = &insn->Texture; 24757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 24857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(insn->Instruction.Texture); 24957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 25057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mask = 0x7; 25157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (insn->Instruction.Opcode != TGSI_OPCODE_TEX && 25257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller insn->Instruction.Opcode != TGSI_OPCODE_TXD) 25357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mask |= 0x8; /* bias, lod or proj */ 25457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 25557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (tex->Texture) { 25657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_TEXTURE_1D: 25757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mask &= 0x9; 25857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 25957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_TEXTURE_SHADOW1D: 26049150fd43c4f6dacb2b2f1df9c3b7a38f57a4b95Christoph Bumiller mask &= 0xd; 26157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 26257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_TEXTURE_1D_ARRAY: 26357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_TEXTURE_2D: 26457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_TEXTURE_RECT: 26557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mask &= 0xb; 26657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 26757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 26857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 26957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 27057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 27157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return mask; 27257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_XPD: 27357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 27457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned int x = 0; 27557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (mask & 1) x |= 0x6; 27657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (mask & 2) x |= 0x5; 27757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (mask & 4) x |= 0x3; 27857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return x; 27957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 28057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 28157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 28257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 28357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 28457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return mask; 28557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 28657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 28757594065c30feec9376be9b2132659f7d87362eeChristoph Bumillernv50_ir::Modifier Instruction::SrcRegister::getMod(int chan) const 28857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 28957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller nv50_ir::Modifier m(0); 29057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 29157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (reg.Absolute) 29257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller m = m | nv50_ir::Modifier(NV50_IR_MOD_ABS); 29357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (reg.Negate) 29457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller m = m | nv50_ir::Modifier(NV50_IR_MOD_NEG); 29557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return m; 29657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 29757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 29857594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerstatic nv50_ir::DataFile translateFile(uint file) 29957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 30057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (file) { 30157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_CONSTANT: return nv50_ir::FILE_MEMORY_CONST; 30257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_INPUT: return nv50_ir::FILE_SHADER_INPUT; 30357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_OUTPUT: return nv50_ir::FILE_SHADER_OUTPUT; 30457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_TEMPORARY: return nv50_ir::FILE_GPR; 30557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_ADDRESS: return nv50_ir::FILE_ADDRESS; 30657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_PREDICATE: return nv50_ir::FILE_PREDICATE; 30757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_IMMEDIATE: return nv50_ir::FILE_IMMEDIATE; 30857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_SYSTEM_VALUE: return nv50_ir::FILE_SYSTEM_VALUE; 30957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_IMMEDIATE_ARRAY: return nv50_ir::FILE_IMMEDIATE; 31057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_TEMPORARY_ARRAY: return nv50_ir::FILE_MEMORY_LOCAL; 31157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_RESOURCE: return nv50_ir::FILE_MEMORY_GLOBAL; 31257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_SAMPLER: 31357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_NULL: 31457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 31557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return nv50_ir::FILE_NULL; 31657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 31757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 31857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 31957594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerstatic nv50_ir::SVSemantic translateSysVal(uint sysval) 32057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 32157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (sysval) { 32257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_SEMANTIC_FACE: return nv50_ir::SV_FACE; 32357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_SEMANTIC_PSIZE: return nv50_ir::SV_POINT_SIZE; 32457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_SEMANTIC_PRIMID: return nv50_ir::SV_PRIMITIVE_ID; 32557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_SEMANTIC_INSTANCEID: return nv50_ir::SV_INSTANCE_ID; 3267fd802b96cd916e5cadf7eda7329105169dd29bbChristoph Bumiller case TGSI_SEMANTIC_VERTEXID: return nv50_ir::SV_VERTEX_ID; 32757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 32857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(0); 32957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return nv50_ir::SV_CLOCK; 33057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 33157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 33257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 33357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#define NV50_IR_TEX_TARG_CASE(a, b) \ 33457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_TEXTURE_##a: return nv50_ir::TEX_TARGET_##b; 33557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 33657594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerstatic nv50_ir::TexTarget translateTexture(uint tex) 33757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 33857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (tex) { 33957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_TEX_TARG_CASE(1D, 1D); 34057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_TEX_TARG_CASE(2D, 2D); 34157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_TEX_TARG_CASE(3D, 3D); 34257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_TEX_TARG_CASE(CUBE, CUBE); 34357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_TEX_TARG_CASE(RECT, RECT); 34457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_TEX_TARG_CASE(1D_ARRAY, 1D_ARRAY); 34557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_TEX_TARG_CASE(2D_ARRAY, 2D_ARRAY); 34657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_TEX_TARG_CASE(SHADOW1D, 1D_SHADOW); 34757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_TEX_TARG_CASE(SHADOW2D, 2D_SHADOW); 34857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_TEX_TARG_CASE(SHADOW1D_ARRAY, 1D_ARRAY_SHADOW); 34957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_TEX_TARG_CASE(SHADOW2D_ARRAY, 2D_ARRAY_SHADOW); 3509d503992d7309a49df0b0a4887b999e2d6b291c0Christoph Bumiller NV50_IR_TEX_TARG_CASE(SHADOWCUBE, CUBE_SHADOW); 35157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_TEX_TARG_CASE(SHADOWRECT, RECT_SHADOW); 35296956dc5076fc03b9290368ca90e3f3b870ee613José Fonseca NV50_IR_TEX_TARG_CASE(BUFFER, BUFFER); 353223831ca146bc3aca615542794a7c3800ccbcc6fJosé Fonseca 354223831ca146bc3aca615542794a7c3800ccbcc6fJosé Fonseca case TGSI_TEXTURE_UNKNOWN: 35557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 35657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(!"invalid texture target"); 35757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return nv50_ir::TEX_TARGET_2D; 35857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 35957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 36057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 36157594065c30feec9376be9b2132659f7d87362eeChristoph Bumillernv50_ir::DataType Instruction::inferSrcType() const 36257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 36357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (getOpcode()) { 36457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_AND: 36557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_OR: 36657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_XOR: 367cd6d63fa60b7a5d7b81ebc51fa560bcc5b701c73Christoph Bumiller case TGSI_OPCODE_NOT: 36857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_U2F: 36957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_UADD: 37057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_UDIV: 37157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_UMOD: 37257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_UMAD: 37357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_UMUL: 37457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_UMAX: 37557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_UMIN: 37657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_USEQ: 37757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_USGE: 37857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_USLT: 37957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_USNE: 38057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_USHR: 38157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_UCMP: 38257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return nv50_ir::TYPE_U32; 38357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_I2F: 38457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_IDIV: 38557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_IMAX: 38657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_IMIN: 387be1ae976a41de2803f14341580c3c98c58a80fe3Christoph Bumiller case TGSI_OPCODE_IABS: 38857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_INEG: 38957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_ISGE: 39057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_ISHR: 39157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_ISLT: 392b424bf69dfd78c64e065b8ba59d9b40a8f4fecd6Christoph Bumiller case TGSI_OPCODE_ISSG: 39357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SAD: // not sure about SAD, but no one has a float version 39457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_MOD: 39557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_UARL: 39657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return nv50_ir::TYPE_S32; 39757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 39857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return nv50_ir::TYPE_F32; 39957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 40057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 40157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 40257594065c30feec9376be9b2132659f7d87362eeChristoph Bumillernv50_ir::DataType Instruction::inferDstType() const 40357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 40457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (getOpcode()) { 40557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_F2U: return nv50_ir::TYPE_U32; 40657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_F2I: return nv50_ir::TYPE_S32; 40757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_I2F: 40857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_U2F: 40957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return nv50_ir::TYPE_F32; 41057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 41157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return inferSrcType(); 41257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 41357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 41457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 41557594065c30feec9376be9b2132659f7d87362eeChristoph Bumillernv50_ir::CondCode Instruction::getSetCond() const 41657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 41757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller using namespace nv50_ir; 41857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 41957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (getOpcode()) { 42057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SLT: 42157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_ISLT: 42257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_USLT: 42357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return CC_LT; 42457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SLE: 42557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return CC_LE; 42657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SGE: 42757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_ISGE: 42857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_USGE: 42957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return CC_GE; 43057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SGT: 43157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return CC_GT; 43257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SEQ: 43357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_USEQ: 43457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return CC_EQ; 43557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SNE: 436ca03372657f73a30b7b2f827d6f76473e57487eeChristoph Bumiller return CC_NEU; 43757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_USNE: 43857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return CC_NE; 43957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SFL: 44057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return CC_NEVER; 44157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_STR: 44257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 44357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return CC_ALWAYS; 44457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 44557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 44657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 44757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#define NV50_IR_OPCODE_CASE(a, b) case TGSI_OPCODE_##a: return nv50_ir::OP_##b 44857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 44957594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerstatic nv50_ir::operation translateOpcode(uint opcode) 45057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 45157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (opcode) { 45257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(ARL, SHL); 45357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(MOV, MOV); 45457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 45557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(RCP, RCP); 45657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(RSQ, RSQ); 45757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 45857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(MUL, MUL); 45957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(ADD, ADD); 46057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 46157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(MIN, MIN); 46257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(MAX, MAX); 46357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(SLT, SET); 46457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(SGE, SET); 46557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(MAD, MAD); 46657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(SUB, SUB); 46757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 46857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(FLR, FLOOR); 46957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(ROUND, CVT); 47057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(EX2, EX2); 47157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(LG2, LG2); 47257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(POW, POW); 47357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 47457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(ABS, ABS); 47557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 47657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(COS, COS); 47757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(DDX, DFDX); 47857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(DDY, DFDY); 47957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(KILP, DISCARD); 48057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 48157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(SEQ, SET); 48257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(SFL, SET); 48357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(SGT, SET); 48457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(SIN, SIN); 48557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(SLE, SET); 48657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(SNE, SET); 48757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(STR, SET); 48857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(TEX, TEX); 48957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(TXD, TXD); 49057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(TXP, TEX); 49157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 49257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(BRA, BRA); 49357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(CAL, CALL); 49457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(RET, RET); 49557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(CMP, SLCT); 49657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 49757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(TXB, TXB); 49857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 49957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(DIV, DIV); 50057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 50157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(TXL, TXL); 50257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 50357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(CEIL, CEIL); 50457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(I2F, CVT); 50557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(NOT, NOT); 50657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(TRUNC, TRUNC); 50757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(SHL, SHL); 50857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 50957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(AND, AND); 51057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(OR, OR); 51157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(MOD, MOD); 51257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(XOR, XOR); 51357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(SAD, SAD); 51457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(TXF, TXF); 51557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(TXQ, TXQ); 51657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 51757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(EMIT, EMIT); 51857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(ENDPRIM, RESTART); 51957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 52057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(KIL, DISCARD); 52157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 52257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(F2I, CVT); 52357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(IDIV, DIV); 52457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(IMAX, MAX); 52557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(IMIN, MIN); 526be1ae976a41de2803f14341580c3c98c58a80fe3Christoph Bumiller NV50_IR_OPCODE_CASE(IABS, ABS); 52757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(INEG, NEG); 52857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(ISGE, SET); 52957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(ISHR, SHR); 53057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(ISLT, SET); 53157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(F2U, CVT); 53257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(U2F, CVT); 53357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(UADD, ADD); 53457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(UDIV, DIV); 53557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(UMAD, MAD); 53657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(UMAX, MAX); 53757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(UMIN, MIN); 53857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(UMOD, MOD); 53957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(UMUL, MUL); 54057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(USEQ, SET); 54157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(USGE, SET); 54257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(USHR, SHR); 54357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(USLT, SET); 54457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(USNE, SET); 54557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 54657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(LOAD, TXF); 54757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(SAMPLE, TEX); 54857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(SAMPLE_B, TXB); 54957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(SAMPLE_C, TEX); 55057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(SAMPLE_C_LZ, TEX); 55157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(SAMPLE_D, TXD); 55257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(SAMPLE_L, TXL); 55357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(GATHER4, TXG); 554a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez NV50_IR_OPCODE_CASE(SVIEWINFO, TXQ); 55557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 55657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(END, EXIT); 55757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 55857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 55957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return nv50_ir::OP_NOP; 56057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 56157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 56257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 56357594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerbool Instruction::checkDstSrcAliasing() const 56457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 56557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (insn->Dst[0].Register.Indirect) // no danger if indirect, using memory 56657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return false; 56757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 56857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (int s = 0; s < TGSI_FULL_MAX_SRC_REGISTERS; ++s) { 56957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (insn->Src[s].Register.File == TGSI_FILE_NULL) 57057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 57157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (insn->Src[s].Register.File == insn->Dst[0].Register.File && 57257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller insn->Src[s].Register.Index == insn->Dst[0].Register.Index) 57357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return true; 57457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 57557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return false; 57657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 57757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 57857594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerclass Source 57957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 58057594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerpublic: 58157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Source(struct nv50_ir_prog_info *); 58257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller ~Source(); 58357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 58457594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerpublic: 58557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bool scanSource(); 58657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned fileSize(unsigned file) const { return scan.file_max[file] + 1; } 58757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 58857594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerpublic: 58957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller struct tgsi_shader_info scan; 59057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller struct tgsi_full_instruction *insns; 59157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const struct tgsi_token *tokens; 59257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller struct nv50_ir_prog_info *info; 59357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 59457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller nv50_ir::DynArray tempArrays; 59557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller nv50_ir::DynArray immdArrays; 59657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller int tempArrayCount; 59757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller int immdArrayCount; 59857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 59957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bool mainTempsInLMem; 60057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 601b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller int clipVertexOutput; 602b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller 603a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez uint8_t *samplerViewTargets; // TGSI_TEXTURE_* 604a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez unsigned samplerViewCount; 60557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 60657594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerprivate: 60757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller int inferSysValDirection(unsigned sn) const; 60857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bool scanDeclaration(const struct tgsi_full_declaration *); 60957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bool scanInstruction(const struct tgsi_full_instruction *); 61057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void scanProperty(const struct tgsi_full_property *); 61157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void scanImmediate(const struct tgsi_full_immediate *); 61257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 61357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller inline bool isEdgeFlagPassthrough(const Instruction&) const; 61457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}; 61557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 61657594065c30feec9376be9b2132659f7d87362eeChristoph BumillerSource::Source(struct nv50_ir_prog_info *prog) : info(prog) 61757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 61857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tokens = (const struct tgsi_token *)info->bin.source; 61957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 62057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (prog->dbgFlags & NV50_IR_DEBUG_BASIC) 62157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tgsi_dump(tokens, 0); 62257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 623a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez samplerViewTargets = NULL; 62457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 62557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mainTempsInLMem = FALSE; 62657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 62757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 62857594065c30feec9376be9b2132659f7d87362eeChristoph BumillerSource::~Source() 62957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 63057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (insns) 63157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FREE(insns); 63257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 63357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (info->immd.data) 63457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FREE(info->immd.data); 63557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (info->immd.type) 63657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FREE(info->immd.type); 63757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 638a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez if (samplerViewTargets) 639a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez delete[] samplerViewTargets; 64057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 64157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 64257594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerbool Source::scanSource() 64357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 64457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned insnCount = 0; 64557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller struct tgsi_parse_context parse; 64657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 64757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tgsi_scan_shader(tokens, &scan); 64857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 64957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller insns = (struct tgsi_full_instruction *)MALLOC(scan.num_instructions * 65057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller sizeof(insns[0])); 65157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!insns) 65257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return false; 65357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 654b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller clipVertexOutput = -1; 655b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller 656a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez samplerViewCount = scan.file_max[TGSI_FILE_SAMPLER_VIEW] + 1; 657a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez samplerViewTargets = new uint8_t[samplerViewCount]; 65857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 65957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->immd.bufSize = 0; 66057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tempArrayCount = 0; 66157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller immdArrayCount = 0; 66257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 66357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->numInputs = scan.file_max[TGSI_FILE_INPUT] + 1; 66457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->numOutputs = scan.file_max[TGSI_FILE_OUTPUT] + 1; 66557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->numSysVals = scan.file_max[TGSI_FILE_SYSTEM_VALUE] + 1; 66657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 66757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (info->type == PIPE_SHADER_FRAGMENT) { 66857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->prop.fp.writesDepth = scan.writes_z; 66957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->prop.fp.usesDiscard = scan.uses_kill; 67057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else 67157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (info->type == PIPE_SHADER_GEOMETRY) { 67257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->prop.gp.instanceCount = 1; // default value 67357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 67457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 67557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->immd.data = (uint32_t *)MALLOC(scan.immediate_count * 16); 67657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->immd.type = (ubyte *)MALLOC(scan.immediate_count * sizeof(ubyte)); 67757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 67857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tgsi_parse_init(&parse, tokens); 67957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller while (!tgsi_parse_end_of_tokens(&parse)) { 68057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tgsi_parse_token(&parse); 68157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 68257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (parse.FullToken.Token.Type) { 68357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_TOKEN_TYPE_IMMEDIATE: 68457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller scanImmediate(&parse.FullToken.FullImmediate); 68557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 68657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_TOKEN_TYPE_DECLARATION: 68757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller scanDeclaration(&parse.FullToken.FullDeclaration); 68857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 68957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_TOKEN_TYPE_INSTRUCTION: 69057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller insns[insnCount++] = parse.FullToken.FullInstruction; 6919bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez scanInstruction(&parse.FullToken.FullInstruction); 69257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 69357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_TOKEN_TYPE_PROPERTY: 69457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller scanProperty(&parse.FullToken.FullProperty); 69557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 69657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 69757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller INFO("unknown TGSI token type: %d\n", parse.FullToken.Token.Type); 69857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 69957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 70057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 70157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tgsi_parse_free(&parse); 70257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 70357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (mainTempsInLMem) 70457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->bin.tlsSpace += (scan.file_max[TGSI_FILE_TEMPORARY] + 1) * 16; 70557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 706ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller if (info->io.genUserClip > 0) { 707b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller info->io.clipDistanceMask = (1 << info->io.genUserClip) - 1; 708b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller 709ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller for (unsigned int n = 0; n < ((info->io.genUserClip + 3) / 4); ++n) { 710ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller unsigned int i = info->numOutputs++; 711ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller info->out[i].id = i; 712ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller info->out[i].sn = TGSI_SEMANTIC_CLIPDIST; 713ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller info->out[i].si = n; 714ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller info->out[i].mask = info->io.clipDistanceMask >> (n * 4); 715ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller } 716ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller } 717ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller 71857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return info->assignSlots(info) == 0; 71957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 72057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 72157594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid Source::scanProperty(const struct tgsi_full_property *prop) 72257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 72357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (prop->Property.PropertyName) { 72457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_PROPERTY_GS_OUTPUT_PRIM: 72557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->prop.gp.outputPrim = prop->u[0].Data; 72657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 72757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_PROPERTY_GS_INPUT_PRIM: 72857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->prop.gp.inputPrim = prop->u[0].Data; 72957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 73057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_PROPERTY_GS_MAX_OUTPUT_VERTICES: 73157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->prop.gp.maxVertices = prop->u[0].Data; 73257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 73357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#if 0 73457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_PROPERTY_GS_INSTANCE_COUNT: 73557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->prop.gp.instanceCount = prop->u[0].Data; 73657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 73757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#endif 73857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS: 73957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->prop.fp.separateFragData = TRUE; 74057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 74157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_PROPERTY_FS_COORD_ORIGIN: 74257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_PROPERTY_FS_COORD_PIXEL_CENTER: 74357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller // we don't care 74457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 745b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller case TGSI_PROPERTY_VS_PROHIBIT_UCPS: 746b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller info->io.genUserClip = -1; 747b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller break; 74857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 74957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller INFO("unhandled TGSI property %d\n", prop->Property.PropertyName); 75057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 75157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 75257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 75357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 75457594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid Source::scanImmediate(const struct tgsi_full_immediate *imm) 75557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 75657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const unsigned n = info->immd.count++; 75757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 75857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(n < scan.immediate_count); 75957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 76057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (int c = 0; c < 4; ++c) 76157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->immd.data[n * 4 + c] = imm->u[c].Uint; 76257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 76357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->immd.type[n] = imm->Immediate.DataType; 76457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 76557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 76657594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerint Source::inferSysValDirection(unsigned sn) const 76757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 76857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (sn) { 76957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_SEMANTIC_INSTANCEID: 7707fd802b96cd916e5cadf7eda7329105169dd29bbChristoph Bumiller case TGSI_SEMANTIC_VERTEXID: 77157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return 1; 77257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#if 0 77357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_SEMANTIC_LAYER: 77457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_SEMANTIC_VIEWPORTINDEX: 77557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return 0; 77657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#endif 77757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_SEMANTIC_PRIMID: 77857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return (info->type == PIPE_SHADER_FRAGMENT) ? 1 : 0; 77957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 78057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return 0; 78157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 78257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 78357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 78457594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerbool Source::scanDeclaration(const struct tgsi_full_declaration *decl) 78557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 78657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned i; 78757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned sn = TGSI_SEMANTIC_GENERIC; 78857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned si = 0; 78957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const unsigned first = decl->Range.First, last = decl->Range.Last; 79057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 79157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (decl->Declaration.Semantic) { 79257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller sn = decl->Semantic.Name; 79357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller si = decl->Semantic.Index; 79457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 79557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 79657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (decl->Declaration.File) { 79757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_INPUT: 79857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (info->type == PIPE_SHADER_VERTEX) { 79957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller // all vertex attributes are equal 80057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (i = first; i <= last; ++i) { 80157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->in[i].sn = TGSI_SEMANTIC_GENERIC; 80257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->in[i].si = i; 80357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 80457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else { 80557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (i = first; i <= last; ++i, ++si) { 80657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->in[i].id = i; 80757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->in[i].sn = sn; 80857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->in[i].si = si; 80957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (info->type == PIPE_SHADER_FRAGMENT) { 81057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller // translate interpolation mode 8111279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez switch (decl->Interp.Interpolate) { 81257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_INTERPOLATE_CONSTANT: 81357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->in[i].flat = 1; 81457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 815af0ce1dba8219ff8628f1fa61cf93c11a77dab94Christoph Bumiller case TGSI_INTERPOLATE_COLOR: 816af0ce1dba8219ff8628f1fa61cf93c11a77dab94Christoph Bumiller info->in[i].sc = 1; 817af0ce1dba8219ff8628f1fa61cf93c11a77dab94Christoph Bumiller break; 81857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_INTERPOLATE_LINEAR: 819af0ce1dba8219ff8628f1fa61cf93c11a77dab94Christoph Bumiller info->in[i].linear = 1; 82057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 82157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 82257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 82357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 8241279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez if (decl->Interp.Centroid) 82557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->in[i].centroid = 1; 82657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 82757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 82857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 82957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 83057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_OUTPUT: 83157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (i = first; i <= last; ++i, ++si) { 83257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (sn) { 83357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_SEMANTIC_POSITION: 83457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (info->type == PIPE_SHADER_FRAGMENT) 83557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->io.fragDepth = i; 836b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller else 837b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller if (clipVertexOutput < 0) 838b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller clipVertexOutput = i; 83957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 84057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_SEMANTIC_COLOR: 84157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (info->type == PIPE_SHADER_FRAGMENT) 84257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->prop.fp.numColourResults++; 84357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 84457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_SEMANTIC_EDGEFLAG: 84557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->io.edgeFlagOut = i; 84657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 847b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller case TGSI_SEMANTIC_CLIPVERTEX: 848b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller clipVertexOutput = i; 849b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller break; 850b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller case TGSI_SEMANTIC_CLIPDIST: 851b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller info->io.clipDistanceMask |= 852b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller decl->Declaration.UsageMask << (si * 4); 853b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller info->io.genUserClip = -1; 854b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller break; 85557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 85657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 85757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 85857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->out[i].id = i; 85957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->out[i].sn = sn; 86057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->out[i].si = si; 86157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 86257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 86357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_SYSTEM_VALUE: 8647b6881932a71b36dd47f63200c9dbee8e2b9af4fChristoph Bumiller switch (sn) { 8650bbf1659df3adf51784bcb376e681c05f49b6070Christoph Bumiller case TGSI_SEMANTIC_INSTANCEID: 8660bbf1659df3adf51784bcb376e681c05f49b6070Christoph Bumiller info->io.instanceId = first; 8670bbf1659df3adf51784bcb376e681c05f49b6070Christoph Bumiller break; 8687b6881932a71b36dd47f63200c9dbee8e2b9af4fChristoph Bumiller case TGSI_SEMANTIC_VERTEXID: 8697b6881932a71b36dd47f63200c9dbee8e2b9af4fChristoph Bumiller info->io.vertexId = first; 8707b6881932a71b36dd47f63200c9dbee8e2b9af4fChristoph Bumiller break; 8717b6881932a71b36dd47f63200c9dbee8e2b9af4fChristoph Bumiller default: 8727b6881932a71b36dd47f63200c9dbee8e2b9af4fChristoph Bumiller break; 8737b6881932a71b36dd47f63200c9dbee8e2b9af4fChristoph Bumiller } 87457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (i = first; i <= last; ++i, ++si) { 87557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->sv[i].sn = sn; 87657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->sv[i].si = si; 87757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->sv[i].input = inferSysValDirection(sn); 87857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 87957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 880a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez case TGSI_FILE_SAMPLER_VIEW: 88157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (i = first; i <= last; ++i) 882a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez samplerViewTargets[i] = decl->SamplerView.Resource; 88357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 88457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_IMMEDIATE_ARRAY: 88557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 88657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (decl->Dim.Index2D >= immdArrayCount) 88757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller immdArrayCount = decl->Dim.Index2D + 1; 88857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller immdArrays[decl->Dim.Index2D].u32 = (last + 1) << 2; 88957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller int c; 89057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller uint32_t base, count; 89157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (decl->Declaration.UsageMask) { 89257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case 0x1: c = 1; break; 89357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case 0x3: c = 2; break; 89457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 89557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller c = 4; 89657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 89757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 89857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller immdArrays[decl->Dim.Index2D].u32 |= c; 89957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller count = (last + 1) * c; 90057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller base = info->immd.bufSize / 4; 90157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->immd.bufSize = (info->immd.bufSize + count * 4 + 0xf) & ~0xf; 90257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->immd.buf = (uint32_t *)REALLOC(info->immd.buf, base * 4, 90357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->immd.bufSize); 90457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller // NOTE: this assumes array declarations are ordered by Dim.Index2D 90557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (i = 0; i < count; ++i) 90657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->immd.buf[base + i] = decl->ImmediateData.u[i].Uint; 90757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 90857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 90957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_TEMPORARY_ARRAY: 91057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 91157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (decl->Dim.Index2D >= tempArrayCount) 91257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tempArrayCount = decl->Dim.Index2D + 1; 91357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tempArrays[decl->Dim.Index2D].u32 = (last + 1) << 2; 91457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller int c; 91557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller uint32_t count; 91657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (decl->Declaration.UsageMask) { 91757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case 0x1: c = 1; break; 91857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case 0x3: c = 2; break; 91957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 92057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller c = 4; 92157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 92257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 92357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tempArrays[decl->Dim.Index2D].u32 |= c; 92457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller count = (last + 1) * c; 92557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->bin.tlsSpace += (info->bin.tlsSpace + count * 4 + 0xf) & ~0xf; 92657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 92757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 92857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_NULL: 92957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_TEMPORARY: 93057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_ADDRESS: 93157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_CONSTANT: 93257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_IMMEDIATE: 93357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_PREDICATE: 93457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_SAMPLER: 93557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 93657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 93757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller ERROR("unhandled TGSI_FILE %d\n", decl->Declaration.File); 93857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return false; 93957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 94057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return true; 94157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 94257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 94357594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerinline bool Source::isEdgeFlagPassthrough(const Instruction& insn) const 94457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 94557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return insn.getOpcode() == TGSI_OPCODE_MOV && 94657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller insn.getDst(0).getIndex(0) == info->io.edgeFlagOut && 94757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller insn.getSrc(0).getFile() == TGSI_FILE_INPUT; 94857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 94957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 95057594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerbool Source::scanInstruction(const struct tgsi_full_instruction *inst) 95157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 95257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Instruction insn(inst); 95357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 95457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (insn.dstCount()) { 95557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (insn.getDst(0).getFile() == TGSI_FILE_OUTPUT) { 95657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Instruction::DstRegister dst = insn.getDst(0); 95757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 95857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst.isIndirect(0)) 95957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (unsigned i = 0; i < info->numOutputs; ++i) 96057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->out[i].mask = 0xf; 96157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller else 96257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->out[dst.getIndex(0)].mask |= dst.getMask(); 96357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 96499319328d4c249090d3e4a387f6bdc00f711b688Christoph Bumiller if (info->out[dst.getIndex(0)].sn == TGSI_SEMANTIC_PSIZE) 96599319328d4c249090d3e4a387f6bdc00f711b688Christoph Bumiller info->out[dst.getIndex(0)].mask &= 1; 96699319328d4c249090d3e4a387f6bdc00f711b688Christoph Bumiller 96757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (isEdgeFlagPassthrough(insn)) 96857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->io.edgeFlagIn = insn.getSrc(0).getIndex(0); 96957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else 97057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (insn.getDst(0).getFile() == TGSI_FILE_TEMPORARY) { 97157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (insn.getDst(0).isIndirect(0)) 97257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mainTempsInLMem = TRUE; 97357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 97457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 97557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 97657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (unsigned s = 0; s < insn.srcCount(); ++s) { 97757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Instruction::SrcRegister src = insn.getSrc(s); 97857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (src.getFile() == TGSI_FILE_TEMPORARY) 97957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (src.isIndirect(0)) 98057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mainTempsInLMem = TRUE; 98157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (src.getFile() != TGSI_FILE_INPUT) 98257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller continue; 98357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned mask = insn.srcMask(s); 98457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 98557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (src.isIndirect(0)) { 98657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (unsigned i = 0; i < info->numInputs; ++i) 98757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->in[i].mask = 0xf; 98857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else { 98957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (unsigned c = 0; c < 4; ++c) { 99057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!(mask & (1 << c))) 99157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller continue; 99257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller int k = src.getSwizzle(c); 99357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller int i = src.getIndex(0); 99457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (info->in[i].sn != TGSI_SEMANTIC_FOG || k == TGSI_SWIZZLE_X) 99557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (k <= TGSI_SWIZZLE_W) 99657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->in[i].mask |= 1 << k; 99757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 99857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 99957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 100057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return true; 100157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 100257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 100357594065c30feec9376be9b2132659f7d87362eeChristoph Bumillernv50_ir::TexInstruction::Target 100457594065c30feec9376be9b2132659f7d87362eeChristoph BumillerInstruction::getTexture(const tgsi::Source *code, int s) const 100557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 1006a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez switch (getSrc(s).getFile()) { 1007a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez case TGSI_FILE_SAMPLER_VIEW: { 100857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller // XXX: indirect access 100957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned int r = getSrc(s).getIndex(0); 1010a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez assert(r < code->samplerViewCount); 1011a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez return translateTexture(code->samplerViewTargets[r]); 1012a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez } 1013a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez default: 1014a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez return translateTexture(insn->Texture.Texture); 101557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 101657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 101757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 101857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} // namespace tgsi 101957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 102057594065c30feec9376be9b2132659f7d87362eeChristoph Bumillernamespace { 102157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 102257594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerusing namespace nv50_ir; 102357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 102457594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerclass Converter : public BuildUtil 102557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 102657594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerpublic: 102757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Converter(Program *, const tgsi::Source *); 102857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller ~Converter(); 102957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 103057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bool run(); 103157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 103257594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerprivate: 10339bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez struct Subroutine 10349bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez { 10359bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez Subroutine(Function *f) : f(f) { } 10369bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez Function *f; 10379bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez ValueMap values; 10389bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez }; 10399bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez 104057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *getVertexBase(int s); 104156d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez DataArray *getArrayForFile(unsigned file, int idx); 104257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *fetchSrc(int s, int c); 104357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *acquireDst(int d, int c); 104457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void storeDst(int d, int c, Value *); 104557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 104657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *fetchSrc(const tgsi::Instruction::SrcRegister src, int c, Value *ptr); 104757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void storeDst(const tgsi::Instruction::DstRegister dst, int c, 104857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *val, Value *ptr); 104957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 105057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *applySrcMod(Value *, int s, int c); 105157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 105257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Symbol *makeSym(uint file, int fileIndex, int idx, int c, uint32_t addr); 105357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Symbol *srcToSym(tgsi::Instruction::SrcRegister, int c); 105457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Symbol *dstToSym(tgsi::Instruction::DstRegister, int c); 105557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 105657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bool handleInstruction(const struct tgsi_full_instruction *); 105757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void exportOutputs(); 10589bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez inline Subroutine *getSubroutine(unsigned ip); 10599bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez inline Subroutine *getSubroutine(Function *); 106057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller inline bool isEndOfSubroutine(uint ip); 106157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 106257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void loadProjTexCoords(Value *dst[4], Value *src[4], unsigned int mask); 106357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 106457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller // R,S,L,C,Dx,Dy encode TGSI sources for respective values (0xSf for auto) 106557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void setTexRS(TexInstruction *, unsigned int& s, int R, int S); 106657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void handleTEX(Value *dst0[4], int R, int S, int L, int C, int Dx, int Dy); 106757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void handleTXF(Value *dst0[4], int R); 106857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void handleTXQ(Value *dst0[4], enum TexQuery); 106957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void handleLIT(Value *dst0[4]); 107057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void handleUserClipPlanes(); 107157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 107257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *interpolate(tgsi::Instruction::SrcRegister, int c, Value *ptr); 107357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 107457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void insertConvergenceOps(BasicBlock *conv, BasicBlock *fork); 107557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 107657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *buildDot(int dim); 107757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 1078a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez class BindArgumentsPass : public Pass { 1079a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez public: 1080a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez BindArgumentsPass(Converter &conv) : conv(conv) { } 1081a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez 1082a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez private: 1083a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez Converter &conv; 1084a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez Subroutine *sub; 1085a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez 1086a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez template<typename T> inline void 1087a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez updateCallArgs(Instruction *i, void (Instruction::*setArg)(int, Value *), 1088a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez T (Function::*proto)); 1089a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez 1090a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez template<typename T> inline void 1091a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez updatePrototype(BitSet *set, void (Function::*updateSet)(), 1092a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez T (Function::*proto)); 1093a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez 1094a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez protected: 1095a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez bool visit(Function *); 1096a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez bool visit(BasicBlock *bb) { return false; } 1097a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez }; 1098a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez 109957594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerprivate: 110057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const struct tgsi::Source *code; 110157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const struct nv50_ir_prog_info *info; 110257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 11039bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez struct { 11049bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez std::map<unsigned, Subroutine> map; 11059bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez Subroutine *cur; 11069bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez } sub; 11079bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez 110857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller uint ip; // instruction pointer 110957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 111057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tgsi::Instruction tgsi; 111157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 111257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller DataType dstTy; 111357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller DataType srcTy; 111457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 111557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller DataArray tData; // TGSI_FILE_TEMPORARY 111657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller DataArray aData; // TGSI_FILE_ADDRESS 111757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller DataArray pData; // TGSI_FILE_PREDICATE 111857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller DataArray oData; // TGSI_FILE_OUTPUT (if outputs in registers) 111956d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez std::vector<DataArray> lData; // TGSI_FILE_TEMPORARY_ARRAY 112056d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez std::vector<DataArray> iData; // TGSI_FILE_IMMEDIATE_ARRAY 112156d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez 112257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *zero; 112357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *fragCoord[4]; 112457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *clipVtx[4]; 112557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 112657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *vtxBase[5]; // base address of vertex in primitive (for TP/GP) 112757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller uint8_t vtxBaseValid; 112857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 112957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Stack condBBs; // fork BB, then else clause BB 113057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Stack joinBBs; // fork BB, for inserting join ops on ENDIF 113157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Stack loopBBs; // loop headers 113257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Stack breakBBs; // end of / after loop 113357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}; 113457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 113557594065c30feec9376be9b2132659f7d87362eeChristoph BumillerSymbol * 113657594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::srcToSym(tgsi::Instruction::SrcRegister src, int c) 113757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 113857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const int swz = src.getSwizzle(c); 113957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 114057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return makeSym(src.getFile(), 114157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src.is2D() ? src.getIndex(1) : 0, 114257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src.isIndirect(0) ? -1 : src.getIndex(0), swz, 114357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src.getIndex(0) * 16 + swz * 4); 114457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 114557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 114657594065c30feec9376be9b2132659f7d87362eeChristoph BumillerSymbol * 114757594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::dstToSym(tgsi::Instruction::DstRegister dst, int c) 114857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 114957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return makeSym(dst.getFile(), 115057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller dst.is2D() ? dst.getIndex(1) : 0, 115157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller dst.isIndirect(0) ? -1 : dst.getIndex(0), c, 115257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller dst.getIndex(0) * 16 + c * 4); 115357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 115457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 115557594065c30feec9376be9b2132659f7d87362eeChristoph BumillerSymbol * 115657594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::makeSym(uint tgsiFile, int fileIdx, int idx, int c, uint32_t address) 115757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 115857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Symbol *sym = new_Symbol(prog, tgsi::translateFile(tgsiFile)); 115957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 116057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller sym->reg.fileIndex = fileIdx; 116157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 116257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (idx >= 0) { 116357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (sym->reg.file == FILE_SHADER_INPUT) 116457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller sym->setOffset(info->in[idx].slot[c] * 4); 116557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller else 116657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (sym->reg.file == FILE_SHADER_OUTPUT) 116757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller sym->setOffset(info->out[idx].slot[c] * 4); 116857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller else 116957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (sym->reg.file == FILE_SYSTEM_VALUE) 117057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller sym->setSV(tgsi::translateSysVal(info->sv[idx].sn), c); 117157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller else 117257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller sym->setOffset(address); 117357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else { 117457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller sym->setOffset(address); 117557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 117657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return sym; 117757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 117857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 117957594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerstatic inline uint8_t 118057594065c30feec9376be9b2132659f7d87362eeChristoph BumillertranslateInterpMode(const struct nv50_ir_varying *var, operation& op) 118157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 1182af0ce1dba8219ff8628f1fa61cf93c11a77dab94Christoph Bumiller uint8_t mode = NV50_IR_INTERP_PERSPECTIVE; 118357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 118457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (var->flat) 118557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mode = NV50_IR_INTERP_FLAT; 118657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller else 118757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (var->linear) 118857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mode = NV50_IR_INTERP_LINEAR; 118957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller else 1190af0ce1dba8219ff8628f1fa61cf93c11a77dab94Christoph Bumiller if (var->sc) 1191af0ce1dba8219ff8628f1fa61cf93c11a77dab94Christoph Bumiller mode = NV50_IR_INTERP_SC; 119257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 1193af0ce1dba8219ff8628f1fa61cf93c11a77dab94Christoph Bumiller op = (mode == NV50_IR_INTERP_PERSPECTIVE || mode == NV50_IR_INTERP_SC) 1194af0ce1dba8219ff8628f1fa61cf93c11a77dab94Christoph Bumiller ? OP_PINTERP : OP_LINTERP; 119557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 119657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (var->centroid) 119757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mode |= NV50_IR_INTERP_CENTROID; 119857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 119957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return mode; 120057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 120157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 120257594065c30feec9376be9b2132659f7d87362eeChristoph BumillerValue * 120357594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::interpolate(tgsi::Instruction::SrcRegister src, int c, Value *ptr) 120457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 120557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller operation op; 120657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 120757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller // XXX: no way to know interpolation mode if we don't know what's accessed 120857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const uint8_t mode = translateInterpMode(&info->in[ptr ? 0 : 120957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src.getIndex(0)], op); 121057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 121157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Instruction *insn = new_Instruction(func, op, TYPE_F32); 121257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 121357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller insn->setDef(0, getScratch()); 121457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller insn->setSrc(0, srcToSym(src, c)); 121557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (op == OP_PINTERP) 121657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller insn->setSrc(1, fragCoord[3]); 121757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (ptr) 121857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller insn->setIndirect(0, 0, ptr); 121957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 122057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller insn->setInterpolate(mode); 122157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 122257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bb->insertTail(insn); 122357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return insn->getDef(0); 122457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 122557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 122657594065c30feec9376be9b2132659f7d87362eeChristoph BumillerValue * 122757594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::applySrcMod(Value *val, int s, int c) 122857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 122957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Modifier m = tgsi.getSrc(s).getMod(c); 123057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller DataType ty = tgsi.inferSrcType(); 123157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 123257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (m & Modifier(NV50_IR_MOD_ABS)) 123357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val = mkOp1v(OP_ABS, ty, getScratch(), val); 123457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 123557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (m & Modifier(NV50_IR_MOD_NEG)) 123657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val = mkOp1v(OP_NEG, ty, getScratch(), val); 123757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 123857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return val; 123957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 124057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 124157594065c30feec9376be9b2132659f7d87362eeChristoph BumillerValue * 124257594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::getVertexBase(int s) 124357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 124457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(s < 5); 124557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!(vtxBaseValid & (1 << s))) { 124657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const int index = tgsi.getSrc(s).getIndex(1); 124757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *rel = NULL; 124857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (tgsi.getSrc(s).isIndirect(1)) 124957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller rel = fetchSrc(tgsi.getSrc(s).getIndirect(1), 0, NULL); 125057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller vtxBaseValid |= 1 << s; 125157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller vtxBase[s] = mkOp2v(OP_PFETCH, TYPE_U32, getSSA(), mkImm(index), rel); 125257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 125357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return vtxBase[s]; 125457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 125557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 125657594065c30feec9376be9b2132659f7d87362eeChristoph BumillerValue * 125757594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::fetchSrc(int s, int c) 125857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 125957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *res; 126057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *ptr = NULL, *dimRel = NULL; 126157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 126257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tgsi::Instruction::SrcRegister src = tgsi.getSrc(s); 126357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 126457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (src.isIndirect(0)) 126557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller ptr = fetchSrc(src.getIndirect(0), 0, NULL); 126657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 126757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (src.is2D()) { 126857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (src.getFile()) { 126957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_INPUT: 127057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller dimRel = getVertexBase(s); 127157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 127257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_CONSTANT: 127357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller // on NVC0, this is valid and c{I+J}[k] == cI[(J << 16) + k] 127457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (src.isIndirect(1)) 127557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller dimRel = fetchSrc(src.getIndirect(1), 0, 0); 127657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 127757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 127857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 127957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 128057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 128157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 128257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller res = fetchSrc(src, c, ptr); 128357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 128457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dimRel) 128557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller res->getInsn()->setIndirect(0, 1, dimRel); 128657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 128757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return applySrcMod(res, s, c); 128857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 128957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 129056d40aa51b34b77791cc3a49d7e86473a7459b72Francisco JerezConverter::DataArray * 129156d40aa51b34b77791cc3a49d7e86473a7459b72Francisco JerezConverter::getArrayForFile(unsigned file, int idx) 129257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 129356d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez switch (file) { 129457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_TEMPORARY: 129556d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez return &tData; 129657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_PREDICATE: 129756d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez return &pData; 129857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_ADDRESS: 129956d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez return &aData; 130057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_TEMPORARY_ARRAY: 130156d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez assert(idx < code->tempArrayCount); 130256d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez return &lData[idx]; 130357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_IMMEDIATE_ARRAY: 130456d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez assert(idx < code->immdArrayCount); 130556d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez return &iData[idx]; 130656d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez case TGSI_FILE_OUTPUT: 130756d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez assert(prog->getType() == Program::TYPE_FRAGMENT); 130856d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez return &oData; 130956d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez default: 131056d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez assert(!"invalid/unhandled TGSI source file"); 131156d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez return NULL; 131256d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez } 131356d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez} 131457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 131556d40aa51b34b77791cc3a49d7e86473a7459b72Francisco JerezValue * 131656d40aa51b34b77791cc3a49d7e86473a7459b72Francisco JerezConverter::fetchSrc(tgsi::Instruction::SrcRegister src, int c, Value *ptr) 131756d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez{ 131856d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez const int idx2d = src.is2D() ? src.getIndex(1) : 0; 131956d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez const int idx = src.getIndex(0); 132056d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez const int swz = src.getSwizzle(c); 132156d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez 132256d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez switch (src.getFile()) { 132357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_IMMEDIATE: 132457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(!ptr); 132557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return loadImm(NULL, info->immd.data[idx * 4 + swz]); 132657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_CONSTANT: 132757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return mkLoad(TYPE_U32, srcToSym(src, c), ptr); 132857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_INPUT: 132957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (prog->getType() == Program::TYPE_FRAGMENT) { 133057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller // don't load masked inputs, won't be assigned a slot 133157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!ptr && !(info->in[idx].mask & (1 << swz))) 133257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return loadImm(NULL, swz == TGSI_SWIZZLE_W ? 1.0f : 0.0f); 133352c8c52b222e1fdb4c1f4ca3dedde9cd7b9c321fChristoph Bumiller if (!ptr && info->in[idx].sn == TGSI_SEMANTIC_FACE) 133452c8c52b222e1fdb4c1f4ca3dedde9cd7b9c321fChristoph Bumiller return mkOp1v(OP_RDSV, TYPE_F32, getSSA(), mkSysVal(SV_FACE, 0)); 133557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return interpolate(src, c, ptr); 133657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 133757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return mkLoad(TYPE_U32, srcToSym(src, c), ptr); 133856d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez case TGSI_FILE_OUTPUT: 133956d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez assert(!"load from output file"); 134056d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez return NULL; 134157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_SYSTEM_VALUE: 134257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(!ptr); 134357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return mkOp1v(OP_RDSV, TYPE_U32, getSSA(), srcToSym(src, c)); 134457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 13459bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez return getArrayForFile(src.getFile(), idx2d)->load( 13469bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez sub.cur->values, idx, swz, ptr); 134757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 134857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 134957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 135057594065c30feec9376be9b2132659f7d87362eeChristoph BumillerValue * 135157594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::acquireDst(int d, int c) 135257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 135357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const tgsi::Instruction::DstRegister dst = tgsi.getDst(d); 135456d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez const unsigned f = dst.getFile(); 135557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const int idx = dst.getIndex(0); 135656d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez const int idx2d = dst.is2D() ? dst.getIndex(1) : 0; 135757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 135856d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez if (dst.isMasked(c) || f == TGSI_FILE_RESOURCE) 135956d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez return NULL; 136057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 136156d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez if (dst.isIndirect(0) || 136256d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez f == TGSI_FILE_TEMPORARY_ARRAY || 136356d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez f == TGSI_FILE_SYSTEM_VALUE || 136456d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez (f == TGSI_FILE_OUTPUT && prog->getType() != Program::TYPE_FRAGMENT)) 136557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return getScratch(); 136657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 13679bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez return getArrayForFile(f, idx2d)-> acquire(sub.cur->values, idx, c); 136857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 136957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 137057594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 137157594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::storeDst(int d, int c, Value *val) 137257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 137357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const tgsi::Instruction::DstRegister dst = tgsi.getDst(d); 137457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 137557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (tgsi.getSaturate()) { 137657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_SAT_NONE: 137757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 137857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_SAT_ZERO_ONE: 137957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(OP_SAT, dstTy, val, val); 138057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 138157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_SAT_MINUS_PLUS_ONE: 138257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_MAX, dstTy, val, val, mkImm(-1.0f)); 138357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_MIN, dstTy, val, val, mkImm(+1.0f)); 138457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 138557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 138657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(!"invalid saturation mode"); 138757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 138857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 138957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 139057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *ptr = dst.isIndirect(0) ? 139157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller fetchSrc(dst.getIndirect(0), 0, NULL) : NULL; 139257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 1393b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller if (info->io.genUserClip > 0 && 139457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller dst.getFile() == TGSI_FILE_OUTPUT && 1395b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller !dst.isIndirect(0) && dst.getIndex(0) == code->clipVertexOutput) { 139657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkMov(clipVtx[c], val); 139757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val = clipVtx[c]; 139857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 139957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 140057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller storeDst(dst, c, val, ptr); 140157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 140257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 140357594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 140457594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::storeDst(const tgsi::Instruction::DstRegister dst, int c, 140557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *val, Value *ptr) 140657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 140756d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez const unsigned f = dst.getFile(); 140857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const int idx = dst.getIndex(0); 140956d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez const int idx2d = dst.is2D() ? dst.getIndex(1) : 0; 141057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 141156d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez if (f == TGSI_FILE_SYSTEM_VALUE) { 141257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(!ptr); 141357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_WRSV, TYPE_U32, NULL, dstToSym(dst, c), val); 141456d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez } else 141556d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez if (f == TGSI_FILE_OUTPUT && prog->getType() != Program::TYPE_FRAGMENT) { 141699319328d4c249090d3e4a387f6bdc00f711b688Christoph Bumiller if (ptr || (info->out[idx].mask & (1 << c))) 141799319328d4c249090d3e4a387f6bdc00f711b688Christoph Bumiller mkStore(OP_EXPORT, TYPE_U32, dstToSym(dst, c), ptr, val); 141856d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez } else 141956d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez if (f == TGSI_FILE_TEMPORARY || 142056d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez f == TGSI_FILE_TEMPORARY_ARRAY || 142156d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez f == TGSI_FILE_PREDICATE || 142256d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez f == TGSI_FILE_ADDRESS || 142356d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez f == TGSI_FILE_OUTPUT) { 14249bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez getArrayForFile(f, idx2d)->store(sub.cur->values, idx, c, ptr, val); 142556d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez } else { 142657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(!"invalid dst file"); 142757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 142857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 142957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 143057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#define FOR_EACH_DST_ENABLED_CHANNEL(d, chan, inst) \ 143157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (chan = 0; chan < 4; ++chan) \ 143257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!inst.getDst(d).isMasked(chan)) 143357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 143457594065c30feec9376be9b2132659f7d87362eeChristoph BumillerValue * 143557594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::buildDot(int dim) 143657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 143757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(dim > 0); 143857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 143957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *src0 = fetchSrc(0, 0), *src1 = fetchSrc(1, 0); 144057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *dotp = getScratch(); 144157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 144257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_MUL, TYPE_F32, dotp, src0, src1); 144357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 144457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (int c = 1; c < dim; ++c) { 144557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src0 = fetchSrc(0, c); 144657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src1 = fetchSrc(1, c); 144757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp3(OP_MAD, TYPE_F32, dotp, src0, src1, dotp); 144857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 144957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return dotp; 145057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 145157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 145257594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 145357594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::insertConvergenceOps(BasicBlock *conv, BasicBlock *fork) 145457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 145557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FlowInstruction *join = new_FlowInstruction(func, OP_JOIN, NULL); 145657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller join->fixed = 1; 145757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller conv->insertHead(join); 145857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 145957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller fork->joinAt = new_FlowInstruction(func, OP_JOINAT, conv); 146057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller fork->insertBefore(fork->getExit(), fork->joinAt); 146157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 146257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 146357594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 146457594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::setTexRS(TexInstruction *tex, unsigned int& s, int R, int S) 146557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 146657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned rIdx = 0, sIdx = 0; 146757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 146857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (R >= 0) 146957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller rIdx = tgsi.getSrc(R).getIndex(0); 147057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (S >= 0) 147157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller sIdx = tgsi.getSrc(S).getIndex(0); 147257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 147357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tex->setTexture(tgsi.getTexture(code, R), rIdx, sIdx); 147457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 147557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (tgsi.getSrc(R).isIndirect(0)) { 147657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tex->tex.rIndirectSrc = s; 147757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tex->setSrc(s++, fetchSrc(tgsi.getSrc(R).getIndirect(0), 0, NULL)); 147857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 147957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (S >= 0 && tgsi.getSrc(S).isIndirect(0)) { 148057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tex->tex.sIndirectSrc = s; 148157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tex->setSrc(s++, fetchSrc(tgsi.getSrc(S).getIndirect(0), 0, NULL)); 148257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 148357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 148457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 148557594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 148657594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::handleTXQ(Value *dst0[4], enum TexQuery query) 148757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 148857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller TexInstruction *tex = new_TexInstruction(func, OP_TXQ); 148957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tex->tex.query = query; 149057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned int c, d; 149157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 149257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (d = 0, c = 0; c < 4; ++c) { 149357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!dst0[c]) 149457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller continue; 149557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tex->tex.mask |= 1 << c; 149657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tex->setDef(d++, dst0[c]); 149757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 149857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tex->setSrc((c = 0), fetchSrc(0, 0)); // mip level 149957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 150057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller setTexRS(tex, c, 1, -1); 150157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 150257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bb->insertTail(tex); 150357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 150457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 150557594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 150657594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::loadProjTexCoords(Value *dst[4], Value *src[4], unsigned int mask) 150757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 150857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *proj = fetchSrc(0, 3); 150957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Instruction *insn = proj->getUniqueInsn(); 151057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller int c; 151157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 151257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (insn->op == OP_PINTERP) { 1513a05e6a3fa28168d58a13cfb07f7a664e84b925aeFrancisco Jerez bb->insertTail(insn = cloneForward(func, insn)); 151457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller insn->op = OP_LINTERP; 151557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller insn->setInterpolate(NV50_IR_INTERP_LINEAR | insn->getSampleMode()); 151657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller insn->setSrc(1, NULL); 151757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller proj = insn->getDef(0); 151857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 151957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller proj = mkOp1v(OP_RCP, TYPE_F32, getSSA(), proj); 152057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 152157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (c = 0; c < 4; ++c) { 152257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!(mask & (1 << c))) 152357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller continue; 152457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if ((insn = src[c]->getUniqueInsn())->op != OP_PINTERP) 152557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller continue; 152657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mask &= ~(1 << c); 152757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 1528a05e6a3fa28168d58a13cfb07f7a664e84b925aeFrancisco Jerez bb->insertTail(insn = cloneForward(func, insn)); 152957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller insn->setInterpolate(NV50_IR_INTERP_PERSPECTIVE | insn->getSampleMode()); 153057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller insn->setSrc(1, proj); 153157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller dst[c] = insn->getDef(0); 153257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 153357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!mask) 153457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return; 153557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 153657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller proj = mkOp1v(OP_RCP, TYPE_F32, getSSA(), fetchSrc(0, 3)); 153757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 153857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (c = 0; c < 4; ++c) 153957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (mask & (1 << c)) 154057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller dst[c] = mkOp2v(OP_MUL, TYPE_F32, getSSA(), src[c], proj); 154157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 154257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 154357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller// order of nv50 ir sources: x y z layer lod/bias shadow 154457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller// order of TGSI TEX sources: x y z layer shadow lod/bias 154557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller// lowering will finally set the hw specific order (like array first on nvc0) 154657594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 154757594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::handleTEX(Value *dst[4], int R, int S, int L, int C, int Dx, int Dy) 154857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 154957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *val; 155057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *arg[4], *src[8]; 155157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *lod = NULL, *shd = NULL; 155257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned int s, c, d; 155357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller TexInstruction *texi = new_TexInstruction(func, tgsi.getOP()); 155457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 155557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller TexInstruction::Target tgt = tgsi.getTexture(code, R); 155657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 155757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (s = 0; s < tgt.getArgCount(); ++s) 155857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller arg[s] = src[s] = fetchSrc(0, s); 155957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 156057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (texi->op == OP_TXL || texi->op == OP_TXB) 156157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller lod = fetchSrc(L >> 4, L & 3); 156257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 156357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (C == 0x0f) 156457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller C = 0x00 | MAX2(tgt.getArgCount(), 2); // guess DC src 156557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 156657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (tgt.isShadow()) 156757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller shd = fetchSrc(C >> 4, C & 3); 156857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 156957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (texi->op == OP_TXD) { 157057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (c = 0; c < tgt.getDim(); ++c) { 15719362d4bc0a03860ec386156cf499e855a9c2d2a5Christoph Bumiller texi->dPdx[c].set(fetchSrc(Dx >> 4, (Dx & 3) + c)); 15729362d4bc0a03860ec386156cf499e855a9c2d2a5Christoph Bumiller texi->dPdy[c].set(fetchSrc(Dy >> 4, (Dy & 3) + c)); 157357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 157457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 157557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 157657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller // cube textures don't care about projection value, it's divided out 157757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (tgsi.getOpcode() == TGSI_OPCODE_TXP && !tgt.isCube() && !tgt.isArray()) { 157857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned int n = tgt.getDim(); 157957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (shd) { 158057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller arg[n] = shd; 158157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller ++n; 158257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(tgt.getDim() == tgt.getArgCount()); 158357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 158457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller loadProjTexCoords(src, arg, (1 << n) - 1); 158557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (shd) 158657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller shd = src[n - 1]; 158757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 158857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 158957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (tgt.isCube()) { 159057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (c = 0; c < 3; ++c) 159157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src[c] = mkOp1v(OP_ABS, TYPE_F32, getSSA(), arg[c]); 159257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val = getScratch(); 159357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_MAX, TYPE_F32, val, src[0], src[1]); 159457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_MAX, TYPE_F32, val, src[2], val); 159557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(OP_RCP, TYPE_F32, val, val); 159657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (c = 0; c < 3; ++c) 159757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src[c] = mkOp2v(OP_MUL, TYPE_F32, getSSA(), arg[c], val); 159857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 159957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 160057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (c = 0, d = 0; c < 4; ++c) { 160157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst[c]) { 160257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller texi->setDef(d++, dst[c]); 160357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller texi->tex.mask |= 1 << c; 160457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else { 160557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller // NOTE: maybe hook up def too, for CSE 160657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 160757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 160857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (s = 0; s < tgt.getArgCount(); ++s) 160957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller texi->setSrc(s, src[s]); 161057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (lod) 161157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller texi->setSrc(s++, lod); 161257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (shd) 161357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller texi->setSrc(s++, shd); 161457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 161557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller setTexRS(texi, s, R, S); 161657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 161757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (tgsi.getOpcode() == TGSI_OPCODE_SAMPLE_C_LZ) 161857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller texi->tex.levelZero = true; 161957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 162057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bb->insertTail(texi); 162157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 162257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 162357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller// 1st source: xyz = coordinates, w = lod 162457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller// 2nd source: offset 162557594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 162657594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::handleTXF(Value *dst[4], int R) 162757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 162857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller TexInstruction *texi = new_TexInstruction(func, tgsi.getOP()); 162957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned int c, d, s; 163057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 163157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller texi->tex.target = tgsi.getTexture(code, R); 163257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 163357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (c = 0, d = 0; c < 4; ++c) { 163457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst[c]) { 163557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller texi->setDef(d++, dst[c]); 163657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller texi->tex.mask |= 1 << c; 163757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 163857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 163957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (c = 0; c < texi->tex.target.getArgCount(); ++c) 164057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller texi->setSrc(c, fetchSrc(0, c)); 164157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller texi->setSrc(c++, fetchSrc(0, 3)); // lod 164257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 164357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller setTexRS(texi, c, R, -1); 164457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 164557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (s = 0; s < tgsi.getNumTexOffsets(); ++s) { 164657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (c = 0; c < 3; ++c) { 164757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller texi->tex.offset[s][c] = tgsi.getTexOffset(s).getValueU32(c, info); 164857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (texi->tex.offset[s][c]) 164957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller texi->tex.useOffsets = s + 1; 165057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 165157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 165257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 165357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bb->insertTail(texi); 165457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 165557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 165657594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 165757594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::handleLIT(Value *dst0[4]) 165857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 165957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *val0 = NULL; 166057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned int mask = tgsi.getDst(0).getMask(); 166157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 166257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (mask & (1 << 0)) 166357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller loadImm(dst0[0], 1.0f); 166457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 166557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (mask & (1 << 3)) 166657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller loadImm(dst0[3], 1.0f); 166757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 166857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (mask & (3 << 1)) { 166957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val0 = getScratch(); 167057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_MAX, TYPE_F32, val0, fetchSrc(0, 0), zero); 167157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (mask & (1 << 1)) 167257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkMov(dst0[1], val0); 167357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 167457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 167557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (mask & (1 << 2)) { 167657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *src1 = fetchSrc(0, 1), *src3 = fetchSrc(0, 3); 167757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *val1 = getScratch(), *val3 = getScratch(); 167857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 167957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *pos128 = loadImm(NULL, +127.999999f); 168057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *neg128 = loadImm(NULL, -127.999999f); 168157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 168257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_MAX, TYPE_F32, val1, src1, zero); 168357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_MAX, TYPE_F32, val3, src3, neg128); 168457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_MIN, TYPE_F32, val3, val3, pos128); 168557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_POW, TYPE_F32, val3, val1, val3); 168657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 168757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkCmp(OP_SLCT, CC_GT, TYPE_F32, dst0[2], val3, zero, val0); 168857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 168957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 169057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 16919bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco JerezConverter::Subroutine * 16929bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco JerezConverter::getSubroutine(unsigned ip) 16939bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez{ 16949bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez std::map<unsigned, Subroutine>::iterator it = sub.map.find(ip); 16959bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez 16969bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez if (it == sub.map.end()) 16979bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez it = sub.map.insert(std::make_pair( 16989bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez ip, Subroutine(new Function(prog, "SUB", ip)))).first; 16999bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez 17009bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez return &it->second; 17019bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez} 17029bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez 17039bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco JerezConverter::Subroutine * 17049bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco JerezConverter::getSubroutine(Function *f) 17059bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez{ 17069bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez unsigned ip = f->getLabel(); 17079bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez std::map<unsigned, Subroutine>::iterator it = sub.map.find(ip); 17089bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez 17099bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez if (it == sub.map.end()) 17109bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez it = sub.map.insert(std::make_pair(ip, Subroutine(f))).first; 17119bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez 17129bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez return &it->second; 17139bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez} 17149bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez 171557594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerbool 171657594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::isEndOfSubroutine(uint ip) 171757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 171857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(ip < code->scan.num_instructions); 171957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tgsi::Instruction insn(&code->insns[ip]); 172057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return (insn.getOpcode() == TGSI_OPCODE_END || 172157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller insn.getOpcode() == TGSI_OPCODE_ENDSUB || 172257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller // does END occur at end of main or the very end ? 172357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller insn.getOpcode() == TGSI_OPCODE_BGNSUB); 172457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 172557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 172657594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerbool 172757594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::handleInstruction(const struct tgsi_full_instruction *insn) 172857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 172957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *dst0[4], *rDst0[4]; 173057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *src0, *src1, *src2; 173157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *val0, *val1; 173257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller int c; 173357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 173457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tgsi = tgsi::Instruction(insn); 173557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 173657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bool useScratchDst = tgsi.checkDstSrcAliasing(); 173757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 173857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller operation op = tgsi.getOP(); 173957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller dstTy = tgsi.inferDstType(); 174057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller srcTy = tgsi.inferSrcType(); 174157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 174257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned int mask = tgsi.dstCount() ? tgsi.getDst(0).getMask() : 0; 174357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 174457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (tgsi.dstCount()) { 174557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (c = 0; c < 4; ++c) { 174657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller rDst0[c] = acquireDst(0, c); 174757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller dst0[c] = (useScratchDst && rDst0[c]) ? getScratch() : rDst0[c]; 174857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 174957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 175057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 175157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (tgsi.getOpcode()) { 175257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_ADD: 175357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_UADD: 175457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_AND: 175557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_DIV: 175657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_IDIV: 175757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_UDIV: 175857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_MAX: 175957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_MIN: 176057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_IMAX: 176157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_IMIN: 176257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_UMAX: 176357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_UMIN: 176457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_MOD: 176557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_UMOD: 176657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_MUL: 176757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_UMUL: 176857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_OR: 176957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_POW: 177057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SHL: 177157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_ISHR: 177257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_USHR: 177357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SUB: 177457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_XOR: 177557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) { 177657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src0 = fetchSrc(0, c); 177757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src1 = fetchSrc(1, c); 177857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(op, dstTy, dst0[c], src0, src1); 177957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 178057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 178157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_MAD: 178257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_UMAD: 178357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SAD: 178457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) { 178557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src0 = fetchSrc(0, c); 178657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src1 = fetchSrc(1, c); 178757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src2 = fetchSrc(2, c); 178857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp3(op, dstTy, dst0[c], src0, src1, src2); 178957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 179057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 179157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_MOV: 179257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_ABS: 179357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_CEIL: 179457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_FLR: 179557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_TRUNC: 179657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_RCP: 1797be1ae976a41de2803f14341580c3c98c58a80fe3Christoph Bumiller case TGSI_OPCODE_IABS: 179857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_INEG: 179957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_NOT: 180057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_DDX: 180157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_DDY: 180257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) 180357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(op, dstTy, dst0[c], fetchSrc(0, c)); 180457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 180557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_RSQ: 180657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src0 = fetchSrc(0, 0); 180757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val0 = getScratch(); 180857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(OP_ABS, TYPE_F32, val0, src0); 180957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(OP_RSQ, TYPE_F32, val0, val0); 181057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) 181157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkMov(dst0[c], val0); 181257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 181357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_ARL: 181457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) { 181557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src0 = fetchSrc(0, c); 181657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkCvt(OP_CVT, TYPE_S32, dst0[c], TYPE_F32, src0)->rnd = ROUND_M; 181757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_SHL, TYPE_U32, dst0[c], dst0[c], mkImm(4)); 181857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 181957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 182057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_UARL: 182157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) 182257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_SHL, TYPE_U32, dst0[c], fetchSrc(0, c), mkImm(4)); 182357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 182457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_EX2: 182557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_LG2: 182657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val0 = mkOp1(op, TYPE_F32, getScratch(), fetchSrc(0, 0))->getDef(0); 182757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) 182857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(OP_MOV, TYPE_F32, dst0[c], val0); 182957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 183057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_COS: 183157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SIN: 183257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val0 = getScratch(); 183357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (mask & 7) { 183457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(OP_PRESIN, TYPE_F32, val0, fetchSrc(0, 0)); 183557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(op, TYPE_F32, val0, val0); 183657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (c = 0; c < 3; ++c) 183757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst0[c]) 183857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkMov(dst0[c], val0); 183957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 184057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst0[3]) { 184157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(OP_PRESIN, TYPE_F32, val0, fetchSrc(0, 3)); 184257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(op, TYPE_F32, dst0[3], val0); 184357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 184457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 184557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SCS: 184657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (mask & 3) { 184757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val0 = mkOp1v(OP_PRESIN, TYPE_F32, getSSA(), fetchSrc(0, 0)); 184857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst0[0]) 184957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(OP_COS, TYPE_F32, dst0[0], val0); 185057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst0[1]) 185157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(OP_SIN, TYPE_F32, dst0[1], val0); 185257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 185357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst0[2]) 185457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller loadImm(dst0[2], 0.0f); 185557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst0[3]) 185657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller loadImm(dst0[3], 1.0f); 185757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 185857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_EXP: 185957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src0 = fetchSrc(0, 0); 186057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val0 = mkOp1v(OP_FLOOR, TYPE_F32, getSSA(), src0); 186157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst0[1]) 186257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_SUB, TYPE_F32, dst0[1], src0, val0); 186357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst0[0]) 186457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(OP_EX2, TYPE_F32, dst0[0], val0); 186557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst0[2]) 186657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(OP_EX2, TYPE_F32, dst0[2], src0); 186757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst0[3]) 186857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller loadImm(dst0[3], 1.0f); 186957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 187057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_LOG: 187157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src0 = mkOp1v(OP_ABS, TYPE_F32, getSSA(), fetchSrc(0, 0)); 187257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val0 = mkOp1v(OP_LG2, TYPE_F32, dst0[2] ? dst0[2] : getSSA(), src0); 187357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst0[0] || dst0[1]) 187457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val1 = mkOp1v(OP_FLOOR, TYPE_F32, dst0[0] ? dst0[0] : getSSA(), val0); 187557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst0[1]) { 187657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(OP_EX2, TYPE_F32, dst0[1], val1); 187757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(OP_RCP, TYPE_F32, dst0[1], dst0[1]); 187857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_MUL, TYPE_F32, dst0[1], dst0[1], src0); 187957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 188057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst0[3]) 188157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller loadImm(dst0[3], 1.0f); 188257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 188357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_DP2: 188457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val0 = buildDot(2); 188557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) 188657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkMov(dst0[c], val0); 188757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 188857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_DP3: 188957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val0 = buildDot(3); 189057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) 189157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkMov(dst0[c], val0); 189257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 189357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_DP4: 189457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val0 = buildDot(4); 189557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) 189657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkMov(dst0[c], val0); 189757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 189857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_DPH: 189957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val0 = buildDot(3); 190057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src1 = fetchSrc(1, 3); 190157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_ADD, TYPE_F32, val0, val0, src1); 190257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) 190357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkMov(dst0[c], val0); 190457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 190557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_DST: 190657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst0[0]) 190757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller loadImm(dst0[0], 1.0f); 190857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst0[1]) { 190957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src0 = fetchSrc(0, 1); 191057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src1 = fetchSrc(1, 1); 191157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_MUL, TYPE_F32, dst0[1], src0, src1); 191257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 191357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst0[2]) 191457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkMov(dst0[2], fetchSrc(0, 2)); 191557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst0[3]) 191657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkMov(dst0[3], fetchSrc(1, 3)); 191757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 191857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_LRP: 191957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) { 192057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src0 = fetchSrc(0, c); 192157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src1 = fetchSrc(1, c); 192257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src2 = fetchSrc(2, c); 192357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp3(OP_MAD, TYPE_F32, dst0[c], 192457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2v(OP_SUB, TYPE_F32, getSSA(), src1, src2), src0, src2); 192557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 192657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 192757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_LIT: 192857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller handleLIT(dst0); 192957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 193057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_XPD: 193157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) { 193257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (c < 3) { 193357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val0 = getSSA(); 193457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src0 = fetchSrc(1, (c + 1) % 3); 193557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src1 = fetchSrc(0, (c + 2) % 3); 193657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_MUL, TYPE_F32, val0, src0, src1); 193757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(OP_NEG, TYPE_F32, val0, val0); 193857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 193957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src0 = fetchSrc(0, (c + 1) % 3); 194057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src1 = fetchSrc(1, (c + 2) % 3); 194157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp3(OP_MAD, TYPE_F32, dst0[c], src0, src1, val0); 194257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else { 194357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller loadImm(dst0[c], 1.0f); 194457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 194557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 194657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 1947b424bf69dfd78c64e065b8ba59d9b40a8f4fecd6Christoph Bumiller case TGSI_OPCODE_ISSG: 194857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SSG: 194957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) { 195057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src0 = fetchSrc(0, c); 195157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val0 = getScratch(); 195257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val1 = getScratch(); 1953b424bf69dfd78c64e065b8ba59d9b40a8f4fecd6Christoph Bumiller mkCmp(OP_SET, CC_GT, srcTy, val0, src0, zero); 1954b424bf69dfd78c64e065b8ba59d9b40a8f4fecd6Christoph Bumiller mkCmp(OP_SET, CC_LT, srcTy, val1, src0, zero); 1955b424bf69dfd78c64e065b8ba59d9b40a8f4fecd6Christoph Bumiller if (srcTy == TYPE_F32) 1956b424bf69dfd78c64e065b8ba59d9b40a8f4fecd6Christoph Bumiller mkOp2(OP_SUB, TYPE_F32, dst0[c], val0, val1); 1957b424bf69dfd78c64e065b8ba59d9b40a8f4fecd6Christoph Bumiller else 1958b424bf69dfd78c64e065b8ba59d9b40a8f4fecd6Christoph Bumiller mkOp2(OP_SUB, TYPE_S32, dst0[c], val1, val0); 195957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 196057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 196157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_UCMP: 196257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_CMP: 196357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) { 196457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src0 = fetchSrc(0, c); 196557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src1 = fetchSrc(1, c); 196657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src2 = fetchSrc(2, c); 196757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (src1 == src2) 196857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkMov(dst0[c], src1); 196957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller else 197057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkCmp(OP_SLCT, (srcTy == TYPE_F32) ? CC_LT : CC_NE, 197157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller srcTy, dst0[c], src1, src2, src0); 197257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 197357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 197457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_FRC: 197557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) { 197657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src0 = fetchSrc(0, c); 197757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val0 = getScratch(); 197857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(OP_FLOOR, TYPE_F32, val0, src0); 197957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_SUB, TYPE_F32, dst0[c], src0, val0); 198057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 198157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 198257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_ROUND: 198357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) 198457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkCvt(OP_CVT, TYPE_F32, dst0[c], TYPE_F32, fetchSrc(0, c)) 198557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller ->rnd = ROUND_NI; 198657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 198757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_CLAMP: 198857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) { 198957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src0 = fetchSrc(0, c); 199057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src1 = fetchSrc(1, c); 199157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src2 = fetchSrc(2, c); 199257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val0 = getScratch(); 199357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_MIN, TYPE_F32, val0, src0, src1); 199457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_MAX, TYPE_F32, dst0[c], val0, src2); 199557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 199657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 199757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SLT: 199857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SGE: 199957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SEQ: 200057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SFL: 200157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SGT: 200257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SLE: 200357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SNE: 200457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_STR: 200557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_ISGE: 200657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_ISLT: 200757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_USEQ: 200857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_USGE: 200957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_USLT: 201057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_USNE: 201157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) { 201257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src0 = fetchSrc(0, c); 201357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src1 = fetchSrc(1, c); 201457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkCmp(op, tgsi.getSetCond(), dstTy, dst0[c], src0, src1); 201557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 201657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 201757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_KIL: 201857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val0 = new_LValue(func, FILE_PREDICATE); 201957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (c = 0; c < 4; ++c) { 202057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkCmp(OP_SET, CC_LT, TYPE_F32, val0, fetchSrc(0, c), zero); 202157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp(OP_DISCARD, TYPE_NONE, NULL)->setPredicate(CC_P, val0); 202257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 202357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 202457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_KILP: 202557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp(OP_DISCARD, TYPE_NONE, NULL); 202657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 202757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_TEX: 202857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_TXB: 202957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_TXL: 203057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_TXP: 203157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller // R S L C Dx Dy 203257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller handleTEX(dst0, 1, 1, 0x03, 0x0f, 0x00, 0x00); 203357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 203457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_TXD: 203557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller handleTEX(dst0, 3, 3, 0x03, 0x0f, 0x10, 0x20); 203657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 203757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SAMPLE: 203857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SAMPLE_B: 203957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SAMPLE_D: 204057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SAMPLE_L: 204157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SAMPLE_C: 204257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SAMPLE_C_LZ: 204357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller handleTEX(dst0, 1, 2, 0x30, 0x31, 0x40, 0x50); 204457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 204557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_TXF: 204657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_LOAD: 204757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller handleTXF(dst0, 1); 204857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 204957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_TXQ: 2050a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez case TGSI_OPCODE_SVIEWINFO: 205157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller handleTXQ(dst0, TXQ_DIMS); 205257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 205357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_F2I: 205457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_F2U: 205557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) 205657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkCvt(OP_CVT, dstTy, dst0[c], srcTy, fetchSrc(0, c))->rnd = ROUND_Z; 205757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 205857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_I2F: 205957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_U2F: 206057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) 206157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkCvt(OP_CVT, dstTy, dst0[c], srcTy, fetchSrc(0, c)); 206257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 206357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_EMIT: 206457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_ENDPRIM: 206557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller // get vertex stream if specified (must be immediate) 206657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src0 = tgsi.srcCount() ? 206757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkImm(tgsi.getSrc(0).getValueU32(0, info)) : zero; 206857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(op, TYPE_U32, NULL, src0)->fixed = 1; 206957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 207057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_IF: 207157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 207257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller BasicBlock *ifBB = new BasicBlock(func); 207357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 207457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bb->cfg.attach(&ifBB->cfg, Graph::Edge::TREE); 207557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller condBBs.push(bb); 207657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller joinBBs.push(bb); 207757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 207857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkFlow(OP_BRA, NULL, CC_NOT_P, fetchSrc(0, 0)); 207957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 208057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller setPosition(ifBB, true); 208157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 208257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 208357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_ELSE: 208457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 208557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller BasicBlock *elseBB = new BasicBlock(func); 208657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller BasicBlock *forkBB = reinterpret_cast<BasicBlock *>(condBBs.pop().u.p); 208757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 208857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller forkBB->cfg.attach(&elseBB->cfg, Graph::Edge::TREE); 208957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller condBBs.push(bb); 209057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 209157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller forkBB->getExit()->asFlow()->target.bb = elseBB; 209257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!bb->isTerminated()) 209357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkFlow(OP_BRA, NULL, CC_ALWAYS, NULL); 209457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 209557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller setPosition(elseBB, true); 209657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 209757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 209857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_ENDIF: 209957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 210057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller BasicBlock *convBB = new BasicBlock(func); 210157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller BasicBlock *prevBB = reinterpret_cast<BasicBlock *>(condBBs.pop().u.p); 210257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller BasicBlock *forkBB = reinterpret_cast<BasicBlock *>(joinBBs.pop().u.p); 210357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 210457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!bb->isTerminated()) { 210557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller // we only want join if none of the clauses ended with CONT/BREAK/RET 210657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (prevBB->getExit()->op == OP_BRA && joinBBs.getSize() < 6) 210757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller insertConvergenceOps(convBB, forkBB); 210857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkFlow(OP_BRA, convBB, CC_ALWAYS, NULL); 210957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bb->cfg.attach(&convBB->cfg, Graph::Edge::FORWARD); 211057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 211157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 211257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (prevBB->getExit()->op == OP_BRA) { 211357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller prevBB->cfg.attach(&convBB->cfg, Graph::Edge::FORWARD); 211457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller prevBB->getExit()->asFlow()->target.bb = convBB; 211557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 211657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller setPosition(convBB, true); 211757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 211857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 211957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_BGNLOOP: 212057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 212157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller BasicBlock *lbgnBB = new BasicBlock(func); 212257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller BasicBlock *lbrkBB = new BasicBlock(func); 212357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 212457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller loopBBs.push(lbgnBB); 212557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller breakBBs.push(lbrkBB); 212657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (loopBBs.getSize() > func->loopNestingBound) 212757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller func->loopNestingBound++; 212857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 212957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkFlow(OP_PREBREAK, lbrkBB, CC_ALWAYS, NULL); 213057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 213157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bb->cfg.attach(&lbgnBB->cfg, Graph::Edge::TREE); 213257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller setPosition(lbgnBB, true); 213357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkFlow(OP_PRECONT, lbgnBB, CC_ALWAYS, NULL); 213457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 213557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 213657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_ENDLOOP: 213757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 213857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller BasicBlock *loopBB = reinterpret_cast<BasicBlock *>(loopBBs.pop().u.p); 213957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 214057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!bb->isTerminated()) { 214157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkFlow(OP_CONT, loopBB, CC_ALWAYS, NULL); 214257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bb->cfg.attach(&loopBB->cfg, Graph::Edge::BACK); 214357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 214457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller setPosition(reinterpret_cast<BasicBlock *>(breakBBs.pop().u.p), true); 214557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 214657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 214757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_BRK: 214857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 214957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (bb->isTerminated()) 215057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 215157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller BasicBlock *brkBB = reinterpret_cast<BasicBlock *>(breakBBs.peek().u.p); 215257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkFlow(OP_BREAK, brkBB, CC_ALWAYS, NULL); 215357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bb->cfg.attach(&brkBB->cfg, Graph::Edge::CROSS); 215457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 215557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 215657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_CONT: 215757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 215857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (bb->isTerminated()) 215957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 216057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller BasicBlock *contBB = reinterpret_cast<BasicBlock *>(loopBBs.peek().u.p); 216157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkFlow(OP_CONT, contBB, CC_ALWAYS, NULL); 216257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller contBB->explicitCont = true; 216357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bb->cfg.attach(&contBB->cfg, Graph::Edge::BACK); 216457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 216557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 216657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_BGNSUB: 216757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 21689bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez Subroutine *s = getSubroutine(ip); 21699bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez BasicBlock *entry = new BasicBlock(s->f); 21709bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez BasicBlock *leave = new BasicBlock(s->f); 21719bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez 21729bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez // multiple entrypoints possible, keep the graph connected 21739bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez if (prog->getType() == Program::TYPE_COMPUTE) 21749bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez prog->main->call.attach(&s->f->call, Graph::Edge::TREE); 21759bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez 21769bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez sub.cur = s; 21779bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez s->f->setEntry(entry); 21789bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez s->f->setExit(leave); 217957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller setPosition(entry, true); 218057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return true; 21819bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez } 218257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_ENDSUB: 218357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 21849bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez sub.cur = getSubroutine(prog->main); 21859bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez setPosition(BasicBlock::get(sub.cur->f->cfg.getRoot()), true); 218657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return true; 21879bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez } 218857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_CAL: 21899bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez { 21909bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez Subroutine *s = getSubroutine(tgsi.getLabel()); 21919bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez mkFlow(OP_CALL, s->f, CC_ALWAYS, NULL); 21929bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez func->call.attach(&s->f->call, Graph::Edge::TREE); 219357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return true; 21949bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez } 219557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_RET: 219657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 219757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (bb->isTerminated()) 219857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return true; 21999bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez BasicBlock *leave = BasicBlock::get(func->cfgExit); 22009bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez 220157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!isEndOfSubroutine(ip + 1)) { 220257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller // insert a PRERET at the entry if this is an early return 22039bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez // (only needed for sharing code in the epilogue) 2204163b290f886c69a233c71799613eb74fb2668085Christoph Bumiller BasicBlock *pos = getBB(); 2205163b290f886c69a233c71799613eb74fb2668085Christoph Bumiller setPosition(BasicBlock::get(func->cfg.getRoot()), false); 22069bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez mkFlow(OP_PRERET, leave, CC_ALWAYS, NULL)->fixed = 1; 2207163b290f886c69a233c71799613eb74fb2668085Christoph Bumiller setPosition(pos, true); 22089bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez } 2209163b290f886c69a233c71799613eb74fb2668085Christoph Bumiller mkFlow(OP_RET, NULL, CC_ALWAYS, NULL)->fixed = 1; 2210163b290f886c69a233c71799613eb74fb2668085Christoph Bumiller bb->cfg.attach(&leave->cfg, Graph::Edge::CROSS); 221157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 221257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 221357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_END: 221457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 221557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller // attach and generate epilogue code 22169bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez BasicBlock *epilogue = BasicBlock::get(func->cfgExit); 221757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bb->cfg.attach(&epilogue->cfg, Graph::Edge::TREE); 221857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller setPosition(epilogue, true); 221957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (prog->getType() == Program::TYPE_FRAGMENT) 222057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller exportOutputs(); 2221b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller if (info->io.genUserClip > 0) 222257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller handleUserClipPlanes(); 222357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp(OP_EXIT, TYPE_NONE, NULL)->terminator = 1; 222457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 222557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 222657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SWITCH: 222757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_CASE: 222857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller ERROR("switch/case opcode encountered, should have been lowered\n"); 222957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller abort(); 223057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 223157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 223257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller ERROR("unhandled TGSI opcode: %u\n", tgsi.getOpcode()); 223357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(0); 223457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 223557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 223657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 223757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (tgsi.dstCount()) { 223857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (c = 0; c < 4; ++c) { 223957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!dst0[c]) 224057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller continue; 224157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst0[c] != rDst0[c]) 224257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkMov(rDst0[c], dst0[c]); 224357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller storeDst(0, c, rDst0[c]); 224457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 224557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 224657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller vtxBaseValid = 0; 224757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 224857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return true; 224957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 225057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 225157594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 225257594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::handleUserClipPlanes() 225357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 225457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *res[8]; 2255ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller int n, i, c; 225657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 225757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (c = 0; c < 4; ++c) { 2258b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller for (i = 0; i < info->io.genUserClip; ++i) { 2259e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller Symbol *sym = mkSymbol(FILE_MEMORY_CONST, info->io.ucpBinding, 2260e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller TYPE_F32, info->io.ucpBase + i * 16 + c * 4); 2261e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller Value *ucp = mkLoad(TYPE_F32, sym, NULL); 226257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (c == 0) 226357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller res[i] = mkOp2v(OP_MUL, TYPE_F32, getScratch(), clipVtx[c], ucp); 226457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller else 226557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp3(OP_MAD, TYPE_F32, res[i], clipVtx[c], ucp, res[i]); 226657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 226757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 226857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 2269ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller const int first = info->numOutputs - (info->io.genUserClip + 3) / 4; 2270ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller 2271ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller for (i = 0; i < info->io.genUserClip; ++i) { 2272ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller n = i / 4 + first; 2273ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller c = i % 4; 2274ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller Symbol *sym = 2275ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller mkSymbol(FILE_SHADER_OUTPUT, 0, TYPE_F32, info->out[n].slot[c] * 4); 2276ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller mkStore(OP_EXPORT, TYPE_F32, sym, NULL, res[i]); 2277ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller } 227857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 227957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 228057594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 228157594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::exportOutputs() 228257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 228357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (unsigned int i = 0; i < info->numOutputs; ++i) { 228457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (unsigned int c = 0; c < 4; ++c) { 22859bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez if (!oData.exists(sub.cur->values, i, c)) 228657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller continue; 228757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Symbol *sym = mkSymbol(FILE_SHADER_OUTPUT, 0, TYPE_F32, 228857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->out[i].slot[c] * 4); 22899bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez Value *val = oData.load(sub.cur->values, i, c, NULL); 229057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (val) 229157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkStore(OP_EXPORT, TYPE_F32, sym, NULL, val); 229257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 229357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 229457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 229557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 229656d40aa51b34b77791cc3a49d7e86473a7459b72Francisco JerezConverter::Converter(Program *ir, const tgsi::Source *code) : BuildUtil(ir), 229756d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez code(code), 229857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tgsi(NULL), 229957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tData(this), aData(this), pData(this), oData(this) 230057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 230157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info = code->info; 230257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 230356d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez const DataFile tFile = code->mainTempsInLMem ? FILE_MEMORY_LOCAL : FILE_GPR; 230456d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez 230556d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez const unsigned tSize = code->fileSize(TGSI_FILE_TEMPORARY); 230656d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez const unsigned pSize = code->fileSize(TGSI_FILE_PREDICATE); 230756d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez const unsigned aSize = code->fileSize(TGSI_FILE_ADDRESS); 230856d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez const unsigned oSize = code->fileSize(TGSI_FILE_OUTPUT); 230956d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez 231056d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez tData.setup(TGSI_FILE_TEMPORARY, 0, 0, tSize, 4, 4, tFile, 0); 231156d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez pData.setup(TGSI_FILE_PREDICATE, 0, 0, pSize, 4, 4, FILE_PREDICATE, 0); 231256d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez aData.setup(TGSI_FILE_ADDRESS, 0, 0, aSize, 4, 4, FILE_ADDRESS, 0); 231356d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez oData.setup(TGSI_FILE_OUTPUT, 0, 0, oSize, 4, 4, FILE_GPR, 0); 231456d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez 231556d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez for (int vol = 0, i = 0; i < code->tempArrayCount; ++i) { 231656d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez int len = code->tempArrays[i].u32 >> 2; 231756d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez int dim = code->tempArrays[i].u32 & 3; 231856d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez 231956d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez lData.push_back(DataArray(this)); 232056d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez lData.back().setup(TGSI_FILE_TEMPORARY_ARRAY, i, vol, len, dim, 4, 232156d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez FILE_MEMORY_LOCAL, 0); 232257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 232356d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez vol += (len * dim * 4 + 0xf) & ~0xf; 232456d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez } 232556d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez 232656d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez for (int vol = 0, i = 0; i < code->immdArrayCount; ++i) { 232756d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez int len = code->immdArrays[i].u32 >> 2; 232856d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez int dim = code->immdArrays[i].u32 & 3; 232956d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez 233056d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez lData.push_back(DataArray(this)); 233156d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez lData.back().setup(TGSI_FILE_IMMEDIATE_ARRAY, i, vol, len, dim, 4, 233256d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez FILE_MEMORY_CONST, 14); 233357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 233456d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez vol += (len * dim * 4 + 0xf) & ~0xf; 233556d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez } 233657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 233757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller zero = mkImm((uint32_t)0); 233857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 233957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller vtxBaseValid = 0; 234057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 234157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 234257594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::~Converter() 234357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 234457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 234557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 2346a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jereztemplate<typename T> inline void 2347a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco JerezConverter::BindArgumentsPass::updateCallArgs( 2348a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez Instruction *i, void (Instruction::*setArg)(int, Value *), 2349a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez T (Function::*proto)) 2350a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez{ 2351a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez Function *g = i->asFlow()->target.fn; 2352a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez Subroutine *subg = conv.getSubroutine(g); 2353a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez 2354a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez for (unsigned a = 0; a < (g->*proto).size(); ++a) { 2355a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez Value *v = (g->*proto)[a].get(); 2356a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez const Converter::Location &l = subg->values.l.find(v)->second; 2357a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez Converter::DataArray *array = conv.getArrayForFile(l.array, l.arrayIdx); 2358a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez 2359a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez (i->*setArg)(a, array->acquire(sub->values, l.i, l.c)); 2360a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez } 2361a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez} 2362a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez 2363a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jereztemplate<typename T> inline void 2364a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco JerezConverter::BindArgumentsPass::updatePrototype( 2365a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez BitSet *set, void (Function::*updateSet)(), T (Function::*proto)) 2366a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez{ 2367a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez (func->*updateSet)(); 2368a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez 2369a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez for (unsigned i = 0; i < set->getSize(); ++i) { 2370a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez Value *v = func->getLValue(i); 2371a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez 2372a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez // only include values with a matching TGSI register 2373a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez if (set->test(i) && sub->values.l.find(v) != sub->values.l.end()) 2374a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez (func->*proto).push_back(v); 2375a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez } 2376a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez} 2377a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez 2378a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerezbool 2379a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco JerezConverter::BindArgumentsPass::visit(Function *f) 2380a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez{ 2381a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez sub = conv.getSubroutine(f); 2382a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez 2383a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez for (ArrayList::Iterator bi = f->allBBlocks.iterator(); 2384a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez !bi.end(); bi.next()) { 2385a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez for (Instruction *i = BasicBlock::get(bi)->getFirst(); 2386a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez i; i = i->next) { 2387a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez if (i->op == OP_CALL && !i->asFlow()->builtin) { 2388a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez updateCallArgs(i, &Instruction::setSrc, &Function::ins); 2389a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez updateCallArgs(i, &Instruction::setDef, &Function::outs); 2390a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez } 2391a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez } 2392a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez } 2393a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez 2394a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez if (func == prog->main && prog->getType() != Program::TYPE_COMPUTE) 2395a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez return true; 2396a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez updatePrototype(&BasicBlock::get(f->cfg.getRoot())->liveSet, 2397a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez &Function::buildLiveSets, &Function::ins); 2398a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez updatePrototype(&BasicBlock::get(f->cfgExit)->defSet, 2399a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez &Function::buildDefSets, &Function::outs); 2400a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez 2401a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez return true; 2402a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez} 2403a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez 240457594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerbool 240557594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::run() 240657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 240757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller BasicBlock *entry = new BasicBlock(prog->main); 240857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller BasicBlock *leave = new BasicBlock(prog->main); 240957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 241057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller prog->main->setEntry(entry); 241157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller prog->main->setExit(leave); 241257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 241357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller setPosition(entry, true); 24149bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez sub.cur = getSubroutine(prog->main); 241557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 2416b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller if (info->io.genUserClip > 0) { 241757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (int c = 0; c < 4; ++c) 241857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller clipVtx[c] = getScratch(); 241957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 242057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 242157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (prog->getType() == Program::TYPE_FRAGMENT) { 242257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Symbol *sv = mkSysVal(SV_POSITION, 3); 242357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller fragCoord[3] = mkOp1v(OP_RDSV, TYPE_F32, getSSA(), sv); 242457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(OP_RCP, TYPE_F32, fragCoord[3], fragCoord[3]); 242557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 242657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 242757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (ip = 0; ip < code->scan.num_instructions; ++ip) { 242857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!handleInstruction(&code->insns[ip])) 242957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return false; 243057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 2431a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez 2432a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez if (!BindArgumentsPass(*this).run(prog)) 2433a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez return false; 2434a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez 243557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return true; 243657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 243757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 243857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} // unnamed namespace 243957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 244057594065c30feec9376be9b2132659f7d87362eeChristoph Bumillernamespace nv50_ir { 244157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 244257594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerbool 244357594065c30feec9376be9b2132659f7d87362eeChristoph BumillerProgram::makeFromTGSI(struct nv50_ir_prog_info *info) 244457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 244557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tgsi::Source src(info); 244657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!src.scanSource()) 244757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return false; 2448e43a3a66a9d8a99021d76ff4d07dec7b8cfd62caChristoph Bumiller tlsSize = info->bin.tlsSpace; 244957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 245057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Converter builder(this, &src); 245157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return builder.run(); 245257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 245357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 245457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} // namespace nv50_ir 2455