1 //===-- MipsMCCodeEmitter.cpp - Convert Mips Code to Machine Code ---------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file implements the MipsMCCodeEmitter class. 11 // 12 //===----------------------------------------------------------------------===// 13 // 14 15 #include "MipsMCCodeEmitter.h" 16 #include "MCTargetDesc/MipsFixupKinds.h" 17 #include "MCTargetDesc/MipsMCExpr.h" 18 #include "MCTargetDesc/MipsMCTargetDesc.h" 19 #include "llvm/ADT/APFloat.h" 20 #include "llvm/ADT/SmallVector.h" 21 #include "llvm/MC/MCContext.h" 22 #include "llvm/MC/MCExpr.h" 23 #include "llvm/MC/MCFixup.h" 24 #include "llvm/MC/MCInst.h" 25 #include "llvm/MC/MCInstrInfo.h" 26 #include "llvm/MC/MCRegisterInfo.h" 27 #include "llvm/MC/MCSubtargetInfo.h" 28 #include "llvm/Support/raw_ostream.h" 29 30 #define DEBUG_TYPE "mccodeemitter" 31 32 #define GET_INSTRMAP_INFO 33 #include "MipsGenInstrInfo.inc" 34 #undef GET_INSTRMAP_INFO 35 36 namespace llvm { 37 MCCodeEmitter *createMipsMCCodeEmitterEB(const MCInstrInfo &MCII, 38 const MCRegisterInfo &MRI, 39 MCContext &Ctx) { 40 return new MipsMCCodeEmitter(MCII, Ctx, false); 41 } 42 43 MCCodeEmitter *createMipsMCCodeEmitterEL(const MCInstrInfo &MCII, 44 const MCRegisterInfo &MRI, 45 MCContext &Ctx) { 46 return new MipsMCCodeEmitter(MCII, Ctx, true); 47 } 48 } // End of namespace llvm. 49 50 // If the D<shift> instruction has a shift amount that is greater 51 // than 31 (checked in calling routine), lower it to a D<shift>32 instruction 52 static void LowerLargeShift(MCInst& Inst) { 53 54 assert(Inst.getNumOperands() == 3 && "Invalid no. of operands for shift!"); 55 assert(Inst.getOperand(2).isImm()); 56 57 int64_t Shift = Inst.getOperand(2).getImm(); 58 if (Shift <= 31) 59 return; // Do nothing 60 Shift -= 32; 61 62 // saminus32 63 Inst.getOperand(2).setImm(Shift); 64 65 switch (Inst.getOpcode()) { 66 default: 67 // Calling function is not synchronized 68 llvm_unreachable("Unexpected shift instruction"); 69 case Mips::DSLL: 70 Inst.setOpcode(Mips::DSLL32); 71 return; 72 case Mips::DSRL: 73 Inst.setOpcode(Mips::DSRL32); 74 return; 75 case Mips::DSRA: 76 Inst.setOpcode(Mips::DSRA32); 77 return; 78 case Mips::DROTR: 79 Inst.setOpcode(Mips::DROTR32); 80 return; 81 } 82 } 83 84 // Pick a DEXT or DINS instruction variant based on the pos and size operands 85 static void LowerDextDins(MCInst& InstIn) { 86 int Opcode = InstIn.getOpcode(); 87 88 if (Opcode == Mips::DEXT) 89 assert(InstIn.getNumOperands() == 4 && 90 "Invalid no. of machine operands for DEXT!"); 91 else // Only DEXT and DINS are possible 92 assert(InstIn.getNumOperands() == 5 && 93 "Invalid no. of machine operands for DINS!"); 94 95 assert(InstIn.getOperand(2).isImm()); 96 int64_t pos = InstIn.getOperand(2).getImm(); 97 assert(InstIn.getOperand(3).isImm()); 98 int64_t size = InstIn.getOperand(3).getImm(); 99 100 if (size <= 32) { 101 if (pos < 32) // DEXT/DINS, do nothing 102 return; 103 // DEXTU/DINSU 104 InstIn.getOperand(2).setImm(pos - 32); 105 InstIn.setOpcode((Opcode == Mips::DEXT) ? Mips::DEXTU : Mips::DINSU); 106 return; 107 } 108 // DEXTM/DINSM 109 assert(pos < 32 && "DEXT/DINS cannot have both size and pos > 32"); 110 InstIn.getOperand(3).setImm(size - 32); 111 InstIn.setOpcode((Opcode == Mips::DEXT) ? Mips::DEXTM : Mips::DINSM); 112 return; 113 } 114 115 bool MipsMCCodeEmitter::isMicroMips(const MCSubtargetInfo &STI) const { 116 return STI.getFeatureBits()[Mips::FeatureMicroMips]; 117 } 118 119 bool MipsMCCodeEmitter::isMips32r6(const MCSubtargetInfo &STI) const { 120 return STI.getFeatureBits()[Mips::FeatureMips32r6]; 121 } 122 123 void MipsMCCodeEmitter::EmitByte(unsigned char C, raw_ostream &OS) const { 124 OS << (char)C; 125 } 126 127 void MipsMCCodeEmitter::EmitInstruction(uint64_t Val, unsigned Size, 128 const MCSubtargetInfo &STI, 129 raw_ostream &OS) const { 130 // Output the instruction encoding in little endian byte order. 131 // Little-endian byte ordering: 132 // mips32r2: 4 | 3 | 2 | 1 133 // microMIPS: 2 | 1 | 4 | 3 134 if (IsLittleEndian && Size == 4 && isMicroMips(STI)) { 135 EmitInstruction(Val >> 16, 2, STI, OS); 136 EmitInstruction(Val, 2, STI, OS); 137 } else { 138 for (unsigned i = 0; i < Size; ++i) { 139 unsigned Shift = IsLittleEndian ? i * 8 : (Size - 1 - i) * 8; 140 EmitByte((Val >> Shift) & 0xff, OS); 141 } 142 } 143 } 144 145 /// encodeInstruction - Emit the instruction. 146 /// Size the instruction with Desc.getSize(). 147 void MipsMCCodeEmitter:: 148 encodeInstruction(const MCInst &MI, raw_ostream &OS, 149 SmallVectorImpl<MCFixup> &Fixups, 150 const MCSubtargetInfo &STI) const 151 { 152 153 // Non-pseudo instructions that get changed for direct object 154 // only based on operand values. 155 // If this list of instructions get much longer we will move 156 // the check to a function call. Until then, this is more efficient. 157 MCInst TmpInst = MI; 158 switch (MI.getOpcode()) { 159 // If shift amount is >= 32 it the inst needs to be lowered further 160 case Mips::DSLL: 161 case Mips::DSRL: 162 case Mips::DSRA: 163 case Mips::DROTR: 164 LowerLargeShift(TmpInst); 165 break; 166 // Double extract instruction is chosen by pos and size operands 167 case Mips::DEXT: 168 case Mips::DINS: 169 LowerDextDins(TmpInst); 170 } 171 172 unsigned long N = Fixups.size(); 173 uint32_t Binary = getBinaryCodeForInstr(TmpInst, Fixups, STI); 174 175 // Check for unimplemented opcodes. 176 // Unfortunately in MIPS both NOP and SLL will come in with Binary == 0 177 // so we have to special check for them. 178 unsigned Opcode = TmpInst.getOpcode(); 179 if ((Opcode != Mips::NOP) && (Opcode != Mips::SLL) && 180 (Opcode != Mips::SLL_MM) && !Binary) 181 llvm_unreachable("unimplemented opcode in encodeInstruction()"); 182 183 int NewOpcode = -1; 184 if (isMicroMips(STI)) { 185 if (isMips32r6(STI)) { 186 NewOpcode = Mips::MipsR62MicroMipsR6(Opcode, Mips::Arch_micromipsr6); 187 if (NewOpcode == -1) 188 NewOpcode = Mips::Std2MicroMipsR6(Opcode, Mips::Arch_micromipsr6); 189 } 190 else 191 NewOpcode = Mips::Std2MicroMips(Opcode, Mips::Arch_micromips); 192 193 // Check whether it is Dsp instruction. 194 if (NewOpcode == -1) 195 NewOpcode = Mips::Dsp2MicroMips(Opcode, Mips::Arch_mmdsp); 196 197 if (NewOpcode != -1) { 198 if (Fixups.size() > N) 199 Fixups.pop_back(); 200 201 Opcode = NewOpcode; 202 TmpInst.setOpcode (NewOpcode); 203 Binary = getBinaryCodeForInstr(TmpInst, Fixups, STI); 204 } 205 } 206 207 const MCInstrDesc &Desc = MCII.get(TmpInst.getOpcode()); 208 209 // Get byte count of instruction 210 unsigned Size = Desc.getSize(); 211 if (!Size) 212 llvm_unreachable("Desc.getSize() returns 0"); 213 214 EmitInstruction(Binary, Size, STI, OS); 215 } 216 217 /// getBranchTargetOpValue - Return binary encoding of the branch 218 /// target operand. If the machine operand requires relocation, 219 /// record the relocation and return zero. 220 unsigned MipsMCCodeEmitter:: 221 getBranchTargetOpValue(const MCInst &MI, unsigned OpNo, 222 SmallVectorImpl<MCFixup> &Fixups, 223 const MCSubtargetInfo &STI) const { 224 225 const MCOperand &MO = MI.getOperand(OpNo); 226 227 // If the destination is an immediate, divide by 4. 228 if (MO.isImm()) return MO.getImm() >> 2; 229 230 assert(MO.isExpr() && 231 "getBranchTargetOpValue expects only expressions or immediates"); 232 233 const MCExpr *FixupExpression = MCBinaryExpr::createAdd( 234 MO.getExpr(), MCConstantExpr::create(-4, Ctx), Ctx); 235 Fixups.push_back(MCFixup::create(0, FixupExpression, 236 MCFixupKind(Mips::fixup_Mips_PC16))); 237 return 0; 238 } 239 240 /// getBranchTarget7OpValueMM - Return binary encoding of the microMIPS branch 241 /// target operand. If the machine operand requires relocation, 242 /// record the relocation and return zero. 243 unsigned MipsMCCodeEmitter:: 244 getBranchTarget7OpValueMM(const MCInst &MI, unsigned OpNo, 245 SmallVectorImpl<MCFixup> &Fixups, 246 const MCSubtargetInfo &STI) const { 247 248 const MCOperand &MO = MI.getOperand(OpNo); 249 250 // If the destination is an immediate, divide by 2. 251 if (MO.isImm()) return MO.getImm() >> 1; 252 253 assert(MO.isExpr() && 254 "getBranchTargetOpValueMM expects only expressions or immediates"); 255 256 const MCExpr *Expr = MO.getExpr(); 257 Fixups.push_back(MCFixup::create(0, Expr, 258 MCFixupKind(Mips::fixup_MICROMIPS_PC7_S1))); 259 return 0; 260 } 261 262 /// getBranchTargetOpValueMMPC10 - Return binary encoding of the microMIPS 263 /// 10-bit branch target operand. If the machine operand requires relocation, 264 /// record the relocation and return zero. 265 unsigned MipsMCCodeEmitter:: 266 getBranchTargetOpValueMMPC10(const MCInst &MI, unsigned OpNo, 267 SmallVectorImpl<MCFixup> &Fixups, 268 const MCSubtargetInfo &STI) const { 269 270 const MCOperand &MO = MI.getOperand(OpNo); 271 272 // If the destination is an immediate, divide by 2. 273 if (MO.isImm()) return MO.getImm() >> 1; 274 275 assert(MO.isExpr() && 276 "getBranchTargetOpValuePC10 expects only expressions or immediates"); 277 278 const MCExpr *Expr = MO.getExpr(); 279 Fixups.push_back(MCFixup::create(0, Expr, 280 MCFixupKind(Mips::fixup_MICROMIPS_PC10_S1))); 281 return 0; 282 } 283 284 /// getBranchTargetOpValue - Return binary encoding of the microMIPS branch 285 /// target operand. If the machine operand requires relocation, 286 /// record the relocation and return zero. 287 unsigned MipsMCCodeEmitter:: 288 getBranchTargetOpValueMM(const MCInst &MI, unsigned OpNo, 289 SmallVectorImpl<MCFixup> &Fixups, 290 const MCSubtargetInfo &STI) const { 291 292 const MCOperand &MO = MI.getOperand(OpNo); 293 294 // If the destination is an immediate, divide by 2. 295 if (MO.isImm()) return MO.getImm() >> 1; 296 297 assert(MO.isExpr() && 298 "getBranchTargetOpValueMM expects only expressions or immediates"); 299 300 const MCExpr *Expr = MO.getExpr(); 301 Fixups.push_back(MCFixup::create(0, Expr, 302 MCFixupKind(Mips:: 303 fixup_MICROMIPS_PC16_S1))); 304 return 0; 305 } 306 307 /// getBranchTarget21OpValue - Return binary encoding of the branch 308 /// target operand. If the machine operand requires relocation, 309 /// record the relocation and return zero. 310 unsigned MipsMCCodeEmitter:: 311 getBranchTarget21OpValue(const MCInst &MI, unsigned OpNo, 312 SmallVectorImpl<MCFixup> &Fixups, 313 const MCSubtargetInfo &STI) const { 314 315 const MCOperand &MO = MI.getOperand(OpNo); 316 317 // If the destination is an immediate, divide by 4. 318 if (MO.isImm()) return MO.getImm() >> 2; 319 320 assert(MO.isExpr() && 321 "getBranchTarget21OpValue expects only expressions or immediates"); 322 323 const MCExpr *FixupExpression = MCBinaryExpr::createAdd( 324 MO.getExpr(), MCConstantExpr::create(-4, Ctx), Ctx); 325 Fixups.push_back(MCFixup::create(0, FixupExpression, 326 MCFixupKind(Mips::fixup_MIPS_PC21_S2))); 327 return 0; 328 } 329 330 /// getBranchTarget26OpValue - Return binary encoding of the branch 331 /// target operand. If the machine operand requires relocation, 332 /// record the relocation and return zero. 333 unsigned MipsMCCodeEmitter:: 334 getBranchTarget26OpValue(const MCInst &MI, unsigned OpNo, 335 SmallVectorImpl<MCFixup> &Fixups, 336 const MCSubtargetInfo &STI) const { 337 338 const MCOperand &MO = MI.getOperand(OpNo); 339 340 // If the destination is an immediate, divide by 4. 341 if (MO.isImm()) return MO.getImm() >> 2; 342 343 assert(MO.isExpr() && 344 "getBranchTarget26OpValue expects only expressions or immediates"); 345 346 const MCExpr *FixupExpression = MCBinaryExpr::createAdd( 347 MO.getExpr(), MCConstantExpr::create(-4, Ctx), Ctx); 348 Fixups.push_back(MCFixup::create(0, FixupExpression, 349 MCFixupKind(Mips::fixup_MIPS_PC26_S2))); 350 return 0; 351 } 352 353 /// getBranchTarget26OpValueMM - Return binary encoding of the branch 354 /// target operand. If the machine operand requires relocation, 355 /// record the relocation and return zero. 356 unsigned MipsMCCodeEmitter::getBranchTarget26OpValueMM( 357 const MCInst &MI, unsigned OpNo, SmallVectorImpl<MCFixup> &Fixups, 358 const MCSubtargetInfo &STI) const { 359 360 const MCOperand &MO = MI.getOperand(OpNo); 361 362 // If the destination is an immediate, divide by 2. 363 if (MO.isImm()) 364 return MO.getImm() >> 1; 365 366 // TODO: Push 26 PC fixup. 367 return 0; 368 } 369 370 /// getJumpOffset16OpValue - Return binary encoding of the jump 371 /// target operand. If the machine operand requires relocation, 372 /// record the relocation and return zero. 373 unsigned MipsMCCodeEmitter:: 374 getJumpOffset16OpValue(const MCInst &MI, unsigned OpNo, 375 SmallVectorImpl<MCFixup> &Fixups, 376 const MCSubtargetInfo &STI) const { 377 378 const MCOperand &MO = MI.getOperand(OpNo); 379 380 if (MO.isImm()) return MO.getImm(); 381 382 assert(MO.isExpr() && 383 "getJumpOffset16OpValue expects only expressions or an immediate"); 384 385 // TODO: Push fixup. 386 return 0; 387 } 388 389 /// getJumpTargetOpValue - Return binary encoding of the jump 390 /// target operand. If the machine operand requires relocation, 391 /// record the relocation and return zero. 392 unsigned MipsMCCodeEmitter:: 393 getJumpTargetOpValue(const MCInst &MI, unsigned OpNo, 394 SmallVectorImpl<MCFixup> &Fixups, 395 const MCSubtargetInfo &STI) const { 396 397 const MCOperand &MO = MI.getOperand(OpNo); 398 // If the destination is an immediate, divide by 4. 399 if (MO.isImm()) return MO.getImm()>>2; 400 401 assert(MO.isExpr() && 402 "getJumpTargetOpValue expects only expressions or an immediate"); 403 404 const MCExpr *Expr = MO.getExpr(); 405 Fixups.push_back(MCFixup::create(0, Expr, 406 MCFixupKind(Mips::fixup_Mips_26))); 407 return 0; 408 } 409 410 unsigned MipsMCCodeEmitter:: 411 getJumpTargetOpValueMM(const MCInst &MI, unsigned OpNo, 412 SmallVectorImpl<MCFixup> &Fixups, 413 const MCSubtargetInfo &STI) const { 414 415 const MCOperand &MO = MI.getOperand(OpNo); 416 // If the destination is an immediate, divide by 2. 417 if (MO.isImm()) return MO.getImm() >> 1; 418 419 assert(MO.isExpr() && 420 "getJumpTargetOpValueMM expects only expressions or an immediate"); 421 422 const MCExpr *Expr = MO.getExpr(); 423 Fixups.push_back(MCFixup::create(0, Expr, 424 MCFixupKind(Mips::fixup_MICROMIPS_26_S1))); 425 return 0; 426 } 427 428 unsigned MipsMCCodeEmitter:: 429 getUImm5Lsl2Encoding(const MCInst &MI, unsigned OpNo, 430 SmallVectorImpl<MCFixup> &Fixups, 431 const MCSubtargetInfo &STI) const { 432 433 const MCOperand &MO = MI.getOperand(OpNo); 434 if (MO.isImm()) { 435 // The immediate is encoded as 'immediate << 2'. 436 unsigned Res = getMachineOpValue(MI, MO, Fixups, STI); 437 assert((Res & 3) == 0); 438 return Res >> 2; 439 } 440 441 assert(MO.isExpr() && 442 "getUImm5Lsl2Encoding expects only expressions or an immediate"); 443 444 return 0; 445 } 446 447 unsigned MipsMCCodeEmitter:: 448 getSImm3Lsa2Value(const MCInst &MI, unsigned OpNo, 449 SmallVectorImpl<MCFixup> &Fixups, 450 const MCSubtargetInfo &STI) const { 451 452 const MCOperand &MO = MI.getOperand(OpNo); 453 if (MO.isImm()) { 454 int Value = MO.getImm(); 455 return Value >> 2; 456 } 457 458 return 0; 459 } 460 461 unsigned MipsMCCodeEmitter:: 462 getUImm6Lsl2Encoding(const MCInst &MI, unsigned OpNo, 463 SmallVectorImpl<MCFixup> &Fixups, 464 const MCSubtargetInfo &STI) const { 465 466 const MCOperand &MO = MI.getOperand(OpNo); 467 if (MO.isImm()) { 468 unsigned Value = MO.getImm(); 469 return Value >> 2; 470 } 471 472 return 0; 473 } 474 475 unsigned MipsMCCodeEmitter:: 476 getSImm9AddiuspValue(const MCInst &MI, unsigned OpNo, 477 SmallVectorImpl<MCFixup> &Fixups, 478 const MCSubtargetInfo &STI) const { 479 480 const MCOperand &MO = MI.getOperand(OpNo); 481 if (MO.isImm()) { 482 unsigned Binary = (MO.getImm() >> 2) & 0x0000ffff; 483 return (((Binary & 0x8000) >> 7) | (Binary & 0x00ff)); 484 } 485 486 return 0; 487 } 488 489 unsigned MipsMCCodeEmitter:: 490 getExprOpValue(const MCExpr *Expr, SmallVectorImpl<MCFixup> &Fixups, 491 const MCSubtargetInfo &STI) const { 492 int64_t Res; 493 494 if (Expr->evaluateAsAbsolute(Res)) 495 return Res; 496 497 MCExpr::ExprKind Kind = Expr->getKind(); 498 if (Kind == MCExpr::Constant) { 499 return cast<MCConstantExpr>(Expr)->getValue(); 500 } 501 502 if (Kind == MCExpr::Binary) { 503 unsigned Res = getExprOpValue(cast<MCBinaryExpr>(Expr)->getLHS(), Fixups, STI); 504 Res += getExprOpValue(cast<MCBinaryExpr>(Expr)->getRHS(), Fixups, STI); 505 return Res; 506 } 507 508 if (Kind == MCExpr::Target) { 509 const MipsMCExpr *MipsExpr = cast<MipsMCExpr>(Expr); 510 511 Mips::Fixups FixupKind = Mips::Fixups(0); 512 switch (MipsExpr->getKind()) { 513 default: llvm_unreachable("Unsupported fixup kind for target expression!"); 514 case MipsMCExpr::VK_Mips_HIGHEST: 515 FixupKind = Mips::fixup_Mips_HIGHEST; 516 break; 517 case MipsMCExpr::VK_Mips_HIGHER: 518 FixupKind = Mips::fixup_Mips_HIGHER; 519 break; 520 case MipsMCExpr::VK_Mips_HI: 521 FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_HI16 522 : Mips::fixup_Mips_HI16; 523 break; 524 case MipsMCExpr::VK_Mips_LO: 525 FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_LO16 526 : Mips::fixup_Mips_LO16; 527 break; 528 } 529 Fixups.push_back(MCFixup::create(0, MipsExpr, MCFixupKind(FixupKind))); 530 return 0; 531 } 532 533 if (Kind == MCExpr::SymbolRef) { 534 Mips::Fixups FixupKind = Mips::Fixups(0); 535 536 switch(cast<MCSymbolRefExpr>(Expr)->getKind()) { 537 default: llvm_unreachable("Unknown fixup kind!"); 538 break; 539 case MCSymbolRefExpr::VK_None: 540 FixupKind = Mips::fixup_Mips_32; // FIXME: This is ok for O32/N32 but not N64. 541 break; 542 case MCSymbolRefExpr::VK_Mips_GPOFF_HI : 543 FixupKind = Mips::fixup_Mips_GPOFF_HI; 544 break; 545 case MCSymbolRefExpr::VK_Mips_GPOFF_LO : 546 FixupKind = Mips::fixup_Mips_GPOFF_LO; 547 break; 548 case MCSymbolRefExpr::VK_Mips_GOT_PAGE : 549 FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_GOT_PAGE 550 : Mips::fixup_Mips_GOT_PAGE; 551 break; 552 case MCSymbolRefExpr::VK_Mips_GOT_OFST : 553 FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_GOT_OFST 554 : Mips::fixup_Mips_GOT_OFST; 555 break; 556 case MCSymbolRefExpr::VK_Mips_GOT_DISP : 557 FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_GOT_DISP 558 : Mips::fixup_Mips_GOT_DISP; 559 break; 560 case MCSymbolRefExpr::VK_Mips_GPREL: 561 FixupKind = Mips::fixup_Mips_GPREL16; 562 break; 563 case MCSymbolRefExpr::VK_Mips_GOT_CALL: 564 FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_CALL16 565 : Mips::fixup_Mips_CALL16; 566 break; 567 case MCSymbolRefExpr::VK_Mips_GOT16: 568 FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_GOT16 569 : Mips::fixup_Mips_GOT_Global; 570 break; 571 case MCSymbolRefExpr::VK_Mips_GOT: 572 FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_GOT16 573 : Mips::fixup_Mips_GOT_Local; 574 break; 575 case MCSymbolRefExpr::VK_Mips_ABS_HI: 576 FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_HI16 577 : Mips::fixup_Mips_HI16; 578 break; 579 case MCSymbolRefExpr::VK_Mips_ABS_LO: 580 FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_LO16 581 : Mips::fixup_Mips_LO16; 582 break; 583 case MCSymbolRefExpr::VK_Mips_TLSGD: 584 FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_TLS_GD 585 : Mips::fixup_Mips_TLSGD; 586 break; 587 case MCSymbolRefExpr::VK_Mips_TLSLDM: 588 FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_TLS_LDM 589 : Mips::fixup_Mips_TLSLDM; 590 break; 591 case MCSymbolRefExpr::VK_Mips_DTPREL_HI: 592 FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_TLS_DTPREL_HI16 593 : Mips::fixup_Mips_DTPREL_HI; 594 break; 595 case MCSymbolRefExpr::VK_Mips_DTPREL_LO: 596 FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_TLS_DTPREL_LO16 597 : Mips::fixup_Mips_DTPREL_LO; 598 break; 599 case MCSymbolRefExpr::VK_Mips_GOTTPREL: 600 FixupKind = Mips::fixup_Mips_GOTTPREL; 601 break; 602 case MCSymbolRefExpr::VK_Mips_TPREL_HI: 603 FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_TLS_TPREL_HI16 604 : Mips::fixup_Mips_TPREL_HI; 605 break; 606 case MCSymbolRefExpr::VK_Mips_TPREL_LO: 607 FixupKind = isMicroMips(STI) ? Mips::fixup_MICROMIPS_TLS_TPREL_LO16 608 : Mips::fixup_Mips_TPREL_LO; 609 break; 610 case MCSymbolRefExpr::VK_Mips_HIGHER: 611 FixupKind = Mips::fixup_Mips_HIGHER; 612 break; 613 case MCSymbolRefExpr::VK_Mips_HIGHEST: 614 FixupKind = Mips::fixup_Mips_HIGHEST; 615 break; 616 case MCSymbolRefExpr::VK_Mips_GOT_HI16: 617 FixupKind = Mips::fixup_Mips_GOT_HI16; 618 break; 619 case MCSymbolRefExpr::VK_Mips_GOT_LO16: 620 FixupKind = Mips::fixup_Mips_GOT_LO16; 621 break; 622 case MCSymbolRefExpr::VK_Mips_CALL_HI16: 623 FixupKind = Mips::fixup_Mips_CALL_HI16; 624 break; 625 case MCSymbolRefExpr::VK_Mips_CALL_LO16: 626 FixupKind = Mips::fixup_Mips_CALL_LO16; 627 break; 628 case MCSymbolRefExpr::VK_Mips_PCREL_HI16: 629 FixupKind = Mips::fixup_MIPS_PCHI16; 630 break; 631 case MCSymbolRefExpr::VK_Mips_PCREL_LO16: 632 FixupKind = Mips::fixup_MIPS_PCLO16; 633 break; 634 } // switch 635 636 Fixups.push_back(MCFixup::create(0, Expr, MCFixupKind(FixupKind))); 637 return 0; 638 } 639 return 0; 640 } 641 642 /// getMachineOpValue - Return binary encoding of operand. If the machine 643 /// operand requires relocation, record the relocation and return zero. 644 unsigned MipsMCCodeEmitter:: 645 getMachineOpValue(const MCInst &MI, const MCOperand &MO, 646 SmallVectorImpl<MCFixup> &Fixups, 647 const MCSubtargetInfo &STI) const { 648 if (MO.isReg()) { 649 unsigned Reg = MO.getReg(); 650 unsigned RegNo = Ctx.getRegisterInfo()->getEncodingValue(Reg); 651 return RegNo; 652 } else if (MO.isImm()) { 653 return static_cast<unsigned>(MO.getImm()); 654 } else if (MO.isFPImm()) { 655 return static_cast<unsigned>(APFloat(MO.getFPImm()) 656 .bitcastToAPInt().getHiBits(32).getLimitedValue()); 657 } 658 // MO must be an Expr. 659 assert(MO.isExpr()); 660 return getExprOpValue(MO.getExpr(),Fixups, STI); 661 } 662 663 /// getMSAMemEncoding - Return binary encoding of memory operand for LD/ST 664 /// instructions. 665 unsigned 666 MipsMCCodeEmitter::getMSAMemEncoding(const MCInst &MI, unsigned OpNo, 667 SmallVectorImpl<MCFixup> &Fixups, 668 const MCSubtargetInfo &STI) const { 669 // Base register is encoded in bits 20-16, offset is encoded in bits 15-0. 670 assert(MI.getOperand(OpNo).isReg()); 671 unsigned RegBits = getMachineOpValue(MI, MI.getOperand(OpNo),Fixups, STI) << 16; 672 unsigned OffBits = getMachineOpValue(MI, MI.getOperand(OpNo+1), Fixups, STI); 673 674 // The immediate field of an LD/ST instruction is scaled which means it must 675 // be divided (when encoding) by the size (in bytes) of the instructions' 676 // data format. 677 // .b - 1 byte 678 // .h - 2 bytes 679 // .w - 4 bytes 680 // .d - 8 bytes 681 switch(MI.getOpcode()) 682 { 683 default: 684 assert (0 && "Unexpected instruction"); 685 break; 686 case Mips::LD_B: 687 case Mips::ST_B: 688 // We don't need to scale the offset in this case 689 break; 690 case Mips::LD_H: 691 case Mips::ST_H: 692 OffBits >>= 1; 693 break; 694 case Mips::LD_W: 695 case Mips::ST_W: 696 OffBits >>= 2; 697 break; 698 case Mips::LD_D: 699 case Mips::ST_D: 700 OffBits >>= 3; 701 break; 702 } 703 704 return (OffBits & 0xFFFF) | RegBits; 705 } 706 707 /// getMemEncoding - Return binary encoding of memory related operand. 708 /// If the offset operand requires relocation, record the relocation. 709 unsigned 710 MipsMCCodeEmitter::getMemEncoding(const MCInst &MI, unsigned OpNo, 711 SmallVectorImpl<MCFixup> &Fixups, 712 const MCSubtargetInfo &STI) const { 713 // Base register is encoded in bits 20-16, offset is encoded in bits 15-0. 714 assert(MI.getOperand(OpNo).isReg()); 715 unsigned RegBits = getMachineOpValue(MI, MI.getOperand(OpNo),Fixups, STI) << 16; 716 unsigned OffBits = getMachineOpValue(MI, MI.getOperand(OpNo+1), Fixups, STI); 717 718 return (OffBits & 0xFFFF) | RegBits; 719 } 720 721 unsigned MipsMCCodeEmitter:: 722 getMemEncodingMMImm4(const MCInst &MI, unsigned OpNo, 723 SmallVectorImpl<MCFixup> &Fixups, 724 const MCSubtargetInfo &STI) const { 725 // Base register is encoded in bits 6-4, offset is encoded in bits 3-0. 726 assert(MI.getOperand(OpNo).isReg()); 727 unsigned RegBits = getMachineOpValue(MI, MI.getOperand(OpNo), 728 Fixups, STI) << 4; 729 unsigned OffBits = getMachineOpValue(MI, MI.getOperand(OpNo+1), 730 Fixups, STI); 731 732 return (OffBits & 0xF) | RegBits; 733 } 734 735 unsigned MipsMCCodeEmitter:: 736 getMemEncodingMMImm4Lsl1(const MCInst &MI, unsigned OpNo, 737 SmallVectorImpl<MCFixup> &Fixups, 738 const MCSubtargetInfo &STI) const { 739 // Base register is encoded in bits 6-4, offset is encoded in bits 3-0. 740 assert(MI.getOperand(OpNo).isReg()); 741 unsigned RegBits = getMachineOpValue(MI, MI.getOperand(OpNo), 742 Fixups, STI) << 4; 743 unsigned OffBits = getMachineOpValue(MI, MI.getOperand(OpNo+1), 744 Fixups, STI) >> 1; 745 746 return (OffBits & 0xF) | RegBits; 747 } 748 749 unsigned MipsMCCodeEmitter:: 750 getMemEncodingMMImm4Lsl2(const MCInst &MI, unsigned OpNo, 751 SmallVectorImpl<MCFixup> &Fixups, 752 const MCSubtargetInfo &STI) const { 753 // Base register is encoded in bits 6-4, offset is encoded in bits 3-0. 754 assert(MI.getOperand(OpNo).isReg()); 755 unsigned RegBits = getMachineOpValue(MI, MI.getOperand(OpNo), 756 Fixups, STI) << 4; 757 unsigned OffBits = getMachineOpValue(MI, MI.getOperand(OpNo+1), 758 Fixups, STI) >> 2; 759 760 return (OffBits & 0xF) | RegBits; 761 } 762 763 unsigned MipsMCCodeEmitter:: 764 getMemEncodingMMSPImm5Lsl2(const MCInst &MI, unsigned OpNo, 765 SmallVectorImpl<MCFixup> &Fixups, 766 const MCSubtargetInfo &STI) const { 767 // Register is encoded in bits 9-5, offset is encoded in bits 4-0. 768 assert(MI.getOperand(OpNo).isReg() && 769 (MI.getOperand(OpNo).getReg() == Mips::SP || 770 MI.getOperand(OpNo).getReg() == Mips::SP_64) && 771 "Unexpected base register!"); 772 unsigned OffBits = getMachineOpValue(MI, MI.getOperand(OpNo+1), 773 Fixups, STI) >> 2; 774 775 return OffBits & 0x1F; 776 } 777 778 unsigned MipsMCCodeEmitter:: 779 getMemEncodingMMGPImm7Lsl2(const MCInst &MI, unsigned OpNo, 780 SmallVectorImpl<MCFixup> &Fixups, 781 const MCSubtargetInfo &STI) const { 782 // Register is encoded in bits 9-7, offset is encoded in bits 6-0. 783 assert(MI.getOperand(OpNo).isReg() && 784 MI.getOperand(OpNo).getReg() == Mips::GP && 785 "Unexpected base register!"); 786 787 unsigned OffBits = getMachineOpValue(MI, MI.getOperand(OpNo+1), 788 Fixups, STI) >> 2; 789 790 return OffBits & 0x7F; 791 } 792 793 unsigned MipsMCCodeEmitter:: 794 getMemEncodingMMImm9(const MCInst &MI, unsigned OpNo, 795 SmallVectorImpl<MCFixup> &Fixups, 796 const MCSubtargetInfo &STI) const { 797 // Base register is encoded in bits 20-16, offset is encoded in bits 8-0. 798 assert(MI.getOperand(OpNo).isReg()); 799 unsigned RegBits = getMachineOpValue(MI, MI.getOperand(OpNo), Fixups, 800 STI) << 16; 801 unsigned OffBits = getMachineOpValue(MI, MI.getOperand(OpNo + 1), Fixups, STI); 802 803 return (OffBits & 0x1FF) | RegBits; 804 } 805 806 unsigned MipsMCCodeEmitter:: 807 getMemEncodingMMImm12(const MCInst &MI, unsigned OpNo, 808 SmallVectorImpl<MCFixup> &Fixups, 809 const MCSubtargetInfo &STI) const { 810 // opNum can be invalid if instruction had reglist as operand. 811 // MemOperand is always last operand of instruction (base + offset). 812 switch (MI.getOpcode()) { 813 default: 814 break; 815 case Mips::SWM32_MM: 816 case Mips::LWM32_MM: 817 OpNo = MI.getNumOperands() - 2; 818 break; 819 } 820 821 // Base register is encoded in bits 20-16, offset is encoded in bits 11-0. 822 assert(MI.getOperand(OpNo).isReg()); 823 unsigned RegBits = getMachineOpValue(MI, MI.getOperand(OpNo), Fixups, STI) << 16; 824 unsigned OffBits = getMachineOpValue(MI, MI.getOperand(OpNo+1), Fixups, STI); 825 826 return (OffBits & 0x0FFF) | RegBits; 827 } 828 829 unsigned MipsMCCodeEmitter:: 830 getMemEncodingMMImm16(const MCInst &MI, unsigned OpNo, 831 SmallVectorImpl<MCFixup> &Fixups, 832 const MCSubtargetInfo &STI) const { 833 // Base register is encoded in bits 20-16, offset is encoded in bits 15-0. 834 assert(MI.getOperand(OpNo).isReg()); 835 unsigned RegBits = getMachineOpValue(MI, MI.getOperand(OpNo), Fixups, 836 STI) << 16; 837 unsigned OffBits = getMachineOpValue(MI, MI.getOperand(OpNo+1), Fixups, STI); 838 839 return (OffBits & 0xFFFF) | RegBits; 840 } 841 842 unsigned MipsMCCodeEmitter:: 843 getMemEncodingMMImm4sp(const MCInst &MI, unsigned OpNo, 844 SmallVectorImpl<MCFixup> &Fixups, 845 const MCSubtargetInfo &STI) const { 846 // opNum can be invalid if instruction had reglist as operand 847 // MemOperand is always last operand of instruction (base + offset) 848 switch (MI.getOpcode()) { 849 default: 850 break; 851 case Mips::SWM16_MM: 852 case Mips::SWM16_MMR6: 853 case Mips::LWM16_MM: 854 case Mips::LWM16_MMR6: 855 OpNo = MI.getNumOperands() - 2; 856 break; 857 } 858 859 // Offset is encoded in bits 4-0. 860 assert(MI.getOperand(OpNo).isReg()); 861 // Base register is always SP - thus it is not encoded. 862 assert(MI.getOperand(OpNo+1).isImm()); 863 unsigned OffBits = getMachineOpValue(MI, MI.getOperand(OpNo+1), Fixups, STI); 864 865 return ((OffBits >> 2) & 0x0F); 866 } 867 868 // FIXME: should be called getMSBEncoding 869 // 870 unsigned 871 MipsMCCodeEmitter::getSizeInsEncoding(const MCInst &MI, unsigned OpNo, 872 SmallVectorImpl<MCFixup> &Fixups, 873 const MCSubtargetInfo &STI) const { 874 assert(MI.getOperand(OpNo-1).isImm()); 875 assert(MI.getOperand(OpNo).isImm()); 876 unsigned Position = getMachineOpValue(MI, MI.getOperand(OpNo-1), Fixups, STI); 877 unsigned Size = getMachineOpValue(MI, MI.getOperand(OpNo), Fixups, STI); 878 879 return Position + Size - 1; 880 } 881 882 template <unsigned Bits, int Offset> 883 unsigned 884 MipsMCCodeEmitter::getUImmWithOffsetEncoding(const MCInst &MI, unsigned OpNo, 885 SmallVectorImpl<MCFixup> &Fixups, 886 const MCSubtargetInfo &STI) const { 887 assert(MI.getOperand(OpNo).isImm()); 888 unsigned Value = getMachineOpValue(MI, MI.getOperand(OpNo), Fixups, STI); 889 Value -= Offset; 890 return Value; 891 } 892 893 unsigned 894 MipsMCCodeEmitter::getSimm19Lsl2Encoding(const MCInst &MI, unsigned OpNo, 895 SmallVectorImpl<MCFixup> &Fixups, 896 const MCSubtargetInfo &STI) const { 897 const MCOperand &MO = MI.getOperand(OpNo); 898 if (MO.isImm()) { 899 // The immediate is encoded as 'immediate << 2'. 900 unsigned Res = getMachineOpValue(MI, MO, Fixups, STI); 901 assert((Res & 3) == 0); 902 return Res >> 2; 903 } 904 905 assert(MO.isExpr() && 906 "getSimm19Lsl2Encoding expects only expressions or an immediate"); 907 908 const MCExpr *Expr = MO.getExpr(); 909 Fixups.push_back(MCFixup::create(0, Expr, 910 MCFixupKind(Mips::fixup_MIPS_PC19_S2))); 911 return 0; 912 } 913 914 unsigned 915 MipsMCCodeEmitter::getSimm18Lsl3Encoding(const MCInst &MI, unsigned OpNo, 916 SmallVectorImpl<MCFixup> &Fixups, 917 const MCSubtargetInfo &STI) const { 918 const MCOperand &MO = MI.getOperand(OpNo); 919 if (MO.isImm()) { 920 // The immediate is encoded as 'immediate << 3'. 921 unsigned Res = getMachineOpValue(MI, MI.getOperand(OpNo), Fixups, STI); 922 assert((Res & 7) == 0); 923 return Res >> 3; 924 } 925 926 assert(MO.isExpr() && 927 "getSimm18Lsl2Encoding expects only expressions or an immediate"); 928 929 const MCExpr *Expr = MO.getExpr(); 930 Fixups.push_back(MCFixup::create(0, Expr, 931 MCFixupKind(Mips::fixup_MIPS_PC18_S3))); 932 return 0; 933 } 934 935 unsigned 936 MipsMCCodeEmitter::getUImm3Mod8Encoding(const MCInst &MI, unsigned OpNo, 937 SmallVectorImpl<MCFixup> &Fixups, 938 const MCSubtargetInfo &STI) const { 939 assert(MI.getOperand(OpNo).isImm()); 940 const MCOperand &MO = MI.getOperand(OpNo); 941 return MO.getImm() % 8; 942 } 943 944 unsigned 945 MipsMCCodeEmitter::getUImm4AndValue(const MCInst &MI, unsigned OpNo, 946 SmallVectorImpl<MCFixup> &Fixups, 947 const MCSubtargetInfo &STI) const { 948 assert(MI.getOperand(OpNo).isImm()); 949 const MCOperand &MO = MI.getOperand(OpNo); 950 unsigned Value = MO.getImm(); 951 switch (Value) { 952 case 128: return 0x0; 953 case 1: return 0x1; 954 case 2: return 0x2; 955 case 3: return 0x3; 956 case 4: return 0x4; 957 case 7: return 0x5; 958 case 8: return 0x6; 959 case 15: return 0x7; 960 case 16: return 0x8; 961 case 31: return 0x9; 962 case 32: return 0xa; 963 case 63: return 0xb; 964 case 64: return 0xc; 965 case 255: return 0xd; 966 case 32768: return 0xe; 967 case 65535: return 0xf; 968 } 969 llvm_unreachable("Unexpected value"); 970 } 971 972 unsigned 973 MipsMCCodeEmitter::getRegisterListOpValue(const MCInst &MI, unsigned OpNo, 974 SmallVectorImpl<MCFixup> &Fixups, 975 const MCSubtargetInfo &STI) const { 976 unsigned res = 0; 977 978 // Register list operand is always first operand of instruction and it is 979 // placed before memory operand (register + imm). 980 981 for (unsigned I = OpNo, E = MI.getNumOperands() - 2; I < E; ++I) { 982 unsigned Reg = MI.getOperand(I).getReg(); 983 unsigned RegNo = Ctx.getRegisterInfo()->getEncodingValue(Reg); 984 if (RegNo != 31) 985 res++; 986 else 987 res |= 0x10; 988 } 989 return res; 990 } 991 992 unsigned 993 MipsMCCodeEmitter::getRegisterListOpValue16(const MCInst &MI, unsigned OpNo, 994 SmallVectorImpl<MCFixup> &Fixups, 995 const MCSubtargetInfo &STI) const { 996 return (MI.getNumOperands() - 4); 997 } 998 999 unsigned 1000 MipsMCCodeEmitter::getRegisterPairOpValue(const MCInst &MI, unsigned OpNo, 1001 SmallVectorImpl<MCFixup> &Fixups, 1002 const MCSubtargetInfo &STI) const { 1003 return getMachineOpValue(MI, MI.getOperand(OpNo), Fixups, STI); 1004 } 1005 1006 unsigned 1007 MipsMCCodeEmitter::getMovePRegPairOpValue(const MCInst &MI, unsigned OpNo, 1008 SmallVectorImpl<MCFixup> &Fixups, 1009 const MCSubtargetInfo &STI) const { 1010 unsigned res = 0; 1011 1012 if (MI.getOperand(0).getReg() == Mips::A1 && 1013 MI.getOperand(1).getReg() == Mips::A2) 1014 res = 0; 1015 else if (MI.getOperand(0).getReg() == Mips::A1 && 1016 MI.getOperand(1).getReg() == Mips::A3) 1017 res = 1; 1018 else if (MI.getOperand(0).getReg() == Mips::A2 && 1019 MI.getOperand(1).getReg() == Mips::A3) 1020 res = 2; 1021 else if (MI.getOperand(0).getReg() == Mips::A0 && 1022 MI.getOperand(1).getReg() == Mips::S5) 1023 res = 3; 1024 else if (MI.getOperand(0).getReg() == Mips::A0 && 1025 MI.getOperand(1).getReg() == Mips::S6) 1026 res = 4; 1027 else if (MI.getOperand(0).getReg() == Mips::A0 && 1028 MI.getOperand(1).getReg() == Mips::A1) 1029 res = 5; 1030 else if (MI.getOperand(0).getReg() == Mips::A0 && 1031 MI.getOperand(1).getReg() == Mips::A2) 1032 res = 6; 1033 else if (MI.getOperand(0).getReg() == Mips::A0 && 1034 MI.getOperand(1).getReg() == Mips::A3) 1035 res = 7; 1036 1037 return res; 1038 } 1039 1040 unsigned 1041 MipsMCCodeEmitter::getSimm23Lsl2Encoding(const MCInst &MI, unsigned OpNo, 1042 SmallVectorImpl<MCFixup> &Fixups, 1043 const MCSubtargetInfo &STI) const { 1044 const MCOperand &MO = MI.getOperand(OpNo); 1045 assert(MO.isImm() && "getSimm23Lsl2Encoding expects only an immediate"); 1046 // The immediate is encoded as 'immediate >> 2'. 1047 unsigned Res = static_cast<unsigned>(MO.getImm()); 1048 assert((Res & 3) == 0); 1049 return Res >> 2; 1050 } 1051 1052 #include "MipsGenMCCodeEmitter.inc" 1053