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.h" 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nv50_ir_target_nv50.h" 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnamespace nv50_ir { 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NV50_OP_ENC_LONG 0 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NV50_OP_ENC_SHORT 1 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NV50_OP_ENC_IMM 2 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NV50_OP_ENC_LONG_ALT 3 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass CodeEmitterNV50 : public CodeEmitter 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic: 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CodeEmitterNV50(const TargetNV50 *); 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual bool emitInstruction(Instruction *); 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual uint32_t getMinEncodingSize(const Instruction *) const; 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inline void setProgramType(Program::Type pType) { progType = pType; } 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual void prepareEmission(Function *); 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprivate: 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Program::Type progType; 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const TargetNV50 *targ; 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprivate: 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inline void defId(const ValueDef&, const int pos); 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inline void srcId(const ValueRef&, const int pos); 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inline void srcId(const ValueRef *, const int pos); 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inline void srcAddr16(const ValueRef&, bool adj, const int pos); 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inline void srcAddr8(const ValueRef&, const int pos); 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitFlagsRd(const Instruction *); 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitFlagsWr(const Instruction *); 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitCondCode(CondCode cc, DataType ty, int pos); 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inline void setARegBits(unsigned int); 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void setAReg16(const Instruction *, int s); 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void setImmediate(const Instruction *, int s); 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void setDst(const Value *); 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void setDst(const Instruction *, int d); 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void setSrcFileBits(const Instruction *, int enc); 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void setSrc(const Instruction *, unsigned int s, int slot); 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitForm_MAD(const Instruction *); 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitForm_ADD(const Instruction *); 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitForm_MUL(const Instruction *); 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitForm_IMM(const Instruction *); 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitLoadStoreSizeLG(DataType ty, int pos); 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitLoadStoreSizeCS(DataType ty); 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void roundMode_MAD(const Instruction *); 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void roundMode_CVT(RoundMode); 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitMNeg12(const Instruction *); 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitLOAD(const Instruction *); 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitSTORE(const Instruction *); 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitMOV(const Instruction *); 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitNOP(); 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitINTERP(const Instruction *); 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitPFETCH(const Instruction *); 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitOUT(const Instruction *); 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitUADD(const Instruction *); 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitAADD(const Instruction *); 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitFADD(const Instruction *); 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitIMUL(const Instruction *); 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitFMUL(const Instruction *); 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitFMAD(const Instruction *); 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitIMAD(const Instruction *); 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitISAD(const Instruction *); 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitMINMAX(const Instruction *); 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitPreOp(const Instruction *); 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitSFnOp(const Instruction *, uint8_t subOp); 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitShift(const Instruction *); 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitARL(const Instruction *, unsigned int shl); 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitLogicOp(const Instruction *); 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitNOT(const Instruction *); 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitCVT(const Instruction *); 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitSET(const Instruction *); 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitTEX(const TexInstruction *); 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitTXQ(const TexInstruction *); 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitQUADOP(const Instruction *, uint8_t lane, uint8_t quOp); 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitFlow(const Instruction *, uint8_t flowOp); 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void emitPRERETEmu(const FlowInstruction *); 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SDATA(a) ((a).rep()->reg.data) 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DDATA(a) ((a).rep()->reg.data) 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid CodeEmitterNV50::srcId(const ValueRef& src, const int pos) 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src.get()); 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[pos / 32] |= SDATA(src).id << (pos % 32); 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid CodeEmitterNV50::srcId(const ValueRef *src, const int pos) 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src->get()); 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[pos / 32] |= SDATA(*src).id << (pos % 32); 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid CodeEmitterNV50::srcAddr16(const ValueRef& src, bool adj, const int pos) 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src.get()); 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int32_t offset = SDATA(src).offset; 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!adj || src.get()->reg.size <= 4); 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (adj) 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset /= src.get()->reg.size; 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(offset <= 0x7fff && offset >= (int32_t)-0x8000 && (pos % 32) <= 16); 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (offset < 0) 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org offset &= adj ? (0xffff >> (src.get()->reg.size >> 1)) : 0xffff; 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[pos / 32] |= offset << (pos % 32); 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid CodeEmitterNV50::srcAddr8(const ValueRef& src, const int pos) 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(src.get()); 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t offset = SDATA(src).offset; 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert((offset <= 0x1fc || offset == 0x3fc) && !(offset & 0x3)); 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[pos / 32] |= (offset >> 2) << (pos % 32); 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid CodeEmitterNV50::defId(const ValueDef& def, const int pos) 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(def.get() && def.getFile() != FILE_SHADER_OUTPUT); 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[pos / 32] |= DDATA(def).id << (pos % 32); 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::roundMode_MAD(const Instruction *insn) 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (insn->rnd) { 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case ROUND_M: code[1] |= 1 << 22; break; 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case ROUND_P: code[1] |= 2 << 22; break; 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case ROUND_Z: code[1] |= 3 << 22; break; 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(insn->rnd == ROUND_N); 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitMNeg12(const Instruction *i) 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= i->src(0).mod.neg() << 26; 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= i->src(1).mod.neg() << 27; 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid CodeEmitterNV50::emitCondCode(CondCode cc, DataType ty, int pos) 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint8_t enc; 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(pos >= 32 || pos <= 27); 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (cc) { 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_LT: enc = 0x1; break; 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_LTU: enc = 0x9; break; 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_EQ: enc = 0x2; break; 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_EQU: enc = 0xa; break; 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_LE: enc = 0x3; break; 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_LEU: enc = 0xb; break; 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_GT: enc = 0x4; break; 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_GTU: enc = 0xc; break; 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_NE: enc = 0x5; break; 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_NEU: enc = 0xd; break; 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_GE: enc = 0x6; break; 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_GEU: enc = 0xe; break; 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_TR: enc = 0xf; break; 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_FL: enc = 0x0; break; 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_O: enc = 0x10; break; 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_C: enc = 0x11; break; 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_A: enc = 0x12; break; 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_S: enc = 0x13; break; 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_NS: enc = 0x1c; break; 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_NA: enc = 0x1d; break; 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_NC: enc = 0x1e; break; 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case CC_NO: enc = 0x1f; break; 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enc = 0; 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"invalid condition code"); 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ty != TYPE_NONE && !isFloatType(ty)) 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enc &= ~0x8; // unordered only exists for float types 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[pos / 32] |= enc << (pos % 32); 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitFlagsRd(const Instruction *i) 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int s = (i->flagsSrc >= 0) ? i->flagsSrc : i->predSrc; 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!(code[1] & 0x00003f80)); 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (s >= 0) { 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(i->getSrc(s)->reg.file == FILE_FLAGS); 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitCondCode(i->cc, TYPE_NONE, 32 + 7); 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->src(s), 32 + 12); 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 0x0780; 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitFlagsWr(const Instruction *i) 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!(code[1] & 0x70)); 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int flagsDef = i->flagsDef; 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // find flags definition and check that it is the last def 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (flagsDef < 0) { 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (int d = 0; i->defExists(d); ++d) 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->def(d).getFile() == FILE_FLAGS) 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flagsDef = d; 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (flagsDef >= 0 && 0) // TODO: enforce use of flagsDef at some point 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WARN("Instruction::flagsDef was not set properly\n"); 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (flagsDef == 0 && i->defExists(1)) 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WARN("flags def should not be the primary definition\n"); 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (flagsDef >= 0) 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= (DDATA(i->def(flagsDef)).id << 4) | 0x40; 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::setARegBits(unsigned int u) 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= (u & 3) << 26; 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= (u & 4); 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::setAReg16(const Instruction *i, int s) 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->srcExists(s)) { 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org s = i->src(s).indirect[0]; 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (s >= 0) 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setARegBits(SDATA(i->src(s)).id + 1); 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::setImmediate(const Instruction *i, int s) 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const ImmediateValue *imm = i->src(s).get()->asImm(); 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(imm); 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t u = imm->reg.data.u32; 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(s).mod & Modifier(NV50_IR_MOD_NOT)) 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u = ~u; 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 3; 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= (u & 0x3f) << 16; 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= (u >> 6) << 2; 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::setDst(const Value *dst) 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const Storage *reg = &dst->join->reg; 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(reg->file != FILE_ADDRESS); 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg->data.id < 0 || reg->file == FILE_FLAGS) { 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= (127 << 2) | 1; 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 8; 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int id; 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg->file == FILE_SHADER_OUTPUT) { 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 8; 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org id = reg->data.offset / 4; 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org id = reg->data.id; 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= id << 2; 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::setDst(const Instruction *i, int d) 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->defExists(d)) { 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setDst(i->getDef(d)); 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!d) { 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 0x01fc; // bit bucket 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 0x0008; 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// 3 * 2 bits: 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// 0: r 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// 1: a/s 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// 2: c 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// 3: i 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::setSrcFileBits(const Instruction *i, int enc) 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint8_t mode = 0; 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (unsigned int s = 0; s < Target::operationSrcNr[i->op]; ++s) { 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (i->src(s).getFile()) { 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_GPR: 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_MEMORY_SHARED: 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_SHADER_INPUT: 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mode |= 1 << (s * 2); 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_MEMORY_CONST: 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mode |= 2 << (s * 2); 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_IMMEDIATE: 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mode |= 3 << (s * 2); 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ERROR("invalid file on source %i: %u\n", s, i->src(s).getFile()); 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (mode) { 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 0x00: // rrr 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 0x01: // arr/grr 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (progType == Program::TYPE_GEOMETRY) { 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 0x01800000; 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (enc == NV50_OP_ENC_LONG || enc == NV50_OP_ENC_LONG_ALT) 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 0x00200000; 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (enc == NV50_OP_ENC_SHORT) 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 0x01000000; 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 0x00200000; 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 0x03: // irr 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(i->op == OP_MOV); 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 0x0c: // rir 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 0x0d: // gir 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 0x01000000; 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(progType == Program::TYPE_GEOMETRY || 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org progType == Program::TYPE_COMPUTE); 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 0x08: // rcr 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= (enc == NV50_OP_ENC_LONG_ALT) ? 0x01000000 : 0x00800000; 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= (i->getSrc(1)->reg.fileIndex << 22); 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 0x09: // acr/gcr 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (progType == Program::TYPE_GEOMETRY) { 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 0x01800000; 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= (enc == NV50_OP_ENC_LONG_ALT) ? 0x01000000 : 0x00800000; 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 0x00200000; 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= (i->getSrc(1)->reg.fileIndex << 22); 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 0x20: // rrc 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 0x01000000; 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= (i->getSrc(2)->reg.fileIndex << 22); 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 0x21: // arc 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 0x01000000; 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 0x00200000 | (i->getSrc(2)->reg.fileIndex << 22); 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(progType != Program::TYPE_GEOMETRY); 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ERROR("not encodable: %x\n", mode); 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (progType != Program::TYPE_COMPUTE) 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((mode & 3) == 1) { 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int pos = i->src(1).getFile() == FILE_IMMEDIATE ? 13 : 14; 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (i->getSrc(0)->reg.type) { 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U8: 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U16: 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << pos; 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S16: 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 2 << pos; 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 3 << pos; 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(i->getSrc(0)->reg.size == 4); 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::setSrc(const Instruction *i, unsigned int s, int slot) 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (Target::operationSrcNr[i->op] <= s) 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const Storage *reg = &i->src(s).rep()->reg; 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned int id = (reg->file == FILE_GPR) ? 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reg->data.id : 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reg->data.offset >> (reg->size >> 1); // no > 4 byte sources here 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (slot) { 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 0: code[0] |= id << 9; break; 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: code[0] |= id << 16; break; 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: code[1] |= id << 14; break; 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// the default form: 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// - long instruction 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// - 1 to 3 sources in slots 0, 1, 2 (rrr, arr, rcr, acr, rrc, arc, gcr, grr) 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// - address & flags 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitForm_MAD(const Instruction *i) 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(i->encSize == 8); 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1; 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitFlagsRd(i); 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitFlagsWr(i); 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setDst(i, 0); 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setSrcFileBits(i, NV50_OP_ENC_LONG); 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setSrc(i, 0, 0); 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setSrc(i, 1, 1); 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setSrc(i, 2, 2); 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setAReg16(i, 1); 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// like default form, but 2nd source in slot 2, and no 3rd source 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitForm_ADD(const Instruction *i) 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(i->encSize == 8); 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1; 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitFlagsRd(i); 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitFlagsWr(i); 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setDst(i, 0); 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setSrcFileBits(i, NV50_OP_ENC_LONG_ALT); 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setSrc(i, 0, 0); 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setSrc(i, 1, 2); 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setAReg16(i, 1); 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// default short form (rr, ar, rc, gr) 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitForm_MUL(const Instruction *i) 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(i->encSize == 4 && !(code[0] & 1)); 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(i->defExists(0)); 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!i->getPredicate()); 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setDst(i, 0); 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setSrcFileBits(i, NV50_OP_ENC_SHORT); 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setSrc(i, 0, 0); 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setSrc(i, 1, 1); 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// usual immediate form 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// - 1 to 3 sources where last is immediate (rir, gir) 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// - no address or predicate possible 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitForm_IMM(const Instruction *i) 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(i->encSize == 8); 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1; 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(i->defExists(0) && i->srcExists(0)); 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setDst(i, 0); 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setSrcFileBits(i, NV50_OP_ENC_IMM); 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (Target::operationSrcNr[i->op] > 1) { 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setSrc(i, 0, 0); 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setImmediate(i, 1); 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setSrc(i, 2, 1); 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setImmediate(i, 0); 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitLoadStoreSizeLG(DataType ty, int pos) 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint8_t enc; 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (ty) { 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_F32: // fall through 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S32: // fall through 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U32: enc = 0x6; break; 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_B128: enc = 0x5; break; 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_F64: // fall through 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S64: // fall through 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U64: enc = 0x4; break; 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S16: enc = 0x3; break; 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U16: enc = 0x2; break; 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S8: enc = 0x1; break; 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U8: enc = 0x0; break; 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enc = 0; 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"invalid load/store type"); 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[pos / 32] |= enc << (pos % 32); 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitLoadStoreSizeCS(DataType ty) 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (ty) { 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U8: break; 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U16: code[1] |= 0x4000; break; 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S16: code[1] |= 0x8000; break; 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_F32: 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S32: 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U32: code[1] |= 0xc000; break; 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitLOAD(const Instruction *i) 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DataFile sf = i->src(0).getFile(); 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int32_t offset = i->getSrc(0)->reg.data.offset; 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (sf) { 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_SHADER_INPUT: 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // use 'mov' where we can 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = i->src(0).isIndirect(0) ? 0x00000001 : 0x10000001; 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0x00200000 | (i->lanes << 14); 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (typeSizeof(i->dType) == 4) 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 0x04000000; 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_MEMORY_SHARED: 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (targ->getChipset() >= 0x84) { 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(offset <= (int32_t)(0x3fff * typeSizeof(i->sType))); 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x10000001; 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0x40000000; 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (typeSizeof(i->dType) == 4) 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 0x04000000; 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitLoadStoreSizeCS(i->sType); 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(offset <= (int32_t)(0x1f * typeSizeof(i->sType))); 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x10000001; 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0x00200000 | (i->lanes << 14); 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitLoadStoreSizeCS(i->sType); 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_MEMORY_CONST: 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x10000001; 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0x20000000 | (i->getSrc(0)->reg.fileIndex << 22); 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (typeSizeof(i->dType) == 4) 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 0x04000000; 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitLoadStoreSizeCS(i->sType); 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_MEMORY_LOCAL: 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0xd0000001; 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0x40000000; 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_MEMORY_GLOBAL: 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0xd0000001 | (i->getSrc(0)->reg.fileIndex << 16); 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0x80000000; 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"invalid load source file"); 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sf == FILE_MEMORY_LOCAL || 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sf == FILE_MEMORY_GLOBAL) 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitLoadStoreSizeLG(i->sType, 21 + 32); 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setDst(i, 0); 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitFlagsRd(i); 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitFlagsWr(i); 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(0).getFile() == FILE_MEMORY_GLOBAL) { 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(*i->src(0).getIndirect(0), 9); 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setAReg16(i, 0); 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr16(i->src(0), i->src(0).getFile() != FILE_MEMORY_LOCAL, 9); 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitSTORE(const Instruction *i) 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DataFile f = i->getSrc(0)->reg.file; 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int32_t offset = i->getSrc(0)->reg.data.offset; 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (f) { 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_SHADER_OUTPUT: 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x00000001 | ((offset >> 2) << 9); 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0x80c00000; 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->src(1), 32 + 14); 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_MEMORY_GLOBAL: 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0xd0000001 | (i->getSrc(0)->reg.fileIndex << 16); 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0xa0000000; 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitLoadStoreSizeLG(i->dType, 21 + 32); 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->src(1), 2); 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_MEMORY_LOCAL: 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0xd0000001; 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0x60000000; 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitLoadStoreSizeLG(i->dType, 21 + 32); 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->src(1), 2); 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case FILE_MEMORY_SHARED: 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x00000001; 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0xe0000000; 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (typeSizeof(i->dType)) { 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= offset << 9; 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 0x00400000; 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= (offset >> 1) << 9; 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 4: 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= (offset >> 2) << 9; 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 0x04200000; 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->src(1), 32 + 14); 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!"invalid store destination file"); 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (f == FILE_MEMORY_GLOBAL) 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(*i->src(0).getIndirect(0), 9); 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setAReg16(i, 0); 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (f == FILE_MEMORY_LOCAL) 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr16(i->src(0), false, 9); 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitFlagsRd(i); 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitMOV(const Instruction *i) 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DataFile sf = i->getSrc(0)->reg.file; 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DataFile df = i->getDef(0)->reg.file; 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(sf == FILE_GPR || df == FILE_GPR); 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sf == FILE_FLAGS) { 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x00000001; 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0x20000000; 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defId(i->def(0), 2); 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->src(0), 12); 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitFlagsRd(i); 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sf == FILE_ADDRESS) { 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x00000001; 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0x40000000; 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defId(i->def(0), 2); 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setARegBits(SDATA(i->src(0)).id + 1); 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitFlagsRd(i); 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (df == FILE_FLAGS) { 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x00000001; 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0xa0000000; 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defId(i->def(0), 4); 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->src(0), 9); 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitFlagsRd(i); 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sf == FILE_IMMEDIATE) { 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x10008001; 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0x00000003; 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_IMM(i); 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->encSize == 4) { 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x10008000; 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x10000001; 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = (typeSizeof(i->dType) == 2) ? 0 : 0x04000000; 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= (i->lanes << 14); 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitFlagsRd(i); 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defId(i->def(0), 2); 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->src(0), 9); 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (df == FILE_SHADER_OUTPUT) { 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(i->encSize == 8); 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 0x8; 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitNOP() 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0xf0000001; 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0xe0000000; 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitQUADOP(const Instruction *i, uint8_t lane, uint8_t quOp) 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0xc0000000 | (lane << 16); 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0x80000000; 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= (quOp & 0x03) << 20; 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= (quOp & 0xfc) << 20; 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_ADD(i); 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!i->srcExists(1)) 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->src(0), 32 + 14); 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitPFETCH(const Instruction *i) 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x11800001; 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0x04200000 | (0xf << 14); 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defId(i->def(0), 2); 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr8(i->src(0), 9); 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setAReg16(i, 0); 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitINTERP(const Instruction *i) 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x80000000; 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defId(i->def(0), 2); 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr8(i->src(0), 16); 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->getInterpMode() == NV50_IR_INTERP_FLAT) { 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << 8; 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->op == OP_PINTERP) { 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << 25; 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->src(1), 9); 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->getSampleMode() == NV50_IR_INTERP_CENTROID) 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << 24; 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->encSize == 8) { 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (code[0] & (3 << 24)) >> (24 - 16) | 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (code[0] & (1 << 8)) << (18 - 8); 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] &= ~0x03000100; 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1; 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitFlagsRd(i); 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitMINMAX(const Instruction *i) 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->dType == TYPE_F64) { 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0xe0000000; 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = (i->op == OP_MIN) ? 0xa0000000 : 0xc0000000; 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x30000000; 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0x80000000; 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->op == OP_MIN) 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 0x20000000; 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (i->dType) { 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_F32: code[0] |= 0x80000000; break; 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S32: code[1] |= 0x8c000000; break; 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U32: code[1] |= 0x84000000; break; 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S16: code[1] |= 0x80000000; break; 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U16: break; 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= i->src(0).mod.abs() << 20; 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= i->src(1).mod.abs() << 19; 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_MAD(i); 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitFMAD(const Instruction *i) 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int neg_mul = i->src(0).mod.neg() ^ i->src(1).mod.neg(); 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int neg_add = i->src(2).mod.neg(); 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0xe0000000; 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->encSize == 4) { 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_MUL(i); 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!neg_mul && !neg_add); 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = neg_mul << 26; 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= neg_add << 27; 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->saturate) 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 1 << 29; 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_MAD(i); 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitFADD(const Instruction *i) 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int neg0 = i->src(0).mod.neg(); 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int neg1 = i->src(1).mod.neg() ^ ((i->op == OP_SUB) ? 1 : 0); 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0xb0000000; 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!(i->src(0).mod | i->src(1).mod).abs()); 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(1).getFile() == FILE_IMMEDIATE) { 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0; 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_IMM(i); 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= neg0 << 15; 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= neg1 << 22; 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->saturate) 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << 8; 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->encSize == 8) { 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0; 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_ADD(i); 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= neg0 << 26; 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= neg1 << 27; 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->saturate) 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 1 << 29; 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_MUL(i); 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= neg0 << 15; 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= neg1 << 22; 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->saturate) 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << 8; 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitUADD(const Instruction *i) 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int neg0 = i->src(0).mod.neg(); 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int neg1 = i->src(1).mod.neg() ^ ((i->op == OP_SUB) ? 1 : 0); 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x20008000; 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(1).getFile() == FILE_IMMEDIATE) { 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0; 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_IMM(i); 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->encSize == 8) { 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x20000000; 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = (typeSizeof(i->dType) == 2) ? 0 : 0x04000000; 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_ADD(i); 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_MUL(i); 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!(neg0 && neg1)); 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= neg0 << 28; 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= neg1 << 22; 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->flagsSrc >= 0) { 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // addc == sub | subr 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!(code[0] & 0x10400000) && !i->getPredicate()); 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 0x10400000; 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->src(i->flagsSrc), 32 + 12); 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitAADD(const Instruction *i) 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int s = (i->op == OP_MOV) ? 0 : 1; 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0xd0000001 | (i->getSrc(s)->reg.data.u16 << 9); 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0x20000000; 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= (DDATA(i->def(0)).id + 1) << 2; 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitFlagsRd(i); 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (s && i->srcExists(0)) 959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setARegBits(SDATA(i->src(0)).id + 1); 960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitIMUL(const Instruction *i) 964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x40000000; 966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->encSize == 8) { 968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = (i->sType == TYPE_S16) ? (0x8000 | 0x4000) : 0x0000; 969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_MAD(i); 970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->sType == TYPE_S16) 972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 0x8100; 973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_MUL(i); 974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitFMUL(const Instruction *i) 979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int neg = (i->src(0).mod ^ i->src(1).mod).neg(); 981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0xc0000000; 983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(1).getFile() == FILE_IMMEDIATE) { 985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0; 986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_IMM(i); 987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (neg) 988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 0x8000; 989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->encSize == 8) { 991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = i->rnd == ROUND_Z ? 0x0000c000 : 0; 992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (neg) 993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 0x08000000; 994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_MAD(i); 995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_MUL(i); 997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (neg) 998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 0x8000; 999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitIMAD(const Instruction *i) 1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x60000000; 1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (isSignedType(i->sType)) 1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = i->saturate ? 0x40000000 : 0x20000000; 1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0x00000000; 1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int neg1 = i->src(0).mod.neg() ^ i->src(1).mod.neg(); 1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int neg2 = i->src(2).mod.neg(); 1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!(neg1 & neg2)); 1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= neg1 << 27; 1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= neg2 << 26; 1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_MAD(i); 1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->flagsSrc >= 0) { 1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // add with carry from $cX 1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!(code[1] & 0x0c000000) && !i->getPredicate()); 1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 0xc << 24; 1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->src(i->flagsSrc), 32 + 12); 1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitISAD(const Instruction *i) 1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->encSize == 8) { 1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x50000000; 1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (i->sType) { 1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U32: code[1] = 0x04000000; break; 1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S32: code[1] = 0x0c000000; break; 1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U16: code[1] = 0x00000000; break; 1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S16: code[1] = 0x08000000; break; 1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_MAD(i); 1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (i->sType) { 1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U32: code[0] = 0x50008000; break; 1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S32: code[0] = 0x50008100; break; 1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U16: code[0] = 0x50000000; break; 1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S16: code[0] = 0x50000100; break; 1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_MUL(i); 1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitSET(const Instruction *i) 1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x30000000; 1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0x60000000; 1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitCondCode(i->asCmp()->setCond, i->sType, 32 + 14); 1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (i->sType) { 1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_F32: code[0] |= 0x80000000; break; 1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S32: code[1] |= 0x0c000000; break; 1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U32: code[1] |= 0x04000000; break; 1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S16: code[1] |= 0x08000000; break; 1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U16: break; 1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(0).mod.neg()) code[1] |= 0x04000000; 1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(1).mod.neg()) code[1] |= 0x08000000; 1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(0).mod.abs()) code[1] |= 0x00100000; 1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(1).mod.abs()) code[1] |= 0x00080000; 1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_MAD(i); 1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::roundMode_CVT(RoundMode rnd) 1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (rnd) { 1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case ROUND_NI: code[1] |= 0x08000000; break; 1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case ROUND_M: code[1] |= 0x00020000; break; 1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case ROUND_MI: code[1] |= 0x08020000; break; 1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case ROUND_P: code[1] |= 0x00040000; break; 1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case ROUND_PI: code[1] |= 0x08040000; break; 1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case ROUND_Z: code[1] |= 0x00060000; break; 1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case ROUND_ZI: code[1] |= 0x08060000; break; 1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(rnd == ROUND_N); 1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitCVT(const Instruction *i) 1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const bool f2f = isFloatType(i->dType) && isFloatType(i->sType); 1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RoundMode rnd; 1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (i->op) { 1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_CEIL: rnd = f2f ? ROUND_PI : ROUND_P; break; 1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_FLOOR: rnd = f2f ? ROUND_MI : ROUND_M; break; 1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_TRUNC: rnd = f2f ? ROUND_ZI : ROUND_Z; break; 1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rnd = i->rnd; 1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0xa0000000; 1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (i->dType) { 1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_F64: 1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (i->sType) { 1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_F64: code[1] = 0xc4404000; break; 1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S64: code[1] = 0x44414000; break; 1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U64: code[1] = 0x44404000; break; 1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_F32: code[1] = 0xc4400000; break; 1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S32: code[1] = 0x44410000; break; 1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U32: code[1] = 0x44400000; break; 1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S64: 1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (i->sType) { 1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_F64: code[1] = 0x8c404000; break; 1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_F32: code[1] = 0x8c400000; break; 1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U64: 1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (i->sType) { 1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_F64: code[1] = 0x84404000; break; 1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_F32: code[1] = 0x84400000; break; 1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_F32: 1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (i->sType) { 1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_F64: code[1] = 0xc0404000; break; 1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S64: code[1] = 0x40414000; break; 1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U64: code[1] = 0x40404000; break; 1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_F32: code[1] = 0xc4004000; break; 1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S32: code[1] = 0x44014000; break; 1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U32: code[1] = 0x44004000; break; 1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_F16: code[1] = 0xc4000000; break; 1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S32: 1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (i->sType) { 1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_F64: code[1] = 0x88404000; break; 1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_F32: code[1] = 0x8c004000; break; 1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S32: code[1] = 0x0c014000; break; 1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U32: code[1] = 0x0c004000; break; 1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_F16: code[1] = 0x8c000000; break; 1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S16: code[1] = 0x0c010000; break; 1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U16: code[1] = 0x0c000000; break; 1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S8: code[1] = 0x0c018000; break; 1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U8: code[1] = 0x0c008000; break; 1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U32: 1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (i->sType) { 1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_F64: code[1] = 0x80404000; break; 1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_F32: code[1] = 0x84004000; break; 1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S32: code[1] = 0x04014000; break; 1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U32: code[1] = 0x04004000; break; 1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_F16: code[1] = 0x84000000; break; 1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S16: code[1] = 0x04010000; break; 1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U16: code[1] = 0x04000000; break; 1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S8: code[1] = 0x04018000; break; 1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U8: code[1] = 0x04008000; break; 1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S16: 1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U16: 1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S8: 1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U8: 1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (typeSizeof(i->sType) == 1 && i->getSrc(0)->reg.size == 4) 1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 0x00004000; 1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org roundMode_CVT(rnd); 1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (i->op) { 1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_ABS: code[1] |= 1 << 20; break; 1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_SAT: code[1] |= 1 << 19; break; 1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_NEG: code[1] |= 1 << 29; break; 1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] ^= i->src(0).mod.neg() << 29; 1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= i->src(0).mod.abs() << 20; 1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->saturate) 1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 1 << 19; 1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(i->op != OP_ABS || !i->src(0).mod.neg()); 1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_MAD(i); 1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitPreOp(const Instruction *i) 1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0xb0000000; 1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = (i->op == OP_PREEX2) ? 0xc0004000 : 0xc0000000; 1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= i->src(0).mod.abs() << 20; 1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= i->src(0).mod.neg() << 26; 1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_MAD(i); 1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitSFnOp(const Instruction *i, uint8_t subOp) 1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x90000000; 1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->encSize == 4) { 1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(i->op == OP_RCP); 1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= i->src(0).mod.abs() << 15; 1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= i->src(0).mod.neg() << 22; 1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_MUL(i); 1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = subOp << 29; 1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= i->src(0).mod.abs() << 20; 1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= i->src(0).mod.neg() << 26; 1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_MAD(i); 1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitNOT(const Instruction *i) 1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0xd0000000; 1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0x0002c000; 1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (i->sType) { 1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U32: 1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S32: 1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 0x04000000; 1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_MAD(i); 1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setSrc(i, 0, 1); 1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitLogicOp(const Instruction *i) 1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0xd0000000; 1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0; 1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(1).getFile() == FILE_IMMEDIATE) { 1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (i->op) { 1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_OR: code[0] |= 0x0100; break; 1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_XOR: code[0] |= 0x8000; break; 1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(i->op == OP_AND); 1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(0).mod & Modifier(NV50_IR_MOD_NOT)) 1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 1 << 22; 1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_IMM(i); 1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (i->op) { 1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_AND: code[1] = 0x04000000; break; 1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_OR: code[1] = 0x04004000; break; 1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_XOR: code[1] = 0x04008000; break; 1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(0).mod & Modifier(NV50_IR_MOD_NOT)) 1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 1 << 16; 1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(1).mod & Modifier(NV50_IR_MOD_NOT)) 1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 1 << 17; 1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_MAD(i); 1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitARL(const Instruction *i, unsigned int shl) 1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x00000001 | (shl << 16); 1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0xc0000000; 1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= (DDATA(i->def(0)).id + 1) << 2; 1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setSrcFileBits(i, NV50_OP_ENC_IMM); 1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setSrc(i, 0, 0); 1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitFlagsRd(i); 1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitShift(const Instruction *i) 1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->def(0).getFile() == FILE_ADDRESS) { 1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(i->srcExists(1) && i->src(1).getFile() == FILE_IMMEDIATE); 1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitARL(i, i->getSrc(1)->reg.data.u32 & 0x3f); 1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x30000001; 1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = (i->op == OP_SHR) ? 0xe4000000 : 0xc4000000; 1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->op == OP_SHR && isSignedType(i->sType)) 1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 1 << 27; 1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(1).getFile() == FILE_IMMEDIATE) { 1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 1 << 20; 1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= (i->getSrc(1)->reg.data.u32 & 0x7f) << 16; 1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defId(i->def(0), 2); 1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcId(i->src(0), 9); 1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitFlagsRd(i); 1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitForm_MAD(i); 1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitOUT(const Instruction *i) 1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = (i->op == OP_EMIT) ? 0xf0000200 : 0xf0000400; 1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0xc0000001; 1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitFlagsRd(i); 1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitTEX(const TexInstruction *i) 1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0xf0000001; 1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0x00000000; 1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (i->op) { 1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_TXB: 1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0x20000000; 1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_TXL: 1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0x40000000; 1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_TXF: 1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 0x01000000; 1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_TXG: 1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x01000000; 1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0x80000000; 1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(i->op == OP_TEX); 1377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= i->tex.r << 9; 1381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= i->tex.s << 17; 1382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int argc = i->tex.target.getArgCount(); 1384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->op == OP_TXB || i->op == OP_TXL || i->op == OP_TXF) 1386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org argc += 1; 1387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->tex.target.isShadow()) 1388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org argc += 1; 1389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(argc <= 4); 1390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= (argc - 1) << 22; 1392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->tex.target.isCube()) { 1394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= 0x08000000; 1395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 1396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->tex.useOffsets) { 1397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= (i->tex.offset[0][0] & 0xf) << 24; 1398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= (i->tex.offset[0][1] & 0xf) << 20; 1399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= (i->tex.offset[0][2] & 0xf) << 16; 1400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= (i->tex.mask & 0x3) << 25; 1403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= (i->tex.mask & 0xc) << 12; 1404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->tex.liveOnly) 1406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 4; 1407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defId(i->def(0), 2); 1409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitFlagsRd(i); 1411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitTXQ(const TexInstruction *i) 1415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(i->tex.query == TXQ_DIMS); 1417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0xf0000001; 1419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0x60000000; 1420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= i->tex.r << 9; 1422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= i->tex.s << 17; 1423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= (i->tex.mask & 0x3) << 25; 1425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= (i->tex.mask & 0xc) << 12; 1426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org defId(i->def(0), 2); 1428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitFlagsRd(i); 1430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitPRERETEmu(const FlowInstruction *i) 1434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t pos = i->target.bb->binPos + 8; // +8 to skip an op */ 1436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x10000003; // bra 1438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0x00000780; // always 1439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (i->subOp) { 1441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case NV50_IR_SUBOP_EMU_PRERET + 0: // bra to the call 1442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case NV50_IR_SUBOP_EMU_PRERET + 1: // bra to skip the call 1444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pos += 8; 1445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(i->subOp == (NV50_IR_SUBOP_EMU_PRERET + 2)); 1448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x20000003; // call 1449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0x00000000; // no predicate 1450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org addReloc(RelocEntry::TYPE_CODE, 0, pos, 0x07fff800, 9); 1453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org addReloc(RelocEntry::TYPE_CODE, 1, pos, 0x000fc000, -4); 1454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitFlow(const Instruction *i, uint8_t flowOp) 1458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const FlowInstruction *f = i->asFlow(); 1460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool hasPred = false; 1461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool hasTarg = false; 1462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] = 0x00000003 | (flowOp << 28); 1464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] = 0x00000000; 1465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (i->op) { 1467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_BRA: 1468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hasPred = true; 1469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hasTarg = true; 1470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_BREAK: 1472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_BRKPT: 1473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_DISCARD: 1474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_RET: 1475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hasPred = true; 1476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_CALL: 1478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_PREBREAK: 1479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_JOINAT: 1480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hasTarg = true; 1481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_PRERET: 1483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hasTarg = true; 1484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->subOp >= NV50_IR_SUBOP_EMU_PRERET) { 1485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitPRERETEmu(f); 1486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (hasPred) 1494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitFlagsRd(i); 1495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (hasTarg && f) { 1497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t pos; 1498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (f->op == OP_CALL) { 1500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (f->builtin) { 1501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pos = targ->getBuiltinOffset(f->target.builtin); 1502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pos = f->target.fn->binPos; 1504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pos = f->target.bb->binPos; 1507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[0] |= ((pos >> 2) & 0xffff) << 11; 1510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= ((pos >> 18) & 0x003f) << 14; 1511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org RelocEntry::Type relocTy; 1513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org relocTy = f->builtin ? RelocEntry::TYPE_BUILTIN : RelocEntry::TYPE_CODE; 1515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org addReloc(relocTy, 0, pos, 0x07fff800, 9); 1517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org addReloc(relocTy, 1, pos, 0x000fc000, -4); 1518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool 1522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitInstruction(Instruction *insn) 1523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!insn->encSize) { 1525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ERROR("skipping unencodable instruction: "); insn->print(); 1526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 1527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 1528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (codeSize + insn->encSize > codeSizeLimit) { 1529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ERROR("code emitter output buffer too small\n"); 1530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 1531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn->bb->getProgram()->dbgFlags & NV50_IR_DEBUG_BASIC) { 1534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org INFO("EMIT: "); insn->print(); 1535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (insn->op) { 1538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_MOV: 1539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitMOV(insn); 1540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_EXIT: 1542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_NOP: 1543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_JOIN: 1544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitNOP(); 1545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_VFETCH: 1547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_LOAD: 1548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitLOAD(insn); 1549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_EXPORT: 1551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_STORE: 1552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitSTORE(insn); 1553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_PFETCH: 1555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitPFETCH(insn); 1556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_LINTERP: 1558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_PINTERP: 1559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitINTERP(insn); 1560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_ADD: 1562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_SUB: 1563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (isFloatType(insn->dType)) 1564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitFADD(insn); 1565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (insn->getDef(0)->reg.file == FILE_ADDRESS) 1566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitAADD(insn); 1567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitUADD(insn); 1569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_MUL: 1571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (isFloatType(insn->dType)) 1572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitFMUL(insn); 1573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitIMUL(insn); 1575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_MAD: 1577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_FMA: 1578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (isFloatType(insn->dType)) 1579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitFMAD(insn); 1580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitIMAD(insn); 1582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_SAD: 1584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitISAD(insn); 1585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_NOT: 1587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitNOT(insn); 1588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_AND: 1590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_OR: 1591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_XOR: 1592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitLogicOp(insn); 1593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_SHL: 1595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_SHR: 1596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitShift(insn); 1597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_SET: 1599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitSET(insn); 1600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_MIN: 1602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_MAX: 1603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitMINMAX(insn); 1604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_CEIL: 1606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_FLOOR: 1607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_TRUNC: 1608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_ABS: 1609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_NEG: 1610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_SAT: 1611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitCVT(insn); 1612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_CVT: 1614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn->def(0).getFile() == FILE_ADDRESS) 1615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitARL(insn, 0); 1616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn->def(0).getFile() == FILE_FLAGS || 1618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->src(0).getFile() == FILE_FLAGS || 1619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->src(0).getFile() == FILE_ADDRESS) 1620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitMOV(insn); 1621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitCVT(insn); 1623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_RCP: 1625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitSFnOp(insn, 0); 1626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_RSQ: 1628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitSFnOp(insn, 2); 1629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_LG2: 1631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitSFnOp(insn, 3); 1632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_SIN: 1634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitSFnOp(insn, 4); 1635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_COS: 1637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitSFnOp(insn, 5); 1638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_EX2: 1640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitSFnOp(insn, 6); 1641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_PRESIN: 1643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_PREEX2: 1644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitPreOp(insn); 1645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_TEX: 1647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_TXB: 1648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_TXL: 1649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_TXF: 1650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitTEX(insn->asTex()); 1651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_TXQ: 1653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitTXQ(insn->asTex()); 1654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_EMIT: 1656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_RESTART: 1657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitOUT(insn); 1658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_DISCARD: 1660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitFlow(insn, 0x0); 1661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_BRA: 1663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitFlow(insn, 0x1); 1664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_CALL: 1666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitFlow(insn, 0x2); 1667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_RET: 1669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitFlow(insn, 0x3); 1670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_PREBREAK: 1672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitFlow(insn, 0x4); 1673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_BREAK: 1675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitFlow(insn, 0x5); 1676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_QUADON: 1678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitFlow(insn, 0x6); 1679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_QUADPOP: 1681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitFlow(insn, 0x7); 1682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_JOINAT: 1684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitFlow(insn, 0xa); 1685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_PRERET: 1687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitFlow(insn, 0xd); 1688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_QUADOP: 1690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitQUADOP(insn, insn->lanes, insn->subOp); 1691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_DFDX: 1693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitQUADOP(insn, 4, insn->src(0).mod.neg() ? 0x66 : 0x99); 1694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_DFDY: 1696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emitQUADOP(insn, 5, insn->src(0).mod.neg() ? 0x5a : 0xa5); 1697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_PHI: 1699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_UNION: 1700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_CONSTRAINT: 1701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ERROR("operation should have been eliminated\n"); 1702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 1703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_EXP: 1704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_LOG: 1705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_SQRT: 1706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_POW: 1707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_SELP: 1708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_SLCT: 1709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_TXD: 1710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_PRECONT: 1711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_CONT: 1712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_POPCNT: 1713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_INSBF: 1714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case OP_EXTBF: 1715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ERROR("operation should have been lowered\n"); 1716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 1717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ERROR("unknown op: %u\n", insn->op); 1719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 1720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn->join || insn->op == OP_JOIN) 1722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 0x2; 1723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn->exit || insn->op == OP_EXIT) 1725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code[1] |= 0x1; 1726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert((insn->encSize == 8) == (code[0] & 1)); 1728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code += insn->encSize / 4; 1730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org codeSize += insn->encSize; 1731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return true; 1732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orguint32_t 1735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::getMinEncodingSize(const Instruction *i) const 1736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const Target::OpInfo &info = targ->getOpInfo(i); 1738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (info.minEncSize > 4) 1740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 8; 1741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // check constraints on dst and src operands 1743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (int d = 0; i->defExists(d); ++d) { 1744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->def(d).rep()->reg.data.id > 63 || 1745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i->def(d).rep()->reg.file != FILE_GPR) 1746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 8; 1747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (int s = 0; i->srcExists(s); ++s) { 1750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DataFile sf = i->src(s).getFile(); 1751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sf != FILE_GPR) 1752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sf != FILE_SHADER_INPUT || progType != Program::TYPE_FRAGMENT) 1753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 8; 1754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->src(s).rep()->reg.data.id > 63) 1755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 8; 1756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // check modifiers & rounding 1759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->join || i->lanes != 0xf || i->exit) 1760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 8; 1761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->op == OP_MUL && i->rnd != ROUND_N) 1762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 8; 1763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->asTex()) 1765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 8; // TODO: short tex encoding 1766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // check constraints on short MAD 1768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (info.srcNr >= 2 && i->srcExists(2)) { 1769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (i->saturate || i->src(2).mod) 1770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 8; 1771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((i->src(0).mod ^ i->src(1).mod) || 1772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (i->src(0).mod | i->src(1).mod).abs()) 1773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 8; 1774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!i->defExists(0) || 1775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i->def(0).rep()->reg.data.id != i->src(2).rep()->reg.data.id) 1776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 8; 1777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return info.minEncSize; 1780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Change the encoding size of an instruction after BBs have been scheduled. 1783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgmakeInstructionLong(Instruction *insn) 1785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn->encSize == 8) 1787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Function *fn = insn->bb->getFunction(); 1789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int n = 0; 1790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int adj = 4; 1791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (Instruction *i = insn->next; i && i->encSize == 4; ++n, i = i->next); 1793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (n & 1) { 1795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org adj = 8; 1796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->next->encSize = 8; 1797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else 1798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn->prev && insn->prev->encSize == 4) { 1799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org adj = 8; 1800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->prev->encSize = 8; 1801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->encSize = 8; 1803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (int i = fn->bbCount - 1; i >= 0 && fn->bbArray[i] != insn->bb; --i) { 1805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fn->bbArray[i]->binPos += 4; 1806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fn->binSize += adj; 1808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->bb->binSize += adj; 1809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic bool 1812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtrySetExitModifier(Instruction *insn) 1813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn->op == OP_DISCARD || 1815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->op == OP_QUADON || 1816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->op == OP_QUADPOP) 1817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 1818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (int s = 0; insn->srcExists(s); ++s) 1819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn->src(s).getFile() == FILE_IMMEDIATE) 1820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 1821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn->asFlow()) { 1822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn->op == OP_CALL) // side effects ! 1823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 1824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (insn->getPredicate()) // cannot do conditional exit (or can we ?) 1825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 1826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->op = OP_EXIT; 1827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->exit = 1; 1829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org makeInstructionLong(insn); 1830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return true; 1831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgreplaceExitWithModifier(Function *func) 1835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BasicBlock *epilogue = BasicBlock::get(func->cfgExit); 1837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!epilogue->getExit() || 1839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org epilogue->getExit()->op != OP_EXIT) // only main will use OP_EXIT 1840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (epilogue->getEntry()->op != OP_EXIT) { 1843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Instruction *insn = epilogue->getExit()->prev; 1844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!insn || !trySetExitModifier(insn)) 1845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org insn->exit = 1; 1847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (Graph::EdgeIterator ei = func->cfgExit->incident(); 1849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !ei.end(); ei.next()) { 1850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BasicBlock *bb = BasicBlock::get(ei.getNode()); 1851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Instruction *i = bb->getExit(); 1852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!i || !trySetExitModifier(i)) 1854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 1855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org epilogue->binSize -= 8; 1858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org func->binSize -= 8; 1859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org delete_Instruction(func->getProgram(), epilogue->getExit()); 1860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::prepareEmission(Function *func) 1864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CodeEmitter::prepareEmission(func); 1866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org replaceExitWithModifier(func); 1868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::CodeEmitterNV50(const TargetNV50 *target) : CodeEmitter(target) 1871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org targ = target; // specialized 1873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org code = NULL; 1874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org codeSize = codeSizeLimit = 0; 1875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org relocInfo = NULL; 1876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitter * 1879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTargetNV50::getCodeEmitter(Program::Type type) 1880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org CodeEmitterNV50 *emit = new CodeEmitterNV50(this); 1882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org emit->setProgramType(type); 1883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return emit; 1884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} // namespace nv50_ir 1887