diff --git a/README.md b/README.md index fda982ad..d7bd0845 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ Here are the steps to checkout the code and build it: $ git clone https://github.com/jeremysrand/llvm-65816.git $ mkdir build $ cd build - $ cmake -G "Unix Makefiles" ../llvm-65816 + $ cmake -DCMAKE_BUILD_TYPE:STRING=Debug -G "Unix Makefiles" ../llvm-65816 $ make That works for me on my Mac. Note, you probably need to download cmake. diff --git a/lib/Target/WDC65816/WDC65816ISelDAGToDAG.cpp b/lib/Target/WDC65816/WDC65816ISelDAGToDAG.cpp index d88c5c85..34e289eb 100644 --- a/lib/Target/WDC65816/WDC65816ISelDAGToDAG.cpp +++ b/lib/Target/WDC65816/WDC65816ISelDAGToDAG.cpp @@ -167,13 +167,13 @@ bool SparcDAGToDAGISel::SelectADDRrr(SDValue Addr, SDValue &R1, SDValue &R2) { #endif SDNode *WDC65816DAGToDAGISel::Select(SDNode *N) { - WDC_LOG("WDC_TODO - Unimplemented method called, opcode=" << N); SDLoc dl(N); if (N->isMachineOpcode()) { N->setNodeId(-1); return NULL; // Already selected. } + WDC_LOG("WDC_TODO - Unimplemented method called, opcode=" << N->getOpcode()); switch (N->getOpcode()) { default: break; diff --git a/lib/Target/WDC65816/WDC65816ISelLowering.cpp b/lib/Target/WDC65816/WDC65816ISelLowering.cpp index 04dc3b8f..c00e2ebf 100644 --- a/lib/Target/WDC65816/WDC65816ISelLowering.cpp +++ b/lib/Target/WDC65816/WDC65816ISelLowering.cpp @@ -810,12 +810,16 @@ static SPCC::CondCodes FPCondCCodeToFCC(ISD::CondCode CC) { WDC65816TargetLowering::WDC65816TargetLowering(TargetMachine &TM) : TargetLowering(TM, new TargetLoweringObjectFileELF()) { - addRegisterClass(MVT::i16, &WDC::Int16RegsRegClass); + addRegisterClass(MVT::i16, &WDC::AccRegsRegClass); + addRegisterClass(MVT::i16, &WDC::IndexXRegsRegClass); + addRegisterClass(MVT::i16, &WDC::IndexYRegsRegClass); #if 0 // WDC_TODO - turn these off for now... // The problem here is that if LLVM thinks we have 32bit and 64bit registers // then it insists on promoting ints to 32-bit even though we have said we are // natively a 16-bit machine. Also, I haven't bothered to tell LLVM yet how to // load values into these registers which I think confuses it. So, off for now. + + addRegisterClass(MVT::i16, &WDC::Int16RegsRegClass); addRegisterClass(MVT::i32, &WDC::Int32RegsRegClass); addRegisterClass(MVT::i64, &WDC::Int64RegsRegClass); addRegisterClass(MVT::f32, &WDC::Float32RegsRegClass); diff --git a/lib/Target/WDC65816/WDC65816InstrInfo.cpp b/lib/Target/WDC65816/WDC65816InstrInfo.cpp index 0dc22edc..ef7635e3 100644 --- a/lib/Target/WDC65816/WDC65816InstrInfo.cpp +++ b/lib/Target/WDC65816/WDC65816InstrInfo.cpp @@ -64,3 +64,49 @@ unsigned WDC65816InstrInfo::getGlobalBaseReg(MachineFunction *MF) const return GlobalBaseReg; #endif } + +void WDC65816InstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB, + MachineBasicBlock::iterator MI, + unsigned SrcReg, bool isKill, int FrameIdx, + const TargetRegisterClass *RC, + const TargetRegisterInfo *TRI) const { + DebugLoc DL; + if (MI != MBB.end()) DL = MI->getDebugLoc(); + MachineFunction &MF = *MBB.getParent(); + MachineFrameInfo &MFI = *MF.getFrameInfo(); + + MachineMemOperand *MMO = + MF.getMachineMemOperand(MachinePointerInfo::getFixedStack(FrameIdx), + MachineMemOperand::MOStore, + MFI.getObjectSize(FrameIdx), + MFI.getObjectAlignment(FrameIdx)); + + if (RC == &WDC::AccRegsRegClass) + BuildMI(MBB, MI, DL, get(WDC::STAabsl)) + .addFrameIndex(FrameIdx).addReg(SrcReg, getKillRegState(isKill)).addMemOperand(MMO); + else + llvm_unreachable("Cannot store this register to stack slot!"); +} + +void WDC65816InstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB, + MachineBasicBlock::iterator MI, + unsigned DestReg, int FrameIdx, + const TargetRegisterClass *RC, + const TargetRegisterInfo *TRI) const{ + DebugLoc DL; + if (MI != MBB.end()) DL = MI->getDebugLoc(); + MachineFunction &MF = *MBB.getParent(); + MachineFrameInfo &MFI = *MF.getFrameInfo(); + + MachineMemOperand *MMO = + MF.getMachineMemOperand(MachinePointerInfo::getFixedStack(FrameIdx), + MachineMemOperand::MOLoad, + MFI.getObjectSize(FrameIdx), + MFI.getObjectAlignment(FrameIdx)); + + if (RC == &WDC::AccRegsRegClass) + BuildMI(MBB, MI, DL, get(WDC::LDAabsl)) + .addReg(DestReg).addFrameIndex(FrameIdx).addMemOperand(MMO); + else + llvm_unreachable("Cannot store this register to stack slot!"); +} \ No newline at end of file diff --git a/lib/Target/WDC65816/WDC65816InstrInfo.h b/lib/Target/WDC65816/WDC65816InstrInfo.h index e97e804f..c16d38e8 100644 --- a/lib/Target/WDC65816/WDC65816InstrInfo.h +++ b/lib/Target/WDC65816/WDC65816InstrInfo.h @@ -37,6 +37,18 @@ namespace llvm { unsigned getGlobalBaseReg(MachineFunction *MF) const; + virtual void storeRegToStackSlot(MachineBasicBlock &MBB, + MachineBasicBlock::iterator MI, + unsigned SrcReg, bool isKill, + int FrameIndex, + const TargetRegisterClass *RC, + const TargetRegisterInfo *TRI) const; + virtual void loadRegFromStackSlot(MachineBasicBlock &MBB, + MachineBasicBlock::iterator MI, + unsigned DestReg, int FrameIdx, + const TargetRegisterClass *RC, + const TargetRegisterInfo *TRI) const; + }; } diff --git a/lib/Target/WDC65816/WDC65816RegisterInfo.cpp b/lib/Target/WDC65816/WDC65816RegisterInfo.cpp index 481c9021..79b339c5 100644 --- a/lib/Target/WDC65816/WDC65816RegisterInfo.cpp +++ b/lib/Target/WDC65816/WDC65816RegisterInfo.cpp @@ -30,12 +30,6 @@ using namespace llvm; -#if 0 // TODO - What is this? -static cl::opt -ReserveAppRegisters("sparc-reserve-app-registers", cl::Hidden, cl::init(false), - cl::desc("Reserve application registers (%g2-%g4)")); -#endif - WDC65816RegisterInfo::WDC65816RegisterInfo(WDC65816Subtarget &st) : WDC65816GenRegisterInfo(WDC::P), Subtarget(st) { }