Add PS Vita port.

Thanks to Anton Stenmark.
This commit is contained in:
Mike Pall 2014-04-27 00:09:45 +02:00
parent 2715fe3aee
commit 7a39be0ac4
8 changed files with 158 additions and 28 deletions

View File

@ -127,7 +127,7 @@ operating systems, CPUs and compilers:
<tr class="odd"> <tr class="odd">
<td class="compatcpu"><a href="#cross2">ARMv5+<br>ARM9E+</a></td> <td class="compatcpu"><a href="#cross2">ARMv5+<br>ARM9E+</a></td>
<td class="compatos">GCC 4.2+</td> <td class="compatos">GCC 4.2+</td>
<td class="compatos">GCC 4.2+</td> <td class="compatos">GCC 4.2+<br>PSP2 (<a href="#psvita">PS VITA</a>)</td>
<td class="compatos">GCC 4.2+</td> <td class="compatos">GCC 4.2+</td>
<td class="compatos compatno">&nbsp;</td> <td class="compatos compatno">&nbsp;</td>
</tr> </tr>
@ -458,41 +458,56 @@ ISDKF="-arch armv7 -isysroot $ISDK/SDKs/$ISDKVER"
make HOST_CC="gcc -m32 -arch i386" CROSS=$ISDKP TARGET_FLAGS="$ISDKF" \ make HOST_CC="gcc -m32 -arch i386" CROSS=$ISDKP TARGET_FLAGS="$ISDKF" \
TARGET_SYS=iOS TARGET_SYS=iOS
</pre> </pre>
<h3 id="consoles">Cross-compiling for consoles</h3>
<p> <p>
You can cross-compile for <b id="ps3">PS3</b> using the PS3&nbsp;SDK from Building LuaJIT for consoles requires both a supported host compiler
a Linux host or a Windows host (requires 32&nbsp;bit MinGW (GCC) on the host, (x86 or x64) and a cross-compiler (to PPC or ARM) from the official
too). Due to restrictions on consoles, the JIT compiler is disabled and console SDK.
only the fast interpreter is built: </p>
<p>
Due to restrictions on consoles, the JIT compiler is disabled and only
the fast interpreter is built. This is still faster than plain Lua,
but much slower than the JIT compiler. The FFI is disabled, too, since
it's not very useful in such an environment.
</p>
<p>
The following commands build a static library <tt>libluajit.a</tt>,
which can be linked against your game, just like the Lua library.
</p>
<p>
To cross-compile for <b id="ps3">PS3</b> from a Linux host (requires
32&nbsp;bit GCC, i.e. multilib Linux/x64) or a Windows host (requires
32&nbsp;bit MinGW), run this command:
</p> </p>
<pre class="code"> <pre class="code">
make HOST_CC="gcc -m32" CROSS=ppu-lv2- make HOST_CC="gcc -m32" CROSS=ppu-lv2-
</pre> </pre>
<p> <p>
You can cross-compile for <b id="ps4">PS4</b> from a Windows host using To cross-compile for <b id="ps4">PS4</b> from a Windows host,
the PS4&nbsp;SDK (ORBIS) plus 64&nbsp;bit MSVC. Due to restrictions on open a "Visual Studio .NET Command Prompt" (64&nbsp;bit host compiler),
consoles, the JIT compiler is disabled and only the fast interpreter <tt>cd</tt> to the directory where you've unpacked the sources and
is built. run the following commands:
</p>
<p>
Open a "Visual Studio .NET Command Prompt" (64&nbsp;bit host compiler),
<tt>cd</tt> to the directory where you've unpacked the sources and run
the following commands. This builds a static library <tt>libluajit.a</tt>,
which can be linked against your game, just like the Lua library.
</p> </p>
<pre class="code"> <pre class="code">
cd src cd src
ps4build ps4build
</pre> </pre>
<p> <p>
You can cross-compile for <b id="xbox360">Xbox 360</b> using the To cross-compile for <b id="psvita">PS Vita</b> from a Windows host,
Xbox&nbsp;360 SDK (MSVC + XEDK). Due to restrictions on consoles, the open a "Visual Studio .NET Command Prompt" (32&nbsp;bit host compiler),
JIT compiler is disabled and only the fast interpreter is built. <tt>cd</tt> to the directory where you've unpacked the sources and
run the following commands:
</p> </p>
<pre class="code">
cd src
psvitabuild
</pre>
<p> <p>
Open a "Visual Studio .NET Command Prompt" (32&nbsp;bit host compiler), To cross-compile for <b id="xbox360">Xbox 360</b> from a Windows host,
open a "Visual Studio .NET Command Prompt" (32&nbsp;bit host compiler),
<tt>cd</tt> to the directory where you've unpacked the sources and run <tt>cd</tt> to the directory where you've unpacked the sources and run
the following commands. This builds a static library <tt>luajit20.lib</tt>, the following commands:
which can be linked against your game, just like the Lua library.
</p> </p>
<pre class="code"> <pre class="code">
cd src cd src

