Implement indirect function calls
authorChris Lattner <sabre@nondot.org>
Fri, 13 Dec 2002 14:13:27 +0000 (14:13 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 13 Dec 2002 14:13:27 +0000 (14:13 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@5024 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/InstSelectSimple.cpp
lib/Target/X86/X86ISelSimple.cpp
lib/Target/X86/X86InstrInfo.def

index d9759c4eb8474c1ea07fddf96fa6dead8fc3b5ad..4a44dbf419b962a088fc0b0ab3b22f72d758a4ed 100644 (file)
@@ -577,8 +577,14 @@ ISel::visitCallInst (CallInst & CI)
          break;
        }
     }
-  // Emit a CALL instruction with PC-relative displacement.
-  BuildMI (BB, X86::CALLpcrel32, 1).addPCDisp (CI.getCalledValue ());
+
+  if (Function *F = CI.getCalledFunction()) {
+    // Emit a CALL instruction with PC-relative displacement.
+    BuildMI(BB, X86::CALLpcrel32, 1).addPCDisp(F);
+  } else {
+    unsigned Reg = getReg(CI.getCalledValue());
+    BuildMI(BB, X86::CALLr32, 1).addReg(Reg);
+  }
 
   // Adjust the stack by `bytesPushed' amount if non-zero
   if (bytesPushed > 0)
index d9759c4eb8474c1ea07fddf96fa6dead8fc3b5ad..4a44dbf419b962a088fc0b0ab3b22f72d758a4ed 100644 (file)
@@ -577,8 +577,14 @@ ISel::visitCallInst (CallInst & CI)
          break;
        }
     }
-  // Emit a CALL instruction with PC-relative displacement.
-  BuildMI (BB, X86::CALLpcrel32, 1).addPCDisp (CI.getCalledValue ());
+
+  if (Function *F = CI.getCalledFunction()) {
+    // Emit a CALL instruction with PC-relative displacement.
+    BuildMI(BB, X86::CALLpcrel32, 1).addPCDisp(F);
+  } else {
+    unsigned Reg = getReg(CI.getCalledValue());
+    BuildMI(BB, X86::CALLr32, 1).addReg(Reg);
+  }
 
   // Adjust the stack by `bytesPushed' amount if non-zero
   if (bytesPushed > 0)
index 2b0432b27fd9b4d8b67918db33c814de188f0c60..cdf848d87bd1659d6e760463a49b221e1e051fa6 100644 (file)
@@ -66,6 +66,10 @@ I(JNE         , "jne",   0x85, M_BRANCH_FLAG, X86II::RawFrm | X86II::TB | X86II:
 I(JE          , "je",    0x84, M_BRANCH_FLAG, X86II::RawFrm | X86II::TB | X86II::Void, NoIR,
                                                                                        NoIR) // je foo
 I(CALLpcrel32 , "call",  0xE8, M_BRANCH_FLAG, X86II::Void, NoIR, NoIR)                       // call pc+42
+I(CALLr32     , "call",  0xFF, M_BRANCH_FLAG, X86II::Void | X86II::MRMS2r | X86II::Arg32,
+                                              NoIR, NoIR)                                    // call [r32]
+I(CALLm32     , "call",  0xFF, M_BRANCH_FLAG, X86II::Void | X86II::MRMS2m | X86II::Arg32,
+                                              NoIR, NoIR)                                    // call [m32]
 
 // Misc instructions
 I(LEAVE       , "leave", 0xC9,             0, X86II::RawFrm, O_EBP, O_EBP)                   // leave