1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2011 Christoph Bumiller 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included in 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * all copies or substantial portions of the Software. 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE. 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nv50_ir_target_nvc0.h" 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnamespace nv50_ir { 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Argh, all these assertions ... 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass CodeEmitterNVC0 : public CodeEmitter 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic: 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CodeEmitterNVC0(const TargetNVC0 *); 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual bool emitInstruction(Instruction *); 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual uint32_t getMinEncodingSize(const Instruction *) const; 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual void prepareEmission(Function *); 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inline void setProgramType(Program::Type pType) { progType = pType; } 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprivate: 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const TargetNVC0 *targ; 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Program::Type progType; 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const bool writeIssueDelays; 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprivate: 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitForm_A(const Instruction *, uint64_t); 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitForm_B(const Instruction *, uint64_t); 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitForm_S(const Instruction *, uint32_t, bool pred); 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitPredicate(const Instruction *); 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void setAddress16(const ValueRef&); 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void setImmediate(const Instruction *, const int s); // needs op already set 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void setImmediateS8(const ValueRef&); 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitCondCode(CondCode cc, int pos); 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitInterpMode(const Instruction *); 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitLoadStoreType(DataType ty); 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitCachingMode(CacheMode c); 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitShortSrc2(const ValueRef&); 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inline uint8_t getSRegEncoding(const ValueRef&); 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void roundMode_A(const Instruction *); 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void roundMode_C(const Instruction *); 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void roundMode_CS(const Instruction *); 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitNegAbs12(const Instruction *); 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitNOP(const Instruction *); 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitLOAD(const Instruction *); 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitSTORE(const Instruction *); 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitMOV(const Instruction *); 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitINTERP(const Instruction *); 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitPFETCH(const Instruction *); 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitVFETCH(const Instruction *); 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitEXPORT(const Instruction *); 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitOUT(const Instruction *); 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitUADD(const Instruction *); 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitFADD(const Instruction *); 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitUMUL(const Instruction *); 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitFMUL(const Instruction *); 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitIMAD(const Instruction *); 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitISAD(const Instruction *); 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitFMAD(const Instruction *); 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitNOT(Instruction *); 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitLogicOp(const Instruction *, uint8_t subOp); 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitPOPC(const Instruction *); 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitINSBF(const Instruction *); 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitShift(const Instruction *); 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitSFnOp(const Instruction *, uint8_t subOp); 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitCVT(Instruction *); 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitMINMAX(const Instruction *); 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitPreOp(const Instruction *); 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitSET(const CmpInstruction *); 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitSLCT(const CmpInstruction *); 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitSELP(const Instruction *); 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitTEXBAR(const Instruction *); 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitTEX(const TexInstruction *); 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitTEXCSAA(const TexInstruction *); 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitTXQ(const TexInstruction *); 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitPIXLD(const TexInstruction *); 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitQUADOP(const Instruction *, uint8_t qOp, uint8_t laneMask); 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitFlow(const Instruction *); 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inline void defId(const ValueDef&, const int pos); 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inline void srcId(const ValueRef&, const int pos); 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inline void srcId(const ValueRef *, const int pos); 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inline void srcId(const Instruction *, int s, const int pos); 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inline void srcAddr32(const ValueRef&, const int pos); // address / 4 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inline bool isLIMM(const ValueRef&, DataType ty); 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// for better visibility 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define HEX64(h, l) 0x##h##l##ULL 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SDATA(a) ((a).rep()->reg.data) 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DDATA(a) ((a).rep()->reg.data) 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid CodeEmitterNVC0::srcId(const ValueRef& src, const int pos) 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[pos / 32] |= (src.get() ? SDATA(src).id : 63) << (pos % 32); 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid CodeEmitterNVC0::srcId(const ValueRef *src, const int pos) 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[pos / 32] |= (src ? SDATA(*src).id : 63) << (pos % 32); 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid CodeEmitterNVC0::srcId(const Instruction *insn, int s, int pos) 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int r = insn->srcExists(s) ? SDATA(insn->src(s)).id : 63; 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[pos / 32] |= r << (pos % 32); 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid CodeEmitterNVC0::srcAddr32(const ValueRef& src, const int pos) 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[pos / 32] |= (SDATA(src).offset >> 2) << (pos % 32); 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid CodeEmitterNVC0::defId(const ValueDef& def, const int pos) 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[pos / 32] |= (def.get() ? DDATA(def).id : 63) << (pos % 32); 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool CodeEmitterNVC0::isLIMM(const ValueRef& ref, DataType ty) 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const ImmediateValue *imm = ref.get()->asImm(); 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return imm && (imm->reg.data.u32 & ((ty == TYPE_F32) ? 0xfff : 0xfff00000)); 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::roundMode_A(const Instruction *insn) 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (insn->rnd) { 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case ROUND_M: code[1] |= 1 << 23; break; 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case ROUND_P: code[1] |= 2 << 23; break; 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case ROUND_Z: code[1] |= 3 << 23; break; 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(insn->rnd == ROUND_N); 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitNegAbs12(const Instruction *i) 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(1).mod.abs()) code[0] |= 1 << 6; 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(0).mod.abs()) code[0] |= 1 << 7; 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(1).mod.neg()) code[0] |= 1 << 8; 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(0).mod.neg()) code[0] |= 1 << 9; 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid CodeEmitterNVC0::emitCondCode(CondCode cc, int pos) 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint8_t val; 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (cc) { 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_LT: val = 0x1; break; 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_LTU: val = 0x9; break; 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_EQ: val = 0x2; break; 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_EQU: val = 0xa; break; 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_LE: val = 0x3; break; 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_LEU: val = 0xb; break; 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_GT: val = 0x4; break; 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_GTU: val = 0xc; break; 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_NE: val = 0x5; break; 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_NEU: val = 0xd; break; 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_GE: val = 0x6; break; 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_GEU: val = 0xe; break; 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_TR: val = 0xf; break; 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_FL: val = 0x0; break; 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_A: val = 0x14; break; 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_NA: val = 0x13; break; 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_S: val = 0x15; break; 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_NS: val = 0x12; break; 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_C: val = 0x16; break; 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_NC: val = 0x11; break; 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_O: val = 0x17; break; 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_NO: val = 0x10; break; 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val = 0; 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"invalid condition code"); 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[pos / 32] |= val << (pos % 32); 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitPredicate(const Instruction *i) 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->predSrc >= 0) { 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(i->getPredicate()->reg.file == FILE_PREDICATE); 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->src(i->predSrc), 10); 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->cc == CC_NOT_P) 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 0x2000; // negate 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 0x1c00; 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::setAddress16(const ValueRef& src) 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Symbol *sym = src.get()->asSym(); 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(sym); 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= (sym->reg.data.offset & 0x003f) << 26; 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= (sym->reg.data.offset & 0xffc0) >> 6; 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::setImmediate(const Instruction *i, const int s) 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const ImmediateValue *imm = i->src(s).get()->asImm(); 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t u32; 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(imm); 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u32 = imm->reg.data.u32; 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((code[0] & 0xf) == 0x2) { 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // LIMM 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= (u32 & 0x3f) << 26; 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= u32 >> 6; 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((code[0] & 0xf) == 0x3 || (code[0] & 0xf) == 4) { 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // integer immediate 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert((u32 & 0xfff00000) == 0 || (u32 & 0xfff00000) == 0xfff00000); 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!(code[1] & 0xc000)); 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u32 &= 0xfffff; 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= (u32 & 0x3f) << 26; 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 0xc000 | (u32 >> 6); 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // float immediate 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!(u32 & 0x00000fff)); 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!(code[1] & 0xc000)); 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= ((u32 >> 12) & 0x3f) << 26; 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 0xc000 | (u32 >> 18); 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid CodeEmitterNVC0::setImmediateS8(const ValueRef &ref) 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const ImmediateValue *imm = ref.get()->asImm(); 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int8_t s8 = static_cast<int8_t>(imm->reg.data.s32); 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(s8 == imm->reg.data.s32); 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= (s8 & 0x3f) << 26; 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= (s8 >> 6) << 8; 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitForm_A(const Instruction *i, uint64_t opc) 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = opc; 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = opc >> 32; 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitPredicate(i); 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defId(i->def(0), 14); 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int s1 = 26; 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->srcExists(2) && i->getSrc(2)->reg.file == FILE_MEMORY_CONST) 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s1 = 49; 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (int s = 0; s < 3 && i->srcExists(s); ++s) { 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (i->getSrc(s)->reg.file) { 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_MEMORY_CONST: 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!(code[1] & 0xc000)); 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= (s == 2) ? 0x8000 : 0x4000; 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= i->getSrc(s)->reg.fileIndex << 10; 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setAddress16(i->src(s)); 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_IMMEDIATE: 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(s == 1 || 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i->op == OP_MOV || i->op == OP_PRESIN || i->op == OP_PREEX2); 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!(code[1] & 0xc000)); 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setImmediate(i, s); 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_GPR: 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((s == 2) && ((code[0] & 0x7) == 2)) // LIMM: 3rd src == dst 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->src(s), s ? ((s == 2) ? 49 : s1) : 20); 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // ignore here, can be predicate or flags, but must not be address 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitForm_B(const Instruction *i, uint64_t opc) 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = opc; 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = opc >> 32; 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitPredicate(i); 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defId(i->def(0), 14); 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (i->src(0).getFile()) { 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_MEMORY_CONST: 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!(code[1] & 0xc000)); 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 0x4000 | (i->src(0).get()->reg.fileIndex << 10); 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setAddress16(i->src(0)); 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_IMMEDIATE: 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!(code[1] & 0xc000)); 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setImmediate(i, 0); 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_GPR: 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->src(0), 26); 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // ignore here, can be predicate or flags, but must not be address 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitForm_S(const Instruction *i, uint32_t opc, bool pred) 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = opc; 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int ss2a = 0; 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (opc == 0x0d || opc == 0x0e) 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ss2a = 2; 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defId(i->def(0), 14); 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->src(0), 20); 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(pred || (i->predSrc < 0)); 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pred) 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitPredicate(i); 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (int s = 1; s < 3 && i->srcExists(s); ++s) { 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(s).get()->reg.file == FILE_MEMORY_CONST) { 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!(code[0] & (0x300 >> ss2a))); 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (i->src(s).get()->reg.fileIndex) { 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 0: code[0] |= 0x100 >> ss2a; break; 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: code[0] |= 0x200 >> ss2a; break; 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 16: code[0] |= 0x300 >> ss2a; break; 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ERROR("invalid c[] space for short form\n"); 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (s == 1) 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= i->getSrc(s)->reg.data.offset << 24; 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= i->getSrc(s)->reg.data.offset << 6; 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(s).getFile() == FILE_IMMEDIATE) { 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(s == 1); 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setImmediateS8(i->src(s)); 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(s).getFile() == FILE_GPR) { 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->src(s), (s == 1) ? 26 : 8); 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitShortSrc2(const ValueRef &src) 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (src.getFile() == FILE_MEMORY_CONST) { 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (src.get()->reg.fileIndex) { 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 0: code[0] |= 0x100; break; 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: code[0] |= 0x200; break; 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 16: code[0] |= 0x300; break; 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"unsupported file index for short op"); 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr32(src, 20); 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(src, 20); 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src.getFile() == FILE_GPR); 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitNOP(const Instruction *i) 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x000001e4; 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0x40000000; 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitPredicate(i); 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitFMAD(const Instruction *i) 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool neg1 = (i->src(0).mod ^ i->src(1).mod).neg(); 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->encSize == 8) { 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (isLIMM(i->src(1), TYPE_F32)) { 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_A(i, HEX64(20000000, 00000002)); 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_A(i, HEX64(30000000, 00000000)); 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(2).mod.neg()) 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << 8; 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org roundMode_A(i); 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (neg1) 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << 9; 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->saturate) 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << 5; 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->ftz) 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << 6; 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!i->saturate && !i->src(2).mod.neg()); 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_S(i, (i->src(2).getFile() == FILE_MEMORY_CONST) ? 0x2e : 0x0e, 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org false); 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (neg1) 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << 4; 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitFMUL(const Instruction *i) 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool neg = (i->src(0).mod ^ i->src(1).mod).neg(); 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(i->postFactor >= -3 && i->postFactor <= 3); 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->encSize == 8) { 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (isLIMM(i->src(1), TYPE_F32)) { 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(i->postFactor == 0); // constant folded, hopefully 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_A(i, HEX64(30000000, 00000002)); 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_A(i, HEX64(58000000, 00000000)); 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org roundMode_A(i); 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= ((i->postFactor > 0) ? 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (7 - i->postFactor) : (0 - i->postFactor)) << 17; 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (neg) 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] ^= 1 << 25; // aliases with LIMM sign bit 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->saturate) 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << 5; 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->dnz) 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << 7; 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->ftz) 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << 6; 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!neg && !i->saturate && !i->ftz && !i->postFactor); 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_S(i, 0xa8, true); 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitUMUL(const Instruction *i) 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->encSize == 8) { 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(1).getFile() == FILE_IMMEDIATE) { 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_A(i, HEX64(10000000, 00000002)); 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_A(i, HEX64(50000000, 00000003)); 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->subOp == NV50_IR_SUBOP_MUL_HIGH) 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << 6; 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->sType == TYPE_S32) 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << 5; 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->dType == TYPE_S32) 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << 7; 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_S(i, i->src(1).getFile() == FILE_IMMEDIATE ? 0xaa : 0x2a, true); 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->sType == TYPE_S32) 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << 6; 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitFADD(const Instruction *i) 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->encSize == 8) { 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (isLIMM(i->src(1), TYPE_F32)) { 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!i->saturate); 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_A(i, HEX64(28000000, 00000002)); 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= i->src(0).mod.abs() << 7; 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= i->src(0).mod.neg() << 9; 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(1).mod.abs()) 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] &= 0xfdffffff; 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((i->op == OP_SUB) != static_cast<bool>(i->src(1).mod.neg())) 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] ^= 0x02000000; 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_A(i, HEX64(50000000, 00000000)); 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org roundMode_A(i); 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->saturate) 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 1 << 17; 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitNegAbs12(i); 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->op == OP_SUB) code[0] ^= 1 << 8; 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->ftz) 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << 5; 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!i->saturate && i->op != OP_SUB && 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !i->src(0).mod.abs() && 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !i->src(1).mod.neg() && !i->src(1).mod.abs()); 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_S(i, 0x49, true); 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(0).mod.neg()) 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << 7; 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitUADD(const Instruction *i) 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t addOp = 0; 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!i->src(0).mod.abs() && !i->src(1).mod.abs()); 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!i->src(0).mod.neg() || !i->src(1).mod.neg()); 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(0).mod.neg()) 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org addOp |= 0x200; 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(1).mod.neg()) 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org addOp |= 0x100; 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->op == OP_SUB) { 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org addOp ^= 0x100; 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(addOp != 0x300); // would be add-plus-one 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->encSize == 8) { 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (isLIMM(i->src(1), TYPE_U32)) { 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_A(i, HEX64(08000000, 00000002)); 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->defExists(1)) 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 1 << 26; // write carry 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_A(i, HEX64(48000000, 00000003)); 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->defExists(1)) 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 1 << 16; // write carry 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= addOp; 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->saturate) 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << 5; 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->flagsSrc >= 0) // add carry 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << 6; 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!(addOp & 0x100)); 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_S(i, (addOp >> 3) | 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((i->src(1).getFile() == FILE_IMMEDIATE) ? 0xac : 0x2c), true); 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// TODO: shl-add 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitIMAD(const Instruction *i) 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(i->encSize == 8); 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_A(i, HEX64(20000000, 00000003)); 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (isSignedType(i->dType)) 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << 7; 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (isSignedType(i->sType)) 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << 5; 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= i->saturate << 24; 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->flagsDef >= 0) code[1] |= 1 << 16; 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->flagsSrc >= 0) code[1] |= 1 << 23; 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(2).mod.neg()) code[0] |= 0x10; 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(1).mod.neg() ^ 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i->src(0).mod.neg()) code[0] |= 0x20; 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->subOp == NV50_IR_SUBOP_MUL_HIGH) 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << 6; 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitISAD(const Instruction *i) 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(i->dType == TYPE_S32 || i->dType == TYPE_U32); 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(i->encSize == 8); 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_A(i, HEX64(38000000, 00000003)); 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->dType == TYPE_S32) 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << 5; 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitNOT(Instruction *i) 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(i->encSize == 8); 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i->setSrc(1, i->src(0)); 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_A(i, HEX64(68000000, 000001c3)); 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitLogicOp(const Instruction *i, uint8_t subOp) 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->encSize == 8) { 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (isLIMM(i->src(1), TYPE_U32)) { 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_A(i, HEX64(38000000, 00000002)); 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->srcExists(2)) 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 1 << 26; 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_A(i, HEX64(68000000, 00000003)); 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->srcExists(2)) 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 1 << 16; 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= subOp << 6; 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->srcExists(2)) // carry 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << 5; 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(0).mod & Modifier(NV50_IR_MOD_NOT)) code[0] |= 1 << 9; 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(1).mod & Modifier(NV50_IR_MOD_NOT)) code[0] |= 1 << 8; 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_S(i, (subOp << 5) | 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((i->src(1).getFile() == FILE_IMMEDIATE) ? 0x1d : 0x8d), true); 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitPOPC(const Instruction *i) 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_A(i, HEX64(54000000, 00000004)); 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(0).mod & Modifier(NV50_IR_MOD_NOT)) code[0] |= 1 << 9; 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(1).mod & Modifier(NV50_IR_MOD_NOT)) code[0] |= 1 << 8; 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitINSBF(const Instruction *i) 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_A(i, HEX64(28000000, 30000000)); 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitShift(const Instruction *i) 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->op == OP_SHR) { 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_A(i, HEX64(58000000, 00000003) 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org | (isSignedType(i->dType) ? 0x20 : 0x00)); 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_A(i, HEX64(60000000, 00000003)); 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->subOp == NV50_IR_SUBOP_SHIFT_WRAP) 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << 9; 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitPreOp(const Instruction *i) 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->encSize == 8) { 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_B(i, HEX64(60000000, 00000000)); 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->op == OP_PREEX2) 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 0x20; 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(0).mod.abs()) code[0] |= 1 << 6; 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(0).mod.neg()) code[0] |= 1 << 8; 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_S(i, i->op == OP_PREEX2 ? 0x74000008 : 0x70000008, true); 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitSFnOp(const Instruction *i, uint8_t subOp) 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->encSize == 8) { 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x00000000 | (subOp << 26); 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0xc8000000; 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitPredicate(i); 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defId(i->def(0), 14); 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->src(0), 20); 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(i->src(0).getFile() == FILE_GPR); 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->saturate) code[0] |= 1 << 5; 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(0).mod.abs()) code[0] |= 1 << 7; 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(0).mod.neg()) code[0] |= 1 << 9; 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_S(i, 0x80000008 | (subOp << 26), true); 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!i->src(0).mod.neg()); 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(0).mod.abs()) code[0] |= 1 << 30; 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitMINMAX(const Instruction *i) 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint64_t op; 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(i->encSize == 8); 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org op = (i->op == OP_MIN) ? 0x080e000000000000ULL : 0x081e000000000000ULL; 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->ftz) 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org op |= 1 << 5; 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!isFloatType(i->dType)) 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org op |= isSignedType(i->dType) ? 0x23 : 0x03; 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_A(i, op); 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitNegAbs12(i); 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::roundMode_C(const Instruction *i) 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (i->rnd) { 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case ROUND_M: code[1] |= 1 << 17; break; 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case ROUND_P: code[1] |= 2 << 17; break; 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case ROUND_Z: code[1] |= 3 << 17; break; 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case ROUND_NI: code[0] |= 1 << 7; break; 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case ROUND_MI: code[0] |= 1 << 7; code[1] |= 1 << 17; break; 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case ROUND_PI: code[0] |= 1 << 7; code[1] |= 2 << 17; break; 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case ROUND_ZI: code[0] |= 1 << 7; code[1] |= 3 << 17; break; 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case ROUND_N: break; 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"invalid round mode"); 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::roundMode_CS(const Instruction *i) 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (i->rnd) { 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case ROUND_M: 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case ROUND_MI: code[0] |= 1 << 16; break; 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case ROUND_P: 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case ROUND_PI: code[0] |= 2 << 16; break; 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case ROUND_Z: 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case ROUND_ZI: code[0] |= 3 << 16; break; 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitCVT(Instruction *i) 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const bool f2f = isFloatType(i->dType) && isFloatType(i->sType); 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (i->op) { 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_CEIL: i->rnd = f2f ? ROUND_PI : ROUND_P; break; 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_FLOOR: i->rnd = f2f ? ROUND_MI : ROUND_M; break; 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_TRUNC: i->rnd = f2f ? ROUND_ZI : ROUND_Z; break; 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const bool sat = (i->op == OP_SAT) || i->saturate; 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const bool abs = (i->op == OP_ABS) || i->src(0).mod.abs(); 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const bool neg = (i->op == OP_NEG) || i->src(0).mod.neg(); 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->encSize == 8) { 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_B(i, HEX64(10000000, 00000004)); 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org roundMode_C(i); 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // cvt u16 f32 sets high bits to 0, so we don't have to use Value::Size() 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= util_logbase2(typeSizeof(i->dType)) << 20; 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= util_logbase2(typeSizeof(i->sType)) << 23; 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sat) 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 0x20; 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (abs) 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << 6; 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (neg && i->op != OP_ABS) 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << 8; 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->ftz) 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 1 << 23; 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (isSignedIntType(i->dType)) 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 0x080; 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (isSignedIntType(i->sType)) 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 0x200; 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (isFloatType(i->dType)) { 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!isFloatType(i->sType)) 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 0x08000000; 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (isFloatType(i->sType)) 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 0x04000000; 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 0x0c000000; 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->op == OP_CEIL || i->op == OP_FLOOR || i->op == OP_TRUNC) { 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x298; 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (isFloatType(i->dType)) { 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (isFloatType(i->sType)) 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x098; 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x088 | (isSignedType(i->sType) ? (1 << 8) : 0); 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(isFloatType(i->sType)); 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x288 | (isSignedType(i->sType) ? (1 << 8) : 0); 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (neg) code[0] |= 1 << 16; 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sat) code[0] |= 1 << 18; 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (abs) code[0] |= 1 << 19; 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org roundMode_CS(i); 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitSET(const CmpInstruction *i) 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t hi; 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t lo = 0; 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->sType == TYPE_F64) 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lo = 0x1; 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!isFloatType(i->sType)) 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lo = 0x3; 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (isFloatType(i->dType) || isSignedIntType(i->sType)) 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lo |= 0x20; 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (i->op) { 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_SET_AND: hi = 0x10000000; break; 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_SET_OR: hi = 0x10200000; break; 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_SET_XOR: hi = 0x10400000; break; 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hi = 0x100e0000; 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_A(i, (static_cast<uint64_t>(hi) << 32) | lo); 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->op != OP_SET) 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->src(2), 32 + 17); 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->def(0).getFile() == FILE_PREDICATE) { 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->sType == TYPE_F32) 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] += 0x10000000; 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] += 0x08000000; 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] &= ~0xfc000; 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defId(i->def(0), 17); 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->defExists(1)) 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defId(i->def(1), 14); 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 0x1c000; 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->ftz) 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 1 << 27; 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitCondCode(i->setCond, 32 + 23); 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitNegAbs12(i); 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitSLCT(const CmpInstruction *i) 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint64_t op; 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (i->dType) { 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S32: 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org op = HEX64(30000000, 00000023); 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U32: 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org op = HEX64(30000000, 00000003); 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_F32: 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org op = HEX64(38000000, 00000000); 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"invalid type for SLCT"); 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org op = 0; 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_A(i, op); 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CondCode cc = i->setCond; 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(2).mod.neg()) 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cc = reverseCondCode(cc); 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitCondCode(cc, 32 + 23); 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->ftz) 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << 5; 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid CodeEmitterNVC0::emitSELP(const Instruction *i) 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_A(i, HEX64(20000000, 00000004)); 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->cc == CC_NOT_P || i->src(2).mod & Modifier(NV50_IR_MOD_NOT)) 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 1 << 20; 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid CodeEmitterNVC0::emitTEXBAR(const Instruction *i) 959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x00000006 | (i->subOp << 26); 961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0xf0000000; 962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitPredicate(i); 963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitCondCode(i->flagsSrc >= 0 ? i->cc : CC_ALWAYS, 5); 964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid CodeEmitterNVC0::emitTEXCSAA(const TexInstruction *i) 967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x00000086; 969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0xd0000000; 970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= i->tex.r; 972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= i->tex.s << 8; 973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->tex.liveOnly) 975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << 9; 976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defId(i->def(0), 14); 978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->src(0), 20); 979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline bool 982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgisNextIndependentTex(const TexInstruction *i) 983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!i->next || !isTextureOp(i->next->op)) 985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->getDef(0)->interfers(i->next->getSrc(0))) 987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return !i->next->srcExists(1) || !i->getDef(0)->interfers(i->next->getSrc(1)); 989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitTEX(const TexInstruction *i) 993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x00000006; 995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (isNextIndependentTex(i)) 997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 0x080; // t mode 998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 0x100; // p mode 1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->tex.liveOnly) 1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << 9; 1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (i->op) { 1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_TEX: code[1] = 0x80000000; break; 1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_TXB: code[1] = 0x84000000; break; 1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_TXL: code[1] = 0x86000000; break; 1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_TXF: code[1] = 0x90000000; break; 1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_TXG: code[1] = 0xa0000000; break; 1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_TXD: code[1] = 0xe0000000; break; 1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"invalid texture op"); 1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->op == OP_TXF) { 1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!i->tex.levelZero) 1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 0x02000000; 1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->tex.levelZero) { 1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 0x02000000; 1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->op != OP_TXD && i->tex.derivAll) 1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 1 << 13; 1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defId(i->def(0), 14); 1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->src(0), 20); 1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitPredicate(i); 1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->op == OP_TXG) code[0] |= i->tex.gatherComp << 5; 1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= i->tex.mask << 14; 1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= i->tex.r; 1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= i->tex.s << 8; 1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->tex.rIndirectSrc >= 0 || i->tex.sIndirectSrc >= 0) 1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 1 << 18; // in 1st source (with array index) 1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // texture target: 1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= (i->tex.target.getDim() - 1) << 20; 1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->tex.target.isCube()) 1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] += 2 << 20; 1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->tex.target.isArray()) 1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 1 << 19; 1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->tex.target.isShadow()) 1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 1 << 24; 1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int src1 = (i->predSrc == 1) ? 2 : 1; // if predSrc == 1, !srcExists(2) 1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->srcExists(src1) && i->src(src1).getFile() == FILE_IMMEDIATE) { 1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // lzero 1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->op == OP_TXL) 1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] &= ~(1 << 26); 1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->op == OP_TXF) 1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] &= ~(1 << 25); 1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->tex.target == TEX_TARGET_2D_MS || 1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i->tex.target == TEX_TARGET_2D_MS_ARRAY) 1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 1 << 23; 1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->tex.useOffsets) // in vecSrc0.w 1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 1 << 22; 1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i, src1, 26); 1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitTXQ(const TexInstruction *i) 1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x00000086; 1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0xc0000000; 1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (i->tex.query) { 1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TXQ_DIMS: code[1] |= 0 << 22; break; 1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TXQ_TYPE: code[1] |= 1 << 22; break; 1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TXQ_SAMPLE_POSITION: code[1] |= 2 << 22; break; 1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TXQ_FILTER: code[1] |= 3 << 22; break; 1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TXQ_LOD: code[1] |= 4 << 22; break; 1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TXQ_BORDER_COLOUR: code[1] |= 5 << 22; break; 1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"invalid texture query"); 1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= i->tex.mask << 14; 1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= i->tex.r; 1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= i->tex.s << 8; 1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->tex.sIndirectSrc >= 0 || i->tex.rIndirectSrc >= 0) 1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 1 << 18; 1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int src1 = (i->predSrc == 1) ? 2 : 1; // if predSrc == 1, !srcExists(2) 1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defId(i->def(0), 14); 1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->src(0), 20); 1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i, src1, 26); 1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitPredicate(i); 1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitQUADOP(const Instruction *i, uint8_t qOp, uint8_t laneMask) 1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x00000000 | (laneMask << 6); 1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0x48000000 | qOp; 1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defId(i->def(0), 14); 1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->src(0), 20); 1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->srcExists(1) ? i->src(1) : i->src(0), 26); 1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->op == OP_QUADOP && progType != Program::TYPE_FRAGMENT) 1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << 9; // dall 1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitPredicate(i); 1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitFlow(const Instruction *i) 1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const FlowInstruction *f = i->asFlow(); 1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned mask; // bit 0: predicate, bit 1: target 1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x00000007; 1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (i->op) { 1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_BRA: 1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = f->absolute ? 0x00000000 : 0x40000000; 1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->srcExists(0) && i->src(0).getFile() == FILE_MEMORY_CONST) 1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 0x4000; 1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask = 3; 1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_CALL: 1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = f->absolute ? 0x10000000 : 0x50000000; 1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->srcExists(0) && i->src(0).getFile() == FILE_MEMORY_CONST) 1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 0x4000; 1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask = 2; 1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_EXIT: code[1] = 0x80000000; mask = 1; break; 1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_RET: code[1] = 0x90000000; mask = 1; break; 1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_DISCARD: code[1] = 0x98000000; mask = 1; break; 1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_BREAK: code[1] = 0xa8000000; mask = 1; break; 1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_CONT: code[1] = 0xb0000000; mask = 1; break; 1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_JOINAT: code[1] = 0x60000000; mask = 2; break; 1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_PREBREAK: code[1] = 0x68000000; mask = 2; break; 1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_PRECONT: code[1] = 0x70000000; mask = 2; break; 1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_PRERET: code[1] = 0x78000000; mask = 2; break; 1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_QUADON: code[1] = 0xc0000000; mask = 0; break; 1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_QUADPOP: code[1] = 0xc8000000; mask = 0; break; 1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_BRKPT: code[1] = 0xd0000000; mask = 0; break; 1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"invalid flow operation"); 1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask & 1) { 1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitPredicate(i); 1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->flagsSrc < 0) 1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 0x1e0; 1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!f) 1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (f->allWarp) 1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << 15; 1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (f->limit) 1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << 16; 1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (f->op == OP_CALL) { 1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (f->builtin) { 1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(f->absolute); 1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t pcAbs = targ->getBuiltinOffset(f->target.builtin); 1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org addReloc(RelocEntry::TYPE_BUILTIN, 0, pcAbs, 0xfc000000, 26); 1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org addReloc(RelocEntry::TYPE_BUILTIN, 1, pcAbs, 0x03ffffff, -6); 1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!f->absolute); 1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int32_t pcRel = f->target.fn->binPos - (codeSize + 8); 1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= (pcRel & 0x3f) << 26; 1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= (pcRel >> 6) & 0x3ffff; 1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (mask & 2) { 1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int32_t pcRel = f->target.bb->binPos - (codeSize + 8); 1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // currently we don't want absolute branches 1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!f->absolute); 1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= (pcRel & 0x3f) << 26; 1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= (pcRel >> 6) & 0x3ffff; 1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitPFETCH(const Instruction *i) 1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t prim = i->src(0).get()->reg.data.u32; 1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x00000006 | ((prim & 0x3f) << 26); 1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0x00000000 | (prim >> 6); 1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitPredicate(i); 1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defId(i->def(0), 14); 1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->src(1), 20); 1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitVFETCH(const Instruction *i) 1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x00000006; 1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0x06000000 | i->src(0).get()->reg.data.offset; 1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->perPatch) 1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 0x100; 1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->getSrc(0)->reg.file == FILE_SHADER_OUTPUT) 1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 0x200; // yes, TCPs can read from *outputs* of other threads 1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitPredicate(i); 1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= ((i->getDef(0)->reg.size / 4) - 1) << 5; 1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defId(i->def(0), 14); 1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->src(0).getIndirect(0), 20); 1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->src(0).getIndirect(1), 26); // vertex address 1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitEXPORT(const Instruction *i) 1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int size = typeSizeof(i->dType); 1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x00000006 | ((size / 4 - 1) << 5); 1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0x0a000000 | i->src(0).get()->reg.data.offset; 1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!(code[1] & ((size == 12) ? 15 : (size - 1)))); 1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->perPatch) 1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 0x100; 1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitPredicate(i); 1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(i->src(1).getFile() == FILE_GPR); 1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->src(0).getIndirect(0), 20); 1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->src(0).getIndirect(1), 32 + 17); // vertex base address 1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->src(1), 26); 1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitOUT(const Instruction *i) 1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x00000006; 1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0x1c000000; 1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitPredicate(i); 1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defId(i->def(0), 14); // new secret address 1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->src(0), 20); // old secret address, should be 0 initially 1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(i->src(0).getFile() == FILE_GPR); 1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->op == OP_EMIT) 1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << 5; 1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->op == OP_RESTART || i->subOp == NV50_IR_SUBOP_EMIT_RESTART) 1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << 6; 1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // vertex stream 1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(1).getFile() == FILE_IMMEDIATE) { 1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 0xc000; 1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= SDATA(i->src(1)).u32 << 26; 1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->src(1), 26); 1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitInterpMode(const Instruction *i) 1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->encSize == 8) { 1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= i->ipa << 6; // TODO: INTERP_SAMPLEID 1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->getInterpMode() == NV50_IR_INTERP_SC) 1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 0x80; 1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(i->op == OP_PINTERP && i->getSampleMode() == 0); 1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitINTERP(const Instruction *i) 1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint32_t base = i->getSrc(0)->reg.data.offset; 1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->encSize == 8) { 1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x00000000; 1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0xc0000000 | (base & 0xffff); 1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->saturate) 1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << 5; 1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->op == OP_PINTERP) 1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->src(1), 26); 1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 0x3f << 26; 1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->src(0).getIndirect(0), 20); 1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(i->op == OP_PINTERP); 1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x00000009 | ((base & 0xc) << 6) | ((base >> 4) << 26); 1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->src(1), 20); 1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitInterpMode(i); 1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitPredicate(i); 1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defId(i->def(0), 14); 1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->getSampleMode() == NV50_IR_INTERP_OFFSET) 1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->src(i->op == OP_PINTERP ? 2 : 1), 17); 1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 0x3f << 17; 1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitLoadStoreType(DataType ty) 1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint8_t val; 1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (ty) { 1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U8: 1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val = 0x00; 1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S8: 1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val = 0x20; 1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_F16: 1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U16: 1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val = 0x40; 1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S16: 1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val = 0x60; 1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_F32: 1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U32: 1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S32: 1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val = 0x80; 1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_F64: 1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U64: 1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S64: 1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val = 0xa0; 1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_B128: 1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val = 0xc0; 1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val = 0x80; 1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"invalid type"); 1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= val; 1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitCachingMode(CacheMode c) 1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t val; 1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (c) { 1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CACHE_CA: 1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// case CACHE_WB: 1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val = 0x000; 1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CACHE_CG: 1377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val = 0x100; 1378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CACHE_CS: 1380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val = 0x200; 1381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CACHE_CV: 1383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// case CACHE_WT: 1384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val = 0x300; 1385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org val = 0; 1388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"invalid caching mode"); 1389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= val; 1392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitSTORE(const Instruction *i) 1396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t opc; 1398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (i->src(0).getFile()) { 1400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_MEMORY_GLOBAL: opc = 0x90000000; break; 1401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_MEMORY_LOCAL: opc = 0xc8000000; break; 1402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_MEMORY_SHARED: opc = 0xc9000000; break; 1403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"invalid memory file"); 1405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opc = 0; 1406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x00000005; 1409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = opc; 1410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setAddress16(i->src(0)); 1412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->src(1), 14); 1413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->src(0).getIndirect(0), 20); 1414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitPredicate(i); 1416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitLoadStoreType(i->dType); 1418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitCachingMode(i->cache); 1419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitLOAD(const Instruction *i) 1423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t opc; 1425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x00000005; 1427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (i->src(0).getFile()) { 1429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_MEMORY_GLOBAL: opc = 0x80000000; break; 1430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_MEMORY_LOCAL: opc = 0xc0000000; break; 1431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_MEMORY_SHARED: opc = 0xc1000000; break; 1432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_MEMORY_CONST: 1433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!i->src(0).isIndirect(0) && typeSizeof(i->dType) == 4) { 1434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitMOV(i); // not sure if this is any better 1435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opc = 0x14000000 | (i->src(0).get()->reg.fileIndex << 10); 1438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x00000006 | (i->subOp << 8); 1439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"invalid memory file"); 1442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opc = 0; 1443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = opc; 1446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defId(i->def(0), 14); 1448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setAddress16(i->src(0)); 1450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->src(0).getIndirect(0), 20); 1451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitPredicate(i); 1453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitLoadStoreType(i->dType); 1455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitCachingMode(i->cache); 1456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orguint8_t 1459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::getSRegEncoding(const ValueRef& ref) 1460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (SDATA(ref).sv.sv) { 1462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case SV_LANEID: return 0x00; 1463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case SV_PHYSID: return 0x03; 1464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case SV_VERTEX_COUNT: return 0x10; 1465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case SV_INVOCATION_ID: return 0x11; 1466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case SV_YDIR: return 0x12; 1467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case SV_TID: return 0x21 + SDATA(ref).sv.index; 1468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case SV_CTAID: return 0x25 + SDATA(ref).sv.index; 1469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case SV_NTID: return 0x29 + SDATA(ref).sv.index; 1470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case SV_GRIDID: return 0x2c; 1471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case SV_NCTAID: return 0x2d + SDATA(ref).sv.index; 1472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case SV_LBASE: return 0x34; 1473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case SV_SBASE: return 0x30; 1474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case SV_CLOCK: return 0x50 + SDATA(ref).sv.index; 1475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"no sreg for system value"); 1477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 1478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitMOV(const Instruction *i) 1483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(0).getFile() == FILE_SYSTEM_VALUE) { 1485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint8_t sr = getSRegEncoding(i->src(0)); 1486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->encSize == 8) { 1488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x00000004 | (sr << 26); 1489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0x2c000000; 1490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x40000008 | (sr << 20); 1492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defId(i->def(0), 14); 1494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitPredicate(i); 1496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 1497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->encSize == 8) { 1498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint64_t opc; 1499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(0).getFile() == FILE_IMMEDIATE) 1501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opc = HEX64(18000000, 000001e2); 1502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(0).getFile() == FILE_PREDICATE) 1504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opc = HEX64(080e0000, 1c000004); 1505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opc = HEX64(28000000, 00000004); 1507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org opc |= i->lanes << 5; 1509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_B(i, opc); 1511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t imm; 1513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(0).getFile() == FILE_IMMEDIATE) { 1515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org imm = SDATA(i->src(0)).u32; 1516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (imm & 0xfff00000) { 1517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!(imm & 0x000fffff)); 1518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x00000318 | imm; 1519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(imm < 0x800 || ((int32_t)imm >= -0x800)); 1521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x00000118 | (imm << 20); 1522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x0028; 1525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitShortSrc2(i->src(0)); 1526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defId(i->def(0), 14); 1528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitPredicate(i); 1530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool 1534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::emitInstruction(Instruction *insn) 1535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int size = insn->encSize; 1537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (writeIssueDelays && !(codeSize & 0x3f)) 1539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size += 8; 1540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!insn->encSize) { 1542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ERROR("skipping unencodable instruction: "); insn->print(); 1543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 1544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 1545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (codeSize + size > codeSizeLimit) { 1546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ERROR("code emitter output buffer too small\n"); 1547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 1548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (writeIssueDelays) { 1551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(codeSize & 0x3f)) { 1552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x00000007; // cf issue delay "instruction" 1553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0x20000000; 1554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code += 2; 1555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org codeSize += 8; 1556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned int id = (codeSize & 0x3f) / 8 - 1; 1558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t *data = code - (id * 2 + 2); 1559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (id <= 2) { 1560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data[0] |= insn->sched << (id * 8 + 4); 1561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 1562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (id == 3) { 1563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data[0] |= insn->sched << 28; 1564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data[1] |= insn->sched >> 4; 1565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data[1] |= insn->sched << ((id - 4) * 8 + 4); 1567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // assert that instructions with multiple defs don't corrupt registers 1571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (int d = 0; insn->defExists(d); ++d) 1572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(insn->asTex() || insn->def(d).rep()->reg.data.id >= 0); 1573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (insn->op) { 1575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_MOV: 1576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_RDSV: 1577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitMOV(insn); 1578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_NOP: 1580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_LOAD: 1582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitLOAD(insn); 1583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_STORE: 1585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitSTORE(insn); 1586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_LINTERP: 1588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_PINTERP: 1589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitINTERP(insn); 1590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_VFETCH: 1592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitVFETCH(insn); 1593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_EXPORT: 1595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitEXPORT(insn); 1596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_PFETCH: 1598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitPFETCH(insn); 1599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_EMIT: 1601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_RESTART: 1602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitOUT(insn); 1603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_ADD: 1605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_SUB: 1606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (isFloatType(insn->dType)) 1607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitFADD(insn); 1608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitUADD(insn); 1610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_MUL: 1612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (isFloatType(insn->dType)) 1613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitFMUL(insn); 1614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitUMUL(insn); 1616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_MAD: 1618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_FMA: 1619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (isFloatType(insn->dType)) 1620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitFMAD(insn); 1621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitIMAD(insn); 1623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_SAD: 1625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitISAD(insn); 1626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_NOT: 1628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitNOT(insn); 1629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_AND: 1631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitLogicOp(insn, 0); 1632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_OR: 1634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitLogicOp(insn, 1); 1635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_XOR: 1637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitLogicOp(insn, 2); 1638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_SHL: 1640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_SHR: 1641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitShift(insn); 1642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_SET: 1644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_SET_AND: 1645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_SET_OR: 1646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_SET_XOR: 1647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitSET(insn->asCmp()); 1648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_SELP: 1650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitSELP(insn); 1651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_SLCT: 1653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitSLCT(insn->asCmp()); 1654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_MIN: 1656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_MAX: 1657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitMINMAX(insn); 1658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_ABS: 1660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_NEG: 1661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_CEIL: 1662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_FLOOR: 1663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_TRUNC: 1664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_CVT: 1665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_SAT: 1666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitCVT(insn); 1667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_RSQ: 1669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitSFnOp(insn, 5); 1670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_RCP: 1672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitSFnOp(insn, 4); 1673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_LG2: 1675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitSFnOp(insn, 3); 1676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_EX2: 1678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitSFnOp(insn, 2); 1679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_SIN: 1681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitSFnOp(insn, 1); 1682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_COS: 1684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitSFnOp(insn, 0); 1685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_PRESIN: 1687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_PREEX2: 1688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitPreOp(insn); 1689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_TEX: 1691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_TXB: 1692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_TXL: 1693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_TXD: 1694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_TXF: 1695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitTEX(insn->asTex()); 1696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_TXQ: 1698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitTXQ(insn->asTex()); 1699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_TEXBAR: 1701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitTEXBAR(insn); 1702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_BRA: 1704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_CALL: 1705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_PRERET: 1706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_RET: 1707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_DISCARD: 1708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_EXIT: 1709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_PRECONT: 1710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_CONT: 1711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_PREBREAK: 1712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_BREAK: 1713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_JOINAT: 1714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_BRKPT: 1715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_QUADON: 1716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_QUADPOP: 1717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitFlow(insn); 1718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_QUADOP: 1720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitQUADOP(insn, insn->subOp, insn->lanes); 1721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_DFDX: 1723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitQUADOP(insn, insn->src(0).mod.neg() ? 0x66 : 0x99, 0x4); 1724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_DFDY: 1726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitQUADOP(insn, insn->src(0).mod.neg() ? 0x5a : 0xa5, 0x5); 1727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_POPCNT: 1729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitPOPC(insn); 1730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_JOIN: 1732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitNOP(insn); 1733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->join = 1; 1734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_PHI: 1736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_UNION: 1737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_CONSTRAINT: 1738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ERROR("operation should have been eliminated"); 1739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 1740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_EXP: 1741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_LOG: 1742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_SQRT: 1743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_POW: 1744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ERROR("operation should have been lowered\n"); 1745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 1746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ERROR("unknow op\n"); 1748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 1749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn->join) { 1752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 0x10; 1753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(insn->encSize == 8); 1754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code += insn->encSize / 4; 1757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org codeSize += insn->encSize; 1758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return true; 1759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orguint32_t 1762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::getMinEncodingSize(const Instruction *i) const 1763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const Target::OpInfo &info = targ->getOpInfo(i); 1765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (writeIssueDelays || info.minEncSize == 8 || 1) 1767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 8; 1768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->ftz || i->saturate || i->join) 1770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 8; 1771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->rnd != ROUND_N) 1772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 8; 1773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->predSrc >= 0 && i->op == OP_MAD) 1774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 8; 1775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->op == OP_PINTERP) { 1777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->getSampleMode() || 1) // XXX: grr, short op doesn't work 1778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 8; 1779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 1780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->op == OP_MOV && i->lanes != 0xf) { 1781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 8; 1782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (int s = 0; i->srcExists(s); ++s) { 1785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(s).isIndirect(0)) 1786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 8; 1787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(s).getFile() == FILE_MEMORY_CONST) { 1789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (SDATA(i->src(s)).offset >= 0x100) 1790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 8; 1791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->getSrc(s)->reg.fileIndex > 1 && 1792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i->getSrc(s)->reg.fileIndex != 16) 1793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 8; 1794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 1795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(s).getFile() == FILE_IMMEDIATE) { 1796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->dType == TYPE_F32) { 1797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (SDATA(i->src(s)).u32 >= 0x100) 1798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 8; 1799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (SDATA(i->src(s)).u32 > 0xff) 1801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 8; 1802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->op == OP_CVT) 1806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 1807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(s).mod != Modifier(0)) { 1808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(s).mod == Modifier(NV50_IR_MOD_ABS)) 1809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->op != OP_RSQ) 1810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 8; 1811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(s).mod == Modifier(NV50_IR_MOD_NEG)) 1812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->op != OP_ADD || s != 0) 1813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 8; 1814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 4; 1818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Simplified, erring on safe side. 1821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass SchedDataCalculator : public Pass 1822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic: 1824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SchedDataCalculator(const Target *targ) : targ(targ) { } 1825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprivate: 1827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct RegScores 1828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct Resource { 1830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int st[DATA_FILE_COUNT]; // LD to LD delay 3 1831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int ld[DATA_FILE_COUNT]; // ST to ST delay 3 1832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int tex; // TEX to non-TEX delay 17 (0x11) 1833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int sfu; // SFU to SFU delay 3 (except PRE-ops) 1834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int imul; // integer MUL to MUL delay 3 1835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } res; 1836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct ScoreData { 1837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int r[64]; 1838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int p[8]; 1839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int c; 1840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } rd, wr; 1841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int base; 1842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void rebase(const int base) 1844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int delta = this->base - base; 1846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!delta) 1847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org this->base = 0; 1849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (int i = 0; i < 64; ++i) { 1851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rd.r[i] += delta; 1852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wr.r[i] += delta; 1853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (int i = 0; i < 8; ++i) { 1855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rd.p[i] += delta; 1856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wr.p[i] += delta; 1857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rd.c += delta; 1859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wr.c += delta; 1860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (unsigned int f = 0; f < DATA_FILE_COUNT; ++f) { 1862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res.ld[f] += delta; 1863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res.st[f] += delta; 1864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res.sfu += delta; 1866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res.imul += delta; 1867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res.tex += delta; 1868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void wipe() 1870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&rd, 0, sizeof(rd)); 1872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&wr, 0, sizeof(wr)); 1873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&res, 0, sizeof(res)); 1874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int getLatest(const ScoreData& d) const 1876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int max = 0; 1878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (int i = 0; i < 64; ++i) 1879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (d.r[i] > max) 1880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org max = d.r[i]; 1881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (int i = 0; i < 8; ++i) 1882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (d.p[i] > max) 1883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org max = d.p[i]; 1884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (d.c > max) 1885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org max = d.c; 1886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return max; 1887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inline int getLatestRd() const 1889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return getLatest(rd); 1891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inline int getLatestWr() const 1893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return getLatest(wr); 1895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inline int getLatest() const 1897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int a = getLatestRd(); 1899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int b = getLatestWr(); 1900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int max = MAX2(a, b); 1902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (unsigned int f = 0; f < DATA_FILE_COUNT; ++f) { 1903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org max = MAX2(res.ld[f], max); 1904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org max = MAX2(res.st[f], max); 1905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org max = MAX2(res.sfu, max); 1907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org max = MAX2(res.imul, max); 1908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org max = MAX2(res.tex, max); 1909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return max; 1910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void setMax(const RegScores *that) 1912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (int i = 0; i < 64; ++i) { 1914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rd.r[i] = MAX2(rd.r[i], that->rd.r[i]); 1915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wr.r[i] = MAX2(wr.r[i], that->wr.r[i]); 1916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (int i = 0; i < 8; ++i) { 1918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rd.p[i] = MAX2(rd.p[i], that->rd.p[i]); 1919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wr.p[i] = MAX2(wr.p[i], that->wr.p[i]); 1920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rd.c = MAX2(rd.c, that->rd.c); 1922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org wr.c = MAX2(wr.c, that->wr.c); 1923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (unsigned int f = 0; f < DATA_FILE_COUNT; ++f) { 1925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res.ld[f] = MAX2(res.ld[f], that->res.ld[f]); 1926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res.st[f] = MAX2(res.st[f], that->res.st[f]); 1927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res.sfu = MAX2(res.sfu, that->res.sfu); 1929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res.imul = MAX2(res.imul, that->res.imul); 1930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org res.tex = MAX2(res.tex, that->res.tex); 1931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void print(int cycle) 1933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (int i = 0; i < 64; ++i) { 1935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rd.r[i] > cycle) 1936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INFO("rd $r%i @ %i\n", i, rd.r[i]); 1937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (wr.r[i] > cycle) 1938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INFO("wr $r%i @ %i\n", i, wr.r[i]); 1939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (int i = 0; i < 8; ++i) { 1941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rd.p[i] > cycle) 1942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INFO("rd $p%i @ %i\n", i, rd.p[i]); 1943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (wr.p[i] > cycle) 1944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INFO("wr $p%i @ %i\n", i, wr.p[i]); 1945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rd.c > cycle) 1947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INFO("rd $c @ %i\n", rd.c); 1948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (wr.c > cycle) 1949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INFO("wr $c @ %i\n", wr.c); 1950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (res.sfu > cycle) 1951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INFO("sfu @ %i\n", res.sfu); 1952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (res.imul > cycle) 1953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INFO("imul @ %i\n", res.imul); 1954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (res.tex > cycle) 1955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INFO("tex @ %i\n", res.tex); 1956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }; 1958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RegScores *score; // for current BB 1960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org std::vector<RegScores> scoreBoards; 1961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int cycle; 1962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int prevData; 1963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org operation prevOp; 1964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const Target *targ; 1966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool visit(Function *); 1968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool visit(BasicBlock *); 1969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void commitInsn(const Instruction *, int cycle); 1971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int calcDelay(const Instruction *, int cycle) const; 1972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void setDelay(Instruction *, int delay, Instruction *next); 1973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void recordRd(const Value *, const int ready); 1975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void recordWr(const Value *, const int ready); 1976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void checkRd(const Value *, int cycle, int& delay) const; 1977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void checkWr(const Value *, int cycle, int& delay) const; 1978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int getCycles(const Instruction *, int origDelay) const; 1980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 1981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgSchedDataCalculator::setDelay(Instruction *insn, int delay, Instruction *next) 1984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn->op == OP_EXIT) 1986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org delay = MAX2(delay, 14); 1987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn->op == OP_TEXBAR) { 1989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // TODO: except if results not used before EXIT 1990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->sched = 0xc2; 1991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 1992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn->op == OP_JOIN || insn->join) { 1993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->sched = 0x00; 1994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 1995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (delay >= 0 || prevData == 0x04 || 1996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !next || !targ->canDualIssue(insn, next)) { 1997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->sched = static_cast<uint8_t>(MAX2(delay, 0)); 1998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (prevOp == OP_EXPORT) 1999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->sched |= 0x40; 2000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 2001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->sched |= 0x20; 2002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 2003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->sched = 0x04; // dual-issue 2004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (prevData != 0x04 || prevOp != OP_EXPORT) 2007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn->sched != 0x04 || insn->op == OP_EXPORT) 2008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prevOp = insn->op; 2009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prevData = insn->sched; 2011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint 2014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgSchedDataCalculator::getCycles(const Instruction *insn, int origDelay) const 2015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn->sched & 0x80) { 2017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int c = (insn->sched & 0x0f) * 2 + 1; 2018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn->op == OP_TEXBAR && origDelay > 0) 2019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c += origDelay; 2020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return c; 2021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn->sched & 0x60) 2023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (insn->sched & 0x1f) + 1; 2024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (insn->sched == 0x04) ? 0 : 32; 2025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool 2028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgSchedDataCalculator::visit(Function *func) 2029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org scoreBoards.resize(func->cfg.getSize()); 2031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (size_t i = 0; i < scoreBoards.size(); ++i) 2032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org scoreBoards[i].wipe(); 2033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return true; 2034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool 2037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgSchedDataCalculator::visit(BasicBlock *bb) 2038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Instruction *insn; 2040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Instruction *next = NULL; 2041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int cycle = 0; 2043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prevData = 0x00; 2045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prevOp = OP_NOP; 2046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org score = &scoreBoards.at(bb->getId()); 2047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (Graph::EdgeIterator ei = bb->cfg.incident(); !ei.end(); ei.next()) { 2049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BasicBlock *in = BasicBlock::get(ei.getNode()); 2050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (in->getExit()) { 2051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (prevData != 0x04) 2052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prevData = in->getExit()->sched; 2053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prevOp = in->getExit()->op; 2054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ei.getType() != Graph::Edge::BACK) 2056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org score->setMax(&scoreBoards.at(in->getId())); 2057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // back branches will wait until all target dependencies are satisfied 2058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bb->cfg.incidentCount() > 1) 2060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prevOp = OP_NOP; 2061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef NVC0_DEBUG_SCHED_DATA 2063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INFO("=== BB:%i initial scores\n", bb->getId()); 2064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org score->print(cycle); 2065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 2066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (insn = bb->getEntry(); insn && insn->next; insn = insn->next) { 2068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org next = insn->next; 2069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org commitInsn(insn, cycle); 2071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int delay = calcDelay(next, cycle); 2072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setDelay(insn, delay, next); 2073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cycle += getCycles(insn, delay); 2074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef NVC0_DEBUG_SCHED_DATA 2076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INFO("cycle %i, sched %02x\n", cycle, insn->sched); 2077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->print(); 2078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org next->print(); 2079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 2080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!insn) 2082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return true; 2083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org commitInsn(insn, cycle); 2084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int bbDelay = -1; 2086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (Graph::EdgeIterator ei = bb->cfg.outgoing(); !ei.end(); ei.next()) { 2088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BasicBlock *out = BasicBlock::get(ei.getNode()); 2089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ei.getType() != Graph::Edge::BACK) { 2091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // only test the first instruction of the outgoing block 2092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org next = out->getEntry(); 2093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (next) 2094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bbDelay = MAX2(bbDelay, calcDelay(next, cycle)); 2095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 2096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // wait until all dependencies are satisfied 2097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int regsFree = score->getLatest(); 2098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org next = out->getFirst(); 2099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (int c = cycle; next && c < regsFree; next = next->next) { 2100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bbDelay = MAX2(bbDelay, calcDelay(next, c)); 2101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c += getCycles(next, bbDelay); 2102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org next = NULL; 2104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bb->cfg.outgoingCount() != 1) 2107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org next = NULL; 2108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setDelay(insn, bbDelay, next); 2109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org cycle += getCycles(insn, bbDelay); 2110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org score->rebase(cycle); // common base for initializing out blocks' scores 2112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return true; 2113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NVE4_MAX_ISSUE_DELAY 0x1f 2116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint 2117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgSchedDataCalculator::calcDelay(const Instruction *insn, int cycle) const 2118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int delay = 0, ready = cycle; 2120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (int s = 0; insn->srcExists(s); ++s) 2122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org checkRd(insn->getSrc(s), cycle, delay); 2123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // WAR & WAW don't seem to matter 2124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // for (int s = 0; insn->srcExists(s); ++s) 2125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // recordRd(insn->getSrc(s), cycle); 2126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (Target::getOpClass(insn->op)) { 2128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OPCLASS_SFU: 2129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ready = score->res.sfu; 2130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OPCLASS_ARITH: 2132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn->op == OP_MUL && !isFloatType(insn->dType)) 2133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ready = score->res.imul; 2134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OPCLASS_TEXTURE: 2136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ready = score->res.tex; 2137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OPCLASS_LOAD: 2139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ready = score->res.ld[insn->src(0).getFile()]; 2140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OPCLASS_STORE: 2142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ready = score->res.st[insn->src(0).getFile()]; 2143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 2145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (Target::getOpClass(insn->op) != OPCLASS_TEXTURE) 2148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ready = MAX2(ready, score->res.tex); 2149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org delay = MAX2(delay, ready - cycle); 2151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // if can issue next cycle, delay is 0, not 1 2153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MIN2(delay - 1, NVE4_MAX_ISSUE_DELAY); 2154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 2157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgSchedDataCalculator::commitInsn(const Instruction *insn, int cycle) 2158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int ready = cycle + targ->getLatency(insn); 2160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (int d = 0; insn->defExists(d); ++d) 2162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org recordWr(insn->getDef(d), ready); 2163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // WAR & WAW don't seem to matter 2164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // for (int s = 0; insn->srcExists(s); ++s) 2165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // recordRd(insn->getSrc(s), cycle); 2166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (Target::getOpClass(insn->op)) { 2168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OPCLASS_SFU: 2169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org score->res.sfu = cycle + 4; 2170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OPCLASS_ARITH: 2172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn->op == OP_MUL && !isFloatType(insn->dType)) 2173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org score->res.imul = cycle + 4; 2174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OPCLASS_TEXTURE: 2176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org score->res.tex = cycle + 18; 2177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OPCLASS_LOAD: 2179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn->src(0).getFile() == FILE_MEMORY_CONST) 2180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org score->res.ld[insn->src(0).getFile()] = cycle + 4; 2182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org score->res.st[insn->src(0).getFile()] = ready; 2183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OPCLASS_STORE: 2185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org score->res.st[insn->src(0).getFile()] = cycle + 4; 2186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org score->res.ld[insn->src(0).getFile()] = ready; 2187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OPCLASS_OTHER: 2189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn->op == OP_TEXBAR) 2190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org score->res.tex = cycle; 2191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 2193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef NVC0_DEBUG_SCHED_DATA 2197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org score->print(cycle); 2198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 2199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 2202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgSchedDataCalculator::checkRd(const Value *v, int cycle, int& delay) const 2203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int ready = cycle; 2205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int a, b; 2206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (v->reg.file) { 2208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_GPR: 2209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org a = v->reg.data.id; 2210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b = a + v->reg.size / 4; 2211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (int r = a; r < b; ++r) 2212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ready = MAX2(ready, score->rd.r[r]); 2213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_PREDICATE: 2215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ready = MAX2(ready, score->rd.p[v->reg.data.id]); 2216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_FLAGS: 2218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ready = MAX2(ready, score->rd.c); 2219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_SHADER_INPUT: 2221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_SHADER_OUTPUT: // yes, TCPs can read outputs 2222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_MEMORY_LOCAL: 2223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_MEMORY_CONST: 2224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_MEMORY_SHARED: 2225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_MEMORY_GLOBAL: 2226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_SYSTEM_VALUE: 2227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // TODO: any restrictions here ? 2228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_IMMEDIATE: 2230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 2232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 2233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cycle < ready) 2236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org delay = MAX2(delay, ready - cycle); 2237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 2240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgSchedDataCalculator::checkWr(const Value *v, int cycle, int& delay) const 2241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int ready = cycle; 2243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int a, b; 2244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (v->reg.file) { 2246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_GPR: 2247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org a = v->reg.data.id; 2248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b = a + v->reg.size / 4; 2249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (int r = a; r < b; ++r) 2250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ready = MAX2(ready, score->wr.r[r]); 2251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_PREDICATE: 2253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ready = MAX2(ready, score->wr.p[v->reg.data.id]); 2254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 2256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(v->reg.file == FILE_FLAGS); 2257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ready = MAX2(ready, score->wr.c); 2258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (cycle < ready) 2261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org delay = MAX2(delay, ready - cycle); 2262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 2265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgSchedDataCalculator::recordWr(const Value *v, const int ready) 2266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int a = v->reg.data.id; 2268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (v->reg.file == FILE_GPR) { 2270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int b = a + v->reg.size / 4; 2271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (int r = a; r < b; ++r) 2272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org score->rd.r[r] = ready; 2273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 2274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // $c, $pX: shorter issue-to-read delay (at least as exec pred and carry) 2275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (v->reg.file == FILE_PREDICATE) { 2276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org score->rd.p[a] = ready + 4; 2277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 2278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(v->reg.file == FILE_FLAGS); 2279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org score->rd.c = ready + 4; 2280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 2284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgSchedDataCalculator::recordRd(const Value *v, const int ready) 2285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int a = v->reg.data.id; 2287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (v->reg.file == FILE_GPR) { 2289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int b = a + v->reg.size / 4; 2290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (int r = a; r < b; ++r) 2291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org score->wr.r[r] = ready; 2292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 2293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (v->reg.file == FILE_PREDICATE) { 2294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org score->wr.p[a] = ready; 2295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 2296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (v->reg.file == FILE_FLAGS) { 2297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org score->wr.c = ready; 2298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 2302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::prepareEmission(Function *func) 2303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const Target *targ = func->getProgram()->getTarget(); 2305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CodeEmitter::prepareEmission(func); 2307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (targ->hasSWSched) { 2309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SchedDataCalculator sched(targ); 2310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sched.run(func, true, true); 2311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNVC0::CodeEmitterNVC0(const TargetNVC0 *target) 2315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org : CodeEmitter(target), 2316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org writeIssueDelays(target->hasSWSched) 2317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code = NULL; 2319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org codeSize = codeSizeLimit = 0; 2320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org relocInfo = NULL; 2321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitter * 2324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTargetNVC0::getCodeEmitter(Program::Type type) 2325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CodeEmitterNVC0 *emit = new CodeEmitterNVC0(this); 2327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit->setProgramType(type); 2328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return emit; 2329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} // namespace nv50_ir 2332