View File

@ -38,6 +38,9 @@ table.os1 td {
table.os2 td { table.os2 td {
color: #ffa040; color: #ffa040;
} }
table.os3 td {
color: #40ffff;
}
table.compiler td { table.compiler td {
color: #2080ff; color: #2080ff;
background: #62bf41; background: #62bf41;
@ -158,7 +161,10 @@ LuaJIT is Copyright &copy; 2005-2014 Mike Pall, released under the
<tr><td>Windows</td><td>Linux</td><td>BSD</td><td>OSX</td><td>POSIX</td></tr> <tr><td>Windows</td><td>Linux</td><td>BSD</td><td>OSX</td><td>POSIX</td></tr>
</table> </table>
<table class="feature os os2"> <table class="feature os os2">
<tr><td><span style="font-size:90%;">Embedded</span></td><td>Android</td><td>iOS</td><td>PS3</td><td>PS4</td><td>Xbox 360</td></tr> <tr><td><span style="font-size:90%;">Embedded</span></td><td>Android</td><td>iOS</td></tr>
</table>
<table class="feature os os3">
<tr><td>PS3</td><td>PS4</td><td>PS Vita</td><td>Xbox 360</td></tr>
</table> </table>
<table class="feature compiler"> <table class="feature compiler">
<tr><td>GCC</td><td>CLANG<br>LLVM</td><td>MSVC</td></tr> <tr><td>GCC</td><td>CLANG<br>LLVM</td><td>MSVC</td></tr>

View File

@ -286,7 +286,7 @@ void emit_asm(BuildCtx *ctx)
fprintf(ctx->fp, "\n"); fprintf(ctx->fp, "\n");
switch (ctx->mode) { switch (ctx->mode) {
case BUILD_elfasm: case BUILD_elfasm:
#if !LJ_TARGET_PS3 #if !(LJ_TARGET_PS3 || LJ_TARGET_PSVITA)
fprintf(ctx->fp, "\t.section .note.GNU-stack,\"\"," ELFASM_PX "progbits\n"); fprintf(ctx->fp, "\t.section .note.GNU-stack,\"\"," ELFASM_PX "progbits\n");
#endif #endif
#if LJ_TARGET_PPCSPE #if LJ_TARGET_PPCSPE

View File

@ -426,7 +426,7 @@ LJLIB_CF(io_popen)
LJLIB_CF(io_tmpfile) LJLIB_CF(io_tmpfile)
{ {
IOFileUD *iof = io_file_new(L); IOFileUD *iof = io_file_new(L);
#if LJ_TARGET_PS3 || LJ_TARGET_PS4 #if LJ_TARGET_PS3 || LJ_TARGET_PS4 || LJ_TARGET_PSVITA
iof->fp = NULL; errno = ENOSYS; iof->fp = NULL; errno = ENOSYS;
#else #else
iof->fp = tmpfile(); iof->fp = tmpfile();

View File

@ -7,7 +7,6 @@
*/ */
#include <errno.h> #include <errno.h>
#include <locale.h>
#include <time.h> #include <time.h>
#define lib_os_c #define lib_os_c
@ -27,6 +26,10 @@
#include <stdio.h> #include <stdio.h>
#endif #endif
#if !LJ_TARGET_PSVITA
#include <locale.h>
#endif
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */
#define LJLIB_MODULE_os #define LJLIB_MODULE_os
@ -70,7 +73,7 @@ LJLIB_CF(os_rename)
LJLIB_CF(os_tmpname) LJLIB_CF(os_tmpname)
{ {
#if LJ_TARGET_PS3 || LJ_TARGET_PS4 #if LJ_TARGET_PS3 || LJ_TARGET_PS4 || LJ_TARGET_PSVITA
lj_err_caller(L, LJ_ERR_OSUNIQF); lj_err_caller(L, LJ_ERR_OSUNIQF);
return 0; return 0;
#else #else
@ -254,6 +257,9 @@ LJLIB_CF(os_difftime)
LJLIB_CF(os_setlocale) LJLIB_CF(os_setlocale)
{ {
#if LJ_TARGET_PSVITA
lua_pushliteral(L, "C");
#else
GCstr *s = lj_lib_optstr(L, 1); GCstr *s = lj_lib_optstr(L, 1);
const char *str = s ? strdata(s) : NULL; const char *str = s ? strdata(s) : NULL;
int opt = lj_lib_checkopt(L, 2, 6, int opt = lj_lib_checkopt(L, 2, 6,
@ -265,6 +271,7 @@ LJLIB_CF(os_setlocale)
else if (opt == 4) opt = LC_MONETARY; else if (opt == 4) opt = LC_MONETARY;
else if (opt == 6) opt = LC_ALL; else if (opt == 6) opt = LC_ALL;
lua_pushstring(L, setlocale(opt, str)); lua_pushstring(L, setlocale(opt, str));
#endif
return 1; return 1;
} }

View File

@ -111,6 +111,11 @@
#define NULL ((void*)0) #define NULL ((void*)0)
#endif #endif
#ifdef __psp2__
#define LJ_TARGET_PSVITA 1
#define LJ_TARGET_CONSOLE 1
#endif
#if _XBOX_VER >= 200 #if _XBOX_VER >= 200
#define LJ_TARGET_XBOX360 1 #define LJ_TARGET_XBOX360 1
#define LJ_TARGET_CONSOLE 1 #define LJ_TARGET_CONSOLE 1

View File

@ -111,7 +111,7 @@ typedef uintptr_t BloomFilter;
#define bloomset(b, x) ((b) |= bloombit((x))) #define bloomset(b, x) ((b) |= bloombit((x)))
#define bloomtest(b, x) ((b) & bloombit((x))) #define bloomtest(b, x) ((b) & bloombit((x)))
#if defined(__GNUC__) #if defined(__GNUC__) || defined(__psp2__)
#define LJ_NORET __attribute__((noreturn)) #define LJ_NORET __attribute__((noreturn))
#define LJ_ALIGN(n) __attribute__((aligned(n))) #define LJ_ALIGN(n) __attribute__((aligned(n)))
@ -119,7 +119,7 @@ typedef uintptr_t BloomFilter;
#define LJ_AINLINE inline __attribute__((always_inline)) #define LJ_AINLINE inline __attribute__((always_inline))
#define LJ_NOINLINE __attribute__((noinline)) #define LJ_NOINLINE __attribute__((noinline))
#if defined(__ELF__) || defined(__MACH__) #if defined(__ELF__) || defined(__MACH__) || defined(__psp2__)
#if !((defined(__sun__) && defined(__svr4__)) || defined(__CELLOS_LV2__)) #if !((defined(__sun__) && defined(__svr4__)) || defined(__CELLOS_LV2__))
#define LJ_NOAPI extern __attribute__((visibility("hidden"))) #define LJ_NOAPI extern __attribute__((visibility("hidden")))
#endif #endif
@ -150,6 +150,9 @@ static LJ_AINLINE uint32_t lj_fls(uint32_t x)
#if defined(__arm__) #if defined(__arm__)
static LJ_AINLINE uint32_t lj_bswap(uint32_t x) static LJ_AINLINE uint32_t lj_bswap(uint32_t x)
{ {
#if defined(__psp2__)
return __builtin_rev(x);
#else
uint32_t r; uint32_t r;
#if __ARM_ARCH_6__ || __ARM_ARCH_6J__ || __ARM_ARCH_6T2__ || __ARM_ARCH_6Z__ ||\ #if __ARM_ARCH_6__ || __ARM_ARCH_6J__ || __ARM_ARCH_6T2__ || __ARM_ARCH_6Z__ ||\
__ARM_ARCH_6ZK__ || __ARM_ARCH_7__ || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ __ARM_ARCH_6ZK__ || __ARM_ARCH_7__ || __ARM_ARCH_7A__ || __ARM_ARCH_7R__
@ -163,6 +166,7 @@ static LJ_AINLINE uint32_t lj_bswap(uint32_t x)
#endif #endif
return ((r & 0xff00ffffu) >> 8) ^ lj_ror(x, 8); return ((r & 0xff00ffffu) >> 8) ^ lj_ror(x, 8);
#endif #endif
#endif
} }
static LJ_AINLINE uint64_t lj_bswap64(uint64_t x) static LJ_AINLINE uint64_t lj_bswap64(uint64_t x)

93
src/psvitabuild.bat Normal file
View File

@ -0,0 +1,93 @@
@rem Script to build LuaJIT with the PS Vita SDK.
@rem Donated to the public domain.
@rem
@rem Open a "Visual Studio .NET Command Prompt" (32 bit host compiler)
@rem Then cd to this directory and run this script.
@if not defined INCLUDE goto :FAIL
@if not defined SCE_PSP2_SDK_DIR goto :FAIL
@setlocal
@rem ---- Host compiler ----
@set LJCOMPILE=cl /nologo /c /MD /O2 /W3 /D_CRT_SECURE_NO_DEPRECATE
@set LJLINK=link /nologo
@set LJMT=mt /nologo
@set DASMDIR=..\dynasm
@set DASM=%DASMDIR%\dynasm.lua
@set ALL_LIB=lib_base.c lib_math.c lib_bit.c lib_string.c lib_table.c lib_io.c lib_os.c lib_package.c lib_debug.c lib_jit.c lib_ffi.c
%LJCOMPILE% host\minilua.c
@if errorlevel 1 goto :BAD
%LJLINK% /out:minilua.exe minilua.obj
@if errorlevel 1 goto :BAD
if exist minilua.exe.manifest^
%LJMT% -manifest minilua.exe.manifest -outputresource:minilua.exe
@rem Check for 32 bit host compiler.
@minilua
@if errorlevel 8 goto :FAIL
@set DASMFLAGS=-D FPU -D HFABI
minilua %DASM% -LN %DASMFLAGS% -o host\buildvm_arch.h vm_arm.dasc
@if errorlevel 1 goto :BAD
%LJCOMPILE% /I "." /I %DASMDIR% -DLUAJIT_TARGET=LUAJIT_ARCH_ARM -DLUAJIT_OS=LUAJIT_OS_OTHER -DLUAJIT_DISABLE_JIT -DLUAJIT_DISABLE_FFI -DLJ_TARGET_PSVITA=1 host\buildvm*.c
@if errorlevel 1 goto :BAD
%LJLINK% /out:buildvm.exe buildvm*.obj
@if errorlevel 1 goto :BAD
if exist buildvm.exe.manifest^
%LJMT% -manifest buildvm.exe.manifest -outputresource:buildvm.exe
buildvm -m elfasm -o lj_vm.s
@if errorlevel 1 goto :BAD
buildvm -m bcdef -o lj_bcdef.h %ALL_LIB%
@if errorlevel 1 goto :BAD
buildvm -m ffdef -o lj_ffdef.h %ALL_LIB%
@if errorlevel 1 goto :BAD
buildvm -m libdef -o lj_libdef.h %ALL_LIB%
@if errorlevel 1 goto :BAD
buildvm -m recdef -o lj_recdef.h %ALL_LIB%
@if errorlevel 1 goto :BAD
buildvm -m vmdef -o jit\vmdef.lua %ALL_LIB%
@if errorlevel 1 goto :BAD
buildvm -m folddef -o lj_folddef.h lj_opt_fold.c
@if errorlevel 1 goto :BAD
@rem ---- Cross compiler ----
@set LJCOMPILE="%SCE_PSP2_SDK_DIR%\host_tools\build\bin\psp2snc" -c -w -DLUAJIT_DISABLE_FFI -DLUAJIT_USE_SYSMALLOC
@set LJLIB="%SCE_PSP2_SDK_DIR%\host_tools\build\bin\psp2ld32" -r --output=
@set INCLUDE=""
"%SCE_PSP2_SDK_DIR%\host_tools\build\bin\psp2as" -o lj_vm.o lj_vm.s
@if "%1" neq "debug" goto :NODEBUG
@shift
@set LJCOMPILE=%LJCOMPILE% -g -O0
@set TARGETLIB=libluajitD.a
goto :BUILD
:NODEBUG
@set LJCOMPILE=%LJCOMPILE% -O2
@set TARGETLIB=libluajit.a
:BUILD
del %TARGETLIB%
%LJCOMPILE% ljamalg.c
@if errorlevel 1 goto :BAD
%LJLIB%%TARGETLIB% ljamalg.o lj_vm.o
@if errorlevel 1 goto :BAD
@del *.o *.obj *.manifest minilua.exe buildvm.exe
@echo.
@echo === Successfully built LuaJIT for PS Vita ===
@goto :END
:BAD
@echo.
@echo *******************************************************
@echo *** Build FAILED -- Please check the error messages ***
@echo *******************************************************
@goto :END
:FAIL
@echo To run this script you must open a "Visual Studio .NET Command Prompt"
@echo (32 bit host compiler). The PS Vita SDK must be installed, too.
:END