19f610119SJia Liu //===-- MipsMCCodeEmitter.cpp - Convert Mips Code to Machine Code ---------===// 2750ecec7SAkira Hatanaka // 3750ecec7SAkira Hatanaka // The LLVM Compiler Infrastructure 4750ecec7SAkira Hatanaka // 5750ecec7SAkira Hatanaka // This file is distributed under the University of Illinois Open Source 6750ecec7SAkira Hatanaka // License. See LICENSE.TXT for details. 7750ecec7SAkira Hatanaka // 8750ecec7SAkira Hatanaka //===----------------------------------------------------------------------===// 9750ecec7SAkira Hatanaka // 10750ecec7SAkira Hatanaka // This file implements the MipsMCCodeEmitter class. 11750ecec7SAkira Hatanaka // 12750ecec7SAkira Hatanaka //===----------------------------------------------------------------------===// 13750ecec7SAkira Hatanaka // 149e1450bcSMatheus Almeida 159e1450bcSMatheus Almeida #include "MipsMCCodeEmitter.h" 16c85e3ff3SBruno Cardoso Lopes #include "MCTargetDesc/MipsFixupKinds.h" 17a5da588bSPetar Jovanovic #include "MCTargetDesc/MipsMCExpr.h" 18c85e3ff3SBruno Cardoso Lopes #include "MCTargetDesc/MipsMCTargetDesc.h" 19c85e3ff3SBruno Cardoso Lopes #include "llvm/ADT/APFloat.h" 209e1450bcSMatheus Almeida #include "llvm/ADT/SmallVector.h" 215d6faed1SAkira Hatanaka #include "llvm/MC/MCContext.h" 22750ecec7SAkira Hatanaka #include "llvm/MC/MCExpr.h" 23d9903888SChandler Carruth #include "llvm/MC/MCFixup.h" 24750ecec7SAkira Hatanaka #include "llvm/MC/MCInst.h" 25750ecec7SAkira Hatanaka #include "llvm/MC/MCInstrInfo.h" 26750ecec7SAkira Hatanaka #include "llvm/MC/MCSubtargetInfo.h" 27750ecec7SAkira Hatanaka #include "llvm/Support/raw_ostream.h" 28750ecec7SAkira Hatanaka 2984e68b29SChandler Carruth #define DEBUG_TYPE "mccodeemitter" 3084e68b29SChandler Carruth 31be6a818fSAkira Hatanaka #define GET_INSTRMAP_INFO 32be6a818fSAkira Hatanaka #include "MipsGenInstrInfo.inc" 339e1450bcSMatheus Almeida #undef GET_INSTRMAP_INFO 34be6a818fSAkira Hatanaka 359e1450bcSMatheus Almeida namespace llvm { 369e1450bcSMatheus Almeida MCCodeEmitter *createMipsMCCodeEmitterEB(const MCInstrInfo &MCII, 37c3b04279SJim Grosbach const MCRegisterInfo &MRI, 389e1450bcSMatheus Almeida MCContext &Ctx) { 39d2cca113SDavid Woodhouse return new MipsMCCodeEmitter(MCII, Ctx, false); 401ee768dbSAkira Hatanaka } 411ee768dbSAkira Hatanaka 429e1450bcSMatheus Almeida MCCodeEmitter *createMipsMCCodeEmitterEL(const MCInstrInfo &MCII, 43c3b04279SJim Grosbach const MCRegisterInfo &MRI, 449e1450bcSMatheus Almeida MCContext &Ctx) { 45d2cca113SDavid Woodhouse return new MipsMCCodeEmitter(MCII, Ctx, true); 46750ecec7SAkira Hatanaka } 479e1450bcSMatheus Almeida } // End of namespace llvm. 48f30f2cceSRafael Espindola 49f30f2cceSRafael Espindola // If the D<shift> instruction has a shift amount that is greater 50f30f2cceSRafael Espindola // than 31 (checked in calling routine), lower it to a D<shift>32 instruction 51f30f2cceSRafael Espindola static void LowerLargeShift(MCInst& Inst) { 52f30f2cceSRafael Espindola 53f30f2cceSRafael Espindola assert(Inst.getNumOperands() == 3 && "Invalid no. of operands for shift!"); 54f30f2cceSRafael Espindola assert(Inst.getOperand(2).isImm()); 55f30f2cceSRafael Espindola 56f30f2cceSRafael Espindola int64_t Shift = Inst.getOperand(2).getImm(); 57f30f2cceSRafael Espindola if (Shift <= 31) 58f30f2cceSRafael Espindola return; // Do nothing 59f30f2cceSRafael Espindola Shift -= 32; 60f30f2cceSRafael Espindola 61f30f2cceSRafael Espindola // saminus32 62f30f2cceSRafael Espindola Inst.getOperand(2).setImm(Shift); 63f30f2cceSRafael Espindola 64f30f2cceSRafael Espindola switch (Inst.getOpcode()) { 65f30f2cceSRafael Espindola default: 66f30f2cceSRafael Espindola // Calling function is not synchronized 67f30f2cceSRafael Espindola llvm_unreachable("Unexpected shift instruction"); 68f30f2cceSRafael Espindola case Mips::DSLL: 69f30f2cceSRafael Espindola Inst.setOpcode(Mips::DSLL32); 70f30f2cceSRafael Espindola return; 71f30f2cceSRafael Espindola case Mips::DSRL: 72f30f2cceSRafael Espindola Inst.setOpcode(Mips::DSRL32); 73f30f2cceSRafael Espindola return; 74f30f2cceSRafael Espindola case Mips::DSRA: 75f30f2cceSRafael Espindola Inst.setOpcode(Mips::DSRA32); 76f30f2cceSRafael Espindola return; 776a3fe574SAkira Hatanaka case Mips::DROTR: 786a3fe574SAkira Hatanaka Inst.setOpcode(Mips::DROTR32); 796a3fe574SAkira Hatanaka return; 80f30f2cceSRafael Espindola } 81f30f2cceSRafael Espindola } 82f30f2cceSRafael Espindola 83f30f2cceSRafael Espindola // Pick a DEXT or DINS instruction variant based on the pos and size operands 84f30f2cceSRafael Espindola static void LowerDextDins(MCInst& InstIn) { 85f30f2cceSRafael Espindola int Opcode = InstIn.getOpcode(); 86f30f2cceSRafael Espindola 87f30f2cceSRafael Espindola if (Opcode == Mips::DEXT) 88f30f2cceSRafael Espindola assert(InstIn.getNumOperands() == 4 && 89f30f2cceSRafael Espindola "Invalid no. of machine operands for DEXT!"); 90f30f2cceSRafael Espindola else // Only DEXT and DINS are possible 91f30f2cceSRafael Espindola assert(InstIn.getNumOperands() == 5 && 92f30f2cceSRafael Espindola "Invalid no. of machine operands for DINS!"); 93f30f2cceSRafael Espindola 94f30f2cceSRafael Espindola assert(InstIn.getOperand(2).isImm()); 95f30f2cceSRafael Espindola int64_t pos = InstIn.getOperand(2).getImm(); 96f30f2cceSRafael Espindola assert(InstIn.getOperand(3).isImm()); 97f30f2cceSRafael Espindola int64_t size = InstIn.getOperand(3).getImm(); 98f30f2cceSRafael Espindola 99f30f2cceSRafael Espindola if (size <= 32) { 100f30f2cceSRafael Espindola if (pos < 32) // DEXT/DINS, do nothing 101f30f2cceSRafael Espindola return; 102f30f2cceSRafael Espindola // DEXTU/DINSU 103f30f2cceSRafael Espindola InstIn.getOperand(2).setImm(pos - 32); 104f30f2cceSRafael Espindola InstIn.setOpcode((Opcode == Mips::DEXT) ? Mips::DEXTU : Mips::DINSU); 105f30f2cceSRafael Espindola return; 106f30f2cceSRafael Espindola } 107f30f2cceSRafael Espindola // DEXTM/DINSM 108f30f2cceSRafael Espindola assert(pos < 32 && "DEXT/DINS cannot have both size and pos > 32"); 109f30f2cceSRafael Espindola InstIn.getOperand(3).setImm(size - 32); 110f30f2cceSRafael Espindola InstIn.setOpcode((Opcode == Mips::DEXT) ? Mips::DEXTM : Mips::DINSM); 111f30f2cceSRafael Espindola return; 112f30f2cceSRafael Espindola } 113f30f2cceSRafael Espindola 1149e1450bcSMatheus Almeida bool MipsMCCodeEmitter::isMicroMips(const MCSubtargetInfo &STI) const { 115efd7a96dSMichael Kuperstein return STI.getFeatureBits() & Mips::FeatureMicroMips; 1169e1450bcSMatheus Almeida } 1179e1450bcSMatheus Almeida 1189e1450bcSMatheus Almeida void MipsMCCodeEmitter::EmitByte(unsigned char C, raw_ostream &OS) const { 1199e1450bcSMatheus Almeida OS << (char)C; 1209e1450bcSMatheus Almeida } 1219e1450bcSMatheus Almeida 1229e1450bcSMatheus Almeida void MipsMCCodeEmitter::EmitInstruction(uint64_t Val, unsigned Size, 1239e1450bcSMatheus Almeida const MCSubtargetInfo &STI, 1249e1450bcSMatheus Almeida raw_ostream &OS) const { 1259e1450bcSMatheus Almeida // Output the instruction encoding in little endian byte order. 1269e1450bcSMatheus Almeida // Little-endian byte ordering: 1279e1450bcSMatheus Almeida // mips32r2: 4 | 3 | 2 | 1 1289e1450bcSMatheus Almeida // microMIPS: 2 | 1 | 4 | 3 1299e1450bcSMatheus Almeida if (IsLittleEndian && Size == 4 && isMicroMips(STI)) { 1309e1450bcSMatheus Almeida EmitInstruction(Val >> 16, 2, STI, OS); 1319e1450bcSMatheus Almeida EmitInstruction(Val, 2, STI, OS); 1329e1450bcSMatheus Almeida } else { 1339e1450bcSMatheus Almeida for (unsigned i = 0; i < Size; ++i) { 1349e1450bcSMatheus Almeida unsigned Shift = IsLittleEndian ? i * 8 : (Size - 1 - i) * 8; 1359e1450bcSMatheus Almeida EmitByte((Val >> Shift) & 0xff, OS); 1369e1450bcSMatheus Almeida } 1379e1450bcSMatheus Almeida } 1389e1450bcSMatheus Almeida } 1399e1450bcSMatheus Almeida 140c85e3ff3SBruno Cardoso Lopes /// EncodeInstruction - Emit the instruction. 1414e07b95dSJack Carter /// Size the instruction with Desc.getSize(). 142c85e3ff3SBruno Cardoso Lopes void MipsMCCodeEmitter:: 143c85e3ff3SBruno Cardoso Lopes EncodeInstruction(const MCInst &MI, raw_ostream &OS, 1449784cef3SDavid Woodhouse SmallVectorImpl<MCFixup> &Fixups, 1459784cef3SDavid Woodhouse const MCSubtargetInfo &STI) const 146c85e3ff3SBruno Cardoso Lopes { 147aa7aeaa0SJack Carter 148aa7aeaa0SJack Carter // Non-pseudo instructions that get changed for direct object 149aa7aeaa0SJack Carter // only based on operand values. 150aa7aeaa0SJack Carter // If this list of instructions get much longer we will move 151aa7aeaa0SJack Carter // the check to a function call. Until then, this is more efficient. 152aa7aeaa0SJack Carter MCInst TmpInst = MI; 153aa7aeaa0SJack Carter switch (MI.getOpcode()) { 154aa7aeaa0SJack Carter // If shift amount is >= 32 it the inst needs to be lowered further 155aa7aeaa0SJack Carter case Mips::DSLL: 156aa7aeaa0SJack Carter case Mips::DSRL: 157aa7aeaa0SJack Carter case Mips::DSRA: 1586a3fe574SAkira Hatanaka case Mips::DROTR: 159f30f2cceSRafael Espindola LowerLargeShift(TmpInst); 160aa7aeaa0SJack Carter break; 161aa7aeaa0SJack Carter // Double extract instruction is chosen by pos and size operands 162aa7aeaa0SJack Carter case Mips::DEXT: 163aa7aeaa0SJack Carter case Mips::DINS: 164f30f2cceSRafael Espindola LowerDextDins(TmpInst); 165aa7aeaa0SJack Carter } 166aa7aeaa0SJack Carter 16797700977SJack Carter unsigned long N = Fixups.size(); 1683fa98a65SDavid Woodhouse uint32_t Binary = getBinaryCodeForInstr(TmpInst, Fixups, STI); 169c85e3ff3SBruno Cardoso Lopes 170c85e3ff3SBruno Cardoso Lopes // Check for unimplemented opcodes. 171aa7aeaa0SJack Carter // Unfortunately in MIPS both NOP and SLL will come in with Binary == 0 172c85e3ff3SBruno Cardoso Lopes // so we have to special check for them. 173aa7aeaa0SJack Carter unsigned Opcode = TmpInst.getOpcode(); 174c7e220f6SJozef Kolek if ((Opcode != Mips::NOP) && (Opcode != Mips::SLL) && 175c7e220f6SJozef Kolek (Opcode != Mips::SLL_MM) && !Binary) 176c85e3ff3SBruno Cardoso Lopes llvm_unreachable("unimplemented opcode in EncodeInstruction()"); 177c85e3ff3SBruno Cardoso Lopes 178efd7a96dSMichael Kuperstein if (STI.getFeatureBits() & Mips::FeatureMicroMips) { 179be6a818fSAkira Hatanaka int NewOpcode = Mips::Std2MicroMips (Opcode, Mips::Arch_micromips); 180be6a818fSAkira Hatanaka if (NewOpcode != -1) { 18197700977SJack Carter if (Fixups.size() > N) 18297700977SJack Carter Fixups.pop_back(); 183be6a818fSAkira Hatanaka Opcode = NewOpcode; 184be6a818fSAkira Hatanaka TmpInst.setOpcode (NewOpcode); 1853fa98a65SDavid Woodhouse Binary = getBinaryCodeForInstr(TmpInst, Fixups, STI); 186be6a818fSAkira Hatanaka } 187be6a818fSAkira Hatanaka } 188be6a818fSAkira Hatanaka 189aa7aeaa0SJack Carter const MCInstrDesc &Desc = MCII.get(TmpInst.getOpcode()); 190c85e3ff3SBruno Cardoso Lopes 1915b5559d3SJack Carter // Get byte count of instruction 1925b5559d3SJack Carter unsigned Size = Desc.getSize(); 1935b5559d3SJack Carter if (!Size) 1945b5559d3SJack Carter llvm_unreachable("Desc.getSize() returns 0"); 195c85e3ff3SBruno Cardoso Lopes 196d2cca113SDavid Woodhouse EmitInstruction(Binary, Size, STI, OS); 197c85e3ff3SBruno Cardoso Lopes } 198c85e3ff3SBruno Cardoso Lopes 199c85e3ff3SBruno Cardoso Lopes /// getBranchTargetOpValue - Return binary encoding of the branch 200c85e3ff3SBruno Cardoso Lopes /// target operand. If the machine operand requires relocation, 201c85e3ff3SBruno Cardoso Lopes /// record the relocation and return zero. 202c85e3ff3SBruno Cardoso Lopes unsigned MipsMCCodeEmitter:: 203c85e3ff3SBruno Cardoso Lopes getBranchTargetOpValue(const MCInst &MI, unsigned OpNo, 2043fa98a65SDavid Woodhouse SmallVectorImpl<MCFixup> &Fixups, 2053fa98a65SDavid Woodhouse const MCSubtargetInfo &STI) const { 206c85e3ff3SBruno Cardoso Lopes 207c85e3ff3SBruno Cardoso Lopes const MCOperand &MO = MI.getOperand(OpNo); 20871e6a749SJack Carter 2094f69a0f2SJack Carter // If the destination is an immediate, divide by 4. 2104f69a0f2SJack Carter if (MO.isImm()) return MO.getImm() >> 2; 2114f69a0f2SJack Carter 21271e6a749SJack Carter assert(MO.isExpr() && 21371e6a749SJack Carter "getBranchTargetOpValue expects only expressions or immediates"); 214c85e3ff3SBruno Cardoso Lopes 215c85e3ff3SBruno Cardoso Lopes const MCExpr *Expr = MO.getExpr(); 216c85e3ff3SBruno Cardoso Lopes Fixups.push_back(MCFixup::Create(0, Expr, 217c85e3ff3SBruno Cardoso Lopes MCFixupKind(Mips::fixup_Mips_PC16))); 218c85e3ff3SBruno Cardoso Lopes return 0; 219c85e3ff3SBruno Cardoso Lopes } 220c85e3ff3SBruno Cardoso Lopes 2219761e96bSJozef Kolek /// getBranchTarget7OpValueMM - Return binary encoding of the microMIPS branch 2229761e96bSJozef Kolek /// target operand. If the machine operand requires relocation, 2239761e96bSJozef Kolek /// record the relocation and return zero. 2249761e96bSJozef Kolek unsigned MipsMCCodeEmitter:: 2259761e96bSJozef Kolek getBranchTarget7OpValueMM(const MCInst &MI, unsigned OpNo, 2269761e96bSJozef Kolek SmallVectorImpl<MCFixup> &Fixups, 2279761e96bSJozef Kolek const MCSubtargetInfo &STI) const { 2289761e96bSJozef Kolek 2299761e96bSJozef Kolek const MCOperand &MO = MI.getOperand(OpNo); 2309761e96bSJozef Kolek 2319761e96bSJozef Kolek // If the destination is an immediate, divide by 2. 2329761e96bSJozef Kolek if (MO.isImm()) return MO.getImm() >> 1; 2339761e96bSJozef Kolek 2349761e96bSJozef Kolek assert(MO.isExpr() && 2359761e96bSJozef Kolek "getBranchTargetOpValueMM expects only expressions or immediates"); 2369761e96bSJozef Kolek 2379761e96bSJozef Kolek const MCExpr *Expr = MO.getExpr(); 2389761e96bSJozef Kolek Fixups.push_back(MCFixup::Create(0, Expr, 2399761e96bSJozef Kolek MCFixupKind(Mips::fixup_MICROMIPS_PC7_S1))); 2409761e96bSJozef Kolek return 0; 2419761e96bSJozef Kolek } 2429761e96bSJozef Kolek 2435cfebddeSJozef Kolek /// getBranchTargetOpValueMMPC10 - Return binary encoding of the microMIPS 2445cfebddeSJozef Kolek /// 10-bit branch target operand. If the machine operand requires relocation, 2455cfebddeSJozef Kolek /// record the relocation and return zero. 2465cfebddeSJozef Kolek unsigned MipsMCCodeEmitter:: 2475cfebddeSJozef Kolek getBranchTargetOpValueMMPC10(const MCInst &MI, unsigned OpNo, 2485cfebddeSJozef Kolek SmallVectorImpl<MCFixup> &Fixups, 2495cfebddeSJozef Kolek const MCSubtargetInfo &STI) const { 2505cfebddeSJozef Kolek 2515cfebddeSJozef Kolek const MCOperand &MO = MI.getOperand(OpNo); 2525cfebddeSJozef Kolek 2535cfebddeSJozef Kolek // If the destination is an immediate, divide by 2. 2545cfebddeSJozef Kolek if (MO.isImm()) return MO.getImm() >> 1; 2555cfebddeSJozef Kolek 2565cfebddeSJozef Kolek assert(MO.isExpr() && 2575cfebddeSJozef Kolek "getBranchTargetOpValuePC10 expects only expressions or immediates"); 2585cfebddeSJozef Kolek 2595cfebddeSJozef Kolek const MCExpr *Expr = MO.getExpr(); 2605cfebddeSJozef Kolek Fixups.push_back(MCFixup::Create(0, Expr, 2615cfebddeSJozef Kolek MCFixupKind(Mips::fixup_MICROMIPS_PC10_S1))); 2625cfebddeSJozef Kolek return 0; 2635cfebddeSJozef Kolek } 2645cfebddeSJozef Kolek 2658a80aa76SZoran Jovanovic /// getBranchTargetOpValue - Return binary encoding of the microMIPS branch 2668a80aa76SZoran Jovanovic /// target operand. If the machine operand requires relocation, 2678a80aa76SZoran Jovanovic /// record the relocation and return zero. 2688a80aa76SZoran Jovanovic unsigned MipsMCCodeEmitter:: 2698a80aa76SZoran Jovanovic getBranchTargetOpValueMM(const MCInst &MI, unsigned OpNo, 2703fa98a65SDavid Woodhouse SmallVectorImpl<MCFixup> &Fixups, 2713fa98a65SDavid Woodhouse const MCSubtargetInfo &STI) const { 2728a80aa76SZoran Jovanovic 2738a80aa76SZoran Jovanovic const MCOperand &MO = MI.getOperand(OpNo); 2748a80aa76SZoran Jovanovic 2758a80aa76SZoran Jovanovic // If the destination is an immediate, divide by 2. 2768a80aa76SZoran Jovanovic if (MO.isImm()) return MO.getImm() >> 1; 2778a80aa76SZoran Jovanovic 2788a80aa76SZoran Jovanovic assert(MO.isExpr() && 2798a80aa76SZoran Jovanovic "getBranchTargetOpValueMM expects only expressions or immediates"); 2808a80aa76SZoran Jovanovic 2818a80aa76SZoran Jovanovic const MCExpr *Expr = MO.getExpr(); 2828a80aa76SZoran Jovanovic Fixups.push_back(MCFixup::Create(0, Expr, 2838a80aa76SZoran Jovanovic MCFixupKind(Mips:: 2848a80aa76SZoran Jovanovic fixup_MICROMIPS_PC16_S1))); 2858a80aa76SZoran Jovanovic return 0; 2868a80aa76SZoran Jovanovic } 2878a80aa76SZoran Jovanovic 2883c8869dcSZoran Jovanovic /// getBranchTarget21OpValue - Return binary encoding of the branch 2893c8869dcSZoran Jovanovic /// target operand. If the machine operand requires relocation, 2903c8869dcSZoran Jovanovic /// record the relocation and return zero. 2913c8869dcSZoran Jovanovic unsigned MipsMCCodeEmitter:: 2923c8869dcSZoran Jovanovic getBranchTarget21OpValue(const MCInst &MI, unsigned OpNo, 2933c8869dcSZoran Jovanovic SmallVectorImpl<MCFixup> &Fixups, 2943c8869dcSZoran Jovanovic const MCSubtargetInfo &STI) const { 2953c8869dcSZoran Jovanovic 2963c8869dcSZoran Jovanovic const MCOperand &MO = MI.getOperand(OpNo); 2973c8869dcSZoran Jovanovic 2983c8869dcSZoran Jovanovic // If the destination is an immediate, divide by 4. 2993c8869dcSZoran Jovanovic if (MO.isImm()) return MO.getImm() >> 2; 3003c8869dcSZoran Jovanovic 3013c8869dcSZoran Jovanovic assert(MO.isExpr() && 3023c8869dcSZoran Jovanovic "getBranchTarget21OpValue expects only expressions or immediates"); 3033c8869dcSZoran Jovanovic 30410e06da0SZoran Jovanovic const MCExpr *Expr = MO.getExpr(); 30510e06da0SZoran Jovanovic Fixups.push_back(MCFixup::Create(0, Expr, 30610e06da0SZoran Jovanovic MCFixupKind(Mips::fixup_MIPS_PC21_S2))); 3073c8869dcSZoran Jovanovic return 0; 3083c8869dcSZoran Jovanovic } 3093c8869dcSZoran Jovanovic 3103c8869dcSZoran Jovanovic /// getBranchTarget26OpValue - Return binary encoding of the branch 3113c8869dcSZoran Jovanovic /// target operand. If the machine operand requires relocation, 3123c8869dcSZoran Jovanovic /// record the relocation and return zero. 3133c8869dcSZoran Jovanovic unsigned MipsMCCodeEmitter:: 3143c8869dcSZoran Jovanovic getBranchTarget26OpValue(const MCInst &MI, unsigned OpNo, 3153c8869dcSZoran Jovanovic SmallVectorImpl<MCFixup> &Fixups, 3163c8869dcSZoran Jovanovic const MCSubtargetInfo &STI) const { 3173c8869dcSZoran Jovanovic 3183c8869dcSZoran Jovanovic const MCOperand &MO = MI.getOperand(OpNo); 3193c8869dcSZoran Jovanovic 3203c8869dcSZoran Jovanovic // If the destination is an immediate, divide by 4. 3213c8869dcSZoran Jovanovic if (MO.isImm()) return MO.getImm() >> 2; 3223c8869dcSZoran Jovanovic 3233c8869dcSZoran Jovanovic assert(MO.isExpr() && 3243c8869dcSZoran Jovanovic "getBranchTarget26OpValue expects only expressions or immediates"); 3253c8869dcSZoran Jovanovic 32610e06da0SZoran Jovanovic const MCExpr *Expr = MO.getExpr(); 32710e06da0SZoran Jovanovic Fixups.push_back(MCFixup::Create(0, Expr, 32810e06da0SZoran Jovanovic MCFixupKind(Mips::fixup_MIPS_PC26_S2))); 3293c8869dcSZoran Jovanovic return 0; 3303c8869dcSZoran Jovanovic } 3313c8869dcSZoran Jovanovic 33252c56b93SZoran Jovanovic /// getJumpOffset16OpValue - Return binary encoding of the jump 33352c56b93SZoran Jovanovic /// target operand. If the machine operand requires relocation, 33452c56b93SZoran Jovanovic /// record the relocation and return zero. 33552c56b93SZoran Jovanovic unsigned MipsMCCodeEmitter:: 33652c56b93SZoran Jovanovic getJumpOffset16OpValue(const MCInst &MI, unsigned OpNo, 33752c56b93SZoran Jovanovic SmallVectorImpl<MCFixup> &Fixups, 33852c56b93SZoran Jovanovic const MCSubtargetInfo &STI) const { 33952c56b93SZoran Jovanovic 34052c56b93SZoran Jovanovic const MCOperand &MO = MI.getOperand(OpNo); 34152c56b93SZoran Jovanovic 34252c56b93SZoran Jovanovic if (MO.isImm()) return MO.getImm(); 34352c56b93SZoran Jovanovic 34452c56b93SZoran Jovanovic assert(MO.isExpr() && 34552c56b93SZoran Jovanovic "getJumpOffset16OpValue expects only expressions or an immediate"); 34652c56b93SZoran Jovanovic 34752c56b93SZoran Jovanovic // TODO: Push fixup. 34852c56b93SZoran Jovanovic return 0; 34952c56b93SZoran Jovanovic } 35052c56b93SZoran Jovanovic 351c85e3ff3SBruno Cardoso Lopes /// getJumpTargetOpValue - Return binary encoding of the jump 352c85e3ff3SBruno Cardoso Lopes /// target operand. If the machine operand requires relocation, 353c85e3ff3SBruno Cardoso Lopes /// record the relocation and return zero. 354c85e3ff3SBruno Cardoso Lopes unsigned MipsMCCodeEmitter:: 355c85e3ff3SBruno Cardoso Lopes getJumpTargetOpValue(const MCInst &MI, unsigned OpNo, 3563fa98a65SDavid Woodhouse SmallVectorImpl<MCFixup> &Fixups, 3573fa98a65SDavid Woodhouse const MCSubtargetInfo &STI) const { 358c85e3ff3SBruno Cardoso Lopes 359c85e3ff3SBruno Cardoso Lopes const MCOperand &MO = MI.getOperand(OpNo); 3604f69a0f2SJack Carter // If the destination is an immediate, divide by 4. 3614f69a0f2SJack Carter if (MO.isImm()) return MO.getImm()>>2; 3624f69a0f2SJack Carter 36371e6a749SJack Carter assert(MO.isExpr() && 36471e6a749SJack Carter "getJumpTargetOpValue expects only expressions or an immediate"); 365c85e3ff3SBruno Cardoso Lopes 366c85e3ff3SBruno Cardoso Lopes const MCExpr *Expr = MO.getExpr(); 367c85e3ff3SBruno Cardoso Lopes Fixups.push_back(MCFixup::Create(0, Expr, 368c85e3ff3SBruno Cardoso Lopes MCFixupKind(Mips::fixup_Mips_26))); 369c85e3ff3SBruno Cardoso Lopes return 0; 370c85e3ff3SBruno Cardoso Lopes } 371c85e3ff3SBruno Cardoso Lopes 372c85e3ff3SBruno Cardoso Lopes unsigned MipsMCCodeEmitter:: 373507e084aSZoran Jovanovic getJumpTargetOpValueMM(const MCInst &MI, unsigned OpNo, 3743fa98a65SDavid Woodhouse SmallVectorImpl<MCFixup> &Fixups, 3753fa98a65SDavid Woodhouse const MCSubtargetInfo &STI) const { 376507e084aSZoran Jovanovic 377507e084aSZoran Jovanovic const MCOperand &MO = MI.getOperand(OpNo); 378507e084aSZoran Jovanovic // If the destination is an immediate, divide by 2. 379507e084aSZoran Jovanovic if (MO.isImm()) return MO.getImm() >> 1; 380507e084aSZoran Jovanovic 381507e084aSZoran Jovanovic assert(MO.isExpr() && 382507e084aSZoran Jovanovic "getJumpTargetOpValueMM expects only expressions or an immediate"); 383507e084aSZoran Jovanovic 384507e084aSZoran Jovanovic const MCExpr *Expr = MO.getExpr(); 385507e084aSZoran Jovanovic Fixups.push_back(MCFixup::Create(0, Expr, 386507e084aSZoran Jovanovic MCFixupKind(Mips::fixup_MICROMIPS_26_S1))); 387507e084aSZoran Jovanovic return 0; 388507e084aSZoran Jovanovic } 389507e084aSZoran Jovanovic 390507e084aSZoran Jovanovic unsigned MipsMCCodeEmitter:: 391c74e3eb9SZoran Jovanovic getUImm5Lsl2Encoding(const MCInst &MI, unsigned OpNo, 392c74e3eb9SZoran Jovanovic SmallVectorImpl<MCFixup> &Fixups, 393c74e3eb9SZoran Jovanovic const MCSubtargetInfo &STI) const { 394c74e3eb9SZoran Jovanovic 395c74e3eb9SZoran Jovanovic const MCOperand &MO = MI.getOperand(OpNo); 396c74e3eb9SZoran Jovanovic if (MO.isImm()) { 397c74e3eb9SZoran Jovanovic // The immediate is encoded as 'immediate << 2'. 398c74e3eb9SZoran Jovanovic unsigned Res = getMachineOpValue(MI, MO, Fixups, STI); 399c74e3eb9SZoran Jovanovic assert((Res & 3) == 0); 400c74e3eb9SZoran Jovanovic return Res >> 2; 401c74e3eb9SZoran Jovanovic } 402c74e3eb9SZoran Jovanovic 403c74e3eb9SZoran Jovanovic assert(MO.isExpr() && 404c74e3eb9SZoran Jovanovic "getUImm5Lsl2Encoding expects only expressions or an immediate"); 405c74e3eb9SZoran Jovanovic 406c74e3eb9SZoran Jovanovic return 0; 407c74e3eb9SZoran Jovanovic } 408c74e3eb9SZoran Jovanovic 409c74e3eb9SZoran Jovanovic unsigned MipsMCCodeEmitter:: 410bac3619bSZoran Jovanovic getSImm3Lsa2Value(const MCInst &MI, unsigned OpNo, 411bac3619bSZoran Jovanovic SmallVectorImpl<MCFixup> &Fixups, 412bac3619bSZoran Jovanovic const MCSubtargetInfo &STI) const { 413bac3619bSZoran Jovanovic 414bac3619bSZoran Jovanovic const MCOperand &MO = MI.getOperand(OpNo); 415bac3619bSZoran Jovanovic if (MO.isImm()) { 416bac3619bSZoran Jovanovic int Value = MO.getImm(); 417bac3619bSZoran Jovanovic return Value >> 2; 418bac3619bSZoran Jovanovic } 419bac3619bSZoran Jovanovic 420bac3619bSZoran Jovanovic return 0; 421bac3619bSZoran Jovanovic } 422bac3619bSZoran Jovanovic 423bac3619bSZoran Jovanovic unsigned MipsMCCodeEmitter:: 42442b84443SZoran Jovanovic getUImm6Lsl2Encoding(const MCInst &MI, unsigned OpNo, 42542b84443SZoran Jovanovic SmallVectorImpl<MCFixup> &Fixups, 42642b84443SZoran Jovanovic const MCSubtargetInfo &STI) const { 42742b84443SZoran Jovanovic 42842b84443SZoran Jovanovic const MCOperand &MO = MI.getOperand(OpNo); 42942b84443SZoran Jovanovic if (MO.isImm()) { 43042b84443SZoran Jovanovic unsigned Value = MO.getImm(); 43142b84443SZoran Jovanovic return Value >> 2; 43242b84443SZoran Jovanovic } 43342b84443SZoran Jovanovic 43442b84443SZoran Jovanovic return 0; 43542b84443SZoran Jovanovic } 43642b84443SZoran Jovanovic 43742b84443SZoran Jovanovic unsigned MipsMCCodeEmitter:: 43898bd58caSZoran Jovanovic getSImm9AddiuspValue(const MCInst &MI, unsigned OpNo, 43998bd58caSZoran Jovanovic SmallVectorImpl<MCFixup> &Fixups, 44098bd58caSZoran Jovanovic const MCSubtargetInfo &STI) const { 44198bd58caSZoran Jovanovic 44298bd58caSZoran Jovanovic const MCOperand &MO = MI.getOperand(OpNo); 44398bd58caSZoran Jovanovic if (MO.isImm()) { 44498bd58caSZoran Jovanovic unsigned Binary = (MO.getImm() >> 2) & 0x0000ffff; 44598bd58caSZoran Jovanovic return (((Binary & 0x8000) >> 7) | (Binary & 0x00ff)); 44698bd58caSZoran Jovanovic } 44798bd58caSZoran Jovanovic 44898bd58caSZoran Jovanovic return 0; 44998bd58caSZoran Jovanovic } 45098bd58caSZoran Jovanovic 45198bd58caSZoran Jovanovic unsigned MipsMCCodeEmitter:: 4523fa98a65SDavid Woodhouse getExprOpValue(const MCExpr *Expr, SmallVectorImpl<MCFixup> &Fixups, 4533fa98a65SDavid Woodhouse const MCSubtargetInfo &STI) const { 454b5cf5909SJack Carter int64_t Res; 455049e9e4dSAkira Hatanaka 456b5cf5909SJack Carter if (Expr->EvaluateAsAbsolute(Res)) 457b5cf5909SJack Carter return Res; 458fe384a2cSAkira Hatanaka 459fe384a2cSAkira Hatanaka MCExpr::ExprKind Kind = Expr->getKind(); 460b5cf5909SJack Carter if (Kind == MCExpr::Constant) { 461b5cf5909SJack Carter return cast<MCConstantExpr>(Expr)->getValue(); 462b5cf5909SJack Carter } 463fe384a2cSAkira Hatanaka 464fe384a2cSAkira Hatanaka if (Kind == MCExpr::Binary) { 4653fa98a65SDavid Woodhouse unsigned Res = getExprOpValue(cast<MCBinaryExpr>(Expr)->getLHS(), Fixups, STI); 4663fa98a65SDavid Woodhouse Res += getExprOpValue(cast<MCBinaryExpr>(Expr)->getRHS(), Fixups, STI); 467b5cf5909SJack Carter return Res; 468fe384a2cSAkira Hatanaka } 469a5da588bSPetar Jovanovic 470a5da588bSPetar Jovanovic if (Kind == MCExpr::Target) { 471a5da588bSPetar Jovanovic const MipsMCExpr *MipsExpr = cast<MipsMCExpr>(Expr); 472a5da588bSPetar Jovanovic 473a5da588bSPetar Jovanovic Mips::Fixups FixupKind = Mips::Fixups(0); 474a5da588bSPetar Jovanovic switch (MipsExpr->getKind()) { 475a5da588bSPetar Jovanovic default: llvm_unreachable("Unsupported fixup kind for target expression!"); 47606c47803SSasa Stankovic case MipsMCExpr::VK_Mips_HIGHEST: 47706c47803SSasa Stankovic FixupKind = Mips::fixup_Mips_HIGHEST; 47806c47803SSasa Stankovic break; 47906c47803SSasa Stankovic case MipsMCExpr::VK_Mips_HIGHER: 48006c47803SSasa Stankovic FixupKind = Mips::fixup_Mips_HIGHER; 48106c47803SSasa Stankovic break; 48206c47803SSasa Stankovic case MipsMCExpr::VK_Mips_HI: 483a5da588bSPetar Jovanovic FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_HI16 484a5da588bSPetar Jovanovic : Mips::fixup_Mips_HI16; 485a5da588bSPetar Jovanovic break; 48606c47803SSasa Stankovic case MipsMCExpr::VK_Mips_LO: 487a5da588bSPetar Jovanovic FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_LO16 488a5da588bSPetar Jovanovic : Mips::fixup_Mips_LO16; 489a5da588bSPetar Jovanovic break; 490a5da588bSPetar Jovanovic } 491a5da588bSPetar Jovanovic Fixups.push_back(MCFixup::Create(0, MipsExpr, MCFixupKind(FixupKind))); 492a5da588bSPetar Jovanovic return 0; 493a5da588bSPetar Jovanovic } 494a5da588bSPetar Jovanovic 495b5cf5909SJack Carter if (Kind == MCExpr::SymbolRef) { 496f9774c32SBill Wendling Mips::Fixups FixupKind = Mips::Fixups(0); 497e2eed964SAkira Hatanaka 498049e9e4dSAkira Hatanaka switch(cast<MCSymbolRefExpr>(Expr)->getKind()) { 499b9f9de93SJack Carter default: llvm_unreachable("Unknown fixup kind!"); 500*60f1db05SDaniel Sanders break; 501*60f1db05SDaniel Sanders case MCSymbolRefExpr::VK_None: 502*60f1db05SDaniel Sanders FixupKind = Mips::fixup_Mips_32; // FIXME: This is ok for O32/N32 but not N64. 503b9f9de93SJack Carter break; 504b9f9de93SJack Carter case MCSymbolRefExpr::VK_Mips_GPOFF_HI : 505b9f9de93SJack Carter FixupKind = Mips::fixup_Mips_GPOFF_HI; 506b9f9de93SJack Carter break; 507b9f9de93SJack Carter case MCSymbolRefExpr::VK_Mips_GPOFF_LO : 508b9f9de93SJack Carter FixupKind = Mips::fixup_Mips_GPOFF_LO; 509b9f9de93SJack Carter break; 510b9f9de93SJack Carter case MCSymbolRefExpr::VK_Mips_GOT_PAGE : 511d2cca113SDavid Woodhouse FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_GOT_PAGE 512e7ae8af8SZoran Jovanovic : Mips::fixup_Mips_GOT_PAGE; 513b9f9de93SJack Carter break; 514b9f9de93SJack Carter case MCSymbolRefExpr::VK_Mips_GOT_OFST : 515d2cca113SDavid Woodhouse FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_GOT_OFST 516e7ae8af8SZoran Jovanovic : Mips::fixup_Mips_GOT_OFST; 517b9f9de93SJack Carter break; 5185ddcfda8SJack Carter case MCSymbolRefExpr::VK_Mips_GOT_DISP : 519d2cca113SDavid Woodhouse FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_GOT_DISP 520e7ae8af8SZoran Jovanovic : Mips::fixup_Mips_GOT_DISP; 5215ddcfda8SJack Carter break; 522c85e3ff3SBruno Cardoso Lopes case MCSymbolRefExpr::VK_Mips_GPREL: 523c85e3ff3SBruno Cardoso Lopes FixupKind = Mips::fixup_Mips_GPREL16; 524c85e3ff3SBruno Cardoso Lopes break; 525c85e3ff3SBruno Cardoso Lopes case MCSymbolRefExpr::VK_Mips_GOT_CALL: 526d2cca113SDavid Woodhouse FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_CALL16 527e7ae8af8SZoran Jovanovic : Mips::fixup_Mips_CALL16; 528c85e3ff3SBruno Cardoso Lopes break; 52961e6d987SBruno Cardoso Lopes case MCSymbolRefExpr::VK_Mips_GOT16: 530d2cca113SDavid Woodhouse FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_GOT16 531e7ae8af8SZoran Jovanovic : Mips::fixup_Mips_GOT_Global; 53261e6d987SBruno Cardoso Lopes break; 533c85e3ff3SBruno Cardoso Lopes case MCSymbolRefExpr::VK_Mips_GOT: 534d2cca113SDavid Woodhouse FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_GOT16 535e7ae8af8SZoran Jovanovic : Mips::fixup_Mips_GOT_Local; 536c85e3ff3SBruno Cardoso Lopes break; 537c85e3ff3SBruno Cardoso Lopes case MCSymbolRefExpr::VK_Mips_ABS_HI: 538d2cca113SDavid Woodhouse FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_HI16 539e7ae8af8SZoran Jovanovic : Mips::fixup_Mips_HI16; 540c85e3ff3SBruno Cardoso Lopes break; 541c85e3ff3SBruno Cardoso Lopes case MCSymbolRefExpr::VK_Mips_ABS_LO: 542d2cca113SDavid Woodhouse FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_LO16 543e7ae8af8SZoran Jovanovic : Mips::fixup_Mips_LO16; 544c85e3ff3SBruno Cardoso Lopes break; 545c85e3ff3SBruno Cardoso Lopes case MCSymbolRefExpr::VK_Mips_TLSGD: 546d2cca113SDavid Woodhouse FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_TLS_GD 54769be811aSZoran Jovanovic : Mips::fixup_Mips_TLSGD; 548c85e3ff3SBruno Cardoso Lopes break; 549e2eed964SAkira Hatanaka case MCSymbolRefExpr::VK_Mips_TLSLDM: 550d2cca113SDavid Woodhouse FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_TLS_LDM 55169be811aSZoran Jovanovic : Mips::fixup_Mips_TLSLDM; 552e2eed964SAkira Hatanaka break; 553e2eed964SAkira Hatanaka case MCSymbolRefExpr::VK_Mips_DTPREL_HI: 554d2cca113SDavid Woodhouse FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_TLS_DTPREL_HI16 555e7ae8af8SZoran Jovanovic : Mips::fixup_Mips_DTPREL_HI; 556e2eed964SAkira Hatanaka break; 557e2eed964SAkira Hatanaka case MCSymbolRefExpr::VK_Mips_DTPREL_LO: 558d2cca113SDavid Woodhouse FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_TLS_DTPREL_LO16 559e7ae8af8SZoran Jovanovic : Mips::fixup_Mips_DTPREL_LO; 560e2eed964SAkira Hatanaka break; 561c85e3ff3SBruno Cardoso Lopes case MCSymbolRefExpr::VK_Mips_GOTTPREL: 562c85e3ff3SBruno Cardoso Lopes FixupKind = Mips::fixup_Mips_GOTTPREL; 563c85e3ff3SBruno Cardoso Lopes break; 564c85e3ff3SBruno Cardoso Lopes case MCSymbolRefExpr::VK_Mips_TPREL_HI: 565d2cca113SDavid Woodhouse FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_TLS_TPREL_HI16 566e7ae8af8SZoran Jovanovic : Mips::fixup_Mips_TPREL_HI; 567c85e3ff3SBruno Cardoso Lopes break; 568c85e3ff3SBruno Cardoso Lopes case MCSymbolRefExpr::VK_Mips_TPREL_LO: 569d2cca113SDavid Woodhouse FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_TLS_TPREL_LO16 570e7ae8af8SZoran Jovanovic : Mips::fixup_Mips_TPREL_LO; 571c85e3ff3SBruno Cardoso Lopes break; 57284491abbSJack Carter case MCSymbolRefExpr::VK_Mips_HIGHER: 57384491abbSJack Carter FixupKind = Mips::fixup_Mips_HIGHER; 57484491abbSJack Carter break; 57584491abbSJack Carter case MCSymbolRefExpr::VK_Mips_HIGHEST: 57684491abbSJack Carter FixupKind = Mips::fixup_Mips_HIGHEST; 57784491abbSJack Carter break; 578b05cb67bSJack Carter case MCSymbolRefExpr::VK_Mips_GOT_HI16: 579b05cb67bSJack Carter FixupKind = Mips::fixup_Mips_GOT_HI16; 580b05cb67bSJack Carter break; 581b05cb67bSJack Carter case MCSymbolRefExpr::VK_Mips_GOT_LO16: 582b05cb67bSJack Carter FixupKind = Mips::fixup_Mips_GOT_LO16; 583b05cb67bSJack Carter break; 584b05cb67bSJack Carter case MCSymbolRefExpr::VK_Mips_CALL_HI16: 585b05cb67bSJack Carter FixupKind = Mips::fixup_Mips_CALL_HI16; 586b05cb67bSJack Carter break; 587b05cb67bSJack Carter case MCSymbolRefExpr::VK_Mips_CALL_LO16: 588b05cb67bSJack Carter FixupKind = Mips::fixup_Mips_CALL_LO16; 589b05cb67bSJack Carter break; 590b355e8f6SZoran Jovanovic case MCSymbolRefExpr::VK_Mips_PCREL_HI16: 591b355e8f6SZoran Jovanovic FixupKind = Mips::fixup_MIPS_PCHI16; 592b355e8f6SZoran Jovanovic break; 593b355e8f6SZoran Jovanovic case MCSymbolRefExpr::VK_Mips_PCREL_LO16: 594b355e8f6SZoran Jovanovic FixupKind = Mips::fixup_MIPS_PCLO16; 595b355e8f6SZoran Jovanovic break; 596c85e3ff3SBruno Cardoso Lopes } // switch 597fe384a2cSAkira Hatanaka 598b5cf5909SJack Carter Fixups.push_back(MCFixup::Create(0, Expr, MCFixupKind(FixupKind))); 599fe384a2cSAkira Hatanaka return 0; 600c85e3ff3SBruno Cardoso Lopes } 601b5cf5909SJack Carter return 0; 602b5cf5909SJack Carter } 603b5cf5909SJack Carter 604b5cf5909SJack Carter /// getMachineOpValue - Return binary encoding of operand. If the machine 605b5cf5909SJack Carter /// operand requires relocation, record the relocation and return zero. 606b5cf5909SJack Carter unsigned MipsMCCodeEmitter:: 607b5cf5909SJack Carter getMachineOpValue(const MCInst &MI, const MCOperand &MO, 6083fa98a65SDavid Woodhouse SmallVectorImpl<MCFixup> &Fixups, 6093fa98a65SDavid Woodhouse const MCSubtargetInfo &STI) const { 610b5cf5909SJack Carter if (MO.isReg()) { 611b5cf5909SJack Carter unsigned Reg = MO.getReg(); 612bc07a890SBill Wendling unsigned RegNo = Ctx.getRegisterInfo()->getEncodingValue(Reg); 613b5cf5909SJack Carter return RegNo; 614b5cf5909SJack Carter } else if (MO.isImm()) { 615b5cf5909SJack Carter return static_cast<unsigned>(MO.getImm()); 616b5cf5909SJack Carter } else if (MO.isFPImm()) { 617b5cf5909SJack Carter return static_cast<unsigned>(APFloat(MO.getFPImm()) 618b5cf5909SJack Carter .bitcastToAPInt().getHiBits(32).getLimitedValue()); 619b5cf5909SJack Carter } 620b5cf5909SJack Carter // MO must be an Expr. 621b5cf5909SJack Carter assert(MO.isExpr()); 6223fa98a65SDavid Woodhouse return getExprOpValue(MO.getExpr(),Fixups, STI); 623b5cf5909SJack Carter } 624c85e3ff3SBruno Cardoso Lopes 6256b59c449SMatheus Almeida /// getMSAMemEncoding - Return binary encoding of memory operand for LD/ST 6266b59c449SMatheus Almeida /// instructions. 6276b59c449SMatheus Almeida unsigned 6286b59c449SMatheus Almeida MipsMCCodeEmitter::getMSAMemEncoding(const MCInst &MI, unsigned OpNo, 6293fa98a65SDavid Woodhouse SmallVectorImpl<MCFixup> &Fixups, 6303fa98a65SDavid Woodhouse const MCSubtargetInfo &STI) const { 6316b59c449SMatheus Almeida // Base register is encoded in bits 20-16, offset is encoded in bits 15-0. 6326b59c449SMatheus Almeida assert(MI.getOperand(OpNo).isReg()); 6333fa98a65SDavid Woodhouse unsigned RegBits = getMachineOpValue(MI, MI.getOperand(OpNo),Fixups, STI) << 16; 6343fa98a65SDavid Woodhouse unsigned OffBits = getMachineOpValue(MI, MI.getOperand(OpNo+1), Fixups, STI); 6356b59c449SMatheus Almeida 6366b59c449SMatheus Almeida // The immediate field of an LD/ST instruction is scaled which means it must 6376b59c449SMatheus Almeida // be divided (when encoding) by the size (in bytes) of the instructions' 6386b59c449SMatheus Almeida // data format. 6396b59c449SMatheus Almeida // .b - 1 byte 6406b59c449SMatheus Almeida // .h - 2 bytes 6416b59c449SMatheus Almeida // .w - 4 bytes 6426b59c449SMatheus Almeida // .d - 8 bytes 6436b59c449SMatheus Almeida switch(MI.getOpcode()) 6446b59c449SMatheus Almeida { 6456b59c449SMatheus Almeida default: 6466b59c449SMatheus Almeida assert (0 && "Unexpected instruction"); 6476b59c449SMatheus Almeida break; 6486b59c449SMatheus Almeida case Mips::LD_B: 6496b59c449SMatheus Almeida case Mips::ST_B: 6506b59c449SMatheus Almeida // We don't need to scale the offset in this case 6516b59c449SMatheus Almeida break; 6526b59c449SMatheus Almeida case Mips::LD_H: 6536b59c449SMatheus Almeida case Mips::ST_H: 6546b59c449SMatheus Almeida OffBits >>= 1; 6556b59c449SMatheus Almeida break; 6566b59c449SMatheus Almeida case Mips::LD_W: 6576b59c449SMatheus Almeida case Mips::ST_W: 6586b59c449SMatheus Almeida OffBits >>= 2; 6596b59c449SMatheus Almeida break; 6606b59c449SMatheus Almeida case Mips::LD_D: 6616b59c449SMatheus Almeida case Mips::ST_D: 6626b59c449SMatheus Almeida OffBits >>= 3; 6636b59c449SMatheus Almeida break; 6646b59c449SMatheus Almeida } 6656b59c449SMatheus Almeida 6666b59c449SMatheus Almeida return (OffBits & 0xFFFF) | RegBits; 6676b59c449SMatheus Almeida } 6686b59c449SMatheus Almeida 669c85e3ff3SBruno Cardoso Lopes /// getMemEncoding - Return binary encoding of memory related operand. 670c85e3ff3SBruno Cardoso Lopes /// If the offset operand requires relocation, record the relocation. 671c85e3ff3SBruno Cardoso Lopes unsigned 672c85e3ff3SBruno Cardoso Lopes MipsMCCodeEmitter::getMemEncoding(const MCInst &MI, unsigned OpNo, 6733fa98a65SDavid Woodhouse SmallVectorImpl<MCFixup> &Fixups, 6743fa98a65SDavid Woodhouse const MCSubtargetInfo &STI) const { 675c85e3ff3SBruno Cardoso Lopes // Base register is encoded in bits 20-16, offset is encoded in bits 15-0. 676c85e3ff3SBruno Cardoso Lopes assert(MI.getOperand(OpNo).isReg()); 6773fa98a65SDavid Woodhouse unsigned RegBits = getMachineOpValue(MI, MI.getOperand(OpNo),Fixups, STI) << 16; 6783fa98a65SDavid Woodhouse unsigned OffBits = getMachineOpValue(MI, MI.getOperand(OpNo+1), Fixups, STI); 679c85e3ff3SBruno Cardoso Lopes 680c85e3ff3SBruno Cardoso Lopes return (OffBits & 0xFFFF) | RegBits; 681c85e3ff3SBruno Cardoso Lopes } 682c85e3ff3SBruno Cardoso Lopes 68397700977SJack Carter unsigned MipsMCCodeEmitter:: 684e8c9d1eaSJozef Kolek getMemEncodingMMImm4(const MCInst &MI, unsigned OpNo, 685e8c9d1eaSJozef Kolek SmallVectorImpl<MCFixup> &Fixups, 686e8c9d1eaSJozef Kolek const MCSubtargetInfo &STI) const { 687e8c9d1eaSJozef Kolek // Base register is encoded in bits 6-4, offset is encoded in bits 3-0. 688e8c9d1eaSJozef Kolek assert(MI.getOperand(OpNo).isReg()); 689e8c9d1eaSJozef Kolek unsigned RegBits = getMachineOpValue(MI, MI.getOperand(OpNo), 690e8c9d1eaSJozef Kolek Fixups, STI) << 4; 691e8c9d1eaSJozef Kolek unsigned OffBits = getMachineOpValue(MI, MI.getOperand(OpNo+1), 692e8c9d1eaSJozef Kolek Fixups, STI); 693e8c9d1eaSJozef Kolek 694e8c9d1eaSJozef Kolek return (OffBits & 0xF) | RegBits; 695e8c9d1eaSJozef Kolek } 696e8c9d1eaSJozef Kolek 697e8c9d1eaSJozef Kolek unsigned MipsMCCodeEmitter:: 698e8c9d1eaSJozef Kolek getMemEncodingMMImm4Lsl1(const MCInst &MI, unsigned OpNo, 699e8c9d1eaSJozef Kolek SmallVectorImpl<MCFixup> &Fixups, 700e8c9d1eaSJozef Kolek const MCSubtargetInfo &STI) const { 701e8c9d1eaSJozef Kolek // Base register is encoded in bits 6-4, offset is encoded in bits 3-0. 702e8c9d1eaSJozef Kolek assert(MI.getOperand(OpNo).isReg()); 703e8c9d1eaSJozef Kolek unsigned RegBits = getMachineOpValue(MI, MI.getOperand(OpNo), 704e8c9d1eaSJozef Kolek Fixups, STI) << 4; 705e8c9d1eaSJozef Kolek unsigned OffBits = getMachineOpValue(MI, MI.getOperand(OpNo+1), 706e8c9d1eaSJozef Kolek Fixups, STI) >> 1; 707e8c9d1eaSJozef Kolek 708e8c9d1eaSJozef Kolek return (OffBits & 0xF) | RegBits; 709e8c9d1eaSJozef Kolek } 710e8c9d1eaSJozef Kolek 711e8c9d1eaSJozef Kolek unsigned MipsMCCodeEmitter:: 712e8c9d1eaSJozef Kolek getMemEncodingMMImm4Lsl2(const MCInst &MI, unsigned OpNo, 713e8c9d1eaSJozef Kolek SmallVectorImpl<MCFixup> &Fixups, 714e8c9d1eaSJozef Kolek const MCSubtargetInfo &STI) const { 715e8c9d1eaSJozef Kolek // Base register is encoded in bits 6-4, offset is encoded in bits 3-0. 716e8c9d1eaSJozef Kolek assert(MI.getOperand(OpNo).isReg()); 717e8c9d1eaSJozef Kolek unsigned RegBits = getMachineOpValue(MI, MI.getOperand(OpNo), 718e8c9d1eaSJozef Kolek Fixups, STI) << 4; 719e8c9d1eaSJozef Kolek unsigned OffBits = getMachineOpValue(MI, MI.getOperand(OpNo+1), 720e8c9d1eaSJozef Kolek Fixups, STI) >> 2; 721e8c9d1eaSJozef Kolek 722e8c9d1eaSJozef Kolek return (OffBits & 0xF) | RegBits; 723e8c9d1eaSJozef Kolek } 724e8c9d1eaSJozef Kolek 725e8c9d1eaSJozef Kolek unsigned MipsMCCodeEmitter:: 72612c6982bSJozef Kolek getMemEncodingMMSPImm5Lsl2(const MCInst &MI, unsigned OpNo, 72712c6982bSJozef Kolek SmallVectorImpl<MCFixup> &Fixups, 72812c6982bSJozef Kolek const MCSubtargetInfo &STI) const { 72912c6982bSJozef Kolek // Register is encoded in bits 9-5, offset is encoded in bits 4-0. 73012c6982bSJozef Kolek assert(MI.getOperand(OpNo).isReg() && 73112c6982bSJozef Kolek MI.getOperand(OpNo).getReg() == Mips::SP && 73212c6982bSJozef Kolek "Unexpected base register!"); 73312c6982bSJozef Kolek unsigned OffBits = getMachineOpValue(MI, MI.getOperand(OpNo+1), 73412c6982bSJozef Kolek Fixups, STI) >> 2; 73512c6982bSJozef Kolek 73612c6982bSJozef Kolek return OffBits & 0x1F; 73712c6982bSJozef Kolek } 73812c6982bSJozef Kolek 73912c6982bSJozef Kolek unsigned MipsMCCodeEmitter:: 740e10a02ecSJozef Kolek getMemEncodingMMGPImm7Lsl2(const MCInst &MI, unsigned OpNo, 741e10a02ecSJozef Kolek SmallVectorImpl<MCFixup> &Fixups, 742e10a02ecSJozef Kolek const MCSubtargetInfo &STI) const { 743e10a02ecSJozef Kolek // Register is encoded in bits 9-7, offset is encoded in bits 6-0. 744e10a02ecSJozef Kolek assert(MI.getOperand(OpNo).isReg() && 745e10a02ecSJozef Kolek MI.getOperand(OpNo).getReg() == Mips::GP && 746e10a02ecSJozef Kolek "Unexpected base register!"); 747e10a02ecSJozef Kolek 748e10a02ecSJozef Kolek unsigned OffBits = getMachineOpValue(MI, MI.getOperand(OpNo+1), 749e10a02ecSJozef Kolek Fixups, STI) >> 2; 750e10a02ecSJozef Kolek 751e10a02ecSJozef Kolek return OffBits & 0x7F; 752e10a02ecSJozef Kolek } 753e10a02ecSJozef Kolek 754e10a02ecSJozef Kolek unsigned MipsMCCodeEmitter:: 75597700977SJack Carter getMemEncodingMMImm12(const MCInst &MI, unsigned OpNo, 7563fa98a65SDavid Woodhouse SmallVectorImpl<MCFixup> &Fixups, 7573fa98a65SDavid Woodhouse const MCSubtargetInfo &STI) const { 758a4c4b5fcSZoran Jovanovic // opNum can be invalid if instruction had reglist as operand. 759a4c4b5fcSZoran Jovanovic // MemOperand is always last operand of instruction (base + offset). 760a4c4b5fcSZoran Jovanovic switch (MI.getOpcode()) { 761a4c4b5fcSZoran Jovanovic default: 762a4c4b5fcSZoran Jovanovic break; 763a4c4b5fcSZoran Jovanovic case Mips::SWM32_MM: 764a4c4b5fcSZoran Jovanovic case Mips::LWM32_MM: 765a4c4b5fcSZoran Jovanovic OpNo = MI.getNumOperands() - 2; 766a4c4b5fcSZoran Jovanovic break; 767a4c4b5fcSZoran Jovanovic } 768a4c4b5fcSZoran Jovanovic 76997700977SJack Carter // Base register is encoded in bits 20-16, offset is encoded in bits 11-0. 77097700977SJack Carter assert(MI.getOperand(OpNo).isReg()); 7713fa98a65SDavid Woodhouse unsigned RegBits = getMachineOpValue(MI, MI.getOperand(OpNo), Fixups, STI) << 16; 7723fa98a65SDavid Woodhouse unsigned OffBits = getMachineOpValue(MI, MI.getOperand(OpNo+1), Fixups, STI); 77397700977SJack Carter 77497700977SJack Carter return (OffBits & 0x0FFF) | RegBits; 77597700977SJack Carter } 77697700977SJack Carter 777f9a02500SZoran Jovanovic unsigned MipsMCCodeEmitter:: 778f9a02500SZoran Jovanovic getMemEncodingMMImm4sp(const MCInst &MI, unsigned OpNo, 779f9a02500SZoran Jovanovic SmallVectorImpl<MCFixup> &Fixups, 780f9a02500SZoran Jovanovic const MCSubtargetInfo &STI) const { 781f9a02500SZoran Jovanovic // opNum can be invalid if instruction had reglist as operand 782f9a02500SZoran Jovanovic // MemOperand is always last operand of instruction (base + offset) 783f9a02500SZoran Jovanovic switch (MI.getOpcode()) { 784f9a02500SZoran Jovanovic default: 785f9a02500SZoran Jovanovic break; 786f9a02500SZoran Jovanovic case Mips::SWM16_MM: 787f9a02500SZoran Jovanovic case Mips::LWM16_MM: 788f9a02500SZoran Jovanovic OpNo = MI.getNumOperands() - 2; 789f9a02500SZoran Jovanovic break; 790f9a02500SZoran Jovanovic } 791f9a02500SZoran Jovanovic 792f9a02500SZoran Jovanovic // Offset is encoded in bits 4-0. 793f9a02500SZoran Jovanovic assert(MI.getOperand(OpNo).isReg()); 794f9a02500SZoran Jovanovic // Base register is always SP - thus it is not encoded. 795f9a02500SZoran Jovanovic assert(MI.getOperand(OpNo+1).isImm()); 796f9a02500SZoran Jovanovic unsigned OffBits = getMachineOpValue(MI, MI.getOperand(OpNo+1), Fixups, STI); 797f9a02500SZoran Jovanovic 798f9a02500SZoran Jovanovic return ((OffBits >> 2) & 0x0F); 799f9a02500SZoran Jovanovic } 800f9a02500SZoran Jovanovic 801c85e3ff3SBruno Cardoso Lopes unsigned 802c85e3ff3SBruno Cardoso Lopes MipsMCCodeEmitter::getSizeExtEncoding(const MCInst &MI, unsigned OpNo, 8033fa98a65SDavid Woodhouse SmallVectorImpl<MCFixup> &Fixups, 8043fa98a65SDavid Woodhouse const MCSubtargetInfo &STI) const { 805049e9e4dSAkira Hatanaka assert(MI.getOperand(OpNo).isImm()); 8063fa98a65SDavid Woodhouse unsigned SizeEncoding = getMachineOpValue(MI, MI.getOperand(OpNo), Fixups, STI); 80756b70de0SBruno Cardoso Lopes return SizeEncoding - 1; 808c85e3ff3SBruno Cardoso Lopes } 809c85e3ff3SBruno Cardoso Lopes 810049e9e4dSAkira Hatanaka // FIXME: should be called getMSBEncoding 811049e9e4dSAkira Hatanaka // 812c85e3ff3SBruno Cardoso Lopes unsigned 813c85e3ff3SBruno Cardoso Lopes MipsMCCodeEmitter::getSizeInsEncoding(const MCInst &MI, unsigned OpNo, 8143fa98a65SDavid Woodhouse SmallVectorImpl<MCFixup> &Fixups, 8153fa98a65SDavid Woodhouse const MCSubtargetInfo &STI) const { 816049e9e4dSAkira Hatanaka assert(MI.getOperand(OpNo-1).isImm()); 817049e9e4dSAkira Hatanaka assert(MI.getOperand(OpNo).isImm()); 8183fa98a65SDavid Woodhouse unsigned Position = getMachineOpValue(MI, MI.getOperand(OpNo-1), Fixups, STI); 8193fa98a65SDavid Woodhouse unsigned Size = getMachineOpValue(MI, MI.getOperand(OpNo), Fixups, STI); 820049e9e4dSAkira Hatanaka 82156b70de0SBruno Cardoso Lopes return Position + Size - 1; 822c85e3ff3SBruno Cardoso Lopes } 823c85e3ff3SBruno Cardoso Lopes 824779c5937SMatheus Almeida unsigned 825779c5937SMatheus Almeida MipsMCCodeEmitter::getLSAImmEncoding(const MCInst &MI, unsigned OpNo, 8263fa98a65SDavid Woodhouse SmallVectorImpl<MCFixup> &Fixups, 8273fa98a65SDavid Woodhouse const MCSubtargetInfo &STI) const { 828779c5937SMatheus Almeida assert(MI.getOperand(OpNo).isImm()); 829779c5937SMatheus Almeida // The immediate is encoded as 'immediate - 1'. 8303fa98a65SDavid Woodhouse return getMachineOpValue(MI, MI.getOperand(OpNo), Fixups, STI) - 1; 831779c5937SMatheus Almeida } 832779c5937SMatheus Almeida 833b59e1a41SDaniel Sanders unsigned 834b59e1a41SDaniel Sanders MipsMCCodeEmitter::getSimm19Lsl2Encoding(const MCInst &MI, unsigned OpNo, 835b59e1a41SDaniel Sanders SmallVectorImpl<MCFixup> &Fixups, 836b59e1a41SDaniel Sanders const MCSubtargetInfo &STI) const { 837b9c07f3bSZoran Jovanovic const MCOperand &MO = MI.getOperand(OpNo); 838b9c07f3bSZoran Jovanovic if (MO.isImm()) { 839b59e1a41SDaniel Sanders // The immediate is encoded as 'immediate << 2'. 840b9c07f3bSZoran Jovanovic unsigned Res = getMachineOpValue(MI, MO, Fixups, STI); 841b59e1a41SDaniel Sanders assert((Res & 3) == 0); 842b59e1a41SDaniel Sanders return Res >> 2; 843b59e1a41SDaniel Sanders } 844c85e3ff3SBruno Cardoso Lopes 845b9c07f3bSZoran Jovanovic assert(MO.isExpr() && 846b9c07f3bSZoran Jovanovic "getSimm19Lsl2Encoding expects only expressions or an immediate"); 847b9c07f3bSZoran Jovanovic 848b9c07f3bSZoran Jovanovic const MCExpr *Expr = MO.getExpr(); 849b9c07f3bSZoran Jovanovic Fixups.push_back(MCFixup::Create(0, Expr, 850b9c07f3bSZoran Jovanovic MCFixupKind(Mips::fixup_MIPS_PC19_S2))); 851b9c07f3bSZoran Jovanovic return 0; 852b9c07f3bSZoran Jovanovic } 853b9c07f3bSZoran Jovanovic 8542855142aSZoran Jovanovic unsigned 8552855142aSZoran Jovanovic MipsMCCodeEmitter::getSimm18Lsl3Encoding(const MCInst &MI, unsigned OpNo, 8562855142aSZoran Jovanovic SmallVectorImpl<MCFixup> &Fixups, 8572855142aSZoran Jovanovic const MCSubtargetInfo &STI) const { 858a5acdcf9SZoran Jovanovic const MCOperand &MO = MI.getOperand(OpNo); 859a5acdcf9SZoran Jovanovic if (MO.isImm()) { 8602855142aSZoran Jovanovic // The immediate is encoded as 'immediate << 3'. 8612855142aSZoran Jovanovic unsigned Res = getMachineOpValue(MI, MI.getOperand(OpNo), Fixups, STI); 8622855142aSZoran Jovanovic assert((Res & 7) == 0); 8632855142aSZoran Jovanovic return Res >> 3; 8642855142aSZoran Jovanovic } 8652855142aSZoran Jovanovic 866a5acdcf9SZoran Jovanovic assert(MO.isExpr() && 867a5acdcf9SZoran Jovanovic "getSimm18Lsl2Encoding expects only expressions or an immediate"); 868a5acdcf9SZoran Jovanovic 869a5acdcf9SZoran Jovanovic const MCExpr *Expr = MO.getExpr(); 870a5acdcf9SZoran Jovanovic Fixups.push_back(MCFixup::Create(0, Expr, 871a5acdcf9SZoran Jovanovic MCFixupKind(Mips::fixup_MIPS_PC18_S3))); 872a5acdcf9SZoran Jovanovic return 0; 873a5acdcf9SZoran Jovanovic } 874a5acdcf9SZoran Jovanovic 8754a00fdc2SZoran Jovanovic unsigned 8764a00fdc2SZoran Jovanovic MipsMCCodeEmitter::getUImm3Mod8Encoding(const MCInst &MI, unsigned OpNo, 8774a00fdc2SZoran Jovanovic SmallVectorImpl<MCFixup> &Fixups, 8784a00fdc2SZoran Jovanovic const MCSubtargetInfo &STI) const { 8794a00fdc2SZoran Jovanovic assert(MI.getOperand(OpNo).isImm()); 8804a00fdc2SZoran Jovanovic const MCOperand &MO = MI.getOperand(OpNo); 8814a00fdc2SZoran Jovanovic return MO.getImm() % 8; 8824a00fdc2SZoran Jovanovic } 8834a00fdc2SZoran Jovanovic 8848853171bSZoran Jovanovic unsigned 8858853171bSZoran Jovanovic MipsMCCodeEmitter::getUImm4AndValue(const MCInst &MI, unsigned OpNo, 8868853171bSZoran Jovanovic SmallVectorImpl<MCFixup> &Fixups, 8878853171bSZoran Jovanovic const MCSubtargetInfo &STI) const { 8888853171bSZoran Jovanovic assert(MI.getOperand(OpNo).isImm()); 8898853171bSZoran Jovanovic const MCOperand &MO = MI.getOperand(OpNo); 8908853171bSZoran Jovanovic unsigned Value = MO.getImm(); 8918853171bSZoran Jovanovic switch (Value) { 8928853171bSZoran Jovanovic case 128: return 0x0; 8938853171bSZoran Jovanovic case 1: return 0x1; 8948853171bSZoran Jovanovic case 2: return 0x2; 8958853171bSZoran Jovanovic case 3: return 0x3; 8968853171bSZoran Jovanovic case 4: return 0x4; 8978853171bSZoran Jovanovic case 7: return 0x5; 8988853171bSZoran Jovanovic case 8: return 0x6; 8998853171bSZoran Jovanovic case 15: return 0x7; 9008853171bSZoran Jovanovic case 16: return 0x8; 9018853171bSZoran Jovanovic case 31: return 0x9; 9028853171bSZoran Jovanovic case 32: return 0xa; 9038853171bSZoran Jovanovic case 63: return 0xb; 9048853171bSZoran Jovanovic case 64: return 0xc; 9058853171bSZoran Jovanovic case 255: return 0xd; 9068853171bSZoran Jovanovic case 32768: return 0xe; 9078853171bSZoran Jovanovic case 65535: return 0xf; 9088853171bSZoran Jovanovic } 9098853171bSZoran Jovanovic llvm_unreachable("Unexpected value"); 9108853171bSZoran Jovanovic } 9118853171bSZoran Jovanovic 912a4c4b5fcSZoran Jovanovic unsigned 913a4c4b5fcSZoran Jovanovic MipsMCCodeEmitter::getRegisterListOpValue(const MCInst &MI, unsigned OpNo, 914a4c4b5fcSZoran Jovanovic SmallVectorImpl<MCFixup> &Fixups, 915a4c4b5fcSZoran Jovanovic const MCSubtargetInfo &STI) const { 916a4c4b5fcSZoran Jovanovic unsigned res = 0; 917a4c4b5fcSZoran Jovanovic 918a4c4b5fcSZoran Jovanovic // Register list operand is always first operand of instruction and it is 919a4c4b5fcSZoran Jovanovic // placed before memory operand (register + imm). 920a4c4b5fcSZoran Jovanovic 921a4c4b5fcSZoran Jovanovic for (unsigned I = OpNo, E = MI.getNumOperands() - 2; I < E; ++I) { 922a4c4b5fcSZoran Jovanovic unsigned Reg = MI.getOperand(I).getReg(); 923a4c4b5fcSZoran Jovanovic unsigned RegNo = Ctx.getRegisterInfo()->getEncodingValue(Reg); 924a4c4b5fcSZoran Jovanovic if (RegNo != 31) 925a4c4b5fcSZoran Jovanovic res++; 926a4c4b5fcSZoran Jovanovic else 927a4c4b5fcSZoran Jovanovic res |= 0x10; 928a4c4b5fcSZoran Jovanovic } 929a4c4b5fcSZoran Jovanovic return res; 930a4c4b5fcSZoran Jovanovic } 931a4c4b5fcSZoran Jovanovic 932f9a02500SZoran Jovanovic unsigned 933f9a02500SZoran Jovanovic MipsMCCodeEmitter::getRegisterListOpValue16(const MCInst &MI, unsigned OpNo, 934f9a02500SZoran Jovanovic SmallVectorImpl<MCFixup> &Fixups, 935f9a02500SZoran Jovanovic const MCSubtargetInfo &STI) const { 936f9a02500SZoran Jovanovic return (MI.getNumOperands() - 4); 937f9a02500SZoran Jovanovic } 938f9a02500SZoran Jovanovic 9392deca348SZoran Jovanovic unsigned 9402deca348SZoran Jovanovic MipsMCCodeEmitter::getRegisterPairOpValue(const MCInst &MI, unsigned OpNo, 9412deca348SZoran Jovanovic SmallVectorImpl<MCFixup> &Fixups, 9422deca348SZoran Jovanovic const MCSubtargetInfo &STI) const { 9432deca348SZoran Jovanovic return getMachineOpValue(MI, MI.getOperand(OpNo), Fixups, STI); 9442deca348SZoran Jovanovic } 9452deca348SZoran Jovanovic 9462c6d7320SJozef Kolek unsigned 94741688679SZoran Jovanovic MipsMCCodeEmitter::getMovePRegPairOpValue(const MCInst &MI, unsigned OpNo, 94841688679SZoran Jovanovic SmallVectorImpl<MCFixup> &Fixups, 94941688679SZoran Jovanovic const MCSubtargetInfo &STI) const { 95041688679SZoran Jovanovic unsigned res = 0; 95141688679SZoran Jovanovic 95241688679SZoran Jovanovic if (MI.getOperand(0).getReg() == Mips::A1 && 95341688679SZoran Jovanovic MI.getOperand(1).getReg() == Mips::A2) 95441688679SZoran Jovanovic res = 0; 95541688679SZoran Jovanovic else if (MI.getOperand(0).getReg() == Mips::A1 && 95641688679SZoran Jovanovic MI.getOperand(1).getReg() == Mips::A3) 95741688679SZoran Jovanovic res = 1; 95841688679SZoran Jovanovic else if (MI.getOperand(0).getReg() == Mips::A2 && 95941688679SZoran Jovanovic MI.getOperand(1).getReg() == Mips::A3) 96041688679SZoran Jovanovic res = 2; 96141688679SZoran Jovanovic else if (MI.getOperand(0).getReg() == Mips::A0 && 96241688679SZoran Jovanovic MI.getOperand(1).getReg() == Mips::S5) 96341688679SZoran Jovanovic res = 3; 96441688679SZoran Jovanovic else if (MI.getOperand(0).getReg() == Mips::A0 && 96541688679SZoran Jovanovic MI.getOperand(1).getReg() == Mips::S6) 96641688679SZoran Jovanovic res = 4; 96741688679SZoran Jovanovic else if (MI.getOperand(0).getReg() == Mips::A0 && 96841688679SZoran Jovanovic MI.getOperand(1).getReg() == Mips::A1) 96941688679SZoran Jovanovic res = 5; 97041688679SZoran Jovanovic else if (MI.getOperand(0).getReg() == Mips::A0 && 97141688679SZoran Jovanovic MI.getOperand(1).getReg() == Mips::A2) 97241688679SZoran Jovanovic res = 6; 97341688679SZoran Jovanovic else if (MI.getOperand(0).getReg() == Mips::A0 && 97441688679SZoran Jovanovic MI.getOperand(1).getReg() == Mips::A3) 97541688679SZoran Jovanovic res = 7; 97641688679SZoran Jovanovic 97741688679SZoran Jovanovic return res; 97841688679SZoran Jovanovic } 97941688679SZoran Jovanovic 98041688679SZoran Jovanovic unsigned 9812c6d7320SJozef Kolek MipsMCCodeEmitter::getSimm23Lsl2Encoding(const MCInst &MI, unsigned OpNo, 9822c6d7320SJozef Kolek SmallVectorImpl<MCFixup> &Fixups, 9832c6d7320SJozef Kolek const MCSubtargetInfo &STI) const { 9842c6d7320SJozef Kolek const MCOperand &MO = MI.getOperand(OpNo); 9852c6d7320SJozef Kolek assert(MO.isImm() && "getSimm23Lsl2Encoding expects only an immediate"); 9862c6d7320SJozef Kolek // The immediate is encoded as 'immediate >> 2'. 9872c6d7320SJozef Kolek unsigned Res = static_cast<unsigned>(MO.getImm()); 9882c6d7320SJozef Kolek assert((Res & 3) == 0); 9892c6d7320SJozef Kolek return Res >> 2; 9902c6d7320SJozef Kolek } 9912c6d7320SJozef Kolek 992b59e1a41SDaniel Sanders #include "MipsGenMCCodeEmitter.inc" 993