diff options
| author | Bruno Cardoso Lopes <bruno.cardoso@gmail.com> | 2009-08-27 19:57:56 +0000 |
|---|---|---|
| committer | Bruno Cardoso Lopes <bruno.cardoso@gmail.com> | 2009-08-27 19:57:56 +0000 |
| commit | e91191630beeafce1117ff2b4767e827a4fccec9 (patch) | |
| tree | a62e962a6b4b96b29ce01b34cf6d7268fb55f84d /llvm/lib/Target/Mips/AsmPrinter/MipsAsmPrinter.cpp | |
| parent | d5e8e862bbce832309316d0702bcebfdf55c70ee (diff) | |
| download | bcm5719-llvm-e91191630beeafce1117ff2b4767e827a4fccec9.tar.gz bcm5719-llvm-e91191630beeafce1117ff2b4767e827a4fccec9.zip | |
Revert 80278 for now, it caused a lot of MIPS tests to fail
llvm-svn: 80280
Diffstat (limited to 'llvm/lib/Target/Mips/AsmPrinter/MipsAsmPrinter.cpp')
| -rw-r--r-- | llvm/lib/Target/Mips/AsmPrinter/MipsAsmPrinter.cpp | 53 |
1 files changed, 34 insertions, 19 deletions
diff --git a/llvm/lib/Target/Mips/AsmPrinter/MipsAsmPrinter.cpp b/llvm/lib/Target/Mips/AsmPrinter/MipsAsmPrinter.cpp index 3ae5f8c308a..78f84249447 100644 --- a/llvm/lib/Target/Mips/AsmPrinter/MipsAsmPrinter.cpp +++ b/llvm/lib/Target/Mips/AsmPrinter/MipsAsmPrinter.cpp @@ -306,29 +306,44 @@ void MipsAsmPrinter::printOperand(const MachineInstr *MI, int opNum) { const MachineOperand &MO = MI->getOperand(opNum); const TargetRegisterInfo &RI = *TM.getRegisterInfo(); bool closeP = false; - - if (MO.getTargetFlags()) - closeP = true; - - switch(MO.getTargetFlags()) { - default: - llvm_unreachable("Unknown target flag on GV operand"); - case MipsII::MO_GPREL: O << "%gp_rel("; break; - case MipsII::MO_GOT_CALL: O << "%call16("; break; - case MipsII::MO_GOT: - if (MI->getOpcode() == Mips::LW) - O << "%got("; + bool isPIC = (TM.getRelocationModel() == Reloc::PIC_); + bool isCodeLarge = (TM.getCodeModel() == CodeModel::Large); + + // %hi and %lo used on mips gas to load global addresses on + // static code. %got is used to load global addresses when + // using PIC_. %call16 is used to load direct call targets + // on PIC_ and small code size. %call_lo and %call_hi load + // direct call targets on PIC_ and large code size. + if (MI->getOpcode() == Mips::LUi && !MO.isReg() && !MO.isImm()) { + if ((isPIC) && (isCodeLarge)) + O << "%call_hi("; else - O << "%lo("; - break; - case MipsII::MO_ABS_HILO: - if (MI->getOpcode() == Mips::LUi) O << "%hi("; + closeP = true; + } else if ((MI->getOpcode() == Mips::ADDiu) && !MO.isReg() && !MO.isImm()) { + const MachineOperand &firstMO = MI->getOperand(opNum-1); + if (firstMO.getReg() == Mips::GP) + O << "%gp_rel("; else - O << "%lo("; - break; + O << "%lo("; + closeP = true; + } else if ((isPIC) && (MI->getOpcode() == Mips::LW) && + (!MO.isReg()) && (!MO.isImm())) { + const MachineOperand &firstMO = MI->getOperand(opNum-1); + const MachineOperand &lastMO = MI->getOperand(opNum+1); + if ((firstMO.isReg()) && (lastMO.isReg())) { + if ((firstMO.getReg() == Mips::T9) && (lastMO.getReg() == Mips::GP) + && (!isCodeLarge)) + O << "%call16("; + else if ((firstMO.getReg() != Mips::T9) && (lastMO.getReg() == Mips::GP)) + O << "%got("; + else if ((firstMO.getReg() == Mips::T9) && (lastMO.getReg() != Mips::GP) + && (isCodeLarge)) + O << "%call_lo("; + closeP = true; + } } - + switch (MO.getType()) { case MachineOperand::MO_Register: |

