1d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs/* 2d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * Copyright 2014 Red Hat Inc. 3d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * 4d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * Permission is hereby granted, free of charge, to any person obtaining a 5d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * copy of this software and associated documentation files (the "Software"), 6d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * to deal in the Software without restriction, including without limitation 7d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * and/or sell copies of the Software, and to permit persons to whom the 9d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * Software is furnished to do so, subject to the following conditions: 10d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * 11d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * The above copyright notice and this permission notice shall be included in 12d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * all copies or substantial portions of the Software. 13d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * 14d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * OTHER DEALINGS IN THE SOFTWARE. 21d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * 22d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * Authors: Ben Skeggs <bskeggs@redhat.com> 23d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs */ 24d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 25d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs#include "codegen/nv50_ir_target_gm107.h" 26d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 27f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset//#define GM107_DEBUG_SCHED_DATA 28f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 29d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsnamespace nv50_ir { 30d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 31d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsclass CodeEmitterGM107 : public CodeEmitter 32d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 33d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggspublic: 34d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs CodeEmitterGM107(const TargetGM107 *); 35d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 36d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs virtual bool emitInstruction(Instruction *); 37d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs virtual uint32_t getMinEncodingSize(const Instruction *) const; 38d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 39d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs virtual void prepareEmission(Program *); 40d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs virtual void prepareEmission(Function *); 41d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 42d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs inline void setProgramType(Program::Type pType) { progType = pType; } 43d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 44d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsprivate: 45d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs const TargetGM107 *targGM107; 46d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 47d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs Program::Type progType; 48d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 49d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs const Instruction *insn; 50d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs const bool writeIssueDelays; 51d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs uint32_t *data; 52d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 53d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsprivate: 54d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs inline void emitField(uint32_t *, int, int, uint32_t); 55d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs inline void emitField(int b, int s, uint32_t v) { emitField(code, b, s, v); } 56d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 57d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs inline void emitInsn(uint32_t, bool); 58d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs inline void emitInsn(uint32_t o) { emitInsn(o, true); } 59d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs inline void emitPred(); 60d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs inline void emitGPR(int, const Value *); 61d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs inline void emitGPR(int pos) { 62d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR(pos, (const Value *)NULL); 63d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 64d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs inline void emitGPR(int pos, const ValueRef &ref) { 65d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR(pos, ref.get() ? ref.rep() : (const Value *)NULL); 66d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 67d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs inline void emitGPR(int pos, const ValueRef *ref) { 68d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR(pos, ref ? ref->rep() : (const Value *)NULL); 69d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 70d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs inline void emitGPR(int pos, const ValueDef &def) { 71d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR(pos, def.get() ? def.rep() : (const Value *)NULL); 72d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 73d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs inline void emitSYS(int, const Value *); 74d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs inline void emitSYS(int pos, const ValueRef &ref) { 75d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitSYS(pos, ref.get() ? ref.rep() : (const Value *)NULL); 76d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 77d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs inline void emitPRED(int, const Value *); 78d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs inline void emitPRED(int pos) { 79d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPRED(pos, (const Value *)NULL); 80d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 81d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs inline void emitPRED(int pos, const ValueRef &ref) { 82d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPRED(pos, ref.get() ? ref.rep() : (const Value *)NULL); 83d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 84d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs inline void emitPRED(int pos, const ValueDef &def) { 85d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPRED(pos, def.get() ? def.rep() : (const Value *)NULL); 86d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 87d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs inline void emitADDR(int, int, int, int, const ValueRef &); 88d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs inline void emitCBUF(int, int, int, int, int, const ValueRef &); 89d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs inline bool longIMMD(const ValueRef &); 90d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs inline void emitIMMD(int, int, const ValueRef &); 91d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 92d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitCond3(int, CondCode); 93d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitCond4(int, CondCode); 94d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitCond5(int pos, CondCode cc) { emitCond4(pos, cc); } 95d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs inline void emitO(int); 96d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs inline void emitP(int); 97d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs inline void emitSAT(int); 98d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs inline void emitCC(int); 99d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs inline void emitX(int); 100d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs inline void emitABS(int, const ValueRef &); 101d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs inline void emitNEG(int, const ValueRef &); 102d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs inline void emitNEG2(int, const ValueRef &, const ValueRef &); 103d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs inline void emitFMZ(int, int); 104d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs inline void emitRND(int, RoundMode, int); 105d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs inline void emitRND(int pos) { 106d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitRND(pos, insn->rnd, -1); 107d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 108d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs inline void emitPDIV(int); 109d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs inline void emitINV(int, const ValueRef &); 110d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 111d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitEXIT(); 112d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitBRA(); 113d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitCAL(); 114d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitPCNT(); 115d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitCONT(); 116d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitPBK(); 117d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitBRK(); 118d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitPRET(); 119d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitRET(); 120d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitSSY(); 121d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitSYNC(); 122d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitSAM(); 123d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitRAM(); 124d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 125d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitMOV(); 126d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitS2R(); 127d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitF2F(); 128d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitF2I(); 129d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitI2F(); 130d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitI2I(); 131d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin void emitSEL(); 132d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitSHFL(); 133d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 134d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitDADD(); 135d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitDMUL(); 136d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitDFMA(); 137d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitDMNMX(); 138d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitDSET(); 139d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitDSETP(); 140d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 141d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitFADD(); 142d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitFMUL(); 143d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitFFMA(); 144d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitMUFU(); 145d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitFMNMX(); 146d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitRRO(); 147d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitFCMP(); 148d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitFSET(); 149d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitFSETP(); 150d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitFSWZADD(); 151d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 152d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitLOP(); 153d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitNOT(); 154d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitIADD(); 155d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitIMUL(); 156d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitIMAD(); 15731545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset void emitISCADD(); 158d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitIMNMX(); 159d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitICMP(); 160d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitISET(); 161d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitISETP(); 162d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitSHL(); 163d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitSHR(); 164d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitPOPC(); 165d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitBFI(); 166d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitBFE(); 167d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitFLO(); 168d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 169d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitLDSTs(int, DataType); 170d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitLDSTc(int); 171d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitLDC(); 172d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitLDL(); 173d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitLDS(); 174d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitLD(); 175d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitSTL(); 176d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitSTS(); 177d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitST(); 178d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitALD(); 179d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitAST(); 180d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitISBERD(); 1819d60793a03e40e1d139b78fce0144cad57438741Ilia Mirkin void emitAL2P(); 182d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitIPA(); 18371a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin void emitATOM(); 1848f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset void emitATOMS(); 185a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset void emitRED(); 18671a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin void emitCCTL(); 187d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 188d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitPIXLD(); 189d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 190d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitTEXs(int); 191d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitTEX(); 192d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitTLD(); 193d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitTLD4(); 194d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitTXD(); 195d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitTXQ(); 196d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitTMML(); 197d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitDEPBAR(); 198d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 199d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitNOP(); 200d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitKIL(); 201d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs void emitOUT(); 202d11266aa06a507d8895bdc1f454a5837131cc1afSamuel Pitoiset 203c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset void emitBAR(); 204d11266aa06a507d8895bdc1f454a5837131cc1afSamuel Pitoiset void emitMEMBAR(); 20507ed003faf3199a3e95852e7a34763aeaf76503dSamuel Pitoiset 20607ed003faf3199a3e95852e7a34763aeaf76503dSamuel Pitoiset void emitVOTE(); 2074aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset 2084aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset void emitSUTarget(); 2094aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset void emitSUHandle(const int s); 2104aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset void emitSUSTx(); 2114aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset void emitSULDx(); 2121edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset void emitSUREDx(); 213d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}; 214d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 215d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs/******************************************************************************* 216d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * general instruction layout/fields 217d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs ******************************************************************************/ 218d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 219d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 220d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitField(uint32_t *data, int b, int s, uint32_t v) 221d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 222d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (b >= 0) { 223d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs uint32_t m = ((1ULL << s) - 1); 224d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs uint64_t d = (uint64_t)(v & m) << b; 225d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!(v & ~m) || (v & ~m) == ~m); 226d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs data[1] |= d >> 32; 227d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs data[0] |= d; 228d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 229d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 230d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 231d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 232d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitPred() 233d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 234d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->predSrc >= 0) { 235d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(16, 3, insn->getSrc(insn->predSrc)->rep()->reg.data.id); 236d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(19, 1, insn->cc == CC_NOT_P); 237d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } else { 238d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(16, 3, 7); 239d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 240d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 241d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 242d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 243d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitInsn(uint32_t hi, bool pred) 244d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 245d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs code[0] = 0x00000000; 246d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs code[1] = hi; 247d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (pred) 248d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPred(); 249d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 250d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 251d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 252d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitGPR(int pos, const Value *val) 253d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 254d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(pos, 8, val ? val->reg.data.id : 255); 255d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 256d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 257d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 258d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitSYS(int pos, const Value *val) 259d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 260d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs int id = val ? val->reg.data.id : -1; 261d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 262d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (id) { 2639143940da2c4f0deb07d01c1b48d16bb16022997Ilia Mirkin case SV_LANEID : id = 0x00; break; 2649143940da2c4f0deb07d01c1b48d16bb16022997Ilia Mirkin case SV_VERTEX_COUNT : id = 0x10; break; 265d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case SV_INVOCATION_ID : id = 0x11; break; 26639f51ec96f00f601b9c4d4e321dacb3af9dc866fIlia Mirkin case SV_THREAD_KILL : id = 0x13; break; 267d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case SV_INVOCATION_INFO: id = 0x1d; break; 2687f0a19400eb26f555a0db535eff156a0a5091cb3Samuel Pitoiset case SV_TID : id = 0x21 + val->reg.data.sv.index; break; 2697f0a19400eb26f555a0db535eff156a0a5091cb3Samuel Pitoiset case SV_CTAID : id = 0x25 + val->reg.data.sv.index; break; 270d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 271d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"invalid system value"); 272d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs id = 0; 273d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 274d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 275d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 276d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(pos, 8, id); 277d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 278d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 279d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 280d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitPRED(int pos, const Value *val) 281d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 282d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(pos, 3, val ? val->reg.data.id : 7); 283d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 284d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 285d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 286d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitADDR(int gpr, int off, int len, int shr, 287d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs const ValueRef &ref) 288d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 289d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs const Value *v = ref.get(); 290d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!(v->reg.data.offset & ((1 << shr) - 1))); 291d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (gpr >= 0) 292d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR(gpr, ref.getIndirect(0)); 293d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(off, len, v->reg.data.offset >> shr); 294d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 295d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 296d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 297d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitCBUF(int buf, int gpr, int off, int len, int shr, 298d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs const ValueRef &ref) 299d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 300d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs const Value *v = ref.get(); 301d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs const Symbol *s = v->asSym(); 302d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 303d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!(s->reg.data.offset & ((1 << shr) - 1))); 304d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 305d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(buf, 5, v->reg.fileIndex); 306d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (gpr >= 0) 307d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR(gpr, ref.getIndirect(0)); 308d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(off, 16, s->reg.data.offset >> shr); 309d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 310d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 311d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsbool 312d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::longIMMD(const ValueRef &ref) 313d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 314d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (ref.getFile() == FILE_IMMEDIATE) { 315d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs const ImmediateValue *imm = ref.get()->asImm(); 316d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (isFloatType(insn->sType)) { 317d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if ((imm->reg.data.u32 & 0x00000fff) != 0x00000000) 318d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs return true; 319d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } else { 320d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if ((imm->reg.data.u32 & 0xfff00000) != 0x00000000 && 321d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs (imm->reg.data.u32 & 0xfff00000) != 0xfff00000) 322d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs return true; 323d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 324d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 325d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs return false; 326d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 327d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 328d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 329d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitIMMD(int pos, int len, const ValueRef &ref) 330d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 331d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs const ImmediateValue *imm = ref.get()->asImm(); 332d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs uint32_t val = imm->reg.data.u32; 333d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 334d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (len == 19) { 335b487b55f7d08c00f2efabc097c7138403528893fHans de Goede if (insn->sType == TYPE_F32 || insn->sType == TYPE_F16) { 336d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!(val & 0x00000fff)); 337d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs val >>= 12; 338b487b55f7d08c00f2efabc097c7138403528893fHans de Goede } else if (insn->sType == TYPE_F64) { 339b487b55f7d08c00f2efabc097c7138403528893fHans de Goede assert(!(imm->reg.data.u64 & 0x00000fffffffffffULL)); 340b487b55f7d08c00f2efabc097c7138403528893fHans de Goede val = imm->reg.data.u64 >> 44; 341d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 342d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!(val & 0xfff00000) || (val & 0xfff00000) == 0xfff00000); 343d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField( 56, 1, (val & 0x80000) >> 19); 344d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(pos, len, (val & 0x7ffff)); 345d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } else { 346d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(pos, len, val); 347d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 348d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 349d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 350d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs/******************************************************************************* 351d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * modifiers 352d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs ******************************************************************************/ 353d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 354d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 355d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitCond3(int pos, CondCode code) 356d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 357d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs int data = 0; 358d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 359d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (code) { 360d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case CC_FL : data = 0x00; break; 361d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case CC_LTU: 362d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case CC_LT : data = 0x01; break; 363d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case CC_EQU: 364d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case CC_EQ : data = 0x02; break; 365d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case CC_LEU: 366d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case CC_LE : data = 0x03; break; 367d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case CC_GTU: 368d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case CC_GT : data = 0x04; break; 369d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case CC_NEU: 370d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case CC_NE : data = 0x05; break; 371d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case CC_GEU: 372d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case CC_GE : data = 0x06; break; 373d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case CC_TR : data = 0x07; break; 374d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 375d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"invalid cond3"); 376d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 377d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 378d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 379d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(pos, 3, data); 380d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 381d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 382d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 383d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitCond4(int pos, CondCode code) 384d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 385d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs int data = 0; 386d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 387d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (code) { 388d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case CC_FL: data = 0x00; break; 389d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case CC_LT: data = 0x01; break; 390d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case CC_EQ: data = 0x02; break; 391d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case CC_LE: data = 0x03; break; 392d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case CC_GT: data = 0x04; break; 393d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case CC_NE: data = 0x05; break; 394d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case CC_GE: data = 0x06; break; 395d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs// case CC_NUM: data = 0x07; break; 396d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs// case CC_NAN: data = 0x08; break; 397d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case CC_LTU: data = 0x09; break; 398d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case CC_EQU: data = 0x0a; break; 399d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case CC_LEU: data = 0x0b; break; 400d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case CC_GTU: data = 0x0c; break; 401d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case CC_NEU: data = 0x0d; break; 402d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case CC_GEU: data = 0x0e; break; 403d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case CC_TR: data = 0x0f; break; 404d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 405d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"invalid cond4"); 406d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 407d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 408d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 409d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(pos, 4, data); 410d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 411d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 412d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 413d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitO(int pos) 414d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 415d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(pos, 1, insn->getSrc(0)->reg.file == FILE_SHADER_OUTPUT); 416d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 417d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 418d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 419d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitP(int pos) 420d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 421d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(pos, 1, insn->perPatch); 422d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 423d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 424d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 425d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitSAT(int pos) 426d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 427d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(pos, 1, insn->saturate); 428d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 429d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 430d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 431d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitCC(int pos) 432d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 433cc97b6a34a81e58c29bed6dae06613b388506283Samuel Pitoiset emitField(pos, 1, insn->flagsDef >= 0); 434d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 435d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 436d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 437d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitX(int pos) 438d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 439d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(pos, 1, insn->flagsSrc >= 0); 440d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 441d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 442d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 443d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitABS(int pos, const ValueRef &ref) 444d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 445d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(pos, 1, ref.mod.abs()); 446d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 447d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 448d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 449d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitNEG(int pos, const ValueRef &ref) 450d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 451d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(pos, 1, ref.mod.neg()); 452d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 453d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 454d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 455d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitNEG2(int pos, const ValueRef &a, const ValueRef &b) 456d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 457d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(pos, 1, a.mod.neg() ^ b.mod.neg()); 458d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 459d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 460d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 461d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitFMZ(int pos, int len) 462d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 463d58037ccf5f362cabecb09bd4874db52629bbd71Ilia Mirkin emitField(pos, len, insn->dnz << 1 | insn->ftz); 464d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 465d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 466d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 467d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitRND(int rmp, RoundMode rnd, int rip) 468d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 469d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs int rm = 0, ri = 0; 470d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (rnd) { 471d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case ROUND_NI: ri = 1; 472d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case ROUND_N : rm = 0; break; 473d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case ROUND_MI: ri = 1; 474d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case ROUND_M : rm = 1; break; 475d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case ROUND_PI: ri = 1; 476d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case ROUND_P : rm = 2; break; 477d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case ROUND_ZI: ri = 1; 478d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case ROUND_Z : rm = 3; break; 479d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 480d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"invalid round mode"); 481d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 482d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 483d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(rip, 1, ri); 484d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(rmp, 2, rm); 485d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 486d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 487d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 488d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitPDIV(int pos) 489d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 490d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(insn->postFactor >= -3 && insn->postFactor <= 3); 491d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->postFactor > 0) 492d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(pos, 3, 7 - insn->postFactor); 493d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs else 494d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(pos, 3, 0 - insn->postFactor); 495d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 496d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 497d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 498d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitINV(int pos, const ValueRef &ref) 499d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 500d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(pos, 1, !!(ref.mod & Modifier(NV50_IR_MOD_NOT))); 501d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 502d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 503d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs/******************************************************************************* 504d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * control flow 505d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs ******************************************************************************/ 506d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 507d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 508d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitEXIT() 509d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 510d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn (0xe3000000); 511d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCond5(0x00, CC_TR); 512d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 513d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 514d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 515d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitBRA() 516d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 517d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs const FlowInstruction *insn = this->insn->asFlow(); 518d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs int gpr = -1; 519d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 520d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->indirect) { 521d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->absolute) 522d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0xe2000000); // JMX 523d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs else 524d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0xe2500000); // BRX 525d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs gpr = 0x08; 526d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } else { 527d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->absolute) 528d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0xe2100000); // JMP 529d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs else 530d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0xe2400000); // BRA 531d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x07, 1, insn->allWarp); 532d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 533d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 534d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x06, 1, insn->limit); 535d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCond5(0x00, CC_TR); 536d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 537d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (!insn->srcExists(0) || insn->src(0).getFile() != FILE_MEMORY_CONST) { 5380ec6b8ea8ce0929ecacf6edc8db198b7b9604f18Ilia Mirkin int32_t pos = insn->target.bb->binPos; 5390ec6b8ea8ce0929ecacf6edc8db198b7b9604f18Ilia Mirkin if (writeIssueDelays && !(pos & 0x1f)) 5400ec6b8ea8ce0929ecacf6edc8db198b7b9604f18Ilia Mirkin pos += 8; 541d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (!insn->absolute) 5420ec6b8ea8ce0929ecacf6edc8db198b7b9604f18Ilia Mirkin emitField(0x14, 24, pos - (codeSize + 8)); 543d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs else 5440ec6b8ea8ce0929ecacf6edc8db198b7b9604f18Ilia Mirkin emitField(0x14, 32, pos); 545d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } else { 546d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF (0x24, gpr, 20, 16, 0, insn->src(0)); 547d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x05, 1, 1); 548d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 549d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 550d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 551d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 552d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitCAL() 553d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 554d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs const FlowInstruction *insn = this->insn->asFlow(); 555d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 556d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->absolute) { 557d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0xe2200000, 0); // JCAL 558d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } else { 559d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0xe2600000, 0); // CAL 560d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 561d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 562d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (!insn->srcExists(0) || insn->src(0).getFile() != FILE_MEMORY_CONST) { 563d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (!insn->absolute) 564d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x14, 24, insn->target.bb->binPos - (codeSize + 8)); 565d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs else { 566d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->builtin) { 567d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs int pcAbs = targGM107->getBuiltinOffset(insn->target.builtin); 568d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs addReloc(RelocEntry::TYPE_BUILTIN, 0, pcAbs, 0xfff00000, 20); 569d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs addReloc(RelocEntry::TYPE_BUILTIN, 1, pcAbs, 0x000fffff, -12); 570d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } else { 571d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x14, 32, insn->target.bb->binPos); 572d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 573d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 574d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } else { 575d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF (0x24, -1, 20, 16, 0, insn->src(0)); 576d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x05, 1, 1); 577d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 578d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 579d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 580d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 581d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitPCNT() 582d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 583d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs const FlowInstruction *insn = this->insn->asFlow(); 584d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 585d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0xe2b00000, 0); 586d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 587d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (!insn->srcExists(0) || insn->src(0).getFile() != FILE_MEMORY_CONST) { 588d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x14, 24, insn->target.bb->binPos - (codeSize + 8)); 589d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } else { 590d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF (0x24, -1, 20, 16, 0, insn->src(0)); 591d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x05, 1, 1); 592d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 593d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 594d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 595d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 596d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitCONT() 597d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 598d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn (0xe3500000); 599d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCond5(0x00, CC_TR); 600d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 601d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 602d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 603d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitPBK() 604d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 605d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs const FlowInstruction *insn = this->insn->asFlow(); 606d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 607d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0xe2a00000, 0); 608d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 609d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (!insn->srcExists(0) || insn->src(0).getFile() != FILE_MEMORY_CONST) { 610d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x14, 24, insn->target.bb->binPos - (codeSize + 8)); 611d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } else { 612d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF (0x24, -1, 20, 16, 0, insn->src(0)); 613d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x05, 1, 1); 614d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 615d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 616d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 617d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 618d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitBRK() 619d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 620d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn (0xe3400000); 621d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCond5(0x00, CC_TR); 622d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 623d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 624d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 625d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitPRET() 626d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 627d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs const FlowInstruction *insn = this->insn->asFlow(); 628d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 629d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0xe2700000, 0); 630d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 631d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (!insn->srcExists(0) || insn->src(0).getFile() != FILE_MEMORY_CONST) { 632d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x14, 24, insn->target.bb->binPos - (codeSize + 8)); 633d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } else { 634d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF (0x24, -1, 20, 16, 0, insn->src(0)); 635d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x05, 1, 1); 636d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 637d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 638d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 639d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 640d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitRET() 641d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 642d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn (0xe3200000); 643d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCond5(0x00, CC_TR); 644d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 645d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 646d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 647d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitSSY() 648d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 649d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs const FlowInstruction *insn = this->insn->asFlow(); 650d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 651d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0xe2900000, 0); 652d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 653d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (!insn->srcExists(0) || insn->src(0).getFile() != FILE_MEMORY_CONST) { 654d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x14, 24, insn->target.bb->binPos - (codeSize + 8)); 655d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } else { 656d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF (0x24, -1, 20, 16, 0, insn->src(0)); 657d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x05, 1, 1); 658d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 659d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 660d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 661d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 662d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitSYNC() 663d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 664d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn (0xf0f80000); 665d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCond5(0x00, CC_TR); 666d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 667d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 668d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 669d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitSAM() 670d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 671d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0xe3700000, 0); 672d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 673d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 674d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 675d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitRAM() 676d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 677d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0xe3800000, 0); 678d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 679d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 680d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs/******************************************************************************* 681d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * predicate/cc 682d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs ******************************************************************************/ 683d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 684d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs/******************************************************************************* 685d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * movement / conversion 686d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs ******************************************************************************/ 687d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 688d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 689d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitMOV() 690d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 691c7fa3c92f8fc9634af966e760a7601922cca43f6Samuel Pitoiset if (insn->src(0).getFile() != FILE_IMMEDIATE) { 692d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->src(0).getFile()) { 693d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 6941a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin if (insn->def(0).getFile() == FILE_PREDICATE) { 6951a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin emitInsn(0x5b6a0000); 6961a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin emitGPR (0x08); 6971a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin } else { 6981a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin emitInsn(0x5c980000); 6991a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin } 700d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x14, insn->src(0)); 701d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 702d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 703d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x4c980000); 704d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(0)); 705d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 706d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_IMMEDIATE: 707d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x38980000); 708d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD(0x14, 19, insn->src(0)); 709d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 7101a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin case FILE_PREDICATE: 7111a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin emitInsn(0x50880000); 7121a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin emitPRED(0x0c, insn->src(0)); 7131a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin emitPRED(0x1d); 7141a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin emitPRED(0x27); 7151a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin break; 716d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 717d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src file"); 718d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 719d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 7201a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin if (insn->def(0).getFile() != FILE_PREDICATE && 7211a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin insn->src(0).getFile() != FILE_PREDICATE) 7221a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin emitField(0x27, 4, insn->lanes); 723d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } else { 724d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn (0x01000000); 725d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD (0x14, 32, insn->src(0)); 726d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x0c, 4, insn->lanes); 727d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 728d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 7291a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin if (insn->def(0).getFile() == FILE_PREDICATE) { 7301a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin emitPRED(0x27); 7311a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin emitPRED(0x03, insn->def(0)); 7321a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin emitPRED(0x00); 7331a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin } else { 7341a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin emitGPR(0x00, insn->def(0)); 7351a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin } 736d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 737d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 738d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 739d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitS2R() 740d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 741d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0xf0c80000); 742d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitSYS (0x14, insn->src(0)); 743d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->def(0)); 744d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 745d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 746d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 747d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitF2F() 748d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 749d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs RoundMode rnd = insn->rnd; 750d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 751d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->op) { 752d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_FLOOR: rnd = ROUND_MI; break; 753d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_CEIL : rnd = ROUND_PI; break; 754d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_TRUNC: rnd = ROUND_ZI; break; 755d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 756d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 757d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 758d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 759d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->src(0).getFile()) { 760d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 761d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x5ca80000); 762d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x14, insn->src(0)); 763d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 764d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 765d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x4ca80000); 766d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(0)); 767d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 768d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_IMMEDIATE: 769d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x38a80000); 770d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD(0x14, 19, insn->src(0)); 771d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 772d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 773d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src0 file"); 774d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 775d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 776d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 777d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x32, 1, (insn->op == OP_SAT) || insn->saturate); 778d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x31, 1, (insn->op == OP_ABS) || insn->src(0).mod.abs()); 779d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCC (0x2f); 780d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x2d, 1, (insn->op == OP_NEG) || insn->src(0).mod.neg()); 781d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitFMZ (0x2c, 1); 78234217018c4ae9c2c672534494be0c5b9569609e2Ilia Mirkin emitField(0x29, 1, insn->subOp); 783d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitRND (0x27, rnd, 0x2a); 78493ebe91baed86a63f81fa852c5e7cc0ea52ff562Ilia Mirkin emitField(0x0a, 2, util_logbase2(typeSizeof(insn->sType))); 78593ebe91baed86a63f81fa852c5e7cc0ea52ff562Ilia Mirkin emitField(0x08, 2, util_logbase2(typeSizeof(insn->dType))); 786d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->def(0)); 787d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 788d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 789d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 790d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitF2I() 791d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 792d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs RoundMode rnd = insn->rnd; 793d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 794d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->op) { 795d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_FLOOR: rnd = ROUND_M; break; 796d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_CEIL : rnd = ROUND_P; break; 797d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_TRUNC: rnd = ROUND_Z; break; 798d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 799d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 800d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 801d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 802d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->src(0).getFile()) { 803d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 804d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x5cb00000); 805d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x14, insn->src(0)); 806d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 807d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 808d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x4cb00000); 809d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(0)); 810d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 811d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_IMMEDIATE: 812d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x38b00000); 813d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD(0x14, 19, insn->src(0)); 814d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 815d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 816d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src0 file"); 817d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 818d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 819d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 820d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x31, 1, (insn->op == OP_ABS) || insn->src(0).mod.abs()); 821d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCC (0x2f); 822d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x2d, 1, (insn->op == OP_NEG) || insn->src(0).mod.neg()); 823d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitFMZ (0x2c, 1); 824d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitRND (0x27, rnd, 0x2a); 825d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x0c, 1, isSignedType(insn->dType)); 826d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x0a, 2, util_logbase2(typeSizeof(insn->sType))); 827d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x08, 2, util_logbase2(typeSizeof(insn->dType))); 828d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->def(0)); 829d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 830d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 831d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 832d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitI2F() 833d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 834d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs RoundMode rnd = insn->rnd; 835d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 836d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->op) { 837d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_FLOOR: rnd = ROUND_M; break; 838d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_CEIL : rnd = ROUND_P; break; 839d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_TRUNC: rnd = ROUND_Z; break; 840d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 841d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 842d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 843d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 844d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->src(0).getFile()) { 845d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 846d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x5cb80000); 847d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x14, insn->src(0)); 848d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 849d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 850d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x4cb80000); 851d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(0)); 852d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 853d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_IMMEDIATE: 854d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x38b80000); 855d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD(0x14, 19, insn->src(0)); 856d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 857d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 858d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src0 file"); 859d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 860d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 861d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 862d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x31, 1, (insn->op == OP_ABS) || insn->src(0).mod.abs()); 863d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCC (0x2f); 864d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x2d, 1, (insn->op == OP_NEG) || insn->src(0).mod.neg()); 86563cb85e567ad1025ee990b38f43c2f1ef811821bIlia Mirkin emitField(0x29, 2, insn->subOp); 866d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitRND (0x27, rnd, -1); 867d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x0d, 1, isSignedType(insn->sType)); 868d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x0a, 2, util_logbase2(typeSizeof(insn->sType))); 869d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x08, 2, util_logbase2(typeSizeof(insn->dType))); 870d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->def(0)); 871d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 872d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 873d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 874d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitI2I() 875d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 876d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->src(0).getFile()) { 877d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 878d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x5ce00000); 879d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x14, insn->src(0)); 880d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 881d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 882d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x4ce00000); 883d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(0)); 884d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 885d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_IMMEDIATE: 886d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x38e00000); 887d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD(0x14, 19, insn->src(0)); 888d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 889d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 890d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src0 file"); 891d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 892d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 893d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 894d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitSAT (0x32); 895d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x31, 1, (insn->op == OP_ABS) || insn->src(0).mod.abs()); 896d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCC (0x2f); 897d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x2d, 1, (insn->op == OP_NEG) || insn->src(0).mod.neg()); 89863cb85e567ad1025ee990b38f43c2f1ef811821bIlia Mirkin emitField(0x29, 2, insn->subOp); 899d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x0d, 1, isSignedType(insn->sType)); 900d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x0c, 1, isSignedType(insn->dType)); 901d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x0a, 2, util_logbase2(typeSizeof(insn->sType))); 902d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x08, 2, util_logbase2(typeSizeof(insn->dType))); 903d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->def(0)); 904d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 905d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 906ba3f0b6d5920165c735d51500544da8c29b09060Ilia Mirkinstatic void 907ba3f0b6d5920165c735d51500544da8c29b09060Ilia MirkinselpFlip(const FixupEntry *entry, uint32_t *code, const FixupData& data) 908ba3f0b6d5920165c735d51500544da8c29b09060Ilia Mirkin{ 909ba3f0b6d5920165c735d51500544da8c29b09060Ilia Mirkin int loc = entry->loc; 910ba3f0b6d5920165c735d51500544da8c29b09060Ilia Mirkin if (data.force_persample_interp) 911ba3f0b6d5920165c735d51500544da8c29b09060Ilia Mirkin code[loc + 1] |= 1 << 10; 912ba3f0b6d5920165c735d51500544da8c29b09060Ilia Mirkin else 913ba3f0b6d5920165c735d51500544da8c29b09060Ilia Mirkin code[loc + 1] &= ~(1 << 10); 914ba3f0b6d5920165c735d51500544da8c29b09060Ilia Mirkin} 915ba3f0b6d5920165c735d51500544da8c29b09060Ilia Mirkin 916d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 917d64134ecaec46f95189e355de65f631b1b7f7007Ilia MirkinCodeEmitterGM107::emitSEL() 918d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin{ 919d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin switch (insn->src(1).getFile()) { 920d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin case FILE_GPR: 921d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin emitInsn(0x5ca00000); 922d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin emitGPR (0x14, insn->src(1)); 923d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin break; 924d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin case FILE_MEMORY_CONST: 925d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin emitInsn(0x4ca00000); 926d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1)); 927d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin break; 928d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin case FILE_IMMEDIATE: 929d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin emitInsn(0x38a00000); 930d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin emitIMMD(0x14, 19, insn->src(1)); 931d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin break; 932d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin default: 933d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin assert(!"bad src1 file"); 934d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin break; 935d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin } 936d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin 937ba3f0b6d5920165c735d51500544da8c29b09060Ilia Mirkin emitINV (0x2a, insn->src(2)); 938d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin emitPRED(0x27, insn->src(2)); 939d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin emitGPR (0x08, insn->src(0)); 940d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin emitGPR (0x00, insn->def(0)); 941ba3f0b6d5920165c735d51500544da8c29b09060Ilia Mirkin 942ba3f0b6d5920165c735d51500544da8c29b09060Ilia Mirkin if (insn->subOp == 1) { 943ba3f0b6d5920165c735d51500544da8c29b09060Ilia Mirkin addInterp(0, 0, selpFlip); 944ba3f0b6d5920165c735d51500544da8c29b09060Ilia Mirkin } 945d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin} 946d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin 947d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkinvoid 948d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitSHFL() 949d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 950d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs int type = 0; 951d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 952d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn (0xef100000); 953d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 954d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->src(1).getFile()) { 955d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 956d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR(0x14, insn->src(1)); 957d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 958d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_IMMEDIATE: 959d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD(0x14, 5, insn->src(1)); 960d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs type |= 1; 961d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 962d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 963d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"invalid src1 file"); 964d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 965d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 966d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 967d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs /*XXX: what is this arg? hardcode immediate for now */ 968d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x22, 13, 0x1c03); 969d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs type |= 2; 970d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 971d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPRED (0x30); 972d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x1e, 2, insn->subOp); 973d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x1c, 2, type); 974d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x08, insn->src(0)); 975d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->def(0)); 976d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 977d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 978d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs/******************************************************************************* 979d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * double 980d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs ******************************************************************************/ 981d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 982d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 983d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitDADD() 984d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 985d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->src(1).getFile()) { 986d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 987d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x5c700000); 988d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x14, insn->src(1)); 989d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 990d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 991d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x4c700000); 992d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1)); 993d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 994d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_IMMEDIATE: 995d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x38700000); 996d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD(0x14, 19, insn->src(1)); 997d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 998d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 999d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src1 file"); 1000d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1001d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1002d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitABS(0x31, insn->src(1)); 1003d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitNEG(0x30, insn->src(0)); 1004d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCC (0x2f); 1005d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitABS(0x2e, insn->src(0)); 1006d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitNEG(0x2d, insn->src(1)); 1007d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1008d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->op == OP_SUB) 1009d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs code[1] ^= 0x00002000; 1010d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1011d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR(0x08, insn->src(0)); 1012d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR(0x00, insn->def(0)); 1013d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 1014d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1015d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 1016d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitDMUL() 1017d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 1018d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->src(1).getFile()) { 1019d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 1020727018bb0c4fb7ca6e047937af5a58e17a1b4f7cIlia Mirkin emitInsn(0x5c800000); 1021d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x14, insn->src(1)); 1022d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1023d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 1024727018bb0c4fb7ca6e047937af5a58e17a1b4f7cIlia Mirkin emitInsn(0x4c800000); 1025d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1)); 1026d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1027d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_IMMEDIATE: 1028727018bb0c4fb7ca6e047937af5a58e17a1b4f7cIlia Mirkin emitInsn(0x38800000); 1029d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD(0x14, 19, insn->src(1)); 1030d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1031d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 1032d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src1 file"); 1033d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1034d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1035d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1036d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitNEG2(0x30, insn->src(0), insn->src(1)); 1037d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCC (0x2f); 1038d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitRND (0x27); 1039d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x08, insn->src(0)); 1040d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->def(0)); 1041d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 1042d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1043d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 1044d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitDFMA() 1045d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 1046d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch(insn->src(2).getFile()) { 1047d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 1048d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->src(1).getFile()) { 1049d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 1050d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x5b700000); 1051d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x14, insn->src(1)); 1052d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1053d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 1054d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x4b700000); 1055d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1)); 1056d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1057d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_IMMEDIATE: 1058d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x36700000); 1059d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD(0x14, 19, insn->src(1)); 1060d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1061d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 1062d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src1 file"); 1063d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1064d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1065d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x27, insn->src(2)); 1066d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1067d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 1068d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x53700000); 1069d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x27, insn->src(1)); 1070d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(2)); 1071d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1072d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 1073d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src2 file"); 1074d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1075d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1076d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1077d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitRND (0x32); 1078d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitNEG (0x31, insn->src(2)); 1079d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitNEG2(0x30, insn->src(0), insn->src(1)); 1080d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCC (0x2f); 1081d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x08, insn->src(0)); 1082d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->def(0)); 1083d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 1084d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1085d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 1086d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitDMNMX() 1087d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 1088d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->src(1).getFile()) { 1089d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 1090d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x5c500000); 1091d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x14, insn->src(1)); 1092d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1093d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 1094d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x4c500000); 1095d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1)); 1096d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1097d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_IMMEDIATE: 1098d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x38500000); 1099d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD(0x14, 19, insn->src(1)); 1100d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1101d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 1102d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src1 file"); 1103d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1104d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1105d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1106d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitABS (0x31, insn->src(1)); 1107d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitNEG (0x30, insn->src(0)); 1108d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCC (0x2f); 1109d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitABS (0x2e, insn->src(0)); 1110d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitNEG (0x2d, insn->src(1)); 1111d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x2a, 1, insn->op == OP_MAX); 1112d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPRED (0x27); 1113d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x08, insn->src(0)); 1114d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->def(0)); 1115d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 1116d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1117d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 1118d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitDSET() 1119d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 1120d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs const CmpInstruction *insn = this->insn->asCmp(); 1121d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1122d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->src(1).getFile()) { 1123d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 1124d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x59000000); 1125d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x14, insn->src(1)); 1126d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1127d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 1128d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x49000000); 1129d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1)); 1130d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1131d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_IMMEDIATE: 1132d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x32000000); 1133d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD(0x14, 19, insn->src(1)); 1134d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1135d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 1136d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src1 file"); 1137d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1138d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1139d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1140d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->op != OP_SET) { 1141d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->op) { 1142d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_SET_AND: emitField(0x2d, 2, 0); break; 1143d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_SET_OR : emitField(0x2d, 2, 1); break; 1144d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_SET_XOR: emitField(0x2d, 2, 2); break; 1145d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 1146d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"invalid set op"); 1147d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1148d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1149d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPRED(0x27, insn->src(2)); 1150d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } else { 1151d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPRED(0x27); 1152d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1153d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1154d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitABS (0x36, insn->src(0)); 1155d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitNEG (0x35, insn->src(1)); 1156dbf4a674b94fc8fca21997f8145b96bcf2f7a260Ilia Mirkin emitField(0x34, 1, insn->dType == TYPE_F32); 1157d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCond4(0x30, insn->setCond); 1158d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCC (0x2f); 1159d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitABS (0x2c, insn->src(1)); 1160d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitNEG (0x2b, insn->src(0)); 1161d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x08, insn->src(0)); 1162d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->def(0)); 1163d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 1164d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1165d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 1166d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitDSETP() 1167d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 1168d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs const CmpInstruction *insn = this->insn->asCmp(); 1169d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1170d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->src(1).getFile()) { 1171d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 1172d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x5b800000); 1173d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x14, insn->src(1)); 1174d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1175d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 1176d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x4b800000); 1177d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1)); 1178d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1179d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_IMMEDIATE: 1180d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x36800000); 1181d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD(0x14, 19, insn->src(1)); 1182d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1183d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 1184d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src1 file"); 1185d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1186d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1187d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1188d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->op != OP_SET) { 1189d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->op) { 1190d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_SET_AND: emitField(0x2d, 2, 0); break; 1191d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_SET_OR : emitField(0x2d, 2, 1); break; 1192d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_SET_XOR: emitField(0x2d, 2, 2); break; 1193d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 1194d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"invalid set op"); 1195d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1196d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1197d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPRED(0x27, insn->src(2)); 1198d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } else { 1199d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPRED(0x27); 1200d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1201d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1202d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCond4(0x30, insn->setCond); 1203d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitABS (0x2c, insn->src(1)); 1204d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitNEG (0x2b, insn->src(0)); 1205d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x08, insn->src(0)); 1206d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitABS (0x07, insn->src(0)); 1207d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitNEG (0x06, insn->src(1)); 1208d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPRED (0x03, insn->def(0)); 1209d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->defExists(1)) 1210d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPRED(0x00, insn->def(1)); 1211d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs else 1212d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPRED(0x00); 1213d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 1214d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1215d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs/******************************************************************************* 1216d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * float 1217d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs ******************************************************************************/ 1218d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1219d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 1220d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitFADD() 1221d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 1222d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (!longIMMD(insn->src(1))) { 1223d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->src(1).getFile()) { 1224d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 1225d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x5c580000); 1226d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x14, insn->src(1)); 1227d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1228d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 1229d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x4c580000); 1230d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1)); 1231d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1232d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_IMMEDIATE: 1233d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x38580000); 1234d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD(0x14, 19, insn->src(1)); 1235d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1236d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 1237d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src1 file"); 1238d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1239d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1240d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitSAT(0x32); 1241d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitABS(0x31, insn->src(1)); 1242d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitNEG(0x30, insn->src(0)); 1243d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCC (0x2f); 1244d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitABS(0x2e, insn->src(0)); 1245d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitNEG(0x2d, insn->src(1)); 1246d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitFMZ(0x2c, 1); 1247cb828b7b18d83cb2ea3dcaed54c1678616c56fc8Samuel Pitoiset 1248cb828b7b18d83cb2ea3dcaed54c1678616c56fc8Samuel Pitoiset if (insn->op == OP_SUB) 1249cb828b7b18d83cb2ea3dcaed54c1678616c56fc8Samuel Pitoiset code[1] ^= 0x00002000; 1250d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } else { 1251d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x08000000); 1252d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitABS(0x39, insn->src(1)); 1253d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitNEG(0x38, insn->src(0)); 1254d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitFMZ(0x37, 1); 1255d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitABS(0x36, insn->src(0)); 1256d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitNEG(0x35, insn->src(1)); 1257d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCC (0x34); 1258d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD(0x14, 32, insn->src(1)); 1259d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1260cb828b7b18d83cb2ea3dcaed54c1678616c56fc8Samuel Pitoiset if (insn->op == OP_SUB) 1261cb828b7b18d83cb2ea3dcaed54c1678616c56fc8Samuel Pitoiset code[1] ^= 0x00080000; 1262cb828b7b18d83cb2ea3dcaed54c1678616c56fc8Samuel Pitoiset } 1263d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1264d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR(0x08, insn->src(0)); 1265d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR(0x00, insn->def(0)); 1266d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 1267d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1268d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 1269d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitFMUL() 1270d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 1271d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (!longIMMD(insn->src(1))) { 1272d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->src(1).getFile()) { 1273d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 1274d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x5c680000); 1275d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x14, insn->src(1)); 1276d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1277d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 1278d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x4c680000); 1279d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1)); 1280d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1281d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_IMMEDIATE: 1282d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x38680000); 1283d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD(0x14, 19, insn->src(1)); 1284d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1285d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 1286d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src1 file"); 1287d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1288d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1289d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitSAT (0x32); 1290d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitNEG2(0x30, insn->src(0), insn->src(1)); 1291d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCC (0x2f); 1292d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitFMZ (0x2c, 2); 1293d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPDIV(0x29); 1294d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitRND (0x27); 1295d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } else { 1296d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x1e000000); 1297d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitSAT (0x37); 1298d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitFMZ (0x35, 2); 1299d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCC (0x34); 1300d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD(0x14, 32, insn->src(1)); 1301d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->src(0).mod.neg() ^ insn->src(1).mod.neg()) 1302d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs code[1] ^= 0x00080000; /* flip immd sign bit */ 1303d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1304d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1305d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR(0x08, insn->src(0)); 1306d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR(0x00, insn->def(0)); 1307d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 1308d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1309d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 1310d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitFFMA() 1311d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 1312d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs /*XXX: ffma32i exists, but not using it as third src overlaps dst */ 1313d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch(insn->src(2).getFile()) { 1314d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 1315d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->src(1).getFile()) { 1316d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 1317d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x59800000); 1318d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x14, insn->src(1)); 1319d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1320d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 1321d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x49800000); 1322d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1)); 1323d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1324d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_IMMEDIATE: 1325d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x32800000); 1326d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD(0x14, 19, insn->src(1)); 1327d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1328d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 1329d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src1 file"); 1330d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1331d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1332d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x27, insn->src(2)); 1333d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1334d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 1335d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x51800000); 1336d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x27, insn->src(1)); 1337d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(2)); 1338d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1339d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 1340d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src2 file"); 1341d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1342d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1343d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitRND (0x33); 1344d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitSAT (0x32); 1345d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitNEG (0x31, insn->src(2)); 1346d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitNEG2(0x30, insn->src(0), insn->src(1)); 1347d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCC (0x2f); 1348d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1349d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitFMZ(0x35, 2); 1350d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR(0x08, insn->src(0)); 1351d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR(0x00, insn->def(0)); 1352d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 1353d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1354d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 1355d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitMUFU() 1356d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 1357d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs int mufu = 0; 1358d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1359d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->op) { 1360d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_COS: mufu = 0; break; 1361d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_SIN: mufu = 1; break; 1362d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_EX2: mufu = 2; break; 1363d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_LG2: mufu = 3; break; 1364b87b498b88c51fb8c80901b8f581331d3fbcd972Ilia Mirkin case OP_RCP: mufu = 4 + 2 * insn->subOp; break; 1365b87b498b88c51fb8c80901b8f581331d3fbcd972Ilia Mirkin case OP_RSQ: mufu = 5 + 2 * insn->subOp; break; 1366d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 1367d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"invalid mufu"); 1368d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1369d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1370d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1371d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn (0x50800000); 1372d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitSAT (0x32); 1373d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitNEG (0x30, insn->src(0)); 1374d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitABS (0x2e, insn->src(0)); 1375d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x14, 3, mufu); 1376d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x08, insn->src(0)); 1377d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->def(0)); 1378d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 1379d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1380d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 1381d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitFMNMX() 1382d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 1383d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->src(1).getFile()) { 1384d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 1385d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x5c600000); 1386d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x14, insn->src(1)); 1387d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1388d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 1389d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x4c600000); 1390d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1)); 1391d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1392d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_IMMEDIATE: 1393d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x38600000); 1394d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD(0x14, 19, insn->src(1)); 1395d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1396d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 1397d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src1 file"); 1398d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1399d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1400d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1401d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x2a, 1, insn->op == OP_MAX); 1402d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPRED (0x27); 1403d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1404d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitABS(0x31, insn->src(1)); 1405d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitNEG(0x30, insn->src(0)); 1406d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCC (0x2f); 1407d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitABS(0x2e, insn->src(0)); 1408d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitNEG(0x2d, insn->src(1)); 1409d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitFMZ(0x2c, 1); 1410d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR(0x08, insn->src(0)); 1411d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR(0x00, insn->def(0)); 1412d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 1413d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1414d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 1415d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitRRO() 1416d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 1417d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->src(0).getFile()) { 1418d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 1419d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x5c900000); 1420d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x14, insn->src(0)); 1421d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1422d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 1423d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x4c900000); 1424d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(0)); 1425d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1426d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_IMMEDIATE: 1427d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x38900000); 1428d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD(0x14, 19, insn->src(0)); 1429d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1430d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 1431d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src file"); 1432d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1433d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1434d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1435d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitABS (0x31, insn->src(0)); 1436d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitNEG (0x2d, insn->src(0)); 1437d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x27, 1, insn->op == OP_PREEX2); 1438d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->def(0)); 1439d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 1440d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1441d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 1442d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitFCMP() 1443d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 1444d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs const CmpInstruction *insn = this->insn->asCmp(); 1445d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs CondCode cc = insn->setCond; 1446d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1447d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->src(2).mod.neg()) 1448d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs cc = reverseCondCode(cc); 1449d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1450d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch(insn->src(2).getFile()) { 1451d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 1452d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->src(1).getFile()) { 1453d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 1454d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x5ba00000); 1455d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x14, insn->src(1)); 1456d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1457d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 1458d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x4ba00000); 1459d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1)); 1460d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1461d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_IMMEDIATE: 1462d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x36a00000); 1463d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD(0x14, 19, insn->src(1)); 1464d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1465d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 1466d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src1 file"); 1467d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1468d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1469d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x27, insn->src(2)); 1470d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1471d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 1472d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x53a00000); 1473d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x27, insn->src(1)); 1474d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(2)); 1475d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1476d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 1477d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src2 file"); 1478d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1479d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1480d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1481d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCond4(0x30, cc); 1482d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitFMZ (0x2f, 1); 1483d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x08, insn->src(0)); 1484d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->def(0)); 1485d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 1486d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1487d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 1488d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitFSET() 1489d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 1490d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs const CmpInstruction *insn = this->insn->asCmp(); 1491d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1492d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->src(1).getFile()) { 1493d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 1494d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x58000000); 1495d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x14, insn->src(1)); 1496d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1497d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 1498d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x48000000); 1499d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1)); 1500d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1501d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_IMMEDIATE: 1502d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x30000000); 1503d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD(0x14, 19, insn->src(1)); 1504d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1505d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 1506d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src1 file"); 1507d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1508d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1509d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1510d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->op != OP_SET) { 1511d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->op) { 1512d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_SET_AND: emitField(0x2d, 2, 0); break; 1513d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_SET_OR : emitField(0x2d, 2, 1); break; 1514d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_SET_XOR: emitField(0x2d, 2, 2); break; 1515d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 1516d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"invalid set op"); 1517d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1518d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1519d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPRED(0x27, insn->src(2)); 1520d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } else { 1521d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPRED(0x27); 1522d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1523d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1524d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitFMZ (0x37, 1); 1525d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitABS (0x36, insn->src(0)); 1526d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitNEG (0x35, insn->src(1)); 1527d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x34, 1, insn->dType == TYPE_F32); 1528d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCond4(0x30, insn->setCond); 1529d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCC (0x2f); 1530d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitABS (0x2c, insn->src(1)); 1531d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitNEG (0x2b, insn->src(0)); 1532d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x08, insn->src(0)); 1533d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->def(0)); 1534d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 1535d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1536d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 1537d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitFSETP() 1538d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 1539d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs const CmpInstruction *insn = this->insn->asCmp(); 1540d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1541d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->src(1).getFile()) { 1542d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 1543d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x5bb00000); 1544d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x14, insn->src(1)); 1545d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1546d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 1547d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x4bb00000); 1548d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1)); 1549d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1550d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_IMMEDIATE: 1551d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x36b00000); 1552d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD(0x14, 19, insn->src(1)); 1553d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1554d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 1555d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src1 file"); 1556d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1557d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1558d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1559d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->op != OP_SET) { 1560d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->op) { 1561d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_SET_AND: emitField(0x2d, 2, 0); break; 1562d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_SET_OR : emitField(0x2d, 2, 1); break; 1563d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_SET_XOR: emitField(0x2d, 2, 2); break; 1564d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 1565d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"invalid set op"); 1566d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1567d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1568d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPRED(0x27, insn->src(2)); 1569d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } else { 1570d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPRED(0x27); 1571d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1572d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1573d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCond4(0x30, insn->setCond); 1574d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitFMZ (0x2f, 1); 1575d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitABS (0x2c, insn->src(1)); 1576d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitNEG (0x2b, insn->src(0)); 1577d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x08, insn->src(0)); 1578d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitABS (0x07, insn->src(0)); 1579d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitNEG (0x06, insn->src(1)); 1580d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPRED (0x03, insn->def(0)); 1581d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->defExists(1)) 1582d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPRED(0x00, insn->def(1)); 1583d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs else 1584d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPRED(0x00); 1585d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 1586d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1587d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 1588d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitFSWZADD() 1589d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 1590d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn (0x50f80000); 1591d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCC (0x2f); 1592d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitFMZ (0x2c, 1); 1593d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitRND (0x27); 1594d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x26, 1, insn->lanes); /* abused for .ndv */ 1595d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x1c, 8, insn->subOp); 1596ca23c8081f1f9f709df7a63b9e6de379c0b8df44Ilia Mirkin if (insn->predSrc != 1) 1597ca23c8081f1f9f709df7a63b9e6de379c0b8df44Ilia Mirkin emitGPR (0x14, insn->src(1)); 1598ca23c8081f1f9f709df7a63b9e6de379c0b8df44Ilia Mirkin else 1599ca23c8081f1f9f709df7a63b9e6de379c0b8df44Ilia Mirkin emitGPR (0x14); 1600d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x08, insn->src(0)); 1601d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->def(0)); 1602d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 1603d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1604d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs/******************************************************************************* 1605d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * integer 1606d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs ******************************************************************************/ 1607d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1608d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 1609d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitLOP() 1610d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 1611d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs int lop = 0; 1612d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1613d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->op) { 1614d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_AND: lop = 0; break; 1615d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_OR : lop = 1; break; 1616d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_XOR: lop = 2; break; 1617d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 1618d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"invalid lop"); 1619d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1620d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1621d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 162283a4f28dc27bd3f679d001fb0065940ad1f0f422Samuel Pitoiset if (insn->src(1).getFile() != FILE_IMMEDIATE) { 1623d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->src(1).getFile()) { 1624d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 1625d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x5c400000); 1626d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x14, insn->src(1)); 1627d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1628d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 1629d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x4c400000); 1630d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1)); 1631d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1632d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_IMMEDIATE: 1633d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x38400000); 1634d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD(0x14, 19, insn->src(1)); 1635d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1636d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 1637d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src1 file"); 1638d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1639d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1640d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPRED (0x30); 16417b9b0967756c7d552f5ad80eba46379b2115e604Samuel Pitoiset emitCC (0x2f); 164273c9ca754487fa5f39122119e1588e13ffcf5f47Ilia Mirkin emitX (0x2b); 1643d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x29, 2, lop); 1644d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitINV (0x28, insn->src(1)); 1645d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitINV (0x27, insn->src(0)); 1646d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } else { 1647d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn (0x04000000); 164873c9ca754487fa5f39122119e1588e13ffcf5f47Ilia Mirkin emitX (0x39); 1649d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitINV (0x38, insn->src(1)); 1650d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitINV (0x37, insn->src(0)); 1651d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x35, 2, lop); 16527b9b0967756c7d552f5ad80eba46379b2115e604Samuel Pitoiset emitCC (0x34); 1653d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD (0x14, 32, insn->src(1)); 1654d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1655d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1656d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x08, insn->src(0)); 1657d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->def(0)); 1658d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 1659d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1660d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs/* special-case of emitLOP(): lop pass_b dst 0 ~src */ 1661d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 1662d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitNOT() 1663d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 1664d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (!longIMMD(insn->src(0))) { 1665d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->src(0).getFile()) { 1666d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 1667d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x5c400700); 1668d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x14, insn->src(0)); 1669d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1670d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 1671d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x4c400700); 1672d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(0)); 1673d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1674d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_IMMEDIATE: 1675d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x38400700); 1676d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD(0x14, 19, insn->src(0)); 1677d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1678d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 1679d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src1 file"); 1680d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1681d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1682d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPRED (0x30); 1683d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } else { 1684d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn (0x05600000); 1685d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD (0x14, 32, insn->src(1)); 1686d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1687d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1688d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR(0x08); 1689d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR(0x00, insn->def(0)); 1690d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 1691d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1692d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 1693d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitIADD() 1694d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 16959c63224540ef0f727aae24274fa4afdf2e2376acSamuel Pitoiset if (insn->src(1).getFile() != FILE_IMMEDIATE) { 1696d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->src(1).getFile()) { 1697d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 1698d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x5c100000); 1699d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x14, insn->src(1)); 1700d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1701d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 1702d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x4c100000); 1703d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1)); 1704d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1705d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_IMMEDIATE: 1706d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x38100000); 1707d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD(0x14, 19, insn->src(1)); 1708d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1709d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 1710d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src1 file"); 1711d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1712d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1713d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitSAT(0x32); 1714d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitNEG(0x31, insn->src(0)); 1715d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitNEG(0x30, insn->src(1)); 1716d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCC (0x2f); 171773c9ca754487fa5f39122119e1588e13ffcf5f47Ilia Mirkin emitX (0x2b); 1718d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } else { 1719d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x1c000000); 17200904a2ba9717e5706f8869dc9244e2c742fadd12Samuel Pitoiset emitNEG (0x38, insn->src(0)); 1721d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitSAT (0x36); 172273c9ca754487fa5f39122119e1588e13ffcf5f47Ilia Mirkin emitX (0x35); 1723d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCC (0x34); 1724d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD(0x14, 32, insn->src(1)); 1725d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1726d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1727d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->op == OP_SUB) 1728d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs code[1] ^= 0x00010000; 1729d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1730d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR(0x08, insn->src(0)); 1731d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR(0x00, insn->def(0)); 1732d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 1733d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1734d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 1735d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitIMUL() 1736d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 1737b84c97587b4a838c32fb7ac4eab31a6ba4f69886Samuel Pitoiset if (insn->src(1).getFile() != FILE_IMMEDIATE) { 1738d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->src(1).getFile()) { 1739d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 1740d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x5c380000); 1741d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x14, insn->src(1)); 1742d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1743d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 1744d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x4c380000); 1745d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1)); 1746d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1747d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_IMMEDIATE: 1748d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x38380000); 1749d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD(0x14, 19, insn->src(1)); 1750d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1751d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 1752d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src1 file"); 1753d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1754d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1755d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCC (0x2f); 1756d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x29, 1, isSignedType(insn->sType)); 1757d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x28, 1, isSignedType(insn->dType)); 1758d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x27, 1, insn->subOp == NV50_IR_SUBOP_MUL_HIGH); 1759d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } else { 1760d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn (0x1f000000); 1761d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x37, 1, isSignedType(insn->sType)); 1762d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x36, 1, isSignedType(insn->dType)); 1763d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x35, 1, insn->subOp == NV50_IR_SUBOP_MUL_HIGH); 1764d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCC (0x34); 1765d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD (0x14, 32, insn->src(1)); 1766d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1767d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1768d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR(0x08, insn->src(0)); 1769d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR(0x00, insn->def(0)); 1770d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 1771d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1772d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 1773d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitIMAD() 1774d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 1775d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs /*XXX: imad32i exists, but not using it as third src overlaps dst */ 1776d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch(insn->src(2).getFile()) { 1777d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 1778d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->src(1).getFile()) { 1779d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 1780d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x5a000000); 1781d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x14, insn->src(1)); 1782d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1783d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 1784d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x4a000000); 1785d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1)); 1786d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1787d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_IMMEDIATE: 1788d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x34000000); 1789d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD(0x14, 19, insn->src(1)); 1790d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1791d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 1792d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src1 file"); 1793d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1794d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1795d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x27, insn->src(2)); 1796d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1797d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 1798d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x52000000); 1799d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x27, insn->src(1)); 1800d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(2)); 1801d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1802d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 1803d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src2 file"); 1804d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1805d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1806d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1807d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x36, 1, insn->subOp == NV50_IR_SUBOP_MUL_HIGH); 1808d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x35, 1, isSignedType(insn->sType)); 1809d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitNEG (0x34, insn->src(2)); 1810d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitNEG2 (0x33, insn->src(0), insn->src(1)); 1811d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitSAT (0x32); 1812d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitX (0x31); 1813d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x30, 1, isSignedType(insn->dType)); 1814d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCC (0x2f); 1815d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x08, insn->src(0)); 1816d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->def(0)); 1817d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 1818d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1819d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 182031545b64b80aa939a693723e07f06fe45160ae62Samuel PitoisetCodeEmitterGM107::emitISCADD() 182131545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset{ 182231545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset switch (insn->src(2).getFile()) { 182331545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset case FILE_GPR: 182431545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset emitInsn(0x5c180000); 182531545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset emitGPR (0x14, insn->src(2)); 182631545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset break; 182731545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset case FILE_MEMORY_CONST: 182831545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset emitInsn(0x4c180000); 182931545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(2)); 183031545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset break; 183131545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset case FILE_IMMEDIATE: 183231545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset emitInsn(0x38180000); 183331545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset emitIMMD(0x14, 19, insn->src(2)); 183431545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset break; 183531545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset default: 183631545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset assert(!"bad src1 file"); 183731545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset break; 183831545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset } 183931545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset emitNEG (0x31, insn->src(0)); 184031545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset emitNEG (0x30, insn->src(2)); 184131545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset emitCC (0x2f); 184231545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset emitIMMD(0x27, 5, insn->src(1)); 184331545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset emitGPR (0x08, insn->src(0)); 184431545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset emitGPR (0x00, insn->def(0)); 184531545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset} 184631545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset 184731545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoisetvoid 1848d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitIMNMX() 1849d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 1850d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->src(1).getFile()) { 1851d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 1852d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x5c200000); 1853d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x14, insn->src(1)); 1854d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1855d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 1856d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x4c200000); 1857d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1)); 1858d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1859d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_IMMEDIATE: 1860d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x38200000); 1861d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD(0x14, 19, insn->src(1)); 1862d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1863d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 1864d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src1 file"); 1865d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1866d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1867d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1868d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x30, 1, isSignedType(insn->dType)); 1869d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCC (0x2f); 1870d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x2a, 1, insn->op == OP_MAX); 1871d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPRED (0x27); 1872d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x08, insn->src(0)); 1873d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->def(0)); 1874d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 1875d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1876d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 1877d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitICMP() 1878d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 1879d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs const CmpInstruction *insn = this->insn->asCmp(); 1880d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs CondCode cc = insn->setCond; 1881d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1882d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->src(2).mod.neg()) 1883d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs cc = reverseCondCode(cc); 1884d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1885d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch(insn->src(2).getFile()) { 1886d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 1887d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->src(1).getFile()) { 1888d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 1889d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x5b400000); 1890d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x14, insn->src(1)); 1891d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1892d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 1893d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x4b400000); 1894d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1)); 1895d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1896d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_IMMEDIATE: 1897d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x36400000); 1898d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD(0x14, 19, insn->src(1)); 1899d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1900d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 1901d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src1 file"); 1902d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1903d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1904d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x27, insn->src(2)); 1905d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1906d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 1907d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x53400000); 1908d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x27, insn->src(1)); 1909d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(2)); 1910d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1911d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 1912d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src2 file"); 1913d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1914d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1915d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1916d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCond3(0x31, cc); 1917d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x30, 1, isSignedType(insn->sType)); 1918d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x08, insn->src(0)); 1919d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->def(0)); 1920d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 1921d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1922d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 1923d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitISET() 1924d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 1925d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs const CmpInstruction *insn = this->insn->asCmp(); 1926d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1927d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->src(1).getFile()) { 1928d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 1929d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x5b500000); 1930d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x14, insn->src(1)); 1931d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1932d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 1933d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x4b500000); 1934d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1)); 1935d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1936d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_IMMEDIATE: 1937d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x36500000); 1938d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD(0x14, 19, insn->src(1)); 1939d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1940d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 1941d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src1 file"); 1942d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1943d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1944d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1945d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->op != OP_SET) { 1946d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->op) { 1947d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_SET_AND: emitField(0x2d, 2, 0); break; 1948d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_SET_OR : emitField(0x2d, 2, 1); break; 1949d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_SET_XOR: emitField(0x2d, 2, 2); break; 1950d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 1951d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"invalid set op"); 1952d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1953d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1954d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPRED(0x27, insn->src(2)); 1955d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } else { 1956d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPRED(0x27); 1957d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1958d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1959d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCond3(0x31, insn->setCond); 1960d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x30, 1, isSignedType(insn->sType)); 1961d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCC (0x2f); 1962e5ad19a46e87ed22943d7f6ad046f974fd5977e1Ilia Mirkin emitField(0x2c, 1, insn->dType == TYPE_F32); 1963d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitX (0x2b); 1964d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x08, insn->src(0)); 1965d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->def(0)); 1966d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 1967d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1968d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 1969d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitISETP() 1970d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 1971d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs const CmpInstruction *insn = this->insn->asCmp(); 1972d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1973d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->src(1).getFile()) { 1974d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 1975d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x5b600000); 1976d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x14, insn->src(1)); 1977d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1978d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 1979d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x4b600000); 1980d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1)); 1981d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1982d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_IMMEDIATE: 1983d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x36600000); 1984d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD(0x14, 19, insn->src(1)); 1985d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1986d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 1987d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src1 file"); 1988d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1989d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 1990d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 1991d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->op != OP_SET) { 1992d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->op) { 1993d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_SET_AND: emitField(0x2d, 2, 0); break; 1994d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_SET_OR : emitField(0x2d, 2, 1); break; 1995d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_SET_XOR: emitField(0x2d, 2, 2); break; 1996d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 1997d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"invalid set op"); 1998d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 1999d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 2000d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPRED(0x27, insn->src(2)); 2001d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } else { 2002d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPRED(0x27); 2003d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 2004d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2005d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCond3(0x31, insn->setCond); 2006d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x30, 1, isSignedType(insn->sType)); 2007d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitX (0x2b); 2008d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x08, insn->src(0)); 2009d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPRED (0x03, insn->def(0)); 2010d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->defExists(1)) 2011d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPRED(0x00, insn->def(1)); 2012d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs else 2013d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPRED(0x00); 2014d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 2015d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2016d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 2017d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitSHL() 2018d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 2019d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->src(1).getFile()) { 2020d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 2021d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x5c480000); 2022d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x14, insn->src(1)); 2023d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 2024d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 2025d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x4c480000); 2026d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1)); 2027d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 2028d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_IMMEDIATE: 2029d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x38480000); 2030d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD(0x14, 19, insn->src(1)); 2031d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 2032d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 2033d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src1 file"); 2034d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 2035d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 2036d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2037d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCC (0x2f); 2038d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitX (0x2b); 2039d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x27, 1, insn->subOp == NV50_IR_SUBOP_SHIFT_WRAP); 2040d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x08, insn->src(0)); 2041d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->def(0)); 2042d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 2043d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2044d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 2045d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitSHR() 2046d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 2047d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->src(1).getFile()) { 2048d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 2049d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x5c280000); 2050d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x14, insn->src(1)); 2051d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 2052d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 2053d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x4c280000); 2054d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1)); 2055d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 2056d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_IMMEDIATE: 2057d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x38280000); 2058d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD(0x14, 19, insn->src(1)); 2059d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 2060d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 2061d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src1 file"); 2062d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 2063d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 2064d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2065d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x30, 1, isSignedType(insn->dType)); 2066d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCC (0x2f); 2067d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitX (0x2c); 2068d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x27, 1, insn->subOp == NV50_IR_SUBOP_SHIFT_WRAP); 2069d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x08, insn->src(0)); 2070d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->def(0)); 2071d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 2072d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2073d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 2074d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitPOPC() 2075d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 2076d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->src(0).getFile()) { 2077d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 2078d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x5c080000); 2079d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x14, insn->src(0)); 2080d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 2081d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 2082d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x4c080000); 2083d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(0)); 2084d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 2085d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_IMMEDIATE: 2086d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x38080000); 2087d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD(0x14, 19, insn->src(0)); 2088d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 2089d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 2090d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src1 file"); 2091d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 2092d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 2093d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2094d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitINV(0x28, insn->src(0)); 2095d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR(0x00, insn->def(0)); 2096d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 2097d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2098d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 2099d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitBFI() 2100d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 2101d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch(insn->src(2).getFile()) { 2102d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 2103d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->src(1).getFile()) { 2104d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 2105d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x5bf00000); 2106d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x14, insn->src(1)); 2107d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 2108d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 2109d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x4bf00000); 2110d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1)); 2111d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 2112d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_IMMEDIATE: 2113d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x36f00000); 2114d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD(0x14, 19, insn->src(1)); 2115d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 2116d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 2117d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src1 file"); 2118d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 2119d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 2120d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x27, insn->src(2)); 2121d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 2122d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 2123d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x53f00000); 2124d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x27, insn->src(1)); 2125d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(2)); 2126d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 2127d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 2128d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src2 file"); 2129d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 2130d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 2131d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2132d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCC (0x2f); 2133d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x08, insn->src(0)); 2134d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->def(0)); 2135d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 2136d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2137d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 2138d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitBFE() 2139d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 2140d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->src(1).getFile()) { 2141d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 2142d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x5c000000); 2143d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x14, insn->src(1)); 2144d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 2145d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 2146d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x4c000000); 2147d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1)); 2148d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 2149d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_IMMEDIATE: 2150d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x38000000); 2151d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD(0x14, 19, insn->src(1)); 2152d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 2153d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 2154d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src1 file"); 2155d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 2156d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 2157d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2158d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x30, 1, isSignedType(insn->dType)); 2159d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCC (0x2f); 2160d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x28, 1, insn->subOp == NV50_IR_SUBOP_EXTBF_REV); 2161d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x08, insn->src(0)); 2162d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->def(0)); 2163d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 2164d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2165d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 2166d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitFLO() 2167d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 2168d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->src(0).getFile()) { 2169d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 2170d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x5c300000); 2171d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x14, insn->src(0)); 2172d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 2173d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 2174d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x4c300000); 2175d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(0)); 2176d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 2177d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_IMMEDIATE: 2178d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x38300000); 2179d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD(0x14, 19, insn->src(0)); 2180d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 2181d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 2182d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src1 file"); 2183d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 2184d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 2185d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2186d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x30, 1, isSignedType(insn->dType)); 2187d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCC (0x2f); 2188d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x29, 1, insn->subOp == NV50_IR_SUBOP_BFIND_SAMT); 2189d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitINV (0x28, insn->src(0)); 2190d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->def(0)); 2191d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 2192d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2193d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs/******************************************************************************* 2194d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * memory 2195d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs ******************************************************************************/ 2196d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2197d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 2198d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitLDSTs(int pos, DataType type) 2199d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 2200d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs int data = 0; 2201d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2202d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (typeSizeof(type)) { 2203d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case 1: data = isSignedType(type) ? 1 : 0; break; 2204d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case 2: data = isSignedType(type) ? 3 : 2; break; 2205d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case 4: data = 4; break; 2206d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case 8: data = 5; break; 2207d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case 16: data = 6; break; 2208d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 2209d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad type"); 2210d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 2211d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 2212d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2213d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(pos, 3, data); 2214d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 2215d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2216d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 2217d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitLDSTc(int pos) 2218d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 2219d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs int mode = 0; 2220d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2221d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->cache) { 2222d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case CACHE_CA: mode = 0; break; 2223d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case CACHE_CG: mode = 1; break; 2224d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case CACHE_CS: mode = 2; break; 2225d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case CACHE_CV: mode = 3; break; 2226d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 2227d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"invalid caching mode"); 2228d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 2229d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 2230d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2231d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(pos, 2, mode); 2232d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 2233d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2234d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 2235d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitLDC() 2236d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 2237d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn (0xef900000); 2238d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitLDSTs(0x30, insn->dType); 22394eef537960dff2fbdafe7946143c1a99d7ba7036Ilia Mirkin emitField(0x2c, 2, insn->subOp); 2240d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF (0x24, 0x08, 0x14, 16, 0, insn->src(0)); 2241d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->def(0)); 2242d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 2243d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2244d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 2245d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitLDL() 2246d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 2247d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn (0xef400000); 2248d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitLDSTs(0x30, insn->dType); 2249d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitLDSTc(0x2c); 2250d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitADDR (0x08, 0x14, 24, 0, insn->src(0)); 2251d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->def(0)); 2252d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 2253d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2254d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 2255d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitLDS() 2256d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 2257d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn (0xef480000); 2258d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitLDSTs(0x30, insn->dType); 2259d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitADDR (0x08, 0x14, 24, 0, insn->src(0)); 2260d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->def(0)); 2261d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 2262d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2263d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 2264d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitLD() 2265d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 2266d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn (0x80000000); 2267d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPRED (0x3a); 2268d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitLDSTc(0x38); 2269d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitLDSTs(0x35, insn->dType); 227057b00258146632ba5ef4b84513ec4faa8a5907c1Ilia Mirkin emitField(0x34, 1, insn->src(0).getIndirect(0)->getSize() == 8); 2271d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitADDR (0x08, 0x14, 32, 0, insn->src(0)); 2272d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->def(0)); 2273d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 2274d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2275d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 2276d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitSTL() 2277d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 2278d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn (0xef500000); 2279d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitLDSTs(0x30, insn->dType); 2280d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitLDSTc(0x2c); 2281d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitADDR (0x08, 0x14, 24, 0, insn->src(0)); 2282d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->src(1)); 2283d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 2284d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2285d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 2286d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitSTS() 2287d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 2288d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn (0xef580000); 2289d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitLDSTs(0x30, insn->dType); 2290d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitADDR (0x08, 0x14, 24, 0, insn->src(0)); 2291d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->src(1)); 2292d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 2293d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2294d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 2295d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitST() 2296d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 2297d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn (0xa0000000); 2298d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPRED (0x3a); 2299d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitLDSTc(0x38); 2300d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitLDSTs(0x35, insn->dType); 230157b00258146632ba5ef4b84513ec4faa8a5907c1Ilia Mirkin emitField(0x34, 1, insn->src(0).getIndirect(0)->getSize() == 8); 2302d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitADDR (0x08, 0x14, 32, 0, insn->src(0)); 2303d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->src(1)); 2304d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 2305d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2306d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 2307d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitALD() 2308d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 2309d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn (0xefd80000); 2310d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x2f, 2, (insn->getDef(0)->reg.size / 4) - 1); 2311d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x27, insn->src(0).getIndirect(1)); 2312d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitO (0x20); 2313d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitP (0x1f); 2314d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitADDR (0x08, 20, 10, 0, insn->src(0)); 2315d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->def(0)); 2316d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 2317d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2318d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 2319d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitAST() 2320d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 2321d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn (0xeff00000); 2322d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x2f, 2, (typeSizeof(insn->dType) / 4) - 1); 2323d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x27, insn->src(0).getIndirect(1)); 2324d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitP (0x1f); 2325d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitADDR (0x08, 20, 10, 0, insn->src(0)); 2326d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->src(1)); 2327d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 2328d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2329d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 2330d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitISBERD() 2331d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 2332d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0xefd00000); 2333d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x08, insn->src(0)); 2334d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->def(0)); 2335d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 2336d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2337d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 23389d60793a03e40e1d139b78fce0144cad57438741Ilia MirkinCodeEmitterGM107::emitAL2P() 23399d60793a03e40e1d139b78fce0144cad57438741Ilia Mirkin{ 23409d60793a03e40e1d139b78fce0144cad57438741Ilia Mirkin emitInsn (0xefa00000); 23419d60793a03e40e1d139b78fce0144cad57438741Ilia Mirkin emitField(0x2f, 2, (insn->getDef(0)->reg.size / 4) - 1); 2342a22aee5ad1154918aff77af5102fecd2aa39a631Ilia Mirkin emitPRED (0x2c); 23439d60793a03e40e1d139b78fce0144cad57438741Ilia Mirkin emitO (0x20); 23449d60793a03e40e1d139b78fce0144cad57438741Ilia Mirkin emitField(0x14, 11, insn->src(0).get()->reg.data.offset); 23459d60793a03e40e1d139b78fce0144cad57438741Ilia Mirkin emitGPR (0x08, insn->src(0).getIndirect(0)); 23469d60793a03e40e1d139b78fce0144cad57438741Ilia Mirkin emitGPR (0x00, insn->def(0)); 23479d60793a03e40e1d139b78fce0144cad57438741Ilia Mirkin} 23489d60793a03e40e1d139b78fce0144cad57438741Ilia Mirkin 2349b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkinstatic void 2350f5fe9030021af830e6c4453f4ad1521cbb697c81Ilia MirkininterpApply(const FixupEntry *entry, uint32_t *code, const FixupData& data) 2351b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin{ 2352b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin int ipa = entry->ipa; 2353b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin int reg = entry->reg; 2354b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin int loc = entry->loc; 2355b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin 2356f5fe9030021af830e6c4453f4ad1521cbb697c81Ilia Mirkin if (data.flatshade && 2357b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin (ipa & NV50_IR_INTERP_MODE_MASK) == NV50_IR_INTERP_SC) { 2358b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin ipa = NV50_IR_INTERP_FLAT; 2359b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin reg = 0xff; 2360f5fe9030021af830e6c4453f4ad1521cbb697c81Ilia Mirkin } else if (data.force_persample_interp && 2361b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin (ipa & NV50_IR_INTERP_SAMPLE_MASK) == NV50_IR_INTERP_DEFAULT && 2362b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin (ipa & NV50_IR_INTERP_MODE_MASK) != NV50_IR_INTERP_FLAT) { 2363b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin ipa |= NV50_IR_INTERP_CENTROID; 2364b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin } 2365b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin code[loc + 1] &= ~(0xf << 0x14); 2366b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin code[loc + 1] |= (ipa & 0x3) << 0x16; 2367b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin code[loc + 1] |= (ipa & 0xc) << (0x14 - 2); 2368b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin code[loc + 0] &= ~(0xff << 0x14); 2369b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin code[loc + 0] |= reg << 0x14; 2370b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin} 2371b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin 23729d60793a03e40e1d139b78fce0144cad57438741Ilia Mirkinvoid 2373d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitIPA() 2374d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 2375d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs int ipam = 0, ipas = 0; 2376d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2377d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->getInterpMode()) { 2378d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case NV50_IR_INTERP_LINEAR : ipam = 0; break; 2379d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case NV50_IR_INTERP_PERSPECTIVE: ipam = 1; break; 2380d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case NV50_IR_INTERP_FLAT : ipam = 2; break; 2381d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case NV50_IR_INTERP_SC : ipam = 3; break; 2382d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 2383d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"invalid ipa mode"); 2384d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 2385d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 2386d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2387d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->getSampleMode()) { 2388d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case NV50_IR_INTERP_DEFAULT : ipas = 0; break; 2389d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case NV50_IR_INTERP_CENTROID: ipas = 1; break; 2390d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case NV50_IR_INTERP_OFFSET : ipas = 2; break; 2391d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 2392d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"invalid ipa sample mode"); 2393d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 2394d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 2395d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2396d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn (0xe0000000); 2397d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x36, 2, ipam); 2398d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x34, 2, ipas); 2399d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitSAT (0x33); 2400d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x2f, 3, 7); 2401d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitADDR (0x08, 0x1c, 10, 0, insn->src(0)); 2402d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if ((code[0] & 0x0000ff00) != 0x0000ff00) 2403d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs code[1] |= 0x00000040; /* .idx */ 2404d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR(0x00, insn->def(0)); 2405d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2406d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->op == OP_PINTERP) { 2407d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR(0x14, insn->src(1)); 2408d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->getSampleMode() == NV50_IR_INTERP_OFFSET) 2409d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR(0x27, insn->src(2)); 2410b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin addInterp(insn->ipa, insn->getSrc(1)->reg.data.id, interpApply); 2411d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } else { 2412d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->getSampleMode() == NV50_IR_INTERP_OFFSET) 2413d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR(0x27, insn->src(1)); 2414d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR(0x14); 2415b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin addInterp(insn->ipa, 0xff, interpApply); 2416d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 2417d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2418d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->getSampleMode() != NV50_IR_INTERP_OFFSET) 2419d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR(0x27); 2420d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 2421d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 242271a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkinvoid 242371a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia MirkinCodeEmitterGM107::emitATOM() 242471a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin{ 242571a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin unsigned dType, subOp; 242671a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin 2427f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset if (insn->subOp == NV50_IR_SUBOP_ATOM_CAS) { 2428f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset switch (insn->dType) { 2429f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset case TYPE_U32: dType = 0; break; 2430f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset case TYPE_U64: dType = 1; break; 2431f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset default: assert(!"unexpected dType"); dType = 0; break; 2432f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset } 2433f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset subOp = 15; 2434f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset 2435f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset emitInsn (0xee000000); 2436f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset } else { 2437f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset switch (insn->dType) { 2438f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset case TYPE_U32: dType = 0; break; 2439f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset case TYPE_S32: dType = 1; break; 2440f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset case TYPE_U64: dType = 2; break; 2441f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset case TYPE_F32: dType = 3; break; 2442f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset case TYPE_B128: dType = 4; break; 2443f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset case TYPE_S64: dType = 5; break; 2444f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset default: assert(!"unexpected dType"); dType = 0; break; 2445f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset } 2446f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset if (insn->subOp == NV50_IR_SUBOP_ATOM_EXCH) 2447f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset subOp = 8; 2448f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset else 2449f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset subOp = insn->subOp; 2450f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset 2451f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset emitInsn (0xed000000); 2452f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset } 2453f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset 245471a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin emitField(0x34, 4, subOp); 245571a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin emitField(0x31, 3, dType); 245671a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin emitField(0x30, 1, insn->src(0).getIndirect(0)->getSize() == 8); 245771a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin emitGPR (0x14, insn->src(1)); 245871a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin emitADDR (0x08, 0x1c, 20, 0, insn->src(0)); 245971a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin emitGPR (0x00, insn->def(0)); 246071a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin} 246171a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin 246271a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkinvoid 24638f99c1bbce629b9d3db0321e2d74414772615637Samuel PitoisetCodeEmitterGM107::emitATOMS() 24648f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset{ 24658f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset unsigned dType, subOp; 24668f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset 24678f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset if (insn->subOp == NV50_IR_SUBOP_ATOM_CAS) { 24688f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset switch (insn->dType) { 24698f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset case TYPE_U32: dType = 0; break; 24708f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset case TYPE_U64: dType = 1; break; 24718f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset default: assert(!"unexpected dType"); dType = 0; break; 24728f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset } 24738f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset subOp = 4; 24748f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset 24758f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset emitInsn (0xee000000); 24768f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset emitField(0x34, 1, dType); 24778f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset } else { 24788f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset switch (insn->dType) { 24798f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset case TYPE_U32: dType = 0; break; 24808f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset case TYPE_S32: dType = 1; break; 24818f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset case TYPE_U64: dType = 2; break; 24828f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset case TYPE_S64: dType = 3; break; 24838f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset default: assert(!"unexpected dType"); dType = 0; break; 24848f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset } 24858f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset 24868f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset if (insn->subOp == NV50_IR_SUBOP_ATOM_EXCH) 24878f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset subOp = 8; 24888f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset else 24898f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset subOp = insn->subOp; 24908f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset 24918f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset emitInsn (0xec000000); 24928f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset emitField(0x1c, 3, dType); 24938f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset } 24948f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset 24958f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset emitField(0x34, 4, subOp); 24968f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset emitGPR (0x14, insn->src(1)); 2497138be7ed9f3293189d4ff868a80be052b389908cIlia Mirkin emitADDR (0x08, 0x1e, 22, 2, insn->src(0)); 24988f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset emitGPR (0x00, insn->def(0)); 24998f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset} 25008f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset 25018f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoisetvoid 2502a29536459694017bf4e7424764574808553a6d7fSamuel PitoisetCodeEmitterGM107::emitRED() 2503a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset{ 2504a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset unsigned dType; 2505a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset 2506a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset switch (insn->dType) { 2507a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset case TYPE_U32: dType = 0; break; 2508a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset case TYPE_S32: dType = 1; break; 2509a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset case TYPE_U64: dType = 2; break; 2510a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset case TYPE_F32: dType = 3; break; 2511a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset case TYPE_B128: dType = 4; break; 2512a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset case TYPE_S64: dType = 5; break; 2513a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset default: assert(!"unexpected dType"); dType = 0; break; 2514a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset } 2515a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset 2516a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset emitInsn (0xebf80000); 2517a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset emitField(0x30, 1, insn->src(0).getIndirect(0)->getSize() == 8); 2518a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset emitField(0x17, 3, insn->subOp); 2519a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset emitField(0x14, 3, dType); 2520a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset emitADDR (0x08, 0x1c, 20, 0, insn->src(0)); 2521a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset emitGPR (0x00, insn->src(1)); 2522a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset} 2523a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset 2524a29536459694017bf4e7424764574808553a6d7fSamuel Pitoisetvoid 252571a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia MirkinCodeEmitterGM107::emitCCTL() 252671a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin{ 252771a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin unsigned width; 252871a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin if (insn->src(0).getFile() == FILE_MEMORY_GLOBAL) { 252971a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin emitInsn(0xef600000); 253071a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin width = 30; 253171a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin } else { 253271a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin emitInsn(0xef800000); 253371a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin width = 22; 253471a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin } 253571a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin emitField(0x34, 1, insn->src(0).getIndirect(0)->getSize() == 8); 253671a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin emitADDR (0x08, 0x16, width, 2, insn->src(0)); 253771a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin emitField(0x00, 4, insn->subOp); 253871a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin} 253971a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin 2540d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs/******************************************************************************* 2541d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * surface 2542d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs ******************************************************************************/ 2543d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2544d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 2545d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitPIXLD() 2546d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 2547d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn (0xefe80000); 2548d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPRED (0x2d); 2549d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x1f, 3, insn->subOp); 2550d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x08, insn->src(0)); 2551d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->def(0)); 2552d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 2553d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2554d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs/******************************************************************************* 2555d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * texture 2556d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs ******************************************************************************/ 2557d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2558d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 2559d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitTEXs(int pos) 2560d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 2561d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs int src1 = insn->predSrc == 1 ? 2 : 1; 2562d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->srcExists(src1)) 2563d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR(pos, insn->src(src1)); 2564d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs else 2565d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR(pos); 2566d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 2567d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2568d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 2569d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitTEX() 2570d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 2571d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs const TexInstruction *insn = this->insn->asTex(); 2572d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs int lodm = 0; 2573d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2574d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (!insn->tex.levelZero) { 2575d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->op) { 2576d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_TEX: lodm = 0; break; 2577d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_TXB: lodm = 2; break; 2578d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_TXL: lodm = 3; break; 2579d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 2580d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"invalid tex op"); 2581d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 2582d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 2583d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } else { 2584d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs lodm = 1; 2585d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 2586d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2587d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->tex.rIndirectSrc >= 0) { 2588d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn (0xdeb80000); 25898c78fdb328c8a8ea7c7c3cdd0e745f06938cd0ffIlia Mirkin emitField(0x25, 2, lodm); 2590d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x24, 1, insn->tex.useOffsets == 1); 2591d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } else { 2592d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn (0xc0380000); 2593d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x37, 2, lodm); 2594d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x36, 1, insn->tex.useOffsets == 1); 2595d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x24, 13, insn->tex.r); 2596d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 2597d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2598d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x32, 1, insn->tex.target.isShadow()); 2599d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x31, 1, insn->tex.liveOnly); 2600d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x23, 1, insn->tex.derivAll); 2601d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x1f, 4, insn->tex.mask); 2602d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x1d, 2, insn->tex.target.isCube() ? 3 : 2603d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs insn->tex.target.getDim() - 1); 2604d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x1c, 1, insn->tex.target.isArray()); 2605d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitTEXs (0x14); 2606d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x08, insn->src(0)); 2607d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->def(0)); 2608d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 2609d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2610d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 2611d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitTLD() 2612d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 2613d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs const TexInstruction *insn = this->insn->asTex(); 2614d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2615d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->tex.rIndirectSrc >= 0) { 2616d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn (0xdd380000); 2617d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } else { 2618d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn (0xdc380000); 2619d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x24, 13, insn->tex.r); 2620d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 2621d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2622d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x37, 1, insn->tex.levelZero == 0); 2623d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x32, 1, insn->tex.target.isMS()); 2624d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x31, 1, insn->tex.liveOnly); 2625d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x23, 1, insn->tex.useOffsets == 1); 2626d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x1f, 4, insn->tex.mask); 2627d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x1d, 2, insn->tex.target.isCube() ? 3 : 2628d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs insn->tex.target.getDim() - 1); 2629d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x1c, 1, insn->tex.target.isArray()); 2630d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitTEXs (0x14); 2631d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x08, insn->src(0)); 2632d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->def(0)); 2633d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 2634d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2635d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 2636d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitTLD4() 2637d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 2638d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs const TexInstruction *insn = this->insn->asTex(); 2639d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2640d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->tex.rIndirectSrc >= 0) { 2641d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn (0xdef80000); 2642d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x26, 2, insn->tex.gatherComp); 2643d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x25, 2, insn->tex.useOffsets == 4); 2644d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x24, 2, insn->tex.useOffsets == 1); 2645d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } else { 2646d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn (0xc8380000); 2647d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x38, 2, insn->tex.gatherComp); 2648d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x37, 2, insn->tex.useOffsets == 4); 2649d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x36, 2, insn->tex.useOffsets == 1); 2650d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x24, 13, insn->tex.r); 2651d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 2652d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2653d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x32, 1, insn->tex.target.isShadow()); 2654d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x31, 1, insn->tex.liveOnly); 2655d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x23, 1, insn->tex.derivAll); 2656d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x1f, 4, insn->tex.mask); 2657d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x1d, 2, insn->tex.target.isCube() ? 3 : 2658d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs insn->tex.target.getDim() - 1); 2659d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x1c, 1, insn->tex.target.isArray()); 2660d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitTEXs (0x14); 2661d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x08, insn->src(0)); 2662d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->def(0)); 2663d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 2664d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2665d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 2666d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitTXD() 2667d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 2668d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs const TexInstruction *insn = this->insn->asTex(); 2669d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2670d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->tex.rIndirectSrc >= 0) { 2671d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn (0xde780000); 2672d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } else { 2673d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn (0xde380000); 2674d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x24, 13, insn->tex.r); 2675d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 2676d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2677d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x31, 1, insn->tex.liveOnly); 2678d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x23, 1, insn->tex.useOffsets == 1); 2679d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x1f, 4, insn->tex.mask); 2680d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x1d, 2, insn->tex.target.isCube() ? 3 : 2681d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs insn->tex.target.getDim() - 1); 2682d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x1c, 1, insn->tex.target.isArray()); 2683d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitTEXs (0x14); 2684d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x08, insn->src(0)); 2685d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->def(0)); 2686d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 2687d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2688d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 2689d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitTMML() 2690d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 2691d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs const TexInstruction *insn = this->insn->asTex(); 2692d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2693d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->tex.rIndirectSrc >= 0) { 2694d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn (0xdf600000); 2695d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } else { 2696d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn (0xdf580000); 2697d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x24, 13, insn->tex.r); 2698d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 2699d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2700d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x31, 1, insn->tex.liveOnly); 2701d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x23, 1, insn->tex.derivAll); 2702d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x1f, 4, insn->tex.mask); 2703d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x1d, 2, insn->tex.target.isCube() ? 3 : 2704d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs insn->tex.target.getDim() - 1); 2705d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x1c, 1, insn->tex.target.isArray()); 2706d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitTEXs (0x14); 2707d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x08, insn->src(0)); 2708d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->def(0)); 2709d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 2710d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2711d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 2712d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitTXQ() 2713d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 2714d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs const TexInstruction *insn = this->insn->asTex(); 2715d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs int type = 0; 2716d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2717d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->tex.query) { 2718d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case TXQ_DIMS : type = 0x01; break; 2719d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case TXQ_TYPE : type = 0x02; break; 2720d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case TXQ_SAMPLE_POSITION: type = 0x05; break; 2721d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case TXQ_FILTER : type = 0x10; break; 2722d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case TXQ_LOD : type = 0x12; break; 2723d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case TXQ_WRAP : type = 0x14; break; 2724d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case TXQ_BORDER_COLOUR : type = 0x16; break; 2725d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 2726d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"invalid txq query"); 2727d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 2728d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 2729d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 27308c8a71f0d125bb655b17a32914ffecf8d159593bIlia Mirkin if (insn->tex.rIndirectSrc >= 0) { 27318c8a71f0d125bb655b17a32914ffecf8d159593bIlia Mirkin emitInsn (0xdf500000); 27328c8a71f0d125bb655b17a32914ffecf8d159593bIlia Mirkin } else { 27338c8a71f0d125bb655b17a32914ffecf8d159593bIlia Mirkin emitInsn (0xdf480000); 27348c8a71f0d125bb655b17a32914ffecf8d159593bIlia Mirkin emitField(0x24, 13, insn->tex.r); 27358c8a71f0d125bb655b17a32914ffecf8d159593bIlia Mirkin } 27368c8a71f0d125bb655b17a32914ffecf8d159593bIlia Mirkin 27378c8a71f0d125bb655b17a32914ffecf8d159593bIlia Mirkin emitField(0x31, 1, insn->tex.liveOnly); 2738d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x1f, 4, insn->tex.mask); 2739d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x16, 6, type); 2740d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x08, insn->src(0)); 2741d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->def(0)); 2742d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 2743d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2744d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 2745d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitDEPBAR() 2746d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 2747d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn (0xf0f00000); 2748d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x1d, 1, 1); /* le */ 2749d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x1a, 3, 5); 2750d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x14, 6, insn->subOp); 2751d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x00, 6, insn->subOp); 2752d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 2753d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2754d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs/******************************************************************************* 2755d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * misc 2756d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs ******************************************************************************/ 2757d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2758d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 2759d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitNOP() 2760d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 2761d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0x50b00000); 2762d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 2763d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2764d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 2765d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitKIL() 2766d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 2767d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn (0xe3300000); 2768d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCond5(0x00, CC_TR); 2769d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 2770d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2771d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 2772d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitOUT() 2773d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 2774d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs const int cut = insn->op == OP_RESTART || insn->subOp; 2775d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs const int emit = insn->op == OP_EMIT; 2776d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2777d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->src(1).getFile()) { 2778d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_GPR: 2779d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0xfbe00000); 2780d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x14, insn->src(1)); 2781d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 2782d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_IMMEDIATE: 2783d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0xf6e00000); 2784d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMMD(0x14, 19, insn->src(1)); 2785d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 2786d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST: 2787d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitInsn(0xebe00000); 2788d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1)); 2789d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 2790d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 2791d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"bad src1 file"); 2792d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 2793d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 2794d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2795d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(0x27, 2, (cut << 1) | emit); 2796d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x08, insn->src(0)); 2797d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitGPR (0x00, insn->def(0)); 2798d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 2799d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 2800d11266aa06a507d8895bdc1f454a5837131cc1afSamuel Pitoisetvoid 2801c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel PitoisetCodeEmitterGM107::emitBAR() 2802c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset{ 2803c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset uint8_t subop; 2804c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset 2805c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset emitInsn (0xf0a80000); 2806c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset 2807c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset switch (insn->subOp) { 2808c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset case NV50_IR_SUBOP_BAR_RED_POPC: subop = 0x02; break; 2809c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset case NV50_IR_SUBOP_BAR_RED_AND: subop = 0x0a; break; 2810c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset case NV50_IR_SUBOP_BAR_RED_OR: subop = 0x12; break; 2811c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset case NV50_IR_SUBOP_BAR_ARRIVE: subop = 0x81; break; 2812c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset default: 2813c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset subop = 0x80; 2814c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset assert(insn->subOp == NV50_IR_SUBOP_BAR_SYNC); 2815c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset break; 2816c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset } 2817c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset 2818c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset emitField(0x20, 8, subop); 2819c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset 2820c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset // barrier id 2821c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset if (insn->src(0).getFile() == FILE_GPR) { 2822c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset emitGPR(0x08, insn->src(0)); 2823c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset } else { 2824c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset ImmediateValue *imm = insn->getSrc(0)->asImm(); 2825c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset assert(imm); 2826c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset emitField(0x08, 8, imm->reg.data.u32); 2827c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset emitField(0x2b, 1, 1); 2828c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset } 2829c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset 2830c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset // thread count 2831c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset if (insn->src(1).getFile() == FILE_GPR) { 2832c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset emitGPR(0x14, insn->src(1)); 2833c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset } else { 2834c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset ImmediateValue *imm = insn->getSrc(0)->asImm(); 2835c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset assert(imm); 2836c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset emitField(0x14, 12, imm->reg.data.u32); 2837c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset emitField(0x2c, 1, 1); 2838c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset } 2839c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset 2840c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset if (insn->srcExists(2) && (insn->predSrc != 2)) { 2841c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset emitPRED (0x27, insn->src(2)); 2842c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset emitField(0x2a, 1, insn->src(2).mod == Modifier(NV50_IR_MOD_NOT)); 2843c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset } else { 2844c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset emitField(0x27, 3, 7); 2845c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset } 2846c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset} 2847c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset 2848c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoisetvoid 2849d11266aa06a507d8895bdc1f454a5837131cc1afSamuel PitoisetCodeEmitterGM107::emitMEMBAR() 2850d11266aa06a507d8895bdc1f454a5837131cc1afSamuel Pitoiset{ 2851d11266aa06a507d8895bdc1f454a5837131cc1afSamuel Pitoiset emitInsn (0xef980000); 2852d11266aa06a507d8895bdc1f454a5837131cc1afSamuel Pitoiset emitField(0x08, 2, insn->subOp >> 2); 2853d11266aa06a507d8895bdc1f454a5837131cc1afSamuel Pitoiset} 2854d11266aa06a507d8895bdc1f454a5837131cc1afSamuel Pitoiset 285507ed003faf3199a3e95852e7a34763aeaf76503dSamuel Pitoisetvoid 285607ed003faf3199a3e95852e7a34763aeaf76503dSamuel PitoisetCodeEmitterGM107::emitVOTE() 285707ed003faf3199a3e95852e7a34763aeaf76503dSamuel Pitoiset{ 2858704bc0f0e98f3bbdef33cad12646d4e1bf01e8aaIlia Mirkin assert(insn->src(0).getFile() == FILE_PREDICATE); 285907ed003faf3199a3e95852e7a34763aeaf76503dSamuel Pitoiset 2860704bc0f0e98f3bbdef33cad12646d4e1bf01e8aaIlia Mirkin int r = -1, p = -1; 2861704bc0f0e98f3bbdef33cad12646d4e1bf01e8aaIlia Mirkin for (int i = 0; insn->defExists(i); i++) { 2862704bc0f0e98f3bbdef33cad12646d4e1bf01e8aaIlia Mirkin if (insn->def(i).getFile() == FILE_GPR) 2863704bc0f0e98f3bbdef33cad12646d4e1bf01e8aaIlia Mirkin r = i; 2864704bc0f0e98f3bbdef33cad12646d4e1bf01e8aaIlia Mirkin else if (insn->def(i).getFile() == FILE_PREDICATE) 2865704bc0f0e98f3bbdef33cad12646d4e1bf01e8aaIlia Mirkin p = i; 286607ed003faf3199a3e95852e7a34763aeaf76503dSamuel Pitoiset } 286707ed003faf3199a3e95852e7a34763aeaf76503dSamuel Pitoiset 286807ed003faf3199a3e95852e7a34763aeaf76503dSamuel Pitoiset emitInsn (0x50d80000); 2869704bc0f0e98f3bbdef33cad12646d4e1bf01e8aaIlia Mirkin emitField(0x30, 2, insn->subOp); 2870704bc0f0e98f3bbdef33cad12646d4e1bf01e8aaIlia Mirkin if (r >= 0) 2871704bc0f0e98f3bbdef33cad12646d4e1bf01e8aaIlia Mirkin emitGPR (0x00, insn->def(r)); 2872704bc0f0e98f3bbdef33cad12646d4e1bf01e8aaIlia Mirkin else 2873704bc0f0e98f3bbdef33cad12646d4e1bf01e8aaIlia Mirkin emitGPR (0x00); 2874704bc0f0e98f3bbdef33cad12646d4e1bf01e8aaIlia Mirkin if (p >= 0) 2875704bc0f0e98f3bbdef33cad12646d4e1bf01e8aaIlia Mirkin emitPRED (0x2d, insn->def(p)); 2876704bc0f0e98f3bbdef33cad12646d4e1bf01e8aaIlia Mirkin else 2877704bc0f0e98f3bbdef33cad12646d4e1bf01e8aaIlia Mirkin emitPRED (0x2d); 287807ed003faf3199a3e95852e7a34763aeaf76503dSamuel Pitoiset emitField(0x2a, 1, insn->src(0).mod == Modifier(NV50_IR_MOD_NOT)); 287907ed003faf3199a3e95852e7a34763aeaf76503dSamuel Pitoiset emitPRED (0x27, insn->src(0)); 288007ed003faf3199a3e95852e7a34763aeaf76503dSamuel Pitoiset} 288107ed003faf3199a3e95852e7a34763aeaf76503dSamuel Pitoiset 28824aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoisetvoid 28834aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel PitoisetCodeEmitterGM107::emitSUTarget() 28844aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset{ 28854aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset const TexInstruction *insn = this->insn->asTex(); 28864aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset int target = 0; 28874aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset 28884aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset assert(insn->op >= OP_SULDB && insn->op <= OP_SUREDP); 28894aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset 28904aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset if (insn->tex.target == TEX_TARGET_BUFFER) { 28914aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset target = 2; 28924aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset } else if (insn->tex.target == TEX_TARGET_1D_ARRAY) { 28934aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset target = 4; 28944aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset } else if (insn->tex.target == TEX_TARGET_2D || 28954aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset insn->tex.target == TEX_TARGET_RECT) { 28964aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset target = 6; 28974aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset } else if (insn->tex.target == TEX_TARGET_2D_ARRAY || 28984aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset insn->tex.target == TEX_TARGET_CUBE || 28994aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset insn->tex.target == TEX_TARGET_CUBE_ARRAY) { 29004aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset target = 8; 29014aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset } else if (insn->tex.target == TEX_TARGET_3D) { 29024aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset target = 10; 29034aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset } else { 29044aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset assert(insn->tex.target == TEX_TARGET_1D); 29054aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset } 29064aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset emitField(0x20, 4, target); 29074aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset} 29084aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset 29094aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoisetvoid 29104aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel PitoisetCodeEmitterGM107::emitSUHandle(const int s) 29114aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset{ 29124aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset const TexInstruction *insn = this->insn->asTex(); 29134aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset 29144aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset assert(insn->op >= OP_SULDB && insn->op <= OP_SUREDP); 29154aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset 29164aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset if (insn->src(s).getFile() == FILE_GPR) { 29174aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset emitGPR(0x27, insn->src(s)); 29184aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset } else { 29194aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset ImmediateValue *imm = insn->getSrc(s)->asImm(); 29204aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset assert(imm); 29214aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset emitField(0x33, 1, 1); 29224aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset emitField(0x24, 13, imm->reg.data.u32); 29234aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset } 29244aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset} 29254aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset 29264aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoisetvoid 29274aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel PitoisetCodeEmitterGM107::emitSUSTx() 29284aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset{ 29294aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset const TexInstruction *insn = this->insn->asTex(); 29304aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset 29314aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset emitInsn(0xeb200000); 29324aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset if (insn->op == OP_SUSTB) 29334aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset emitField(0x34, 1, 1); 29344aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset emitSUTarget(); 29354aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset 29364aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset emitLDSTc(0x18); 29374aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset emitField(0x14, 4, 0xf); // rgba 29384aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset emitGPR (0x08, insn->src(0)); 29394aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset emitGPR (0x00, insn->src(1)); 29404aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset 29414aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset emitSUHandle(2); 29424aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset} 29434aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset 29444aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoisetvoid 29454aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel PitoisetCodeEmitterGM107::emitSULDx() 29464aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset{ 29474aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset const TexInstruction *insn = this->insn->asTex(); 29484aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset int type = 0; 29494aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset 29504aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset emitInsn(0xeb000000); 29514aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset if (insn->op == OP_SULDB) 29524aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset emitField(0x34, 1, 1); 29534aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset emitSUTarget(); 29544aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset 29554aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset switch (insn->dType) { 29564aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset case TYPE_S8: type = 1; break; 29574aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset case TYPE_U16: type = 2; break; 29584aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset case TYPE_S16: type = 3; break; 29594aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset case TYPE_U32: type = 4; break; 29604aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset case TYPE_U64: type = 5; break; 29614aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset case TYPE_B128: type = 6; break; 29624aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset default: 29634aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset assert(insn->dType == TYPE_U8); 29644aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset break; 29654aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset } 29664aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset emitLDSTc(0x18); 29674aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset emitField(0x14, 3, type); 29684aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset emitGPR (0x00, insn->def(0)); 29694aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset emitGPR (0x08, insn->src(0)); 29704aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset 29714aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset emitSUHandle(1); 29724aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset} 29731edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset 29741edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoisetvoid 29751edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel PitoisetCodeEmitterGM107::emitSUREDx() 29761edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset{ 29771edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset const TexInstruction *insn = this->insn->asTex(); 29781edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset uint8_t type = 0, subOp; 29791edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset 29801edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset if (insn->subOp == NV50_IR_SUBOP_ATOM_CAS) 29811edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset emitInsn(0xeac00000); 29821edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset else 29831edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset emitInsn(0xea600000); 29841edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset 29851edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset if (insn->op == OP_SUREDB) 29861edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset emitField(0x34, 1, 1); 29871edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset emitSUTarget(); 29881edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset 29891edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset // destination type 29901edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset switch (insn->dType) { 29911edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset case TYPE_S32: type = 1; break; 29921edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset case TYPE_U64: type = 2; break; 29931edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset case TYPE_F32: type = 3; break; 29941edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset case TYPE_S64: type = 5; break; 29951edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset default: 29961edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset assert(insn->dType == TYPE_U32); 29971edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset break; 29981edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset } 29991edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset 30001edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset // atomic operation 30011edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset if (insn->subOp == NV50_IR_SUBOP_ATOM_CAS) { 30021edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset subOp = 0; 30031edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset } else if (insn->subOp == NV50_IR_SUBOP_ATOM_EXCH) { 30041edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset subOp = 8; 30051edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset } else { 30061edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset subOp = insn->subOp; 30071edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset } 30081edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset 30091edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset emitField(0x24, 3, type); 30101edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset emitField(0x1d, 4, subOp); 30111edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset emitGPR (0x14, insn->src(1)); 30121edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset emitGPR (0x08, insn->src(0)); 30131edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset emitGPR (0x00, insn->def(0)); 30141edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset 30151edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset emitSUHandle(2); 30161edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset} 30171edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset 3018d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs/******************************************************************************* 3019d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * assembler front-end 3020d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs ******************************************************************************/ 3021d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 3022d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsbool 3023d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitInstruction(Instruction *i) 3024d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 3025d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs const unsigned int size = (writeIssueDelays && !(codeSize & 0x1f)) ? 16 : 8; 3026d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs bool ret = true; 3027d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 3028d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs insn = i; 3029d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 3030d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->encSize != 8) { 3031d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs ERROR("skipping undecodable instruction: "); insn->print(); 3032d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs return false; 3033d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } else 3034d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (codeSize + size > codeSizeLimit) { 3035d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs ERROR("code emitter output buffer too small\n"); 3036d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs return false; 3037d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 3038d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 3039d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (writeIssueDelays) { 3040d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs int n = ((codeSize & 0x1f) / 8) - 1; 3041d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (n < 0) { 3042d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs data = code; 3043d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs data[0] = 0x00000000; 3044d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs data[1] = 0x00000000; 3045d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs code += 2; 3046d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs codeSize += 8; 3047d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs n++; 3048d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 3049d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 3050d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitField(data, n * 21, 21, insn->sched); 3051d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 3052d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 3053d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->op) { 3054d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_EXIT: 3055d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitEXIT(); 3056d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3057d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_BRA: 3058d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitBRA(); 3059d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3060d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_CALL: 3061d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCAL(); 3062d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3063d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_PRECONT: 3064d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPCNT(); 3065d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3066d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_CONT: 3067d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitCONT(); 3068d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3069d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_PREBREAK: 3070d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPBK(); 3071d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3072d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_BREAK: 3073d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitBRK(); 3074d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3075d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_PRERET: 3076d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPRET(); 3077d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3078d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_RET: 3079d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitRET(); 3080d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3081d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_JOINAT: 3082d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitSSY(); 3083d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3084d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_JOIN: 3085d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitSYNC(); 3086d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3087d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_QUADON: 3088d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitSAM(); 3089d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3090d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_QUADPOP: 3091d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitRAM(); 3092d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3093d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_MOV: 30941a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin emitMOV(); 3095d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3096d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_RDSV: 3097d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitS2R(); 3098d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3099d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_ABS: 3100d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_NEG: 3101d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_SAT: 3102d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_FLOOR: 3103d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_CEIL: 3104d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_TRUNC: 3105d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_CVT: 31061a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin if (insn->op == OP_CVT && (insn->def(0).getFile() == FILE_PREDICATE || 31071a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin insn->src(0).getFile() == FILE_PREDICATE)) { 31081a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin emitMOV(); 31091a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin } else if (isFloatType(insn->dType)) { 3110d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (isFloatType(insn->sType)) 3111d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitF2F(); 3112d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs else 3113d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitI2F(); 3114d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } else { 3115d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (isFloatType(insn->sType)) 3116d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitF2I(); 3117d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs else 3118d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitI2I(); 3119d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 3120d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3121d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_SHFL: 3122d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitSHFL(); 3123d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3124d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_ADD: 3125d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_SUB: 3126d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (isFloatType(insn->dType)) { 3127d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->dType == TYPE_F64) 3128d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitDADD(); 3129d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs else 3130d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitFADD(); 3131d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } else { 3132d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIADD(); 3133d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 3134d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3135d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_MUL: 3136d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (isFloatType(insn->dType)) { 3137d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->dType == TYPE_F64) 3138d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitDMUL(); 3139d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs else 3140d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitFMUL(); 3141d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } else { 3142d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMUL(); 3143d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 3144d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3145d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_MAD: 3146d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_FMA: 3147d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (isFloatType(insn->dType)) { 3148d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->dType == TYPE_F64) 3149d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitDFMA(); 3150d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs else 3151d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitFFMA(); 3152d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } else { 3153d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMAD(); 3154d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 3155d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 315631545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset case OP_SHLADD: 315731545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset emitISCADD(); 315831545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset break; 3159d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_MIN: 3160d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_MAX: 3161d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (isFloatType(insn->dType)) { 3162d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->dType == TYPE_F64) 3163d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitDMNMX(); 3164d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs else 3165d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitFMNMX(); 3166d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } else { 3167d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIMNMX(); 3168d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 3169d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3170d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_SHL: 3171d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitSHL(); 3172d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3173d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_SHR: 3174d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitSHR(); 3175d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3176d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_POPCNT: 3177d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPOPC(); 3178d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3179d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_INSBF: 3180d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitBFI(); 3181d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3182d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_EXTBF: 3183d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitBFE(); 3184d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3185d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_BFIND: 3186d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitFLO(); 3187d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3188d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_SLCT: 3189d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (isFloatType(insn->dType)) 3190d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitFCMP(); 3191d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs else 3192d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitICMP(); 3193d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3194d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_SET: 3195d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_SET_AND: 3196d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_SET_OR: 3197d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_SET_XOR: 3198d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->def(0).getFile() != FILE_PREDICATE) { 3199d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (isFloatType(insn->sType)) 3200d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->sType == TYPE_F64) 3201d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitDSET(); 3202d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs else 3203d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitFSET(); 3204d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs else 3205d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitISET(); 3206d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } else { 3207d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (isFloatType(insn->sType)) 3208d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->sType == TYPE_F64) 3209d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitDSETP(); 3210d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs else 3211d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitFSETP(); 3212d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs else 3213d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitISETP(); 3214d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 3215d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3216d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin case OP_SELP: 3217d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin emitSEL(); 3218d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin break; 3219d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_PRESIN: 3220d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_PREEX2: 3221d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitRRO(); 3222d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3223d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_COS: 3224d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_SIN: 3225d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_EX2: 3226d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_LG2: 3227d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_RCP: 3228d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_RSQ: 3229d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitMUFU(); 3230d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3231d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_AND: 3232d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_OR: 3233d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_XOR: 3234d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitLOP(); 3235d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3236d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_NOT: 3237d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitNOT(); 3238d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3239d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_LOAD: 3240d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->src(0).getFile()) { 3241d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_CONST : emitLDC(); break; 3242d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_LOCAL : emitLDL(); break; 3243d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_SHARED: emitLDS(); break; 3244d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_GLOBAL: emitLD(); break; 3245d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 3246d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"invalid load"); 3247d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitNOP(); 3248d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3249d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 3250d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3251d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_STORE: 3252d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs switch (insn->src(0).getFile()) { 3253d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_LOCAL : emitSTL(); break; 3254d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_SHARED: emitSTS(); break; 3255d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case FILE_MEMORY_GLOBAL: emitST(); break; 3256d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 3257725431a5dbce37f011f27521053707dce63731ffSamuel Pitoiset assert(!"invalid store"); 3258d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitNOP(); 3259d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3260d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 3261d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 326271a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin case OP_ATOM: 32638f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset if (insn->src(0).getFile() == FILE_MEMORY_SHARED) 32648f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset emitATOMS(); 32658f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset else 3266a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset if (!insn->defExists(0) && insn->subOp < NV50_IR_SUBOP_ATOM_CAS) 3267a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset emitRED(); 3268a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset else 3269a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset emitATOM(); 327071a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin break; 327171a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin case OP_CCTL: 327271a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin emitCCTL(); 327371a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin break; 3274d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_VFETCH: 3275d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitALD(); 3276d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3277d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_EXPORT: 3278d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitAST(); 3279d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3280d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_PFETCH: 3281d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitISBERD(); 3282d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 32839d60793a03e40e1d139b78fce0144cad57438741Ilia Mirkin case OP_AFETCH: 32849d60793a03e40e1d139b78fce0144cad57438741Ilia Mirkin emitAL2P(); 32859d60793a03e40e1d139b78fce0144cad57438741Ilia Mirkin break; 3286d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_LINTERP: 3287d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_PINTERP: 3288d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitIPA(); 3289d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3290d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_PIXLD: 3291d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitPIXLD(); 3292d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3293d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_TEX: 3294d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_TXB: 3295d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_TXL: 3296d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitTEX(); 3297d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3298d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_TXF: 3299d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitTLD(); 3300d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3301d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_TXG: 3302d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitTLD4(); 3303d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3304d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_TXD: 3305d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitTXD(); 3306d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3307d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_TXQ: 3308d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitTXQ(); 3309d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3310d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_TXLQ: 3311d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitTMML(); 3312d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3313d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_TEXBAR: 3314d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitDEPBAR(); 3315d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3316d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_QUADOP: 3317d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitFSWZADD(); 3318d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3319d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_NOP: 3320d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitNOP(); 3321d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3322d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_DISCARD: 3323d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitKIL(); 3324d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3325d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_EMIT: 3326d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs case OP_RESTART: 3327d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitOUT(); 3328d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3329c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset case OP_BAR: 3330c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset emitBAR(); 3331c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset break; 3332d11266aa06a507d8895bdc1f454a5837131cc1afSamuel Pitoiset case OP_MEMBAR: 3333d11266aa06a507d8895bdc1f454a5837131cc1afSamuel Pitoiset emitMEMBAR(); 3334d11266aa06a507d8895bdc1f454a5837131cc1afSamuel Pitoiset break; 333507ed003faf3199a3e95852e7a34763aeaf76503dSamuel Pitoiset case OP_VOTE: 333607ed003faf3199a3e95852e7a34763aeaf76503dSamuel Pitoiset emitVOTE(); 333707ed003faf3199a3e95852e7a34763aeaf76503dSamuel Pitoiset break; 33384aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset case OP_SUSTB: 33394aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset case OP_SUSTP: 33404aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset emitSUSTx(); 33414aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset break; 33424aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset case OP_SULDB: 33434aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset case OP_SULDP: 33444aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset emitSULDx(); 33454aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset break; 33461edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset case OP_SUREDB: 33471edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset case OP_SUREDP: 33481edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset emitSUREDx(); 33491edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset break; 3350d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs default: 3351d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs assert(!"invalid opcode"); 3352d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emitNOP(); 3353d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs ret = false; 3354d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs break; 3355d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 3356d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 3357d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (insn->join) { 3358d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs /*XXX*/ 3359d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 3360d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 3361d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs code += 2; 3362d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs codeSize += 8; 3363d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs return ret; 3364d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 3365d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 3366d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsuint32_t 3367d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::getMinEncodingSize(const Instruction *i) const 3368d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 3369d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs return 8; 3370d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 3371d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 3372d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs/******************************************************************************* 3373d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * sched data calculator 3374d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs ******************************************************************************/ 3375d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 3376d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsclass SchedDataCalculatorGM107 : public Pass 3377d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 3378d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggspublic: 3379f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset SchedDataCalculatorGM107(const TargetGM107 *targ) : targ(targ) {} 3380f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3381d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsprivate: 3382f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset struct RegScores 3383f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset { 3384f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset struct ScoreData { 3385f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset int r[256]; 3386f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset int p[8]; 3387f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset int c; 3388f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } rd, wr; 3389f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset int base; 3390f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3391f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset void rebase(const int base) 3392f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset { 3393f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset const int delta = this->base - base; 3394f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (!delta) 3395f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset return; 3396f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset this->base = 0; 3397f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3398f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset for (int i = 0; i < 256; ++i) { 3399f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset rd.r[i] += delta; 3400f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset wr.r[i] += delta; 3401f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 3402f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset for (int i = 0; i < 8; ++i) { 3403f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset rd.p[i] += delta; 3404f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset wr.p[i] += delta; 3405f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 3406f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset rd.c += delta; 3407f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset wr.c += delta; 3408f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 3409f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset void wipe() 3410f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset { 3411f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset memset(&rd, 0, sizeof(rd)); 3412f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset memset(&wr, 0, sizeof(wr)); 3413f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 3414f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset int getLatest(const ScoreData& d) const 3415f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset { 3416f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset int max = 0; 3417f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset for (int i = 0; i < 256; ++i) 3418f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (d.r[i] > max) 3419f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset max = d.r[i]; 3420f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset for (int i = 0; i < 8; ++i) 3421f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (d.p[i] > max) 3422f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset max = d.p[i]; 3423f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (d.c > max) 3424f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset max = d.c; 3425f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset return max; 3426f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 3427f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset inline int getLatestRd() const 3428f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset { 3429f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset return getLatest(rd); 3430f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 3431f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset inline int getLatestWr() const 3432f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset { 3433f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset return getLatest(wr); 3434f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 3435f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset inline int getLatest() const 3436f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset { 3437f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset return MAX2(getLatestRd(), getLatestWr()); 3438f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 3439f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset void setMax(const RegScores *that) 3440f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset { 3441f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset for (int i = 0; i < 256; ++i) { 3442f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset rd.r[i] = MAX2(rd.r[i], that->rd.r[i]); 3443f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset wr.r[i] = MAX2(wr.r[i], that->wr.r[i]); 3444f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 3445f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset for (int i = 0; i < 8; ++i) { 3446f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset rd.p[i] = MAX2(rd.p[i], that->rd.p[i]); 3447f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset wr.p[i] = MAX2(wr.p[i], that->wr.p[i]); 3448f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 3449f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset rd.c = MAX2(rd.c, that->rd.c); 3450f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset wr.c = MAX2(wr.c, that->wr.c); 3451f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 3452f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset void print(int cycle) 3453f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset { 3454f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset for (int i = 0; i < 256; ++i) { 3455f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (rd.r[i] > cycle) 3456f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset INFO("rd $r%i @ %i\n", i, rd.r[i]); 3457f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (wr.r[i] > cycle) 3458f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset INFO("wr $r%i @ %i\n", i, wr.r[i]); 3459f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 3460f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset for (int i = 0; i < 8; ++i) { 3461f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (rd.p[i] > cycle) 3462f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset INFO("rd $p%i @ %i\n", i, rd.p[i]); 3463f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (wr.p[i] > cycle) 3464f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset INFO("wr $p%i @ %i\n", i, wr.p[i]); 3465f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 3466f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (rd.c > cycle) 3467f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset INFO("rd $c @ %i\n", rd.c); 3468f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (wr.c > cycle) 3469f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset INFO("wr $c @ %i\n", wr.c); 3470f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 3471f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset }; 3472f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3473f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset RegScores *score; // for current BB 3474f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset std::vector<RegScores> scoreBoards; 3475f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3476f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset const TargetGM107 *targ; 3477f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset bool visit(Function *); 3478f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset bool visit(BasicBlock *); 3479f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3480f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset void commitInsn(const Instruction *, int); 3481f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset int calcDelay(const Instruction *, int) const; 3482f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset void setDelay(Instruction *, int, const Instruction *); 3483f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset void recordWr(const Value *, int, int); 3484f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset void checkRd(const Value *, int, int&) const; 3485f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3486f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset inline void emitYield(Instruction *); 3487f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset inline void emitStall(Instruction *, uint8_t); 3488f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset inline void emitReuse(Instruction *, uint8_t); 3489f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset inline void emitWrDepBar(Instruction *, uint8_t); 3490f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset inline void emitRdDepBar(Instruction *, uint8_t); 3491f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset inline void emitWtDepBar(Instruction *, uint8_t); 3492f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3493f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset inline int getStall(const Instruction *) const; 3494f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset inline int getWrDepBar(const Instruction *) const; 3495f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset inline int getRdDepBar(const Instruction *) const; 3496f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset inline int getWtDepBar(const Instruction *) const; 3497f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3498f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset void setReuseFlag(Instruction *); 3499f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3500f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset inline void printSchedInfo(int, const Instruction *) const; 3501f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3502f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset struct LiveBarUse { 3503f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset LiveBarUse(Instruction *insn, Instruction *usei) 3504f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset : insn(insn), usei(usei) { } 3505f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset Instruction *insn; 3506f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset Instruction *usei; 3507f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset }; 3508f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3509f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset struct LiveBarDef { 3510f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset LiveBarDef(Instruction *insn, Instruction *defi) 3511f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset : insn(insn), defi(defi) { } 3512f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset Instruction *insn; 3513f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset Instruction *defi; 3514f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset }; 3515f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3516f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset bool insertBarriers(BasicBlock *); 3517f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3518f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset Instruction *findFirstUse(const Instruction *) const; 3519f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset Instruction *findFirstDef(const Instruction *) const; 3520f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3521f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset bool needRdDepBar(const Instruction *) const; 3522f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset bool needWrDepBar(const Instruction *) const; 3523d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}; 3524d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 3525f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetinline void 3526f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::emitStall(Instruction *insn, uint8_t cnt) 3527f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{ 3528f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset assert(cnt < 16); 3529f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset insn->sched |= cnt; 3530f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset} 3531f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3532f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetinline void 3533f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::emitYield(Instruction *insn) 3534f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{ 3535f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset insn->sched |= 1 << 4; 3536f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset} 3537f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3538f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetinline void 3539f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::emitWrDepBar(Instruction *insn, uint8_t id) 3540f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{ 3541f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset assert(id < 6); 3542f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if ((insn->sched & 0xe0) == 0xe0) 3543f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset insn->sched ^= 0xe0; 3544f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset insn->sched |= id << 5; 3545f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset} 3546f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3547f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetinline void 3548f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::emitRdDepBar(Instruction *insn, uint8_t id) 3549f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{ 3550f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset assert(id < 6); 3551f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if ((insn->sched & 0x700) == 0x700) 3552f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset insn->sched ^= 0x700; 3553f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset insn->sched |= id << 8; 3554f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset} 3555f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3556f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetinline void 3557f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::emitWtDepBar(Instruction *insn, uint8_t id) 3558f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{ 3559f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset assert(id < 6); 3560f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset insn->sched |= 1 << (11 + id); 3561f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset} 3562f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3563f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetinline void 3564f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::emitReuse(Instruction *insn, uint8_t id) 3565f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{ 3566f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset assert(id < 4); 3567f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset insn->sched |= 1 << (17 + id); 3568f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset} 3569f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3570f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetinline void 3571f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::printSchedInfo(int cycle, 3572f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset const Instruction *insn) const 3573f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{ 3574f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset uint8_t st, yl, wr, rd, wt, ru; 3575f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3576f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset st = (insn->sched & 0x00000f) >> 0; 3577f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset yl = (insn->sched & 0x000010) >> 4; 3578f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset wr = (insn->sched & 0x0000e0) >> 5; 3579f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset rd = (insn->sched & 0x000700) >> 8; 3580f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset wt = (insn->sched & 0x01f800) >> 11; 3581f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset ru = (insn->sched & 0x1e0000) >> 17; 3582f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3583f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset INFO("cycle %i, (st 0x%x, yl 0x%x, wr 0x%x, rd 0x%x, wt 0x%x, ru 0x%x)\n", 3584f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset cycle, st, yl, wr, rd, wt, ru); 3585f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset} 3586f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3587f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetinline int 3588f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::getStall(const Instruction *insn) const 3589f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{ 3590f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset return insn->sched & 0xf; 3591f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset} 3592f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3593f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetinline int 3594f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::getWrDepBar(const Instruction *insn) const 3595f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{ 3596f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset return (insn->sched & 0x0000e0) >> 5; 3597f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset} 3598f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3599f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetinline int 3600f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::getRdDepBar(const Instruction *insn) const 3601f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{ 3602f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset return (insn->sched & 0x000700) >> 8; 3603f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset} 3604f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3605f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetinline int 3606f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::getWtDepBar(const Instruction *insn) const 3607f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{ 3608f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset return (insn->sched & 0x01f800) >> 11; 3609f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset} 3610f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3611f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// Emit the reuse flag which allows to make use of the new memory hierarchy 3612f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// introduced since Maxwell, the operand reuse cache. 3613f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// 3614f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// It allows to reduce bank conflicts by caching operands. Each time you issue 3615f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// an instruction, that flag can tell the hw which operands are going to be 3616f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// re-used by the next instruction. Note that the next instruction has to use 3617f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// the same GPR id in the same operand slot. 3618f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetvoid 3619f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::setReuseFlag(Instruction *insn) 3620f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{ 3621f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset Instruction *next = insn->next; 3622f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset BitSet defs(255, 1); 3623f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3624f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (!targ->isReuseSupported(insn)) 3625f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset return; 3626f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3627f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset for (int d = 0; insn->defExists(d); ++d) { 3628f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset const Value *def = insn->def(d).rep(); 3629f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (insn->def(d).getFile() != FILE_GPR) 3630f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset continue; 3631f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (typeSizeof(insn->dType) != 4 || def->reg.data.id == 255) 3632f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset continue; 3633f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset defs.set(def->reg.data.id); 3634f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 3635f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3636f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset for (int s = 0; insn->srcExists(s); s++) { 3637f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset const Value *src = insn->src(s).rep(); 3638f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (insn->src(s).getFile() != FILE_GPR) 3639f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset continue; 3640f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (typeSizeof(insn->sType) != 4 || src->reg.data.id == 255) 3641f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset continue; 3642f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (defs.test(src->reg.data.id)) 3643f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset continue; 3644f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (!next->srcExists(s) || next->src(s).getFile() != FILE_GPR) 3645f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset continue; 3646f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (src->reg.data.id != next->getSrc(s)->reg.data.id) 3647f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset continue; 3648f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset assert(s < 4); 3649f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset emitReuse(insn, s); 3650f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 3651f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset} 3652f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3653f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetvoid 3654f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::recordWr(const Value *v, int cycle, int ready) 3655f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{ 3656f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset int a = v->reg.data.id, b; 3657f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3658f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset switch (v->reg.file) { 3659f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset case FILE_GPR: 3660f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset b = a + v->reg.size / 4; 3661f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset for (int r = a; r < b; ++r) 3662f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset score->rd.r[r] = ready; 3663f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset break; 3664f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset case FILE_PREDICATE: 3665f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset // To immediately use a predicate set by any instructions, the minimum 3666f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset // number of stall counts is 13. 3667f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset score->rd.p[a] = cycle + 13; 3668f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset break; 3669f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset case FILE_FLAGS: 3670f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset score->rd.c = ready; 3671f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset break; 3672f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset default: 3673f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset break; 3674f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 3675f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset} 3676f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3677f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetvoid 3678f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::checkRd(const Value *v, int cycle, int &delay) const 3679f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{ 3680f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset int a = v->reg.data.id, b; 3681f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset int ready = cycle; 3682f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3683f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset switch (v->reg.file) { 3684f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset case FILE_GPR: 3685f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset b = a + v->reg.size / 4; 3686f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset for (int r = a; r < b; ++r) 3687f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset ready = MAX2(ready, score->rd.r[r]); 3688f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset break; 3689f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset case FILE_PREDICATE: 3690f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset ready = MAX2(ready, score->rd.p[a]); 3691f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset break; 3692f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset case FILE_FLAGS: 3693f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset ready = MAX2(ready, score->rd.c); 3694f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset break; 3695f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset default: 3696f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset break; 3697f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 3698f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (cycle < ready) 3699f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset delay = MAX2(delay, ready - cycle); 3700f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset} 3701f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3702f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetvoid 3703f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::commitInsn(const Instruction *insn, int cycle) 3704f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{ 3705f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset const int ready = cycle + targ->getLatency(insn); 3706f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3707f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset for (int d = 0; insn->defExists(d); ++d) 3708f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset recordWr(insn->getDef(d), cycle, ready); 3709f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3710f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset#ifdef GM107_DEBUG_SCHED_DATA 3711f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset score->print(cycle); 3712f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset#endif 3713f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset} 3714f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3715f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset#define GM107_MIN_ISSUE_DELAY 0x1 3716f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset#define GM107_MAX_ISSUE_DELAY 0xf 3717f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3718f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetint 3719f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::calcDelay(const Instruction *insn, int cycle) const 3720f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{ 3721f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset int delay = 0, ready = cycle; 3722f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3723f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset for (int s = 0; insn->srcExists(s); ++s) 3724f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset checkRd(insn->getSrc(s), cycle, delay); 3725f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3726f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset // TODO: make use of getReadLatency()! 3727f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3728f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset return MAX2(delay, ready - cycle); 3729f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset} 3730f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3731f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetvoid 3732f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::setDelay(Instruction *insn, int delay, 3733f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset const Instruction *next) 3734f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{ 3735f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset const OpClass cl = targ->getOpClass(insn->op); 3736f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset int wr, rd; 3737f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3738f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (insn->op == OP_EXIT || 3739f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset insn->op == OP_BAR || 3740f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset insn->op == OP_MEMBAR) { 3741f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset delay = GM107_MAX_ISSUE_DELAY; 3742f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } else 3743f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (insn->op == OP_QUADON || 3744f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset insn->op == OP_QUADPOP) { 3745f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset delay = 0xd; 3746f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } else 3747f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (cl == OPCLASS_FLOW || insn->join) { 3748f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset delay = 0xd; 3749f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 3750f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3751f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (!next || !targ->canDualIssue(insn, next)) { 3752f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset delay = CLAMP(delay, GM107_MIN_ISSUE_DELAY, GM107_MAX_ISSUE_DELAY); 3753f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } else { 3754f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset delay = 0x0; // dual-issue 3755f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 3756f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3757f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset wr = getWrDepBar(insn); 3758f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset rd = getRdDepBar(insn); 3759f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3760f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (delay == GM107_MIN_ISSUE_DELAY && (wr & rd) != 7) { 3761f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset // Barriers take one additional clock cycle to become active on top of 3762f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset // the clock consumed by the instruction producing it. 3763f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (!next || insn->bb != next->bb) { 3764f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset delay = 0x2; 3765f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } else { 3766f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset int wt = getWtDepBar(next); 3767f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if ((wt & (1 << wr)) | (wt & (1 << rd))) 3768f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset delay = 0x2; 3769f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 3770f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 3771f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3772f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset emitStall(insn, delay); 3773f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset} 3774f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3775f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3776f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// Return true when the given instruction needs to emit a read dependency 3777f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// barrier (for WaR hazards) because it doesn't operate at a fixed latency, and 3778f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// setting the maximum number of stall counts is not enough. 3779f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetbool 3780f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::needRdDepBar(const Instruction *insn) const 3781f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{ 3782f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset BitSet srcs(255, 1), defs(255, 1); 3783f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset int a, b; 3784f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3785f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (!targ->isBarrierRequired(insn)) 3786f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset return false; 3787f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3788f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset // Do not emit a read dependency barrier when the instruction doesn't use 3789f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset // any GPR (like st s[0x4] 0x0) as input because it's unnecessary. 3790f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset for (int s = 0; insn->srcExists(s); ++s) { 3791f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset const Value *src = insn->src(s).rep(); 3792f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (insn->src(s).getFile() != FILE_GPR) 3793f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset continue; 3794f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (src->reg.data.id == 255) 3795f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset continue; 3796f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3797f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset a = src->reg.data.id; 3798f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset b = a + src->reg.size / 4; 3799f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset for (int r = a; r < b; ++r) 3800f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset srcs.set(r); 3801f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 3802f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3803f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (!srcs.popCount()) 3804f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset return false; 3805f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3806f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset // Do not emit a read dependency barrier when the output GPRs are equal to 3807f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset // the input GPRs (like rcp $r0 $r0) because a write dependency barrier will 3808f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset // be produced and WaR hazards are prevented. 3809f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset for (int d = 0; insn->defExists(d); ++d) { 3810f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset const Value *def = insn->def(d).rep(); 3811f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (insn->def(d).getFile() != FILE_GPR) 3812f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset continue; 3813f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (def->reg.data.id == 255) 3814f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset continue; 3815f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3816f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset a = def->reg.data.id; 3817f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset b = a + def->reg.size / 4; 3818f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset for (int r = a; r < b; ++r) 3819f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset defs.set(r); 3820f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 3821f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3822f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset srcs.andNot(defs); 3823f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (!srcs.popCount()) 3824f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset return false; 3825f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3826f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset return true; 3827f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset} 3828f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3829f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// Return true when the given instruction needs to emit a write dependency 3830f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// barrier (for RaW hazards) because it doesn't operate at a fixed latency, and 3831f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// setting the maximum number of stall counts is not enough. This is only legal 3832f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// if the instruction output something. 3833f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetbool 3834f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::needWrDepBar(const Instruction *insn) const 3835f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{ 3836f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (!targ->isBarrierRequired(insn)) 3837f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset return false; 3838f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3839f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset for (int d = 0; insn->defExists(d); ++d) { 3840f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (insn->def(d).getFile() == FILE_GPR || 3841f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset insn->def(d).getFile() == FILE_PREDICATE) 3842f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset return true; 3843f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 3844f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset return false; 3845f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset} 3846f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3847f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// Find the next instruction inside the same basic block which uses the output 3848f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// of the given instruction in order to avoid RaW hazards. 3849f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetInstruction * 3850f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::findFirstUse(const Instruction *bari) const 3851f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{ 3852f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset Instruction *insn, *next; 3853f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset int minGPR, maxGPR; 3854f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3855f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (!bari->defExists(0)) 3856f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset return NULL; 3857f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3858f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset minGPR = bari->def(0).rep()->reg.data.id; 3859f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset maxGPR = minGPR + bari->def(0).rep()->reg.size / 4 - 1; 3860f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3861f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset for (insn = bari->next; insn != NULL; insn = next) { 3862f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset next = insn->next; 3863f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3864f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset for (int s = 0; insn->srcExists(s); ++s) { 3865f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset const Value *src = insn->src(s).rep(); 3866f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (bari->def(0).getFile() == FILE_GPR) { 3867f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (insn->src(s).getFile() != FILE_GPR || 3868f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset src->reg.data.id + src->reg.size / 4 - 1 < minGPR || 3869f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset src->reg.data.id > maxGPR) 3870f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset continue; 3871f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset return insn; 3872f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } else 3873f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (bari->def(0).getFile() == FILE_PREDICATE) { 3874f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (insn->src(s).getFile() != FILE_PREDICATE || 3875f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset src->reg.data.id != minGPR) 3876f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset continue; 3877f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset return insn; 3878f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 3879f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 3880f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 3881f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset return NULL; 3882f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset} 3883f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3884f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// Find the next instruction inside the same basic block which overwrites, at 3885f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// least, one source of the given instruction in order to avoid WaR hazards. 3886f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetInstruction * 3887f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::findFirstDef(const Instruction *bari) const 3888f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{ 3889f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset Instruction *insn, *next; 3890f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset int minGPR, maxGPR; 3891f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3892f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset for (insn = bari->next; insn != NULL; insn = next) { 3893f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset next = insn->next; 3894f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3895f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset for (int d = 0; insn->defExists(d); ++d) { 3896f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset const Value *def = insn->def(d).rep(); 3897f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (insn->def(d).getFile() != FILE_GPR) 3898f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset continue; 3899f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3900f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset minGPR = def->reg.data.id; 3901f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset maxGPR = minGPR + def->reg.size / 4 - 1; 3902f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3903f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset for (int s = 0; bari->srcExists(s); ++s) { 3904f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset const Value *src = bari->src(s).rep(); 3905f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (bari->src(s).getFile() != FILE_GPR || 3906f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset src->reg.data.id + src->reg.size / 4 - 1 < minGPR || 3907f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset src->reg.data.id > maxGPR) 3908f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset continue; 3909f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset return insn; 3910f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 3911f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 3912f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 3913f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset return NULL; 3914f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset} 3915f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3916f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// Dependency barriers: 3917f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// This pass is a bit ugly and could probably be improved by performing a 3918f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// better allocation. 3919f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// 3920f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// The main idea is to avoid WaR and RaW hazards by emitting read/write 3921f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// dependency barriers using the control codes. 3922f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetbool 3923f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::insertBarriers(BasicBlock *bb) 3924f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{ 3925f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset std::list<LiveBarUse> live_uses; 3926f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset std::list<LiveBarDef> live_defs; 3927f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset Instruction *insn, *next; 3928f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset BitSet bars(6, 1); 3929f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset int bar_id; 3930f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3931f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset for (insn = bb->getEntry(); insn != NULL; insn = next) { 3932f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset Instruction *usei = NULL, *defi = NULL; 3933f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset bool need_wr_bar, need_rd_bar; 3934f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3935f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset next = insn->next; 3936f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3937f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset // Expire old barrier uses. 3938f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset for (std::list<LiveBarUse>::iterator it = live_uses.begin(); 3939f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset it != live_uses.end();) { 3940f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (insn->serial >= it->usei->serial) { 3941f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset int wr = getWrDepBar(it->insn); 3942f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset emitWtDepBar(insn, wr); 3943f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset bars.clr(wr); // free barrier 3944f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset it = live_uses.erase(it); 3945f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset continue; 3946f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 3947f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset ++it; 3948f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 3949f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3950f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset // Expire old barrier defs. 3951f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset for (std::list<LiveBarDef>::iterator it = live_defs.begin(); 3952f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset it != live_defs.end();) { 3953f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (insn->serial >= it->defi->serial) { 3954f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset int rd = getRdDepBar(it->insn); 3955f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset emitWtDepBar(insn, rd); 3956f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset bars.clr(rd); // free barrier 3957f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset it = live_defs.erase(it); 3958f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset continue; 3959f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 3960f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset ++it; 3961f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 3962f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3963f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset need_wr_bar = needWrDepBar(insn); 3964f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset need_rd_bar = needRdDepBar(insn); 3965f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3966f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (need_wr_bar) { 3967f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset // When the instruction requires to emit a write dependency barrier 3968f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset // (all which write something at a variable latency), find the next 3969f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset // instruction which reads the outputs. 3970f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset usei = findFirstUse(insn); 3971f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3972f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset // Allocate and emit a new barrier. 3973f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset bar_id = bars.findFreeRange(1); 3974f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (bar_id == -1) 3975f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset bar_id = 5; 3976f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset bars.set(bar_id); 3977f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset emitWrDepBar(insn, bar_id); 3978f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (usei) 3979f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset live_uses.push_back(LiveBarUse(insn, usei)); 3980f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 3981f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3982f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (need_rd_bar) { 3983f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset // When the instruction requires to emit a read dependency barrier 3984f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset // (all which read something at a variable latency), find the next 3985f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset // instruction which will write the inputs. 3986f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset defi = findFirstDef(insn); 3987f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3988f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (usei && defi && usei->serial <= defi->serial) 3989f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset continue; 3990f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 3991f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset // Allocate and emit a new barrier. 3992f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset bar_id = bars.findFreeRange(1); 3993f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (bar_id == -1) 3994f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset bar_id = 5; 3995f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset bars.set(bar_id); 3996f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset emitRdDepBar(insn, bar_id); 3997f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (defi) 3998f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset live_defs.push_back(LiveBarDef(insn, defi)); 3999f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 4000f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 4001f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 4002f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset // Remove unnecessary barrier waits. 4003f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset BitSet alive_bars(6, 1); 4004f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset for (insn = bb->getEntry(); insn != NULL; insn = next) { 4005f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset int wr, rd, wt; 4006f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 4007f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset next = insn->next; 4008f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 4009f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset wr = getWrDepBar(insn); 4010f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset rd = getRdDepBar(insn); 4011f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset wt = getWtDepBar(insn); 4012f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 4013f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset for (int idx = 0; idx < 6; ++idx) { 4014f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (!(wt & (1 << idx))) 4015f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset continue; 4016f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (!alive_bars.test(idx)) { 4017f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset insn->sched &= ~(1 << (11 + idx)); 4018f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } else { 4019f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset alive_bars.clr(idx); 4020f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 4021f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 4022f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 4023f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (wr < 6) 4024f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset alive_bars.set(wr); 4025f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (rd < 6) 4026f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset alive_bars.set(rd); 4027f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 4028f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 4029f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset return true; 4030f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset} 4031f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 4032f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetbool 4033f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::visit(Function *func) 4034f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{ 4035f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset ArrayList insns; 4036f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 4037f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset func->orderInstructions(insns); 4038f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 4039f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset scoreBoards.resize(func->cfg.getSize()); 4040f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset for (size_t i = 0; i < scoreBoards.size(); ++i) 4041f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset scoreBoards[i].wipe(); 4042f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset return true; 4043f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset} 4044f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 4045d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsbool 4046d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsSchedDataCalculatorGM107::visit(BasicBlock *bb) 4047d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 4048f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset Instruction *insn, *next = NULL; 4049f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset int cycle = 0; 4050f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 4051d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs for (Instruction *insn = bb->getEntry(); insn; insn = insn->next) { 4052d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs /*XXX*/ 4053d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs insn->sched = 0x7e0; 4054d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 4055d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 4056f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (!debug_get_bool_option("NV50_PROG_SCHED", true)) 4057f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset return true; 4058f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 4059f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset // Insert read/write dependency barriers for instructions which don't 4060f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset // operate at a fixed latency. 4061f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset insertBarriers(bb); 4062f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 4063f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset score = &scoreBoards.at(bb->getId()); 4064f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 4065f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset for (Graph::EdgeIterator ei = bb->cfg.incident(); !ei.end(); ei.next()) { 4066f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset // back branches will wait until all target dependencies are satisfied 4067f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (ei.getType() == Graph::Edge::BACK) // sched would be uninitialized 4068f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset continue; 4069f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset BasicBlock *in = BasicBlock::get(ei.getNode()); 4070f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset score->setMax(&scoreBoards.at(in->getId())); 4071f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 4072f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 4073f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset#ifdef GM107_DEBUG_SCHED_DATA 4074f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset INFO("=== BB:%i initial scores\n", bb->getId()); 4075f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset score->print(cycle); 4076f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset#endif 4077f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 4078f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset // Because barriers are allocated locally (intra-BB), we have to make sure 4079f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset // that all produced barriers have been consumed before entering inside a 4080f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset // new basic block. The best way is to do a global allocation pre RA but 4081f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset // it's really more difficult, especially because of the phi nodes. Anyways, 4082f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset // it seems like that waiting on a barrier which has already been consumed 4083f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset // doesn't add any additional cost, it's just not elegant! 4084f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset Instruction *start = bb->getEntry(); 4085f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (start && bb->cfg.incidentCount() > 0) { 4086f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset for (int b = 0; b < 6; b++) 4087f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset emitWtDepBar(start, b); 4088f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 4089f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 4090f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset for (insn = bb->getEntry(); insn && insn->next; insn = insn->next) { 4091f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset next = insn->next; 4092f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 4093f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset commitInsn(insn, cycle); 4094f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset int delay = calcDelay(next, cycle); 4095f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset setDelay(insn, delay, next); 4096f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset cycle += getStall(insn); 4097f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 4098f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset setReuseFlag(insn); 4099f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 4100f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset // XXX: The yield flag seems to destroy a bunch of things when it is 4101f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset // set on every instruction, need investigation. 4102f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset //emitYield(insn); 4103f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 4104f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset#ifdef GM107_DEBUG_SCHED_DATA 4105f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset printSchedInfo(cycle, insn); 4106f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset insn->print(); 4107f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset next->print(); 4108f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset#endif 4109f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 4110f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 4111f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (!insn) 4112f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset return true; 4113f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset commitInsn(insn, cycle); 4114f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 4115f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset int bbDelay = -1; 4116f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 4117f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset#ifdef GM107_DEBUG_SCHED_DATA 4118f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset fprintf(stderr, "last instruction is : "); 4119f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset insn->print(); 4120f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset fprintf(stderr, "cycle=%d\n", cycle); 4121f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset#endif 4122f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 4123f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset for (Graph::EdgeIterator ei = bb->cfg.outgoing(); !ei.end(); ei.next()) { 4124f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset BasicBlock *out = BasicBlock::get(ei.getNode()); 4125f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 4126f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (ei.getType() != Graph::Edge::BACK) { 4127f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset // Only test the first instruction of the outgoing block. 4128f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset next = out->getEntry(); 4129f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (next) { 4130f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset bbDelay = MAX2(bbDelay, calcDelay(next, cycle)); 4131f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } else { 4132f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset // When the outgoing BB is empty, make sure to set the number of 4133f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset // stall counts needed by the instruction because we don't know the 4134f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset // next instruction. 4135f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset bbDelay = MAX2(bbDelay, targ->getLatency(insn)); 4136f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 4137f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } else { 4138f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset // Wait until all dependencies are satisfied. 4139f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset const int regsFree = score->getLatest(); 4140f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset next = out->getFirst(); 4141f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset for (int c = cycle; next && c < regsFree; next = next->next) { 4142f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset bbDelay = MAX2(bbDelay, calcDelay(next, c)); 4143f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset c += getStall(next); 4144f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 4145f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset next = NULL; 4146f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 4147f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset } 4148f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset if (bb->cfg.outgoingCount() != 1) 4149f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset next = NULL; 4150f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset setDelay(insn, bbDelay, next); 4151f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset cycle += getStall(insn); 4152f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset 4153f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset score->rebase(cycle); // common base for initializing out blocks' scores 4154d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs return true; 4155d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 4156d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 4157d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs/******************************************************************************* 4158d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * main 4159d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs ******************************************************************************/ 4160d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 4161d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 4162d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::prepareEmission(Function *func) 4163d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 4164f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset SchedDataCalculatorGM107 sched(targGM107); 4165d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs CodeEmitter::prepareEmission(func); 4166d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs sched.run(func, true, true); 4167d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 4168d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 4169d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsstatic inline uint32_t sizeToBundlesGM107(uint32_t size) 4170d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 4171d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs return (size + 23) / 24; 4172d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 4173d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 4174d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid 4175d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::prepareEmission(Program *prog) 4176d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 4177d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs for (ArrayList::Iterator fi = prog->allFuncs.iterator(); 4178d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs !fi.end(); fi.next()) { 4179d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs Function *func = reinterpret_cast<Function *>(fi.get()); 4180d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs func->binPos = prog->binSize; 4181d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs prepareEmission(func); 4182d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 4183d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs // adjust sizes & positions for schedulding info: 4184d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (prog->getTarget()->hasSWSched) { 4185d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs uint32_t adjPos = func->binPos; 4186d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs BasicBlock *bb = NULL; 4187d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs for (int i = 0; i < func->bbCount; ++i) { 4188d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs bb = func->bbArray[i]; 4189d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs int32_t adjSize = bb->binSize; 4190d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (adjPos % 32) { 4191d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs adjSize -= 32 - adjPos % 32; 4192d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (adjSize < 0) 4193d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs adjSize = 0; 4194d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 4195d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs adjSize = bb->binSize + sizeToBundlesGM107(adjSize) * 8; 4196d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs bb->binPos = adjPos; 4197d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs bb->binSize = adjSize; 4198d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs adjPos += adjSize; 4199d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 4200d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs if (bb) 4201d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs func->binSize = adjPos - func->binPos; 4202d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 4203d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 4204d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs prog->binSize += func->binSize; 4205d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs } 4206d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 4207d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 4208d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::CodeEmitterGM107(const TargetGM107 *target) 4209d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs : CodeEmitter(target), 4210d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs targGM107(target), 4211d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs writeIssueDelays(target->hasSWSched) 4212d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 4213d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs code = NULL; 4214d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs codeSize = codeSizeLimit = 0; 4215d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs relocInfo = NULL; 4216d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 4217d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 4218d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitter * 4219d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsTargetGM107::createCodeEmitterGM107(Program::Type type) 4220d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{ 4221d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs CodeEmitterGM107 *emit = new CodeEmitterGM107(this); 4222d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs emit->setProgramType(type); 4223d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs return emit; 4224d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} 4225d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs 4226d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} // namespace nv50_ir 4227