summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/X86/X86JITInfo.cpp
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2007-03-14 10:48:08 +0000
committerEvan Cheng <evan.cheng@apple.com>2007-03-14 10:48:08 +0000
commit386dfc9251851ae734cea85e4d212e7c256fe48d (patch)
treec80223a62fb6e26a85165d9984c7c5d8d86c9f90 /llvm/lib/Target/X86/X86JITInfo.cpp
parente1a95206e301c2c9160fcadbc8404e9856c71f9d (diff)
downloadbcm5719-llvm-386dfc9251851ae734cea85e4d212e7c256fe48d.tar.gz
bcm5719-llvm-386dfc9251851ae734cea85e4d212e7c256fe48d.zip
x86-64 JIT stub codegen.
llvm-svn: 35096
Diffstat (limited to 'llvm/lib/Target/X86/X86JITInfo.cpp')
-rw-r--r--llvm/lib/Target/X86/X86JITInfo.cpp11
1 files changed, 11 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86JITInfo.cpp b/llvm/lib/Target/X86/X86JITInfo.cpp
index b32fab21db0..3fb3da788db 100644
--- a/llvm/lib/Target/X86/X86JITInfo.cpp
+++ b/llvm/lib/Target/X86/X86JITInfo.cpp
@@ -306,10 +306,21 @@ void *X86JITInfo::emitFunctionStub(void *Fn, MachineCodeEmitter &MCE) {
bool NotCC = Fn != (void*)(intptr_t)X86CompilationCallback;
#endif
if (NotCC) {
+#ifdef __x86_64__
+ MCE.startFunctionStub(13, 4);
+ MCE.emitByte(0x49); // REX prefix
+ MCE.emitByte(0xB8+2); // movabsq r10
+ MCE.emitWordLE(((unsigned *)&Fn)[0]);
+ MCE.emitWordLE(((unsigned *)&Fn)[1]);
+ MCE.emitByte(0x41); // REX prefix
+ MCE.emitByte(0xFF); // jmpq *r10
+ MCE.emitByte(2 | (4 << 3) | (3 << 6));
+#else
MCE.startFunctionStub(5, 4);
MCE.emitByte(0xE9);
MCE.emitWordLE((intptr_t)Fn-MCE.getCurrentPCValue()-4);
return MCE.finishFunctionStub(0);
+#endif
}
#ifdef __x86_64__
OpenPOWER on IntegriCloud