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 Bumiller#include "nv50_ir.h" 24322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller#include "nv50_ir_target_nv50.h" 2557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 2657594065c30feec9376be9b2132659f7d87362eeChristoph Bumillernamespace nv50_ir { 2757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 28322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller#define NV50_OP_ENC_LONG 0 29322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller#define NV50_OP_ENC_SHORT 1 30322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller#define NV50_OP_ENC_IMM 2 31322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller#define NV50_OP_ENC_LONG_ALT 3 32322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 3357594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerclass CodeEmitterNV50 : public CodeEmitter 3457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 3557594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerpublic: 36322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller CodeEmitterNV50(const TargetNV50 *); 3757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 3857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller virtual bool emitInstruction(Instruction *); 3957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 4057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller virtual uint32_t getMinEncodingSize(const Instruction *) const; 4157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 4257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller inline void setProgramType(Program::Type pType) { progType = pType; } 4357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 44322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller virtual void prepareEmission(Function *); 4557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 46322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumillerprivate: 4757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller Program::Type progType; 4857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 49322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller const TargetNV50 *targ; 50322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 5157594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerprivate: 5257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller inline void defId(const ValueDef&, const int pos); 5357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller inline void srcId(const ValueRef&, const int pos); 5457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller inline void srcId(const ValueRef *, const int pos); 5557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 56322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller inline void srcAddr16(const ValueRef&, bool adj, const int pos); 5757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller inline void srcAddr8(const ValueRef&, const int pos); 5857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 5957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void emitFlagsRd(const Instruction *); 6057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void emitFlagsWr(const Instruction *); 6157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 62322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller void emitCondCode(CondCode cc, DataType ty, int pos); 6357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 6457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller inline void setARegBits(unsigned int); 6557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 6657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void setAReg16(const Instruction *, int s); 6757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void setImmediate(const Instruction *, int s); 6857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 6957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void setDst(const Value *); 7057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void setDst(const Instruction *, int d); 71322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller void setSrcFileBits(const Instruction *, int enc); 72322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller void setSrc(const Instruction *, unsigned int s, int slot); 7357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 7457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void emitForm_MAD(const Instruction *); 7557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void emitForm_ADD(const Instruction *); 7657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void emitForm_MUL(const Instruction *); 7757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void emitForm_IMM(const Instruction *); 7857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 79322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller void emitLoadStoreSizeLG(DataType ty, int pos); 80322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller void emitLoadStoreSizeCS(DataType ty); 8157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 8257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void roundMode_MAD(const Instruction *); 8357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void roundMode_CVT(RoundMode); 8457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 8557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void emitMNeg12(const Instruction *); 8657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 8757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void emitLOAD(const Instruction *); 8857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void emitSTORE(const Instruction *); 8957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void emitMOV(const Instruction *); 9057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void emitNOP(); 9157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void emitINTERP(const Instruction *); 9257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void emitPFETCH(const Instruction *); 9357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void emitOUT(const Instruction *); 9457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 9557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void emitUADD(const Instruction *); 9657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void emitAADD(const Instruction *); 9757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void emitFADD(const Instruction *); 98322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller void emitIMUL(const Instruction *); 9957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void emitFMUL(const Instruction *); 10057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void emitFMAD(const Instruction *); 101322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller void emitIMAD(const Instruction *); 1021f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller void emitISAD(const Instruction *); 10357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 10457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void emitMINMAX(const Instruction *); 10557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 10657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void emitPreOp(const Instruction *); 10757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void emitSFnOp(const Instruction *, uint8_t subOp); 10857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 10957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void emitShift(const Instruction *); 110322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller void emitARL(const Instruction *, unsigned int shl); 11157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void emitLogicOp(const Instruction *); 112322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller void emitNOT(const Instruction *); 11357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 11457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void emitCVT(const Instruction *); 11557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void emitSET(const Instruction *); 11657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 11757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void emitTEX(const TexInstruction *); 118322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller void emitTXQ(const TexInstruction *); 11957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 12057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void emitQUADOP(const Instruction *, uint8_t lane, uint8_t quOp); 12157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 12257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller void emitFlow(const Instruction *, uint8_t flowOp); 123322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller void emitPRERETEmu(const FlowInstruction *); 12457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}; 12557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 12657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#define SDATA(a) ((a).rep()->reg.data) 12757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#define DDATA(a) ((a).rep()->reg.data) 12857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 12957594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid CodeEmitterNV50::srcId(const ValueRef& src, const int pos) 13057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 13157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(src.get()); 13257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[pos / 32] |= SDATA(src).id << (pos % 32); 13357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 13457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 13557594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid CodeEmitterNV50::srcId(const ValueRef *src, const int pos) 13657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 13757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(src->get()); 13857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[pos / 32] |= SDATA(*src).id << (pos % 32); 13957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 14057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 141322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumillervoid CodeEmitterNV50::srcAddr16(const ValueRef& src, bool adj, const int pos) 14257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 14357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(src.get()); 14457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 145322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller int32_t offset = SDATA(src).offset; 146322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 147322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller assert(!adj || src.get()->reg.size <= 4); 148322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (adj) 149322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller offset /= src.get()->reg.size; 15057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 151322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller assert(offset <= 0x7fff && offset >= (int32_t)-0x8000 && (pos % 32) <= 16); 152322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 153322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (offset < 0) 154322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller offset &= adj ? (0xffff >> (src.get()->reg.size >> 1)) : 0xffff; 15557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 15657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[pos / 32] |= offset << (pos % 32); 15757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 15857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 15957594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid CodeEmitterNV50::srcAddr8(const ValueRef& src, const int pos) 16057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 16157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(src.get()); 16257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 16357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller uint32_t offset = SDATA(src).offset; 16457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 165322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller assert((offset <= 0x1fc || offset == 0x3fc) && !(offset & 0x3)); 16657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 16757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[pos / 32] |= (offset >> 2) << (pos % 32); 16857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 16957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 17057594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid CodeEmitterNV50::defId(const ValueDef& def, const int pos) 17157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 172322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller assert(def.get() && def.getFile() != FILE_SHADER_OUTPUT); 173322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 17457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[pos / 32] |= DDATA(def).id << (pos % 32); 17557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 17657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 17757594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 17857594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCodeEmitterNV50::roundMode_MAD(const Instruction *insn) 17957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 18057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (insn->rnd) { 18157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case ROUND_M: code[1] |= 1 << 22; break; 18257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case ROUND_P: code[1] |= 2 << 22; break; 18357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case ROUND_Z: code[1] |= 3 << 22; break; 18457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 18557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(insn->rnd == ROUND_N); 18657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 18757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 18857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 18957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 19057594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 19157594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCodeEmitterNV50::emitMNeg12(const Instruction *i) 19257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 193322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] |= i->src(0).mod.neg() << 26; 194322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] |= i->src(1).mod.neg() << 27; 19557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 19657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 197322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumillervoid CodeEmitterNV50::emitCondCode(CondCode cc, DataType ty, int pos) 19857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 19957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller uint8_t enc; 20057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 20157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(pos >= 32 || pos <= 27); 20257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 20357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (cc) { 20457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case CC_LT: enc = 0x1; break; 20557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case CC_LTU: enc = 0x9; break; 20657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case CC_EQ: enc = 0x2; break; 20757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case CC_EQU: enc = 0xa; break; 20857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case CC_LE: enc = 0x3; break; 20957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case CC_LEU: enc = 0xb; break; 21057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case CC_GT: enc = 0x4; break; 21157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case CC_GTU: enc = 0xc; break; 21257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case CC_NE: enc = 0x5; break; 21357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case CC_NEU: enc = 0xd; break; 21457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case CC_GE: enc = 0x6; break; 21557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case CC_GEU: enc = 0xe; break; 21657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case CC_TR: enc = 0xf; break; 21757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case CC_FL: enc = 0x0; break; 21857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 21957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case CC_O: enc = 0x10; break; 22057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case CC_C: enc = 0x11; break; 22157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case CC_A: enc = 0x12; break; 22257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case CC_S: enc = 0x13; break; 22357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case CC_NS: enc = 0x1c; break; 22457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case CC_NA: enc = 0x1d; break; 22557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case CC_NC: enc = 0x1e; break; 22657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case CC_NO: enc = 0x1f; break; 22757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 22857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 22957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller enc = 0; 23057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(!"invalid condition code"); 23157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 23257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 233322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (ty != TYPE_NONE && !isFloatType(ty)) 234322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller enc &= ~0x8; // unordered only exists for float types 235322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 23657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[pos / 32] |= enc << (pos % 32); 23757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 23857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 23957594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 24057594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCodeEmitterNV50::emitFlagsRd(const Instruction *i) 24157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 24257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller int s = (i->flagsSrc >= 0) ? i->flagsSrc : i->predSrc; 24357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 24457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(!(code[1] & 0x00003f80)); 24557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 24657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (s >= 0) { 24757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(i->getSrc(s)->reg.file == FILE_FLAGS); 248322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller emitCondCode(i->cc, TYPE_NONE, 32 + 7); 249322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller srcId(i->src(s), 32 + 12); 25057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else { 25157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] |= 0x0780; 25257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 25357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 25457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 25557594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 25657594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCodeEmitterNV50::emitFlagsWr(const Instruction *i) 25757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 25857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(!(code[1] & 0x70)); 25957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 260322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller int flagsDef = i->flagsDef; 261322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 262322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller // find flags definition and check that it is the last def 263322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (flagsDef < 0) { 264322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller for (int d = 0; i->defExists(d); ++d) 265322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (i->def(d).getFile() == FILE_FLAGS) 266322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller flagsDef = d; 267322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (flagsDef >= 0 && 0) // TODO: enforce use of flagsDef at some point 268322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller WARN("Instruction::flagsDef was not set properly\n"); 269322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller } 270322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (flagsDef == 0 && i->defExists(1)) 271322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller WARN("flags def should not be the primary definition\n"); 272322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 273322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (flagsDef >= 0) 274322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] |= (DDATA(i->def(flagsDef)).id << 4) | 0x40; 275322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 27657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 27757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 27857594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 27957594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCodeEmitterNV50::setARegBits(unsigned int u) 28057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 28157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] |= (u & 3) << 26; 28257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] |= (u & 4); 28357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 28457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 28557594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 28657594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCodeEmitterNV50::setAReg16(const Instruction *i, int s) 28757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 288322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (i->srcExists(s)) { 289322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller s = i->src(s).indirect[0]; 290322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (s >= 0) 291322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller setARegBits(SDATA(i->src(s)).id + 1); 292322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller } 29357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 29457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 29557594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 29657594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCodeEmitterNV50::setImmediate(const Instruction *i, int s) 29757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 298322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller const ImmediateValue *imm = i->src(s).get()->asImm(); 29957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(imm); 30057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 301322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller uint32_t u = imm->reg.data.u32; 302322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 303322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (i->src(s).mod & Modifier(NV50_IR_MOD_NOT)) 304322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller u = ~u; 305322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 30657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] |= 3; 307322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[0] |= (u & 0x3f) << 16; 308322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] |= (u >> 6) << 2; 30957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 31057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 31157594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 31257594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCodeEmitterNV50::setDst(const Value *dst) 31357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 31457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const Storage *reg = &dst->join->reg; 31557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 31657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(reg->file != FILE_ADDRESS); 31757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 318322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (reg->data.id < 0 || reg->file == FILE_FLAGS) { 31957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] |= (127 << 2) | 1; 32057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] |= 8; 32157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else { 322322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller int id; 323322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (reg->file == FILE_SHADER_OUTPUT) { 32457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] |= 8; 325322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller id = reg->data.offset / 4; 326322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller } else { 327322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller id = reg->data.id; 328322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller } 329322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[0] |= id << 2; 33057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 33157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 33257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 33357594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 33457594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCodeEmitterNV50::setDst(const Instruction *i, int d) 33557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 33657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (i->defExists(d)) { 33757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller setDst(i->getDef(d)); 33857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else 33957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!d) { 34057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] |= 0x01fc; // bit bucket 34157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] |= 0x0008; 34257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 34357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 34457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 345322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller// 3 * 2 bits: 346322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller// 0: r 347322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller// 1: a/s 348322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller// 2: c 349322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller// 3: i 35057594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 351322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph BumillerCodeEmitterNV50::setSrcFileBits(const Instruction *i, int enc) 35257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 353322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller uint8_t mode = 0; 35457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 355322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller for (unsigned int s = 0; s < Target::operationSrcNr[i->op]; ++s) { 356322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller switch (i->src(s).getFile()) { 357322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case FILE_GPR: 358322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller break; 359322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case FILE_MEMORY_SHARED: 360322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case FILE_SHADER_INPUT: 361322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller mode |= 1 << (s * 2); 362322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller break; 363322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case FILE_MEMORY_CONST: 364322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller mode |= 2 << (s * 2); 365322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller break; 366322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case FILE_IMMEDIATE: 367322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller mode |= 3 << (s * 2); 368322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller break; 369322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller default: 370322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller ERROR("invalid file on source %i: %u\n", s, i->src(s).getFile()); 371322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller assert(0); 372322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller break; 373322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller } 374322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller } 375322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller switch (mode) { 376322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case 0x00: // rrr 377322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller break; 378322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case 0x01: // arr/grr 379322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (progType == Program::TYPE_GEOMETRY) { 380322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[0] |= 0x01800000; 381322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (enc == NV50_OP_ENC_LONG || enc == NV50_OP_ENC_LONG_ALT) 382322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] |= 0x00200000; 383322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller } else { 384322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (enc == NV50_OP_ENC_SHORT) 385322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[0] |= 0x01000000; 386322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller else 387322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] |= 0x00200000; 388322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller } 389322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller break; 390322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case 0x03: // irr 391322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller assert(i->op == OP_MOV); 392322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller return; 393322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case 0x0c: // rir 394322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller break; 395322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case 0x0d: // gir 396322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[0] |= 0x01000000; 397322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller assert(progType == Program::TYPE_GEOMETRY || 398322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller progType == Program::TYPE_COMPUTE); 399322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller break; 400322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case 0x08: // rcr 401322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[0] |= (enc == NV50_OP_ENC_LONG_ALT) ? 0x01000000 : 0x00800000; 402322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] |= (i->getSrc(1)->reg.fileIndex << 22); 403322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller break; 404322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case 0x09: // acr/gcr 405322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (progType == Program::TYPE_GEOMETRY) { 406322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[0] |= 0x01800000; 407322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller } else { 408322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[0] |= (enc == NV50_OP_ENC_LONG_ALT) ? 0x01000000 : 0x00800000; 409322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] |= 0x00200000; 410322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller } 411322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] |= (i->getSrc(1)->reg.fileIndex << 22); 412322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller break; 413322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case 0x20: // rrc 414322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[0] |= 0x01000000; 415322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] |= (i->getSrc(2)->reg.fileIndex << 22); 416322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller break; 417322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case 0x21: // arc 418322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[0] |= 0x01000000; 419322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] |= 0x00200000 | (i->getSrc(2)->reg.fileIndex << 22); 420322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller assert(progType != Program::TYPE_GEOMETRY); 421322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller break; 422322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller default: 423322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller ERROR("not encodable: %x\n", mode); 424322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller assert(0); 425322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller break; 426322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller } 427322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (progType != Program::TYPE_COMPUTE) 428322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller return; 42957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 430322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if ((mode & 3) == 1) { 431322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller const int pos = i->src(1).getFile() == FILE_IMMEDIATE ? 13 : 14; 43257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 433322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller switch (i->getSrc(0)->reg.type) { 434322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case TYPE_U8: 435322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller break; 436322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case TYPE_U16: 437322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[0] |= 1 << pos; 438322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller break; 439322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case TYPE_S16: 440322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[0] |= 2 << pos; 441322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller break; 442322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller default: 443322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[0] |= 3 << pos; 444322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller assert(i->getSrc(0)->reg.size == 4); 445322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller break; 446322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller } 44757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 44857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 44957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 45057594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 451322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph BumillerCodeEmitterNV50::setSrc(const Instruction *i, unsigned int s, int slot) 45257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 453322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (Target::operationSrcNr[i->op] <= s) 454322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller return; 455322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller const Storage *reg = &i->src(s).rep()->reg; 456322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 457322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller unsigned int id = (reg->file == FILE_GPR) ? 458322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller reg->data.id : 459322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller reg->data.offset >> (reg->size >> 1); // no > 4 byte sources here 460322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 461322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller switch (slot) { 462322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case 0: code[0] |= id << 9; break; 463322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case 1: code[0] |= id << 16; break; 464322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case 2: code[1] |= id << 14; break; 465322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller default: 466322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller assert(0); 467322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller break; 46857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 46957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 47057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 47157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller// the default form: 47257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller// - long instruction 473322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller// - 1 to 3 sources in slots 0, 1, 2 (rrr, arr, rcr, acr, rrc, arc, gcr, grr) 47457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller// - address & flags 47557594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 47657594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCodeEmitterNV50::emitForm_MAD(const Instruction *i) 47757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 47857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(i->encSize == 8); 47957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] |= 1; 48057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 48157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitFlagsRd(i); 48257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitFlagsWr(i); 48357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 48457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller setDst(i, 0); 48557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 486322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller setSrcFileBits(i, NV50_OP_ENC_LONG); 487322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller setSrc(i, 0, 0); 488322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller setSrc(i, 1, 1); 489322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller setSrc(i, 2, 2); 49057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 49157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller setAReg16(i, 1); 49257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 49357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 49457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller// like default form, but 2nd source in slot 2, and no 3rd source 49557594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 49657594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCodeEmitterNV50::emitForm_ADD(const Instruction *i) 49757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 49857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(i->encSize == 8); 49957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] |= 1; 50057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 50157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitFlagsRd(i); 50257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitFlagsWr(i); 50357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 50457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller setDst(i, 0); 50557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 506322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller setSrcFileBits(i, NV50_OP_ENC_LONG_ALT); 507322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller setSrc(i, 0, 0); 508322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller setSrc(i, 1, 2); 50957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 51057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller setAReg16(i, 1); 51157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 51257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 513322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller// default short form (rr, ar, rc, gr) 51457594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 51557594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCodeEmitterNV50::emitForm_MUL(const Instruction *i) 51657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 51757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(i->encSize == 4 && !(code[0] & 1)); 51857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(i->defExists(0)); 51957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(!i->getPredicate()); 52057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 52157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller setDst(i, 0); 52257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 523322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller setSrcFileBits(i, NV50_OP_ENC_SHORT); 524322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller setSrc(i, 0, 0); 525322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller setSrc(i, 1, 1); 52657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 52757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 52857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller// usual immediate form 529322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller// - 1 to 3 sources where last is immediate (rir, gir) 53057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller// - no address or predicate possible 53157594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 53257594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCodeEmitterNV50::emitForm_IMM(const Instruction *i) 53357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 53457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(i->encSize == 8); 53557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] |= 1; 53657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 53757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(i->defExists(0) && i->srcExists(0)); 53857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 53957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller setDst(i, 0); 54057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 541322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller setSrcFileBits(i, NV50_OP_ENC_IMM); 542322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (Target::operationSrcNr[i->op] > 1) { 543322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller setSrc(i, 0, 0); 54457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller setImmediate(i, 1); 545322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller setSrc(i, 2, 1); 54657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else { 54757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller setImmediate(i, 0); 54857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 54957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 55057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 55157594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 552322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph BumillerCodeEmitterNV50::emitLoadStoreSizeLG(DataType ty, int pos) 55357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 55457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller uint8_t enc; 55557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 55657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (ty) { 55757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_F32: // fall through 55857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_S32: // fall through 55957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_U32: enc = 0x6; break; 56057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_B128: enc = 0x5; break; 561322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case TYPE_F64: // fall through 562322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case TYPE_S64: // fall through 563322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case TYPE_U64: enc = 0x4; break; 56457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_S16: enc = 0x3; break; 56557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_U16: enc = 0x2; break; 56657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_S8: enc = 0x1; break; 56757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_U8: enc = 0x0; break; 56857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 56957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller enc = 0; 57057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(!"invalid load/store type"); 57157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 57257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 57357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[pos / 32] |= enc << (pos % 32); 57457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 57557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 57657594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 577322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph BumillerCodeEmitterNV50::emitLoadStoreSizeCS(DataType ty) 578322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller{ 579322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller switch (ty) { 580322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case TYPE_U8: break; 581322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case TYPE_U16: code[1] |= 0x4000; break; 582322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case TYPE_S16: code[1] |= 0x8000; break; 583322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case TYPE_F32: 584322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case TYPE_S32: 585322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case TYPE_U32: code[1] |= 0xc000; break; 586322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller default: 587322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller assert(0); 588322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller break; 589322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller } 590322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller} 591322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 592322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumillervoid 59357594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCodeEmitterNV50::emitLOAD(const Instruction *i) 59457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 595322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller DataFile sf = i->src(0).getFile(); 596322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller int32_t offset = i->getSrc(0)->reg.data.offset; 59757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 59857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (sf) { 59957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case FILE_SHADER_INPUT: 600322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller // use 'mov' where we can 601322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[0] = i->src(0).isIndirect(0) ? 0x00000001 : 0x10000001; 602322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] = 0x00200000 | (i->lanes << 14); 603322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (typeSizeof(i->dType) == 4) 604322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] |= 0x04000000; 605322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller break; 606322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case FILE_MEMORY_SHARED: 607322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (targ->getChipset() >= 0x84) { 608322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller assert(offset <= (int32_t)(0x3fff * typeSizeof(i->sType))); 609322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[0] = 0x10000001; 610322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] = 0x40000000; 611322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 612322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (typeSizeof(i->dType) == 4) 613322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] |= 0x04000000; 614322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 615322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller emitLoadStoreSizeCS(i->sType); 616322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller } else { 617322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller assert(offset <= (int32_t)(0x1f * typeSizeof(i->sType))); 618322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[0] = 0x10000001; 619322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] = 0x00200000 | (i->lanes << 14); 620322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller emitLoadStoreSizeCS(i->sType); 621322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller } 62257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 62357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case FILE_MEMORY_CONST: 62457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] = 0x10000001; 625322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] = 0x20000000 | (i->getSrc(0)->reg.fileIndex << 22); 626322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (typeSizeof(i->dType) == 4) 627322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] |= 0x04000000; 628322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller emitLoadStoreSizeCS(i->sType); 62957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 63057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case FILE_MEMORY_LOCAL: 63157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] = 0xd0000001; 63257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] = 0x40000000; 63357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 63457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case FILE_MEMORY_GLOBAL: 63557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] = 0xd0000001 | (i->getSrc(0)->reg.fileIndex << 16); 63657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] = 0x80000000; 63757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 63857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 63957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(!"invalid load source file"); 64057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 64157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 64257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (sf == FILE_MEMORY_LOCAL || 64357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller sf == FILE_MEMORY_GLOBAL) 644322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller emitLoadStoreSizeLG(i->sType, 21 + 32); 64557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 64657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller setDst(i, 0); 64757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 64857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitFlagsRd(i); 64957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitFlagsWr(i); 65057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 651322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (i->src(0).getFile() == FILE_MEMORY_GLOBAL) { 652322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller srcId(*i->src(0).getIndirect(0), 9); 65357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else { 65457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller setAReg16(i, 0); 655322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller srcAddr16(i->src(0), i->src(0).getFile() != FILE_MEMORY_LOCAL, 9); 65657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 65757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 65857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 65957594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 66057594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCodeEmitterNV50::emitSTORE(const Instruction *i) 66157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 66257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller DataFile f = i->getSrc(0)->reg.file; 66357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller int32_t offset = i->getSrc(0)->reg.data.offset; 66457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 66557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (f) { 66657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case FILE_SHADER_OUTPUT: 667322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[0] = 0x00000001 | ((offset >> 2) << 9); 66857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] = 0x80c00000; 669322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller srcId(i->src(1), 32 + 14); 67057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 67157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case FILE_MEMORY_GLOBAL: 672322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[0] = 0xd0000001 | (i->getSrc(0)->reg.fileIndex << 16); 67357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] = 0xa0000000; 674322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller emitLoadStoreSizeLG(i->dType, 21 + 32); 675322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller srcId(i->src(1), 2); 67657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 67757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case FILE_MEMORY_LOCAL: 67857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] = 0xd0000001; 67957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] = 0x60000000; 680322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller emitLoadStoreSizeLG(i->dType, 21 + 32); 681322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller srcId(i->src(1), 2); 68257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 68357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case FILE_MEMORY_SHARED: 68457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] = 0x00000001; 68557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] = 0xe0000000; 68657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (typeSizeof(i->dType)) { 68757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case 1: 68857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] |= offset << 9; 68957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] |= 0x00400000; 69057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 69157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case 2: 69257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] |= (offset >> 1) << 9; 69357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 69457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case 4: 69557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] |= (offset >> 2) << 9; 696322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] |= 0x04200000; 69757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 69857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 69957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(0); 70057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 70157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 702322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller srcId(i->src(1), 32 + 14); 70357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 70457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 70557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(!"invalid store destination file"); 70657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 70757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 70857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 709322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (f == FILE_MEMORY_GLOBAL) 710322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller srcId(*i->src(0).getIndirect(0), 9); 711322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller else 71257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller setAReg16(i, 0); 71357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 714322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (f == FILE_MEMORY_LOCAL) 715322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller srcAddr16(i->src(0), false, 9); 716322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 71757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitFlagsRd(i); 71857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 71957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 72057594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 72157594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCodeEmitterNV50::emitMOV(const Instruction *i) 72257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 72357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller DataFile sf = i->getSrc(0)->reg.file; 72457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller DataFile df = i->getDef(0)->reg.file; 72557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 72657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(sf == FILE_GPR || df == FILE_GPR); 72757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 72857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (sf == FILE_FLAGS) { 72957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] = 0x00000001; 73057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] = 0x20000000; 731322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller defId(i->def(0), 2); 732322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller srcId(i->src(0), 12); 73357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitFlagsRd(i); 73457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else 73557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (sf == FILE_ADDRESS) { 73657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] = 0x00000001; 73757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] = 0x40000000; 738322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller defId(i->def(0), 2); 739322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller setARegBits(SDATA(i->src(0)).id + 1); 740322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller emitFlagsRd(i); 74157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else 74257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (df == FILE_FLAGS) { 74357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] = 0x00000001; 74457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] = 0xa0000000; 745322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller defId(i->def(0), 4); 746322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller srcId(i->src(0), 9); 74757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitFlagsRd(i); 74857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else 74957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (sf == FILE_IMMEDIATE) { 75057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] = 0x10008001; 75157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] = 0x00000003; 75257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitForm_IMM(i); 75357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else { 75457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (i->encSize == 4) { 75557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] = 0x10008000; 75657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else { 75757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] = 0x10000001; 758322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] = (typeSizeof(i->dType) == 2) ? 0 : 0x04000000; 759322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] |= (i->lanes << 14); 760322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller emitFlagsRd(i); 76157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 762322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller defId(i->def(0), 2); 763322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller srcId(i->src(0), 9); 76457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 76557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (df == FILE_SHADER_OUTPUT) { 76657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(i->encSize == 8); 76757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] |= 0x8; 76857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 76957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 77057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 77157594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 77257594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCodeEmitterNV50::emitNOP() 77357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 77457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] = 0xf0000001; 77557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] = 0xe0000000; 77657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 77757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 77857594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 77957594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCodeEmitterNV50::emitQUADOP(const Instruction *i, uint8_t lane, uint8_t quOp) 78057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 78157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] = 0xc0000000 | (lane << 16); 78257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] = 0x80000000; 78357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 78457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] |= (quOp & 0x03) << 20; 78557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] |= (quOp & 0xfc) << 20; 78657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 78757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitForm_ADD(i); 78857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 78957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!i->srcExists(1)) 790322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller srcId(i->src(0), 32 + 14); 79157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 79257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 79357594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 79457594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCodeEmitterNV50::emitPFETCH(const Instruction *i) 79557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 79657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] = 0x11800001; 79757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] = 0x04200000 | (0xf << 14); 79857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 799322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller defId(i->def(0), 2); 800322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller srcAddr8(i->src(0), 9); 80157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller setAReg16(i, 0); 80257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 80357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 80457594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 80557594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCodeEmitterNV50::emitINTERP(const Instruction *i) 80657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 80757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] = 0x80000000; 80857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 809322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller defId(i->def(0), 2); 810322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller srcAddr8(i->src(0), 16); 81157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 81257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (i->getInterpMode() == NV50_IR_INTERP_FLAT) { 81357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] |= 1 << 8; 81457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else { 81557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (i->op == OP_PINTERP) { 81657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] |= 1 << 25; 817322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller srcId(i->src(1), 9); 81857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 81957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (i->getSampleMode() == NV50_IR_INTERP_CENTROID) 82057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] |= 1 << 24; 82157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 82257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 82357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (i->encSize == 8) { 824322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] = 82557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller (code[0] & (3 << 24)) >> (24 - 16) | 826322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller (code[0] & (1 << 8)) << (18 - 8); 82757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] &= ~0x03000100; 82857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] |= 1; 829322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller emitFlagsRd(i); 83057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 83157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 83257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 83357594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 83457594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCodeEmitterNV50::emitMINMAX(const Instruction *i) 83557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 83657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (i->dType == TYPE_F64) { 83757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] = 0xe0000000; 83857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] = (i->op == OP_MIN) ? 0xa0000000 : 0xc0000000; 83957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else { 84057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] = 0x30000000; 84157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] = 0x80000000; 84257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (i->op == OP_MIN) 84357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] |= 0x20000000; 84457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 84557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (i->dType) { 84657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_F32: code[0] |= 0x80000000; break; 84757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_S32: code[1] |= 0x8c000000; break; 84857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_U32: code[1] |= 0x84000000; break; 84957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_S16: code[1] |= 0x80000000; break; 85057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_U16: break; 85157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 85257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(0); 85357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 85457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 855322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] |= i->src(0).mod.abs() << 20; 856322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] |= i->src(1).mod.abs() << 19; 85757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 85857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitForm_MAD(i); 85957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 86057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 86157594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 86257594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCodeEmitterNV50::emitFMAD(const Instruction *i) 86357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 864322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller const int neg_mul = i->src(0).mod.neg() ^ i->src(1).mod.neg(); 865322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller const int neg_add = i->src(2).mod.neg(); 86657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 86757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] = 0xe0000000; 86857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 86957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (i->encSize == 4) { 87057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitForm_MUL(i); 87157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(!neg_mul && !neg_add); 87257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else { 873322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] = neg_mul << 26; 87457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] |= neg_add << 27; 87557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (i->saturate) 87657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] |= 1 << 29; 877322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller emitForm_MAD(i); 87857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 87957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 88057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 88157594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 88257594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCodeEmitterNV50::emitFADD(const Instruction *i) 88357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 884322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller const int neg0 = i->src(0).mod.neg(); 885322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller const int neg1 = i->src(1).mod.neg() ^ ((i->op == OP_SUB) ? 1 : 0); 88657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 88757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] = 0xb0000000; 88857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 889322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller assert(!(i->src(0).mod | i->src(1).mod).abs()); 89057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 891322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (i->src(1).getFile() == FILE_IMMEDIATE) { 892322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] = 0; 89357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitForm_IMM(i); 89457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] |= neg0 << 15; 89557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] |= neg1 << 22; 896f3a7be740dd9658097c2518a3bc6ec4ec197ad70Christoph Bumiller if (i->saturate) 897f3a7be740dd9658097c2518a3bc6ec4ec197ad70Christoph Bumiller code[0] |= 1 << 8; 89857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else 89957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (i->encSize == 8) { 900322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] = 0; 90157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitForm_ADD(i); 90257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] |= neg0 << 26; 90357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] |= neg1 << 27; 90457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (i->saturate) 90557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] |= 1 << 29; 90657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else { 90757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitForm_MUL(i); 90857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] |= neg0 << 15; 90957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] |= neg1 << 22; 910322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (i->saturate) 911322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[0] |= 1 << 8; 91257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 91357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 91457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 91557594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 91657594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCodeEmitterNV50::emitUADD(const Instruction *i) 91757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 918322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller const int neg0 = i->src(0).mod.neg(); 919322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller const int neg1 = i->src(1).mod.neg() ^ ((i->op == OP_SUB) ? 1 : 0); 920322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 92157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] = 0x20008000; 92257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 923322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (i->src(1).getFile() == FILE_IMMEDIATE) { 924322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] = 0; 92557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitForm_IMM(i); 92657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else 92757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (i->encSize == 8) { 92857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] = 0x20000000; 929322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] = (typeSizeof(i->dType) == 2) ? 0 : 0x04000000; 93057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitForm_ADD(i); 93157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else { 93257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitForm_MUL(i); 93357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 934322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller assert(!(neg0 && neg1)); 935322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[0] |= neg0 << 28; 936322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[0] |= neg1 << 22; 937322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 938322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (i->flagsSrc >= 0) { 939322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller // addc == sub | subr 940322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller assert(!(code[0] & 0x10400000) && !i->getPredicate()); 941322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[0] |= 0x10400000; 942322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller srcId(i->src(i->flagsSrc), 32 + 12); 943322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller } 94457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 94557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 94657594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 94757594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCodeEmitterNV50::emitAADD(const Instruction *i) 94857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 94957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const int s = (i->op == OP_MOV) ? 0 : 1; 95057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 95157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] = 0xd0000001 | (i->getSrc(s)->reg.data.u16 << 9); 95257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] = 0x20000000; 95357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 954322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[0] |= (DDATA(i->def(0)).id + 1) << 2; 95557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 95657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitFlagsRd(i); 95757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 95857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (s && i->srcExists(0)) 959322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller setARegBits(SDATA(i->src(0)).id + 1); 960322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller} 961322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 962322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumillervoid 963322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph BumillerCodeEmitterNV50::emitIMUL(const Instruction *i) 964322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller{ 965322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[0] = 0x40000000; 966322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 967322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (i->encSize == 8) { 968322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] = (i->sType == TYPE_S16) ? (0x8000 | 0x4000) : 0x0000; 969322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller emitForm_MAD(i); 970322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller } else { 971322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (i->sType == TYPE_S16) 972322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[0] |= 0x8100; 973322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller emitForm_MUL(i); 974322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller } 97557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 97657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 97757594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 97857594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCodeEmitterNV50::emitFMUL(const Instruction *i) 97957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 980322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller const int neg = (i->src(0).mod ^ i->src(1).mod).neg(); 98157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 98257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] = 0xc0000000; 98357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 984322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (i->src(1).getFile() == FILE_IMMEDIATE) { 985322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] = 0; 98657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitForm_IMM(i); 98757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (neg) 98857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] |= 0x8000; 98957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else 99057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (i->encSize == 8) { 991322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] = i->rnd == ROUND_Z ? 0x0000c000 : 0; 99257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (neg) 99357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] |= 0x08000000; 994322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller emitForm_MAD(i); 99557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else { 99657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitForm_MUL(i); 99757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (neg) 99857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] |= 0x8000; 99957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 100057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 100157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 100257594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 1003322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph BumillerCodeEmitterNV50::emitIMAD(const Instruction *i) 1004322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller{ 1005322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[0] = 0x60000000; 1006322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (isSignedType(i->sType)) 1007322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] = i->saturate ? 0x40000000 : 0x20000000; 1008322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller else 1009322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] = 0x00000000; 1010322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 1011322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller int neg1 = i->src(0).mod.neg() ^ i->src(1).mod.neg(); 1012322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller int neg2 = i->src(2).mod.neg(); 1013322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 1014322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller assert(!(neg1 & neg2)); 1015322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] |= neg1 << 27; 1016322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] |= neg2 << 26; 1017322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 1018322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller emitForm_MAD(i); 1019322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 1020322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (i->flagsSrc >= 0) { 1021322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller // add with carry from $cX 1022322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller assert(!(code[1] & 0x0c000000) && !i->getPredicate()); 1023322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] |= 0xc << 24; 1024322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller srcId(i->src(i->flagsSrc), 32 + 12); 1025322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller } 1026322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller} 1027322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 1028322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumillervoid 10291f4c154f0253ed8fb448402532cfa670f74e69cdChristoph BumillerCodeEmitterNV50::emitISAD(const Instruction *i) 10301f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller{ 10311f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller if (i->encSize == 8) { 10321f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller code[0] = 0x50000000; 10331f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller switch (i->sType) { 10341f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller case TYPE_U32: code[1] = 0x04000000; break; 10351f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller case TYPE_S32: code[1] = 0x0c000000; break; 10361f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller case TYPE_U16: code[1] = 0x00000000; break; 10371f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller case TYPE_S16: code[1] = 0x08000000; break; 10381f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller default: 10391f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller assert(0); 10401f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller break; 10411f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller } 10421f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller emitForm_MAD(i); 10431f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller } else { 10441f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller switch (i->sType) { 10451f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller case TYPE_U32: code[0] = 0x50008000; break; 10461f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller case TYPE_S32: code[0] = 0x50008100; break; 10471f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller case TYPE_U16: code[0] = 0x50000000; break; 10481f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller case TYPE_S16: code[0] = 0x50000100; break; 10491f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller default: 10501f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller assert(0); 10511f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller break; 10521f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller } 10531f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller emitForm_MUL(i); 10541f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller } 10551f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller} 10561f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller 10571f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumillervoid 105857594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCodeEmitterNV50::emitSET(const Instruction *i) 105957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 106057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] = 0x30000000; 106157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] = 0x60000000; 106257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 1063322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller emitCondCode(i->asCmp()->setCond, i->sType, 32 + 14); 106457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 106557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (i->sType) { 106657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_F32: code[0] |= 0x80000000; break; 106757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_S32: code[1] |= 0x0c000000; break; 106857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_U32: code[1] |= 0x04000000; break; 106957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_S16: code[1] |= 0x08000000; break; 107057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_U16: break; 107157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 107257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(0); 107357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 107457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 1075322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (i->src(0).mod.neg()) code[1] |= 0x04000000; 1076322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (i->src(1).mod.neg()) code[1] |= 0x08000000; 1077322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (i->src(0).mod.abs()) code[1] |= 0x00100000; 1078322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (i->src(1).mod.abs()) code[1] |= 0x00080000; 1079322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 108057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitForm_MAD(i); 108157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 108257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 108357594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 108457594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCodeEmitterNV50::roundMode_CVT(RoundMode rnd) 108557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 108657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (rnd) { 108757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case ROUND_NI: code[1] |= 0x08000000; break; 108857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case ROUND_M: code[1] |= 0x00020000; break; 108957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case ROUND_MI: code[1] |= 0x08020000; break; 109057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case ROUND_P: code[1] |= 0x00040000; break; 109157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case ROUND_PI: code[1] |= 0x08040000; break; 109257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case ROUND_Z: code[1] |= 0x00060000; break; 109357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case ROUND_ZI: code[1] |= 0x08060000; break; 109457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 109557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(rnd == ROUND_N); 109657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 109757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 109857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 109957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 110057594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 110157594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCodeEmitterNV50::emitCVT(const Instruction *i) 110257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 110357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const bool f2f = isFloatType(i->dType) && isFloatType(i->sType); 110457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller RoundMode rnd; 110557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 110657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (i->op) { 110757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_CEIL: rnd = f2f ? ROUND_PI : ROUND_P; break; 110857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_FLOOR: rnd = f2f ? ROUND_MI : ROUND_M; break; 110957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_TRUNC: rnd = f2f ? ROUND_ZI : ROUND_Z; break; 111057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 111157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller rnd = i->rnd; 111257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 111357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 111457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 111557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] = 0xa0000000; 111657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 111757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (i->dType) { 111857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_F64: 111957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (i->sType) { 112057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_F64: code[1] = 0xc4404000; break; 112157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_S64: code[1] = 0x44414000; break; 112257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_U64: code[1] = 0x44404000; break; 112357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_F32: code[1] = 0xc4400000; break; 112457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_S32: code[1] = 0x44410000; break; 112557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_U32: code[1] = 0x44400000; break; 112657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 112757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(0); 112857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 112957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 113057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 113157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_S64: 113257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (i->sType) { 113357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_F64: code[1] = 0x8c404000; break; 113457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_F32: code[1] = 0x8c400000; break; 113557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 113657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(0); 113757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 113857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 113957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 114057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_U64: 114157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (i->sType) { 114257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_F64: code[1] = 0x84404000; break; 114357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_F32: code[1] = 0x84400000; break; 114457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 114557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(0); 114657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 114757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 114857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 114957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_F32: 115057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (i->sType) { 115157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_F64: code[1] = 0xc0404000; break; 115257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_S64: code[1] = 0x40414000; break; 115357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_U64: code[1] = 0x40404000; break; 115457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_F32: code[1] = 0xc4004000; break; 115557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_S32: code[1] = 0x44014000; break; 115657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_U32: code[1] = 0x44004000; break; 115757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_F16: code[1] = 0xc4000000; break; 115857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 115957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(0); 116057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 116157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 116257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 116357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_S32: 116457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (i->sType) { 116557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_F64: code[1] = 0x88404000; break; 116657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_F32: code[1] = 0x8c004000; break; 116757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_S32: code[1] = 0x0c014000; break; 116857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_U32: code[1] = 0x0c004000; break; 116957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_F16: code[1] = 0x8c000000; break; 117057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_S16: code[1] = 0x0c010000; break; 117157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_U16: code[1] = 0x0c000000; break; 117257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_S8: code[1] = 0x0c018000; break; 117357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_U8: code[1] = 0x0c008000; break; 117457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 117557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(0); 117657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 117757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 117857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 117957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_U32: 118057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (i->sType) { 118157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_F64: code[1] = 0x80404000; break; 118257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_F32: code[1] = 0x84004000; break; 118357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_S32: code[1] = 0x04014000; break; 118457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_U32: code[1] = 0x04004000; break; 118557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_F16: code[1] = 0x84000000; break; 118657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_S16: code[1] = 0x04010000; break; 118757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_U16: code[1] = 0x04000000; break; 118857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_S8: code[1] = 0x04018000; break; 118957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_U8: code[1] = 0x04008000; break; 119057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 119157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(0); 119257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 119357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 1194322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller break; 119557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_S16: 119657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_U16: 119757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_S8: 119857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_U8: 119957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 120057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(0); 120157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 120257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 120357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (typeSizeof(i->sType) == 1 && i->getSrc(0)->reg.size == 4) 120457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] |= 0x00004000; 120557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 120657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller roundMode_CVT(rnd); 120757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 120857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (i->op) { 120957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_ABS: code[1] |= 1 << 20; break; 121057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_SAT: code[1] |= 1 << 19; break; 121157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_NEG: code[1] |= 1 << 29; break; 121257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 121357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 121457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 1215322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] ^= i->src(0).mod.neg() << 29; 1216322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] |= i->src(0).mod.abs() << 20; 121757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (i->saturate) 121857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] |= 1 << 19; 121957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 1220322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller assert(i->op != OP_ABS || !i->src(0).mod.neg()); 122157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 122257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitForm_MAD(i); 122357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 122457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 122557594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 122657594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCodeEmitterNV50::emitPreOp(const Instruction *i) 122757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 122857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] = 0xb0000000; 122957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] = (i->op == OP_PREEX2) ? 0xc0004000 : 0xc0000000; 123057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 1231322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] |= i->src(0).mod.abs() << 20; 1232322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] |= i->src(0).mod.neg() << 26; 123357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 123457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitForm_MAD(i); 123557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 123657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 123757594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 123857594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCodeEmitterNV50::emitSFnOp(const Instruction *i, uint8_t subOp) 123957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 124057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] = 0x90000000; 124157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 124257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (i->encSize == 4) { 124357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(i->op == OP_RCP); 1244ef51ce522bbb0a9bb3e6faa4890049b21f533aedChristoph Bumiller code[0] |= i->src(0).mod.abs() << 15; 1245ef51ce522bbb0a9bb3e6faa4890049b21f533aedChristoph Bumiller code[0] |= i->src(0).mod.neg() << 22; 124657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitForm_MUL(i); 124757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else { 124857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] = subOp << 29; 1249322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] |= i->src(0).mod.abs() << 20; 1250322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] |= i->src(0).mod.neg() << 26; 125157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitForm_MAD(i); 125257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 125357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 125457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 125557594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 1256322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph BumillerCodeEmitterNV50::emitNOT(const Instruction *i) 1257322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller{ 1258322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[0] = 0xd0000000; 1259322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] = 0x0002c000; 1260322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 1261322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller switch (i->sType) { 1262322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case TYPE_U32: 1263322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case TYPE_S32: 1264322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] |= 0x04000000; 1265322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller break; 1266322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller default: 1267322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller break; 1268322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller } 1269322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller emitForm_MAD(i); 1270322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller setSrc(i, 0, 1); 1271322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller} 1272322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 1273322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumillervoid 127457594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCodeEmitterNV50::emitLogicOp(const Instruction *i) 127557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 127657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] = 0xd0000000; 1277322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] = 0; 127857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 1279322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (i->src(1).getFile() == FILE_IMMEDIATE) { 128057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (i->op) { 128157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_OR: code[0] |= 0x0100; break; 128257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_XOR: code[0] |= 0x8000; break; 128357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 128457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(i->op == OP_AND); 128557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 128657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 1287f19b7eceb0a4465a729031a5493154e9ab45203aChristoph Bumiller if (i->src(0).mod & Modifier(NV50_IR_MOD_NOT)) 1288f19b7eceb0a4465a729031a5493154e9ab45203aChristoph Bumiller code[0] |= 1 << 22; 1289f19b7eceb0a4465a729031a5493154e9ab45203aChristoph Bumiller 129057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitForm_IMM(i); 129157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else { 129257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (i->op) { 129357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_AND: code[1] = 0x04000000; break; 129457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_OR: code[1] = 0x04004000; break; 129557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_XOR: code[1] = 0x04008000; break; 129657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 129757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(0); 129857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 129957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 1300322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (i->src(0).mod & Modifier(NV50_IR_MOD_NOT)) 1301322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] |= 1 << 16; 1302322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (i->src(1).mod & Modifier(NV50_IR_MOD_NOT)) 1303322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] |= 1 << 17; 1304322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 130557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitForm_MAD(i); 130657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 130757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 130857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 130957594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 1310322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph BumillerCodeEmitterNV50::emitARL(const Instruction *i, unsigned int shl) 131157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 1312322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[0] = 0x00000001 | (shl << 16); 131357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] = 0xc0000000; 131457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 1315322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[0] |= (DDATA(i->def(0)).id + 1) << 2; 1316322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 1317322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller setSrcFileBits(i, NV50_OP_ENC_IMM); 1318322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller setSrc(i, 0, 0); 131957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitFlagsRd(i); 132057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 132157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 132257594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 132357594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCodeEmitterNV50::emitShift(const Instruction *i) 132457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 1325322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (i->def(0).getFile() == FILE_ADDRESS) { 1326322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller assert(i->srcExists(1) && i->src(1).getFile() == FILE_IMMEDIATE); 1327322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller emitARL(i, i->getSrc(1)->reg.data.u32 & 0x3f); 132857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else { 132957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] = 0x30000001; 133057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] = (i->op == OP_SHR) ? 0xe4000000 : 0xc4000000; 1331322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (i->op == OP_SHR && isSignedType(i->sType)) 133257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] |= 1 << 27; 133357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 1334322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (i->src(1).getFile() == FILE_IMMEDIATE) { 133557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] |= 1 << 20; 133657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] |= (i->getSrc(1)->reg.data.u32 & 0x7f) << 16; 1337322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller defId(i->def(0), 2); 1338322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller srcId(i->src(0), 9); 133957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitFlagsRd(i); 134057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else { 134157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitForm_MAD(i); 134257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 134357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 134457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 134557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 134657594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 134757594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCodeEmitterNV50::emitOUT(const Instruction *i) 134857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 134957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] = (i->op == OP_EMIT) ? 0xf0000200 : 0xf0000400; 135057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] = 0xc0000001; 135157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 135257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitFlagsRd(i); 135357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 135457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 135557594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 135657594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCodeEmitterNV50::emitTEX(const TexInstruction *i) 135757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 135857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] = 0xf0000001; 135957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] = 0x00000000; 136057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 136157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (i->op) { 136257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_TXB: 136357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] = 0x20000000; 136457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 136557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_TXL: 136657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] = 0x40000000; 136757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 136857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_TXF: 1369322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[0] |= 0x01000000; 137057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 137157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_TXG: 137257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] = 0x01000000; 137357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] = 0x80000000; 137457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 137557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 137657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(i->op == OP_TEX); 137757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 137857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 137957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 138057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] |= i->tex.r << 9; 138157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] |= i->tex.s << 17; 138257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 138357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller int argc = i->tex.target.getArgCount(); 138457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 1385322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (i->op == OP_TXB || i->op == OP_TXL || i->op == OP_TXF) 138657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller argc += 1; 138757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (i->tex.target.isShadow()) 138857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller argc += 1; 138957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(argc <= 4); 139057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 139157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] |= (argc - 1) << 22; 139257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 139357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (i->tex.target.isCube()) { 139457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] |= 0x08000000; 139557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else 139657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (i->tex.useOffsets) { 1397322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] |= (i->tex.offset[0][0] & 0xf) << 24; 139857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] |= (i->tex.offset[0][1] & 0xf) << 20; 1399322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] |= (i->tex.offset[0][2] & 0xf) << 16; 140057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 140157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 140257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] |= (i->tex.mask & 0x3) << 25; 140357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] |= (i->tex.mask & 0xc) << 12; 140457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 140557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (i->tex.liveOnly) 140657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] |= 4; 140757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 1408322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller defId(i->def(0), 2); 1409322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 1410322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller emitFlagsRd(i); 1411322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller} 1412322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 1413322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumillervoid 1414322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph BumillerCodeEmitterNV50::emitTXQ(const TexInstruction *i) 1415322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller{ 1416322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller assert(i->tex.query == TXQ_DIMS); 1417322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 1418322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[0] = 0xf0000001; 1419322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] = 0x60000000; 1420322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 1421322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[0] |= i->tex.r << 9; 1422322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[0] |= i->tex.s << 17; 1423322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 1424322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[0] |= (i->tex.mask & 0x3) << 25; 1425322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] |= (i->tex.mask & 0xc) << 12; 1426322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 1427322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller defId(i->def(0), 2); 142857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 142957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitFlagsRd(i); 143057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 143157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 143257594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid 1433322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph BumillerCodeEmitterNV50::emitPRERETEmu(const FlowInstruction *i) 1434322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller{ 1435322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller uint32_t pos = i->target.bb->binPos + 8; // +8 to skip an op */ 1436322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 1437322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[0] = 0x10000003; // bra 1438322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] = 0x00000780; // always 1439322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 1440322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller switch (i->subOp) { 1441322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case NV50_IR_SUBOP_EMU_PRERET + 0: // bra to the call 1442322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller break; 1443322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case NV50_IR_SUBOP_EMU_PRERET + 1: // bra to skip the call 1444322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller pos += 8; 1445322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller break; 1446322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller default: 1447322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller assert(i->subOp == (NV50_IR_SUBOP_EMU_PRERET + 2)); 1448322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[0] = 0x20000003; // call 1449322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller code[1] = 0x00000000; // no predicate 1450322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller break; 1451322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller } 1452322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller addReloc(RelocEntry::TYPE_CODE, 0, pos, 0x07fff800, 9); 1453322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller addReloc(RelocEntry::TYPE_CODE, 1, pos, 0x000fc000, -4); 1454322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller} 1455322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 1456322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumillervoid 145757594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCodeEmitterNV50::emitFlow(const Instruction *i, uint8_t flowOp) 145857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 145957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const FlowInstruction *f = i->asFlow(); 1460322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller bool hasPred = false; 1461322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller bool hasTarg = false; 146257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 146357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] = 0x00000003 | (flowOp << 28); 146457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] = 0x00000000; 146557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 1466322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller switch (i->op) { 1467322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case OP_BRA: 1468322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller hasPred = true; 1469322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller hasTarg = true; 1470322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller break; 1471322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case OP_BREAK: 1472322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case OP_BRKPT: 1473322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case OP_DISCARD: 1474322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case OP_RET: 1475322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller hasPred = true; 1476322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller break; 1477322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case OP_CALL: 1478322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case OP_PREBREAK: 1479322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case OP_JOINAT: 1480322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller hasTarg = true; 1481322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller break; 1482322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case OP_PRERET: 1483322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller hasTarg = true; 1484322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (i->subOp >= NV50_IR_SUBOP_EMU_PRERET) { 1485322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller emitPRERETEmu(f); 1486322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller return; 1487322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller } 1488322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller break; 1489322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller default: 1490322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller break; 1491322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller } 1492322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 1493322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (hasPred) 1494322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller emitFlagsRd(i); 149557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 1496322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (hasTarg && f) { 149757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller uint32_t pos; 149857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 149957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (f->op == OP_CALL) { 150057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (f->builtin) { 1501322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller pos = targ->getBuiltinOffset(f->target.builtin); 150257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else { 150357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller pos = f->target.fn->binPos; 150457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 150557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else { 150657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller pos = f->target.bb->binPos; 150757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 150857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 150957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[0] |= ((pos >> 2) & 0xffff) << 11; 151057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] |= ((pos >> 18) & 0x003f) << 14; 1511322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 1512322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller RelocEntry::Type relocTy; 1513322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 1514322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller relocTy = f->builtin ? RelocEntry::TYPE_BUILTIN : RelocEntry::TYPE_CODE; 1515322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 1516322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller addReloc(relocTy, 0, pos, 0x07fff800, 9); 1517322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller addReloc(relocTy, 1, pos, 0x000fc000, -4); 151857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 151957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 152057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 152157594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerbool 152257594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCodeEmitterNV50::emitInstruction(Instruction *insn) 152357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 152457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (!insn->encSize) { 152557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller ERROR("skipping unencodable instruction: "); insn->print(); 152657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return false; 152757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } else 152857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (codeSize + insn->encSize > codeSizeLimit) { 152957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller ERROR("code emitter output buffer too small\n"); 153057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return false; 153157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 153257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 1533322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (insn->bb->getProgram()->dbgFlags & NV50_IR_DEBUG_BASIC) { 1534322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller INFO("EMIT: "); insn->print(); 1535322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller } 1536322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 153757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (insn->op) { 153857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_MOV: 153957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitMOV(insn); 154057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 1541322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case OP_EXIT: 154257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_NOP: 154357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_JOIN: 154457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitNOP(); 154557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 154657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_VFETCH: 154757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_LOAD: 154857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitLOAD(insn); 154957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 155057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_EXPORT: 155157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_STORE: 155257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitSTORE(insn); 155357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 155457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_PFETCH: 155557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitPFETCH(insn); 155657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 155757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_LINTERP: 155857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_PINTERP: 155957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitINTERP(insn); 156057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 156157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_ADD: 156257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_SUB: 156357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (isFloatType(insn->dType)) 156457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitFADD(insn); 1565322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller else if (insn->getDef(0)->reg.file == FILE_ADDRESS) 1566322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller emitAADD(insn); 156757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller else 156857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitUADD(insn); 156957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 157057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_MUL: 157157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (isFloatType(insn->dType)) 157257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitFMUL(insn); 157357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller else 1574322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller emitIMUL(insn); 157557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 157657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_MAD: 157757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_FMA: 1578322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (isFloatType(insn->dType)) 1579322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller emitFMAD(insn); 1580322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller else 1581322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller emitIMAD(insn); 158257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 15831f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller case OP_SAD: 15841f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller emitISAD(insn); 15851f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller break; 1586322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case OP_NOT: 1587322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller emitNOT(insn); 158857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 158957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_AND: 159057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_OR: 159157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_XOR: 159257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitLogicOp(insn); 159357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 1594322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case OP_SHL: 1595322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case OP_SHR: 1596322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller emitShift(insn); 1597322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller break; 1598322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case OP_SET: 1599322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller emitSET(insn); 1600322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller break; 160157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_MIN: 160257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_MAX: 160357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitMINMAX(insn); 160457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 160557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_CEIL: 160657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_FLOOR: 160757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_TRUNC: 1608322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case OP_ABS: 1609322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case OP_NEG: 1610322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case OP_SAT: 161157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitCVT(insn); 161257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 1613322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case OP_CVT: 1614322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (insn->def(0).getFile() == FILE_ADDRESS) 1615322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller emitARL(insn, 0); 1616322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller else 1617322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (insn->def(0).getFile() == FILE_FLAGS || 1618322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller insn->src(0).getFile() == FILE_FLAGS || 1619322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller insn->src(0).getFile() == FILE_ADDRESS) 1620322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller emitMOV(insn); 1621322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller else 1622322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller emitCVT(insn); 1623322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller break; 162457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_RCP: 162557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitSFnOp(insn, 0); 162657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 162757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_RSQ: 162857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitSFnOp(insn, 2); 162957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 163057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_LG2: 163157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitSFnOp(insn, 3); 163257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 163357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_SIN: 163457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitSFnOp(insn, 4); 163557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 163657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_COS: 163757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitSFnOp(insn, 5); 163857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 163957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_EX2: 164057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitSFnOp(insn, 6); 164157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 164257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_PRESIN: 164357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_PREEX2: 164457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitPreOp(insn); 164557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 164657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_TEX: 164757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_TXB: 164857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_TXL: 1649322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case OP_TXF: 165057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitTEX(insn->asTex()); 165157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 1652322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller case OP_TXQ: 1653322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller emitTXQ(insn->asTex()); 1654322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller break; 165557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_EMIT: 165657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_RESTART: 165757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitOUT(insn); 165857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 165957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_DISCARD: 166057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitFlow(insn, 0x0); 166157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 166257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_BRA: 166357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitFlow(insn, 0x1); 166457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 166557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_CALL: 166657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitFlow(insn, 0x2); 166757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 166857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_RET: 166957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitFlow(insn, 0x3); 167057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 167157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_PREBREAK: 167257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitFlow(insn, 0x4); 167357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 167457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_BREAK: 167557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitFlow(insn, 0x5); 167657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 167757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_QUADON: 167857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitFlow(insn, 0x6); 167957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 168057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_QUADPOP: 168157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitFlow(insn, 0x7); 168257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 168357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_JOINAT: 168457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitFlow(insn, 0xa); 168557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 168657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_PRERET: 168757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitFlow(insn, 0xd); 168857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 168957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_QUADOP: 169057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emitQUADOP(insn, insn->lanes, insn->subOp); 169157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 169257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_DFDX: 1693322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller emitQUADOP(insn, 4, insn->src(0).mod.neg() ? 0x66 : 0x99); 169457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 169557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_DFDY: 1696322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller emitQUADOP(insn, 5, insn->src(0).mod.neg() ? 0x5a : 0xa5); 169757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller break; 169857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_PHI: 169957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_UNION: 170057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_CONSTRAINT: 1701322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller ERROR("operation should have been eliminated\n"); 170257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return false; 170357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_EXP: 170457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_LOG: 170557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_SQRT: 170657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_POW: 170757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_SELP: 170857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_SLCT: 170957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_TXD: 171057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_PRECONT: 171157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_CONT: 171257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_POPCNT: 171357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_INSBF: 171457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case OP_EXTBF: 171557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller ERROR("operation should have been lowered\n"); 171657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return false; 171757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 1718322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller ERROR("unknown op: %u\n", insn->op); 171957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return false; 172057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 1721322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (insn->join || insn->op == OP_JOIN) 172257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] |= 0x2; 172357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller else 1724322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (insn->exit || insn->op == OP_EXIT) 172557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code[1] |= 0x1; 172657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 1727322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller assert((insn->encSize == 8) == (code[0] & 1)); 172857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 172957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code += insn->encSize / 4; 173057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller codeSize += insn->encSize; 173157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return true; 173257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 173357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 173457594065c30feec9376be9b2132659f7d87362eeChristoph Bumilleruint32_t 173557594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCodeEmitterNV50::getMinEncodingSize(const Instruction *i) const 173657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 173757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller const Target::OpInfo &info = targ->getOpInfo(i); 173857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 1739322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (info.minEncSize > 4) 1740322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller return 8; 1741322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 1742322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller // check constraints on dst and src operands 1743322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller for (int d = 0; i->defExists(d); ++d) { 1744322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (i->def(d).rep()->reg.data.id > 63 || 1745322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller i->def(d).rep()->reg.file != FILE_GPR) 1746322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller return 8; 1747322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller } 1748322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 1749322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller for (int s = 0; i->srcExists(s); ++s) { 1750322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller DataFile sf = i->src(s).getFile(); 1751322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (sf != FILE_GPR) 1752322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (sf != FILE_SHADER_INPUT || progType != Program::TYPE_FRAGMENT) 1753322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller return 8; 1754322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (i->src(s).rep()->reg.data.id > 63) 1755322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller return 8; 1756322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller } 1757322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 1758322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller // check modifiers & rounding 1759322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (i->join || i->lanes != 0xf || i->exit) 1760322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller return 8; 1761322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (i->op == OP_MUL && i->rnd != ROUND_N) 176257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return 8; 176357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 1764322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (i->asTex()) 1765322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller return 8; // TODO: short tex encoding 1766322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 1767322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller // check constraints on short MAD 1768322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (info.srcNr >= 2 && i->srcExists(2)) { 1769322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (i->saturate || i->src(2).mod) 1770322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller return 8; 1771322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if ((i->src(0).mod ^ i->src(1).mod) || 1772322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller (i->src(0).mod | i->src(1).mod).abs()) 1773322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller return 8; 1774322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (!i->defExists(0) || 1775322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller i->def(0).rep()->reg.data.id != i->src(2).rep()->reg.data.id) 1776322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller return 8; 1777322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller } 1778322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 1779322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller return info.minEncSize; 1780322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller} 1781322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 1782322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller// Change the encoding size of an instruction after BBs have been scheduled. 1783322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumillerstatic void 1784322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph BumillermakeInstructionLong(Instruction *insn) 1785322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller{ 1786322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (insn->encSize == 8) 1787322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller return; 1788322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller Function *fn = insn->bb->getFunction(); 1789322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller int n = 0; 1790322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller int adj = 4; 1791322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 1792322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller for (Instruction *i = insn->next; i && i->encSize == 4; ++n, i = i->next); 1793322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 1794322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (n & 1) { 1795322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller adj = 8; 1796322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller insn->next->encSize = 8; 1797322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller } else 1798322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (insn->prev && insn->prev->encSize == 4) { 1799322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller adj = 8; 1800322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller insn->prev->encSize = 8; 1801322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller } 1802322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller insn->encSize = 8; 1803322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 1804322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller for (int i = fn->bbCount - 1; i >= 0 && fn->bbArray[i] != insn->bb; --i) { 1805322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller fn->bbArray[i]->binPos += 4; 1806322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller } 1807322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller fn->binSize += adj; 1808322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller insn->bb->binSize += adj; 1809322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller} 1810322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 1811322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumillerstatic bool 1812322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph BumillertrySetExitModifier(Instruction *insn) 1813322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller{ 1814322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (insn->op == OP_DISCARD || 1815322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller insn->op == OP_QUADON || 1816322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller insn->op == OP_QUADPOP) 1817322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller return false; 1818322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller for (int s = 0; insn->srcExists(s); ++s) 1819322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (insn->src(s).getFile() == FILE_IMMEDIATE) 1820322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller return false; 1821322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (insn->asFlow()) { 1822322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (insn->op == OP_CALL) // side effects ! 1823322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller return false; 1824322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (insn->getPredicate()) // cannot do conditional exit (or can we ?) 1825322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller return false; 1826322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller insn->op = OP_EXIT; 1827322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller } 1828322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller insn->exit = 1; 1829322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller makeInstructionLong(insn); 1830322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller return true; 1831322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller} 1832322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 1833322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumillerstatic void 1834322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph BumillerreplaceExitWithModifier(Function *func) 1835322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller{ 1836322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller BasicBlock *epilogue = BasicBlock::get(func->cfgExit); 1837322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 1838322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (!epilogue->getExit() || 1839322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller epilogue->getExit()->op != OP_EXIT) // only main will use OP_EXIT 1840322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller return; 1841322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 1842322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (epilogue->getEntry()->op != OP_EXIT) { 1843322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller Instruction *insn = epilogue->getExit()->prev; 1844322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (!insn || !trySetExitModifier(insn)) 1845322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller return; 1846322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller insn->exit = 1; 1847322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller } else { 1848322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller for (Graph::EdgeIterator ei = func->cfgExit->incident(); 1849322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller !ei.end(); ei.next()) { 1850322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller BasicBlock *bb = BasicBlock::get(ei.getNode()); 1851322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller Instruction *i = bb->getExit(); 1852322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 1853322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller if (!i || !trySetExitModifier(i)) 1854322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller return; 1855322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller } 1856322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller } 1857322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller epilogue->binSize -= 8; 1858322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller func->binSize -= 8; 1859322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller delete_Instruction(func->getProgram(), epilogue->getExit()); 1860322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller} 1861322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 1862322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumillervoid 1863322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph BumillerCodeEmitterNV50::prepareEmission(Function *func) 1864322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller{ 1865322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller CodeEmitter::prepareEmission(func); 1866322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller 1867322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller replaceExitWithModifier(func); 186857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 186957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 1870322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph BumillerCodeEmitterNV50::CodeEmitterNV50(const TargetNV50 *target) : CodeEmitter(target) 187157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 1872322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller targ = target; // specialized 187357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller code = NULL; 187457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller codeSize = codeSizeLimit = 0; 1875322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller relocInfo = NULL; 187657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 187757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 187857594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCodeEmitter * 1879322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph BumillerTargetNV50::getCodeEmitter(Program::Type type) 188057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 188157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller CodeEmitterNV50 *emit = new CodeEmitterNV50(this); 188257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller emit->setProgramType(type); 188357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return emit; 188457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 188557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 188657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} // namespace nv50_ir 1887