#include "MCTargetDesc/MipsABIInfo.h"
#include "MCTargetDesc/MipsBaseInfo.h"
#include "MipsCCState.h"
#include "MipsISelLowering.h"
#include "MipsInstrInfo.h"
#include "MipsMachineFunction.h"
#include "MipsSubtarget.h"
#include "MipsTargetMachine.h"
#include "llvm/ADT/APInt.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/Analysis/TargetLibraryInfo.h"
#include "llvm/CodeGen/CallingConvLower.h"
#include "llvm/CodeGen/FastISel.h"
#include "llvm/CodeGen/FunctionLoweringInfo.h"
#include "llvm/CodeGen/ISDOpcodes.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/MachineMemOperand.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/TargetInstrInfo.h"
#include "llvm/CodeGen/TargetLowering.h"
#include "llvm/CodeGen/ValueTypes.h"
#include "llvm/CodeGenTypes/MachineValueType.h"
#include "llvm/IR/Attributes.h"
#include "llvm/IR/CallingConv.h"
#include "llvm/IR/Constant.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/GetElementPtrTypeIterator.h"
#include "llvm/IR/GlobalValue.h"
#include "llvm/IR/GlobalVariable.h"
#include "llvm/IR/InstrTypes.h"
#include "llvm/IR/Instruction.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Operator.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/User.h"
#include "llvm/IR/Value.h"
#include "llvm/MC/MCContext.h"
#include "llvm/MC/MCInstrDesc.h"
#include "llvm/MC/MCRegisterInfo.h"
#include "llvm/MC/MCSymbol.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/raw_ostream.h"
#include <algorithm>
#include <array>
#include <cassert>
#include <cstdint>
#define DEBUG_TYPE …
usingnamespacellvm;
extern cl::opt<bool> EmitJalrReloc;
namespace {
class MipsFastISel final : public FastISel { … };
}
static bool CC_Mips(unsigned ValNo, MVT ValVT, MVT LocVT,
CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags,
CCState &State) LLVM_ATTRIBUTE_UNUSED;
static bool CC_MipsO32_FP32(unsigned ValNo, MVT ValVT, MVT LocVT,
CCValAssign::LocInfo LocInfo,
ISD::ArgFlagsTy ArgFlags, CCState &State) { … }
static bool CC_MipsO32_FP64(unsigned ValNo, MVT ValVT, MVT LocVT,
CCValAssign::LocInfo LocInfo,
ISD::ArgFlagsTy ArgFlags, CCState &State) { … }
#include "MipsGenCallingConv.inc"
CCAssignFn *MipsFastISel::CCAssignFnForCall(CallingConv::ID CC) const { … }
unsigned MipsFastISel::emitLogicalOp(unsigned ISDOpc, MVT RetVT,
const Value *LHS, const Value *RHS) { … }
unsigned MipsFastISel::fastMaterializeAlloca(const AllocaInst *AI) { … }
unsigned MipsFastISel::materializeInt(const Constant *C, MVT VT) { … }
unsigned MipsFastISel::materialize32BitInt(int64_t Imm,
const TargetRegisterClass *RC) { … }
unsigned MipsFastISel::materializeFP(const ConstantFP *CFP, MVT VT) { … }
unsigned MipsFastISel::materializeGV(const GlobalValue *GV, MVT VT) { … }
unsigned MipsFastISel::materializeExternalCallSym(MCSymbol *Sym) { … }
unsigned MipsFastISel::fastMaterializeConstant(const Constant *C) { … }
bool MipsFastISel::computeAddress(const Value *Obj, Address &Addr) { … }
bool MipsFastISel::computeCallAddress(const Value *V, Address &Addr) { … }
bool MipsFastISel::isTypeLegal(Type *Ty, MVT &VT) { … }
bool MipsFastISel::isTypeSupported(Type *Ty, MVT &VT) { … }
bool MipsFastISel::isLoadTypeLegal(Type *Ty, MVT &VT) { … }
bool MipsFastISel::emitCmp(unsigned ResultReg, const CmpInst *CI) { … }
bool MipsFastISel::emitLoad(MVT VT, unsigned &ResultReg, Address &Addr) { … }
bool MipsFastISel::emitStore(MVT VT, unsigned SrcReg, Address &Addr) { … }
bool MipsFastISel::selectLogicalOp(const Instruction *I) { … }
bool MipsFastISel::selectLoad(const Instruction *I) { … }
bool MipsFastISel::selectStore(const Instruction *I) { … }
bool MipsFastISel::selectBranch(const Instruction *I) { … }
bool MipsFastISel::selectCmp(const Instruction *I) { … }
bool MipsFastISel::selectFPExt(const Instruction *I) { … }
bool MipsFastISel::selectSelect(const Instruction *I) { … }
bool MipsFastISel::selectFPTrunc(const Instruction *I) { … }
bool MipsFastISel::selectFPToInt(const Instruction *I, bool IsSigned) { … }
bool MipsFastISel::processCallArgs(CallLoweringInfo &CLI,
SmallVectorImpl<MVT> &OutVTs,
unsigned &NumBytes) { … }
bool MipsFastISel::finishCall(CallLoweringInfo &CLI, MVT RetVT,
unsigned NumBytes) { … }
bool MipsFastISel::fastLowerArguments() { … }
bool MipsFastISel::fastLowerCall(CallLoweringInfo &CLI) { … }
bool MipsFastISel::fastLowerIntrinsicCall(const IntrinsicInst *II) { … }
bool MipsFastISel::selectRet(const Instruction *I) { … }
bool MipsFastISel::selectTrunc(const Instruction *I) { … }
bool MipsFastISel::selectIntExt(const Instruction *I) { … }
bool MipsFastISel::emitIntSExt32r1(MVT SrcVT, unsigned SrcReg, MVT DestVT,
unsigned DestReg) { … }
bool MipsFastISel::emitIntSExt32r2(MVT SrcVT, unsigned SrcReg, MVT DestVT,
unsigned DestReg) { … }
bool MipsFastISel::emitIntSExt(MVT SrcVT, unsigned SrcReg, MVT DestVT,
unsigned DestReg) { … }
bool MipsFastISel::emitIntZExt(MVT SrcVT, unsigned SrcReg, MVT DestVT,
unsigned DestReg) { … }
bool MipsFastISel::emitIntExt(MVT SrcVT, unsigned SrcReg, MVT DestVT,
unsigned DestReg, bool IsZExt) { … }
unsigned MipsFastISel::emitIntExt(MVT SrcVT, unsigned SrcReg, MVT DestVT,
bool isZExt) { … }
bool MipsFastISel::selectDivRem(const Instruction *I, unsigned ISDOpcode) { … }
bool MipsFastISel::selectShift(const Instruction *I) { … }
bool MipsFastISel::fastSelectInstruction(const Instruction *I) { … }
unsigned MipsFastISel::getRegEnsuringSimpleIntegerWidening(const Value *V,
bool IsUnsigned) { … }
void MipsFastISel::simplifyAddress(Address &Addr) { … }
unsigned MipsFastISel::fastEmitInst_rr(unsigned MachineInstOpcode,
const TargetRegisterClass *RC,
unsigned Op0, unsigned Op1) { … }
namespace llvm {
FastISel *Mips::createFastISel(FunctionLoweringInfo &funcInfo,
const TargetLibraryInfo *libInfo) { … }
}