nv50_ir_from_tgsi.cpp revision 1279923d72942ee201fcc6ad40d552143f651f03
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); 21757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_DP3: 21857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return 0x7; 21957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_DP4: 22057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_DPH: 22157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_KIL: /* WriteMask ignored */ 22257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return 0xf; 22357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_DST: 22457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return mask & (s ? 0xa : 0x6); 22557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_EX2: 22657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_EXP: 22757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_LG2: 22857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_LOG: 22957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_POW: 23057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_RCP: 23157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_RSQ: 23257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SCS: 23357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return 0x1; 23457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_IF: 23557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return 0x1; 23657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_LIT: 23757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return 0xb; 23857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_TEX: 23957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_TXB: 24057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_TXD: 24157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_TXL: 24257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_TXP: 24357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 24457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const struct tgsi_instruction_texture *tex = &insn->Texture; 24557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 24657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(insn->Instruction.Texture); 24757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 24857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mask = 0x7; 24957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (insn->Instruction.Opcode != TGSI_OPCODE_TEX && 25057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller insn->Instruction.Opcode != TGSI_OPCODE_TXD) 25157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mask |= 0x8; /* bias, lod or proj */ 25257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 25357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (tex->Texture) { 25457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_TEXTURE_1D: 25557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mask &= 0x9; 25657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 25757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_TEXTURE_SHADOW1D: 25857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mask &= 0x5; 25957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 26057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_TEXTURE_1D_ARRAY: 26157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_TEXTURE_2D: 26257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_TEXTURE_RECT: 26357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mask &= 0xb; 26457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 26557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 26657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 26757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 26857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 26957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return mask; 27057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_XPD: 27157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 27257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned int x = 0; 27357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (mask & 1) x |= 0x6; 27457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (mask & 2) x |= 0x5; 27557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (mask & 4) x |= 0x3; 27657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return x; 27757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 27857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 27957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 28057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 28157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 28257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return mask; 28357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 28457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 28557594065c30feec9376be9b2132659f7d87362eeChristoph Bumillernv50_ir::Modifier Instruction::SrcRegister::getMod(int chan) const 28657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 28757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller nv50_ir::Modifier m(0); 28857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 28957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (reg.Absolute) 29057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller m = m | nv50_ir::Modifier(NV50_IR_MOD_ABS); 29157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (reg.Negate) 29257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller m = m | nv50_ir::Modifier(NV50_IR_MOD_NEG); 29357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return m; 29457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 29557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 29657594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerstatic nv50_ir::DataFile translateFile(uint file) 29757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 29857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (file) { 29957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_CONSTANT: return nv50_ir::FILE_MEMORY_CONST; 30057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_INPUT: return nv50_ir::FILE_SHADER_INPUT; 30157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_OUTPUT: return nv50_ir::FILE_SHADER_OUTPUT; 30257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_TEMPORARY: return nv50_ir::FILE_GPR; 30357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_ADDRESS: return nv50_ir::FILE_ADDRESS; 30457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_PREDICATE: return nv50_ir::FILE_PREDICATE; 30557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_IMMEDIATE: return nv50_ir::FILE_IMMEDIATE; 30657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_SYSTEM_VALUE: return nv50_ir::FILE_SYSTEM_VALUE; 30757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_IMMEDIATE_ARRAY: return nv50_ir::FILE_IMMEDIATE; 30857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_TEMPORARY_ARRAY: return nv50_ir::FILE_MEMORY_LOCAL; 30957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_RESOURCE: return nv50_ir::FILE_MEMORY_GLOBAL; 31057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_SAMPLER: 31157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_NULL: 31257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 31357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return nv50_ir::FILE_NULL; 31457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 31557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 31657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 31757594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerstatic nv50_ir::SVSemantic translateSysVal(uint sysval) 31857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 31957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (sysval) { 32057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_SEMANTIC_FACE: return nv50_ir::SV_FACE; 32157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_SEMANTIC_PSIZE: return nv50_ir::SV_POINT_SIZE; 32257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_SEMANTIC_PRIMID: return nv50_ir::SV_PRIMITIVE_ID; 32357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_SEMANTIC_INSTANCEID: return nv50_ir::SV_INSTANCE_ID; 3247fd802b96cd916e5cadf7eda7329105169dd29bbChristoph Bumiller case TGSI_SEMANTIC_VERTEXID: return nv50_ir::SV_VERTEX_ID; 32557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 32657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(0); 32757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return nv50_ir::SV_CLOCK; 32857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 32957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 33057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 33157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#define NV50_IR_TEX_TARG_CASE(a, b) \ 33257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_TEXTURE_##a: return nv50_ir::TEX_TARGET_##b; 33357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 33457594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerstatic nv50_ir::TexTarget translateTexture(uint tex) 33557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 33657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (tex) { 33757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_TEX_TARG_CASE(1D, 1D); 33857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_TEX_TARG_CASE(2D, 2D); 33957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_TEX_TARG_CASE(3D, 3D); 34057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_TEX_TARG_CASE(CUBE, CUBE); 34157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_TEX_TARG_CASE(RECT, RECT); 34257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_TEX_TARG_CASE(1D_ARRAY, 1D_ARRAY); 34357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_TEX_TARG_CASE(2D_ARRAY, 2D_ARRAY); 34457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_TEX_TARG_CASE(SHADOW1D, 1D_SHADOW); 34557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_TEX_TARG_CASE(SHADOW2D, 2D_SHADOW); 34657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_TEX_TARG_CASE(SHADOW1D_ARRAY, 1D_ARRAY_SHADOW); 34757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_TEX_TARG_CASE(SHADOW2D_ARRAY, 2D_ARRAY_SHADOW); 3489d503992d7309a49df0b0a4887b999e2d6b291c0Christoph Bumiller NV50_IR_TEX_TARG_CASE(SHADOWCUBE, CUBE_SHADOW); 34957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_TEX_TARG_CASE(SHADOWRECT, RECT_SHADOW); 35057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 35157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_TEXTURE_UNKNOWN: 35257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 35357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(!"invalid texture target"); 35457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return nv50_ir::TEX_TARGET_2D; 35557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 35657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 35757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 35857594065c30feec9376be9b2132659f7d87362eeChristoph Bumillernv50_ir::DataType Instruction::inferSrcType() const 35957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 36057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (getOpcode()) { 36157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_AND: 36257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_OR: 36357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_XOR: 364cd6d63fa60b7a5d7b81ebc51fa560bcc5b701c73Christoph Bumiller case TGSI_OPCODE_NOT: 36557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_U2F: 36657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_UADD: 36757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_UDIV: 36857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_UMOD: 36957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_UMAD: 37057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_UMUL: 37157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_UMAX: 37257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_UMIN: 37357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_USEQ: 37457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_USGE: 37557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_USLT: 37657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_USNE: 37757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_USHR: 37857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_UCMP: 37957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return nv50_ir::TYPE_U32; 38057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_I2F: 38157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_IDIV: 38257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_IMAX: 38357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_IMIN: 384be1ae976a41de2803f14341580c3c98c58a80fe3Christoph Bumiller case TGSI_OPCODE_IABS: 38557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_INEG: 38657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_ISGE: 38757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_ISHR: 38857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_ISLT: 389b424bf69dfd78c64e065b8ba59d9b40a8f4fecd6Christoph Bumiller case TGSI_OPCODE_ISSG: 39057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SAD: // not sure about SAD, but no one has a float version 39157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_MOD: 39257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_UARL: 39357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return nv50_ir::TYPE_S32; 39457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 39557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return nv50_ir::TYPE_F32; 39657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 39757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 39857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 39957594065c30feec9376be9b2132659f7d87362eeChristoph Bumillernv50_ir::DataType Instruction::inferDstType() const 40057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 40157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (getOpcode()) { 40257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_F2U: return nv50_ir::TYPE_U32; 40357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_F2I: return nv50_ir::TYPE_S32; 40457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_I2F: 40557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_U2F: 40657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return nv50_ir::TYPE_F32; 40757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 40857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return inferSrcType(); 40957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 41057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 41157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 41257594065c30feec9376be9b2132659f7d87362eeChristoph Bumillernv50_ir::CondCode Instruction::getSetCond() const 41357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 41457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller using namespace nv50_ir; 41557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 41657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (getOpcode()) { 41757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SLT: 41857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_ISLT: 41957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_USLT: 42057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return CC_LT; 42157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SLE: 42257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return CC_LE; 42357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SGE: 42457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_ISGE: 42557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_USGE: 42657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return CC_GE; 42757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SGT: 42857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return CC_GT; 42957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SEQ: 43057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_USEQ: 43157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return CC_EQ; 43257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SNE: 433ca03372657f73a30b7b2f827d6f76473e57487eeChristoph Bumiller return CC_NEU; 43457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_USNE: 43557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return CC_NE; 43657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SFL: 43757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return CC_NEVER; 43857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_STR: 43957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 44057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return CC_ALWAYS; 44157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 44257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 44357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 44457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#define NV50_IR_OPCODE_CASE(a, b) case TGSI_OPCODE_##a: return nv50_ir::OP_##b 44557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 44657594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerstatic nv50_ir::operation translateOpcode(uint opcode) 44757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 44857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (opcode) { 44957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(ARL, SHL); 45057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(MOV, MOV); 45157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 45257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(RCP, RCP); 45357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(RSQ, RSQ); 45457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 45557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(MUL, MUL); 45657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(ADD, ADD); 45757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 45857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(MIN, MIN); 45957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(MAX, MAX); 46057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(SLT, SET); 46157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(SGE, SET); 46257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(MAD, MAD); 46357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(SUB, SUB); 46457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 46557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(FLR, FLOOR); 46657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(ROUND, CVT); 46757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(EX2, EX2); 46857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(LG2, LG2); 46957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(POW, POW); 47057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 47157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(ABS, ABS); 47257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 47357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(COS, COS); 47457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(DDX, DFDX); 47557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(DDY, DFDY); 47657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(KILP, DISCARD); 47757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 47857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(SEQ, SET); 47957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(SFL, SET); 48057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(SGT, SET); 48157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(SIN, SIN); 48257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(SLE, SET); 48357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(SNE, SET); 48457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(STR, SET); 48557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(TEX, TEX); 48657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(TXD, TXD); 48757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(TXP, TEX); 48857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 48957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(BRA, BRA); 49057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(CAL, CALL); 49157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(RET, RET); 49257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(CMP, SLCT); 49357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 49457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(TXB, TXB); 49557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 49657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(DIV, DIV); 49757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 49857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(TXL, TXL); 49957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 50057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(CEIL, CEIL); 50157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(I2F, CVT); 50257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(NOT, NOT); 50357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(TRUNC, TRUNC); 50457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(SHL, SHL); 50557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 50657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(AND, AND); 50757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(OR, OR); 50857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(MOD, MOD); 50957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(XOR, XOR); 51057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(SAD, SAD); 51157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(TXF, TXF); 51257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(TXQ, TXQ); 51357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 51457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(EMIT, EMIT); 51557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(ENDPRIM, RESTART); 51657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 51757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(KIL, DISCARD); 51857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 51957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(F2I, CVT); 52057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(IDIV, DIV); 52157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(IMAX, MAX); 52257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(IMIN, MIN); 523be1ae976a41de2803f14341580c3c98c58a80fe3Christoph Bumiller NV50_IR_OPCODE_CASE(IABS, ABS); 52457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(INEG, NEG); 52557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(ISGE, SET); 52657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(ISHR, SHR); 52757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(ISLT, SET); 52857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(F2U, CVT); 52957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(U2F, CVT); 53057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(UADD, ADD); 53157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(UDIV, DIV); 53257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(UMAD, MAD); 53357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(UMAX, MAX); 53457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(UMIN, MIN); 53557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(UMOD, MOD); 53657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(UMUL, MUL); 53757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(USEQ, SET); 53857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(USGE, SET); 53957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(USHR, SHR); 54057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(USLT, SET); 54157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(USNE, SET); 54257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 54357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(LOAD, TXF); 54457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(SAMPLE, TEX); 54557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(SAMPLE_B, TXB); 54657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(SAMPLE_C, TEX); 54757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(SAMPLE_C_LZ, TEX); 54857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(SAMPLE_D, TXD); 54957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(SAMPLE_L, TXL); 55057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(GATHER4, TXG); 551a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez NV50_IR_OPCODE_CASE(SVIEWINFO, TXQ); 55257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 55357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller NV50_IR_OPCODE_CASE(END, EXIT); 55457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 55557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 55657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return nv50_ir::OP_NOP; 55757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 55857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 55957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 56057594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerbool Instruction::checkDstSrcAliasing() const 56157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 56257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (insn->Dst[0].Register.Indirect) // no danger if indirect, using memory 56357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return false; 56457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 56557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (int s = 0; s < TGSI_FULL_MAX_SRC_REGISTERS; ++s) { 56657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (insn->Src[s].Register.File == TGSI_FILE_NULL) 56757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 56857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (insn->Src[s].Register.File == insn->Dst[0].Register.File && 56957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller insn->Src[s].Register.Index == insn->Dst[0].Register.Index) 57057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return true; 57157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 57257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return false; 57357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 57457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 57557594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerclass Source 57657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 57757594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerpublic: 57857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Source(struct nv50_ir_prog_info *); 57957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller ~Source(); 58057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 58157594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerpublic: 58257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bool scanSource(); 58357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned fileSize(unsigned file) const { return scan.file_max[file] + 1; } 58457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 58557594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerpublic: 58657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller struct tgsi_shader_info scan; 58757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller struct tgsi_full_instruction *insns; 58857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const struct tgsi_token *tokens; 58957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller struct nv50_ir_prog_info *info; 59057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 59157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller nv50_ir::DynArray tempArrays; 59257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller nv50_ir::DynArray immdArrays; 59357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller int tempArrayCount; 59457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller int immdArrayCount; 59557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 59657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bool mainTempsInLMem; 59757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 598b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller int clipVertexOutput; 599b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller 600a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez uint8_t *samplerViewTargets; // TGSI_TEXTURE_* 601a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez unsigned samplerViewCount; 60257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 60357594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerprivate: 60457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller int inferSysValDirection(unsigned sn) const; 60557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bool scanDeclaration(const struct tgsi_full_declaration *); 60657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bool scanInstruction(const struct tgsi_full_instruction *); 60757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void scanProperty(const struct tgsi_full_property *); 60857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void scanImmediate(const struct tgsi_full_immediate *); 60957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 61057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller inline bool isEdgeFlagPassthrough(const Instruction&) const; 61157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}; 61257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 61357594065c30feec9376be9b2132659f7d87362eeChristoph BumillerSource::Source(struct nv50_ir_prog_info *prog) : info(prog) 61457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 61557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tokens = (const struct tgsi_token *)info->bin.source; 61657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 61757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (prog->dbgFlags & NV50_IR_DEBUG_BASIC) 61857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tgsi_dump(tokens, 0); 61957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 620a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez samplerViewTargets = NULL; 62157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 62257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mainTempsInLMem = FALSE; 62357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 62457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 62557594065c30feec9376be9b2132659f7d87362eeChristoph BumillerSource::~Source() 62657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 62757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (insns) 62857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FREE(insns); 62957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 63057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (info->immd.data) 63157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FREE(info->immd.data); 63257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (info->immd.type) 63357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FREE(info->immd.type); 63457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 635a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez if (samplerViewTargets) 636a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez delete[] samplerViewTargets; 63757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 63857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 63957594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerbool Source::scanSource() 64057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 64157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned insnCount = 0; 64257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller struct tgsi_parse_context parse; 64357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 64457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tgsi_scan_shader(tokens, &scan); 64557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 64657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller insns = (struct tgsi_full_instruction *)MALLOC(scan.num_instructions * 64757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller sizeof(insns[0])); 64857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!insns) 64957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return false; 65057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 651b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller clipVertexOutput = -1; 652b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller 653a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez samplerViewCount = scan.file_max[TGSI_FILE_SAMPLER_VIEW] + 1; 654a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez samplerViewTargets = new uint8_t[samplerViewCount]; 65557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 65657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->immd.bufSize = 0; 65757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tempArrayCount = 0; 65857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller immdArrayCount = 0; 65957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 66057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->numInputs = scan.file_max[TGSI_FILE_INPUT] + 1; 66157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->numOutputs = scan.file_max[TGSI_FILE_OUTPUT] + 1; 66257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->numSysVals = scan.file_max[TGSI_FILE_SYSTEM_VALUE] + 1; 66357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 66457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (info->type == PIPE_SHADER_FRAGMENT) { 66557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->prop.fp.writesDepth = scan.writes_z; 66657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->prop.fp.usesDiscard = scan.uses_kill; 66757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else 66857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (info->type == PIPE_SHADER_GEOMETRY) { 66957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->prop.gp.instanceCount = 1; // default value 67057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 67157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 67257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->immd.data = (uint32_t *)MALLOC(scan.immediate_count * 16); 67357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->immd.type = (ubyte *)MALLOC(scan.immediate_count * sizeof(ubyte)); 67457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 67557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tgsi_parse_init(&parse, tokens); 67657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller while (!tgsi_parse_end_of_tokens(&parse)) { 67757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tgsi_parse_token(&parse); 67857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 67957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (parse.FullToken.Token.Type) { 68057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_TOKEN_TYPE_IMMEDIATE: 68157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller scanImmediate(&parse.FullToken.FullImmediate); 68257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 68357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_TOKEN_TYPE_DECLARATION: 68457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller scanDeclaration(&parse.FullToken.FullDeclaration); 68557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 68657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_TOKEN_TYPE_INSTRUCTION: 68757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller insns[insnCount++] = parse.FullToken.FullInstruction; 6889bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez scanInstruction(&parse.FullToken.FullInstruction); 68957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 69057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_TOKEN_TYPE_PROPERTY: 69157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller scanProperty(&parse.FullToken.FullProperty); 69257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 69357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 69457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller INFO("unknown TGSI token type: %d\n", parse.FullToken.Token.Type); 69557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 69657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 69757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 69857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tgsi_parse_free(&parse); 69957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 70057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (mainTempsInLMem) 70157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->bin.tlsSpace += (scan.file_max[TGSI_FILE_TEMPORARY] + 1) * 16; 70257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 703ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller if (info->io.genUserClip > 0) { 704b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller info->io.clipDistanceMask = (1 << info->io.genUserClip) - 1; 705b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller 706ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller for (unsigned int n = 0; n < ((info->io.genUserClip + 3) / 4); ++n) { 707ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller unsigned int i = info->numOutputs++; 708ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller info->out[i].id = i; 709ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller info->out[i].sn = TGSI_SEMANTIC_CLIPDIST; 710ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller info->out[i].si = n; 711ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller info->out[i].mask = info->io.clipDistanceMask >> (n * 4); 712ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller } 713ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller } 714ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller 71557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return info->assignSlots(info) == 0; 71657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 71757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 71857594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid Source::scanProperty(const struct tgsi_full_property *prop) 71957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 72057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (prop->Property.PropertyName) { 72157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_PROPERTY_GS_OUTPUT_PRIM: 72257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->prop.gp.outputPrim = prop->u[0].Data; 72357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 72457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_PROPERTY_GS_INPUT_PRIM: 72557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->prop.gp.inputPrim = prop->u[0].Data; 72657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 72757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_PROPERTY_GS_MAX_OUTPUT_VERTICES: 72857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->prop.gp.maxVertices = prop->u[0].Data; 72957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 73057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#if 0 73157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_PROPERTY_GS_INSTANCE_COUNT: 73257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->prop.gp.instanceCount = prop->u[0].Data; 73357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 73457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#endif 73557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS: 73657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->prop.fp.separateFragData = TRUE; 73757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 73857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_PROPERTY_FS_COORD_ORIGIN: 73957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_PROPERTY_FS_COORD_PIXEL_CENTER: 74057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller // we don't care 74157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 742b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller case TGSI_PROPERTY_VS_PROHIBIT_UCPS: 743b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller info->io.genUserClip = -1; 744b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller break; 74557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 74657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller INFO("unhandled TGSI property %d\n", prop->Property.PropertyName); 74757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 74857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 74957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 75057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 75157594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid Source::scanImmediate(const struct tgsi_full_immediate *imm) 75257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 75357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const unsigned n = info->immd.count++; 75457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 75557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(n < scan.immediate_count); 75657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 75757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (int c = 0; c < 4; ++c) 75857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->immd.data[n * 4 + c] = imm->u[c].Uint; 75957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 76057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->immd.type[n] = imm->Immediate.DataType; 76157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 76257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 76357594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerint Source::inferSysValDirection(unsigned sn) const 76457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 76557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (sn) { 76657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_SEMANTIC_INSTANCEID: 7677fd802b96cd916e5cadf7eda7329105169dd29bbChristoph Bumiller case TGSI_SEMANTIC_VERTEXID: 76857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return 1; 76957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#if 0 77057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_SEMANTIC_LAYER: 77157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_SEMANTIC_VIEWPORTINDEX: 77257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return 0; 77357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#endif 77457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_SEMANTIC_PRIMID: 77557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return (info->type == PIPE_SHADER_FRAGMENT) ? 1 : 0; 77657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 77757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return 0; 77857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 77957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 78057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 78157594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerbool Source::scanDeclaration(const struct tgsi_full_declaration *decl) 78257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 78357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned i; 78457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned sn = TGSI_SEMANTIC_GENERIC; 78557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned si = 0; 78657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const unsigned first = decl->Range.First, last = decl->Range.Last; 78757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 78857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (decl->Declaration.Semantic) { 78957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller sn = decl->Semantic.Name; 79057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller si = decl->Semantic.Index; 79157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 79257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 79357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (decl->Declaration.File) { 79457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_INPUT: 79557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (info->type == PIPE_SHADER_VERTEX) { 79657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller // all vertex attributes are equal 79757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (i = first; i <= last; ++i) { 79857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->in[i].sn = TGSI_SEMANTIC_GENERIC; 79957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->in[i].si = i; 80057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 80157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else { 80257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (i = first; i <= last; ++i, ++si) { 80357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->in[i].id = i; 80457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->in[i].sn = sn; 80557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->in[i].si = si; 80657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (info->type == PIPE_SHADER_FRAGMENT) { 80757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller // translate interpolation mode 8081279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez switch (decl->Interp.Interpolate) { 80957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_INTERPOLATE_CONSTANT: 81057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->in[i].flat = 1; 81157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 812af0ce1dba8219ff8628f1fa61cf93c11a77dab94Christoph Bumiller case TGSI_INTERPOLATE_COLOR: 813af0ce1dba8219ff8628f1fa61cf93c11a77dab94Christoph Bumiller info->in[i].sc = 1; 814af0ce1dba8219ff8628f1fa61cf93c11a77dab94Christoph Bumiller break; 81557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_INTERPOLATE_LINEAR: 816af0ce1dba8219ff8628f1fa61cf93c11a77dab94Christoph Bumiller info->in[i].linear = 1; 81757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 81857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 81957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 82057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 8211279923d72942ee201fcc6ad40d552143f651f03Francisco Jerez if (decl->Interp.Centroid) 82257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->in[i].centroid = 1; 82357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 82457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 82557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 82657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 82757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_OUTPUT: 82857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (i = first; i <= last; ++i, ++si) { 82957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (sn) { 83057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_SEMANTIC_POSITION: 83157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (info->type == PIPE_SHADER_FRAGMENT) 83257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->io.fragDepth = i; 833b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller else 834b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller if (clipVertexOutput < 0) 835b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller clipVertexOutput = i; 83657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 83757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_SEMANTIC_COLOR: 83857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (info->type == PIPE_SHADER_FRAGMENT) 83957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->prop.fp.numColourResults++; 84057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 84157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_SEMANTIC_EDGEFLAG: 84257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->io.edgeFlagOut = i; 84357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 844b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller case TGSI_SEMANTIC_CLIPVERTEX: 845b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller clipVertexOutput = i; 846b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller break; 847b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller case TGSI_SEMANTIC_CLIPDIST: 848b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller info->io.clipDistanceMask |= 849b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller decl->Declaration.UsageMask << (si * 4); 850b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller info->io.genUserClip = -1; 851b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller break; 85257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 85357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 85457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 85557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->out[i].id = i; 85657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->out[i].sn = sn; 85757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->out[i].si = si; 85857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 85957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 86057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_SYSTEM_VALUE: 8617b6881932a71b36dd47f63200c9dbee8e2b9af4fChristoph Bumiller switch (sn) { 8620bbf1659df3adf51784bcb376e681c05f49b6070Christoph Bumiller case TGSI_SEMANTIC_INSTANCEID: 8630bbf1659df3adf51784bcb376e681c05f49b6070Christoph Bumiller info->io.instanceId = first; 8640bbf1659df3adf51784bcb376e681c05f49b6070Christoph Bumiller break; 8657b6881932a71b36dd47f63200c9dbee8e2b9af4fChristoph Bumiller case TGSI_SEMANTIC_VERTEXID: 8667b6881932a71b36dd47f63200c9dbee8e2b9af4fChristoph Bumiller info->io.vertexId = first; 8677b6881932a71b36dd47f63200c9dbee8e2b9af4fChristoph Bumiller break; 8687b6881932a71b36dd47f63200c9dbee8e2b9af4fChristoph Bumiller default: 8697b6881932a71b36dd47f63200c9dbee8e2b9af4fChristoph Bumiller break; 8707b6881932a71b36dd47f63200c9dbee8e2b9af4fChristoph Bumiller } 87157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (i = first; i <= last; ++i, ++si) { 87257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->sv[i].sn = sn; 87357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->sv[i].si = si; 87457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->sv[i].input = inferSysValDirection(sn); 87557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 87657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 877a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez case TGSI_FILE_SAMPLER_VIEW: 87857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (i = first; i <= last; ++i) 879a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez samplerViewTargets[i] = decl->SamplerView.Resource; 88057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 88157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_IMMEDIATE_ARRAY: 88257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 88357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (decl->Dim.Index2D >= immdArrayCount) 88457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller immdArrayCount = decl->Dim.Index2D + 1; 88557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller immdArrays[decl->Dim.Index2D].u32 = (last + 1) << 2; 88657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller int c; 88757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller uint32_t base, count; 88857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (decl->Declaration.UsageMask) { 88957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case 0x1: c = 1; break; 89057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case 0x3: c = 2; break; 89157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 89257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller c = 4; 89357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 89457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 89557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller immdArrays[decl->Dim.Index2D].u32 |= c; 89657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller count = (last + 1) * c; 89757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller base = info->immd.bufSize / 4; 89857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->immd.bufSize = (info->immd.bufSize + count * 4 + 0xf) & ~0xf; 89957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->immd.buf = (uint32_t *)REALLOC(info->immd.buf, base * 4, 90057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->immd.bufSize); 90157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller // NOTE: this assumes array declarations are ordered by Dim.Index2D 90257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (i = 0; i < count; ++i) 90357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->immd.buf[base + i] = decl->ImmediateData.u[i].Uint; 90457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 90557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 90657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_TEMPORARY_ARRAY: 90757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 90857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (decl->Dim.Index2D >= tempArrayCount) 90957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tempArrayCount = decl->Dim.Index2D + 1; 91057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tempArrays[decl->Dim.Index2D].u32 = (last + 1) << 2; 91157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller int c; 91257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller uint32_t count; 91357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (decl->Declaration.UsageMask) { 91457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case 0x1: c = 1; break; 91557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case 0x3: c = 2; break; 91657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 91757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller c = 4; 91857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 91957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 92057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tempArrays[decl->Dim.Index2D].u32 |= c; 92157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller count = (last + 1) * c; 92257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->bin.tlsSpace += (info->bin.tlsSpace + count * 4 + 0xf) & ~0xf; 92357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 92457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 92557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_NULL: 92657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_TEMPORARY: 92757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_ADDRESS: 92857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_CONSTANT: 92957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_IMMEDIATE: 93057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_PREDICATE: 93157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_SAMPLER: 93257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 93357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 93457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller ERROR("unhandled TGSI_FILE %d\n", decl->Declaration.File); 93557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return false; 93657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 93757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return true; 93857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 93957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 94057594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerinline bool Source::isEdgeFlagPassthrough(const Instruction& insn) const 94157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 94257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return insn.getOpcode() == TGSI_OPCODE_MOV && 94357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller insn.getDst(0).getIndex(0) == info->io.edgeFlagOut && 94457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller insn.getSrc(0).getFile() == TGSI_FILE_INPUT; 94557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 94657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 94757594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerbool Source::scanInstruction(const struct tgsi_full_instruction *inst) 94857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 94957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Instruction insn(inst); 95057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 95157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (insn.dstCount()) { 95257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (insn.getDst(0).getFile() == TGSI_FILE_OUTPUT) { 95357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Instruction::DstRegister dst = insn.getDst(0); 95457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 95557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst.isIndirect(0)) 95657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (unsigned i = 0; i < info->numOutputs; ++i) 95757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->out[i].mask = 0xf; 95857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller else 95957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->out[dst.getIndex(0)].mask |= dst.getMask(); 96057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 96199319328d4c249090d3e4a387f6bdc00f711b688Christoph Bumiller if (info->out[dst.getIndex(0)].sn == TGSI_SEMANTIC_PSIZE) 96299319328d4c249090d3e4a387f6bdc00f711b688Christoph Bumiller info->out[dst.getIndex(0)].mask &= 1; 96399319328d4c249090d3e4a387f6bdc00f711b688Christoph Bumiller 96457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (isEdgeFlagPassthrough(insn)) 96557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->io.edgeFlagIn = insn.getSrc(0).getIndex(0); 96657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else 96757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (insn.getDst(0).getFile() == TGSI_FILE_TEMPORARY) { 96857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (insn.getDst(0).isIndirect(0)) 96957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mainTempsInLMem = TRUE; 97057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 97157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 97257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 97357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (unsigned s = 0; s < insn.srcCount(); ++s) { 97457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Instruction::SrcRegister src = insn.getSrc(s); 97557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (src.getFile() == TGSI_FILE_TEMPORARY) 97657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (src.isIndirect(0)) 97757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mainTempsInLMem = TRUE; 97857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (src.getFile() != TGSI_FILE_INPUT) 97957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller continue; 98057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned mask = insn.srcMask(s); 98157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 98257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (src.isIndirect(0)) { 98357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (unsigned i = 0; i < info->numInputs; ++i) 98457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->in[i].mask = 0xf; 98557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else { 98657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (unsigned c = 0; c < 4; ++c) { 98757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!(mask & (1 << c))) 98857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller continue; 98957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller int k = src.getSwizzle(c); 99057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller int i = src.getIndex(0); 99157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (info->in[i].sn != TGSI_SEMANTIC_FOG || k == TGSI_SWIZZLE_X) 99257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (k <= TGSI_SWIZZLE_W) 99357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->in[i].mask |= 1 << k; 99457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 99557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 99657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 99757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return true; 99857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 99957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 100057594065c30feec9376be9b2132659f7d87362eeChristoph Bumillernv50_ir::TexInstruction::Target 100157594065c30feec9376be9b2132659f7d87362eeChristoph BumillerInstruction::getTexture(const tgsi::Source *code, int s) const 100257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 1003a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez switch (getSrc(s).getFile()) { 1004a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez case TGSI_FILE_SAMPLER_VIEW: { 100557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller // XXX: indirect access 100657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned int r = getSrc(s).getIndex(0); 1007a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez assert(r < code->samplerViewCount); 1008a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez return translateTexture(code->samplerViewTargets[r]); 1009a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez } 1010a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez default: 1011a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez return translateTexture(insn->Texture.Texture); 101257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 101357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 101457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 101557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} // namespace tgsi 101657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 101757594065c30feec9376be9b2132659f7d87362eeChristoph Bumillernamespace { 101857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 101957594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerusing namespace nv50_ir; 102057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 102157594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerclass Converter : public BuildUtil 102257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 102357594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerpublic: 102457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Converter(Program *, const tgsi::Source *); 102557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller ~Converter(); 102657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 102757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bool run(); 102857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 102957594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerprivate: 10309bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez struct Subroutine 10319bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez { 10329bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez Subroutine(Function *f) : f(f) { } 10339bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez Function *f; 10349bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez ValueMap values; 10359bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez }; 10369bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez 103757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *getVertexBase(int s); 103856d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez DataArray *getArrayForFile(unsigned file, int idx); 103957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *fetchSrc(int s, int c); 104057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *acquireDst(int d, int c); 104157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void storeDst(int d, int c, Value *); 104257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 104357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *fetchSrc(const tgsi::Instruction::SrcRegister src, int c, Value *ptr); 104457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void storeDst(const tgsi::Instruction::DstRegister dst, int c, 104557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *val, Value *ptr); 104657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 104757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *applySrcMod(Value *, int s, int c); 104857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 104957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Symbol *makeSym(uint file, int fileIndex, int idx, int c, uint32_t addr); 105057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Symbol *srcToSym(tgsi::Instruction::SrcRegister, int c); 105157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Symbol *dstToSym(tgsi::Instruction::DstRegister, int c); 105257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 105357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bool handleInstruction(const struct tgsi_full_instruction *); 105457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void exportOutputs(); 10559bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez inline Subroutine *getSubroutine(unsigned ip); 10569bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez inline Subroutine *getSubroutine(Function *); 105757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller inline bool isEndOfSubroutine(uint ip); 105857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 105957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void loadProjTexCoords(Value *dst[4], Value *src[4], unsigned int mask); 106057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 106157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller // R,S,L,C,Dx,Dy encode TGSI sources for respective values (0xSf for auto) 106257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void setTexRS(TexInstruction *, unsigned int& s, int R, int S); 106357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void handleTEX(Value *dst0[4], int R, int S, int L, int C, int Dx, int Dy); 106457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void handleTXF(Value *dst0[4], int R); 106557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void handleTXQ(Value *dst0[4], enum TexQuery); 106657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void handleLIT(Value *dst0[4]); 106757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void handleUserClipPlanes(); 106857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 106957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *interpolate(tgsi::Instruction::SrcRegister, int c, Value *ptr); 107057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 107157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void insertConvergenceOps(BasicBlock *conv, BasicBlock *fork); 107257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 107357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *buildDot(int dim); 107457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 1075a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez class BindArgumentsPass : public Pass { 1076a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez public: 1077a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez BindArgumentsPass(Converter &conv) : conv(conv) { } 1078a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez 1079a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez private: 1080a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez Converter &conv; 1081a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez Subroutine *sub; 1082a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez 1083a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez template<typename T> inline void 1084a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez updateCallArgs(Instruction *i, void (Instruction::*setArg)(int, Value *), 1085a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez T (Function::*proto)); 1086a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez 1087a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez template<typename T> inline void 1088a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez updatePrototype(BitSet *set, void (Function::*updateSet)(), 1089a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez T (Function::*proto)); 1090a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez 1091a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez protected: 1092a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez bool visit(Function *); 1093a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez bool visit(BasicBlock *bb) { return false; } 1094a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez }; 1095a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez 109657594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerprivate: 109757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const struct tgsi::Source *code; 109857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const struct nv50_ir_prog_info *info; 109957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 11009bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez struct { 11019bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez std::map<unsigned, Subroutine> map; 11029bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez Subroutine *cur; 11039bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez } sub; 11049bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez 110557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller uint ip; // instruction pointer 110657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 110757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tgsi::Instruction tgsi; 110857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 110957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller DataType dstTy; 111057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller DataType srcTy; 111157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 111257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller DataArray tData; // TGSI_FILE_TEMPORARY 111357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller DataArray aData; // TGSI_FILE_ADDRESS 111457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller DataArray pData; // TGSI_FILE_PREDICATE 111557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller DataArray oData; // TGSI_FILE_OUTPUT (if outputs in registers) 111656d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez std::vector<DataArray> lData; // TGSI_FILE_TEMPORARY_ARRAY 111756d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez std::vector<DataArray> iData; // TGSI_FILE_IMMEDIATE_ARRAY 111856d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez 111957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *zero; 112057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *fragCoord[4]; 112157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *clipVtx[4]; 112257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 112357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *vtxBase[5]; // base address of vertex in primitive (for TP/GP) 112457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller uint8_t vtxBaseValid; 112557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 112657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Stack condBBs; // fork BB, then else clause BB 112757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Stack joinBBs; // fork BB, for inserting join ops on ENDIF 112857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Stack loopBBs; // loop headers 112957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Stack breakBBs; // end of / after loop 113057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}; 113157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 113257594065c30feec9376be9b2132659f7d87362eeChristoph BumillerSymbol * 113357594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::srcToSym(tgsi::Instruction::SrcRegister src, int c) 113457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 113557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const int swz = src.getSwizzle(c); 113657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 113757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return makeSym(src.getFile(), 113857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src.is2D() ? src.getIndex(1) : 0, 113957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src.isIndirect(0) ? -1 : src.getIndex(0), swz, 114057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src.getIndex(0) * 16 + swz * 4); 114157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 114257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 114357594065c30feec9376be9b2132659f7d87362eeChristoph BumillerSymbol * 114457594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::dstToSym(tgsi::Instruction::DstRegister dst, int c) 114557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 114657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return makeSym(dst.getFile(), 114757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller dst.is2D() ? dst.getIndex(1) : 0, 114857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller dst.isIndirect(0) ? -1 : dst.getIndex(0), c, 114957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller dst.getIndex(0) * 16 + c * 4); 115057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 115157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 115257594065c30feec9376be9b2132659f7d87362eeChristoph BumillerSymbol * 115357594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::makeSym(uint tgsiFile, int fileIdx, int idx, int c, uint32_t address) 115457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 115557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Symbol *sym = new_Symbol(prog, tgsi::translateFile(tgsiFile)); 115657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 115757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller sym->reg.fileIndex = fileIdx; 115857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 115957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (idx >= 0) { 116057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (sym->reg.file == FILE_SHADER_INPUT) 116157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller sym->setOffset(info->in[idx].slot[c] * 4); 116257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller else 116357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (sym->reg.file == FILE_SHADER_OUTPUT) 116457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller sym->setOffset(info->out[idx].slot[c] * 4); 116557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller else 116657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (sym->reg.file == FILE_SYSTEM_VALUE) 116757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller sym->setSV(tgsi::translateSysVal(info->sv[idx].sn), c); 116857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller else 116957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller sym->setOffset(address); 117057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else { 117157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller sym->setOffset(address); 117257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 117357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return sym; 117457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 117557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 117657594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerstatic inline uint8_t 117757594065c30feec9376be9b2132659f7d87362eeChristoph BumillertranslateInterpMode(const struct nv50_ir_varying *var, operation& op) 117857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 1179af0ce1dba8219ff8628f1fa61cf93c11a77dab94Christoph Bumiller uint8_t mode = NV50_IR_INTERP_PERSPECTIVE; 118057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 118157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (var->flat) 118257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mode = NV50_IR_INTERP_FLAT; 118357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller else 118457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (var->linear) 118557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mode = NV50_IR_INTERP_LINEAR; 118657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller else 1187af0ce1dba8219ff8628f1fa61cf93c11a77dab94Christoph Bumiller if (var->sc) 1188af0ce1dba8219ff8628f1fa61cf93c11a77dab94Christoph Bumiller mode = NV50_IR_INTERP_SC; 118957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 1190af0ce1dba8219ff8628f1fa61cf93c11a77dab94Christoph Bumiller op = (mode == NV50_IR_INTERP_PERSPECTIVE || mode == NV50_IR_INTERP_SC) 1191af0ce1dba8219ff8628f1fa61cf93c11a77dab94Christoph Bumiller ? OP_PINTERP : OP_LINTERP; 119257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 119357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (var->centroid) 119457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mode |= NV50_IR_INTERP_CENTROID; 119557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 119657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return mode; 119757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 119857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 119957594065c30feec9376be9b2132659f7d87362eeChristoph BumillerValue * 120057594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::interpolate(tgsi::Instruction::SrcRegister src, int c, Value *ptr) 120157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 120257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller operation op; 120357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 120457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller // XXX: no way to know interpolation mode if we don't know what's accessed 120557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const uint8_t mode = translateInterpMode(&info->in[ptr ? 0 : 120657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src.getIndex(0)], op); 120757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 120857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Instruction *insn = new_Instruction(func, op, TYPE_F32); 120957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 121057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller insn->setDef(0, getScratch()); 121157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller insn->setSrc(0, srcToSym(src, c)); 121257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (op == OP_PINTERP) 121357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller insn->setSrc(1, fragCoord[3]); 121457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (ptr) 121557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller insn->setIndirect(0, 0, ptr); 121657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 121757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller insn->setInterpolate(mode); 121857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 121957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bb->insertTail(insn); 122057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return insn->getDef(0); 122157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 122257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 122357594065c30feec9376be9b2132659f7d87362eeChristoph BumillerValue * 122457594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::applySrcMod(Value *val, int s, int c) 122557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 122657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Modifier m = tgsi.getSrc(s).getMod(c); 122757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller DataType ty = tgsi.inferSrcType(); 122857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 122957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (m & Modifier(NV50_IR_MOD_ABS)) 123057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val = mkOp1v(OP_ABS, ty, getScratch(), val); 123157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 123257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (m & Modifier(NV50_IR_MOD_NEG)) 123357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val = mkOp1v(OP_NEG, ty, getScratch(), val); 123457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 123557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return val; 123657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 123757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 123857594065c30feec9376be9b2132659f7d87362eeChristoph BumillerValue * 123957594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::getVertexBase(int s) 124057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 124157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(s < 5); 124257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!(vtxBaseValid & (1 << s))) { 124357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const int index = tgsi.getSrc(s).getIndex(1); 124457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *rel = NULL; 124557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (tgsi.getSrc(s).isIndirect(1)) 124657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller rel = fetchSrc(tgsi.getSrc(s).getIndirect(1), 0, NULL); 124757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller vtxBaseValid |= 1 << s; 124857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller vtxBase[s] = mkOp2v(OP_PFETCH, TYPE_U32, getSSA(), mkImm(index), rel); 124957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 125057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return vtxBase[s]; 125157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 125257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 125357594065c30feec9376be9b2132659f7d87362eeChristoph BumillerValue * 125457594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::fetchSrc(int s, int c) 125557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 125657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *res; 125757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *ptr = NULL, *dimRel = NULL; 125857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 125957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tgsi::Instruction::SrcRegister src = tgsi.getSrc(s); 126057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 126157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (src.isIndirect(0)) 126257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller ptr = fetchSrc(src.getIndirect(0), 0, NULL); 126357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 126457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (src.is2D()) { 126557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (src.getFile()) { 126657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_INPUT: 126757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller dimRel = getVertexBase(s); 126857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 126957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_CONSTANT: 127057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller // on NVC0, this is valid and c{I+J}[k] == cI[(J << 16) + k] 127157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (src.isIndirect(1)) 127257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller dimRel = fetchSrc(src.getIndirect(1), 0, 0); 127357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 127457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 127557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 127657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 127757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 127857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 127957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller res = fetchSrc(src, c, ptr); 128057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 128157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dimRel) 128257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller res->getInsn()->setIndirect(0, 1, dimRel); 128357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 128457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return applySrcMod(res, s, c); 128557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 128657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 128756d40aa51b34b77791cc3a49d7e86473a7459b72Francisco JerezConverter::DataArray * 128856d40aa51b34b77791cc3a49d7e86473a7459b72Francisco JerezConverter::getArrayForFile(unsigned file, int idx) 128957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 129056d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez switch (file) { 129157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_TEMPORARY: 129256d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez return &tData; 129357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_PREDICATE: 129456d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez return &pData; 129557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_ADDRESS: 129656d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez return &aData; 129757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_TEMPORARY_ARRAY: 129856d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez assert(idx < code->tempArrayCount); 129956d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez return &lData[idx]; 130057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_IMMEDIATE_ARRAY: 130156d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez assert(idx < code->immdArrayCount); 130256d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez return &iData[idx]; 130356d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez case TGSI_FILE_OUTPUT: 130456d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez assert(prog->getType() == Program::TYPE_FRAGMENT); 130556d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez return &oData; 130656d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez default: 130756d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez assert(!"invalid/unhandled TGSI source file"); 130856d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez return NULL; 130956d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez } 131056d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez} 131157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 131256d40aa51b34b77791cc3a49d7e86473a7459b72Francisco JerezValue * 131356d40aa51b34b77791cc3a49d7e86473a7459b72Francisco JerezConverter::fetchSrc(tgsi::Instruction::SrcRegister src, int c, Value *ptr) 131456d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez{ 131556d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez const int idx2d = src.is2D() ? src.getIndex(1) : 0; 131656d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez const int idx = src.getIndex(0); 131756d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez const int swz = src.getSwizzle(c); 131856d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez 131956d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez switch (src.getFile()) { 132057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_IMMEDIATE: 132157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(!ptr); 132257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return loadImm(NULL, info->immd.data[idx * 4 + swz]); 132357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_CONSTANT: 132457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return mkLoad(TYPE_U32, srcToSym(src, c), ptr); 132557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_INPUT: 132657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (prog->getType() == Program::TYPE_FRAGMENT) { 132757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller // don't load masked inputs, won't be assigned a slot 132857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!ptr && !(info->in[idx].mask & (1 << swz))) 132957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return loadImm(NULL, swz == TGSI_SWIZZLE_W ? 1.0f : 0.0f); 133052c8c52b222e1fdb4c1f4ca3dedde9cd7b9c321fChristoph Bumiller if (!ptr && info->in[idx].sn == TGSI_SEMANTIC_FACE) 133152c8c52b222e1fdb4c1f4ca3dedde9cd7b9c321fChristoph Bumiller return mkOp1v(OP_RDSV, TYPE_F32, getSSA(), mkSysVal(SV_FACE, 0)); 133257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return interpolate(src, c, ptr); 133357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 133457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return mkLoad(TYPE_U32, srcToSym(src, c), ptr); 133556d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez case TGSI_FILE_OUTPUT: 133656d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez assert(!"load from output file"); 133756d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez return NULL; 133857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_FILE_SYSTEM_VALUE: 133957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(!ptr); 134057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return mkOp1v(OP_RDSV, TYPE_U32, getSSA(), srcToSym(src, c)); 134157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 13429bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez return getArrayForFile(src.getFile(), idx2d)->load( 13439bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez sub.cur->values, idx, swz, ptr); 134457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 134557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 134657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 134757594065c30feec9376be9b2132659f7d87362eeChristoph BumillerValue * 134857594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::acquireDst(int d, int c) 134957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 135057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const tgsi::Instruction::DstRegister dst = tgsi.getDst(d); 135156d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez const unsigned f = dst.getFile(); 135257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const int idx = dst.getIndex(0); 135356d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez const int idx2d = dst.is2D() ? dst.getIndex(1) : 0; 135457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 135556d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez if (dst.isMasked(c) || f == TGSI_FILE_RESOURCE) 135656d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez return NULL; 135757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 135856d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez if (dst.isIndirect(0) || 135956d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez f == TGSI_FILE_TEMPORARY_ARRAY || 136056d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez f == TGSI_FILE_SYSTEM_VALUE || 136156d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez (f == TGSI_FILE_OUTPUT && prog->getType() != Program::TYPE_FRAGMENT)) 136257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return getScratch(); 136357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 13649bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez return getArrayForFile(f, idx2d)-> acquire(sub.cur->values, idx, c); 136557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 136657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 136757594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 136857594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::storeDst(int d, int c, Value *val) 136957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 137057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const tgsi::Instruction::DstRegister dst = tgsi.getDst(d); 137157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 137257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (tgsi.getSaturate()) { 137357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_SAT_NONE: 137457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 137557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_SAT_ZERO_ONE: 137657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(OP_SAT, dstTy, val, val); 137757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 137857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_SAT_MINUS_PLUS_ONE: 137957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_MAX, dstTy, val, val, mkImm(-1.0f)); 138057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_MIN, dstTy, val, val, mkImm(+1.0f)); 138157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 138257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 138357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(!"invalid saturation mode"); 138457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 138557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 138657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 138757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *ptr = dst.isIndirect(0) ? 138857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller fetchSrc(dst.getIndirect(0), 0, NULL) : NULL; 138957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 1390b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller if (info->io.genUserClip > 0 && 139157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller dst.getFile() == TGSI_FILE_OUTPUT && 1392b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller !dst.isIndirect(0) && dst.getIndex(0) == code->clipVertexOutput) { 139357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkMov(clipVtx[c], val); 139457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val = clipVtx[c]; 139557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 139657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 139757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller storeDst(dst, c, val, ptr); 139857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 139957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 140057594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 140157594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::storeDst(const tgsi::Instruction::DstRegister dst, int c, 140257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *val, Value *ptr) 140357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 140456d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez const unsigned f = dst.getFile(); 140557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const int idx = dst.getIndex(0); 140656d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez const int idx2d = dst.is2D() ? dst.getIndex(1) : 0; 140757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 140856d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez if (f == TGSI_FILE_SYSTEM_VALUE) { 140957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(!ptr); 141057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_WRSV, TYPE_U32, NULL, dstToSym(dst, c), val); 141156d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez } else 141256d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez if (f == TGSI_FILE_OUTPUT && prog->getType() != Program::TYPE_FRAGMENT) { 141399319328d4c249090d3e4a387f6bdc00f711b688Christoph Bumiller if (ptr || (info->out[idx].mask & (1 << c))) 141499319328d4c249090d3e4a387f6bdc00f711b688Christoph Bumiller mkStore(OP_EXPORT, TYPE_U32, dstToSym(dst, c), ptr, val); 141556d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez } else 141656d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez if (f == TGSI_FILE_TEMPORARY || 141756d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez f == TGSI_FILE_TEMPORARY_ARRAY || 141856d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez f == TGSI_FILE_PREDICATE || 141956d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez f == TGSI_FILE_ADDRESS || 142056d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez f == TGSI_FILE_OUTPUT) { 14219bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez getArrayForFile(f, idx2d)->store(sub.cur->values, idx, c, ptr, val); 142256d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez } else { 142357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(!"invalid dst file"); 142457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 142557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 142657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 142757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#define FOR_EACH_DST_ENABLED_CHANNEL(d, chan, inst) \ 142857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (chan = 0; chan < 4; ++chan) \ 142957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!inst.getDst(d).isMasked(chan)) 143057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 143157594065c30feec9376be9b2132659f7d87362eeChristoph BumillerValue * 143257594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::buildDot(int dim) 143357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 143457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(dim > 0); 143557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 143657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *src0 = fetchSrc(0, 0), *src1 = fetchSrc(1, 0); 143757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *dotp = getScratch(); 143857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 143957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_MUL, TYPE_F32, dotp, src0, src1); 144057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 144157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (int c = 1; c < dim; ++c) { 144257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src0 = fetchSrc(0, c); 144357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src1 = fetchSrc(1, c); 144457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp3(OP_MAD, TYPE_F32, dotp, src0, src1, dotp); 144557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 144657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return dotp; 144757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 144857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 144957594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 145057594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::insertConvergenceOps(BasicBlock *conv, BasicBlock *fork) 145157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 145257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FlowInstruction *join = new_FlowInstruction(func, OP_JOIN, NULL); 145357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller join->fixed = 1; 145457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller conv->insertHead(join); 145557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 145657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller fork->joinAt = new_FlowInstruction(func, OP_JOINAT, conv); 145757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller fork->insertBefore(fork->getExit(), fork->joinAt); 145857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 145957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 146057594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 146157594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::setTexRS(TexInstruction *tex, unsigned int& s, int R, int S) 146257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 146357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned rIdx = 0, sIdx = 0; 146457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 146557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (R >= 0) 146657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller rIdx = tgsi.getSrc(R).getIndex(0); 146757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (S >= 0) 146857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller sIdx = tgsi.getSrc(S).getIndex(0); 146957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 147057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tex->setTexture(tgsi.getTexture(code, R), rIdx, sIdx); 147157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 147257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (tgsi.getSrc(R).isIndirect(0)) { 147357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tex->tex.rIndirectSrc = s; 147457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tex->setSrc(s++, fetchSrc(tgsi.getSrc(R).getIndirect(0), 0, NULL)); 147557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 147657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (S >= 0 && tgsi.getSrc(S).isIndirect(0)) { 147757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tex->tex.sIndirectSrc = s; 147857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tex->setSrc(s++, fetchSrc(tgsi.getSrc(S).getIndirect(0), 0, NULL)); 147957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 148057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 148157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 148257594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 148357594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::handleTXQ(Value *dst0[4], enum TexQuery query) 148457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 148557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller TexInstruction *tex = new_TexInstruction(func, OP_TXQ); 148657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tex->tex.query = query; 148757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned int c, d; 148857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 148957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (d = 0, c = 0; c < 4; ++c) { 149057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!dst0[c]) 149157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller continue; 149257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tex->tex.mask |= 1 << c; 149357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tex->setDef(d++, dst0[c]); 149457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 149557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tex->setSrc((c = 0), fetchSrc(0, 0)); // mip level 149657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 149757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller setTexRS(tex, c, 1, -1); 149857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 149957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bb->insertTail(tex); 150057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 150157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 150257594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 150357594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::loadProjTexCoords(Value *dst[4], Value *src[4], unsigned int mask) 150457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 150557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *proj = fetchSrc(0, 3); 150657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Instruction *insn = proj->getUniqueInsn(); 150757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller int c; 150857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 150957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (insn->op == OP_PINTERP) { 1510a05e6a3fa28168d58a13cfb07f7a664e84b925aeFrancisco Jerez bb->insertTail(insn = cloneForward(func, insn)); 151157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller insn->op = OP_LINTERP; 151257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller insn->setInterpolate(NV50_IR_INTERP_LINEAR | insn->getSampleMode()); 151357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller insn->setSrc(1, NULL); 151457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller proj = insn->getDef(0); 151557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 151657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller proj = mkOp1v(OP_RCP, TYPE_F32, getSSA(), proj); 151757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 151857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (c = 0; c < 4; ++c) { 151957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!(mask & (1 << c))) 152057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller continue; 152157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if ((insn = src[c]->getUniqueInsn())->op != OP_PINTERP) 152257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller continue; 152357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mask &= ~(1 << c); 152457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 1525a05e6a3fa28168d58a13cfb07f7a664e84b925aeFrancisco Jerez bb->insertTail(insn = cloneForward(func, insn)); 152657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller insn->setInterpolate(NV50_IR_INTERP_PERSPECTIVE | insn->getSampleMode()); 152757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller insn->setSrc(1, proj); 152857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller dst[c] = insn->getDef(0); 152957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 153057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!mask) 153157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return; 153257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 153357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller proj = mkOp1v(OP_RCP, TYPE_F32, getSSA(), fetchSrc(0, 3)); 153457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 153557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (c = 0; c < 4; ++c) 153657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (mask & (1 << c)) 153757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller dst[c] = mkOp2v(OP_MUL, TYPE_F32, getSSA(), src[c], proj); 153857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 153957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 154057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller// order of nv50 ir sources: x y z layer lod/bias shadow 154157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller// order of TGSI TEX sources: x y z layer shadow lod/bias 154257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller// lowering will finally set the hw specific order (like array first on nvc0) 154357594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 154457594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::handleTEX(Value *dst[4], int R, int S, int L, int C, int Dx, int Dy) 154557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 154657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *val; 154757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *arg[4], *src[8]; 154857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *lod = NULL, *shd = NULL; 154957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned int s, c, d; 155057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller TexInstruction *texi = new_TexInstruction(func, tgsi.getOP()); 155157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 155257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller TexInstruction::Target tgt = tgsi.getTexture(code, R); 155357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 155457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (s = 0; s < tgt.getArgCount(); ++s) 155557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller arg[s] = src[s] = fetchSrc(0, s); 155657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 155757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (texi->op == OP_TXL || texi->op == OP_TXB) 155857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller lod = fetchSrc(L >> 4, L & 3); 155957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 156057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (C == 0x0f) 156157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller C = 0x00 | MAX2(tgt.getArgCount(), 2); // guess DC src 156257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 156357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (tgt.isShadow()) 156457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller shd = fetchSrc(C >> 4, C & 3); 156557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 156657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (texi->op == OP_TXD) { 156757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (c = 0; c < tgt.getDim(); ++c) { 15689362d4bc0a03860ec386156cf499e855a9c2d2a5Christoph Bumiller texi->dPdx[c].set(fetchSrc(Dx >> 4, (Dx & 3) + c)); 15699362d4bc0a03860ec386156cf499e855a9c2d2a5Christoph Bumiller texi->dPdy[c].set(fetchSrc(Dy >> 4, (Dy & 3) + c)); 157057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 157157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 157257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 157357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller // cube textures don't care about projection value, it's divided out 157457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (tgsi.getOpcode() == TGSI_OPCODE_TXP && !tgt.isCube() && !tgt.isArray()) { 157557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned int n = tgt.getDim(); 157657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (shd) { 157757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller arg[n] = shd; 157857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller ++n; 157957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(tgt.getDim() == tgt.getArgCount()); 158057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 158157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller loadProjTexCoords(src, arg, (1 << n) - 1); 158257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (shd) 158357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller shd = src[n - 1]; 158457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 158557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 158657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (tgt.isCube()) { 158757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (c = 0; c < 3; ++c) 158857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src[c] = mkOp1v(OP_ABS, TYPE_F32, getSSA(), arg[c]); 158957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val = getScratch(); 159057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_MAX, TYPE_F32, val, src[0], src[1]); 159157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_MAX, TYPE_F32, val, src[2], val); 159257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(OP_RCP, TYPE_F32, val, val); 159357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (c = 0; c < 3; ++c) 159457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src[c] = mkOp2v(OP_MUL, TYPE_F32, getSSA(), arg[c], val); 159557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 159657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 159757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (c = 0, d = 0; c < 4; ++c) { 159857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst[c]) { 159957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller texi->setDef(d++, dst[c]); 160057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller texi->tex.mask |= 1 << c; 160157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else { 160257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller // NOTE: maybe hook up def too, for CSE 160357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 160457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 160557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (s = 0; s < tgt.getArgCount(); ++s) 160657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller texi->setSrc(s, src[s]); 160757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (lod) 160857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller texi->setSrc(s++, lod); 160957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (shd) 161057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller texi->setSrc(s++, shd); 161157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 161257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller setTexRS(texi, s, R, S); 161357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 161457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (tgsi.getOpcode() == TGSI_OPCODE_SAMPLE_C_LZ) 161557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller texi->tex.levelZero = true; 161657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 161757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bb->insertTail(texi); 161857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 161957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 162057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller// 1st source: xyz = coordinates, w = lod 162157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller// 2nd source: offset 162257594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 162357594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::handleTXF(Value *dst[4], int R) 162457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 162557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller TexInstruction *texi = new_TexInstruction(func, tgsi.getOP()); 162657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned int c, d, s; 162757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 162857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller texi->tex.target = tgsi.getTexture(code, R); 162957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 163057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (c = 0, d = 0; c < 4; ++c) { 163157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst[c]) { 163257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller texi->setDef(d++, dst[c]); 163357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller texi->tex.mask |= 1 << c; 163457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 163557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 163657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (c = 0; c < texi->tex.target.getArgCount(); ++c) 163757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller texi->setSrc(c, fetchSrc(0, c)); 163857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller texi->setSrc(c++, fetchSrc(0, 3)); // lod 163957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 164057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller setTexRS(texi, c, R, -1); 164157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 164257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (s = 0; s < tgsi.getNumTexOffsets(); ++s) { 164357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (c = 0; c < 3; ++c) { 164457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller texi->tex.offset[s][c] = tgsi.getTexOffset(s).getValueU32(c, info); 164557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (texi->tex.offset[s][c]) 164657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller texi->tex.useOffsets = s + 1; 164757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 164857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 164957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 165057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bb->insertTail(texi); 165157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 165257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 165357594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 165457594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::handleLIT(Value *dst0[4]) 165557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 165657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *val0 = NULL; 165757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned int mask = tgsi.getDst(0).getMask(); 165857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 165957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (mask & (1 << 0)) 166057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller loadImm(dst0[0], 1.0f); 166157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 166257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (mask & (1 << 3)) 166357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller loadImm(dst0[3], 1.0f); 166457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 166557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (mask & (3 << 1)) { 166657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val0 = getScratch(); 166757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_MAX, TYPE_F32, val0, fetchSrc(0, 0), zero); 166857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (mask & (1 << 1)) 166957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkMov(dst0[1], val0); 167057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 167157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 167257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (mask & (1 << 2)) { 167357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *src1 = fetchSrc(0, 1), *src3 = fetchSrc(0, 3); 167457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *val1 = getScratch(), *val3 = getScratch(); 167557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 167657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *pos128 = loadImm(NULL, +127.999999f); 167757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *neg128 = loadImm(NULL, -127.999999f); 167857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 167957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_MAX, TYPE_F32, val1, src1, zero); 168057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_MAX, TYPE_F32, val3, src3, neg128); 168157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_MIN, TYPE_F32, val3, val3, pos128); 168257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_POW, TYPE_F32, val3, val1, val3); 168357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 168457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkCmp(OP_SLCT, CC_GT, TYPE_F32, dst0[2], val3, zero, val0); 168557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 168657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 168757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 16889bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco JerezConverter::Subroutine * 16899bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco JerezConverter::getSubroutine(unsigned ip) 16909bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez{ 16919bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez std::map<unsigned, Subroutine>::iterator it = sub.map.find(ip); 16929bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez 16939bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez if (it == sub.map.end()) 16949bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez it = sub.map.insert(std::make_pair( 16959bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez ip, Subroutine(new Function(prog, "SUB", ip)))).first; 16969bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez 16979bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez return &it->second; 16989bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez} 16999bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez 17009bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco JerezConverter::Subroutine * 17019bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco JerezConverter::getSubroutine(Function *f) 17029bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez{ 17039bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez unsigned ip = f->getLabel(); 17049bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez std::map<unsigned, Subroutine>::iterator it = sub.map.find(ip); 17059bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez 17069bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez if (it == sub.map.end()) 17079bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez it = sub.map.insert(std::make_pair(ip, Subroutine(f))).first; 17089bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez 17099bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez return &it->second; 17109bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez} 17119bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez 171257594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerbool 171357594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::isEndOfSubroutine(uint ip) 171457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 171557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(ip < code->scan.num_instructions); 171657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tgsi::Instruction insn(&code->insns[ip]); 171757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return (insn.getOpcode() == TGSI_OPCODE_END || 171857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller insn.getOpcode() == TGSI_OPCODE_ENDSUB || 171957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller // does END occur at end of main or the very end ? 172057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller insn.getOpcode() == TGSI_OPCODE_BGNSUB); 172157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 172257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 172357594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerbool 172457594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::handleInstruction(const struct tgsi_full_instruction *insn) 172557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 172657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *dst0[4], *rDst0[4]; 172757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *src0, *src1, *src2; 172857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *val0, *val1; 172957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller int c; 173057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 173157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tgsi = tgsi::Instruction(insn); 173257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 173357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bool useScratchDst = tgsi.checkDstSrcAliasing(); 173457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 173557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller operation op = tgsi.getOP(); 173657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller dstTy = tgsi.inferDstType(); 173757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller srcTy = tgsi.inferSrcType(); 173857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 173957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller unsigned int mask = tgsi.dstCount() ? tgsi.getDst(0).getMask() : 0; 174057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 174157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (tgsi.dstCount()) { 174257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (c = 0; c < 4; ++c) { 174357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller rDst0[c] = acquireDst(0, c); 174457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller dst0[c] = (useScratchDst && rDst0[c]) ? getScratch() : rDst0[c]; 174557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 174657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 174757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 174857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (tgsi.getOpcode()) { 174957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_ADD: 175057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_UADD: 175157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_AND: 175257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_DIV: 175357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_IDIV: 175457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_UDIV: 175557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_MAX: 175657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_MIN: 175757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_IMAX: 175857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_IMIN: 175957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_UMAX: 176057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_UMIN: 176157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_MOD: 176257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_UMOD: 176357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_MUL: 176457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_UMUL: 176557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_OR: 176657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_POW: 176757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SHL: 176857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_ISHR: 176957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_USHR: 177057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SUB: 177157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_XOR: 177257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) { 177357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src0 = fetchSrc(0, c); 177457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src1 = fetchSrc(1, c); 177557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(op, dstTy, dst0[c], src0, src1); 177657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 177757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 177857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_MAD: 177957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_UMAD: 178057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SAD: 178157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) { 178257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src0 = fetchSrc(0, c); 178357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src1 = fetchSrc(1, c); 178457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src2 = fetchSrc(2, c); 178557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp3(op, dstTy, dst0[c], src0, src1, src2); 178657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 178757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 178857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_MOV: 178957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_ABS: 179057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_CEIL: 179157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_FLR: 179257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_TRUNC: 179357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_RCP: 1794be1ae976a41de2803f14341580c3c98c58a80fe3Christoph Bumiller case TGSI_OPCODE_IABS: 179557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_INEG: 179657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_NOT: 179757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_DDX: 179857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_DDY: 179957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) 180057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(op, dstTy, dst0[c], fetchSrc(0, c)); 180157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 180257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_RSQ: 180357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src0 = fetchSrc(0, 0); 180457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val0 = getScratch(); 180557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(OP_ABS, TYPE_F32, val0, src0); 180657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(OP_RSQ, TYPE_F32, val0, val0); 180757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) 180857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkMov(dst0[c], val0); 180957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 181057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_ARL: 181157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) { 181257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src0 = fetchSrc(0, c); 181357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkCvt(OP_CVT, TYPE_S32, dst0[c], TYPE_F32, src0)->rnd = ROUND_M; 181457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_SHL, TYPE_U32, dst0[c], dst0[c], mkImm(4)); 181557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 181657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 181757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_UARL: 181857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) 181957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_SHL, TYPE_U32, dst0[c], fetchSrc(0, c), mkImm(4)); 182057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 182157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_EX2: 182257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_LG2: 182357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val0 = mkOp1(op, TYPE_F32, getScratch(), fetchSrc(0, 0))->getDef(0); 182457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) 182557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(OP_MOV, TYPE_F32, dst0[c], val0); 182657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 182757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_COS: 182857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SIN: 182957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val0 = getScratch(); 183057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (mask & 7) { 183157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(OP_PRESIN, TYPE_F32, val0, fetchSrc(0, 0)); 183257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(op, TYPE_F32, val0, val0); 183357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (c = 0; c < 3; ++c) 183457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst0[c]) 183557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkMov(dst0[c], val0); 183657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 183757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst0[3]) { 183857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(OP_PRESIN, TYPE_F32, val0, fetchSrc(0, 3)); 183957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(op, TYPE_F32, dst0[3], val0); 184057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 184157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 184257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SCS: 184357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (mask & 3) { 184457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val0 = mkOp1v(OP_PRESIN, TYPE_F32, getSSA(), fetchSrc(0, 0)); 184557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst0[0]) 184657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(OP_COS, TYPE_F32, dst0[0], val0); 184757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst0[1]) 184857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(OP_SIN, TYPE_F32, dst0[1], val0); 184957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 185057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst0[2]) 185157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller loadImm(dst0[2], 0.0f); 185257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst0[3]) 185357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller loadImm(dst0[3], 1.0f); 185457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 185557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_EXP: 185657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src0 = fetchSrc(0, 0); 185757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val0 = mkOp1v(OP_FLOOR, TYPE_F32, getSSA(), src0); 185857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst0[1]) 185957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_SUB, TYPE_F32, dst0[1], src0, val0); 186057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst0[0]) 186157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(OP_EX2, TYPE_F32, dst0[0], val0); 186257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst0[2]) 186357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(OP_EX2, TYPE_F32, dst0[2], src0); 186457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst0[3]) 186557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller loadImm(dst0[3], 1.0f); 186657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 186757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_LOG: 186857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src0 = mkOp1v(OP_ABS, TYPE_F32, getSSA(), fetchSrc(0, 0)); 186957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val0 = mkOp1v(OP_LG2, TYPE_F32, dst0[2] ? dst0[2] : getSSA(), src0); 187057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst0[0] || dst0[1]) 187157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val1 = mkOp1v(OP_FLOOR, TYPE_F32, dst0[0] ? dst0[0] : getSSA(), val0); 187257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst0[1]) { 187357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(OP_EX2, TYPE_F32, dst0[1], val1); 187457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(OP_RCP, TYPE_F32, dst0[1], dst0[1]); 187557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_MUL, TYPE_F32, dst0[1], dst0[1], src0); 187657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 187757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst0[3]) 187857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller loadImm(dst0[3], 1.0f); 187957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 188057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_DP2: 188157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val0 = buildDot(2); 188257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) 188357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkMov(dst0[c], val0); 188457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 188557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_DP3: 188657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val0 = buildDot(3); 188757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) 188857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkMov(dst0[c], val0); 188957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 189057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_DP4: 189157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val0 = buildDot(4); 189257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) 189357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkMov(dst0[c], val0); 189457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 189557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_DPH: 189657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val0 = buildDot(3); 189757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src1 = fetchSrc(1, 3); 189857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_ADD, TYPE_F32, val0, val0, src1); 189957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) 190057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkMov(dst0[c], val0); 190157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 190257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_DST: 190357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst0[0]) 190457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller loadImm(dst0[0], 1.0f); 190557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst0[1]) { 190657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src0 = fetchSrc(0, 1); 190757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src1 = fetchSrc(1, 1); 190857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_MUL, TYPE_F32, dst0[1], src0, src1); 190957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 191057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst0[2]) 191157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkMov(dst0[2], fetchSrc(0, 2)); 191257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst0[3]) 191357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkMov(dst0[3], fetchSrc(1, 3)); 191457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 191557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_LRP: 191657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) { 191757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src0 = fetchSrc(0, c); 191857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src1 = fetchSrc(1, c); 191957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src2 = fetchSrc(2, c); 192057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp3(OP_MAD, TYPE_F32, dst0[c], 192157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2v(OP_SUB, TYPE_F32, getSSA(), src1, src2), src0, src2); 192257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 192357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 192457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_LIT: 192557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller handleLIT(dst0); 192657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 192757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_XPD: 192857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) { 192957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (c < 3) { 193057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val0 = getSSA(); 193157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src0 = fetchSrc(1, (c + 1) % 3); 193257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src1 = fetchSrc(0, (c + 2) % 3); 193357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_MUL, TYPE_F32, val0, src0, src1); 193457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(OP_NEG, TYPE_F32, val0, val0); 193557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 193657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src0 = fetchSrc(0, (c + 1) % 3); 193757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src1 = fetchSrc(1, (c + 2) % 3); 193857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp3(OP_MAD, TYPE_F32, dst0[c], src0, src1, val0); 193957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else { 194057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller loadImm(dst0[c], 1.0f); 194157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 194257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 194357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 1944b424bf69dfd78c64e065b8ba59d9b40a8f4fecd6Christoph Bumiller case TGSI_OPCODE_ISSG: 194557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SSG: 194657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) { 194757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src0 = fetchSrc(0, c); 194857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val0 = getScratch(); 194957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val1 = getScratch(); 1950b424bf69dfd78c64e065b8ba59d9b40a8f4fecd6Christoph Bumiller mkCmp(OP_SET, CC_GT, srcTy, val0, src0, zero); 1951b424bf69dfd78c64e065b8ba59d9b40a8f4fecd6Christoph Bumiller mkCmp(OP_SET, CC_LT, srcTy, val1, src0, zero); 1952b424bf69dfd78c64e065b8ba59d9b40a8f4fecd6Christoph Bumiller if (srcTy == TYPE_F32) 1953b424bf69dfd78c64e065b8ba59d9b40a8f4fecd6Christoph Bumiller mkOp2(OP_SUB, TYPE_F32, dst0[c], val0, val1); 1954b424bf69dfd78c64e065b8ba59d9b40a8f4fecd6Christoph Bumiller else 1955b424bf69dfd78c64e065b8ba59d9b40a8f4fecd6Christoph Bumiller mkOp2(OP_SUB, TYPE_S32, dst0[c], val1, val0); 195657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 195757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 195857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_UCMP: 195957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_CMP: 196057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) { 196157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src0 = fetchSrc(0, c); 196257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src1 = fetchSrc(1, c); 196357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src2 = fetchSrc(2, c); 196457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (src1 == src2) 196557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkMov(dst0[c], src1); 196657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller else 196757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkCmp(OP_SLCT, (srcTy == TYPE_F32) ? CC_LT : CC_NE, 196857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller srcTy, dst0[c], src1, src2, src0); 196957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 197057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 197157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_FRC: 197257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) { 197357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src0 = fetchSrc(0, c); 197457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val0 = getScratch(); 197557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(OP_FLOOR, TYPE_F32, val0, src0); 197657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_SUB, TYPE_F32, dst0[c], src0, val0); 197757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 197857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 197957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_ROUND: 198057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) 198157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkCvt(OP_CVT, TYPE_F32, dst0[c], TYPE_F32, fetchSrc(0, c)) 198257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller ->rnd = ROUND_NI; 198357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 198457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_CLAMP: 198557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) { 198657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src0 = fetchSrc(0, c); 198757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src1 = fetchSrc(1, c); 198857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src2 = fetchSrc(2, c); 198957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val0 = getScratch(); 199057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_MIN, TYPE_F32, val0, src0, src1); 199157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp2(OP_MAX, TYPE_F32, dst0[c], val0, src2); 199257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 199357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 199457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SLT: 199557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SGE: 199657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SEQ: 199757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SFL: 199857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SGT: 199957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SLE: 200057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SNE: 200157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_STR: 200257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_ISGE: 200357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_ISLT: 200457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_USEQ: 200557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_USGE: 200657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_USLT: 200757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_USNE: 200857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) { 200957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src0 = fetchSrc(0, c); 201057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src1 = fetchSrc(1, c); 201157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkCmp(op, tgsi.getSetCond(), dstTy, dst0[c], src0, src1); 201257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 201357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 201457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_KIL: 201557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller val0 = new_LValue(func, FILE_PREDICATE); 201657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (c = 0; c < 4; ++c) { 201757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkCmp(OP_SET, CC_LT, TYPE_F32, val0, fetchSrc(0, c), zero); 201857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp(OP_DISCARD, TYPE_NONE, NULL)->setPredicate(CC_P, val0); 201957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 202057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 202157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_KILP: 202257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp(OP_DISCARD, TYPE_NONE, NULL); 202357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 202457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_TEX: 202557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_TXB: 202657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_TXL: 202757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_TXP: 202857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller // R S L C Dx Dy 202957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller handleTEX(dst0, 1, 1, 0x03, 0x0f, 0x00, 0x00); 203057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 203157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_TXD: 203257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller handleTEX(dst0, 3, 3, 0x03, 0x0f, 0x10, 0x20); 203357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 203457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SAMPLE: 203557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SAMPLE_B: 203657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SAMPLE_D: 203757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SAMPLE_L: 203857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SAMPLE_C: 203957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SAMPLE_C_LZ: 204057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller handleTEX(dst0, 1, 2, 0x30, 0x31, 0x40, 0x50); 204157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 204257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_TXF: 204357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_LOAD: 204457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller handleTXF(dst0, 1); 204557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 204657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_TXQ: 2047a5f44cc8c2ce0916809ce5da5a2490ad000ef099Francisco Jerez case TGSI_OPCODE_SVIEWINFO: 204857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller handleTXQ(dst0, TXQ_DIMS); 204957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 205057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_F2I: 205157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_F2U: 205257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) 205357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkCvt(OP_CVT, dstTy, dst0[c], srcTy, fetchSrc(0, c))->rnd = ROUND_Z; 205457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 205557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_I2F: 205657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_U2F: 205757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller FOR_EACH_DST_ENABLED_CHANNEL(0, c, tgsi) 205857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkCvt(OP_CVT, dstTy, dst0[c], srcTy, fetchSrc(0, c)); 205957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 206057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_EMIT: 206157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_ENDPRIM: 206257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller // get vertex stream if specified (must be immediate) 206357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller src0 = tgsi.srcCount() ? 206457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkImm(tgsi.getSrc(0).getValueU32(0, info)) : zero; 206557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(op, TYPE_U32, NULL, src0)->fixed = 1; 206657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 206757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_IF: 206857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 206957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller BasicBlock *ifBB = new BasicBlock(func); 207057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 207157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bb->cfg.attach(&ifBB->cfg, Graph::Edge::TREE); 207257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller condBBs.push(bb); 207357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller joinBBs.push(bb); 207457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 207557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkFlow(OP_BRA, NULL, CC_NOT_P, fetchSrc(0, 0)); 207657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 207757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller setPosition(ifBB, true); 207857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 207957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 208057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_ELSE: 208157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 208257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller BasicBlock *elseBB = new BasicBlock(func); 208357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller BasicBlock *forkBB = reinterpret_cast<BasicBlock *>(condBBs.pop().u.p); 208457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 208557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller forkBB->cfg.attach(&elseBB->cfg, Graph::Edge::TREE); 208657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller condBBs.push(bb); 208757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 208857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller forkBB->getExit()->asFlow()->target.bb = elseBB; 208957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!bb->isTerminated()) 209057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkFlow(OP_BRA, NULL, CC_ALWAYS, NULL); 209157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 209257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller setPosition(elseBB, true); 209357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 209457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 209557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_ENDIF: 209657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 209757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller BasicBlock *convBB = new BasicBlock(func); 209857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller BasicBlock *prevBB = reinterpret_cast<BasicBlock *>(condBBs.pop().u.p); 209957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller BasicBlock *forkBB = reinterpret_cast<BasicBlock *>(joinBBs.pop().u.p); 210057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 210157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!bb->isTerminated()) { 210257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller // we only want join if none of the clauses ended with CONT/BREAK/RET 210357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (prevBB->getExit()->op == OP_BRA && joinBBs.getSize() < 6) 210457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller insertConvergenceOps(convBB, forkBB); 210557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkFlow(OP_BRA, convBB, CC_ALWAYS, NULL); 210657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bb->cfg.attach(&convBB->cfg, Graph::Edge::FORWARD); 210757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 210857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 210957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (prevBB->getExit()->op == OP_BRA) { 211057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller prevBB->cfg.attach(&convBB->cfg, Graph::Edge::FORWARD); 211157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller prevBB->getExit()->asFlow()->target.bb = convBB; 211257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 211357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller setPosition(convBB, true); 211457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 211557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 211657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_BGNLOOP: 211757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 211857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller BasicBlock *lbgnBB = new BasicBlock(func); 211957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller BasicBlock *lbrkBB = new BasicBlock(func); 212057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 212157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller loopBBs.push(lbgnBB); 212257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller breakBBs.push(lbrkBB); 212357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (loopBBs.getSize() > func->loopNestingBound) 212457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller func->loopNestingBound++; 212557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 212657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkFlow(OP_PREBREAK, lbrkBB, CC_ALWAYS, NULL); 212757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 212857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bb->cfg.attach(&lbgnBB->cfg, Graph::Edge::TREE); 212957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller setPosition(lbgnBB, true); 213057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkFlow(OP_PRECONT, lbgnBB, CC_ALWAYS, NULL); 213157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 213257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 213357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_ENDLOOP: 213457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 213557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller BasicBlock *loopBB = reinterpret_cast<BasicBlock *>(loopBBs.pop().u.p); 213657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 213757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!bb->isTerminated()) { 213857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkFlow(OP_CONT, loopBB, CC_ALWAYS, NULL); 213957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bb->cfg.attach(&loopBB->cfg, Graph::Edge::BACK); 214057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 214157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller setPosition(reinterpret_cast<BasicBlock *>(breakBBs.pop().u.p), true); 214257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 214357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 214457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_BRK: 214557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 214657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (bb->isTerminated()) 214757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 214857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller BasicBlock *brkBB = reinterpret_cast<BasicBlock *>(breakBBs.peek().u.p); 214957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkFlow(OP_BREAK, brkBB, CC_ALWAYS, NULL); 215057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bb->cfg.attach(&brkBB->cfg, Graph::Edge::CROSS); 215157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 215257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 215357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_CONT: 215457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 215557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (bb->isTerminated()) 215657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 215757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller BasicBlock *contBB = reinterpret_cast<BasicBlock *>(loopBBs.peek().u.p); 215857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkFlow(OP_CONT, contBB, CC_ALWAYS, NULL); 215957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller contBB->explicitCont = true; 216057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bb->cfg.attach(&contBB->cfg, Graph::Edge::BACK); 216157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 216257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 216357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_BGNSUB: 216457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 21659bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez Subroutine *s = getSubroutine(ip); 21669bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez BasicBlock *entry = new BasicBlock(s->f); 21679bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez BasicBlock *leave = new BasicBlock(s->f); 21689bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez 21699bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez // multiple entrypoints possible, keep the graph connected 21709bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez if (prog->getType() == Program::TYPE_COMPUTE) 21719bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez prog->main->call.attach(&s->f->call, Graph::Edge::TREE); 21729bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez 21739bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez sub.cur = s; 21749bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez s->f->setEntry(entry); 21759bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez s->f->setExit(leave); 217657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller setPosition(entry, true); 217757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return true; 21789bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez } 217957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_ENDSUB: 218057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 21819bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez sub.cur = getSubroutine(prog->main); 21829bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez setPosition(BasicBlock::get(sub.cur->f->cfg.getRoot()), true); 218357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return true; 21849bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez } 218557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_CAL: 21869bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez { 21879bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez Subroutine *s = getSubroutine(tgsi.getLabel()); 21889bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez mkFlow(OP_CALL, s->f, CC_ALWAYS, NULL); 21899bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez func->call.attach(&s->f->call, Graph::Edge::TREE); 219057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return true; 21919bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez } 219257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_RET: 219357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 219457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (bb->isTerminated()) 219557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return true; 21969bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez BasicBlock *leave = BasicBlock::get(func->cfgExit); 21979bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez 219857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!isEndOfSubroutine(ip + 1)) { 219957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller // insert a PRERET at the entry if this is an early return 22009bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez // (only needed for sharing code in the epilogue) 2201163b290f886c69a233c71799613eb74fb2668085Christoph Bumiller BasicBlock *pos = getBB(); 2202163b290f886c69a233c71799613eb74fb2668085Christoph Bumiller setPosition(BasicBlock::get(func->cfg.getRoot()), false); 22039bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez mkFlow(OP_PRERET, leave, CC_ALWAYS, NULL)->fixed = 1; 2204163b290f886c69a233c71799613eb74fb2668085Christoph Bumiller setPosition(pos, true); 22059bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez } 2206163b290f886c69a233c71799613eb74fb2668085Christoph Bumiller mkFlow(OP_RET, NULL, CC_ALWAYS, NULL)->fixed = 1; 2207163b290f886c69a233c71799613eb74fb2668085Christoph Bumiller bb->cfg.attach(&leave->cfg, Graph::Edge::CROSS); 220857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 220957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 221057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_END: 221157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller { 221257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller // attach and generate epilogue code 22139bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez BasicBlock *epilogue = BasicBlock::get(func->cfgExit); 221457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bb->cfg.attach(&epilogue->cfg, Graph::Edge::TREE); 221557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller setPosition(epilogue, true); 221657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (prog->getType() == Program::TYPE_FRAGMENT) 221757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller exportOutputs(); 2218b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller if (info->io.genUserClip > 0) 221957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller handleUserClipPlanes(); 222057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp(OP_EXIT, TYPE_NONE, NULL)->terminator = 1; 222157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 222257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 222357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_SWITCH: 222457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TGSI_OPCODE_CASE: 222557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller ERROR("switch/case opcode encountered, should have been lowered\n"); 222657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller abort(); 222757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 222857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 222957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller ERROR("unhandled TGSI opcode: %u\n", tgsi.getOpcode()); 223057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(0); 223157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 223257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 223357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 223457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (tgsi.dstCount()) { 223557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (c = 0; c < 4; ++c) { 223657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!dst0[c]) 223757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller continue; 223857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (dst0[c] != rDst0[c]) 223957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkMov(rDst0[c], dst0[c]); 224057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller storeDst(0, c, rDst0[c]); 224157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 224257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 224357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller vtxBaseValid = 0; 224457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 224557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return true; 224657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 224757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 224857594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 224957594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::handleUserClipPlanes() 225057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 225157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Value *res[8]; 2252ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller int n, i, c; 225357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 225457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (c = 0; c < 4; ++c) { 2255b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller for (i = 0; i < info->io.genUserClip; ++i) { 2256e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller Symbol *sym = mkSymbol(FILE_MEMORY_CONST, info->io.ucpBinding, 2257e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller TYPE_F32, info->io.ucpBase + i * 16 + c * 4); 2258e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller Value *ucp = mkLoad(TYPE_F32, sym, NULL); 225957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (c == 0) 226057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller res[i] = mkOp2v(OP_MUL, TYPE_F32, getScratch(), clipVtx[c], ucp); 226157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller else 226257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp3(OP_MAD, TYPE_F32, res[i], clipVtx[c], ucp, res[i]); 226357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 226457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 226557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 2266ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller const int first = info->numOutputs - (info->io.genUserClip + 3) / 4; 2267ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller 2268ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller for (i = 0; i < info->io.genUserClip; ++i) { 2269ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller n = i / 4 + first; 2270ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller c = i % 4; 2271ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller Symbol *sym = 2272ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller mkSymbol(FILE_SHADER_OUTPUT, 0, TYPE_F32, info->out[n].slot[c] * 4); 2273ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller mkStore(OP_EXPORT, TYPE_F32, sym, NULL, res[i]); 2274ce04221081cd145ac3fc8c053cc5ca0a8f05b7efChristoph Bumiller } 227557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 227657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 227757594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 227857594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::exportOutputs() 227957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 228057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (unsigned int i = 0; i < info->numOutputs; ++i) { 228157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (unsigned int c = 0; c < 4; ++c) { 22829bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez if (!oData.exists(sub.cur->values, i, c)) 228357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller continue; 228457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Symbol *sym = mkSymbol(FILE_SHADER_OUTPUT, 0, TYPE_F32, 228557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info->out[i].slot[c] * 4); 22869bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez Value *val = oData.load(sub.cur->values, i, c, NULL); 228757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (val) 228857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkStore(OP_EXPORT, TYPE_F32, sym, NULL, val); 228957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 229057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 229157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 229257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 229356d40aa51b34b77791cc3a49d7e86473a7459b72Francisco JerezConverter::Converter(Program *ir, const tgsi::Source *code) : BuildUtil(ir), 229456d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez code(code), 229557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tgsi(NULL), 229657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tData(this), aData(this), pData(this), oData(this) 229757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 229857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller info = code->info; 229957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 230056d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez const DataFile tFile = code->mainTempsInLMem ? FILE_MEMORY_LOCAL : FILE_GPR; 230156d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez 230256d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez const unsigned tSize = code->fileSize(TGSI_FILE_TEMPORARY); 230356d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez const unsigned pSize = code->fileSize(TGSI_FILE_PREDICATE); 230456d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez const unsigned aSize = code->fileSize(TGSI_FILE_ADDRESS); 230556d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez const unsigned oSize = code->fileSize(TGSI_FILE_OUTPUT); 230656d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez 230756d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez tData.setup(TGSI_FILE_TEMPORARY, 0, 0, tSize, 4, 4, tFile, 0); 230856d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez pData.setup(TGSI_FILE_PREDICATE, 0, 0, pSize, 4, 4, FILE_PREDICATE, 0); 230956d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez aData.setup(TGSI_FILE_ADDRESS, 0, 0, aSize, 4, 4, FILE_ADDRESS, 0); 231056d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez oData.setup(TGSI_FILE_OUTPUT, 0, 0, oSize, 4, 4, FILE_GPR, 0); 231156d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez 231256d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez for (int vol = 0, i = 0; i < code->tempArrayCount; ++i) { 231356d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez int len = code->tempArrays[i].u32 >> 2; 231456d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez int dim = code->tempArrays[i].u32 & 3; 231556d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez 231656d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez lData.push_back(DataArray(this)); 231756d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez lData.back().setup(TGSI_FILE_TEMPORARY_ARRAY, i, vol, len, dim, 4, 231856d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez FILE_MEMORY_LOCAL, 0); 231957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 232056d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez vol += (len * dim * 4 + 0xf) & ~0xf; 232156d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez } 232256d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez 232356d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez for (int vol = 0, i = 0; i < code->immdArrayCount; ++i) { 232456d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez int len = code->immdArrays[i].u32 >> 2; 232556d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez int dim = code->immdArrays[i].u32 & 3; 232656d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez 232756d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez lData.push_back(DataArray(this)); 232856d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez lData.back().setup(TGSI_FILE_IMMEDIATE_ARRAY, i, vol, len, dim, 4, 232956d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez FILE_MEMORY_CONST, 14); 233057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 233156d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez vol += (len * dim * 4 + 0xf) & ~0xf; 233256d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez } 233357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 233457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller zero = mkImm((uint32_t)0); 233557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 233657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller vtxBaseValid = 0; 233757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 233857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 233957594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::~Converter() 234057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 234157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 234257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 2343a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jereztemplate<typename T> inline void 2344a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco JerezConverter::BindArgumentsPass::updateCallArgs( 2345a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez Instruction *i, void (Instruction::*setArg)(int, Value *), 2346a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez T (Function::*proto)) 2347a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez{ 2348a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez Function *g = i->asFlow()->target.fn; 2349a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez Subroutine *subg = conv.getSubroutine(g); 2350a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez 2351a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez for (unsigned a = 0; a < (g->*proto).size(); ++a) { 2352a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez Value *v = (g->*proto)[a].get(); 2353a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez const Converter::Location &l = subg->values.l.find(v)->second; 2354a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez Converter::DataArray *array = conv.getArrayForFile(l.array, l.arrayIdx); 2355a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez 2356a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez (i->*setArg)(a, array->acquire(sub->values, l.i, l.c)); 2357a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez } 2358a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez} 2359a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez 2360a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jereztemplate<typename T> inline void 2361a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco JerezConverter::BindArgumentsPass::updatePrototype( 2362a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez BitSet *set, void (Function::*updateSet)(), T (Function::*proto)) 2363a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez{ 2364a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez (func->*updateSet)(); 2365a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez 2366a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez for (unsigned i = 0; i < set->getSize(); ++i) { 2367a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez Value *v = func->getLValue(i); 2368a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez 2369a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez // only include values with a matching TGSI register 2370a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez if (set->test(i) && sub->values.l.find(v) != sub->values.l.end()) 2371a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez (func->*proto).push_back(v); 2372a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez } 2373a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez} 2374a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez 2375a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerezbool 2376a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco JerezConverter::BindArgumentsPass::visit(Function *f) 2377a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez{ 2378a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez sub = conv.getSubroutine(f); 2379a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez 2380a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez for (ArrayList::Iterator bi = f->allBBlocks.iterator(); 2381a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez !bi.end(); bi.next()) { 2382a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez for (Instruction *i = BasicBlock::get(bi)->getFirst(); 2383a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez i; i = i->next) { 2384a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez if (i->op == OP_CALL && !i->asFlow()->builtin) { 2385a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez updateCallArgs(i, &Instruction::setSrc, &Function::ins); 2386a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez updateCallArgs(i, &Instruction::setDef, &Function::outs); 2387a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez } 2388a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez } 2389a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez } 2390a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez 2391a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez if (func == prog->main && prog->getType() != Program::TYPE_COMPUTE) 2392a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez return true; 2393a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez updatePrototype(&BasicBlock::get(f->cfg.getRoot())->liveSet, 2394a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez &Function::buildLiveSets, &Function::ins); 2395a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez updatePrototype(&BasicBlock::get(f->cfgExit)->defSet, 2396a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez &Function::buildDefSets, &Function::outs); 2397a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez 2398a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez return true; 2399a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez} 2400a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez 240157594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerbool 240257594065c30feec9376be9b2132659f7d87362eeChristoph BumillerConverter::run() 240357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 240457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller BasicBlock *entry = new BasicBlock(prog->main); 240557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller BasicBlock *leave = new BasicBlock(prog->main); 240657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 240757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller prog->main->setEntry(entry); 240857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller prog->main->setExit(leave); 240957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 241057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller setPosition(entry, true); 24119bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez sub.cur = getSubroutine(prog->main); 241257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 2413b85e93c0ca5ce881a59412b3ae617b5ac2c3aeb6Christoph Bumiller if (info->io.genUserClip > 0) { 241457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (int c = 0; c < 4; ++c) 241557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller clipVtx[c] = getScratch(); 241657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 241757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 241857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (prog->getType() == Program::TYPE_FRAGMENT) { 241957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Symbol *sv = mkSysVal(SV_POSITION, 3); 242057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller fragCoord[3] = mkOp1v(OP_RDSV, TYPE_F32, getSSA(), sv); 242157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller mkOp1(OP_RCP, TYPE_F32, fragCoord[3], fragCoord[3]); 242257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 242357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 242457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller for (ip = 0; ip < code->scan.num_instructions; ++ip) { 242557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!handleInstruction(&code->insns[ip])) 242657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return false; 242757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 2428a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez 2429a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez if (!BindArgumentsPass(*this).run(prog)) 2430a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez return false; 2431a3dd45e1c27e4e55dadb9467c2ea428f58083ac1Francisco Jerez 243257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return true; 243357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 243457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 243557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} // unnamed namespace 243657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 243757594065c30feec9376be9b2132659f7d87362eeChristoph Bumillernamespace nv50_ir { 243857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 243957594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerbool 244057594065c30feec9376be9b2132659f7d87362eeChristoph BumillerProgram::makeFromTGSI(struct nv50_ir_prog_info *info) 244157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 244257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller tgsi::Source src(info); 244357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!src.scanSource()) 244457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return false; 2445e43a3a66a9d8a99021d76ff4d07dec7b8cfd62caChristoph Bumiller tlsSize = info->bin.tlsSpace; 244657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 244757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Converter builder(this, &src); 244857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return builder.run(); 244957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 245057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 245157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} // namespace nv50_ir 2452