1cf78715cSZi Xuan Wu //===-- CSKYInstrInfo.h - CSKY Instruction Information --------*- C++ -*---===//
2cf78715cSZi Xuan Wu //
3cf78715cSZi Xuan Wu // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4cf78715cSZi Xuan Wu // See https://llvm.org/LICENSE.txt for license information.
5cf78715cSZi Xuan Wu // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6cf78715cSZi Xuan Wu //
7cf78715cSZi Xuan Wu //===----------------------------------------------------------------------===//
8cf78715cSZi Xuan Wu //
9cf78715cSZi Xuan Wu // This file contains the CSKY implementation of the TargetInstrInfo class.
10cf78715cSZi Xuan Wu //
11cf78715cSZi Xuan Wu //===----------------------------------------------------------------------===//
12cf78715cSZi Xuan Wu 
13cf78715cSZi Xuan Wu #include "CSKYInstrInfo.h"
148ddc8169SZi Xuan Wu #include "CSKYConstantPoolValue.h"
15a556ec88SZi Xuan Wu #include "CSKYMachineFunctionInfo.h"
16a556ec88SZi Xuan Wu #include "CSKYTargetMachine.h"
17989f1c72Sserge-sans-paille #include "llvm/CodeGen/MachineFrameInfo.h"
18cf78715cSZi Xuan Wu #include "llvm/MC/MCContext.h"
19cf78715cSZi Xuan Wu 
20cf78715cSZi Xuan Wu #define DEBUG_TYPE "csky-instr-info"
21cf78715cSZi Xuan Wu 
22cf78715cSZi Xuan Wu using namespace llvm;
23cf78715cSZi Xuan Wu 
24cf78715cSZi Xuan Wu #define GET_INSTRINFO_CTOR_DTOR
25cf78715cSZi Xuan Wu #include "CSKYGenInstrInfo.inc"
26cf78715cSZi Xuan Wu 
CSKYInstrInfo(CSKYSubtarget & STI)27cf78715cSZi Xuan Wu CSKYInstrInfo::CSKYInstrInfo(CSKYSubtarget &STI)
28cf78715cSZi Xuan Wu     : CSKYGenInstrInfo(CSKY::ADJCALLSTACKDOWN, CSKY::ADJCALLSTACKUP), STI(STI) {
294ad517e6SZi Xuan Wu   v2sf = STI.hasFPUv2SingleFloat();
304ad517e6SZi Xuan Wu   v2df = STI.hasFPUv2DoubleFloat();
314ad517e6SZi Xuan Wu   v3sf = STI.hasFPUv3SingleFloat();
324ad517e6SZi Xuan Wu   v3df = STI.hasFPUv3DoubleFloat();
33cf78715cSZi Xuan Wu }
34a556ec88SZi Xuan Wu 
parseCondBranch(MachineInstr & LastInst,MachineBasicBlock * & Target,SmallVectorImpl<MachineOperand> & Cond)359566cf16SZi Xuan Wu static void parseCondBranch(MachineInstr &LastInst, MachineBasicBlock *&Target,
369566cf16SZi Xuan Wu                             SmallVectorImpl<MachineOperand> &Cond) {
379566cf16SZi Xuan Wu   // Block ends with fall-through condbranch.
389566cf16SZi Xuan Wu   assert(LastInst.getDesc().isConditionalBranch() &&
399566cf16SZi Xuan Wu          "Unknown conditional branch");
409566cf16SZi Xuan Wu   Target = LastInst.getOperand(1).getMBB();
419566cf16SZi Xuan Wu   Cond.push_back(MachineOperand::CreateImm(LastInst.getOpcode()));
429566cf16SZi Xuan Wu   Cond.push_back(LastInst.getOperand(0));
439566cf16SZi Xuan Wu }
449566cf16SZi Xuan Wu 
analyzeBranch(MachineBasicBlock & MBB,MachineBasicBlock * & TBB,MachineBasicBlock * & FBB,SmallVectorImpl<MachineOperand> & Cond,bool AllowModify) const459566cf16SZi Xuan Wu bool CSKYInstrInfo::analyzeBranch(MachineBasicBlock &MBB,
469566cf16SZi Xuan Wu                                   MachineBasicBlock *&TBB,
479566cf16SZi Xuan Wu                                   MachineBasicBlock *&FBB,
489566cf16SZi Xuan Wu                                   SmallVectorImpl<MachineOperand> &Cond,
499566cf16SZi Xuan Wu                                   bool AllowModify) const {
509566cf16SZi Xuan Wu   TBB = FBB = nullptr;
519566cf16SZi Xuan Wu   Cond.clear();
529566cf16SZi Xuan Wu 
539566cf16SZi Xuan Wu   // If the block has no terminators, it just falls into the block after it.
549566cf16SZi Xuan Wu   MachineBasicBlock::iterator I = MBB.getLastNonDebugInstr();
559566cf16SZi Xuan Wu   if (I == MBB.end() || !isUnpredicatedTerminator(*I))
569566cf16SZi Xuan Wu     return false;
579566cf16SZi Xuan Wu 
589566cf16SZi Xuan Wu   // Count the number of terminators and find the first unconditional or
599566cf16SZi Xuan Wu   // indirect branch.
609566cf16SZi Xuan Wu   MachineBasicBlock::iterator FirstUncondOrIndirectBr = MBB.end();
619566cf16SZi Xuan Wu   int NumTerminators = 0;
629566cf16SZi Xuan Wu   for (auto J = I.getReverse(); J != MBB.rend() && isUnpredicatedTerminator(*J);
639566cf16SZi Xuan Wu        J++) {
649566cf16SZi Xuan Wu     NumTerminators++;
659566cf16SZi Xuan Wu     if (J->getDesc().isUnconditionalBranch() ||
669566cf16SZi Xuan Wu         J->getDesc().isIndirectBranch()) {
679566cf16SZi Xuan Wu       FirstUncondOrIndirectBr = J.getReverse();
689566cf16SZi Xuan Wu     }
699566cf16SZi Xuan Wu   }
709566cf16SZi Xuan Wu 
719566cf16SZi Xuan Wu   // If AllowModify is true, we can erase any terminators after
729566cf16SZi Xuan Wu   // FirstUncondOrIndirectBR.
739566cf16SZi Xuan Wu   if (AllowModify && FirstUncondOrIndirectBr != MBB.end()) {
749566cf16SZi Xuan Wu     while (std::next(FirstUncondOrIndirectBr) != MBB.end()) {
759566cf16SZi Xuan Wu       std::next(FirstUncondOrIndirectBr)->eraseFromParent();
769566cf16SZi Xuan Wu       NumTerminators--;
779566cf16SZi Xuan Wu     }
789566cf16SZi Xuan Wu     I = FirstUncondOrIndirectBr;
799566cf16SZi Xuan Wu   }
809566cf16SZi Xuan Wu 
819566cf16SZi Xuan Wu   // We can't handle blocks that end in an indirect branch.
829566cf16SZi Xuan Wu   if (I->getDesc().isIndirectBranch())
839566cf16SZi Xuan Wu     return true;
849566cf16SZi Xuan Wu 
859566cf16SZi Xuan Wu   // We can't handle blocks with more than 2 terminators.
869566cf16SZi Xuan Wu   if (NumTerminators > 2)
879566cf16SZi Xuan Wu     return true;
889566cf16SZi Xuan Wu 
899566cf16SZi Xuan Wu   // Handle a single unconditional branch.
909566cf16SZi Xuan Wu   if (NumTerminators == 1 && I->getDesc().isUnconditionalBranch()) {
919566cf16SZi Xuan Wu     TBB = getBranchDestBlock(*I);
929566cf16SZi Xuan Wu     return false;
939566cf16SZi Xuan Wu   }
949566cf16SZi Xuan Wu 
959566cf16SZi Xuan Wu   // Handle a single conditional branch.
969566cf16SZi Xuan Wu   if (NumTerminators == 1 && I->getDesc().isConditionalBranch()) {
979566cf16SZi Xuan Wu     parseCondBranch(*I, TBB, Cond);
989566cf16SZi Xuan Wu     return false;
999566cf16SZi Xuan Wu   }
1009566cf16SZi Xuan Wu 
1019566cf16SZi Xuan Wu   // Handle a conditional branch followed by an unconditional branch.
1029566cf16SZi Xuan Wu   if (NumTerminators == 2 && std::prev(I)->getDesc().isConditionalBranch() &&
1039566cf16SZi Xuan Wu       I->getDesc().isUnconditionalBranch()) {
1049566cf16SZi Xuan Wu     parseCondBranch(*std::prev(I), TBB, Cond);
1059566cf16SZi Xuan Wu     FBB = getBranchDestBlock(*I);
1069566cf16SZi Xuan Wu     return false;
1079566cf16SZi Xuan Wu   }
1089566cf16SZi Xuan Wu 
1099566cf16SZi Xuan Wu   // Otherwise, we can't handle this.
1109566cf16SZi Xuan Wu   return true;
1119566cf16SZi Xuan Wu }
1129566cf16SZi Xuan Wu 
removeBranch(MachineBasicBlock & MBB,int * BytesRemoved) const1139566cf16SZi Xuan Wu unsigned CSKYInstrInfo::removeBranch(MachineBasicBlock &MBB,
1149566cf16SZi Xuan Wu                                      int *BytesRemoved) const {
1159566cf16SZi Xuan Wu   if (BytesRemoved)
1169566cf16SZi Xuan Wu     *BytesRemoved = 0;
1179566cf16SZi Xuan Wu   MachineBasicBlock::iterator I = MBB.getLastNonDebugInstr();
1189566cf16SZi Xuan Wu   if (I == MBB.end())
1199566cf16SZi Xuan Wu     return 0;
1209566cf16SZi Xuan Wu 
1219566cf16SZi Xuan Wu   if (!I->getDesc().isUnconditionalBranch() &&
1229566cf16SZi Xuan Wu       !I->getDesc().isConditionalBranch())
1239566cf16SZi Xuan Wu     return 0;
1249566cf16SZi Xuan Wu 
1259566cf16SZi Xuan Wu   // Remove the branch.
1269566cf16SZi Xuan Wu   if (BytesRemoved)
1279566cf16SZi Xuan Wu     *BytesRemoved += getInstSizeInBytes(*I);
1289566cf16SZi Xuan Wu   I->eraseFromParent();
1299566cf16SZi Xuan Wu 
1309566cf16SZi Xuan Wu   I = MBB.end();
1319566cf16SZi Xuan Wu 
1329566cf16SZi Xuan Wu   if (I == MBB.begin())
1339566cf16SZi Xuan Wu     return 1;
1349566cf16SZi Xuan Wu   --I;
1359566cf16SZi Xuan Wu   if (!I->getDesc().isConditionalBranch())
1369566cf16SZi Xuan Wu     return 1;
1379566cf16SZi Xuan Wu 
1389566cf16SZi Xuan Wu   // Remove the branch.
1399566cf16SZi Xuan Wu   if (BytesRemoved)
1409566cf16SZi Xuan Wu     *BytesRemoved += getInstSizeInBytes(*I);
1419566cf16SZi Xuan Wu   I->eraseFromParent();
1429566cf16SZi Xuan Wu   return 2;
1439566cf16SZi Xuan Wu }
1449566cf16SZi Xuan Wu 
1459566cf16SZi Xuan Wu MachineBasicBlock *
getBranchDestBlock(const MachineInstr & MI) const1469566cf16SZi Xuan Wu CSKYInstrInfo::getBranchDestBlock(const MachineInstr &MI) const {
1479566cf16SZi Xuan Wu   assert(MI.getDesc().isBranch() && "Unexpected opcode!");
1489566cf16SZi Xuan Wu   // The branch target is always the last operand.
1499566cf16SZi Xuan Wu   int NumOp = MI.getNumExplicitOperands();
1509566cf16SZi Xuan Wu   assert(MI.getOperand(NumOp - 1).isMBB() && "Expected MBB!");
1519566cf16SZi Xuan Wu   return MI.getOperand(NumOp - 1).getMBB();
1529566cf16SZi Xuan Wu }
1539566cf16SZi Xuan Wu 
insertBranch(MachineBasicBlock & MBB,MachineBasicBlock * TBB,MachineBasicBlock * FBB,ArrayRef<MachineOperand> Cond,const DebugLoc & DL,int * BytesAdded) const1549566cf16SZi Xuan Wu unsigned CSKYInstrInfo::insertBranch(
1559566cf16SZi Xuan Wu     MachineBasicBlock &MBB, MachineBasicBlock *TBB, MachineBasicBlock *FBB,
1569566cf16SZi Xuan Wu     ArrayRef<MachineOperand> Cond, const DebugLoc &DL, int *BytesAdded) const {
1579566cf16SZi Xuan Wu   if (BytesAdded)
1589566cf16SZi Xuan Wu     *BytesAdded = 0;
1599566cf16SZi Xuan Wu 
1609566cf16SZi Xuan Wu   // Shouldn't be a fall through.
1619566cf16SZi Xuan Wu   assert(TBB && "insertBranch must not be told to insert a fallthrough");
1629566cf16SZi Xuan Wu   assert((Cond.size() == 2 || Cond.size() == 0) &&
1639566cf16SZi Xuan Wu          "CSKY branch conditions have two components!");
1649566cf16SZi Xuan Wu 
1659566cf16SZi Xuan Wu   // Unconditional branch.
1669566cf16SZi Xuan Wu   if (Cond.empty()) {
1679566cf16SZi Xuan Wu     MachineInstr &MI = *BuildMI(&MBB, DL, get(CSKY::BR32)).addMBB(TBB);
1689566cf16SZi Xuan Wu     if (BytesAdded)
1699566cf16SZi Xuan Wu       *BytesAdded += getInstSizeInBytes(MI);
1709566cf16SZi Xuan Wu     return 1;
1719566cf16SZi Xuan Wu   }
1729566cf16SZi Xuan Wu 
1739566cf16SZi Xuan Wu   // Either a one or two-way conditional branch.
1749566cf16SZi Xuan Wu   unsigned Opc = Cond[0].getImm();
1759566cf16SZi Xuan Wu   MachineInstr &CondMI = *BuildMI(&MBB, DL, get(Opc)).add(Cond[1]).addMBB(TBB);
1769566cf16SZi Xuan Wu   if (BytesAdded)
1779566cf16SZi Xuan Wu     *BytesAdded += getInstSizeInBytes(CondMI);
1789566cf16SZi Xuan Wu 
1799566cf16SZi Xuan Wu   // One-way conditional branch.
1809566cf16SZi Xuan Wu   if (!FBB)
1819566cf16SZi Xuan Wu     return 1;
1829566cf16SZi Xuan Wu 
1839566cf16SZi Xuan Wu   // Two-way conditional branch.
1849566cf16SZi Xuan Wu   MachineInstr &MI = *BuildMI(&MBB, DL, get(CSKY::BR32)).addMBB(FBB);
1859566cf16SZi Xuan Wu   if (BytesAdded)
1869566cf16SZi Xuan Wu     *BytesAdded += getInstSizeInBytes(MI);
1879566cf16SZi Xuan Wu   return 2;
1889566cf16SZi Xuan Wu }
1899566cf16SZi Xuan Wu 
getOppositeBranchOpc(unsigned Opcode)1909566cf16SZi Xuan Wu static unsigned getOppositeBranchOpc(unsigned Opcode) {
1919566cf16SZi Xuan Wu   switch (Opcode) {
1929566cf16SZi Xuan Wu   default:
1939566cf16SZi Xuan Wu     llvm_unreachable("Unknown conditional branch!");
1949566cf16SZi Xuan Wu   case CSKY::BT32:
1959566cf16SZi Xuan Wu     return CSKY::BF32;
1969566cf16SZi Xuan Wu   case CSKY::BT16:
1979566cf16SZi Xuan Wu     return CSKY::BF16;
1989566cf16SZi Xuan Wu   case CSKY::BF32:
1999566cf16SZi Xuan Wu     return CSKY::BT32;
2009566cf16SZi Xuan Wu   case CSKY::BF16:
2019566cf16SZi Xuan Wu     return CSKY::BT16;
2029566cf16SZi Xuan Wu   case CSKY::BHZ32:
2039566cf16SZi Xuan Wu     return CSKY::BLSZ32;
2049566cf16SZi Xuan Wu   case CSKY::BHSZ32:
2059566cf16SZi Xuan Wu     return CSKY::BLZ32;
2069566cf16SZi Xuan Wu   case CSKY::BLZ32:
2079566cf16SZi Xuan Wu     return CSKY::BHSZ32;
2089566cf16SZi Xuan Wu   case CSKY::BLSZ32:
2099566cf16SZi Xuan Wu     return CSKY::BHZ32;
2109566cf16SZi Xuan Wu   case CSKY::BNEZ32:
2119566cf16SZi Xuan Wu     return CSKY::BEZ32;
2129566cf16SZi Xuan Wu   case CSKY::BEZ32:
2139566cf16SZi Xuan Wu     return CSKY::BNEZ32;
2149566cf16SZi Xuan Wu   }
2159566cf16SZi Xuan Wu }
2169566cf16SZi Xuan Wu 
reverseBranchCondition(SmallVectorImpl<MachineOperand> & Cond) const2179566cf16SZi Xuan Wu bool CSKYInstrInfo::reverseBranchCondition(
2189566cf16SZi Xuan Wu     SmallVectorImpl<MachineOperand> &Cond) const {
2199566cf16SZi Xuan Wu   assert((Cond.size() == 2) && "Invalid branch condition!");
2209566cf16SZi Xuan Wu   Cond[0].setImm(getOppositeBranchOpc(Cond[0].getImm()));
2219566cf16SZi Xuan Wu   return false;
2229566cf16SZi Xuan Wu }
2239566cf16SZi Xuan Wu 
movImm(MachineBasicBlock & MBB,MachineBasicBlock::iterator MBBI,const DebugLoc & DL,uint64_t Val,MachineInstr::MIFlag Flag) const224a556ec88SZi Xuan Wu Register CSKYInstrInfo::movImm(MachineBasicBlock &MBB,
225a556ec88SZi Xuan Wu                                MachineBasicBlock::iterator MBBI,
226587573b9SZi Xuan Wu (Zeson)                                const DebugLoc &DL, uint64_t Val,
227a556ec88SZi Xuan Wu                                MachineInstr::MIFlag Flag) const {
228587573b9SZi Xuan Wu (Zeson)   if (!isInt<32>(Val))
229587573b9SZi Xuan Wu (Zeson)     report_fatal_error("Should only materialize 32-bit constants.");
230a556ec88SZi Xuan Wu 
231a556ec88SZi Xuan Wu   MachineRegisterInfo &MRI = MBB.getParent()->getRegInfo();
232a556ec88SZi Xuan Wu 
233a556ec88SZi Xuan Wu   Register DstReg;
234a556ec88SZi Xuan Wu   if (STI.hasE2()) {
235a556ec88SZi Xuan Wu     DstReg = MRI.createVirtualRegister(&CSKY::GPRRegClass);
236a556ec88SZi Xuan Wu 
237a556ec88SZi Xuan Wu     if (isUInt<16>(Val)) {
238a556ec88SZi Xuan Wu       BuildMI(MBB, MBBI, DL, get(CSKY::MOVI32), DstReg)
239a556ec88SZi Xuan Wu           .addImm(Val & 0xFFFF)
240a556ec88SZi Xuan Wu           .setMIFlags(Flag);
241a556ec88SZi Xuan Wu     } else if (isShiftedUInt<16, 16>(Val)) {
242a556ec88SZi Xuan Wu       BuildMI(MBB, MBBI, DL, get(CSKY::MOVIH32), DstReg)
243a556ec88SZi Xuan Wu           .addImm((Val >> 16) & 0xFFFF)
244a556ec88SZi Xuan Wu           .setMIFlags(Flag);
245a556ec88SZi Xuan Wu     } else {
246a556ec88SZi Xuan Wu       BuildMI(MBB, MBBI, DL, get(CSKY::MOVIH32), DstReg)
247a556ec88SZi Xuan Wu           .addImm((Val >> 16) & 0xFFFF)
248a556ec88SZi Xuan Wu           .setMIFlags(Flag);
249a556ec88SZi Xuan Wu       BuildMI(MBB, MBBI, DL, get(CSKY::ORI32), DstReg)
250a556ec88SZi Xuan Wu           .addReg(DstReg)
251a556ec88SZi Xuan Wu           .addImm(Val & 0xFFFF)
252a556ec88SZi Xuan Wu           .setMIFlags(Flag);
253a556ec88SZi Xuan Wu     }
254a556ec88SZi Xuan Wu 
255a556ec88SZi Xuan Wu   } else {
256a556ec88SZi Xuan Wu     DstReg = MRI.createVirtualRegister(&CSKY::mGPRRegClass);
257a556ec88SZi Xuan Wu     if (isUInt<8>(Val)) {
258a556ec88SZi Xuan Wu       BuildMI(MBB, MBBI, DL, get(CSKY::MOVI16), DstReg)
259a556ec88SZi Xuan Wu           .addImm(Val & 0xFF)
260a556ec88SZi Xuan Wu           .setMIFlags(Flag);
261a556ec88SZi Xuan Wu     } else if (isUInt<16>(Val)) {
262a556ec88SZi Xuan Wu       BuildMI(MBB, MBBI, DL, get(CSKY::MOVI16), DstReg)
263a556ec88SZi Xuan Wu           .addImm((Val >> 8) & 0xFF)
264a556ec88SZi Xuan Wu           .setMIFlags(Flag);
265a556ec88SZi Xuan Wu       BuildMI(MBB, MBBI, DL, get(CSKY::LSLI16), DstReg)
266a556ec88SZi Xuan Wu           .addReg(DstReg)
267a556ec88SZi Xuan Wu           .addImm(8)
268a556ec88SZi Xuan Wu           .setMIFlags(Flag);
269a556ec88SZi Xuan Wu       if ((Val & 0xFF) != 0)
270a556ec88SZi Xuan Wu         BuildMI(MBB, MBBI, DL, get(CSKY::ADDI16), DstReg)
271a556ec88SZi Xuan Wu             .addReg(DstReg)
272a556ec88SZi Xuan Wu             .addImm(Val & 0xFF)
273a556ec88SZi Xuan Wu             .setMIFlags(Flag);
274a556ec88SZi Xuan Wu     } else if (isUInt<24>(Val)) {
275a556ec88SZi Xuan Wu       BuildMI(MBB, MBBI, DL, get(CSKY::MOVI16), DstReg)
276a556ec88SZi Xuan Wu           .addImm((Val >> 16) & 0xFF)
277a556ec88SZi Xuan Wu           .setMIFlags(Flag);
278a556ec88SZi Xuan Wu       BuildMI(MBB, MBBI, DL, get(CSKY::LSLI16), DstReg)
279a556ec88SZi Xuan Wu           .addReg(DstReg)
280a556ec88SZi Xuan Wu           .addImm(8)
281a556ec88SZi Xuan Wu           .setMIFlags(Flag);
282a556ec88SZi Xuan Wu       if (((Val >> 8) & 0xFF) != 0)
283a556ec88SZi Xuan Wu         BuildMI(MBB, MBBI, DL, get(CSKY::ADDI16), DstReg)
284a556ec88SZi Xuan Wu             .addReg(DstReg)
285a556ec88SZi Xuan Wu             .addImm((Val >> 8) & 0xFF)
286a556ec88SZi Xuan Wu             .setMIFlags(Flag);
287a556ec88SZi Xuan Wu       BuildMI(MBB, MBBI, DL, get(CSKY::LSLI16), DstReg)
288a556ec88SZi Xuan Wu           .addReg(DstReg)
289a556ec88SZi Xuan Wu           .addImm(8)
290a556ec88SZi Xuan Wu           .setMIFlags(Flag);
291a556ec88SZi Xuan Wu       if ((Val & 0xFF) != 0)
292a556ec88SZi Xuan Wu         BuildMI(MBB, MBBI, DL, get(CSKY::ADDI16), DstReg)
293a556ec88SZi Xuan Wu             .addReg(DstReg)
294a556ec88SZi Xuan Wu             .addImm(Val & 0xFF)
295a556ec88SZi Xuan Wu             .setMIFlags(Flag);
296a556ec88SZi Xuan Wu     } else {
297a556ec88SZi Xuan Wu       BuildMI(MBB, MBBI, DL, get(CSKY::MOVI16), DstReg)
298a556ec88SZi Xuan Wu           .addImm((Val >> 24) & 0xFF)
299a556ec88SZi Xuan Wu           .setMIFlags(Flag);
300a556ec88SZi Xuan Wu       BuildMI(MBB, MBBI, DL, get(CSKY::LSLI16), DstReg)
301a556ec88SZi Xuan Wu           .addReg(DstReg)
302a556ec88SZi Xuan Wu           .addImm(8)
303a556ec88SZi Xuan Wu           .setMIFlags(Flag);
304a556ec88SZi Xuan Wu       if (((Val >> 16) & 0xFF) != 0)
305a556ec88SZi Xuan Wu         BuildMI(MBB, MBBI, DL, get(CSKY::ADDI16), DstReg)
306a556ec88SZi Xuan Wu             .addReg(DstReg)
307a556ec88SZi Xuan Wu             .addImm((Val >> 16) & 0xFF)
308a556ec88SZi Xuan Wu             .setMIFlags(Flag);
309a556ec88SZi Xuan Wu       BuildMI(MBB, MBBI, DL, get(CSKY::LSLI16), DstReg)
310a556ec88SZi Xuan Wu           .addReg(DstReg)
311a556ec88SZi Xuan Wu           .addImm(8)
312a556ec88SZi Xuan Wu           .setMIFlags(Flag);
313a556ec88SZi Xuan Wu       if (((Val >> 8) & 0xFF) != 0)
314a556ec88SZi Xuan Wu         BuildMI(MBB, MBBI, DL, get(CSKY::ADDI16), DstReg)
315a556ec88SZi Xuan Wu             .addReg(DstReg)
316a556ec88SZi Xuan Wu             .addImm((Val >> 8) & 0xFF)
317a556ec88SZi Xuan Wu             .setMIFlags(Flag);
318a556ec88SZi Xuan Wu       BuildMI(MBB, MBBI, DL, get(CSKY::LSLI16), DstReg)
319a556ec88SZi Xuan Wu           .addReg(DstReg)
320a556ec88SZi Xuan Wu           .addImm(8)
321a556ec88SZi Xuan Wu           .setMIFlags(Flag);
322a556ec88SZi Xuan Wu       if ((Val & 0xFF) != 0)
323a556ec88SZi Xuan Wu         BuildMI(MBB, MBBI, DL, get(CSKY::ADDI16), DstReg)
324a556ec88SZi Xuan Wu             .addReg(DstReg)
325a556ec88SZi Xuan Wu             .addImm(Val & 0xFF)
326a556ec88SZi Xuan Wu             .setMIFlags(Flag);
327a556ec88SZi Xuan Wu     }
328a556ec88SZi Xuan Wu   }
329a556ec88SZi Xuan Wu 
330a556ec88SZi Xuan Wu   return DstReg;
331a556ec88SZi Xuan Wu }
332a556ec88SZi Xuan Wu 
isLoadFromStackSlot(const MachineInstr & MI,int & FrameIndex) const333a556ec88SZi Xuan Wu unsigned CSKYInstrInfo::isLoadFromStackSlot(const MachineInstr &MI,
334a556ec88SZi Xuan Wu                                             int &FrameIndex) const {
335a556ec88SZi Xuan Wu   switch (MI.getOpcode()) {
336a556ec88SZi Xuan Wu   default:
337a556ec88SZi Xuan Wu     return 0;
338a556ec88SZi Xuan Wu   case CSKY::LD16B:
339a556ec88SZi Xuan Wu   case CSKY::LD16H:
340a556ec88SZi Xuan Wu   case CSKY::LD16W:
341a556ec88SZi Xuan Wu   case CSKY::LD32B:
342a556ec88SZi Xuan Wu   case CSKY::LD32BS:
343a556ec88SZi Xuan Wu   case CSKY::LD32H:
344a556ec88SZi Xuan Wu   case CSKY::LD32HS:
345a556ec88SZi Xuan Wu   case CSKY::LD32W:
3464ad517e6SZi Xuan Wu   case CSKY::FLD_S:
3474ad517e6SZi Xuan Wu   case CSKY::FLD_D:
3484ad517e6SZi Xuan Wu   case CSKY::f2FLD_S:
3494ad517e6SZi Xuan Wu   case CSKY::f2FLD_D:
350a556ec88SZi Xuan Wu   case CSKY::RESTORE_CARRY:
351a556ec88SZi Xuan Wu     break;
352a556ec88SZi Xuan Wu   }
353a556ec88SZi Xuan Wu 
354a556ec88SZi Xuan Wu   if (MI.getOperand(1).isFI() && MI.getOperand(2).isImm() &&
355a556ec88SZi Xuan Wu       MI.getOperand(2).getImm() == 0) {
356a556ec88SZi Xuan Wu     FrameIndex = MI.getOperand(1).getIndex();
357a556ec88SZi Xuan Wu     return MI.getOperand(0).getReg();
358a556ec88SZi Xuan Wu   }
359a556ec88SZi Xuan Wu 
360a556ec88SZi Xuan Wu   return 0;
361a556ec88SZi Xuan Wu }
362a556ec88SZi Xuan Wu 
isStoreToStackSlot(const MachineInstr & MI,int & FrameIndex) const363a556ec88SZi Xuan Wu unsigned CSKYInstrInfo::isStoreToStackSlot(const MachineInstr &MI,
364a556ec88SZi Xuan Wu                                            int &FrameIndex) const {
365a556ec88SZi Xuan Wu   switch (MI.getOpcode()) {
366a556ec88SZi Xuan Wu   default:
367a556ec88SZi Xuan Wu     return 0;
368a556ec88SZi Xuan Wu   case CSKY::ST16B:
369a556ec88SZi Xuan Wu   case CSKY::ST16H:
370a556ec88SZi Xuan Wu   case CSKY::ST16W:
371a556ec88SZi Xuan Wu   case CSKY::ST32B:
372a556ec88SZi Xuan Wu   case CSKY::ST32H:
373a556ec88SZi Xuan Wu   case CSKY::ST32W:
3744ad517e6SZi Xuan Wu   case CSKY::FST_S:
3754ad517e6SZi Xuan Wu   case CSKY::FST_D:
3764ad517e6SZi Xuan Wu   case CSKY::f2FST_S:
3774ad517e6SZi Xuan Wu   case CSKY::f2FST_D:
378a556ec88SZi Xuan Wu   case CSKY::SPILL_CARRY:
379a556ec88SZi Xuan Wu     break;
380a556ec88SZi Xuan Wu   }
381a556ec88SZi Xuan Wu 
382a556ec88SZi Xuan Wu   if (MI.getOperand(1).isFI() && MI.getOperand(2).isImm() &&
383a556ec88SZi Xuan Wu       MI.getOperand(2).getImm() == 0) {
384a556ec88SZi Xuan Wu     FrameIndex = MI.getOperand(1).getIndex();
385a556ec88SZi Xuan Wu     return MI.getOperand(0).getReg();
386a556ec88SZi Xuan Wu   }
387a556ec88SZi Xuan Wu 
388a556ec88SZi Xuan Wu   return 0;
389a556ec88SZi Xuan Wu }
390a556ec88SZi Xuan Wu 
storeRegToStackSlot(MachineBasicBlock & MBB,MachineBasicBlock::iterator I,Register SrcReg,bool IsKill,int FI,const TargetRegisterClass * RC,const TargetRegisterInfo * TRI) const391a556ec88SZi Xuan Wu void CSKYInstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
392a556ec88SZi Xuan Wu                                         MachineBasicBlock::iterator I,
393a556ec88SZi Xuan Wu                                         Register SrcReg, bool IsKill, int FI,
394a556ec88SZi Xuan Wu                                         const TargetRegisterClass *RC,
395a556ec88SZi Xuan Wu                                         const TargetRegisterInfo *TRI) const {
396a556ec88SZi Xuan Wu   DebugLoc DL;
397a556ec88SZi Xuan Wu   if (I != MBB.end())
398a556ec88SZi Xuan Wu     DL = I->getDebugLoc();
399a556ec88SZi Xuan Wu 
400a556ec88SZi Xuan Wu   MachineFunction &MF = *MBB.getParent();
401a556ec88SZi Xuan Wu   CSKYMachineFunctionInfo *CFI = MF.getInfo<CSKYMachineFunctionInfo>();
402a556ec88SZi Xuan Wu   MachineFrameInfo &MFI = MF.getFrameInfo();
403a556ec88SZi Xuan Wu 
404a556ec88SZi Xuan Wu   unsigned Opcode = 0;
405a556ec88SZi Xuan Wu 
406a556ec88SZi Xuan Wu   if (CSKY::GPRRegClass.hasSubClassEq(RC)) {
407a556ec88SZi Xuan Wu     Opcode = CSKY::ST32W; // Optimize for 16bit
408a556ec88SZi Xuan Wu   } else if (CSKY::CARRYRegClass.hasSubClassEq(RC)) {
409a556ec88SZi Xuan Wu     Opcode = CSKY::SPILL_CARRY;
410a556ec88SZi Xuan Wu     CFI->setSpillsCR();
4114ad517e6SZi Xuan Wu   } else if (v2sf && CSKY::sFPR32RegClass.hasSubClassEq(RC))
4124ad517e6SZi Xuan Wu     Opcode = CSKY::FST_S;
4134ad517e6SZi Xuan Wu   else if (v2df && CSKY::sFPR64RegClass.hasSubClassEq(RC))
4144ad517e6SZi Xuan Wu     Opcode = CSKY::FST_D;
4154ad517e6SZi Xuan Wu   else if (v3sf && CSKY::FPR32RegClass.hasSubClassEq(RC))
4164ad517e6SZi Xuan Wu     Opcode = CSKY::f2FST_S;
4174ad517e6SZi Xuan Wu   else if (v3df && CSKY::FPR64RegClass.hasSubClassEq(RC))
4184ad517e6SZi Xuan Wu     Opcode = CSKY::f2FST_D;
4194ad517e6SZi Xuan Wu   else {
420a556ec88SZi Xuan Wu     llvm_unreachable("Unknown RegisterClass");
421a556ec88SZi Xuan Wu   }
422a556ec88SZi Xuan Wu 
423a556ec88SZi Xuan Wu   MachineMemOperand *MMO = MF.getMachineMemOperand(
424a556ec88SZi Xuan Wu       MachinePointerInfo::getFixedStack(MF, FI), MachineMemOperand::MOStore,
425a556ec88SZi Xuan Wu       MFI.getObjectSize(FI), MFI.getObjectAlign(FI));
426a556ec88SZi Xuan Wu 
427a556ec88SZi Xuan Wu   BuildMI(MBB, I, DL, get(Opcode))
428a556ec88SZi Xuan Wu       .addReg(SrcReg, getKillRegState(IsKill))
429a556ec88SZi Xuan Wu       .addFrameIndex(FI)
430a556ec88SZi Xuan Wu       .addImm(0)
431a556ec88SZi Xuan Wu       .addMemOperand(MMO);
432a556ec88SZi Xuan Wu }
433a556ec88SZi Xuan Wu 
loadRegFromStackSlot(MachineBasicBlock & MBB,MachineBasicBlock::iterator I,Register DestReg,int FI,const TargetRegisterClass * RC,const TargetRegisterInfo * TRI) const434a556ec88SZi Xuan Wu void CSKYInstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
435a556ec88SZi Xuan Wu                                          MachineBasicBlock::iterator I,
436a556ec88SZi Xuan Wu                                          Register DestReg, int FI,
437a556ec88SZi Xuan Wu                                          const TargetRegisterClass *RC,
438a556ec88SZi Xuan Wu                                          const TargetRegisterInfo *TRI) const {
439a556ec88SZi Xuan Wu   DebugLoc DL;
440a556ec88SZi Xuan Wu   if (I != MBB.end())
441a556ec88SZi Xuan Wu     DL = I->getDebugLoc();
442a556ec88SZi Xuan Wu 
443a556ec88SZi Xuan Wu   MachineFunction &MF = *MBB.getParent();
444a556ec88SZi Xuan Wu   CSKYMachineFunctionInfo *CFI = MF.getInfo<CSKYMachineFunctionInfo>();
445a556ec88SZi Xuan Wu   MachineFrameInfo &MFI = MF.getFrameInfo();
446a556ec88SZi Xuan Wu 
447a556ec88SZi Xuan Wu   unsigned Opcode = 0;
448a556ec88SZi Xuan Wu 
449a556ec88SZi Xuan Wu   if (CSKY::GPRRegClass.hasSubClassEq(RC)) {
450a556ec88SZi Xuan Wu     Opcode = CSKY::LD32W;
451a556ec88SZi Xuan Wu   } else if (CSKY::CARRYRegClass.hasSubClassEq(RC)) {
452a556ec88SZi Xuan Wu     Opcode = CSKY::RESTORE_CARRY;
453a556ec88SZi Xuan Wu     CFI->setSpillsCR();
4544ad517e6SZi Xuan Wu   } else if (v2sf && CSKY::sFPR32RegClass.hasSubClassEq(RC))
4554ad517e6SZi Xuan Wu     Opcode = CSKY::FLD_S;
4564ad517e6SZi Xuan Wu   else if (v2df && CSKY::sFPR64RegClass.hasSubClassEq(RC))
4574ad517e6SZi Xuan Wu     Opcode = CSKY::FLD_D;
4584ad517e6SZi Xuan Wu   else if (v3sf && CSKY::FPR32RegClass.hasSubClassEq(RC))
4594ad517e6SZi Xuan Wu     Opcode = CSKY::f2FLD_S;
4604ad517e6SZi Xuan Wu   else if (v3df && CSKY::FPR64RegClass.hasSubClassEq(RC))
4614ad517e6SZi Xuan Wu     Opcode = CSKY::f2FLD_D;
4624ad517e6SZi Xuan Wu   else {
463a556ec88SZi Xuan Wu     llvm_unreachable("Unknown RegisterClass");
464a556ec88SZi Xuan Wu   }
465a556ec88SZi Xuan Wu 
466a556ec88SZi Xuan Wu   MachineMemOperand *MMO = MF.getMachineMemOperand(
467a556ec88SZi Xuan Wu       MachinePointerInfo::getFixedStack(MF, FI), MachineMemOperand::MOLoad,
468a556ec88SZi Xuan Wu       MFI.getObjectSize(FI), MFI.getObjectAlign(FI));
469a556ec88SZi Xuan Wu 
470a556ec88SZi Xuan Wu   BuildMI(MBB, I, DL, get(Opcode), DestReg)
471a556ec88SZi Xuan Wu       .addFrameIndex(FI)
472a556ec88SZi Xuan Wu       .addImm(0)
473a556ec88SZi Xuan Wu       .addMemOperand(MMO);
474a556ec88SZi Xuan Wu }
475a556ec88SZi Xuan Wu 
copyPhysReg(MachineBasicBlock & MBB,MachineBasicBlock::iterator I,const DebugLoc & DL,MCRegister DestReg,MCRegister SrcReg,bool KillSrc) const476a556ec88SZi Xuan Wu void CSKYInstrInfo::copyPhysReg(MachineBasicBlock &MBB,
477a556ec88SZi Xuan Wu                                 MachineBasicBlock::iterator I,
478a556ec88SZi Xuan Wu                                 const DebugLoc &DL, MCRegister DestReg,
479a556ec88SZi Xuan Wu                                 MCRegister SrcReg, bool KillSrc) const {
480a556ec88SZi Xuan Wu   if (CSKY::GPRRegClass.contains(SrcReg) &&
481a556ec88SZi Xuan Wu       CSKY::CARRYRegClass.contains(DestReg)) {
482a556ec88SZi Xuan Wu     if (STI.hasE2()) {
483a556ec88SZi Xuan Wu       BuildMI(MBB, I, DL, get(CSKY::BTSTI32), DestReg)
484a556ec88SZi Xuan Wu           .addReg(SrcReg, getKillRegState(KillSrc))
485a556ec88SZi Xuan Wu           .addImm(0);
486a556ec88SZi Xuan Wu     } else {
487a556ec88SZi Xuan Wu       assert(SrcReg < CSKY::R8);
488a556ec88SZi Xuan Wu       BuildMI(MBB, I, DL, get(CSKY::BTSTI16), DestReg)
489a556ec88SZi Xuan Wu           .addReg(SrcReg, getKillRegState(KillSrc))
490a556ec88SZi Xuan Wu           .addImm(0);
491a556ec88SZi Xuan Wu     }
492a556ec88SZi Xuan Wu     return;
493a556ec88SZi Xuan Wu   }
494a556ec88SZi Xuan Wu 
495a556ec88SZi Xuan Wu   if (CSKY::CARRYRegClass.contains(SrcReg) &&
496a556ec88SZi Xuan Wu       CSKY::GPRRegClass.contains(DestReg)) {
497a556ec88SZi Xuan Wu 
498a556ec88SZi Xuan Wu     if (STI.hasE2()) {
499a556ec88SZi Xuan Wu       BuildMI(MBB, I, DL, get(CSKY::MVC32), DestReg)
500a556ec88SZi Xuan Wu           .addReg(SrcReg, getKillRegState(KillSrc));
501a556ec88SZi Xuan Wu     } else {
502a556ec88SZi Xuan Wu       assert(DestReg < CSKY::R16);
503a556ec88SZi Xuan Wu       assert(DestReg < CSKY::R8);
504a556ec88SZi Xuan Wu       BuildMI(MBB, I, DL, get(CSKY::MOVI16), DestReg).addImm(0);
505a556ec88SZi Xuan Wu       BuildMI(MBB, I, DL, get(CSKY::ADDC16))
506a556ec88SZi Xuan Wu           .addReg(DestReg, RegState::Define)
507a556ec88SZi Xuan Wu           .addReg(SrcReg, RegState::Define)
508a556ec88SZi Xuan Wu           .addReg(DestReg, getKillRegState(true))
509a556ec88SZi Xuan Wu           .addReg(DestReg, getKillRegState(true))
510a556ec88SZi Xuan Wu           .addReg(SrcReg, getKillRegState(true));
511a556ec88SZi Xuan Wu       BuildMI(MBB, I, DL, get(CSKY::BTSTI16))
512a556ec88SZi Xuan Wu           .addReg(SrcReg, RegState::Define | getDeadRegState(KillSrc))
513a556ec88SZi Xuan Wu           .addReg(DestReg)
514a556ec88SZi Xuan Wu           .addImm(0);
515a556ec88SZi Xuan Wu     }
516a556ec88SZi Xuan Wu     return;
517a556ec88SZi Xuan Wu   }
518a556ec88SZi Xuan Wu 
519a556ec88SZi Xuan Wu   unsigned Opcode = 0;
520a556ec88SZi Xuan Wu   if (CSKY::GPRRegClass.contains(DestReg, SrcReg))
521*08db0891SZi Xuan Wu (Zeson)     Opcode = STI.hasE2() ? CSKY::MOV32 : CSKY::MOV16;
5224ad517e6SZi Xuan Wu   else if (v2sf && CSKY::sFPR32RegClass.contains(DestReg, SrcReg))
5234ad517e6SZi Xuan Wu     Opcode = CSKY::FMOV_S;
5244ad517e6SZi Xuan Wu   else if (v3sf && CSKY::FPR32RegClass.contains(DestReg, SrcReg))
5254ad517e6SZi Xuan Wu     Opcode = CSKY::f2FMOV_S;
5264ad517e6SZi Xuan Wu   else if (v2df && CSKY::sFPR64RegClass.contains(DestReg, SrcReg))
5274ad517e6SZi Xuan Wu     Opcode = CSKY::FMOV_D;
5284ad517e6SZi Xuan Wu   else if (v3df && CSKY::FPR64RegClass.contains(DestReg, SrcReg))
5294ad517e6SZi Xuan Wu     Opcode = CSKY::f2FMOV_D;
5304ad517e6SZi Xuan Wu   else if (v2sf && CSKY::sFPR32RegClass.contains(SrcReg) &&
5314ad517e6SZi Xuan Wu            CSKY::GPRRegClass.contains(DestReg))
5324ad517e6SZi Xuan Wu     Opcode = CSKY::FMFVRL;
5334ad517e6SZi Xuan Wu   else if (v3sf && CSKY::FPR32RegClass.contains(SrcReg) &&
5344ad517e6SZi Xuan Wu            CSKY::GPRRegClass.contains(DestReg))
5354ad517e6SZi Xuan Wu     Opcode = CSKY::f2FMFVRL;
5364ad517e6SZi Xuan Wu   else if (v2df && CSKY::sFPR64RegClass.contains(SrcReg) &&
5374ad517e6SZi Xuan Wu            CSKY::GPRRegClass.contains(DestReg))
5384ad517e6SZi Xuan Wu     Opcode = CSKY::FMFVRL_D;
5394ad517e6SZi Xuan Wu   else if (v3df && CSKY::FPR64RegClass.contains(SrcReg) &&
5404ad517e6SZi Xuan Wu            CSKY::GPRRegClass.contains(DestReg))
5414ad517e6SZi Xuan Wu     Opcode = CSKY::f2FMFVRL_D;
5424ad517e6SZi Xuan Wu   else if (v2sf && CSKY::GPRRegClass.contains(SrcReg) &&
5434ad517e6SZi Xuan Wu            CSKY::sFPR32RegClass.contains(DestReg))
5444ad517e6SZi Xuan Wu     Opcode = CSKY::FMTVRL;
5454ad517e6SZi Xuan Wu   else if (v3sf && CSKY::GPRRegClass.contains(SrcReg) &&
5464ad517e6SZi Xuan Wu            CSKY::FPR32RegClass.contains(DestReg))
5474ad517e6SZi Xuan Wu     Opcode = CSKY::f2FMTVRL;
5484ad517e6SZi Xuan Wu   else if (v2df && CSKY::GPRRegClass.contains(SrcReg) &&
5494ad517e6SZi Xuan Wu            CSKY::sFPR64RegClass.contains(DestReg))
5504ad517e6SZi Xuan Wu     Opcode = CSKY::FMTVRL_D;
5514ad517e6SZi Xuan Wu   else if (v3df && CSKY::GPRRegClass.contains(SrcReg) &&
5524ad517e6SZi Xuan Wu            CSKY::FPR64RegClass.contains(DestReg))
5534ad517e6SZi Xuan Wu     Opcode = CSKY::f2FMTVRL_D;
554a556ec88SZi Xuan Wu   else {
555a556ec88SZi Xuan Wu     LLVM_DEBUG(dbgs() << "src = " << SrcReg << ", dst = " << DestReg);
556a556ec88SZi Xuan Wu     LLVM_DEBUG(I->dump());
557a556ec88SZi Xuan Wu     llvm_unreachable("Unknown RegisterClass");
558a556ec88SZi Xuan Wu   }
559a556ec88SZi Xuan Wu 
560a556ec88SZi Xuan Wu   BuildMI(MBB, I, DL, get(Opcode), DestReg)
561a556ec88SZi Xuan Wu       .addReg(SrcReg, getKillRegState(KillSrc));
562a556ec88SZi Xuan Wu }
5638ddc8169SZi Xuan Wu 
getGlobalBaseReg(MachineFunction & MF) const5648ddc8169SZi Xuan Wu Register CSKYInstrInfo::getGlobalBaseReg(MachineFunction &MF) const {
5658ddc8169SZi Xuan Wu   CSKYMachineFunctionInfo *CFI = MF.getInfo<CSKYMachineFunctionInfo>();
5668ddc8169SZi Xuan Wu   MachineConstantPool *MCP = MF.getConstantPool();
5678ddc8169SZi Xuan Wu   MachineRegisterInfo &MRI = MF.getRegInfo();
5688ddc8169SZi Xuan Wu 
5698ddc8169SZi Xuan Wu   Register GlobalBaseReg = CFI->getGlobalBaseReg();
5708ddc8169SZi Xuan Wu   if (GlobalBaseReg != 0)
5718ddc8169SZi Xuan Wu     return GlobalBaseReg;
5728ddc8169SZi Xuan Wu 
5738ddc8169SZi Xuan Wu   // Insert a pseudo instruction to set the GlobalBaseReg into the first
5748ddc8169SZi Xuan Wu   // MBB of the function
5758ddc8169SZi Xuan Wu   MachineBasicBlock &FirstMBB = MF.front();
5768ddc8169SZi Xuan Wu   MachineBasicBlock::iterator MBBI = FirstMBB.begin();
5778ddc8169SZi Xuan Wu   DebugLoc DL;
5788ddc8169SZi Xuan Wu 
5798ddc8169SZi Xuan Wu   CSKYConstantPoolValue *CPV = CSKYConstantPoolSymbol::Create(
5808ddc8169SZi Xuan Wu       Type::getInt32Ty(MF.getFunction().getContext()), "_GLOBAL_OFFSET_TABLE_",
5818ddc8169SZi Xuan Wu       0, CSKYCP::ADDR);
5828ddc8169SZi Xuan Wu 
5838ddc8169SZi Xuan Wu   unsigned CPI = MCP->getConstantPoolIndex(CPV, Align(4));
5848ddc8169SZi Xuan Wu 
5858ddc8169SZi Xuan Wu   MachineMemOperand *MO =
5868ddc8169SZi Xuan Wu       MF.getMachineMemOperand(MachinePointerInfo::getConstantPool(MF),
5878ddc8169SZi Xuan Wu                               MachineMemOperand::MOLoad, 4, Align(4));
5888ddc8169SZi Xuan Wu   BuildMI(FirstMBB, MBBI, DL, get(CSKY::LRW32), CSKY::R28)
5898ddc8169SZi Xuan Wu       .addConstantPoolIndex(CPI)
5908ddc8169SZi Xuan Wu       .addMemOperand(MO);
5918ddc8169SZi Xuan Wu 
5928ddc8169SZi Xuan Wu   GlobalBaseReg = MRI.createVirtualRegister(&CSKY::GPRRegClass);
5938ddc8169SZi Xuan Wu   BuildMI(FirstMBB, MBBI, DL, get(TargetOpcode::COPY), GlobalBaseReg)
5948ddc8169SZi Xuan Wu       .addReg(CSKY::R28);
5958ddc8169SZi Xuan Wu 
5968ddc8169SZi Xuan Wu   CFI->setGlobalBaseReg(GlobalBaseReg);
5978ddc8169SZi Xuan Wu   return GlobalBaseReg;
5988ddc8169SZi Xuan Wu }
599065e0324SZi Xuan Wu 
getInstSizeInBytes(const MachineInstr & MI) const600065e0324SZi Xuan Wu unsigned CSKYInstrInfo::getInstSizeInBytes(const MachineInstr &MI) const {
601065e0324SZi Xuan Wu   switch (MI.getOpcode()) {
602065e0324SZi Xuan Wu   default:
603065e0324SZi Xuan Wu     return MI.getDesc().getSize();
604065e0324SZi Xuan Wu   case CSKY::CONSTPOOL_ENTRY:
605065e0324SZi Xuan Wu     return MI.getOperand(2).getImm();
606065e0324SZi Xuan Wu   case CSKY::SPILL_CARRY:
607065e0324SZi Xuan Wu   case CSKY::RESTORE_CARRY:
608065e0324SZi Xuan Wu   case CSKY::PseudoTLSLA32:
609065e0324SZi Xuan Wu     return 8;
610065e0324SZi Xuan Wu   case TargetOpcode::INLINEASM_BR:
611065e0324SZi Xuan Wu   case TargetOpcode::INLINEASM: {
612065e0324SZi Xuan Wu     const MachineFunction *MF = MI.getParent()->getParent();
613065e0324SZi Xuan Wu     const char *AsmStr = MI.getOperand(0).getSymbolName();
614065e0324SZi Xuan Wu     return getInlineAsmLength(AsmStr, *MF->getTarget().getMCAsmInfo());
615065e0324SZi Xuan Wu   }
616065e0324SZi Xuan Wu   }
617065e0324SZi Xuan Wu }
618