From 2e22d33d9d256e9a1551229f1b51e2a6f02da2f6 Mon Sep 17 00:00:00 2001
From: Mike Pall
Date: Sun, 28 Feb 2010 21:45:38 +0100
Subject: [PATCH] Enable JIT compiler for x64.
Only works on Linux/x64 and Windows/x64 right now.
Force an x64 build on Linux/x64 with: make CC="gcc -m64"
NYI: handle on-trace OOM errors.
NYI: improve register allocation for x64.
---
doc/changes.html | 3 ++-
doc/faq.html | 5 ++---
doc/install.html | 19 ++++++-------------
doc/luajit.html | 5 +++--
doc/status.html | 7 +++----
src/Makefile | 16 +++++++++-------
src/lj_arch.h | 1 -
7 files changed, 25 insertions(+), 31 deletions(-)
diff --git a/doc/changes.html b/doc/changes.html
index 7f2da0a8..33c3f317 100644
--- a/doc/changes.html
+++ b/doc/changes.html
@@ -58,7 +58,7 @@ to see whether newer versions are available.
CPU support:
- Port integrated memory allocator to Linux/x64 and Windows/x64.
-- Port the interpreter to x64.
+- Port interpreter and JIT compiler to x64.
- Port DynASM to x64.
- Many 32/64 bit cleanups in the VM.
- Allow building the interpreter with either x87 or SSE2 arithmetics.
@@ -80,6 +80,7 @@ to see whether newer versions are available.
Structural and performance enhancements:
+- Improve heuristics for bytecode penalties and blacklisting.
- Split CALL/FUNC recording and clean up fast function call semantics.
- Major redesign of internal function call handling.
- Improve FOR loop const specialization and integerness checks.
diff --git a/doc/faq.html b/doc/faq.html
index 15632eae..6d724325 100644
--- a/doc/faq.html
+++ b/doc/faq.html
@@ -137,9 +137,8 @@ The compiler will happily optimize away such indirections.
machine code. This means the code generator must be ported to each
architecture. And the fast interpreter is written in assembler and
must be ported, too. This is quite an undertaking.
Currently only
-x86 CPUs are supported. x64 support is in the works. Other
-architectures will follow with sufficient demand and/or
-sponsoring.
+x86 and x64 CPUs are supported. Other architectures will follow based
+on sufficient user demand and/or sponsoring.
diff --git a/doc/install.html b/doc/install.html
index 605f954d..102f3417 100644
--- a/doc/install.html
+++ b/doc/install.html
@@ -54,16 +54,10 @@ LuaJIT currently builds out-of-the box on all popular x86 systems
(Linux, Windows, OSX etc.). It builds and runs fine as a 32 bit
application under x64-based systems, too.
-
-The x64 port of LuaJIT is still experimental and not enabled by default.
-It only contains the interpreter and only builds on Linux/x64 and WIN64
-right now. If you want to give it a try, follow the special build instructions
-below.
-
-
-Note that the pure interpreter is quite a bit faster than Lua, but of
-course not as fast as the x86 JIT compiler. Work on the x64 JIT compiler
-is still ongoing.
+
+The x64 port of LuaJIT is still preliminary and not enabled by default.
+It only builds on Linux/x64 and Windows/x64 right now. If you want to
+give it a try, please follow the special build instructions below.
Configuring LuaJIT
@@ -119,8 +113,7 @@ make
-You can force a build of the x64 interpreter on Linux/x64 with the
-following command:
+You can force a native x64 build on Linux/x64 with the following command:
make CC="gcc -m64"
@@ -212,7 +205,7 @@ setenv /release /x86
-Or select the x64 compiler (this only builds the interpreter right now):
+Or select the x64 compiler:
setenv /release /x64
diff --git a/doc/luajit.html b/doc/luajit.html
index 58dfa32e..66032fdf 100644
--- a/doc/luajit.html
+++ b/doc/luajit.html
@@ -63,8 +63,9 @@ standard Lua interpreter and can be deployed as a drop-in replacement.
LuaJIT offers more performance, at the expense of portability. It
currently runs on all popular operating systems based on x86 CPUs
-(Linux, Windows, OSX etc.). A port to x64 CPUs is currently ongoing —
-you can follow its progress in the » git repository.
+(Linux, Windows, OSX etc.). A preliminary port to Linux/x64 and Windows/x64
+is already available (follow the build instructions
+to enable it).
Other platforms will be supported in the future, based on user demand
and sponsoring.
diff --git a/doc/status.html b/doc/status.html
index 23847da9..d7cdffb5 100644
--- a/doc/status.html
+++ b/doc/status.html
@@ -148,9 +148,8 @@ trace linking heuristics prevent this, but in the worst case this
means the code always falls back to the interpreter.
-Trace management needs more tuning: better blacklisting of aborted
-traces, less drastic countermeasures against trace explosion and better
-heuristics in general.
+Trace management needs more tuning: less drastic countermeasures
+against trace explosion and better heuristics in general.
Some checks are missing in the JIT-compiled code for obscure situations
@@ -199,7 +198,7 @@ Nonetheless, it compiles to native code and needs to be adapted to each
architecture. Porting the compiler backend is probably the easier task,
but a key element of its design is the fast interpreter, written in
machine-specific assembler.
-An x64 port is already in the works, thanks to the
+A preliminary x64 port is already available, thanks to the
LuaJIT sponsorship program.
Other ports will follow — companies which are
interested in sponsoring a port to a particular architecture, please
diff --git a/src/Makefile b/src/Makefile
index 5fef367a..261e2049 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -20,9 +20,6 @@ NODOTABIVER= 51
# Turn any of the optional settings on by removing the '#' in front of them.
# You need to 'make clean' and 'make' again, if you change any options.
#
-# Note: LuaJIT can only be compiled for x86, and not for x64 (yet)!
-# In the meantime, the x86 binary runs fine under a x64 OS.
-#
# It's recommended to compile at least for i686. By default the assembler part
# of the interpreter makes use of CMOV/FCOMI*/FUCOMI* instructions, anyway.
CC= gcc -m32 -march=i686
@@ -30,10 +27,14 @@ CC= gcc -m32 -march=i686
# binaries to a different machine:
#CC= gcc -m32 -march=native
#
+# Currently LuaJIT builds by default as a 32 bit binary. Use this to force
+# a native x64 build on Linux/x64:
+#CC= gcc -m64
+#
# Since the assembler part does NOT maintain a frame pointer, it's pointless
-# to slow down the C part by not omitting it. Debugging and tracebacks are
-# not affected -- the assembler part has frame unwind information and GCC
-# emits it with -g (see CCDEBUG below).
+# to slow down the C part by not omitting it. Debugging, tracebacks and
+# unwinding are not affected -- the assembler part has frame unwind
+# information and GCC emits it where needed (x64) or with -g (see CCDEBUG).
CCOPT= -O2 -fomit-frame-pointer
# Use this if you want to generate a smaller binary (but it's slower):
#CCOPT= -Os -fomit-frame-pointer
@@ -75,7 +76,8 @@ XCFLAGS=
#
# Use the system provided memory allocator (realloc) instead of the
# bundled memory allocator. This is slower, but sometimes helpful for
-# debugging. It's mandatory for Valgrind's memcheck tool, too.
+# debugging. It's helpful for Valgrind's memcheck tool, too. This option
+# cannot be enabled on x64, since the built-in allocator is mandatory.
#XCFLAGS+= -DLUAJIT_USE_SYSMALLOC
#
# This define is required to run LuaJIT under Valgrind. The Valgrind
diff --git a/src/lj_arch.h b/src/lj_arch.h
index 111ea8c1..86a2d5ed 100644
--- a/src/lj_arch.h
+++ b/src/lj_arch.h
@@ -48,7 +48,6 @@
#define LJ_TARGET_X64 1
#define LJ_TARGET_X86ORX64 1
#define LJ_PAGESIZE 4096
-#define LJ_ARCH_NOJIT 1 /* NYI */
#else
#error "No target architecture defined"
#endif