Add support for __fixdfdi(), __floatdisf(), and __floatdidf() external functions
authorMisha Brukman <brukman+llvm@gmail.com>
Thu, 8 Jul 2004 19:41:16 +0000 (19:41 +0000)
committerMisha Brukman <brukman+llvm@gmail.com>
Thu, 8 Jul 2004 19:41:16 +0000 (19:41 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@14703 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/PowerPC/PPC32ISelSimple.cpp
lib/Target/PowerPC/PowerPCISelSimple.cpp

index 2099c25eeed71e3e6fd12364fee3ed2a8e6e72e3..c6d2c6e085cb5c97e46be8a72bbbdd78fe95a57b 100644 (file)
@@ -79,7 +79,8 @@ namespace {
     std::map<Value*, unsigned> RegMap;  // Mapping between Val's and SSA Regs
 
     // External functions used in the Module
-    Function *fmodFn, *__moddi3Fn, *__divdi3Fn, *__umoddi3Fn, *__udivdi3Fn;
+    Function *fmodFn, *__moddi3Fn, *__divdi3Fn, *__umoddi3Fn, *__udivdi3Fn,
+      *__fixdfdiFn, *__floatdisfFn, *__floatdidfFn;
 
     // MBBMap - Mapping between LLVM BB -> Machine BB
     std::map<const BasicBlock*, MachineBasicBlock*> MBBMap;
@@ -93,6 +94,7 @@ namespace {
     bool doInitialization(Module &M) {
       // Add external functions that we may call
       Type *d = Type::DoubleTy;
+      Type *f = Type::FloatTy;
       Type *l = Type::LongTy;
       Type *ul = Type::ULongTy;
       // double fmod(double, double);
@@ -105,6 +107,12 @@ namespace {
       __umoddi3Fn = M.getOrInsertFunction("__umoddi3", ul, ul, ul, 0);
       // unsigned long __udivdi3(unsigned long, unsigned long);
       __udivdi3Fn = M.getOrInsertFunction("__udivdi3", ul, ul, ul, 0);
+      // long __fixdfdi(double)
+      __fixdfdiFn = M.getOrInsertFunction("__fixdfdi", l, d, 0);
+      // float __floatdisf(long)
+      __floatdisfFn = M.getOrInsertFunction("__floatdisf", f, l, 0);
+      // double __floatdidf(long)
+      __floatdidfFn = M.getOrInsertFunction("__floatdidf", d, l, 0);
       return false;
     }
 
@@ -2487,7 +2495,7 @@ void ISel::emitCastOperation(MachineBasicBlock *BB,
       std::vector<ValueRecord> Args;
       Args.push_back(ValueRecord(SrcReg, SrcTy));
       MachineInstr *TheCall =
-        BuildMI(PPC32::CALLpcrel, 1).addExternalSymbol("__floatdidf", true);
+        BuildMI(PPC32::CALLpcrel, 1).addGlobalAddress(__floatdidfFn, true);
       doCall(ValueRecord(DestReg, DestTy), TheCall, Args, false);
       return;
     }
@@ -2580,7 +2588,7 @@ void ISel::emitCastOperation(MachineBasicBlock *BB,
       std::vector<ValueRecord> Args;
       Args.push_back(ValueRecord(SrcReg, SrcTy));
       MachineInstr *TheCall =
-        BuildMI(PPC32::CALLpcrel, 1).addExternalSymbol("__fixdfdi", true);
+        BuildMI(PPC32::CALLpcrel, 1).addGlobalAddress(__fixdfdiFn, true);
       doCall(ValueRecord(DestReg, DestTy), TheCall, Args, false);
       return;
     }
index 2099c25eeed71e3e6fd12364fee3ed2a8e6e72e3..c6d2c6e085cb5c97e46be8a72bbbdd78fe95a57b 100644 (file)
@@ -79,7 +79,8 @@ namespace {
     std::map<Value*, unsigned> RegMap;  // Mapping between Val's and SSA Regs
 
     // External functions used in the Module
-    Function *fmodFn, *__moddi3Fn, *__divdi3Fn, *__umoddi3Fn, *__udivdi3Fn;
+    Function *fmodFn, *__moddi3Fn, *__divdi3Fn, *__umoddi3Fn, *__udivdi3Fn,
+      *__fixdfdiFn, *__floatdisfFn, *__floatdidfFn;
 
     // MBBMap - Mapping between LLVM BB -> Machine BB
     std::map<const BasicBlock*, MachineBasicBlock*> MBBMap;
@@ -93,6 +94,7 @@ namespace {
     bool doInitialization(Module &M) {
       // Add external functions that we may call
       Type *d = Type::DoubleTy;
+      Type *f = Type::FloatTy;
       Type *l = Type::LongTy;
       Type *ul = Type::ULongTy;
       // double fmod(double, double);
@@ -105,6 +107,12 @@ namespace {
       __umoddi3Fn = M.getOrInsertFunction("__umoddi3", ul, ul, ul, 0);
       // unsigned long __udivdi3(unsigned long, unsigned long);
       __udivdi3Fn = M.getOrInsertFunction("__udivdi3", ul, ul, ul, 0);
+      // long __fixdfdi(double)
+      __fixdfdiFn = M.getOrInsertFunction("__fixdfdi", l, d, 0);
+      // float __floatdisf(long)
+      __floatdisfFn = M.getOrInsertFunction("__floatdisf", f, l, 0);
+      // double __floatdidf(long)
+      __floatdidfFn = M.getOrInsertFunction("__floatdidf", d, l, 0);
       return false;
     }
 
@@ -2487,7 +2495,7 @@ void ISel::emitCastOperation(MachineBasicBlock *BB,
       std::vector<ValueRecord> Args;
       Args.push_back(ValueRecord(SrcReg, SrcTy));
       MachineInstr *TheCall =
-        BuildMI(PPC32::CALLpcrel, 1).addExternalSymbol("__floatdidf", true);
+        BuildMI(PPC32::CALLpcrel, 1).addGlobalAddress(__floatdidfFn, true);
       doCall(ValueRecord(DestReg, DestTy), TheCall, Args, false);
       return;
     }
@@ -2580,7 +2588,7 @@ void ISel::emitCastOperation(MachineBasicBlock *BB,
       std::vector<ValueRecord> Args;
       Args.push_back(ValueRecord(SrcReg, SrcTy));
       MachineInstr *TheCall =
-        BuildMI(PPC32::CALLpcrel, 1).addExternalSymbol("__fixdfdi", true);
+        BuildMI(PPC32::CALLpcrel, 1).addGlobalAddress(__fixdfdiFn, true);
       doCall(ValueRecord(DestReg, DestTy), TheCall, Args, false);
       return;
     }