[llvm-commits] [llvm] r69883 - /llvm/trunk/lib/Target/PIC16/PIC16AsmPrinter.cpp

Sanjiv Gupta sanjiv.gupta at microchip.com
Thu Apr 23 03:35:12 PDT 2009


Author: sgupta
Date: Thu Apr 23 05:34:58 2009
New Revision: 69883

URL: http://llvm.org/viewvc/llvm-project?rev=69883&view=rev
Log:
Banksel immediate constant will always immediately follow the GA/ES, so scan an insn from beginnin to find out the banksel operand.

Modified:
    llvm/trunk/lib/Target/PIC16/PIC16AsmPrinter.cpp

Modified: llvm/trunk/lib/Target/PIC16/PIC16AsmPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PIC16/PIC16AsmPrinter.cpp?rev=69883&r1=69882&r2=69883&view=diff

==============================================================================
--- llvm/trunk/lib/Target/PIC16/PIC16AsmPrinter.cpp (original)
+++ llvm/trunk/lib/Target/PIC16/PIC16AsmPrinter.cpp Thu Apr 23 05:34:58 2009
@@ -48,26 +48,28 @@
   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 @@
       // 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 ";





More information about the llvm-commits mailing list