mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-05 13:09:10 +00:00
This patch enables llvm to switch between compiling for mips32/mips64
and mips16 on a per function basis. Because this patch is somewhat involved I have provide an overview of the key pieces of it. The patch is written so as to not change the behavior of the non mixed mode. We have tested this a lot but it is something new to switch subtargets so we don't want any chance of regression in the mainline compiler until we have more confidence in this. Mips32/64 are very different from Mip16 as is the case of ARM vs Thumb1. For that reason there are derived versions of the register info, frame info, instruction info and instruction selection classes. Now we register three separate passes for instruction selection. One which is used to switch subtargets (MipsModuleISelDAGToDAG.cpp) and then one for each of the current subtargets (Mips16ISelDAGToDAG.cpp and MipsSEISelDAGToDAG.cpp). When the ModuleISel pass runs, it determines if there is a need to switch subtargets and if so, the owning pointers in MipsTargetMachine are appropriately changed. When 16Isel or SEIsel is run, they will return immediately without doing any work if the current subtarget mode does not apply to them. In addition, MipsAsmPrinter needs to be reset on a function basis. The pass BasicTargetTransformInfo is substituted with a null pass since the pass is immutable and really needs to be a function pass for it to be used with changing subtargets. This will be fixed in a follow on patch. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@179118 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
8383b539ff
commit
a430cb613b
@ -32,6 +32,7 @@ add_llvm_target(MipsCodeGen
|
|||||||
MipsLongBranch.cpp
|
MipsLongBranch.cpp
|
||||||
MipsMCInstLower.cpp
|
MipsMCInstLower.cpp
|
||||||
MipsMachineFunction.cpp
|
MipsMachineFunction.cpp
|
||||||
|
MipsModuleISelDAGToDAG.cpp
|
||||||
MipsRegisterInfo.cpp
|
MipsRegisterInfo.cpp
|
||||||
MipsSEFrameLowering.cpp
|
MipsSEFrameLowering.cpp
|
||||||
MipsSEInstrInfo.cpp
|
MipsSEInstrInfo.cpp
|
||||||
|
@ -35,6 +35,11 @@
|
|||||||
#include "llvm/Target/TargetMachine.h"
|
#include "llvm/Target/TargetMachine.h"
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
|
bool Mips16DAGToDAGISel::runOnMachineFunction(MachineFunction &MF) {
|
||||||
|
if (!Subtarget.inMips16Mode())
|
||||||
|
return false;
|
||||||
|
return MipsDAGToDAGISel::runOnMachineFunction(MF);
|
||||||
|
}
|
||||||
/// Select multiply instructions.
|
/// Select multiply instructions.
|
||||||
std::pair<SDNode*, SDNode*>
|
std::pair<SDNode*, SDNode*>
|
||||||
Mips16DAGToDAGISel::selectMULT(SDNode *N, unsigned Opc, DebugLoc DL, EVT Ty,
|
Mips16DAGToDAGISel::selectMULT(SDNode *N, unsigned Opc, DebugLoc DL, EVT Ty,
|
||||||
|
@ -28,6 +28,8 @@ private:
|
|||||||
|
|
||||||
SDValue getMips16SPAliasReg();
|
SDValue getMips16SPAliasReg();
|
||||||
|
|
||||||
|
virtual bool runOnMachineFunction(MachineFunction &MF);
|
||||||
|
|
||||||
void getMips16SPRefReg(SDNode *Parent, SDValue &AliasReg);
|
void getMips16SPRefReg(SDNode *Parent, SDValue &AliasReg);
|
||||||
|
|
||||||
virtual bool selectAddr16(SDNode *Parent, SDValue N, SDValue &Base,
|
virtual bool selectAddr16(SDNode *Parent, SDValue N, SDValue &Base,
|
||||||
|
@ -46,6 +46,10 @@
|
|||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
bool MipsAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
bool MipsAsmPrinter::runOnMachineFunction(MachineFunction &MF) {
|
||||||
|
// Initialize TargetLoweringObjectFile.
|
||||||
|
if (Subtarget->allowMixed16_32())
|
||||||
|
const_cast<TargetLoweringObjectFile&>(getObjFileLowering())
|
||||||
|
.Initialize(OutContext, TM);
|
||||||
MipsFI = MF.getInfo<MipsFunctionInfo>();
|
MipsFI = MF.getInfo<MipsFunctionInfo>();
|
||||||
AsmPrinter::runOnMachineFunction(MF);
|
AsmPrinter::runOnMachineFunction(MF);
|
||||||
return true;
|
return true;
|
||||||
|
@ -80,6 +80,10 @@ FunctionPass *llvm::createMipsConstantIslandPass(MipsTargetMachine &tm) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool MipsConstantIslands::runOnMachineFunction(MachineFunction &F) {
|
bool MipsConstantIslands::runOnMachineFunction(MachineFunction &F) {
|
||||||
return true;
|
// The intention is for this to be a mips16 only pass for now
|
||||||
|
// FIXME:
|
||||||
|
// if (!TM.getSubtarget<MipsSubtarget>().inMips16Mode())
|
||||||
|
// return false;
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -399,6 +399,8 @@ static void emitGPDisp(MachineFunction &F, const MipsInstrInfo *TII) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool MipsLongBranch::runOnMachineFunction(MachineFunction &F) {
|
bool MipsLongBranch::runOnMachineFunction(MachineFunction &F) {
|
||||||
|
if (TM.getSubtarget<MipsSubtarget>().inMips16Mode())
|
||||||
|
return false;
|
||||||
if ((TM.getRelocationModel() == Reloc::PIC_) &&
|
if ((TM.getRelocationModel() == Reloc::PIC_) &&
|
||||||
TM.getSubtarget<MipsSubtarget>().isABI_O32() &&
|
TM.getSubtarget<MipsSubtarget>().isABI_O32() &&
|
||||||
F.getInfo<MipsFunctionInfo>()->globalBaseRegSet())
|
F.getInfo<MipsFunctionInfo>()->globalBaseRegSet())
|
||||||
|
34
lib/Target/Mips/MipsModuleISelDAGToDAG.cpp
Normal file
34
lib/Target/Mips/MipsModuleISelDAGToDAG.cpp
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
// Instruction Selector Subtarget Control
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
// This file defines a pass used to change the subtarget for the
|
||||||
|
// Mips Instruction selector.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#include "MipsISelDAGToDAG.h"
|
||||||
|
#include "MipsModuleISelDAGToDAG.h"
|
||||||
|
#include "llvm/Support/Casting.h"
|
||||||
|
#include "llvm/Support/Debug.h"
|
||||||
|
#include "llvm/Support/raw_ostream.h"
|
||||||
|
|
||||||
|
namespace llvm {
|
||||||
|
|
||||||
|
bool MipsModuleDAGToDAGISel::runOnMachineFunction(MachineFunction &MF) {
|
||||||
|
DEBUG(errs() << "In MipsModuleDAGToDAGISel::runMachineFunction\n");
|
||||||
|
const_cast<MipsSubtarget&>(Subtarget).resetSubtarget(&MF);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
char MipsModuleDAGToDAGISel::ID = 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
llvm::FunctionPass *llvm::createMipsModuleISelDag(MipsTargetMachine &TM) {
|
||||||
|
return new MipsModuleDAGToDAGISel(TM);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
66
lib/Target/Mips/MipsModuleISelDAGToDAG.h
Normal file
66
lib/Target/Mips/MipsModuleISelDAGToDAG.h
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
//===---- MipsModuleISelDAGToDAG.h - Change Subtarget --------===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is distributed under the University of Illinois Open Source
|
||||||
|
// License. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// This file defines a pass used to change the subtarget for the
|
||||||
|
// Mips Instruction selector.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#ifndef MIPSMODULEISELDAGTODAG_H
|
||||||
|
#define MIPSMODULEISELDAGTODAG_H
|
||||||
|
|
||||||
|
#include "Mips.h"
|
||||||
|
#include "MipsSubtarget.h"
|
||||||
|
#include "MipsTargetMachine.h"
|
||||||
|
#include "llvm/CodeGen/SelectionDAGISel.h"
|
||||||
|
|
||||||
|
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
// Instruction Selector Implementation
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
// MipsModuleDAGToDAGISel - MIPS specific code to select MIPS machine
|
||||||
|
// instructions for SelectionDAG operations.
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
namespace llvm {
|
||||||
|
|
||||||
|
class MipsModuleDAGToDAGISel : public MachineFunctionPass {
|
||||||
|
public:
|
||||||
|
|
||||||
|
static char ID;
|
||||||
|
|
||||||
|
explicit MipsModuleDAGToDAGISel(MipsTargetMachine &TM_)
|
||||||
|
: MachineFunctionPass(ID),
|
||||||
|
TM(TM_), Subtarget(TM.getSubtarget<MipsSubtarget>()) {}
|
||||||
|
|
||||||
|
// Pass Name
|
||||||
|
virtual const char *getPassName() const {
|
||||||
|
return "MIPS DAG->DAG Pattern Instruction Selection";
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool runOnMachineFunction(MachineFunction &MF);
|
||||||
|
|
||||||
|
virtual SDNode *Select(SDNode *N) {
|
||||||
|
llvm_unreachable("unexpected");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/// Keep a pointer to the MipsSubtarget around so that we can make the right
|
||||||
|
/// decision when generating code for different targets.
|
||||||
|
const TargetMachine &TM;
|
||||||
|
const MipsSubtarget &Subtarget;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// createMipsISelDag - This pass converts a legalized DAG into a
|
||||||
|
/// MIPS-specific DAG, ready for instruction scheduling.
|
||||||
|
FunctionPass *createMipsModuleISelDag(MipsTargetMachine &TM);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -35,6 +35,11 @@
|
|||||||
#include "llvm/Target/TargetMachine.h"
|
#include "llvm/Target/TargetMachine.h"
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
|
bool MipsSEDAGToDAGISel::runOnMachineFunction(MachineFunction &MF) {
|
||||||
|
if (Subtarget.inMips16Mode())
|
||||||
|
return false;
|
||||||
|
return MipsDAGToDAGISel::runOnMachineFunction(MF);
|
||||||
|
}
|
||||||
|
|
||||||
bool MipsSEDAGToDAGISel::replaceUsesWithZeroReg(MachineRegisterInfo *MRI,
|
bool MipsSEDAGToDAGISel::replaceUsesWithZeroReg(MachineRegisterInfo *MRI,
|
||||||
const MachineInstr& MI) {
|
const MachineInstr& MI) {
|
||||||
|
@ -24,6 +24,9 @@ public:
|
|||||||
explicit MipsSEDAGToDAGISel(MipsTargetMachine &TM) : MipsDAGToDAGISel(TM) {}
|
explicit MipsSEDAGToDAGISel(MipsTargetMachine &TM) : MipsDAGToDAGISel(TM) {}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
virtual bool runOnMachineFunction(MachineFunction &MF);
|
||||||
|
|
||||||
bool replaceUsesWithZeroReg(MachineRegisterInfo *MRI, const MachineInstr&);
|
bool replaceUsesWithZeroReg(MachineRegisterInfo *MRI, const MachineInstr&);
|
||||||
|
|
||||||
std::pair<SDNode*, SDNode*> selectMULT(SDNode *N, unsigned Opc, DebugLoc dl,
|
std::pair<SDNode*, SDNode*> selectMULT(SDNode *N, unsigned Opc, DebugLoc dl,
|
||||||
|
@ -27,6 +27,9 @@ EnableMipsTailCalls("enable-mips-tail-calls", cl::Hidden,
|
|||||||
MipsSETargetLowering::MipsSETargetLowering(MipsTargetMachine &TM)
|
MipsSETargetLowering::MipsSETargetLowering(MipsTargetMachine &TM)
|
||||||
: MipsTargetLowering(TM) {
|
: MipsTargetLowering(TM) {
|
||||||
// Set up the register classes
|
// Set up the register classes
|
||||||
|
|
||||||
|
clearRegisterClasses();
|
||||||
|
|
||||||
addRegisterClass(MVT::i32, &Mips::CPURegsRegClass);
|
addRegisterClass(MVT::i32, &Mips::CPURegsRegClass);
|
||||||
|
|
||||||
if (HasMips64)
|
if (HasMips64)
|
||||||
|
@ -11,29 +11,49 @@
|
|||||||
//
|
//
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#define DEBUG_TYPE "mips-subtarget"
|
||||||
|
|
||||||
|
#include "MipsMachineFunction.h"
|
||||||
#include "MipsSubtarget.h"
|
#include "MipsSubtarget.h"
|
||||||
|
#include "MipsTargetMachine.h"
|
||||||
#include "Mips.h"
|
#include "Mips.h"
|
||||||
#include "MipsRegisterInfo.h"
|
#include "MipsRegisterInfo.h"
|
||||||
|
#include "llvm/IR/Attributes.h"
|
||||||
|
#include "llvm/IR/Function.h"
|
||||||
|
#include "llvm/Support/CommandLine.h"
|
||||||
|
#include "llvm/Support/Debug.h"
|
||||||
#include "llvm/Support/TargetRegistry.h"
|
#include "llvm/Support/TargetRegistry.h"
|
||||||
|
#include "llvm/Support/raw_ostream.h"
|
||||||
|
|
||||||
#define GET_SUBTARGETINFO_TARGET_DESC
|
#define GET_SUBTARGETINFO_TARGET_DESC
|
||||||
#define GET_SUBTARGETINFO_CTOR
|
#define GET_SUBTARGETINFO_CTOR
|
||||||
#include "MipsGenSubtargetInfo.inc"
|
#include "MipsGenSubtargetInfo.inc"
|
||||||
|
|
||||||
|
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
|
// FIXME: Maybe this should be on by default when Mips16 is specified
|
||||||
|
//
|
||||||
|
static cl::opt<bool> Mixed16_32(
|
||||||
|
"mips-mixed-16-32",
|
||||||
|
cl::init(false),
|
||||||
|
cl::desc("Allow for a mixture of Mips16 "
|
||||||
|
"and Mips32 code in a single source file"),
|
||||||
|
cl::Hidden);
|
||||||
|
|
||||||
void MipsSubtarget::anchor() { }
|
void MipsSubtarget::anchor() { }
|
||||||
|
|
||||||
MipsSubtarget::MipsSubtarget(const std::string &TT, const std::string &CPU,
|
MipsSubtarget::MipsSubtarget(const std::string &TT, const std::string &CPU,
|
||||||
const std::string &FS, bool little,
|
const std::string &FS, bool little,
|
||||||
Reloc::Model _RM) :
|
Reloc::Model _RM, MipsTargetMachine *_TM) :
|
||||||
MipsGenSubtargetInfo(TT, CPU, FS),
|
MipsGenSubtargetInfo(TT, CPU, FS),
|
||||||
MipsArchVersion(Mips32), MipsABI(UnknownABI), IsLittle(little),
|
MipsArchVersion(Mips32), MipsABI(UnknownABI), IsLittle(little),
|
||||||
IsSingleFloat(false), IsFP64bit(false), IsGP64bit(false), HasVFPU(false),
|
IsSingleFloat(false), IsFP64bit(false), IsGP64bit(false), HasVFPU(false),
|
||||||
IsLinux(true), HasSEInReg(false), HasCondMov(false), HasSwap(false),
|
IsLinux(true), HasSEInReg(false), HasCondMov(false), HasSwap(false),
|
||||||
HasBitCount(false), HasFPIdx(false),
|
HasBitCount(false), HasFPIdx(false),
|
||||||
InMips16Mode(false), InMicroMipsMode(false), HasDSP(false), HasDSPR2(false),
|
InMips16Mode(false), InMicroMipsMode(false), HasDSP(false), HasDSPR2(false),
|
||||||
RM(_RM)
|
AllowMixed16_32(Mixed16_32),
|
||||||
|
RM(_RM), OverrideMode(NoOverride), TM(_TM)
|
||||||
{
|
{
|
||||||
std::string CPUName = CPU;
|
std::string CPUName = CPU;
|
||||||
if (CPUName.empty())
|
if (CPUName.empty())
|
||||||
@ -42,6 +62,8 @@ MipsSubtarget::MipsSubtarget(const std::string &TT, const std::string &CPU,
|
|||||||
// Parse features string.
|
// Parse features string.
|
||||||
ParseSubtargetFeatures(CPUName, FS);
|
ParseSubtargetFeatures(CPUName, FS);
|
||||||
|
|
||||||
|
PreviousInMips16Mode = InMips16Mode;
|
||||||
|
|
||||||
// Initialize scheduling itinerary for the specified CPU.
|
// Initialize scheduling itinerary for the specified CPU.
|
||||||
InstrItins = getInstrItineraryForCPU(CPUName);
|
InstrItins = getInstrItineraryForCPU(CPUName);
|
||||||
|
|
||||||
@ -72,3 +94,48 @@ MipsSubtarget::enablePostRAScheduler(CodeGenOpt::Level OptLevel,
|
|||||||
&Mips::CPU64RegsRegClass : &Mips::CPURegsRegClass);
|
&Mips::CPU64RegsRegClass : &Mips::CPURegsRegClass);
|
||||||
return OptLevel >= CodeGenOpt::Aggressive;
|
return OptLevel >= CodeGenOpt::Aggressive;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//FIXME: This logic for reseting the subtarget along with
|
||||||
|
// the helper classes can probably be simplified but there are a lot of
|
||||||
|
// cases so we will defer rewriting this to later.
|
||||||
|
//
|
||||||
|
void MipsSubtarget::resetSubtarget(MachineFunction *MF) {
|
||||||
|
bool ChangeToMips16 = false, ChangeToNoMips16 = false;
|
||||||
|
DEBUG(dbgs() << "resetSubtargetFeatures" << "\n");
|
||||||
|
AttributeSet FnAttrs = MF->getFunction()->getAttributes();
|
||||||
|
ChangeToMips16 = FnAttrs.hasAttribute(AttributeSet::FunctionIndex,
|
||||||
|
"mips16");
|
||||||
|
ChangeToNoMips16 = FnAttrs.hasAttribute(AttributeSet::FunctionIndex,
|
||||||
|
"nomips16");
|
||||||
|
assert (!(ChangeToMips16 & ChangeToNoMips16) &&
|
||||||
|
"mips16 and nomips16 specified on the same function");
|
||||||
|
if (ChangeToMips16) {
|
||||||
|
if (PreviousInMips16Mode)
|
||||||
|
return;
|
||||||
|
OverrideMode = Mips16Override;
|
||||||
|
PreviousInMips16Mode = true;
|
||||||
|
TM->setHelperClassesMips16();
|
||||||
|
return;
|
||||||
|
} else if (ChangeToNoMips16) {
|
||||||
|
if (!PreviousInMips16Mode)
|
||||||
|
return;
|
||||||
|
OverrideMode = NoMips16Override;
|
||||||
|
PreviousInMips16Mode = false;
|
||||||
|
TM->setHelperClassesMipsSE();
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
if (OverrideMode == NoOverride)
|
||||||
|
return;
|
||||||
|
OverrideMode = NoOverride;
|
||||||
|
DEBUG(dbgs() << "back to default" << "\n");
|
||||||
|
if (inMips16Mode() && !PreviousInMips16Mode) {
|
||||||
|
TM->setHelperClassesMips16();
|
||||||
|
PreviousInMips16Mode = true;
|
||||||
|
} else if (!inMips16Mode() && PreviousInMips16Mode) {
|
||||||
|
TM->setHelperClassesMipsSE();
|
||||||
|
PreviousInMips16Mode = false;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -16,7 +16,9 @@
|
|||||||
|
|
||||||
#include "MCTargetDesc/MipsReginfo.h"
|
#include "MCTargetDesc/MipsReginfo.h"
|
||||||
#include "llvm/MC/MCInstrItineraries.h"
|
#include "llvm/MC/MCInstrItineraries.h"
|
||||||
|
#include "llvm/Support/ErrorHandling.h"
|
||||||
#include "llvm/Target/TargetSubtargetInfo.h"
|
#include "llvm/Target/TargetSubtargetInfo.h"
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#define GET_SUBTARGETINFO_HEADER
|
#define GET_SUBTARGETINFO_HEADER
|
||||||
@ -25,6 +27,8 @@
|
|||||||
namespace llvm {
|
namespace llvm {
|
||||||
class StringRef;
|
class StringRef;
|
||||||
|
|
||||||
|
class MipsTargetMachine;
|
||||||
|
|
||||||
class MipsSubtarget : public MipsGenSubtargetInfo {
|
class MipsSubtarget : public MipsGenSubtargetInfo {
|
||||||
virtual void anchor();
|
virtual void anchor();
|
||||||
|
|
||||||
@ -89,12 +93,18 @@ protected:
|
|||||||
// InMips16 -- can process Mips16 instructions
|
// InMips16 -- can process Mips16 instructions
|
||||||
bool InMips16Mode;
|
bool InMips16Mode;
|
||||||
|
|
||||||
|
// PreviousInMips16 -- the function we just processed was in Mips 16 Mode
|
||||||
|
bool PreviousInMips16Mode;
|
||||||
|
|
||||||
// InMicroMips -- can process MicroMips instructions
|
// InMicroMips -- can process MicroMips instructions
|
||||||
bool InMicroMipsMode;
|
bool InMicroMipsMode;
|
||||||
|
|
||||||
// HasDSP, HasDSPR2 -- supports DSP ASE.
|
// HasDSP, HasDSPR2 -- supports DSP ASE.
|
||||||
bool HasDSP, HasDSPR2;
|
bool HasDSP, HasDSPR2;
|
||||||
|
|
||||||
|
// Allow mixed Mips16 and Mips32 in one source file
|
||||||
|
bool AllowMixed16_32;
|
||||||
|
|
||||||
InstrItineraryData InstrItins;
|
InstrItineraryData InstrItins;
|
||||||
|
|
||||||
// The instance to the register info section object
|
// The instance to the register info section object
|
||||||
@ -103,6 +113,12 @@ protected:
|
|||||||
// Relocation Model
|
// Relocation Model
|
||||||
Reloc::Model RM;
|
Reloc::Model RM;
|
||||||
|
|
||||||
|
// We can override the determination of whether we are in mips16 mode
|
||||||
|
// as from the command line
|
||||||
|
enum {NoOverride, Mips16Override, NoMips16Override} OverrideMode;
|
||||||
|
|
||||||
|
MipsTargetMachine *TM;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual bool enablePostRAScheduler(CodeGenOpt::Level OptLevel,
|
virtual bool enablePostRAScheduler(CodeGenOpt::Level OptLevel,
|
||||||
AntiDepBreakMode& Mode,
|
AntiDepBreakMode& Mode,
|
||||||
@ -118,7 +134,8 @@ public:
|
|||||||
/// This constructor initializes the data members to match that
|
/// This constructor initializes the data members to match that
|
||||||
/// of the specified triple.
|
/// of the specified triple.
|
||||||
MipsSubtarget(const std::string &TT, const std::string &CPU,
|
MipsSubtarget(const std::string &TT, const std::string &CPU,
|
||||||
const std::string &FS, bool little, Reloc::Model RM);
|
const std::string &FS, bool little, Reloc::Model RM,
|
||||||
|
MipsTargetMachine *TM);
|
||||||
|
|
||||||
/// ParseSubtargetFeatures - Parses features string setting specified
|
/// ParseSubtargetFeatures - Parses features string setting specified
|
||||||
/// subtarget options. Definition of function is auto generated by tblgen.
|
/// subtarget options. Definition of function is auto generated by tblgen.
|
||||||
@ -137,7 +154,20 @@ public:
|
|||||||
bool isSingleFloat() const { return IsSingleFloat; }
|
bool isSingleFloat() const { return IsSingleFloat; }
|
||||||
bool isNotSingleFloat() const { return !IsSingleFloat; }
|
bool isNotSingleFloat() const { return !IsSingleFloat; }
|
||||||
bool hasVFPU() const { return HasVFPU; }
|
bool hasVFPU() const { return HasVFPU; }
|
||||||
bool inMips16Mode() const { return InMips16Mode; }
|
bool inMips16Mode() const {
|
||||||
|
switch (OverrideMode) {
|
||||||
|
case NoOverride:
|
||||||
|
return InMips16Mode;
|
||||||
|
case Mips16Override:
|
||||||
|
return true;
|
||||||
|
case NoMips16Override:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
llvm_unreachable("Unexpected mode");
|
||||||
|
}
|
||||||
|
bool inMips16ModeDefault() {
|
||||||
|
return InMips16Mode;
|
||||||
|
}
|
||||||
bool inMicroMipsMode() const { return InMicroMipsMode; }
|
bool inMicroMipsMode() const { return InMicroMipsMode; }
|
||||||
bool hasDSP() const { return HasDSP; }
|
bool hasDSP() const { return HasDSP; }
|
||||||
bool hasDSPR2() const { return HasDSPR2; }
|
bool hasDSPR2() const { return HasDSPR2; }
|
||||||
@ -153,11 +183,18 @@ public:
|
|||||||
bool hasBitCount() const { return HasBitCount; }
|
bool hasBitCount() const { return HasBitCount; }
|
||||||
bool hasFPIdx() const { return HasFPIdx; }
|
bool hasFPIdx() const { return HasFPIdx; }
|
||||||
|
|
||||||
|
bool allowMixed16_32() const { return AllowMixed16_32;};
|
||||||
|
|
||||||
// Grab MipsRegInfo object
|
// Grab MipsRegInfo object
|
||||||
const MipsReginfo &getMReginfo() const { return MRI; }
|
const MipsReginfo &getMReginfo() const { return MRI; }
|
||||||
|
|
||||||
// Grab relocation model
|
// Grab relocation model
|
||||||
Reloc::Model getRelocationModel() const {return RM;}
|
Reloc::Model getRelocationModel() const {return RM;}
|
||||||
|
|
||||||
|
/// \brief Reset the subtarget for the Mips target.
|
||||||
|
void resetSubtarget(MachineFunction *MF);
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
} // End llvm namespace
|
} // End llvm namespace
|
||||||
|
|
||||||
|
@ -15,11 +15,25 @@
|
|||||||
#include "Mips.h"
|
#include "Mips.h"
|
||||||
#include "MipsFrameLowering.h"
|
#include "MipsFrameLowering.h"
|
||||||
#include "MipsInstrInfo.h"
|
#include "MipsInstrInfo.h"
|
||||||
|
#include "MipsModuleISelDAGToDAG.h"
|
||||||
|
#include "MipsSEFrameLowering.h"
|
||||||
|
#include "MipsSEInstrInfo.h"
|
||||||
|
#include "MipsSEISelLowering.h"
|
||||||
|
#include "MipsSEISelDAGToDAG.h"
|
||||||
|
#include "Mips16FrameLowering.h"
|
||||||
|
#include "Mips16InstrInfo.h"
|
||||||
|
#include "Mips16ISelDAGToDAG.h"
|
||||||
|
#include "Mips16ISelLowering.h"
|
||||||
|
#include "llvm/Analysis/TargetTransformInfo.h"
|
||||||
#include "llvm/CodeGen/Passes.h"
|
#include "llvm/CodeGen/Passes.h"
|
||||||
#include "llvm/PassManager.h"
|
#include "llvm/PassManager.h"
|
||||||
|
#include "llvm/Support/Debug.h"
|
||||||
|
#include "llvm/Support/raw_ostream.h"
|
||||||
#include "llvm/Support/TargetRegistry.h"
|
#include "llvm/Support/TargetRegistry.h"
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
extern "C" void LLVMInitializeMipsTarget() {
|
extern "C" void LLVMInitializeMipsTarget() {
|
||||||
// Register the target.
|
// Register the target.
|
||||||
RegisterTargetMachine<MipsebTargetMachine> X(TheMipsTarget);
|
RegisterTargetMachine<MipsebTargetMachine> X(TheMipsTarget);
|
||||||
@ -42,7 +56,7 @@ MipsTargetMachine(const Target &T, StringRef TT,
|
|||||||
CodeGenOpt::Level OL,
|
CodeGenOpt::Level OL,
|
||||||
bool isLittle)
|
bool isLittle)
|
||||||
: LLVMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL),
|
: LLVMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL),
|
||||||
Subtarget(TT, CPU, FS, isLittle, RM),
|
Subtarget(TT, CPU, FS, isLittle, RM, this),
|
||||||
DL(isLittle ?
|
DL(isLittle ?
|
||||||
(Subtarget.isABI_N64() ?
|
(Subtarget.isABI_N64() ?
|
||||||
"e-p:64:64:64-i8:8:32-i16:16:32-i64:64:64-f128:128:128-"
|
"e-p:64:64:64-i8:8:32-i16:16:32-i64:64:64-f128:128:128-"
|
||||||
@ -54,9 +68,46 @@ MipsTargetMachine(const Target &T, StringRef TT,
|
|||||||
"E-p:32:32:32-i8:8:32-i16:16:32-i64:64:64-n32-S64")),
|
"E-p:32:32:32-i8:8:32-i16:16:32-i64:64:64-n32-S64")),
|
||||||
InstrInfo(MipsInstrInfo::create(*this)),
|
InstrInfo(MipsInstrInfo::create(*this)),
|
||||||
FrameLowering(MipsFrameLowering::create(*this, Subtarget)),
|
FrameLowering(MipsFrameLowering::create(*this, Subtarget)),
|
||||||
TLInfo(MipsTargetLowering::create(*this)), TSInfo(*this), JITInfo() {
|
TLInfo(MipsTargetLowering::create(*this)),
|
||||||
|
TSInfo(*this), JITInfo() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MipsTargetMachine::setHelperClassesMips16() {
|
||||||
|
InstrInfoSE.swap(InstrInfo);
|
||||||
|
FrameLoweringSE.swap(FrameLowering);
|
||||||
|
TLInfoSE.swap(TLInfo);
|
||||||
|
if (!InstrInfo16) {
|
||||||
|
InstrInfo.reset(MipsInstrInfo::create(*this));
|
||||||
|
FrameLowering.reset(MipsFrameLowering::create(*this, Subtarget));
|
||||||
|
TLInfo.reset(MipsTargetLowering::create(*this));
|
||||||
|
} else {
|
||||||
|
InstrInfo16.swap(InstrInfo);
|
||||||
|
FrameLowering16.swap(FrameLowering);
|
||||||
|
TLInfo16.swap(TLInfo);
|
||||||
|
}
|
||||||
|
assert(TLInfo && "null target lowering 16");
|
||||||
|
assert(InstrInfo && "null instr info 16");
|
||||||
|
assert(FrameLowering && "null frame lowering 16");
|
||||||
|
}
|
||||||
|
|
||||||
|
void MipsTargetMachine::setHelperClassesMipsSE() {
|
||||||
|
InstrInfo16.swap(InstrInfo);
|
||||||
|
FrameLowering16.swap(FrameLowering);
|
||||||
|
TLInfo16.swap(TLInfo);
|
||||||
|
if (!InstrInfoSE) {
|
||||||
|
InstrInfo.reset(MipsInstrInfo::create(*this));
|
||||||
|
FrameLowering.reset(MipsFrameLowering::create(*this, Subtarget));
|
||||||
|
TLInfo.reset(MipsTargetLowering::create(*this));
|
||||||
|
} else {
|
||||||
|
InstrInfoSE.swap(InstrInfo);
|
||||||
|
FrameLoweringSE.swap(FrameLowering);
|
||||||
|
TLInfoSE.swap(TLInfo);
|
||||||
|
}
|
||||||
|
assert(TLInfo && "null target lowering in SE");
|
||||||
|
assert(InstrInfo && "null instr info SE");
|
||||||
|
assert(FrameLowering && "null frame lowering SE");
|
||||||
|
}
|
||||||
void MipsebTargetMachine::anchor() { }
|
void MipsebTargetMachine::anchor() { }
|
||||||
|
|
||||||
MipsebTargetMachine::
|
MipsebTargetMachine::
|
||||||
@ -102,21 +153,42 @@ TargetPassConfig *MipsTargetMachine::createPassConfig(PassManagerBase &PM) {
|
|||||||
// Install an instruction selector pass using
|
// Install an instruction selector pass using
|
||||||
// the ISelDag to gen Mips code.
|
// the ISelDag to gen Mips code.
|
||||||
bool MipsPassConfig::addInstSelector() {
|
bool MipsPassConfig::addInstSelector() {
|
||||||
addPass(createMipsISelDag(getMipsTargetMachine()));
|
if (getMipsSubtarget().allowMixed16_32()) {
|
||||||
|
addPass(createMipsModuleISelDag(getMipsTargetMachine()));
|
||||||
|
addPass(createMips16ISelDag(getMipsTargetMachine()));
|
||||||
|
addPass(createMipsSEISelDag(getMipsTargetMachine()));
|
||||||
|
} else {
|
||||||
|
addPass(createMipsISelDag(getMipsTargetMachine()));
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MipsTargetMachine::addAnalysisPasses(PassManagerBase &PM) {
|
||||||
|
if (Subtarget.allowMixed16_32()) {
|
||||||
|
DEBUG(errs() << "No ");
|
||||||
|
//FIXME: The Basic Target Transform Info
|
||||||
|
// pass needs to become a function pass instead of
|
||||||
|
// being an immutable pass and then this method as it exists now
|
||||||
|
// would be unnecessary.
|
||||||
|
PM.add(createNoTargetTransformInfoPass());
|
||||||
|
} else
|
||||||
|
LLVMTargetMachine::addAnalysisPasses(PM);
|
||||||
|
DEBUG(errs() << "Target Transform Info Pass Added\n");
|
||||||
|
}
|
||||||
|
|
||||||
// Implemented by targets that want to run passes immediately before
|
// Implemented by targets that want to run passes immediately before
|
||||||
// machine code is emitted. return true if -print-machineinstrs should
|
// machine code is emitted. return true if -print-machineinstrs should
|
||||||
// print out the code after the passes.
|
// print out the code after the passes.
|
||||||
bool MipsPassConfig::addPreEmitPass() {
|
bool MipsPassConfig::addPreEmitPass() {
|
||||||
MipsTargetMachine &TM = getMipsTargetMachine();
|
MipsTargetMachine &TM = getMipsTargetMachine();
|
||||||
|
const MipsSubtarget &Subtarget = TM.getSubtarget<MipsSubtarget>();
|
||||||
addPass(createMipsDelaySlotFillerPass(TM));
|
addPass(createMipsDelaySlotFillerPass(TM));
|
||||||
|
|
||||||
// NOTE: long branch has not been implemented for mips16.
|
if (Subtarget.hasStandardEncoding() ||
|
||||||
if (TM.getSubtarget<MipsSubtarget>().hasStandardEncoding())
|
Subtarget.allowMixed16_32())
|
||||||
addPass(createMipsLongBranchPass(TM));
|
addPass(createMipsLongBranchPass(TM));
|
||||||
if (TM.getSubtarget<MipsSubtarget>().inMips16Mode())
|
if (Subtarget.inMips16Mode() ||
|
||||||
|
Subtarget.allowMixed16_32())
|
||||||
addPass(createMipsConstantIslandPass(TM));
|
addPass(createMipsConstantIslandPass(TM));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -21,6 +21,8 @@
|
|||||||
#include "MipsSelectionDAGInfo.h"
|
#include "MipsSelectionDAGInfo.h"
|
||||||
#include "MipsSubtarget.h"
|
#include "MipsSubtarget.h"
|
||||||
#include "llvm/ADT/OwningPtr.h"
|
#include "llvm/ADT/OwningPtr.h"
|
||||||
|
#include "llvm/CodeGen/Passes.h"
|
||||||
|
#include "llvm/CodeGen/SelectionDAGISel.h"
|
||||||
#include "llvm/IR/DataLayout.h"
|
#include "llvm/IR/DataLayout.h"
|
||||||
#include "llvm/Target/TargetFrameLowering.h"
|
#include "llvm/Target/TargetFrameLowering.h"
|
||||||
#include "llvm/Target/TargetMachine.h"
|
#include "llvm/Target/TargetMachine.h"
|
||||||
@ -35,6 +37,12 @@ class MipsTargetMachine : public LLVMTargetMachine {
|
|||||||
OwningPtr<const MipsInstrInfo> InstrInfo;
|
OwningPtr<const MipsInstrInfo> InstrInfo;
|
||||||
OwningPtr<const MipsFrameLowering> FrameLowering;
|
OwningPtr<const MipsFrameLowering> FrameLowering;
|
||||||
OwningPtr<const MipsTargetLowering> TLInfo;
|
OwningPtr<const MipsTargetLowering> TLInfo;
|
||||||
|
OwningPtr<const MipsInstrInfo> InstrInfo16;
|
||||||
|
OwningPtr<const MipsFrameLowering> FrameLowering16;
|
||||||
|
OwningPtr<const MipsTargetLowering> TLInfo16;
|
||||||
|
OwningPtr<const MipsInstrInfo> InstrInfoSE;
|
||||||
|
OwningPtr<const MipsFrameLowering> FrameLoweringSE;
|
||||||
|
OwningPtr<const MipsTargetLowering> TLInfoSE;
|
||||||
MipsSelectionDAGInfo TSInfo;
|
MipsSelectionDAGInfo TSInfo;
|
||||||
MipsJITInfo JITInfo;
|
MipsJITInfo JITInfo;
|
||||||
|
|
||||||
@ -47,6 +55,8 @@ public:
|
|||||||
|
|
||||||
virtual ~MipsTargetMachine() {}
|
virtual ~MipsTargetMachine() {}
|
||||||
|
|
||||||
|
virtual void addAnalysisPasses(PassManagerBase &PM);
|
||||||
|
|
||||||
virtual const MipsInstrInfo *getInstrInfo() const
|
virtual const MipsInstrInfo *getInstrInfo() const
|
||||||
{ return InstrInfo.get(); }
|
{ return InstrInfo.get(); }
|
||||||
virtual const TargetFrameLowering *getFrameLowering() const
|
virtual const TargetFrameLowering *getFrameLowering() const
|
||||||
@ -73,6 +83,13 @@ public:
|
|||||||
// Pass Pipeline Configuration
|
// Pass Pipeline Configuration
|
||||||
virtual TargetPassConfig *createPassConfig(PassManagerBase &PM);
|
virtual TargetPassConfig *createPassConfig(PassManagerBase &PM);
|
||||||
virtual bool addCodeEmitter(PassManagerBase &PM, JITCodeEmitter &JCE);
|
virtual bool addCodeEmitter(PassManagerBase &PM, JITCodeEmitter &JCE);
|
||||||
|
|
||||||
|
// Set helper classes
|
||||||
|
void setHelperClassesMips16();
|
||||||
|
|
||||||
|
void setHelperClassesMipsSE();
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/// MipsebTargetMachine - Mips32/64 big endian target machine.
|
/// MipsebTargetMachine - Mips32/64 big endian target machine.
|
||||||
|
14
test/CodeGen/Mips/mips16_32_1.ll
Normal file
14
test/CodeGen/Mips/mips16_32_1.ll
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=pic -O3 < %s -mips-mixed-16-32 | FileCheck %s
|
||||||
|
; RUN: llc -march=mipsel -mcpu=mips32 -relocation-model=pic -O3 < %s -mips-mixed-16-32 | FileCheck %s
|
||||||
|
|
||||||
|
define void @foo() #0 {
|
||||||
|
entry:
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
; CHECK: .set mips16 # @foo
|
||||||
|
; CHECK: .ent foo
|
||||||
|
; CHECK: save {{.+}}
|
||||||
|
; CHECK: restore {{.+}}
|
||||||
|
; CHECK: .end foo
|
||||||
|
attributes #0 = { nounwind "less-precise-fpmad"="false" "mips16" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
59
test/CodeGen/Mips/mips16_32_10.ll
Normal file
59
test/CodeGen/Mips/mips16_32_10.ll
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=static -O3 < %s -mips-mixed-16-32 | FileCheck %s -check-prefix=16
|
||||||
|
|
||||||
|
define void @foo() #0 {
|
||||||
|
entry:
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
; 16: .set nomips16 # @foo
|
||||||
|
; 16: .ent foo
|
||||||
|
; 16: .set noreorder
|
||||||
|
; 16: .set nomacro
|
||||||
|
; 16: .set noat
|
||||||
|
; 16: jr $ra
|
||||||
|
; 16: nop
|
||||||
|
; 16: .set at
|
||||||
|
; 16: .set macro
|
||||||
|
; 16: .set reorder
|
||||||
|
; 16: .end foo
|
||||||
|
|
||||||
|
define void @nofoo() #1 {
|
||||||
|
entry:
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
; 16: .set mips16 # @nofoo
|
||||||
|
; 16: .ent nofoo
|
||||||
|
|
||||||
|
; 16: save {{.+}}
|
||||||
|
; 16: restore {{.+}}
|
||||||
|
; 16: .end nofoo
|
||||||
|
|
||||||
|
define i32 @main() #2 {
|
||||||
|
entry:
|
||||||
|
ret i32 0
|
||||||
|
}
|
||||||
|
|
||||||
|
; 16: .set nomips16 # @main
|
||||||
|
; 16: .ent main
|
||||||
|
; 16: .set noreorder
|
||||||
|
; 16: .set nomacro
|
||||||
|
; 16: .set noat
|
||||||
|
; 16: jr $ra
|
||||||
|
; 16: .set at
|
||||||
|
; 16: .set macro
|
||||||
|
; 16: .set reorder
|
||||||
|
; 16: .end main
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
attributes #0 = { nounwind "less-precise-fpmad"="false" "nomips16" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
||||||
|
attributes #1 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
||||||
|
attributes #2 = { nounwind "less-precise-fpmad"="false" "nomips16" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
70
test/CodeGen/Mips/mips16_32_3.ll
Normal file
70
test/CodeGen/Mips/mips16_32_3.ll
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=static -O3 < %s -mips-mixed-16-32 | FileCheck %s -check-prefix=16
|
||||||
|
; RUN: llc -march=mipsel -mcpu=mips32 -relocation-model=static -O3 < %s -mips-mixed-16-32 | FileCheck %s -check-prefix=32
|
||||||
|
|
||||||
|
define void @foo() #0 {
|
||||||
|
entry:
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
; 16: .set mips16 # @foo
|
||||||
|
; 16: .ent foo
|
||||||
|
; 16: save {{.+}}
|
||||||
|
; 16: restore {{.+}}
|
||||||
|
; 16: .end foo
|
||||||
|
; 32: .set mips16 # @foo
|
||||||
|
; 32: .ent foo
|
||||||
|
; 32: save {{.+}}
|
||||||
|
; 32: restore {{.+}}
|
||||||
|
; 32: .end foo
|
||||||
|
define void @nofoo() #1 {
|
||||||
|
entry:
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
; 16: .set nomips16 # @nofoo
|
||||||
|
; 16: .ent nofoo
|
||||||
|
; 16: .set noreorder
|
||||||
|
; 16: .set nomacro
|
||||||
|
; 16: .set noat
|
||||||
|
; 16: jr $ra
|
||||||
|
; 16: nop
|
||||||
|
; 16: .set at
|
||||||
|
; 16: .set macro
|
||||||
|
; 16: .set reorder
|
||||||
|
; 16: .end nofoo
|
||||||
|
; 32: .set nomips16 # @nofoo
|
||||||
|
; 32: .ent nofoo
|
||||||
|
; 32: .set noreorder
|
||||||
|
; 32: .set nomacro
|
||||||
|
; 32: .set noat
|
||||||
|
; 32: jr $ra
|
||||||
|
; 32: nop
|
||||||
|
; 32: .set at
|
||||||
|
; 32: .set macro
|
||||||
|
; 32: .set reorder
|
||||||
|
; 32: .end nofoo
|
||||||
|
define i32 @main() #2 {
|
||||||
|
entry:
|
||||||
|
ret i32 0
|
||||||
|
}
|
||||||
|
|
||||||
|
; 16: .set mips16 # @main
|
||||||
|
; 16: .ent main
|
||||||
|
; 16: save {{.+}}
|
||||||
|
; 16: restore {{.+}}
|
||||||
|
; 16: .end main
|
||||||
|
; 32: .set nomips16 # @main
|
||||||
|
; 32: .ent main
|
||||||
|
; 32: .set noreorder
|
||||||
|
; 32: .set nomacro
|
||||||
|
; 32: .set noat
|
||||||
|
; 32: jr $ra
|
||||||
|
; 32: addiu $2, $zero, 0
|
||||||
|
; 32: .set at
|
||||||
|
; 32: .set macro
|
||||||
|
; 32: .set reorder
|
||||||
|
; 32: .end main
|
||||||
|
|
||||||
|
attributes #0 = { nounwind "less-precise-fpmad"="false" "mips16" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
||||||
|
attributes #1 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "nomips16" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
||||||
|
attributes #2 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
65
test/CodeGen/Mips/mips16_32_4.ll
Normal file
65
test/CodeGen/Mips/mips16_32_4.ll
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=static -O3 < %s -mips-mixed-16-32 | FileCheck %s -check-prefix=16
|
||||||
|
; RUN: llc -march=mipsel -mcpu=mips32 -relocation-model=static -O3 < %s -mips-mixed-16-32 | FileCheck %s -check-prefix=32
|
||||||
|
|
||||||
|
define void @foo() #0 {
|
||||||
|
entry:
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
; 16: .set mips16 # @foo
|
||||||
|
; 16: .ent foo
|
||||||
|
; 16: save {{.+}}
|
||||||
|
; 16: restore {{.+}}
|
||||||
|
; 16: .end foo
|
||||||
|
; 32: .set mips16 # @foo
|
||||||
|
; 32: .ent foo
|
||||||
|
; 32: save {{.+}}
|
||||||
|
; 32: restore {{.+}}
|
||||||
|
; 32: .end foo
|
||||||
|
define void @nofoo() #1 {
|
||||||
|
entry:
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
; 16: .set nomips16 # @nofoo
|
||||||
|
; 16: .ent nofoo
|
||||||
|
; 16: .set noreorder
|
||||||
|
; 16: .set nomacro
|
||||||
|
; 16: .set noat
|
||||||
|
; 16: jr $ra
|
||||||
|
; 16: nop
|
||||||
|
; 16: .set at
|
||||||
|
; 16: .set macro
|
||||||
|
; 16: .set reorder
|
||||||
|
; 16: .end nofoo
|
||||||
|
; 32: .set nomips16 # @nofoo
|
||||||
|
; 32: .ent nofoo
|
||||||
|
; 32: .set noreorder
|
||||||
|
; 32: .set nomacro
|
||||||
|
; 32: .set noat
|
||||||
|
; 32: jr $ra
|
||||||
|
; 32: nop
|
||||||
|
; 32: .set at
|
||||||
|
; 32: .set macro
|
||||||
|
; 32: .set reorder
|
||||||
|
; 32: .end nofoo
|
||||||
|
define i32 @main() #2 {
|
||||||
|
entry:
|
||||||
|
ret i32 0
|
||||||
|
}
|
||||||
|
|
||||||
|
; 16: .set mips16 # @main
|
||||||
|
; 16: .ent main
|
||||||
|
; 16: save {{.+}}
|
||||||
|
; 16: restore {{.+}}
|
||||||
|
; 16: .end main
|
||||||
|
; 32: .set mips16 # @main
|
||||||
|
; 32: .ent main
|
||||||
|
; 32: save {{.+}}
|
||||||
|
; 32: restore {{.+}}
|
||||||
|
; 32: .end main
|
||||||
|
|
||||||
|
|
||||||
|
attributes #0 = { nounwind "less-precise-fpmad"="false" "mips16" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
||||||
|
attributes #1 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "nomips16" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
||||||
|
attributes #2 = { nounwind "less-precise-fpmad"="false" "mips16" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
80
test/CodeGen/Mips/mips16_32_5.ll
Normal file
80
test/CodeGen/Mips/mips16_32_5.ll
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=static -O3 < %s -mips-mixed-16-32 | FileCheck %s -check-prefix=16
|
||||||
|
; RUN: llc -march=mipsel -mcpu=mips32 -relocation-model=static -O3 < %s -mips-mixed-16-32 | FileCheck %s -check-prefix=32
|
||||||
|
|
||||||
|
define void @foo() #0 {
|
||||||
|
entry:
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
; 16: .set mips16 # @foo
|
||||||
|
; 16: .ent foo
|
||||||
|
; 16: save {{.+}}
|
||||||
|
; 16: restore {{.+}}
|
||||||
|
; 16: .end foo
|
||||||
|
; 32: .set mips16 # @foo
|
||||||
|
; 32: .ent foo
|
||||||
|
; 32: save {{.+}}
|
||||||
|
; 32: restore {{.+}}
|
||||||
|
; 32: .end foo
|
||||||
|
define void @nofoo() #1 {
|
||||||
|
entry:
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
; 16: .set nomips16 # @nofoo
|
||||||
|
; 16: .ent nofoo
|
||||||
|
; 16: .set noreorder
|
||||||
|
; 16: .set nomacro
|
||||||
|
; 16: .set noat
|
||||||
|
; 16: jr $ra
|
||||||
|
; 16: nop
|
||||||
|
; 16: .set at
|
||||||
|
; 16: .set macro
|
||||||
|
; 16: .set reorder
|
||||||
|
; 16: .end nofoo
|
||||||
|
; 32: .set nomips16 # @nofoo
|
||||||
|
; 32: .ent nofoo
|
||||||
|
; 32: .set noreorder
|
||||||
|
; 32: .set nomacro
|
||||||
|
; 32: .set noat
|
||||||
|
; 32: jr $ra
|
||||||
|
; 32: nop
|
||||||
|
; 32: .set at
|
||||||
|
; 32: .set macro
|
||||||
|
; 32: .set reorder
|
||||||
|
; 32: .end nofoo
|
||||||
|
define i32 @main() #2 {
|
||||||
|
entry:
|
||||||
|
ret i32 0
|
||||||
|
}
|
||||||
|
|
||||||
|
; 16: .set nomips16 # @main
|
||||||
|
; 16: .ent main
|
||||||
|
; 16: .set noreorder
|
||||||
|
; 16: .set nomacro
|
||||||
|
; 16: .set noat
|
||||||
|
; 16: jr $ra
|
||||||
|
; 16: addiu $2, $zero, 0
|
||||||
|
; 16: .set at
|
||||||
|
; 16: .set macro
|
||||||
|
; 16: .set reorder
|
||||||
|
; 16: .end main
|
||||||
|
|
||||||
|
; 32: .set nomips16 # @main
|
||||||
|
; 32: .ent main
|
||||||
|
; 32: .set noreorder
|
||||||
|
; 32: .set nomacro
|
||||||
|
; 32: .set noat
|
||||||
|
; 32: jr $ra
|
||||||
|
; 32: addiu $2, $zero, 0
|
||||||
|
; 32: .set at
|
||||||
|
; 32: .set macro
|
||||||
|
; 32: .set reorder
|
||||||
|
; 32: .end main
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
attributes #0 = { nounwind "less-precise-fpmad"="false" "mips16" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
||||||
|
attributes #1 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "nomips16" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
||||||
|
attributes #2 = { nounwind "less-precise-fpmad"="false" "nomips16" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
86
test/CodeGen/Mips/mips16_32_6.ll
Normal file
86
test/CodeGen/Mips/mips16_32_6.ll
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=static -O3 < %s -mips-mixed-16-32 | FileCheck %s -check-prefix=16
|
||||||
|
; RUN: llc -march=mipsel -mcpu=mips32 -relocation-model=static -O3 < %s -mips-mixed-16-32 | FileCheck %s -check-prefix=32
|
||||||
|
|
||||||
|
define void @foo() #0 {
|
||||||
|
entry:
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
; 16: .set mips16 # @foo
|
||||||
|
; 16: .ent foo
|
||||||
|
; 16: save {{.+}}
|
||||||
|
; 16: restore {{.+}}
|
||||||
|
; 16: .end foo
|
||||||
|
; 32: .set nomips16 # @foo
|
||||||
|
; 32: .ent foo
|
||||||
|
; 32: .set noreorder
|
||||||
|
; 32: .set nomacro
|
||||||
|
; 32: .set noat
|
||||||
|
; 32: jr $ra
|
||||||
|
; 32: nop
|
||||||
|
; 32: .set at
|
||||||
|
; 32: .set macro
|
||||||
|
; 32: .set reorder
|
||||||
|
; 32: .end foo
|
||||||
|
define void @nofoo() #1 {
|
||||||
|
entry:
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
; 16: .set nomips16 # @nofoo
|
||||||
|
; 16: .ent nofoo
|
||||||
|
; 16: .set noreorder
|
||||||
|
; 16: .set nomacro
|
||||||
|
; 16: .set noat
|
||||||
|
; 16: jr $ra
|
||||||
|
; 16: nop
|
||||||
|
; 16: .set at
|
||||||
|
; 16: .set macro
|
||||||
|
; 16: .set reorder
|
||||||
|
; 16: .end nofoo
|
||||||
|
; 32: .set nomips16 # @nofoo
|
||||||
|
; 32: .ent nofoo
|
||||||
|
; 32: .set noreorder
|
||||||
|
; 32: .set nomacro
|
||||||
|
; 32: .set noat
|
||||||
|
; 32: jr $ra
|
||||||
|
; 32: nop
|
||||||
|
; 32: .set at
|
||||||
|
; 32: .set macro
|
||||||
|
; 32: .set reorder
|
||||||
|
; 32: .end nofoo
|
||||||
|
define i32 @main() #2 {
|
||||||
|
entry:
|
||||||
|
ret i32 0
|
||||||
|
}
|
||||||
|
|
||||||
|
; 16: .set nomips16 # @main
|
||||||
|
; 16: .ent main
|
||||||
|
; 16: .set noreorder
|
||||||
|
; 16: .set nomacro
|
||||||
|
; 16: .set noat
|
||||||
|
; 16: jr $ra
|
||||||
|
; 16: addiu $2, $zero, 0
|
||||||
|
; 16: .set at
|
||||||
|
; 16: .set macro
|
||||||
|
; 16: .set reorder
|
||||||
|
; 16: .end main
|
||||||
|
|
||||||
|
; 32: .set nomips16 # @main
|
||||||
|
; 32: .ent main
|
||||||
|
; 32: .set noreorder
|
||||||
|
; 32: .set nomacro
|
||||||
|
; 32: .set noat
|
||||||
|
; 32: jr $ra
|
||||||
|
; 32: addiu $2, $zero, 0
|
||||||
|
; 32: .set at
|
||||||
|
; 32: .set macro
|
||||||
|
; 32: .set reorder
|
||||||
|
; 32: .end main
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
||||||
|
attributes #1 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "nomips16" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
||||||
|
attributes #2 = { nounwind "less-precise-fpmad"="false" "nomips16" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
76
test/CodeGen/Mips/mips16_32_7.ll
Normal file
76
test/CodeGen/Mips/mips16_32_7.ll
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
; RUN: llc -march=mipsel -mcpu=mips16 -relocation-model=static -O3 < %s -mips-mixed-16-32 | FileCheck %s -check-prefix=16
|
||||||
|
; RUN: llc -march=mipsel -mcpu=mips32 -relocation-model=static -O3 < %s -mips-mixed-16-32 | FileCheck %s -check-prefix=32
|
||||||
|
|
||||||
|
define void @foo() #0 {
|
||||||
|
entry:
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
; 16: .set mips16 # @foo
|
||||||
|
; 16: .ent foo
|
||||||
|
; 16: save {{.+}}
|
||||||
|
; 16: restore {{.+}}
|
||||||
|
; 16: .end foo
|
||||||
|
; 32: .set nomips16 # @foo
|
||||||
|
; 32: .ent foo
|
||||||
|
; 32: .set noreorder
|
||||||
|
; 32: .set nomacro
|
||||||
|
; 32: .set noat
|
||||||
|
; 32: jr $ra
|
||||||
|
; 32: nop
|
||||||
|
; 32: .set at
|
||||||
|
; 32: .set macro
|
||||||
|
; 32: .set reorder
|
||||||
|
; 32: .end foo
|
||||||
|
define void @nofoo() #1 {
|
||||||
|
entry:
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
; 16: .set nomips16 # @nofoo
|
||||||
|
; 16: .ent nofoo
|
||||||
|
; 16: .set noreorder
|
||||||
|
; 16: .set nomacro
|
||||||
|
; 16: .set noat
|
||||||
|
; 16: jr $ra
|
||||||
|
; 16: nop
|
||||||
|
; 16: .set at
|
||||||
|
; 16: .set macro
|
||||||
|
; 16: .set reorder
|
||||||
|
; 16: .end nofoo
|
||||||
|
; 32: .set nomips16 # @nofoo
|
||||||
|
; 32: .ent nofoo
|
||||||
|
; 32: .set noreorder
|
||||||
|
; 32: .set nomacro
|
||||||
|
; 32: .set noat
|
||||||
|
; 32: jr $ra
|
||||||
|
; 32: nop
|
||||||
|
; 32: .set at
|
||||||
|
; 32: .set macro
|
||||||
|
; 32: .set reorder
|
||||||
|
; 32: .end nofoo
|
||||||
|
define i32 @main() #2 {
|
||||||
|
entry:
|
||||||
|
ret i32 0
|
||||||
|
}
|
||||||
|
|
||||||
|
; 16: .set mips16 # @main
|
||||||
|
; 16: .ent main
|
||||||
|
; 16: save {{.+}}
|
||||||
|
; 16: restore {{.+}}
|
||||||
|
; 16: .end main
|
||||||
|
|
||||||
|
; 32: .set mips16 # @main
|
||||||
|
; 32: .ent main
|
||||||
|
; 32: save {{.+}}
|
||||||
|
; 32: restore {{.+}}
|
||||||
|
; 32: .end main
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
||||||
|
attributes #1 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "nomips16" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
||||||
|
attributes #2 = { nounwind "less-precise-fpmad"="false" "mips16" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
74
test/CodeGen/Mips/mips16_32_8.ll
Normal file
74
test/CodeGen/Mips/mips16_32_8.ll
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
; RUN: llc -march=mipsel -mcpu=mips32 -relocation-model=static -O3 < %s -mips-mixed-16-32 | FileCheck %s -check-prefix=32
|
||||||
|
|
||||||
|
@x = global float 1.000000e+00, align 4
|
||||||
|
@y = global float 0x4007333340000000, align 4
|
||||||
|
@i = common global i32 0, align 4
|
||||||
|
@f = common global float 0.000000e+00, align 4
|
||||||
|
@.str = private unnamed_addr constant [8 x i8] c"f = %f\0A\00", align 1
|
||||||
|
@.str1 = private unnamed_addr constant [11 x i8] c"hello %i \0A\00", align 1
|
||||||
|
@.str2 = private unnamed_addr constant [13 x i8] c"goodbye %i \0A\00", align 1
|
||||||
|
|
||||||
|
define void @foo() #0 {
|
||||||
|
entry:
|
||||||
|
store i32 10, i32* @i, align 4
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
; 32: .set mips16 # @foo
|
||||||
|
; 32: .ent foo
|
||||||
|
; 32: save {{.+}}
|
||||||
|
; 32: restore {{.+}}
|
||||||
|
; 32: .end foo
|
||||||
|
|
||||||
|
define void @nofoo() #1 {
|
||||||
|
entry:
|
||||||
|
store i32 20, i32* @i, align 4
|
||||||
|
%0 = load float* @x, align 4
|
||||||
|
%1 = load float* @y, align 4
|
||||||
|
%add = fadd float %0, %1
|
||||||
|
store float %add, float* @f, align 4
|
||||||
|
%2 = load float* @f, align 4
|
||||||
|
%conv = fpext float %2 to double
|
||||||
|
%call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([8 x i8]* @.str, i32 0, i32 0), double %conv)
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
; 32: .set nomips16 # @nofoo
|
||||||
|
; 32: .ent nofoo
|
||||||
|
; 32: .set noreorder
|
||||||
|
; 32: .set nomacro
|
||||||
|
; 32: .set noat
|
||||||
|
; 32: add.s {{.+}}
|
||||||
|
; 32: mfc1 {{.+}}
|
||||||
|
; 32: .set at
|
||||||
|
; 32: .set macro
|
||||||
|
; 32: .set reorder
|
||||||
|
; 32: .end nofoo
|
||||||
|
declare i32 @printf(i8*, ...) #2
|
||||||
|
|
||||||
|
define i32 @main() #3 {
|
||||||
|
entry:
|
||||||
|
call void @foo()
|
||||||
|
%0 = load i32* @i, align 4
|
||||||
|
%call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([11 x i8]* @.str1, i32 0, i32 0), i32 %0)
|
||||||
|
call void @nofoo()
|
||||||
|
%1 = load i32* @i, align 4
|
||||||
|
%call1 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([13 x i8]* @.str2, i32 0, i32 0), i32 %1)
|
||||||
|
ret i32 0
|
||||||
|
}
|
||||||
|
|
||||||
|
; 32: .set nomips16 # @main
|
||||||
|
; 32: .ent main
|
||||||
|
; 32: .set noreorder
|
||||||
|
; 32: .set nomacro
|
||||||
|
; 32: .set noat
|
||||||
|
; 32: jr $ra
|
||||||
|
; 32: .set at
|
||||||
|
; 32: .set macro
|
||||||
|
; 32: .set reorder
|
||||||
|
; 32: .end main
|
||||||
|
|
||||||
|
attributes #0 = { nounwind "less-precise-fpmad"="false" "mips16" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
||||||
|
attributes #1 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "nomips16" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
||||||
|
attributes #2 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
||||||
|
attributes #3 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
51
test/CodeGen/Mips/mips16_32_9.ll
Normal file
51
test/CodeGen/Mips/mips16_32_9.ll
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
; RUN: llc -march=mipsel -mcpu=mips32 -relocation-model=static -O3 < %s -mips-mixed-16-32 | FileCheck %s -check-prefix=32
|
||||||
|
|
||||||
|
define void @foo() #0 {
|
||||||
|
entry:
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
; 32: .set mips16 # @foo
|
||||||
|
; 32: .ent foo
|
||||||
|
; 32: save {{.+}}
|
||||||
|
; 32: restore {{.+}}
|
||||||
|
; 32: .end foo
|
||||||
|
define void @nofoo() #1 {
|
||||||
|
entry:
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
; 32: .set nomips16 # @nofoo
|
||||||
|
; 32: .ent nofoo
|
||||||
|
; 32: .set noreorder
|
||||||
|
; 32: .set nomacro
|
||||||
|
; 32: .set noat
|
||||||
|
; 32: jr $ra
|
||||||
|
; 32: nop
|
||||||
|
; 32: .set at
|
||||||
|
; 32: .set macro
|
||||||
|
; 32: .set reorder
|
||||||
|
; 32: .end nofoo
|
||||||
|
define i32 @main() #2 {
|
||||||
|
entry:
|
||||||
|
ret i32 0
|
||||||
|
}
|
||||||
|
|
||||||
|
; 32: .set mips16 # @main
|
||||||
|
; 32: .ent main
|
||||||
|
; 32: save {{.+}}
|
||||||
|
; 32: restore {{.+}}
|
||||||
|
; 32: .end main
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
attributes #0 = { nounwind "less-precise-fpmad"="false" "mips16" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
||||||
|
attributes #1 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
||||||
|
attributes #2 = { nounwind "less-precise-fpmad"="false" "mips16" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf"="true" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
Loading…
Reference in New Issue
Block a user