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