1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 03:33:20 +01:00

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 32cfba44df
commit 0457bf4420

View File

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