From 2253ae62fcaaa4ceb16661f2579662a0ff1d6a14 Mon Sep 17 00:00:00 2001 From: Jeremy Rand Date: Thu, 7 Apr 2016 23:15:53 -0400 Subject: [PATCH] Get the answerToTheUltimateQuestion() function to compile to something approximating 65816 assembly. With this commit, I can compile the simplest of functions but it is a start. --- lib/Target/WDC65816/WDC65816AsmPrinter.cpp | 29 +++++++++++++++++++--- lib/Target/WDC65816/WDC65816InstrInfo.td | 16 ++++++------ 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/lib/Target/WDC65816/WDC65816AsmPrinter.cpp b/lib/Target/WDC65816/WDC65816AsmPrinter.cpp index fab94cb0..5802c96b 100644 --- a/lib/Target/WDC65816/WDC65816AsmPrinter.cpp +++ b/lib/Target/WDC65816/WDC65816AsmPrinter.cpp @@ -47,16 +47,17 @@ namespace { bool printGetPCX(const MachineInstr *MI, unsigned OpNo, raw_ostream &OS); static const char *getRegisterName(unsigned RegNo); -#if 0 // WDC_TODO - How much of this do we need? - void printCCOperand(const MachineInstr *MI, int opNum, raw_ostream &OS); - virtual void EmitFunctionBodyStart(); virtual void EmitInstruction(const MachineInstr *MI) { SmallString<128> Str; raw_svector_ostream OS(Str); printInstruction(MI, OS); OutStreamer.EmitRawText(OS.str()); } +#if 0 // WDC_TODO - How much of this do we need? + void printCCOperand(const MachineInstr *MI, int opNum, raw_ostream &OS); + + virtual void EmitFunctionBodyStart(); bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, unsigned AsmVariant, const char *ExtraCode, @@ -86,7 +87,27 @@ namespace { void WDC65816AsmPrinter::printOperand(const MachineInstr *MI, int opNum, raw_ostream &O) { - WDC_LOG("WDC_TODO - Unimplemented method called"); + const MachineOperand &MO = MI->getOperand(opNum); + switch (MO.getType()) { + default: llvm_unreachable("Not implemented yet!"); + case MachineOperand::MO_Register: + O << StringRef(getRegisterName(MO.getReg())); + return; + case MachineOperand::MO_Immediate: + O << MO.getImm(); + return; + case MachineOperand::MO_MachineBasicBlock: + O << *MO.getMBB()->getSymbol(); + return; + case MachineOperand::MO_GlobalAddress: { + O << *getSymbol(MO.getGlobal()); + return; + } + case MachineOperand::MO_ExternalSymbol: { + O << MAI->getGlobalPrefix() << MO.getSymbolName(); + return; + } + } } diff --git a/lib/Target/WDC65816/WDC65816InstrInfo.td b/lib/Target/WDC65816/WDC65816InstrInfo.td index ec50da20..42da5c0e 100644 --- a/lib/Target/WDC65816/WDC65816InstrInfo.td +++ b/lib/Target/WDC65816/WDC65816InstrInfo.td @@ -111,7 +111,7 @@ def WDCRET : SDNode<"WDCISD::RET_FLAG", SDTNone, [SDNPHasChain, SDNP def ADCimm : Group1$src2", - [(set AccRegs:$dst, (add AccRegs:$src1, i16:$src2))]>; + [(set AccRegs:$dst, (add AccRegs:$src1, imm:$src2))]>; def ADCabs : Group1$src2", - [(set AccRegs:$dst, (and AccRegs:$src1, i16:$src2))]>; + [(set AccRegs:$dst, (and AccRegs:$src1, imm:$src2))]>; def ANDabs : Group1$src2", - [(set AccRegs:$dst, (xor AccRegs:$src1, i16:$src2))]>; + [(set AccRegs:$dst, (xor AccRegs:$src1, imm:$src2))]>; def EORabs : Group1$src", - [(set AccRegs:$dst, i16:$src)]>; + [(set AccRegs:$dst, imm:$src)]>; def LDAabs : Group1$src2", - [(set AccRegs:$dst, (or AccRegs:$src1, i16:$src2))]>; + [(set AccRegs:$dst, (or AccRegs:$src1, imm:$src2))]>; def ORAabs : Group1$src2", - [(set AccRegs:$dst, (sub AccRegs:$src1, i16:$src2))]>; + [(set AccRegs:$dst, (sub AccRegs:$src1, imm:$src2))]>; def SBCabs : Group1; + [(set IndexXRegs:$dst, imm:$src)]>; def LDXabs : Group2; + [(set IndexYRegs:$dst, imm:$src)]>; def LDYabs : Group2_Y