add a note
[oota-llvm.git] / lib / Target / Alpha / AlphaCodeEmitter.cpp
index f198883fdf98bbcec22dae9608209a5fa87f2e84..f5d517fadd49d634280ca828329b39184c8b40b9 100644 (file)
@@ -23,6 +23,7 @@
 #include "llvm/Function.h"
 #include "llvm/Support/Debug.h"
 #include "llvm/ADT/Statistic.h"
+#include <iostream>
 using namespace llvm;
 
 namespace {
@@ -89,9 +90,11 @@ bool AlphaCodeEmitter::runOnMachineFunction(MachineFunction &MF) {
   for (unsigned i = 0, e = BBRefs.size(); i != e; ++i) {
     unsigned* Location = (unsigned*)BasicBlockAddrs[BBRefs[i].first];
     unsigned* Ref = (unsigned*)BBRefs[i].second;
-    intptr_t BranchTargetDisp = (((unsigned char*)Location  - (unsigned char*)Ref) >> 2) - 1;
+    intptr_t BranchTargetDisp = 
+      (((unsigned char*)Location  - (unsigned char*)Ref) >> 2) - 1;
     DEBUG(std::cerr << "Fixup @ " << (void*)Ref << " to " << (void*)Location
-          << " Disp " << BranchTargetDisp << " using " <<  (BranchTargetDisp & ((1 << 22)-1)) << "\n");
+          << " Disp " << BranchTargetDisp 
+          << " using " <<  (BranchTargetDisp & ((1 << 22)-1)) << "\n");
     *Ref |= (BranchTargetDisp & ((1 << 21)-1));
   }
   BBRefs.clear();
@@ -101,7 +104,7 @@ bool AlphaCodeEmitter::runOnMachineFunction(MachineFunction &MF) {
 }
 
 void AlphaCodeEmitter::emitBasicBlock(MachineBasicBlock &MBB) {
-  uint64_t Addr = MCE.getCurrentPCValue();
+  uintptr_t Addr = MCE.getCurrentPCValue();
   BasicBlockAddrs[&MBB] = (unsigned*)Addr;
 
   for (MachineBasicBlock::iterator I = MBB.begin(), E = MBB.end();
@@ -115,6 +118,9 @@ void AlphaCodeEmitter::emitBasicBlock(MachineBasicBlock &MBB) {
     case Alpha::ALTENT:
     case Alpha::PCLABEL:
     case Alpha::MEMLABEL:
+    case Alpha::IDEF_I:
+    case Alpha::IDEF_F32:
+    case Alpha::IDEF_F64:
       break; //skip these
     }
   }
@@ -169,16 +175,20 @@ int AlphaCodeEmitter::getMachineOpValue(MachineInstr &MI, MachineOperand &MO) {
     rv = getAlphaRegNumber(MO.getReg());
   } else if (MO.isImmediate()) {
     rv = MO.getImmedValue();
-  } else if (MO.isGlobalAddress() || MO.isExternalSymbol() 
+  } else if (MO.isGlobalAddress() || MO.isExternalSymbol()
              || MO.isConstantPoolIndex()) {
     DEBUG(std::cerr << MO << " is a relocated op for " << MI << "\n";);
-    bool isExternal = MO.isExternalSymbol() || 
-      (MO.isGlobalAddress() && 
+    bool isExternal = MO.isExternalSymbol() ||
+      (MO.isGlobalAddress() &&
        ( MO.getGlobal()->hasWeakLinkage() ||
          MO.getGlobal()->isExternal()) );
     unsigned Reloc = 0;
     int Offset = 0;
+    bool useGOT = false;
     switch (MI.getOpcode()) {
+    case Alpha::BSR:
+      Reloc = Alpha::reloc_bsr;
+      break;
     case Alpha::LDLr:
     case Alpha::LDQr:
     case Alpha::LDBUr:
@@ -186,6 +196,12 @@ int AlphaCodeEmitter::getMachineOpValue(MachineInstr &MI, MachineOperand &MO) {
     case Alpha::LDSr:
     case Alpha::LDTr:
     case Alpha::LDAr:
+    case Alpha::STQr:
+    case Alpha::STLr:
+    case Alpha::STWr:
+    case Alpha::STBr:
+    case Alpha::STSr:
+    case Alpha::STTr:
       Reloc = Alpha::reloc_gprellow;
       break;
     case Alpha::LDAHr:
@@ -193,6 +209,7 @@ int AlphaCodeEmitter::getMachineOpValue(MachineInstr &MI, MachineOperand &MO) {
       break;
     case Alpha::LDQl:
       Reloc = Alpha::reloc_literal;
+      useGOT = true;
       break;
     case Alpha::LDAg:
     case Alpha::LDAHg:
@@ -206,17 +223,17 @@ int AlphaCodeEmitter::getMachineOpValue(MachineInstr &MI, MachineOperand &MO) {
     if (MO.isGlobalAddress())
       MCE.addRelocation(MachineRelocation((unsigned)MCE.getCurrentPCOffset(),
                                           Reloc, MO.getGlobal(), Offset,
-                                          true, true));
+                                          false, useGOT));
     else if (MO.isExternalSymbol())
       MCE.addRelocation(MachineRelocation((unsigned)MCE.getCurrentPCOffset(),
                                           Reloc, MO.getSymbolName(), Offset,
                                           true));
     else
       MCE.addRelocation(MachineRelocation((unsigned)MCE.getCurrentPCOffset(),
-                                          Reloc, MO.getConstantPoolIndex(), 
+                                          Reloc, MO.getConstantPoolIndex(),
                                           Offset));
   } else if (MO.isMachineBasicBlock()) {
-    unsigned* CurrPC = (unsigned*)MCE.getCurrentPCValue();
+    unsigned* CurrPC = (unsigned*)(intptr_t)MCE.getCurrentPCValue();
     BBRefs.push_back(std::make_pair(MO.getMachineBasicBlock(), CurrPC));
   }else {
     std::cerr << "ERROR: Unknown type of MachineOperand: " << MO << "\n";