Banksel immediate constant will always immediately follow the GA/ES, so scan an insn from beginnin to find out the banksel operand.

llvm-svn: 69883
This commit is contained in:
Sanjiv Gupta 2009-04-23 10:34:58 +00:00
parent f0a8344bac
commit 5058f240d9
1 changed files with 20 additions and 18 deletions

View File

@ -48,26 +48,28 @@ bool PIC16AsmPrinter::printMachineInstruction(const MachineInstr *MI) {
std::string NewBank = ""; std::string NewBank = "";
unsigned Operands = MI->getNumOperands(); unsigned Operands = MI->getNumOperands();
if (Operands > 1) { if (Operands > 1) {
// Global address or external symbol should be second operand from last // If we have a Global address or external symbol then we need to print
// if we want to print banksel for it. // banksel for it.
unsigned BankSelVar = Operands - 2; unsigned BankSelVar = 0;
// In cases where an instruction has a def or use defined in td file, MachineOperand Op = MI->getOperand(BankSelVar);
// that def or use becomes a machine instruction operand. while (BankSelVar < Operands-1) {
// eg. addfw_1 instruction defines STATUS register. So the machine Op = MI->getOperand(BankSelVar);
// instruction for it has MO_Register Operand as its last operand. if ((Op.getType() == MachineOperand::MO_GlobalAddress) ||
while ((MI->getOperand(BankSelVar + 1).getType() == (Op.getType() == MachineOperand::MO_ExternalSymbol))
MachineOperand::MO_Register) && (BankSelVar > 0)) break;
BankSelVar--; BankSelVar++;
const MachineOperand &Op = MI->getOperand(BankSelVar); }
unsigned OpType = Op.getType(); if (BankSelVar < Operands-1) {
if (OpType == MachineOperand::MO_GlobalAddress || unsigned OpType = Op.getType();
OpType == MachineOperand::MO_ExternalSymbol) {
if (OpType == MachineOperand::MO_GlobalAddress ) if (OpType == MachineOperand::MO_GlobalAddress )
NewBank = Op.getGlobal()->getSection(); NewBank = Op.getGlobal()->getSection();
else { else {
// External Symbol is generated for temp data. Temp data in in // External Symbol is generated for temp data and arguments. They are
// fdata.<functionname>.# section. // in fpdata.<functionname>.# section.
NewBank = "fpdata." + CurrentFnName +".#"; std::string ESName = Op.getSymbolName();
int index = ESName.find_first_of(".");
std::string FnName = ESName.substr(0,index);
NewBank = "fpdata." + FnName +".#";
} }
// Operand after global address or external symbol should be banksel. // Operand after global address or external symbol should be banksel.
// Value 1 for this operand means we need to generate banksel else do not // Value 1 for this operand means we need to generate banksel else do not
@ -78,7 +80,7 @@ bool PIC16AsmPrinter::printMachineInstruction(const MachineInstr *MI) {
// variables in all files are same at this time. For eg. initialized // variables in all files are same at this time. For eg. initialized
// data in put in idata.# section in all files. // data in put in idata.# section in all files.
if ((BS.getType() == MachineOperand::MO_Immediate if ((BS.getType() == MachineOperand::MO_Immediate
&& (int)BS.getImm() == 1) && (int)BS.getImm() == 1)
&& ((Op.isGlobal() && Op.getGlobal()->hasExternalLinkage()) || && ((Op.isGlobal() && Op.getGlobal()->hasExternalLinkage()) ||
(NewBank.compare(CurBank) != 0))) { (NewBank.compare(CurBank) != 0))) {
O << "\tbanksel "; O << "\tbanksel ";