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:
parent
f0a8344bac
commit
5058f240d9
|
|
@ -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 ";
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue