diff options
author | Anton Korobeynikov <asl@math.spbu.ru> | 2009-05-03 13:08:13 +0000 |
---|---|---|
committer | Anton Korobeynikov <asl@math.spbu.ru> | 2009-05-03 13:08:13 +0000 |
commit | e60685a86051c3fbcbea17efe49d3aad815c88b7 (patch) | |
tree | e9462ea0a554b9c6f202e918b9c74e00fee012f7 /lib | |
parent | 33b8509e4c20727561fea4b73a9f4a2abe276e20 (diff) | |
download | external_llvm-e60685a86051c3fbcbea17efe49d3aad815c88b7.zip external_llvm-e60685a86051c3fbcbea17efe49d3aad815c88b7.tar.gz external_llvm-e60685a86051c3fbcbea17efe49d3aad815c88b7.tar.bz2 |
Some early full call lowering draft for direct calls
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@70729 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Target/MSP430/MSP430AsmPrinter.cpp | 28 | ||||
-rw-r--r-- | lib/Target/MSP430/MSP430InstrInfo.td | 16 |
2 files changed, 33 insertions, 11 deletions
diff --git a/lib/Target/MSP430/MSP430AsmPrinter.cpp b/lib/Target/MSP430/MSP430AsmPrinter.cpp index 6f1c8eb..a9a2711 100644 --- a/lib/Target/MSP430/MSP430AsmPrinter.cpp +++ b/lib/Target/MSP430/MSP430AsmPrinter.cpp @@ -127,19 +127,33 @@ void MSP430AsmPrinter::printOperand(const MachineInstr *MI, int OpNum, const MachineOperand &MO = MI->getOperand(OpNum); switch (MO.getType()) { case MachineOperand::MO_Register: - if (TargetRegisterInfo::isPhysicalRegister(MO.getReg())) - O << TM.getRegisterInfo()->get(MO.getReg()).AsmName; - else - assert(0 && "not implemented"); - break; + assert (TargetRegisterInfo::isPhysicalRegister(MO.getReg()) && + "Virtual registers should be already mapped!"); + O << TM.getRegisterInfo()->get(MO.getReg()).AsmName; + return; case MachineOperand::MO_Immediate: if (!Modifier || strcmp(Modifier, "nohash")) O << '#'; O << MO.getImm(); - break; + return; case MachineOperand::MO_MachineBasicBlock: printBasicBlockLabel(MO.getMBB()); - break; + return; + case MachineOperand::MO_GlobalAddress: { + bool isMemOp = Modifier && !strcmp(Modifier, "mem"); + bool isCallOp = Modifier && !strcmp(Modifier, "call"); + std::string Name = Mang->getValueName(MO.getGlobal()); + assert(MO.getOffset() == 0 && "No offsets allowed!"); + + if (isCallOp) + O << '#'; + else if (isMemOp) + O << '&'; + + O << Name; + + return; + } default: assert(0 && "Not implemented yet!"); } diff --git a/lib/Target/MSP430/MSP430InstrInfo.td b/lib/Target/MSP430/MSP430InstrInfo.td index 1f13f2d..5d3566d 100644 --- a/lib/Target/MSP430/MSP430InstrInfo.td +++ b/lib/Target/MSP430/MSP430InstrInfo.td @@ -106,10 +106,12 @@ let isCall = 1 in // registers are added manually. let Defs = [R12W, R13W, R14W, R15W, SRW], Uses = [SPW] in { - def CALL32r : Pseudo<(outs), (ins GR16:$dst, variable_ops), - "call\t{*}$dst", [(MSP430call GR16:$dst)]>; - def CALL32m : Pseudo<(outs), (ins memsrc:$dst, variable_ops), - "call\t{*}$dst", [(MSP430call (load addr:$dst))]>; + def CALLi : Pseudo<(outs), (ins i16imm:$dst, variable_ops), + "call\t${dst:call}", [(MSP430call imm:$dst)]>; + def CALLr : Pseudo<(outs), (ins GR16:$dst, variable_ops), + "call\t$dst", [(MSP430call GR16:$dst)]>; + def CALLm : Pseudo<(outs), (ins memsrc:$dst, variable_ops), + "call\t${dst:mem}", [(MSP430call (load addr:$dst))]>; } @@ -608,3 +610,9 @@ def : Pat<(extloadi16i8 addr:$src), (MOVZX16rm8 addr:$src)>; // truncs def : Pat<(i8 (trunc GR16:$src)), (EXTRACT_SUBREG GR16:$src, subreg_8bit)>; + +// calls +def : Pat<(MSP430call (i16 tglobaladdr:$dst)), + (CALLi tglobaladdr:$dst)>; +def : Pat<(MSP430call (i16 texternalsym:$dst)), + (CALLi texternalsym:$dst)>; |