mirror of
https://github.com/love2d/megasource.git
synced 2026-08-12 00:20:55 +02:00
update LuaJIT to the latest commit (5a18d45)
This commit is contained in:
@@ -0,0 +1 @@
|
||||
/.relver export-subst
|
||||
@@ -0,0 +1 @@
|
||||
1694316387
|
||||
@@ -1,7 +1,7 @@
|
||||
===============================================================================
|
||||
LuaJIT -- a Just-In-Time Compiler for Lua. https://luajit.org/
|
||||
|
||||
Copyright (C) 2005-2022 Mike Pall. All rights reserved.
|
||||
Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
||||
+21
-20
@@ -10,16 +10,21 @@
|
||||
# For MSVC, please follow the instructions given in src/msvcbuild.bat.
|
||||
# For MinGW and Cygwin, cd to src and run make with the Makefile there.
|
||||
#
|
||||
# Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
# Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
##############################################################################
|
||||
|
||||
MAJVER= 2
|
||||
MINVER= 1
|
||||
RELVER= 0
|
||||
PREREL= -beta3
|
||||
VERSION= $(MAJVER).$(MINVER).$(RELVER)$(PREREL)
|
||||
ABIVER= 5.1
|
||||
|
||||
# LuaJIT uses rolling releases. The release version is based on the time of
|
||||
# the latest git commit. The 'git' command must be available during the build.
|
||||
RELVER= $(shell cat src/luajit_relver.txt 2>/dev/null || : )
|
||||
# Note: setting it with := doesn't work, since it will change during the build.
|
||||
|
||||
MMVERSION= $(MAJVER).$(MINVER)
|
||||
VERSION= $(MMVERSION).$(RELVER)
|
||||
|
||||
##############################################################################
|
||||
#
|
||||
# Change the installation path as needed. This automatically adjusts
|
||||
@@ -33,10 +38,10 @@ DPREFIX= $(DESTDIR)$(PREFIX)
|
||||
INSTALL_BIN= $(DPREFIX)/bin
|
||||
INSTALL_LIB= $(DPREFIX)/$(MULTILIB)
|
||||
INSTALL_SHARE= $(DPREFIX)/share
|
||||
INSTALL_DEFINC= $(DPREFIX)/include/luajit-$(MAJVER).$(MINVER)
|
||||
INSTALL_DEFINC= $(DPREFIX)/include/luajit-$(MMVERSION)
|
||||
INSTALL_INC= $(INSTALL_DEFINC)
|
||||
|
||||
INSTALL_LJLIBD= $(INSTALL_SHARE)/luajit-$(VERSION)
|
||||
INSTALL_LJLIBD= $(INSTALL_SHARE)/luajit-$(MMVERSION)
|
||||
INSTALL_JITLIB= $(INSTALL_LJLIBD)/jit
|
||||
INSTALL_LMODD= $(INSTALL_SHARE)/lua
|
||||
INSTALL_LMOD= $(INSTALL_LMODD)/$(ABIVER)
|
||||
@@ -50,10 +55,10 @@ INSTALL_TSYMNAME= luajit
|
||||
INSTALL_ANAME= libluajit-$(ABIVER).a
|
||||
INSTALL_SOSHORT1= libluajit-$(ABIVER).so
|
||||
INSTALL_SOSHORT2= libluajit-$(ABIVER).so.$(MAJVER)
|
||||
INSTALL_SONAME= $(INSTALL_SOSHORT2).$(MINVER).$(RELVER)
|
||||
INSTALL_SONAME= libluajit-$(ABIVER).so.$(VERSION)
|
||||
INSTALL_DYLIBSHORT1= libluajit-$(ABIVER).dylib
|
||||
INSTALL_DYLIBSHORT2= libluajit-$(ABIVER).$(MAJVER).dylib
|
||||
INSTALL_DYLIBNAME= libluajit-$(ABIVER).$(MAJVER).$(MINVER).$(RELVER).dylib
|
||||
INSTALL_DYLIBNAME= libluajit-$(ABIVER).$(VERSION).dylib
|
||||
INSTALL_PCNAME= luajit.pc
|
||||
|
||||
INSTALL_STATIC= $(INSTALL_LIB)/$(INSTALL_ANAME)
|
||||
@@ -78,7 +83,8 @@ INSTALL_F= install -m 0644
|
||||
UNINSTALL= $(RM)
|
||||
LDCONFIG= ldconfig -n 2>/dev/null
|
||||
SED_PC= sed -e "s|^prefix=.*|prefix=$(PREFIX)|" \
|
||||
-e "s|^multilib=.*|multilib=$(MULTILIB)|"
|
||||
-e "s|^multilib=.*|multilib=$(MULTILIB)|" \
|
||||
-e "s|^relver=.*|relver=$(RELVER)|"
|
||||
ifneq ($(INSTALL_DEFINC),$(INSTALL_INC))
|
||||
SED_PC+= -e "s|^includedir=.*|includedir=$(INSTALL_INC)|"
|
||||
endif
|
||||
@@ -115,9 +121,9 @@ endif
|
||||
INSTALL_DEP= src/luajit
|
||||
|
||||
default all $(INSTALL_DEP):
|
||||
@echo "==== Building LuaJIT $(VERSION) ===="
|
||||
@echo "==== Building LuaJIT $(MMVERSION) ===="
|
||||
$(MAKE) -C src
|
||||
@echo "==== Successfully built LuaJIT $(VERSION) ===="
|
||||
@echo "==== Successfully built LuaJIT $(MMVERSION) ===="
|
||||
|
||||
install: $(INSTALL_DEP)
|
||||
@echo "==== Installing LuaJIT $(VERSION) to $(PREFIX) ===="
|
||||
@@ -136,18 +142,12 @@ install: $(INSTALL_DEP)
|
||||
$(RM) $(FILE_PC).tmp
|
||||
cd src && $(INSTALL_F) $(FILES_INC) $(INSTALL_INC)
|
||||
cd src/jit && $(INSTALL_F) $(FILES_JITLIB) $(INSTALL_JITLIB)
|
||||
$(SYMLINK) $(INSTALL_TNAME) $(INSTALL_TSYM)
|
||||
@echo "==== Successfully installed LuaJIT $(VERSION) to $(PREFIX) ===="
|
||||
@echo ""
|
||||
@echo "Note: the development releases deliberately do NOT install a symlink for luajit"
|
||||
@echo "You can do this now by running this command (with sudo):"
|
||||
@echo ""
|
||||
@echo " $(SYMLINK) $(INSTALL_TNAME) $(INSTALL_TSYM)"
|
||||
@echo ""
|
||||
|
||||
|
||||
uninstall:
|
||||
@echo "==== Uninstalling LuaJIT $(VERSION) from $(PREFIX) ===="
|
||||
$(UNINSTALL) $(INSTALL_T) $(INSTALL_STATIC) $(INSTALL_DYN) $(INSTALL_SHORT1) $(INSTALL_SHORT2) $(INSTALL_MAN)/$(FILE_MAN) $(INSTALL_PC)
|
||||
$(UNINSTALL) $(INSTALL_TSYM) $(INSTALL_T) $(INSTALL_STATIC) $(INSTALL_DYN) $(INSTALL_SHORT1) $(INSTALL_SHORT2) $(INSTALL_MAN)/$(FILE_MAN) $(INSTALL_PC)
|
||||
for file in $(FILES_JITLIB); do \
|
||||
$(UNINSTALL) $(INSTALL_JITLIB)/$$file; \
|
||||
done
|
||||
@@ -161,8 +161,9 @@ uninstall:
|
||||
##############################################################################
|
||||
|
||||
amalg:
|
||||
@echo "Building LuaJIT $(VERSION)"
|
||||
@echo "==== Building LuaJIT $(MMVERSION) (amalgamation) ===="
|
||||
$(MAKE) -C src amalg
|
||||
@echo "==== Successfully built LuaJIT $(MMVERSION) (amalgamation) ===="
|
||||
|
||||
clean:
|
||||
$(MAKE) -C src clean
|
||||
|
||||
+3
-3
@@ -1,11 +1,11 @@
|
||||
README for LuaJIT 2.1.0-beta3
|
||||
-----------------------------
|
||||
README for LuaJIT 2.1
|
||||
---------------------
|
||||
|
||||
LuaJIT is a Just-In-Time (JIT) compiler for the Lua programming language.
|
||||
|
||||
Project Homepage: https://luajit.org/
|
||||
|
||||
LuaJIT is Copyright (C) 2005-2022 Mike Pall.
|
||||
LuaJIT is Copyright (C) 2005-2023 Mike Pall.
|
||||
LuaJIT is free software, released under the MIT license.
|
||||
See full Copyright Notice in the COPYRIGHT file or in luajit.h.
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2004-2022 Mike Pall.
|
||||
/* Copyright (C) 2004-2023 Mike Pall.
|
||||
*
|
||||
* You are welcome to use the general ideas of this design for your own sites.
|
||||
* But please do not steal the stylesheet, the layout or the color scheme.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2004-2022 Mike Pall.
|
||||
/* Copyright (C) 2004-2023 Mike Pall.
|
||||
*
|
||||
* You are welcome to use the general ideas of this design for your own sites.
|
||||
* But please do not steal the stylesheet, the layout or the color scheme.
|
||||
@@ -206,11 +206,9 @@ img.right {
|
||||
.ext {
|
||||
color: #ff8000;
|
||||
}
|
||||
.new {
|
||||
font-size: 6pt;
|
||||
vertical-align: middle;
|
||||
background: #ff8000;
|
||||
color: #ffffff;
|
||||
.note {
|
||||
padding: 0.5em 1em;
|
||||
border-left: 3px solid #bfcfff;
|
||||
}
|
||||
#site {
|
||||
clear: both;
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<title>Contact</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2022">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2023">
|
||||
<meta name="Language" content="en">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
|
||||
@@ -46,9 +46,9 @@
|
||||
<a href="ext_profiler.html">Profiler</a>
|
||||
</li></ul>
|
||||
</li><li>
|
||||
<a href="status.html">Status</a>
|
||||
<a href="https://luajit.org/status.html">Status <span class="ext">»</span></a>
|
||||
</li><li>
|
||||
<a href="faq.html">FAQ</a>
|
||||
<a href="https://luajit.org/faq.html">FAQ <span class="ext">»</span></a>
|
||||
</li><li>
|
||||
<a href="https://luajit.org/list.html">Mailing List <span class="ext">»</span></a>
|
||||
</li></ul>
|
||||
@@ -94,7 +94,7 @@ don't like that, please complain to Google or Microsoft, not me.
|
||||
<h2>Copyright</h2>
|
||||
<p>
|
||||
All documentation is
|
||||
Copyright © 2005-2022 Mike Pall.
|
||||
Copyright © 2005-2023 Mike Pall.
|
||||
</p>
|
||||
|
||||
|
||||
@@ -102,7 +102,7 @@ Copyright © 2005-2022 Mike Pall.
|
||||
</div>
|
||||
<div id="foot">
|
||||
<hr class="hide">
|
||||
Copyright © 2005-2022
|
||||
Copyright © 2005-2023
|
||||
<span class="noprint">
|
||||
·
|
||||
<a href="contact.html">Contact</a>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<title>String Buffer Library</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2022">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2023">
|
||||
<meta name="Language" content="en">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
|
||||
@@ -57,9 +57,9 @@
|
||||
<a href="ext_profiler.html">Profiler</a>
|
||||
</li></ul>
|
||||
</li><li>
|
||||
<a href="status.html">Status</a>
|
||||
<a href="https://luajit.org/status.html">Status <span class="ext">»</span></a>
|
||||
</li><li>
|
||||
<a href="faq.html">FAQ</a>
|
||||
<a href="https://luajit.org/faq.html">FAQ <span class="ext">»</span></a>
|
||||
</li><li>
|
||||
<a href="https://luajit.org/list.html">Mailing List <span class="ext">»</span></a>
|
||||
</li></ul>
|
||||
@@ -88,12 +88,6 @@ The string buffer library also includes a high-performance
|
||||
<a href="serialize">serializer</a> for Lua objects.
|
||||
</p>
|
||||
|
||||
<h2 id="wip" style="color:#ff0000">Work in Progress</h2>
|
||||
<p>
|
||||
<b style="color:#ff0000">This library is a work in progress. More
|
||||
functionality will be added soon.</b>
|
||||
</p>
|
||||
|
||||
<h2 id="use">Using the String Buffer Library</h2>
|
||||
<p>
|
||||
The string buffer library is built into LuaJIT by default, but it's not
|
||||
@@ -685,7 +679,7 @@ mappings of files are OK, but only if the file does not change.
|
||||
</div>
|
||||
<div id="foot">
|
||||
<hr class="hide">
|
||||
Copyright © 2005-2022
|
||||
Copyright © 2005-2023
|
||||
<span class="noprint">
|
||||
·
|
||||
<a href="contact.html">Contact</a>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<title>Lua/C API Extensions</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2022">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2023">
|
||||
<meta name="Language" content="en">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
|
||||
@@ -46,9 +46,9 @@
|
||||
<a href="ext_profiler.html">Profiler</a>
|
||||
</li></ul>
|
||||
</li><li>
|
||||
<a href="status.html">Status</a>
|
||||
<a href="https://luajit.org/status.html">Status <span class="ext">»</span></a>
|
||||
</li><li>
|
||||
<a href="faq.html">FAQ</a>
|
||||
<a href="https://luajit.org/faq.html">FAQ <span class="ext">»</span></a>
|
||||
</li><li>
|
||||
<a href="https://luajit.org/list.html">Mailing List <span class="ext">»</span></a>
|
||||
</li></ul>
|
||||
@@ -173,7 +173,7 @@ Also note that this mechanism is not without overhead.
|
||||
</div>
|
||||
<div id="foot">
|
||||
<hr class="hide">
|
||||
Copyright © 2005-2022
|
||||
Copyright © 2005-2023
|
||||
<span class="noprint">
|
||||
·
|
||||
<a href="contact.html">Contact</a>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<title>FFI Library</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2022">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2023">
|
||||
<meta name="Language" content="en">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
|
||||
@@ -46,9 +46,9 @@
|
||||
<a href="ext_profiler.html">Profiler</a>
|
||||
</li></ul>
|
||||
</li><li>
|
||||
<a href="status.html">Status</a>
|
||||
<a href="https://luajit.org/status.html">Status <span class="ext">»</span></a>
|
||||
</li><li>
|
||||
<a href="faq.html">FAQ</a>
|
||||
<a href="https://luajit.org/faq.html">FAQ <span class="ext">»</span></a>
|
||||
</li><li>
|
||||
<a href="https://luajit.org/list.html">Mailing List <span class="ext">»</span></a>
|
||||
</li></ul>
|
||||
@@ -316,7 +316,7 @@ without undue conversion penalties.
|
||||
</div>
|
||||
<div id="foot">
|
||||
<hr class="hide">
|
||||
Copyright © 2005-2022
|
||||
Copyright © 2005-2023
|
||||
<span class="noprint">
|
||||
·
|
||||
<a href="contact.html">Contact</a>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<title>ffi.* API Functions</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2022">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2023">
|
||||
<meta name="Language" content="en">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
|
||||
@@ -51,9 +51,9 @@ td.abiparam { font-weight: bold; width: 6em; }
|
||||
<a href="ext_profiler.html">Profiler</a>
|
||||
</li></ul>
|
||||
</li><li>
|
||||
<a href="status.html">Status</a>
|
||||
<a href="https://luajit.org/status.html">Status <span class="ext">»</span></a>
|
||||
</li><li>
|
||||
<a href="faq.html">FAQ</a>
|
||||
<a href="https://luajit.org/faq.html">FAQ <span class="ext">»</span></a>
|
||||
</li><li>
|
||||
<a href="https://luajit.org/list.html">Mailing List <span class="ext">»</span></a>
|
||||
</li></ul>
|
||||
@@ -558,7 +558,7 @@ named <tt>i</tt>.
|
||||
</div>
|
||||
<div id="foot">
|
||||
<hr class="hide">
|
||||
Copyright © 2005-2022
|
||||
Copyright © 2005-2023
|
||||
<span class="noprint">
|
||||
·
|
||||
<a href="contact.html">Contact</a>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<title>FFI Semantics</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2022">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2023">
|
||||
<meta name="Language" content="en">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
|
||||
@@ -51,9 +51,9 @@ td.convop { font-style: italic; width: 40%; }
|
||||
<a href="ext_profiler.html">Profiler</a>
|
||||
</li></ul>
|
||||
</li><li>
|
||||
<a href="status.html">Status</a>
|
||||
<a href="https://luajit.org/status.html">Status <span class="ext">»</span></a>
|
||||
</li><li>
|
||||
<a href="faq.html">FAQ</a>
|
||||
<a href="https://luajit.org/faq.html">FAQ <span class="ext">»</span></a>
|
||||
</li><li>
|
||||
<a href="https://luajit.org/list.html">Mailing List <span class="ext">»</span></a>
|
||||
</li></ul>
|
||||
@@ -1246,7 +1246,7 @@ compiled.</li>
|
||||
</div>
|
||||
<div id="foot">
|
||||
<hr class="hide">
|
||||
Copyright © 2005-2022
|
||||
Copyright © 2005-2023
|
||||
<span class="noprint">
|
||||
·
|
||||
<a href="contact.html">Contact</a>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<title>FFI Tutorial</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2022">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2023">
|
||||
<meta name="Language" content="en">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
|
||||
@@ -53,9 +53,9 @@ td.idiomlua b { font-weight: normal; color: #2142bf; }
|
||||
<a href="ext_profiler.html">Profiler</a>
|
||||
</li></ul>
|
||||
</li><li>
|
||||
<a href="status.html">Status</a>
|
||||
<a href="https://luajit.org/status.html">Status <span class="ext">»</span></a>
|
||||
</li><li>
|
||||
<a href="faq.html">FAQ</a>
|
||||
<a href="https://luajit.org/faq.html">FAQ <span class="ext">»</span></a>
|
||||
</li><li>
|
||||
<a href="https://luajit.org/list.html">Mailing List <span class="ext">»</span></a>
|
||||
</li></ul>
|
||||
@@ -587,7 +587,7 @@ it to a local variable in the function scope is unnecessary.
|
||||
</div>
|
||||
<div id="foot">
|
||||
<hr class="hide">
|
||||
Copyright © 2005-2022
|
||||
Copyright © 2005-2023
|
||||
<span class="noprint">
|
||||
·
|
||||
<a href="contact.html">Contact</a>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<title>jit.* Library</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2022">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2023">
|
||||
<meta name="Language" content="en">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
|
||||
@@ -46,9 +46,9 @@
|
||||
<a href="ext_profiler.html">Profiler</a>
|
||||
</li></ul>
|
||||
</li><li>
|
||||
<a href="status.html">Status</a>
|
||||
<a href="https://luajit.org/status.html">Status <span class="ext">»</span></a>
|
||||
</li><li>
|
||||
<a href="faq.html">FAQ</a>
|
||||
<a href="https://luajit.org/faq.html">FAQ <span class="ext">»</span></a>
|
||||
</li><li>
|
||||
<a href="https://luajit.org/list.html">Mailing List <span class="ext">»</span></a>
|
||||
</li></ul>
|
||||
@@ -135,7 +135,9 @@ Contains the LuaJIT version string.
|
||||
<h3 id="jit_version_num"><tt>jit.version_num</tt></h3>
|
||||
<p>
|
||||
Contains the version number of the LuaJIT core. Version xx.yy.zz
|
||||
is represented by the decimal number xxyyzz.
|
||||
is represented by the decimal number xxyyzz.<br>
|
||||
<b>DEPRECATED after the switch to
|
||||
<a href="https://luajit.org/status.html#release"><span class="ext">»</span> rolling releases</a>. zz is frozen at 99.</b>
|
||||
</p>
|
||||
|
||||
<h3 id="jit_os"><tt>jit.os</tt></h3>
|
||||
@@ -185,7 +187,7 @@ if you want to know more.
|
||||
</div>
|
||||
<div id="foot">
|
||||
<hr class="hide">
|
||||
Copyright © 2005-2022
|
||||
Copyright © 2005-2023
|
||||
<span class="noprint">
|
||||
·
|
||||
<a href="contact.html">Contact</a>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<title>Profiler</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2022">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2023">
|
||||
<meta name="Language" content="en">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
|
||||
@@ -46,9 +46,9 @@
|
||||
<a class="current" href="ext_profiler.html">Profiler</a>
|
||||
</li></ul>
|
||||
</li><li>
|
||||
<a href="status.html">Status</a>
|
||||
<a href="https://luajit.org/status.html">Status <span class="ext">»</span></a>
|
||||
</li><li>
|
||||
<a href="faq.html">FAQ</a>
|
||||
<a href="https://luajit.org/faq.html">FAQ <span class="ext">»</span></a>
|
||||
</li><li>
|
||||
<a href="https://luajit.org/list.html">Mailing List <span class="ext">»</span></a>
|
||||
</li></ul>
|
||||
@@ -349,7 +349,7 @@ use.
|
||||
</div>
|
||||
<div id="foot">
|
||||
<hr class="hide">
|
||||
Copyright © 2005-2022
|
||||
Copyright © 2005-2023
|
||||
<span class="noprint">
|
||||
·
|
||||
<a href="contact.html">Contact</a>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<title>Extensions</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2022">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2023">
|
||||
<meta name="Language" content="en">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
|
||||
@@ -63,14 +63,15 @@ td.excinterop {
|
||||
<a href="ext_profiler.html">Profiler</a>
|
||||
</li></ul>
|
||||
</li><li>
|
||||
<a href="status.html">Status</a>
|
||||
<a href="https://luajit.org/status.html">Status <span class="ext">»</span></a>
|
||||
</li><li>
|
||||
<a href="faq.html">FAQ</a>
|
||||
<a href="https://luajit.org/faq.html">FAQ <span class="ext">»</span></a>
|
||||
</li><li>
|
||||
<a href="https://luajit.org/list.html">Mailing List <span class="ext">»</span></a>
|
||||
</li></ul>
|
||||
</div>
|
||||
<div id="main">
|
||||
|
||||
<p>
|
||||
LuaJIT is fully upwards-compatible with Lua 5.1. It supports all
|
||||
<a href="https://www.lua.org/manual/5.1/manual.html#5"><span class="ext">»</span> standard Lua
|
||||
@@ -462,7 +463,7 @@ C++ destructors.</li>
|
||||
</div>
|
||||
<div id="foot">
|
||||
<hr class="hide">
|
||||
Copyright © 2005-2022
|
||||
Copyright © 2005-2023
|
||||
<span class="noprint">
|
||||
·
|
||||
<a href="contact.html">Contact</a>
|
||||
|
||||
@@ -1,195 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Frequently Asked Questions (FAQ)</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2022">
|
||||
<meta name="Language" content="en">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
|
||||
<style type="text/css">
|
||||
dd { margin-left: 1.5em; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="site">
|
||||
<a href="https://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>
|
||||
</div>
|
||||
<div id="head">
|
||||
<h1>Frequently Asked Questions (FAQ)</h1>
|
||||
</div>
|
||||
<div id="nav">
|
||||
<ul><li>
|
||||
<a href="luajit.html">LuaJIT</a>
|
||||
<ul><li>
|
||||
<a href="https://luajit.org/download.html">Download <span class="ext">»</span></a>
|
||||
</li><li>
|
||||
<a href="install.html">Installation</a>
|
||||
</li><li>
|
||||
<a href="running.html">Running</a>
|
||||
</li></ul>
|
||||
</li><li>
|
||||
<a href="extensions.html">Extensions</a>
|
||||
<ul><li>
|
||||
<a href="ext_ffi.html">FFI Library</a>
|
||||
<ul><li>
|
||||
<a href="ext_ffi_tutorial.html">FFI Tutorial</a>
|
||||
</li><li>
|
||||
<a href="ext_ffi_api.html">ffi.* API</a>
|
||||
</li><li>
|
||||
<a href="ext_ffi_semantics.html">FFI Semantics</a>
|
||||
</li></ul>
|
||||
</li><li>
|
||||
<a href="ext_buffer.html">String Buffers</a>
|
||||
</li><li>
|
||||
<a href="ext_jit.html">jit.* Library</a>
|
||||
</li><li>
|
||||
<a href="ext_c_api.html">Lua/C API</a>
|
||||
</li><li>
|
||||
<a href="ext_profiler.html">Profiler</a>
|
||||
</li></ul>
|
||||
</li><li>
|
||||
<a href="status.html">Status</a>
|
||||
</li><li>
|
||||
<a class="current" href="faq.html">FAQ</a>
|
||||
</li><li>
|
||||
<a href="https://luajit.org/list.html">Mailing List <span class="ext">»</span></a>
|
||||
</li></ul>
|
||||
</div>
|
||||
<div id="main">
|
||||
<dl id="info">
|
||||
<dt>Q: Where can I learn more about LuaJIT and Lua?</dt>
|
||||
<dd>
|
||||
<ul style="padding: 0;">
|
||||
<li>The <a href="https://luajit.org/list.html"><span class="ext">»</span> LuaJIT mailing list</a> focuses on topics
|
||||
related to LuaJIT.</li>
|
||||
<li>News about Lua itself can be found at the
|
||||
<a href="https://www.lua.org/lua-l.html"><span class="ext">»</span> Lua mailing list</a>.
|
||||
The mailing list archives are worth checking out for older postings
|
||||
about LuaJIT.</li>
|
||||
<li>The <a href="https://lua.org"><span class="ext">»</span> main Lua.org site</a> has complete
|
||||
<a href="https://www.lua.org/docs.html"><span class="ext">»</span> documentation</a> of the language
|
||||
and links to books and papers about Lua.</li>
|
||||
<li>The community-managed <a href="http://lua-users.org/wiki/"><span class="ext">»</span> Lua Wiki</a>
|
||||
has information about diverse topics.</li>
|
||||
</ul></dd>
|
||||
</dl>
|
||||
|
||||
<dl id="tech">
|
||||
<dt>Q: Where can I learn more about the compiler technology used by LuaJIT?</dt>
|
||||
<dd>
|
||||
Please use the following Google Scholar searches to find relevant papers:<br>
|
||||
Search for: <a href="https://scholar.google.com/scholar?q=Trace+Compiler"><span class="ext">»</span> Trace Compiler</a><br>
|
||||
Search for: <a href="https://scholar.google.com/scholar?q=JIT+Compiler"><span class="ext">»</span> JIT Compiler</a><br>
|
||||
Search for: <a href="https://scholar.google.com/scholar?q=Dynamic+Language+Optimizations"><span class="ext">»</span> Dynamic Language Optimizations</a><br>
|
||||
Search for: <a href="https://scholar.google.com/scholar?q=SSA+Form"><span class="ext">»</span> SSA Form</a><br>
|
||||
Search for: <a href="https://scholar.google.com/scholar?q=Linear+Scan+Register+Allocation"><span class="ext">»</span> Linear Scan Register Allocation</a><br>
|
||||
Here is a list of the <a href="http://lua-users.org/lists/lua-l/2009-11/msg00089.html"><span class="ext">»</span> innovative features in LuaJIT</a>.<br>
|
||||
And, you know, reading the source is of course the only way to enlightenment.
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
<dl id="arg">
|
||||
<dt>Q: Why do I get this error: "attempt to index global 'arg' (a nil value)"?<br>
|
||||
Q: My vararg functions fail after switching to LuaJIT!</dt>
|
||||
<dd>LuaJIT is compatible to the Lua 5.1 language standard. It doesn't
|
||||
support the implicit <tt>arg</tt> parameter for old-style vararg
|
||||
functions from Lua 5.0.<br>Please convert your code to the
|
||||
<a href="https://www.lua.org/manual/5.1/manual.html#2.5.9"><span class="ext">»</span> Lua 5.1
|
||||
vararg syntax</a>.</dd>
|
||||
</dl>
|
||||
|
||||
<dl id="x87">
|
||||
<dt>Q: Why do I get this error: "bad FPU precision"?<br>
|
||||
<dt>Q: I get weird behavior after initializing Direct3D.<br>
|
||||
<dt>Q: Some FPU operations crash after I load a Delphi DLL.<br>
|
||||
</dt>
|
||||
<dd>
|
||||
|
||||
DirectX/Direct3D (up to version 9) sets the x87 FPU to single-precision
|
||||
mode by default. This violates the Windows ABI and interferes with the
|
||||
operation of many programs — LuaJIT is affected, too. Please make
|
||||
sure you always use the <tt>D3DCREATE_FPU_PRESERVE</tt> flag when
|
||||
initializing Direct3D.<br>
|
||||
|
||||
Direct3D version 10 or higher do not show this behavior anymore.
|
||||
Consider testing your application with older versions, too.<br>
|
||||
|
||||
Similarly, the Borland/Delphi runtime modifies the FPU control word and
|
||||
enables FP exceptions. Of course, this violates the Windows ABI, too.
|
||||
Please check the Delphi docs for the Set8087CW method.</dd>
|
||||
</dl>
|
||||
|
||||
<dl id="ctrlc">
|
||||
<dt>Q: Sometimes Ctrl-C fails to stop my Lua program. Why?</dt>
|
||||
<dd>The interrupt signal handler sets a Lua debug hook. But this is
|
||||
ignored by compiled code. If your program is running in a tight loop
|
||||
and never falls back to the interpreter, the debug hook never runs and
|
||||
can't throw the "interrupted!" error.<br>
|
||||
You have to press Ctrl-C twice to stop your program. That's similar
|
||||
to when it's stuck running inside a C function under the Lua interpreter.</dd>
|
||||
</dl>
|
||||
|
||||
<dl id="order">
|
||||
<dt>Q: Table iteration with <tt>pairs()</tt> does not result in the same order?</dt>
|
||||
<dd>The order of table iteration is explicitly <b>undefined</b> by
|
||||
the Lua language standard.<br>
|
||||
Different Lua implementations or versions may use different orders for
|
||||
otherwise identical tables. Different ways of constructing a table may
|
||||
result in different orders, too.<br>
|
||||
Due to improved VM security, LuaJIT 2.1 may even use a different order
|
||||
on separate VM invocations or when string keys are newly interned.<br><br>
|
||||
If your program relies on a deterministic order, it has a bug. Rewrite it,
|
||||
so it doesn't rely on the key order. Or sort the table keys, if you must.</dd>
|
||||
</dl>
|
||||
|
||||
<dl id="sandbox">
|
||||
<dt>Q: Can Lua code be safely sandboxed?</dt>
|
||||
<dd>
|
||||
Maybe for an extremely restricted subset of Lua and if you relentlessly
|
||||
scrutinize every single interface function you offer to the untrusted code.<br>
|
||||
|
||||
Although Lua provides some sandboxing functionality (<tt>setfenv()</tt>, hooks),
|
||||
it's very hard to get this right even for the Lua core libraries. Of course,
|
||||
you'll need to inspect any extension library, too. And there are libraries
|
||||
that are inherently unsafe, e.g. the <a href="ext_ffi.html">FFI library</a>.<br>
|
||||
|
||||
More reading material at the <a href="http://lua-users.org/wiki/SandBoxes"><span class="ext">»</span> Lua Wiki</a> and <a href="https://en.wikipedia.org/wiki/Sandbox_(computer_security)"><span class="ext">»</span> Wikipedia</a>.<br><br>
|
||||
|
||||
Relatedly, <b>loading untrusted bytecode is not safe!</b><br>
|
||||
|
||||
It's trivial to crash the Lua or LuaJIT VM with maliciously crafted bytecode.
|
||||
This is well known and there's no bytecode verification on purpose, so please
|
||||
don't report a bug about it. Check the <tt>mode</tt> parameter for the
|
||||
<tt>load*()</tt> functions to disable loading of bytecode.<br><br>
|
||||
|
||||
<b>In general, the only promising approach is to sandbox Lua code at the
|
||||
process level and not the VM level.</b>
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
<dl id="arch">
|
||||
<dt>Q: Lua runs everywhere. Why doesn't LuaJIT support my CPU?</dt>
|
||||
<dd>Because it's a compiler — it needs to generate native
|
||||
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.<br>
|
||||
The <a href="install.html">install documentation</a> shows the supported
|
||||
architectures.<br>
|
||||
Other architectures may follow based on sufficient user demand and
|
||||
market-relevance of the architecture. Sponsoring is required to develop
|
||||
the port itself, to integrate it and to continuously maintain it in the
|
||||
actively developed branches.</dd>
|
||||
</dl>
|
||||
<br class="flush">
|
||||
</div>
|
||||
<div id="foot">
|
||||
<hr class="hide">
|
||||
Copyright © 2005-2022
|
||||
<span class="noprint">
|
||||
·
|
||||
<a href="contact.html">Contact</a>
|
||||
</span>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
+24
-222
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<title>Installation</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2022">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2023">
|
||||
<meta name="Language" content="en">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
|
||||
@@ -20,7 +20,7 @@ table.compat tr.compathead td {
|
||||
font-weight: bold;
|
||||
border-bottom: 2px solid #bfcfff;
|
||||
}
|
||||
td.compatname, td.compatver {
|
||||
td.compatname {
|
||||
width: 10%;
|
||||
}
|
||||
td.compatbits {
|
||||
@@ -69,18 +69,18 @@ td.compatx {
|
||||
<a href="ext_profiler.html">Profiler</a>
|
||||
</li></ul>
|
||||
</li><li>
|
||||
<a href="status.html">Status</a>
|
||||
<a href="https://luajit.org/status.html">Status <span class="ext">»</span></a>
|
||||
</li><li>
|
||||
<a href="faq.html">FAQ</a>
|
||||
<a href="https://luajit.org/faq.html">FAQ <span class="ext">»</span></a>
|
||||
</li><li>
|
||||
<a href="https://luajit.org/list.html">Mailing List <span class="ext">»</span></a>
|
||||
</li></ul>
|
||||
</div>
|
||||
<div id="main">
|
||||
<p>
|
||||
LuaJIT is only distributed as a source package. This page explains
|
||||
how to build and install LuaJIT with different operating systems
|
||||
and C compilers.
|
||||
LuaJIT is only distributed as source code — get it from the
|
||||
<a href="https://luajit.org/download.html"><span class="ext">»</span> git repository</a>. This page explains how to build
|
||||
and install the LuaJIT binary and library for different operating systems.
|
||||
</p>
|
||||
<p>
|
||||
For the impatient (on POSIX systems):
|
||||
@@ -90,201 +90,21 @@ make && sudo make install
|
||||
</pre>
|
||||
|
||||
<h2 id="req">Requirements</h2>
|
||||
<h3 id="systems">Systems</h3>
|
||||
<p>
|
||||
LuaJIT currently builds out-of-the box on most systems:
|
||||
LuaJIT currently builds out-of-the box on most systems. Please check the
|
||||
supported operating systems and CPU architectures on the
|
||||
<a href="https://luajit.org/status.html"><span class="ext">»</span> status page</a>.
|
||||
</p>
|
||||
<table class="compat">
|
||||
<tr class="compathead">
|
||||
<td class="compatname">OS</td>
|
||||
<td class="compatver">Min. Version</td>
|
||||
<td class="compatx">Requirements</td>
|
||||
<td class="compatx">LuaJIT Versions</td>
|
||||
</tr>
|
||||
<tr class="odd separate">
|
||||
<td class="compatname"><a href="#windows">Windows</a></td>
|
||||
<td class="compatver">7</td>
|
||||
<td class="compatx">x86 or x64, ARM64: TBA</td>
|
||||
<td class="compatx">v2.0 –</td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td class="compatname"><a href="#posix">Linux</a></td>
|
||||
<td class="compatver"> </td>
|
||||
<td class="compatx"> </td>
|
||||
<td class="compatx">v2.0 –</td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<td class="compatname"><a href="#posix">*BSD</a></td>
|
||||
<td class="compatver"> </td>
|
||||
<td class="compatx"> </td>
|
||||
<td class="compatx">v2.0 –</td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td class="compatname"><a href="#posix">macOS (OSX)</a></td>
|
||||
<td class="compatver">10.4</td>
|
||||
<td class="compatx"> </td>
|
||||
<td class="compatx">v2.1 –</td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<td class="compatname"><a href="#posix">POSIX</a></td>
|
||||
<td class="compatver"> </td>
|
||||
<td class="compatx">mmap, dlopen</td>
|
||||
<td class="compatx">v2.0 –</td>
|
||||
</tr>
|
||||
<tr class="even separate">
|
||||
<td class="compatname"><a href="#android">Android</a></td>
|
||||
<td class="compatver">4.0</td>
|
||||
<td class="compatx">Recent Android NDK</td>
|
||||
<td class="compatx">v2.0 –</td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<td class="compatname"><a href="#ios">iOS</a></td>
|
||||
<td class="compatver">3.0</td>
|
||||
<td class="compatx">Xcode iOS SDK</td>
|
||||
<td class="compatx">v2.1 –</td>
|
||||
</tr>
|
||||
<tr class="even separate">
|
||||
<td class="compatname"><a href="#consoles">PS3</a></td>
|
||||
<td class="compatver"> </td>
|
||||
<td class="compatx">PS3 SDK</td>
|
||||
<td class="compatx">v2.0 – v2.1 EOL</td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<td class="compatname"><a href="#consoles">PS4</a></td>
|
||||
<td class="compatver"> </td>
|
||||
<td class="compatx">PS4 SDK (ORBIS)</td>
|
||||
<td class="compatx">v2.0 –</td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td class="compatname"><a href="#consoles">PS5</a></td>
|
||||
<td class="compatver"> </td>
|
||||
<td class="compatx">PS5 SDK (PROSPERO)</td>
|
||||
<td class="compatx">v2.1 –</td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<td class="compatname"><a href="#consoles">PS Vita</a></td>
|
||||
<td class="compatver"> </td>
|
||||
<td class="compatx">PS Vita SDK (PSP2)</td>
|
||||
<td class="compatx">v2.0 – v2.1 EOL</td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td class="compatname"><a href="#consoles">Xbox 360</a></td>
|
||||
<td class="compatver"> </td>
|
||||
<td class="compatx">Xbox 360 SDK (XEDK)</td>
|
||||
<td class="compatx">v2.0 – v2.1 EOL</td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<td class="compatname"><a href="#consoles">Xbox One</a></td>
|
||||
<td class="compatver"> </td>
|
||||
<td class="compatx">Xbox One SDK (DURANGO)</td>
|
||||
<td class="compatx">v2.1 –</td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td class="compatname"><a href="#consoles">Nintendo Switch</a></td>
|
||||
<td class="compatver"> </td>
|
||||
<td class="compatx">NintendoSDK + NX Addon</td>
|
||||
<td class="compatx">v2.1 –</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p>
|
||||
The codebase has compatibility defines for some more systems, but
|
||||
without official support.
|
||||
</p>
|
||||
<h3 id="toolchains">Toolchains</h3>
|
||||
<p>
|
||||
Building LuaJIT requires a recent toolchain based on GCC, Clang/LLVM or
|
||||
MSVC++.
|
||||
</p>
|
||||
<p>
|
||||
The Makefile-based build system requires GNU Make and supports
|
||||
cross-builds. Batch files are provided for MSVC++ builds and console
|
||||
cross-builds.
|
||||
</p>
|
||||
<h3 id="architectures">CPU Architectures</h3>
|
||||
<table class="compat">
|
||||
<tr class="compathead">
|
||||
<td class="compatname">CPU</td>
|
||||
<td class="compatbits">Bits</td>
|
||||
<td class="compatx">Requirements</td>
|
||||
<td class="compatx">Variants</td>
|
||||
<td class="compatx">LuaJIT Versions</td>
|
||||
</tr>
|
||||
<tr class="odd separate">
|
||||
<td class="compatname">x86</td>
|
||||
<td class="compatbits">32</td>
|
||||
<td class="compatx">v2.1+: SSE2</td>
|
||||
<td class="compatx"> </td>
|
||||
<td class="compatx">v2.0 –</td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td class="compatname">x64</td>
|
||||
<td class="compatbits">64</td>
|
||||
<td class="compatx"> </td>
|
||||
<td class="compatx"> </td>
|
||||
<td class="compatx">v2.0 –</td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<td class="compatname">ARM</td>
|
||||
<td class="compatbits">32</td>
|
||||
<td class="compatx">ARMv5+, ARM9E+</td>
|
||||
<td class="compatx">hard-fp + soft-fp</td>
|
||||
<td class="compatx">v2.0 –</td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td class="compatname">ARM64</td>
|
||||
<td class="compatbits">64</td>
|
||||
<td class="compatx"> </td>
|
||||
<td class="compatx">ARM64le + ARM64be</td>
|
||||
<td class="compatx">v2.1 –</td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<td class="compatname">PPC32</td>
|
||||
<td class="compatbits">32</td>
|
||||
<td class="compatx"> </td>
|
||||
<td class="compatx">hard-fp + soft-fp</td>
|
||||
<td class="compatx">v2.0 – v2.1 EOL</td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td class="compatname">PPC/e500</td>
|
||||
<td class="compatbits">32</td>
|
||||
<td class="compatx">e500v2</td>
|
||||
<td class="compatx"> </td>
|
||||
<td class="compatx">v2.0 EOL</td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<td class="compatname">MIPS32</td>
|
||||
<td class="compatbits">32</td>
|
||||
<td class="compatx">MIPS32r1 – r5</td>
|
||||
<td class="compatx">hard-fp + soft-fp</td>
|
||||
<td class="compatx">v2.0 –</td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td class="compatname">MIPS64</td>
|
||||
<td class="compatbits">64</td>
|
||||
<td class="compatx">MIPS64r1 – r5</td>
|
||||
<td class="compatx">hard-fp + soft-fp</td>
|
||||
<td class="compatx">v2.1 –</td>
|
||||
</tr>
|
||||
<tr class="odd">
|
||||
<td class="compatname">MIPS64</td>
|
||||
<td class="compatbits">64</td>
|
||||
<td class="compatx">MIPS64r6</td>
|
||||
<td class="compatx">hard-fp + soft-fp</td>
|
||||
<td class="compatx">v2.1 EOL</td>
|
||||
</tr>
|
||||
<tr class="even">
|
||||
<td class="compatname">RISC-V</td>
|
||||
<td class="compatbits">64</td>
|
||||
<td class="compatx">RVA22+</td>
|
||||
<td class="compatx"> </td>
|
||||
<td class="compatx">TBA</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p>
|
||||
There are no plans to add historic architectures or to continue support
|
||||
for end-of-life (EOL) architectures, for which no new CPUs are commonly
|
||||
available anymore. Likewise, there are no plans to support marginal
|
||||
and/or de-facto-dead architectures.
|
||||
Batch files are provided for MSVC++ builds and console cross-builds.
|
||||
</p>
|
||||
|
||||
<h2>Configuring LuaJIT</h2>
|
||||
@@ -294,7 +114,6 @@ Usually there is no need to tweak the settings. The following files
|
||||
hold all user-configurable settings:
|
||||
</p>
|
||||
<ul>
|
||||
<li><tt>src/luaconf.h</tt> sets some configuration variables.</li>
|
||||
<li><tt>Makefile</tt> has settings for <b>installing</b> LuaJIT (POSIX
|
||||
only).</li>
|
||||
<li><tt>src/Makefile</tt> has settings for <b>compiling</b> LuaJIT
|
||||
@@ -317,23 +136,11 @@ Please check the note about the
|
||||
<h2 id="posix">POSIX Systems (Linux, macOS, *BSD etc.)</h2>
|
||||
<h3>Prerequisites</h3>
|
||||
<p>
|
||||
Depending on your distribution, you may need to install a package for
|
||||
GCC, the development headers and/or a complete SDK. E.g. on a current
|
||||
Debian/Ubuntu, install <tt>libc6-dev</tt> with the package manager.
|
||||
Depending on your distribution, you may need to install a package for a
|
||||
compiler (GCC or Clang/LLVM), the development headers and/or a complete SDK.
|
||||
E.g. on a current Debian/Ubuntu, install <tt>build-essential</tt> with the
|
||||
package manager.
|
||||
</p>
|
||||
<p>
|
||||
The recommended way to fetch the latest version is to do a pull from
|
||||
the git repository.
|
||||
</p>
|
||||
<p>
|
||||
Alternatively, download the latest source package of LuaJIT (pick the .tar.gz).
|
||||
Move it to a directory of your choice, open a terminal window and change
|
||||
to this directory. Now unpack the archive and change to the newly created
|
||||
directory (replace XX.YY.ZZ with the version you downloaded):
|
||||
</p>
|
||||
<pre class="code">
|
||||
tar zxf LuaJIT-XX.YY.ZZ.tar.gz
|
||||
cd LuaJIT-XX.YY.ZZ
|
||||
</pre>
|
||||
<h3>Building LuaJIT</h3>
|
||||
<p>
|
||||
@@ -394,15 +201,10 @@ Either install one of the open source SDKs
|
||||
GCC plus the required development headers.
|
||||
Or install Microsoft's Visual Studio (MSVC).
|
||||
</p>
|
||||
<p>
|
||||
Next, pull from the git repository or download the source package and
|
||||
unpack it using an archive manager (e.g. the Windows Explorer) to
|
||||
a directory of your choice.
|
||||
</p>
|
||||
<h3>Building with MSVC</h3>
|
||||
<p>
|
||||
Open a "Visual Studio Command Prompt" (either x86 or x64), <tt>cd</tt> to the
|
||||
directory where you've unpacked the sources and run these commands:
|
||||
directory with the source code and run these commands:
|
||||
</p>
|
||||
<pre class="code">
|
||||
cd src
|
||||
@@ -415,8 +217,8 @@ Then follow the installation instructions below.
|
||||
<h3>Building with MinGW or Cygwin</h3>
|
||||
<p>
|
||||
Open a command prompt window and make sure the MinGW or Cygwin programs
|
||||
are in your path. Then <tt>cd</tt> to the directory of the git repository
|
||||
or where you've unpacked the sources. Then run this command for MinGW:
|
||||
are in your path. Then <tt>cd</tt> to the directory of the git repository.
|
||||
Then run this command for MinGW:
|
||||
</p>
|
||||
<pre class="code">
|
||||
mingw32-make
|
||||
@@ -518,15 +320,15 @@ make HOST_CC="gcc -m32" CROSS=arm-linux-gnueabi- \
|
||||
make HOST_CC="gcc -m32" CROSS=arm-linux-gnueabihf-
|
||||
|
||||
# ARM64
|
||||
make CROSS=aarch64-linux-
|
||||
make CROSS=aarch64-linux-gnu-
|
||||
|
||||
# PPC
|
||||
make HOST_CC="gcc -m32" CROSS=powerpc-linux-gnu-
|
||||
|
||||
# MIPS32 big-endian
|
||||
make HOST_CC="gcc -m32" CROSS=mips-linux-
|
||||
make HOST_CC="gcc -m32" CROSS=mips-linux-gnu-
|
||||
# MIPS32 little-endian
|
||||
make HOST_CC="gcc -m32" CROSS=mipsel-linux-
|
||||
make HOST_CC="gcc -m32" CROSS=mipsel-linux-gnu-
|
||||
|
||||
# MIPS64 big-endian
|
||||
make CROSS=mips-linux- TARGET_CFLAGS="-mips64r2 -mabi=64"
|
||||
@@ -605,8 +407,8 @@ make HOST_CC="gcc -m32" CROSS=ppu-lv2-
|
||||
To cross-compile for the other consoles from a Windows host, open a
|
||||
"Native Tools Command Prompt for VS". You need to choose either the 32
|
||||
or the 64 bit version of the host compiler to match the target.
|
||||
Then <tt>cd</tt> to the <tt>src</tt> directory below where you've
|
||||
unpacked the sources and run the build command given in the table:
|
||||
Then <tt>cd</tt> to the <tt>src</tt> directory below the source code
|
||||
and run the build command given in the table:
|
||||
</p>
|
||||
<table class="compat">
|
||||
<tr class="compathead">
|
||||
@@ -766,7 +568,7 @@ to me (the upstream) and not you (the package maintainer), anyway.
|
||||
</div>
|
||||
<div id="foot">
|
||||
<hr class="hide">
|
||||
Copyright © 2005-2022
|
||||
Copyright © 2005-2023
|
||||
<span class="noprint">
|
||||
·
|
||||
<a href="contact.html">Contact</a>
|
||||
|
||||
+16
-43
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<title>LuaJIT</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2022">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2023">
|
||||
<meta name="Language" content="en">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
|
||||
@@ -67,30 +67,6 @@ table.fcompat td {
|
||||
background-image: -o-linear-gradient(#41bfbf 10%, #b0ffff 95%);
|
||||
background-image: -ms-linear-gradient(#41bfbf 10%, #b0ffff 95%);
|
||||
}
|
||||
table.stats td {
|
||||
color: #ffffff;
|
||||
background: #a0a0a0;
|
||||
background-image: linear-gradient(#808080 10%, #d0d0d0 95%);
|
||||
background-image: -moz-linear-gradient(#808080 10%, #d0d0d0 95%);
|
||||
background-image: -webkit-linear-gradient(#808080 10%, #d0d0d0 95%);
|
||||
background-image: -o-linear-gradient(#808080 10%, #d0d0d0 95%);
|
||||
background-image: -ms-linear-gradient(#808080 10%, #d0d0d0 95%);
|
||||
}
|
||||
table.stats td.speed {
|
||||
color: #ff4020;
|
||||
}
|
||||
table.stats td.kb {
|
||||
color: #ffff80;
|
||||
background: #808080;
|
||||
background-image: linear-gradient(#606060 10%, #c0c0c0 95%);
|
||||
background-image: -moz-linear-gradient(#606060 10%, #c0c0c0 95%);
|
||||
background-image: -webkit-linear-gradient(#606060 10%, #c0c0c0 95%);
|
||||
background-image: -o-linear-gradient(#606060 10%, #c0c0c0 95%);
|
||||
background-image: -ms-linear-gradient(#606060 10%, #c0c0c0 95%);
|
||||
}
|
||||
table.feature small {
|
||||
font-size: 50%;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
@@ -131,9 +107,9 @@ table.feature small {
|
||||
<a href="ext_profiler.html">Profiler</a>
|
||||
</li></ul>
|
||||
</li><li>
|
||||
<a href="status.html">Status</a>
|
||||
<a href="https://luajit.org/status.html">Status <span class="ext">»</span></a>
|
||||
</li><li>
|
||||
<a href="faq.html">FAQ</a>
|
||||
<a href="https://luajit.org/faq.html">FAQ <span class="ext">»</span></a>
|
||||
</li><li>
|
||||
<a href="https://luajit.org/list.html">Mailing List <span class="ext">»</span></a>
|
||||
</li></ul>
|
||||
@@ -146,7 +122,7 @@ Lua is a powerful, dynamic and light-weight programming language.
|
||||
It may be embedded or used as a general-purpose, stand-alone language.
|
||||
</p>
|
||||
<p>
|
||||
LuaJIT is Copyright © 2005-2022 Mike Pall, released under the
|
||||
LuaJIT is Copyright © 2005-2023 Mike Pall, released under the
|
||||
<a href="https://www.opensource.org/licenses/mit-license.php"><span class="ext">»</span> MIT open source license</a>.
|
||||
</p>
|
||||
<p>
|
||||
@@ -173,23 +149,20 @@ LuaJIT is Copyright © 2005-2022 Mike Pall, released under the
|
||||
</table>
|
||||
|
||||
<h2>Overview</h2>
|
||||
<table class="feature stats">
|
||||
<tr>
|
||||
<td class="speed">3x<br>- 100x</td>
|
||||
<td class="kb">115 <small>KB</small><br>VM</td>
|
||||
<td class="kb">90 <small>KB</small><br>JIT</td>
|
||||
<td class="kloc">63 <small>KLOC</small><br>C</td>
|
||||
<td class="kloc">24 <small>KLOC</small><br>ASM</td>
|
||||
<td class="kloc">11 <small>KLOC</small><br>Lua</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p style="margin-top: 1em;">
|
||||
LuaJIT has been successfully used as a <b>scripting middleware</b> in
|
||||
games, appliances, network and graphics apps, numerical simulations,
|
||||
trading platforms and many other specialty applications. It scales from
|
||||
embedded devices, smartphones, desktops up to server farms. It combines
|
||||
high flexibility with high performance
|
||||
and an unmatched <b>low memory footprint</b>.
|
||||
trading platforms and many other specialty applications.
|
||||
</p>
|
||||
<p>
|
||||
LuaJIT is part of a hundred million web sites, huge SaaS installations,
|
||||
network switches, set-top boxes and other embedded devices. You've probably
|
||||
already used LuaJIT without knowing about it.
|
||||
</p>
|
||||
<p>
|
||||
LuaJIT scales from embedded devices, smartphones, desktops up to server
|
||||
farms. It combines high flexibility with high performance and an unmatched
|
||||
<b>low memory footprint</b>.
|
||||
</p>
|
||||
<p>
|
||||
LuaJIT has been in continuous development since 2005. It's widely
|
||||
@@ -220,7 +193,7 @@ Please select a sub-topic in the navigation bar to learn more about LuaJIT.
|
||||
</div>
|
||||
<div id="foot">
|
||||
<hr class="hide">
|
||||
Copyright © 2005-2022
|
||||
Copyright © 2005-2023
|
||||
<span class="noprint">
|
||||
·
|
||||
<a href="contact.html">Contact</a>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<title>Running LuaJIT</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2022">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2023">
|
||||
<meta name="Language" content="en">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
|
||||
@@ -68,14 +68,15 @@ td.param_default {
|
||||
<a href="ext_profiler.html">Profiler</a>
|
||||
</li></ul>
|
||||
</li><li>
|
||||
<a href="status.html">Status</a>
|
||||
<a href="https://luajit.org/status.html">Status <span class="ext">»</span></a>
|
||||
</li><li>
|
||||
<a href="faq.html">FAQ</a>
|
||||
<a href="https://luajit.org/faq.html">FAQ <span class="ext">»</span></a>
|
||||
</li><li>
|
||||
<a href="https://luajit.org/list.html">Mailing List <span class="ext">»</span></a>
|
||||
</li></ul>
|
||||
</div>
|
||||
<div id="main">
|
||||
|
||||
<p>
|
||||
LuaJIT has only a single stand-alone executable, called <tt>luajit</tt> on
|
||||
POSIX systems or <tt>luajit.exe</tt> on Windows. It can be used to run simple
|
||||
@@ -302,7 +303,7 @@ Here are the parameters and their default settings:
|
||||
</div>
|
||||
<div id="foot">
|
||||
<hr class="hide">
|
||||
Copyright © 2005-2022
|
||||
Copyright © 2005-2023
|
||||
<span class="noprint">
|
||||
·
|
||||
<a href="contact.html">Contact</a>
|
||||
|
||||
@@ -1,105 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Status</title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="Copyright" content="Copyright (C) 2005-2022">
|
||||
<meta name="Language" content="en">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
|
||||
<link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
|
||||
<style type="text/css">
|
||||
ul li { padding-bottom: 0.3em; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="site">
|
||||
<a href="https://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>
|
||||
</div>
|
||||
<div id="head">
|
||||
<h1>Status</h1>
|
||||
</div>
|
||||
<div id="nav">
|
||||
<ul><li>
|
||||
<a href="luajit.html">LuaJIT</a>
|
||||
<ul><li>
|
||||
<a href="https://luajit.org/download.html">Download <span class="ext">»</span></a>
|
||||
</li><li>
|
||||
<a href="install.html">Installation</a>
|
||||
</li><li>
|
||||
<a href="running.html">Running</a>
|
||||
</li></ul>
|
||||
</li><li>
|
||||
<a href="extensions.html">Extensions</a>
|
||||
<ul><li>
|
||||
<a href="ext_ffi.html">FFI Library</a>
|
||||
<ul><li>
|
||||
<a href="ext_ffi_tutorial.html">FFI Tutorial</a>
|
||||
</li><li>
|
||||
<a href="ext_ffi_api.html">ffi.* API</a>
|
||||
</li><li>
|
||||
<a href="ext_ffi_semantics.html">FFI Semantics</a>
|
||||
</li></ul>
|
||||
</li><li>
|
||||
<a href="ext_buffer.html">String Buffers</a>
|
||||
</li><li>
|
||||
<a href="ext_jit.html">jit.* Library</a>
|
||||
</li><li>
|
||||
<a href="ext_c_api.html">Lua/C API</a>
|
||||
</li><li>
|
||||
<a href="ext_profiler.html">Profiler</a>
|
||||
</li></ul>
|
||||
</li><li>
|
||||
<a class="current" href="status.html">Status</a>
|
||||
</li><li>
|
||||
<a href="faq.html">FAQ</a>
|
||||
</li><li>
|
||||
<a href="https://luajit.org/list.html">Mailing List <span class="ext">»</span></a>
|
||||
</li></ul>
|
||||
</div>
|
||||
<div id="main">
|
||||
<p>
|
||||
This documentation is for LuaJIT 2.1.0-beta3. Please check the <tt>doc</tt>
|
||||
directory in each git branch for the version-specific documentation.
|
||||
</p>
|
||||
<p>
|
||||
The currently developed branches are LuaJIT 2.1 and LuaJIT 2.0.
|
||||
</p>
|
||||
<p>
|
||||
LuaJIT 2.0 is in feature-freeze — new features will only
|
||||
be added to LuaJIT 2.1.
|
||||
</p>
|
||||
|
||||
<h2>Current Status</h2>
|
||||
<p>
|
||||
LuaJIT ought to run all Lua 5.1-compatible source code just fine.
|
||||
It's considered a serious bug if the VM crashes or produces unexpected
|
||||
results — please report this.
|
||||
</p>
|
||||
<p>
|
||||
Known incompatibilities and issues in LuaJIT 2.0:
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
There are some differences in <b>implementation-defined</b> behavior.
|
||||
These either have a good reason, are arbitrary design choices,
|
||||
or are due to quirks in the VM. The latter cases may get fixed if a
|
||||
demonstrable need is shown.
|
||||
</li>
|
||||
<li>
|
||||
The Lua <b>debug API</b> is missing a couple of features (return
|
||||
hooks for non-Lua functions) and shows slightly different behavior
|
||||
in LuaJIT (no per-coroutine hooks, no tail call counting).
|
||||
</li>
|
||||
</ul>
|
||||
<br class="flush">
|
||||
</div>
|
||||
<div id="foot">
|
||||
<hr class="hide">
|
||||
Copyright © 2005-2022
|
||||
<span class="noprint">
|
||||
·
|
||||
<a href="contact.html">Contact</a>
|
||||
</span>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** DynASM ARM encoding engine.
|
||||
** Copyright (C) 2005-2022 Mike Pall. All rights reserved.
|
||||
** Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
** Released under the MIT license. See dynasm.lua for full copyright notice.
|
||||
*/
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
------------------------------------------------------------------------------
|
||||
-- DynASM ARM module.
|
||||
--
|
||||
-- Copyright (C) 2005-2022 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- See dynasm.lua for full copyright notice.
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** DynASM ARM64 encoding engine.
|
||||
** Copyright (C) 2005-2022 Mike Pall. All rights reserved.
|
||||
** Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
** Released under the MIT license. See dynasm.lua for full copyright notice.
|
||||
*/
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
------------------------------------------------------------------------------
|
||||
-- DynASM ARM64 module.
|
||||
--
|
||||
-- Copyright (C) 2005-2022 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- See dynasm.lua for full copyright notice.
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** DynASM MIPS encoding engine.
|
||||
** Copyright (C) 2005-2022 Mike Pall. All rights reserved.
|
||||
** Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
** Released under the MIT license. See dynasm.lua for full copyright notice.
|
||||
*/
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
------------------------------------------------------------------------------
|
||||
-- DynASM MIPS32/MIPS64 module.
|
||||
--
|
||||
-- Copyright (C) 2005-2022 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- See dynasm.lua for full copyright notice.
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
------------------------------------------------------------------------------
|
||||
-- DynASM MIPS64 module.
|
||||
--
|
||||
-- Copyright (C) 2005-2022 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- See dynasm.lua for full copyright notice.
|
||||
------------------------------------------------------------------------------
|
||||
-- This module just sets 64 bit mode for the combined MIPS/MIPS64 module.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** DynASM PPC/PPC64 encoding engine.
|
||||
** Copyright (C) 2005-2022 Mike Pall. All rights reserved.
|
||||
** Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
** Released under the MIT license. See dynasm.lua for full copyright notice.
|
||||
*/
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
------------------------------------------------------------------------------
|
||||
-- DynASM PPC/PPC64 module.
|
||||
--
|
||||
-- Copyright (C) 2005-2022 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- See dynasm.lua for full copyright notice.
|
||||
--
|
||||
-- Support for various extensions contributed by Caio Souza Oliveira.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** DynASM encoding engine prototypes.
|
||||
** Copyright (C) 2005-2022 Mike Pall. All rights reserved.
|
||||
** Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
** Released under the MIT license. See dynasm.lua for full copyright notice.
|
||||
*/
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
------------------------------------------------------------------------------
|
||||
-- DynASM x64 module.
|
||||
--
|
||||
-- Copyright (C) 2005-2022 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- See dynasm.lua for full copyright notice.
|
||||
------------------------------------------------------------------------------
|
||||
-- This module just sets 64 bit mode for the combined x86/x64 module.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** DynASM x86 encoding engine.
|
||||
** Copyright (C) 2005-2022 Mike Pall. All rights reserved.
|
||||
** Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
** Released under the MIT license. See dynasm.lua for full copyright notice.
|
||||
*/
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
------------------------------------------------------------------------------
|
||||
-- DynASM x86/x64 module.
|
||||
--
|
||||
-- Copyright (C) 2005-2022 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- See dynasm.lua for full copyright notice.
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
-- DynASM. A dynamic assembler for code generation engines.
|
||||
-- Originally designed and implemented for LuaJIT.
|
||||
--
|
||||
-- Copyright (C) 2005-2022 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- See below for full copyright notice.
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
@@ -17,7 +17,7 @@ local _info = {
|
||||
url = "https://luajit.org/dynasm.html",
|
||||
license = "MIT",
|
||||
copyright = [[
|
||||
Copyright (C) 2005-2022 Mike Pall. All rights reserved.
|
||||
Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
|
||||
@@ -74,7 +74,7 @@ luajit \-jv \-e "for i=1,10 do for j=1,10 do for k=1,100 do end end end"
|
||||
Runs some nested loops and shows the resulting traces.
|
||||
.SH COPYRIGHT
|
||||
.PP
|
||||
\fBLuaJIT\fR is Copyright \(co 2005-2022 Mike Pall.
|
||||
\fBLuaJIT\fR is Copyright \(co 2005-2023 Mike Pall.
|
||||
.br
|
||||
\fBLuaJIT\fR is open source software, released under the MIT license.
|
||||
.SH SEE ALSO
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# Package information for LuaJIT to be used by pkg-config.
|
||||
majver=2
|
||||
minver=1
|
||||
relver=0
|
||||
version=${majver}.${minver}.${relver}-beta3
|
||||
relver=ROLLING
|
||||
version=${majver}.${minver}.${relver}
|
||||
abiver=5.1
|
||||
|
||||
prefix=/usr/local
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
luajit
|
||||
luajit.h
|
||||
luajit_relver.txt
|
||||
lj_bcdef.h
|
||||
lj_ffdef.h
|
||||
lj_libdef.h
|
||||
|
||||
@@ -7,12 +7,11 @@
|
||||
# Also works with MinGW and Cygwin on Windows.
|
||||
# Please check msvcbuild.bat for building with MSVC on Windows.
|
||||
#
|
||||
# Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
# Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
##############################################################################
|
||||
|
||||
MAJVER= 2
|
||||
MINVER= 1
|
||||
RELVER= 0
|
||||
ABIVER= 5.1
|
||||
NODOTABIVER= 51
|
||||
|
||||
@@ -234,7 +233,7 @@ TARGET_ALDFLAGS= $(LDOPTIONS) $(TARGET_XLDFLAGS) $(TARGET_FLAGS) $(TARGET_LDFLAG
|
||||
TARGET_ASHLDFLAGS= $(LDOPTIONS) $(TARGET_XSHLDFLAGS) $(TARGET_FLAGS) $(TARGET_SHLDFLAGS)
|
||||
TARGET_ALIBS= $(TARGET_XLIBS) $(LIBS) $(TARGET_LIBS)
|
||||
|
||||
TARGET_TESTARCH=$(shell $(TARGET_CC) $(TARGET_TCFLAGS) -E lj_arch.h -dM)
|
||||
TARGET_TESTARCH:=$(shell $(TARGET_CC) $(TARGET_TCFLAGS) -E lj_arch.h -dM)
|
||||
ifneq (,$(findstring LJ_TARGET_X64 ,$(TARGET_TESTARCH)))
|
||||
TARGET_LJARCH= x64
|
||||
else
|
||||
@@ -323,13 +322,13 @@ ifeq (Darwin,$(TARGET_SYS))
|
||||
TARGET_XCFLAGS+= -DLUAJIT_UNWIND_EXTERNAL
|
||||
TARGET_XSHLDFLAGS= -dynamiclib -single_module -undefined dynamic_lookup -fPIC
|
||||
TARGET_DYNXLDOPTS=
|
||||
TARGET_XSHLDFLAGS+= -install_name $(TARGET_DYLIBPATH) -compatibility_version $(MAJVER).$(MINVER) -current_version $(MAJVER).$(MINVER).$(RELVER)
|
||||
TARGET_XSHLDFLAGS+= -install_name $(TARGET_DYLIBPATH) -compatibility_version $(MAJVER).$(MINVER) -current_version $(MAJVER).$(MINVER).255
|
||||
else
|
||||
ifeq (iOS,$(TARGET_SYS))
|
||||
TARGET_STRIP+= -x
|
||||
TARGET_XSHLDFLAGS= -dynamiclib -single_module -undefined dynamic_lookup -fPIC
|
||||
TARGET_DYNXLDOPTS=
|
||||
TARGET_XSHLDFLAGS+= -install_name $(TARGET_DYLIBPATH) -compatibility_version $(MAJVER).$(MINVER) -current_version $(MAJVER).$(MINVER).$(RELVER)
|
||||
TARGET_XSHLDFLAGS+= -install_name $(TARGET_DYLIBPATH) -compatibility_version $(MAJVER).$(MINVER) -current_version $(MAJVER).$(MINVER).255
|
||||
ifeq (arm64,$(TARGET_LJARCH))
|
||||
TARGET_XCFLAGS+= -fno-omit-frame-pointer
|
||||
endif
|
||||
@@ -388,10 +387,11 @@ MINILUA_O= host/minilua.o
|
||||
MINILUA_LIBS= -lm
|
||||
MINILUA_T= host/minilua
|
||||
MINILUA_X= $(MINILUA_T)
|
||||
MINILUA_DEP=
|
||||
|
||||
ifeq (,$(HOST_LUA))
|
||||
HOST_LUA= $(MINILUA_X)
|
||||
DASM_DEP= $(MINILUA_T)
|
||||
MINILUA_DEP= $(MINILUA_T)
|
||||
endif
|
||||
|
||||
DASM_DIR= ../dynasm
|
||||
@@ -474,6 +474,14 @@ endif
|
||||
DASM_FLAGS= $(DASM_XFLAGS) $(DASM_AFLAGS)
|
||||
DASM_DASC= vm_$(DASM_ARCH).dasc
|
||||
|
||||
GIT= git
|
||||
ifeq (Windows,$(HOST_SYS)$(HOST_MSYS))
|
||||
GIT_RELVER= if exist ..\.git ( $(GIT) show -s --format=%%ct >luajit_relver.txt ) else ( type ..\.relver >luajit_relver.txt )
|
||||
else
|
||||
GIT_RELVER= [ -e ../.git ] && $(GIT) show -s --format=%ct >luajit_relver.txt 2>/dev/null || cat ../.relver >luajit_relver.txt 2>/dev/null || :
|
||||
endif
|
||||
GIT_DEP= $(wildcard ../.git/HEAD ../.git/refs/heads/*)
|
||||
|
||||
BUILDVM_O= host/buildvm.o host/buildvm_asm.o host/buildvm_peobj.o \
|
||||
host/buildvm_lib.o host/buildvm_fold.o
|
||||
BUILDVM_T= host/buildvm
|
||||
@@ -520,8 +528,8 @@ LUAJIT_T= luajit
|
||||
|
||||
ALL_T= $(LUAJIT_T) $(LUAJIT_A) $(LUAJIT_SO) $(HOST_T)
|
||||
ALL_HDRGEN= lj_bcdef.h lj_ffdef.h lj_libdef.h lj_recdef.h lj_folddef.h \
|
||||
host/buildvm_arch.h
|
||||
ALL_GEN= $(LJVM_S) $(ALL_HDRGEN) $(LIB_VMDEFP)
|
||||
host/buildvm_arch.h luajit.h
|
||||
ALL_GEN= $(LJVM_S) $(ALL_HDRGEN) luajit_relver.txt $(LIB_VMDEFP)
|
||||
WIN_RM= *.obj *.lib *.exp *.dll *.exe *.manifest *.pdb *.ilk
|
||||
ALL_RM= $(ALL_T) $(ALL_GEN) *.o host/*.o $(WIN_RM)
|
||||
|
||||
@@ -645,7 +653,12 @@ $(MINILUA_T): $(MINILUA_O)
|
||||
$(E) "HOSTLINK $@"
|
||||
$(Q)$(HOST_CC) $(HOST_ALDFLAGS) -o $@ $(MINILUA_O) $(MINILUA_LIBS) $(HOST_ALIBS)
|
||||
|
||||
host/buildvm_arch.h: $(DASM_DASC) $(DASM_DEP) $(DASM_DIR)/*.lua lj_arch.h lua.h luaconf.h
|
||||
luajit.h: $(MINILUA_DEP) $(GIT_DEP) luajit_rolling.h
|
||||
$(E) "VERSION $@"
|
||||
$(Q)$(GIT_RELVER)
|
||||
$(Q)$(HOST_LUA) host/genversion.lua
|
||||
|
||||
host/buildvm_arch.h: $(DASM_DASC) $(MINILUA_DEP) lj_arch.h lua.h luaconf.h
|
||||
$(E) "DYNASM $@"
|
||||
$(Q)$(DASM) $(DASM_FLAGS) -o $@ $(DASM_DASC)
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@ lj_asm.o: lj_asm.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_gc.h \
|
||||
lj_buf.h lj_str.h lj_tab.h lj_frame.h lj_bc.h lj_ctype.h lj_ir.h \
|
||||
lj_jit.h lj_ircall.h lj_iropt.h lj_mcode.h lj_trace.h lj_dispatch.h \
|
||||
lj_traceerr.h lj_snap.h lj_asm.h lj_vm.h lj_target.h lj_target_*.h \
|
||||
lj_emit_*.h lj_asm_*.h
|
||||
lj_prng.h lj_emit_*.h lj_asm_*.h
|
||||
lj_assert.o: lj_assert.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h
|
||||
lj_bc.o: lj_bc.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h lj_bc.h \
|
||||
lj_bcdef.h
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** LuaJIT VM builder.
|
||||
** Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
**
|
||||
** This is a tool to build the hand-tuned assembler code required for
|
||||
** LuaJIT's bytecode interpreter. It supports a variety of output formats
|
||||
@@ -329,6 +329,7 @@ static void emit_vmdef(BuildCtx *ctx)
|
||||
#endif
|
||||
int i;
|
||||
fprintf(ctx->fp, "-- This is a generated file. DO NOT EDIT!\n\n");
|
||||
fprintf(ctx->fp, "assert(require(\"jit\").version == \"%s\", \"LuaJIT core/library version mismatch\")\n\n", LUAJIT_VERSION);
|
||||
fprintf(ctx->fp, "return {\n\n");
|
||||
|
||||
fprintf(ctx->fp, "bcnames = \"");
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** LuaJIT VM builder.
|
||||
** Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#ifndef _BUILDVM_H
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** LuaJIT VM builder: Assembler source code emitter.
|
||||
** Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#include "buildvm.h"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** LuaJIT VM builder: IR folding hash table generator.
|
||||
** Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#include "buildvm.h"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** LuaJIT VM builder: library definition compiler.
|
||||
** Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#include "buildvm.h"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** LuaJIT VM builder: PE object emitter.
|
||||
** Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
**
|
||||
** Only used for building on Windows, since we cannot assume the presence
|
||||
** of a suitable assembler. The host and target byte order must match.
|
||||
@@ -9,7 +9,7 @@
|
||||
#include "buildvm.h"
|
||||
#include "lj_bc.h"
|
||||
|
||||
#if LJ_TARGET_X86ORX64
|
||||
#if LJ_TARGET_WINDOWS
|
||||
|
||||
/* Context for PE object emitter. */
|
||||
static char *strtab;
|
||||
@@ -93,6 +93,17 @@ typedef struct PEsymaux {
|
||||
#define PEOBJ_RELOC_ADDR32NB 0x03
|
||||
#define PEOBJ_RELOC_OFS 0
|
||||
#define PEOBJ_TEXT_FLAGS 0x60500020 /* 60=r+x, 50=align16, 20=code. */
|
||||
#define PEOBJ_PDATA_NRELOC 6
|
||||
#define PEOBJ_XDATA_SIZE (8*2+4+6*2)
|
||||
#elif LJ_TARGET_ARM64
|
||||
#define PEOBJ_ARCH_TARGET 0xaa64
|
||||
#define PEOBJ_RELOC_REL32 0x03 /* MS: BRANCH26. */
|
||||
#define PEOBJ_RELOC_DIR32 0x01
|
||||
#define PEOBJ_RELOC_ADDR32NB 0x02
|
||||
#define PEOBJ_RELOC_OFS (-4)
|
||||
#define PEOBJ_TEXT_FLAGS 0x60500020 /* 60=r+x, 50=align16, 20=code. */
|
||||
#define PEOBJ_PDATA_NRELOC 4
|
||||
#define PEOBJ_XDATA_SIZE (4+24+4 +4+8)
|
||||
#endif
|
||||
|
||||
/* Section numbers (0-based). */
|
||||
@@ -100,7 +111,7 @@ enum {
|
||||
PEOBJ_SECT_ABS = -2,
|
||||
PEOBJ_SECT_UNDEF = -1,
|
||||
PEOBJ_SECT_TEXT,
|
||||
#if LJ_TARGET_X64
|
||||
#ifdef PEOBJ_PDATA_NRELOC
|
||||
PEOBJ_SECT_PDATA,
|
||||
PEOBJ_SECT_XDATA,
|
||||
#elif LJ_TARGET_X86
|
||||
@@ -175,6 +186,9 @@ void emit_peobj(BuildCtx *ctx)
|
||||
uint32_t sofs;
|
||||
int i, nrsym;
|
||||
union { uint8_t b; uint32_t u; } host_endian;
|
||||
#ifdef PEOBJ_PDATA_NRELOC
|
||||
uint32_t fcofs = (uint32_t)ctx->sym[ctx->nsym-1].ofs;
|
||||
#endif
|
||||
|
||||
sofs = sizeof(PEheader) + PEOBJ_NSECTIONS*sizeof(PEsection);
|
||||
|
||||
@@ -188,18 +202,18 @@ void emit_peobj(BuildCtx *ctx)
|
||||
/* Flags: 60 = read+execute, 50 = align16, 20 = code. */
|
||||
pesect[PEOBJ_SECT_TEXT].flags = PEOBJ_TEXT_FLAGS;
|
||||
|
||||
#if LJ_TARGET_X64
|
||||
#ifdef PEOBJ_PDATA_NRELOC
|
||||
memcpy(pesect[PEOBJ_SECT_PDATA].name, ".pdata", sizeof(".pdata")-1);
|
||||
pesect[PEOBJ_SECT_PDATA].ofs = sofs;
|
||||
sofs += (pesect[PEOBJ_SECT_PDATA].size = 6*4);
|
||||
sofs += (pesect[PEOBJ_SECT_PDATA].size = PEOBJ_PDATA_NRELOC*4);
|
||||
pesect[PEOBJ_SECT_PDATA].relocofs = sofs;
|
||||
sofs += (pesect[PEOBJ_SECT_PDATA].nreloc = 6) * PEOBJ_RELOC_SIZE;
|
||||
sofs += (pesect[PEOBJ_SECT_PDATA].nreloc = PEOBJ_PDATA_NRELOC) * PEOBJ_RELOC_SIZE;
|
||||
/* Flags: 40 = read, 30 = align4, 40 = initialized data. */
|
||||
pesect[PEOBJ_SECT_PDATA].flags = 0x40300040;
|
||||
|
||||
memcpy(pesect[PEOBJ_SECT_XDATA].name, ".xdata", sizeof(".xdata")-1);
|
||||
pesect[PEOBJ_SECT_XDATA].ofs = sofs;
|
||||
sofs += (pesect[PEOBJ_SECT_XDATA].size = 8*2+4+6*2); /* See below. */
|
||||
sofs += (pesect[PEOBJ_SECT_XDATA].size = PEOBJ_XDATA_SIZE); /* See below. */
|
||||
pesect[PEOBJ_SECT_XDATA].relocofs = sofs;
|
||||
sofs += (pesect[PEOBJ_SECT_XDATA].nreloc = 1) * PEOBJ_RELOC_SIZE;
|
||||
/* Flags: 40 = read, 30 = align4, 40 = initialized data. */
|
||||
@@ -234,7 +248,7 @@ void emit_peobj(BuildCtx *ctx)
|
||||
*/
|
||||
nrsym = ctx->nrelocsym;
|
||||
pehdr.nsyms = 1+PEOBJ_NSECTIONS*2 + 1+ctx->nsym + nrsym;
|
||||
#if LJ_TARGET_X64
|
||||
#ifdef PEOBJ_PDATA_NRELOC
|
||||
pehdr.nsyms += 1; /* Symbol for lj_err_unwind_win. */
|
||||
#endif
|
||||
|
||||
@@ -259,7 +273,6 @@ void emit_peobj(BuildCtx *ctx)
|
||||
|
||||
#if LJ_TARGET_X64
|
||||
{ /* Write .pdata section. */
|
||||
uint32_t fcofs = (uint32_t)ctx->sym[ctx->nsym-1].ofs;
|
||||
uint32_t pdata[3]; /* Start of .text, end of .text and .xdata. */
|
||||
PEreloc reloc;
|
||||
pdata[0] = 0; pdata[1] = fcofs; pdata[2] = 0;
|
||||
@@ -308,6 +321,88 @@ void emit_peobj(BuildCtx *ctx)
|
||||
reloc.type = PEOBJ_RELOC_ADDR32NB;
|
||||
owrite(ctx, &reloc, PEOBJ_RELOC_SIZE);
|
||||
}
|
||||
#elif LJ_TARGET_ARM64
|
||||
/* https://learn.microsoft.com/en-us/cpp/build/arm64-exception-handling */
|
||||
{ /* Write .pdata section. */
|
||||
uint32_t pdata[4];
|
||||
PEreloc reloc;
|
||||
pdata[0] = 0;
|
||||
pdata[1] = 0;
|
||||
pdata[2] = fcofs;
|
||||
pdata[3] = 4+24+4;
|
||||
owrite(ctx, &pdata, sizeof(pdata));
|
||||
/* Start of .text and start of .xdata. */
|
||||
reloc.vaddr = 0; reloc.symidx = 1+2+nrsym+2+2+1;
|
||||
reloc.type = PEOBJ_RELOC_ADDR32NB;
|
||||
owrite(ctx, &reloc, PEOBJ_RELOC_SIZE);
|
||||
reloc.vaddr = 4; reloc.symidx = 1+2+nrsym+2;
|
||||
reloc.type = PEOBJ_RELOC_ADDR32NB;
|
||||
owrite(ctx, &reloc, PEOBJ_RELOC_SIZE);
|
||||
/* Start of vm_ffi_call and start of second part of .xdata. */
|
||||
reloc.vaddr = 8; reloc.symidx = 1+2+nrsym+2+2+1;
|
||||
reloc.type = PEOBJ_RELOC_ADDR32NB;
|
||||
owrite(ctx, &reloc, PEOBJ_RELOC_SIZE);
|
||||
reloc.vaddr = 12; reloc.symidx = 1+2+nrsym+2;
|
||||
reloc.type = PEOBJ_RELOC_ADDR32NB;
|
||||
owrite(ctx, &reloc, PEOBJ_RELOC_SIZE);
|
||||
}
|
||||
{ /* Write .xdata section. */
|
||||
uint32_t u32;
|
||||
uint8_t *p, uwc[24];
|
||||
PEreloc reloc;
|
||||
|
||||
#define CBE16(x) (*p = ((x) >> 8) & 0xff, p[1] = (x) & 0xff, p += 2)
|
||||
#define CALLOC_S(s) (*p++ = ((s) >> 4)) /* s < 512 */
|
||||
#define CSAVE_FPLR(o) (*p++ = 0x40 | ((o) >> 3)) /* o <= 504 */
|
||||
#define CSAVE_REGP(r,o) CBE16(0xc800 | (((r)-19)<< 6) | ((o) >> 3))
|
||||
#define CSAVE_REGS(r1,r2,o1) do { \
|
||||
int r, o; for (r = r1, o = o1; r <= r2; r += 2, o -= 16) CSAVE_REGP(r, o); \
|
||||
} while (0)
|
||||
#define CSAVE_FREGP(r,o) CBE16(0xd800 | (((r) - 8) << 6) | ((o) >> 3))
|
||||
#define CSAVE_FREGS(r1,r2,o1) do { \
|
||||
int r, o; for (r = r1, o = o1; r <= r2; r += 2, o -= 16) CSAVE_FREGP(r, o); \
|
||||
} while (0)
|
||||
#define CSAVE_REGX(r,o) CBE16(0xd400 | (((r) - 19) << 5) | (~(o) >> 3))
|
||||
#define CADD_FP(s) CBE16(0xe200 | ((s) >> 3)) /* s < 8*256 */
|
||||
#define CODE_NOP 0xe3
|
||||
#define CODE_END 0xe4
|
||||
#define CEND_ALIGN do { \
|
||||
*p++ = CODE_END; \
|
||||
while ((p - uwc) & 3) *p++ = CODE_NOP; \
|
||||
} while (0)
|
||||
|
||||
/* Unwind codes for .text section with handler. */
|
||||
p = uwc;
|
||||
CALLOC_S(208); /* +1 */
|
||||
CSAVE_FPLR(192); /* +1 */
|
||||
CADD_FP(192); /* +2 */
|
||||
CSAVE_REGS(19, 28, 184); /* +5*2 */
|
||||
CSAVE_FREGS(8, 15, 104); /* +4*2 */
|
||||
CEND_ALIGN; /* +1 +1 -> 24 */
|
||||
|
||||
u32 = ((24u >> 2) << 27) | (1u << 20) | (fcofs >> 2);
|
||||
owrite(ctx, &u32, 4);
|
||||
owrite(ctx, &uwc, 24);
|
||||
|
||||
u32 = 0; /* Handler RVA to be relocated at 4 + 24. */
|
||||
owrite(ctx, &u32, 4);
|
||||
|
||||
/* Unwind codes for vm_ffi_call without handler. */
|
||||
p = uwc;
|
||||
CSAVE_FPLR(16); /* +1 */
|
||||
CADD_FP(16); /* +2 */
|
||||
CSAVE_REGX(19, -24); /* +2 */
|
||||
CSAVE_REGX(20, -32); /* +2 */
|
||||
CEND_ALIGN; /* +1 +0 -> 8 */
|
||||
|
||||
u32 = ((8u >> 2) << 27) | (((uint32_t)ctx->codesz - fcofs) >> 2);
|
||||
owrite(ctx, &u32, 4);
|
||||
owrite(ctx, &uwc, 8);
|
||||
|
||||
reloc.vaddr = 4 + 24; reloc.symidx = 1+2+nrsym+2+2;
|
||||
reloc.type = PEOBJ_RELOC_ADDR32NB;
|
||||
owrite(ctx, &reloc, PEOBJ_RELOC_SIZE);
|
||||
}
|
||||
#elif LJ_TARGET_X86
|
||||
/* Write .sxdata section. */
|
||||
for (i = 0; i < nrsym; i++) {
|
||||
@@ -339,7 +434,7 @@ void emit_peobj(BuildCtx *ctx)
|
||||
emit_peobj_sym(ctx, ctx->relocsym[i], 0,
|
||||
PEOBJ_SECT_UNDEF, PEOBJ_TYPE_FUNC, PEOBJ_SCL_EXTERN);
|
||||
|
||||
#if LJ_TARGET_X64
|
||||
#ifdef PEOBJ_PDATA_NRELOC
|
||||
emit_peobj_sym_sect(ctx, pesect, PEOBJ_SECT_PDATA);
|
||||
emit_peobj_sym_sect(ctx, pesect, PEOBJ_SECT_XDATA);
|
||||
emit_peobj_sym(ctx, "lj_err_unwind_win", 0,
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
-- Lua script to dump the bytecode of the library functions written in Lua.
|
||||
-- The resulting 'buildvm_libbc.h' is used for the build process of LuaJIT.
|
||||
----------------------------------------------------------------------------
|
||||
-- Copyright (C) 2005-2022 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
-- Lua script to generate a customized, minified version of Lua.
|
||||
-- The resulting 'minilua' is used for the build process of LuaJIT.
|
||||
----------------------------------------------------------------------------
|
||||
-- Copyright (C) 2005-2022 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
----------------------------------------------------------------------------
|
||||
-- Lua script to embed the rolling release version in luajit.h.
|
||||
----------------------------------------------------------------------------
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
local arg = {...}
|
||||
local FILE_ROLLING_H = arg[1] or "luajit_rolling.h"
|
||||
local FILE_RELVER_TXT = arg[2] or "luajit_relver.txt"
|
||||
local FILE_LUAJIT_H = arg[3] or "luajit.h"
|
||||
|
||||
local function file_read(file)
|
||||
local fp = assert(io.open(file, "rb"), "run from the wrong directory")
|
||||
local data = assert(fp:read("*a"))
|
||||
fp:close()
|
||||
return data
|
||||
end
|
||||
|
||||
local function file_write_mod(file, data)
|
||||
local fp = io.open(file, "rb")
|
||||
if fp then
|
||||
local odata = assert(fp:read("*a"))
|
||||
fp:close()
|
||||
if odata == data then return end
|
||||
end
|
||||
fp = assert(io.open(file, "wb"))
|
||||
assert(fp:write(data))
|
||||
assert(fp:close())
|
||||
end
|
||||
|
||||
local text = file_read(FILE_ROLLING_H)
|
||||
local relver = file_read(FILE_RELVER_TXT):match("(%d+)")
|
||||
|
||||
if relver then
|
||||
text = text:gsub("ROLLING", relver)
|
||||
else
|
||||
io.stderr:write([[
|
||||
**** WARNING Cannot determine rolling release version from git log.
|
||||
**** WARNING The 'git' command must be available during the build.
|
||||
]])
|
||||
file_write_mod(FILE_RELVER_TXT, "ROLLING\n") -- Fallback for install target.
|
||||
end
|
||||
|
||||
file_write_mod(FILE_LUAJIT_H, text)
|
||||
@@ -1,7 +1,7 @@
|
||||
----------------------------------------------------------------------------
|
||||
-- LuaJIT bytecode listing module.
|
||||
--
|
||||
-- Copyright (C) 2005-2022 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
--
|
||||
@@ -41,7 +41,6 @@
|
||||
|
||||
-- Cache some library functions and objects.
|
||||
local jit = require("jit")
|
||||
assert(jit.version_num == 20100, "LuaJIT core/library version mismatch")
|
||||
local jutil = require("jit.util")
|
||||
local vmdef = require("jit.vmdef")
|
||||
local bit = require("bit")
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
----------------------------------------------------------------------------
|
||||
-- LuaJIT module to save/list bytecode.
|
||||
--
|
||||
-- Copyright (C) 2005-2022 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
--
|
||||
@@ -11,7 +11,7 @@
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
local jit = require("jit")
|
||||
assert(jit.version_num == 20100, "LuaJIT core/library version mismatch")
|
||||
assert(jit.version_num == 20199, "LuaJIT core/library version mismatch")
|
||||
local bit = require("bit")
|
||||
|
||||
-- Symbol name prefix for LuaJIT bytecode.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
----------------------------------------------------------------------------
|
||||
-- LuaJIT ARM disassembler module.
|
||||
--
|
||||
-- Copyright (C) 2005-2022 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
-- This is a helper module used by the LuaJIT machine code dumper module.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
----------------------------------------------------------------------------
|
||||
-- LuaJIT ARM64 disassembler module.
|
||||
--
|
||||
-- Copyright (C) 2005-2022 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT license. See Copyright Notice in luajit.h
|
||||
--
|
||||
-- Contributed by Djordje Kovacevic and Stefan Pejic from RT-RK.com.
|
||||
@@ -107,24 +107,20 @@ local map_logsr = { -- Logical, shifted register.
|
||||
[0] = {
|
||||
shift = 29, mask = 3,
|
||||
[0] = {
|
||||
shift = 21, mask = 7,
|
||||
[0] = "andDNMSg", "bicDNMSg", "andDNMSg", "bicDNMSg",
|
||||
"andDNMSg", "bicDNMSg", "andDNMg", "bicDNMg"
|
||||
shift = 21, mask = 1,
|
||||
[0] = "andDNMSg", "bicDNMSg"
|
||||
},
|
||||
{
|
||||
shift = 21, mask = 7,
|
||||
[0] ="orr|movDN0MSg", "orn|mvnDN0MSg", "orr|movDN0MSg", "orn|mvnDN0MSg",
|
||||
"orr|movDN0MSg", "orn|mvnDN0MSg", "orr|movDN0Mg", "orn|mvnDN0Mg"
|
||||
shift = 21, mask = 1,
|
||||
[0] = "orr|movDN0MSg", "orn|mvnDN0MSg"
|
||||
},
|
||||
{
|
||||
shift = 21, mask = 7,
|
||||
[0] = "eorDNMSg", "eonDNMSg", "eorDNMSg", "eonDNMSg",
|
||||
"eorDNMSg", "eonDNMSg", "eorDNMg", "eonDNMg"
|
||||
shift = 21, mask = 1,
|
||||
[0] = "eorDNMSg", "eonDNMSg"
|
||||
},
|
||||
{
|
||||
shift = 21, mask = 7,
|
||||
[0] = "ands|tstD0NMSg", "bicsDNMSg", "ands|tstD0NMSg", "bicsDNMSg",
|
||||
"ands|tstD0NMSg", "bicsDNMSg", "ands|tstD0NMg", "bicsDNMg"
|
||||
shift = 21, mask = 1,
|
||||
[0] = "ands|tstD0NMSg", "bicsDNMSg"
|
||||
}
|
||||
},
|
||||
false -- unallocated
|
||||
@@ -132,24 +128,20 @@ local map_logsr = { -- Logical, shifted register.
|
||||
{
|
||||
shift = 29, mask = 3,
|
||||
[0] = {
|
||||
shift = 21, mask = 7,
|
||||
[0] = "andDNMSg", "bicDNMSg", "andDNMSg", "bicDNMSg",
|
||||
"andDNMSg", "bicDNMSg", "andDNMg", "bicDNMg"
|
||||
shift = 21, mask = 1,
|
||||
[0] = "andDNMSg", "bicDNMSg"
|
||||
},
|
||||
{
|
||||
shift = 21, mask = 7,
|
||||
[0] = "orr|movDN0MSg", "orn|mvnDN0MSg", "orr|movDN0MSg", "orn|mvnDN0MSg",
|
||||
"orr|movDN0MSg", "orn|mvnDN0MSg", "orr|movDN0Mg", "orn|mvnDN0Mg"
|
||||
shift = 21, mask = 1,
|
||||
[0] = "orr|movDN0MSg", "orn|mvnDN0MSg"
|
||||
},
|
||||
{
|
||||
shift = 21, mask = 7,
|
||||
[0] = "eorDNMSg", "eonDNMSg", "eorDNMSg", "eonDNMSg",
|
||||
"eorDNMSg", "eonDNMSg", "eorDNMg", "eonDNMg"
|
||||
shift = 21, mask = 1,
|
||||
[0] = "eorDNMSg", "eonDNMSg"
|
||||
},
|
||||
{
|
||||
shift = 21, mask = 7,
|
||||
[0] = "ands|tstD0NMSg", "bicsDNMSg", "ands|tstD0NMSg", "bicsDNMSg",
|
||||
"ands|tstD0NMSg", "bicsDNMSg", "ands|tstD0NMg", "bicsDNMg"
|
||||
shift = 21, mask = 1,
|
||||
[0] = "ands|tstD0NMSg", "bicsDNMSg"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -735,7 +727,7 @@ local map_cond = {
|
||||
"hi", "ls", "ge", "lt", "gt", "le", "al",
|
||||
}
|
||||
|
||||
local map_shift = { [0] = "lsl", "lsr", "asr", }
|
||||
local map_shift = { [0] = "lsl", "lsr", "asr", "ror"}
|
||||
|
||||
local map_extend = {
|
||||
[0] = "uxtb", "uxth", "uxtw", "uxtx", "sxtb", "sxth", "sxtw", "sxtx",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
----------------------------------------------------------------------------
|
||||
-- LuaJIT ARM64BE disassembler wrapper module.
|
||||
--
|
||||
-- Copyright (C) 2005-2022 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
-- ARM64 instructions are always little-endian. So just forward to the
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
----------------------------------------------------------------------------
|
||||
-- LuaJIT MIPS disassembler module.
|
||||
--
|
||||
-- Copyright (C) 2005-2022 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT/X license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
-- This is a helper module used by the LuaJIT machine code dumper module.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
----------------------------------------------------------------------------
|
||||
-- LuaJIT MIPS64 disassembler wrapper module.
|
||||
--
|
||||
-- Copyright (C) 2005-2022 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
-- This module just exports the big-endian functions from the
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
----------------------------------------------------------------------------
|
||||
-- LuaJIT MIPS64EL disassembler wrapper module.
|
||||
--
|
||||
-- Copyright (C) 2005-2022 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
-- This module just exports the little-endian functions from the
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
----------------------------------------------------------------------------
|
||||
-- LuaJIT MIPS64R6 disassembler wrapper module.
|
||||
--
|
||||
-- Copyright (C) 2005-2022 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
-- This module just exports the r6 big-endian functions from the
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
----------------------------------------------------------------------------
|
||||
-- LuaJIT MIPS64R6EL disassembler wrapper module.
|
||||
--
|
||||
-- Copyright (C) 2005-2022 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
-- This module just exports the r6 little-endian functions from the
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
----------------------------------------------------------------------------
|
||||
-- LuaJIT MIPSEL disassembler wrapper module.
|
||||
--
|
||||
-- Copyright (C) 2005-2022 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
-- This module just exports the little-endian functions from the
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
----------------------------------------------------------------------------
|
||||
-- LuaJIT PPC disassembler module.
|
||||
--
|
||||
-- Copyright (C) 2005-2022 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT/X license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
-- This is a helper module used by the LuaJIT machine code dumper module.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
----------------------------------------------------------------------------
|
||||
-- LuaJIT x64 disassembler wrapper module.
|
||||
--
|
||||
-- Copyright (C) 2005-2022 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
-- This module just exports the 64 bit functions from the combined
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
----------------------------------------------------------------------------
|
||||
-- LuaJIT x86/x64 disassembler module.
|
||||
--
|
||||
-- Copyright (C) 2005-2022 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
-- This is a helper module used by the LuaJIT machine code dumper module.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
----------------------------------------------------------------------------
|
||||
-- LuaJIT compiler dump module.
|
||||
--
|
||||
-- Copyright (C) 2005-2022 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
--
|
||||
@@ -55,7 +55,6 @@
|
||||
|
||||
-- Cache some library functions and objects.
|
||||
local jit = require("jit")
|
||||
assert(jit.version_num == 20100, "LuaJIT core/library version mismatch")
|
||||
local jutil = require("jit.util")
|
||||
local vmdef = require("jit.vmdef")
|
||||
local funcinfo, funcbc = jutil.funcinfo, jutil.funcbc
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
----------------------------------------------------------------------------
|
||||
-- LuaJIT profiler.
|
||||
--
|
||||
-- Copyright (C) 2005-2022 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
--
|
||||
@@ -41,7 +41,6 @@
|
||||
|
||||
-- Cache some library functions and objects.
|
||||
local jit = require("jit")
|
||||
assert(jit.version_num == 20100, "LuaJIT core/library version mismatch")
|
||||
local profile = require("jit.profile")
|
||||
local vmdef = require("jit.vmdef")
|
||||
local math = math
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
----------------------------------------------------------------------------
|
||||
-- Verbose mode of the LuaJIT compiler.
|
||||
--
|
||||
-- Copyright (C) 2005-2022 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
--
|
||||
@@ -59,7 +59,6 @@
|
||||
|
||||
-- Cache some library functions and objects.
|
||||
local jit = require("jit")
|
||||
assert(jit.version_num == 20100, "LuaJIT core/library version mismatch")
|
||||
local jutil = require("jit.util")
|
||||
local vmdef = require("jit.vmdef")
|
||||
local funcinfo, traceinfo = jutil.funcinfo, jutil.traceinfo
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
----------------------------------------------------------------------------
|
||||
-- LuaJIT profiler zones.
|
||||
--
|
||||
-- Copyright (C) 2005-2022 Mike Pall. All rights reserved.
|
||||
-- Copyright (C) 2005-2023 Mike Pall. All rights reserved.
|
||||
-- Released under the MIT license. See Copyright Notice in luajit.h
|
||||
----------------------------------------------------------------------------
|
||||
--
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Auxiliary library for the Lua/C API.
|
||||
** Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
**
|
||||
** Major parts taken verbatim or adapted from the Lua interpreter.
|
||||
** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Base and coroutine library.
|
||||
** Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
**
|
||||
** Major portions taken verbatim or adapted from the Lua interpreter.
|
||||
** Copyright (C) 1994-2011 Lua.org, PUC-Rio. See Copyright Notice in lua.h
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Bit manipulation library.
|
||||
** Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#define lib_bit_c
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Buffer library.
|
||||
** Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#define lib_buffer_c
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Debug library.
|
||||
** Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
**
|
||||
** Major portions taken verbatim or adapted from the Lua interpreter.
|
||||
** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** FFI library.
|
||||
** Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#define lib_ffi_c
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Library initialization.
|
||||
** Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
**
|
||||
** Major parts taken verbatim from the Lua interpreter.
|
||||
** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** I/O library.
|
||||
** Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
**
|
||||
** Major portions taken verbatim or adapted from the Lua interpreter.
|
||||
** Copyright (C) 1994-2011 Lua.org, PUC-Rio. See Copyright Notice in lua.h
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** JIT library.
|
||||
** Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#define lib_jit_c
|
||||
@@ -743,7 +743,7 @@ LUALIB_API int luaopen_jit(lua_State *L)
|
||||
#endif
|
||||
lua_pushliteral(L, LJ_OS_NAME);
|
||||
lua_pushliteral(L, LJ_ARCH_NAME);
|
||||
lua_pushinteger(L, LUAJIT_VERSION_NUM);
|
||||
lua_pushinteger(L, LUAJIT_VERSION_NUM); /* Deprecated. */
|
||||
lua_pushliteral(L, LUAJIT_VERSION);
|
||||
LJ_LIB_REG(L, LUA_JITLIBNAME, jit);
|
||||
#if LJ_HASPROFILE
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Math library.
|
||||
** Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#include <math.h>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** OS library.
|
||||
** Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
**
|
||||
** Major portions taken verbatim or adapted from the Lua interpreter.
|
||||
** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Package library.
|
||||
** Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
**
|
||||
** Major portions taken verbatim or adapted from the Lua interpreter.
|
||||
** Copyright (C) 1994-2012 Lua.org, PUC-Rio. See Copyright Notice in lua.h
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** String library.
|
||||
** Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
**
|
||||
** Major portions taken verbatim or adapted from the Lua interpreter.
|
||||
** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Table library.
|
||||
** Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
**
|
||||
** Major portions taken verbatim or adapted from the Lua interpreter.
|
||||
** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Public Lua/C API.
|
||||
** Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
**
|
||||
** Major portions taken verbatim or adapted from the Lua interpreter.
|
||||
** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Target architecture selection.
|
||||
** Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#ifndef _LJ_ARCH_H
|
||||
@@ -57,7 +57,7 @@
|
||||
#define LUAJIT_TARGET LUAJIT_ARCH_X64
|
||||
#elif defined(__arm__) || defined(__arm) || defined(__ARM__) || defined(__ARM)
|
||||
#define LUAJIT_TARGET LUAJIT_ARCH_ARM
|
||||
#elif defined(__aarch64__)
|
||||
#elif defined(__aarch64__) || defined(_M_ARM64)
|
||||
#define LUAJIT_TARGET LUAJIT_ARCH_ARM64
|
||||
#elif defined(__ppc__) || defined(__ppc) || defined(__PPC__) || defined(__PPC) || defined(__powerpc__) || defined(__powerpc) || defined(__POWERPC__) || defined(__POWERPC) || defined(_M_PPC)
|
||||
#define LUAJIT_TARGET LUAJIT_ARCH_PPC
|
||||
@@ -66,7 +66,7 @@
|
||||
#elif defined(__mips__) || defined(__mips) || defined(__MIPS__) || defined(__MIPS)
|
||||
#define LUAJIT_TARGET LUAJIT_ARCH_MIPS32
|
||||
#else
|
||||
#error "No support for this architecture (yet)"
|
||||
#error "Architecture not supported (in this version), see: https://luajit.org/status.html#architectures"
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -237,7 +237,7 @@
|
||||
#define LJ_TARGET_UNIFYROT 2 /* Want only IR_BROR. */
|
||||
#define LJ_ARCH_NUMMODE LJ_NUMMODE_DUAL
|
||||
|
||||
#if __ARM_ARCH == 8 || __ARM_ARCH_8__ || __ARM_ARCH_8A__
|
||||
#if __ARM_ARCH >= 8 || __ARM_ARCH_8__ || __ARM_ARCH_8A__
|
||||
#define LJ_ARCH_VERSION 80
|
||||
#elif __ARM_ARCH == 7 || __ARM_ARCH_7__ || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH_7S__ || __ARM_ARCH_7VE__
|
||||
#define LJ_ARCH_VERSION 70
|
||||
@@ -331,6 +331,7 @@
|
||||
#define LJ_ARCH_NOFFI 1
|
||||
#elif LJ_ARCH_BITS == 64
|
||||
#error "No support for PPC64"
|
||||
#undef LJ_TARGET_PPC
|
||||
#endif
|
||||
|
||||
#if _ARCH_PWR7
|
||||
@@ -490,36 +491,45 @@
|
||||
#elif LJ_TARGET_ARM
|
||||
#if defined(__ARMEB__)
|
||||
#error "No support for big-endian ARM"
|
||||
#undef LJ_TARGET_ARM
|
||||
#endif
|
||||
#if __ARM_ARCH_6M__ || __ARM_ARCH_7M__ || __ARM_ARCH_7EM__
|
||||
#error "No support for Cortex-M CPUs"
|
||||
#undef LJ_TARGET_ARM
|
||||
#endif
|
||||
#if !(__ARM_EABI__ || LJ_TARGET_IOS)
|
||||
#error "Only ARM EABI or iOS 3.0+ ABI is supported"
|
||||
#undef LJ_TARGET_ARM
|
||||
#endif
|
||||
#elif LJ_TARGET_ARM64
|
||||
#if defined(_ILP32)
|
||||
#error "No support for ILP32 model on ARM64"
|
||||
#undef LJ_TARGET_ARM64
|
||||
#endif
|
||||
#elif LJ_TARGET_PPC
|
||||
#if defined(_LITTLE_ENDIAN) && (!defined(_BYTE_ORDER) || (_BYTE_ORDER == _LITTLE_ENDIAN))
|
||||
#error "No support for little-endian PPC32"
|
||||
#undef LJ_TARGET_PPC
|
||||
#endif
|
||||
#if defined(__NO_FPRS__) && !defined(_SOFT_FLOAT)
|
||||
#error "No support for PPC/e500 anymore (use LuaJIT 2.0)"
|
||||
#error "No support for PPC/e500, use LuaJIT 2.0"
|
||||
#undef LJ_TARGET_PPC
|
||||
#endif
|
||||
#elif LJ_TARGET_MIPS32
|
||||
#if !((defined(_MIPS_SIM_ABI32) && _MIPS_SIM == _MIPS_SIM_ABI32) || (defined(_ABIO32) && _MIPS_SIM == _ABIO32))
|
||||
#error "Only o32 ABI supported for MIPS32"
|
||||
#undef LJ_TARGET_MIPS
|
||||
#endif
|
||||
#if LJ_TARGET_MIPSR6
|
||||
/* Not that useful, since most available r6 CPUs are 64 bit. */
|
||||
#error "No support for MIPS32R6"
|
||||
#undef LJ_TARGET_MIPS
|
||||
#endif
|
||||
#elif LJ_TARGET_MIPS64
|
||||
#if !((defined(_MIPS_SIM_ABI64) && _MIPS_SIM == _MIPS_SIM_ABI64) || (defined(_ABI64) && _MIPS_SIM == _ABI64))
|
||||
/* MIPS32ON64 aka n32 ABI support might be desirable, but difficult. */
|
||||
#error "Only n64 ABI supported for MIPS64"
|
||||
#undef LJ_TARGET_MIPS
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** IR assembler (SSA IR -> machine code).
|
||||
** Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#define lj_asm_c
|
||||
@@ -29,6 +29,7 @@
|
||||
#include "lj_dispatch.h"
|
||||
#include "lj_vm.h"
|
||||
#include "lj_target.h"
|
||||
#include "lj_prng.h"
|
||||
|
||||
#ifdef LUA_USE_ASSERT
|
||||
#include <stdio.h>
|
||||
@@ -93,6 +94,12 @@ typedef struct ASMState {
|
||||
MCode *flagmcp; /* Pending opportunity to merge flag setting ins. */
|
||||
MCode *realign; /* Realign loop if not NULL. */
|
||||
|
||||
#ifdef LUAJIT_RANDOM_RA
|
||||
/* Randomize register allocation. OK for fuzz testing, not for production. */
|
||||
uint64_t prngbits;
|
||||
PRNGState prngstate;
|
||||
#endif
|
||||
|
||||
#ifdef RID_NUM_KREF
|
||||
intptr_t krefk[RID_NUM_KREF];
|
||||
#endif
|
||||
@@ -173,6 +180,41 @@ IRFLDEF(FLOFS)
|
||||
0
|
||||
};
|
||||
|
||||
#ifdef LUAJIT_RANDOM_RA
|
||||
/* Return a fixed number of random bits from the local PRNG state. */
|
||||
static uint32_t ra_random_bits(ASMState *as, uint32_t nbits) {
|
||||
uint64_t b = as->prngbits;
|
||||
uint32_t res = (1u << nbits) - 1u;
|
||||
if (b <= res) b = lj_prng_u64(&as->prngstate) | (1ull << 63);
|
||||
res &= (uint32_t)b;
|
||||
as->prngbits = b >> nbits;
|
||||
return res;
|
||||
}
|
||||
|
||||
/* Pick a random register from a register set. */
|
||||
static Reg rset_pickrandom(ASMState *as, RegSet rs)
|
||||
{
|
||||
Reg r = rset_pickbot_(rs);
|
||||
rs >>= r;
|
||||
if (rs > 1) { /* More than one bit set? */
|
||||
while (1) {
|
||||
/* We need to sample max. the GPR or FPR half of the set. */
|
||||
uint32_t d = ra_random_bits(as, RSET_BITS-1);
|
||||
if ((rs >> d) & 1) {
|
||||
r += d;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return r;
|
||||
}
|
||||
#define rset_picktop(rs) rset_pickrandom(as, rs)
|
||||
#define rset_pickbot(rs) rset_pickrandom(as, rs)
|
||||
#else
|
||||
#define rset_picktop(rs) rset_picktop_(rs)
|
||||
#define rset_pickbot(rs) rset_pickbot_(rs)
|
||||
#endif
|
||||
|
||||
/* -- Target-specific instruction emitter --------------------------------- */
|
||||
|
||||
#if LJ_TARGET_X86ORX64
|
||||
@@ -564,7 +606,11 @@ static Reg ra_allock(ASMState *as, intptr_t k, RegSet allow)
|
||||
IRIns *ir = IR(ref);
|
||||
if ((ir->o == IR_KINT64 && k == (int64_t)ir_kint64(ir)->u64) ||
|
||||
#if LJ_GC64
|
||||
#if LJ_TARGET_ARM64
|
||||
(ir->o == IR_KINT && (uint64_t)k == (uint32_t)ir->i) ||
|
||||
#else
|
||||
(ir->o == IR_KINT && k == ir->i) ||
|
||||
#endif
|
||||
(ir->o == IR_KGC && k == (intptr_t)ir_kgc(ir)) ||
|
||||
((ir->o == IR_KPTR || ir->o == IR_KKPTR) &&
|
||||
k == (intptr_t)ir_kptr(ir))
|
||||
@@ -2442,6 +2488,9 @@ void lj_asm_trace(jit_State *J, GCtrace *T)
|
||||
as->realign = NULL;
|
||||
as->loopinv = 0;
|
||||
as->parent = J->parent ? traceref(J, J->parent) : NULL;
|
||||
#ifdef LUAJIT_RANDOM_RA
|
||||
(void)lj_prng_u64(&J2G(J)->prng); /* Ensure PRNG step between traces. */
|
||||
#endif
|
||||
|
||||
/* Reserve MCode memory. */
|
||||
as->mctop = as->mctoporig = lj_mcode_reserve(J, &as->mcbot);
|
||||
@@ -2483,6 +2532,10 @@ void lj_asm_trace(jit_State *J, GCtrace *T)
|
||||
#endif
|
||||
as->ir = J->curfinal->ir; /* Use the copied IR. */
|
||||
as->curins = J->cur.nins = as->orignins;
|
||||
#ifdef LUAJIT_RANDOM_RA
|
||||
as->prngstate = J2G(J)->prng; /* Must (re)start from identical state. */
|
||||
as->prngbits = 0;
|
||||
#endif
|
||||
|
||||
RA_DBG_START();
|
||||
RA_DBGX((as, "===== STOP ====="));
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** IR assembler (SSA IR -> machine code).
|
||||
** Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#ifndef _LJ_ASM_H
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** ARM IR assembler (SSA IR -> machine code).
|
||||
** Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
/* -- Register allocator extensions --------------------------------------- */
|
||||
@@ -1990,6 +1990,7 @@ static void asm_prof(ASMState *as, IRIns *ir)
|
||||
static void asm_stack_check(ASMState *as, BCReg topslot,
|
||||
IRIns *irp, RegSet allow, ExitNo exitno)
|
||||
{
|
||||
int savereg = 0;
|
||||
Reg pbase;
|
||||
uint32_t k;
|
||||
if (irp) {
|
||||
@@ -2000,12 +2001,14 @@ static void asm_stack_check(ASMState *as, BCReg topslot,
|
||||
pbase = rset_pickbot(allow);
|
||||
} else {
|
||||
pbase = RID_RET;
|
||||
emit_lso(as, ARMI_LDR, RID_RET, RID_SP, 0); /* Restore temp. register. */
|
||||
savereg = 1;
|
||||
}
|
||||
} else {
|
||||
pbase = RID_BASE;
|
||||
}
|
||||
emit_branch(as, ARMF_CC(ARMI_BL, CC_LS), exitstub_addr(as->J, exitno));
|
||||
if (savereg)
|
||||
emit_lso(as, ARMI_LDR, RID_RET, RID_SP, 0); /* Restore temp. register. */
|
||||
k = emit_isk12(0, (int32_t)(8*topslot));
|
||||
lj_assertA(k, "slot offset %d does not fit in K12", 8*topslot);
|
||||
emit_n(as, ARMI_CMP^k, RID_TMP);
|
||||
@@ -2017,7 +2020,7 @@ static void asm_stack_check(ASMState *as, BCReg topslot,
|
||||
if (ra_hasspill(irp->s))
|
||||
emit_lso(as, ARMI_LDR, pbase, RID_SP, sps_scale(irp->s));
|
||||
emit_lso(as, ARMI_LDR, RID_TMP, RID_TMP, (i & 4095));
|
||||
if (ra_hasspill(irp->s) && !allow)
|
||||
if (savereg)
|
||||
emit_lso(as, ARMI_STR, RID_RET, RID_SP, 0); /* Save temp. register. */
|
||||
emit_loadi(as, RID_TMP, (i & ~4095));
|
||||
} else {
|
||||
|
||||
+199
-217
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** ARM64 IR assembler (SSA IR -> machine code).
|
||||
** Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
**
|
||||
** Contributed by Djordje Kovacevic and Stefan Pejic from RT-RK.com.
|
||||
** Sponsored by Cisco Systems, Inc.
|
||||
@@ -84,18 +84,23 @@ static void asm_guardcc(ASMState *as, A64CC cc)
|
||||
emit_cond_branch(as, cc, target);
|
||||
}
|
||||
|
||||
/* Emit test and branch instruction to exit for guard. */
|
||||
static void asm_guardtnb(ASMState *as, A64Ins ai, Reg r, uint32_t bit)
|
||||
/* Emit test and branch instruction to exit for guard, if in range. */
|
||||
static int asm_guardtnb(ASMState *as, A64Ins ai, Reg r, uint32_t bit)
|
||||
{
|
||||
MCode *target = asm_exitstub_addr(as, as->snapno);
|
||||
MCode *p = as->mcp;
|
||||
ptrdiff_t delta = target - p;
|
||||
if (LJ_UNLIKELY(p == as->invmcp)) {
|
||||
if (as->orignins > 1023) return 0; /* Delta might end up too large. */
|
||||
as->loopinv = 1;
|
||||
*p = A64I_B | A64F_S26(target-p);
|
||||
emit_tnb(as, ai^0x01000000u, r, bit, p-1);
|
||||
return;
|
||||
*p = A64I_B | A64F_S26(delta);
|
||||
ai ^= 0x01000000u;
|
||||
target = p-1;
|
||||
} else if (LJ_UNLIKELY(delta >= 0x1fff)) {
|
||||
return 0;
|
||||
}
|
||||
emit_tnb(as, ai, r, bit, target);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Emit compare and branch instruction to exit for guard. */
|
||||
@@ -211,16 +216,13 @@ static Reg asm_fuseahuref(ASMState *as, IRRef ref, int32_t *ofsp, RegSet allow,
|
||||
static uint32_t asm_fuseopm(ASMState *as, A64Ins ai, IRRef ref, RegSet allow)
|
||||
{
|
||||
IRIns *ir = IR(ref);
|
||||
int logical = (ai & 0x1f000000) == 0x0a000000;
|
||||
if (ra_hasreg(ir->r)) {
|
||||
ra_noweak(as, ir->r);
|
||||
return A64F_M(ir->r);
|
||||
} else if (irref_isk(ref)) {
|
||||
uint32_t m;
|
||||
int64_t k = get_k64val(as, ref);
|
||||
if ((ai & 0x1f000000) == 0x0a000000)
|
||||
m = emit_isk13(k, irt_is64(ir->t));
|
||||
else
|
||||
m = emit_isk12(k);
|
||||
uint32_t m = logical ? emit_isk13(k, irt_is64(ir->t)) : emit_isk12(k);
|
||||
if (m)
|
||||
return m;
|
||||
} else if (mayfuse(as, ref)) {
|
||||
@@ -232,7 +234,7 @@ static uint32_t asm_fuseopm(ASMState *as, A64Ins ai, IRRef ref, RegSet allow)
|
||||
(IR(ir->op2)->i & (irt_is64(ir->t) ? 63 : 31));
|
||||
IRIns *irl = IR(ir->op1);
|
||||
if (sh == A64SH_LSL &&
|
||||
irl->o == IR_CONV &&
|
||||
irl->o == IR_CONV && !logical &&
|
||||
irl->op2 == ((IRT_I64<<IRCONV_DSH)|IRT_INT|IRCONV_SEXT) &&
|
||||
shift <= 4 &&
|
||||
canfuse(as, irl)) {
|
||||
@@ -242,7 +244,11 @@ static uint32_t asm_fuseopm(ASMState *as, A64Ins ai, IRRef ref, RegSet allow)
|
||||
Reg m = ra_alloc1(as, ir->op1, allow);
|
||||
return A64F_M(m) | A64F_SH(sh, shift);
|
||||
}
|
||||
} else if (ir->o == IR_CONV &&
|
||||
} else if (ir->o == IR_BROR && logical && irref_isk(ir->op2)) {
|
||||
Reg m = ra_alloc1(as, ir->op1, allow);
|
||||
int shift = (IR(ir->op2)->i & (irt_is64(ir->t) ? 63 : 31));
|
||||
return A64F_M(m) | A64F_SH(A64SH_ROR, shift);
|
||||
} else if (ir->o == IR_CONV && !logical &&
|
||||
ir->op2 == ((IRT_I64<<IRCONV_DSH)|IRT_INT|IRCONV_SEXT)) {
|
||||
Reg m = ra_alloc1(as, ir->op1, allow);
|
||||
return A64F_M(m) | A64F_EX(A64EX_SXTW);
|
||||
@@ -419,7 +425,7 @@ static int asm_fuseorshift(ASMState *as, IRIns *ir)
|
||||
static void asm_gencall(ASMState *as, const CCallInfo *ci, IRRef *args)
|
||||
{
|
||||
uint32_t n, nargs = CCI_XNARGS(ci);
|
||||
int32_t ofs = 0;
|
||||
int32_t spofs = 0, spalign = LJ_HASFFI && LJ_TARGET_OSX ? 0 : 7;
|
||||
Reg gpr, fpr = REGARG_FIRSTFPR;
|
||||
if (ci->func)
|
||||
emit_call(as, ci->func);
|
||||
@@ -438,8 +444,14 @@ static void asm_gencall(ASMState *as, const CCallInfo *ci, IRRef *args)
|
||||
fpr++;
|
||||
} else {
|
||||
Reg r = ra_alloc1(as, ref, RSET_FPR);
|
||||
emit_spstore(as, ir, r, ofs + ((LJ_BE && !irt_isnum(ir->t)) ? 4 : 0));
|
||||
ofs += 8;
|
||||
int32_t al = spalign;
|
||||
#if LJ_HASFFI && LJ_TARGET_OSX
|
||||
al |= irt_isnum(ir->t) ? 7 : 3;
|
||||
#endif
|
||||
spofs = (spofs + al) & ~al;
|
||||
if (LJ_BE && al >= 7 && !irt_isnum(ir->t)) spofs += 4, al -= 4;
|
||||
emit_spstore(as, ir, r, spofs);
|
||||
spofs += al + 1;
|
||||
}
|
||||
} else {
|
||||
if (gpr <= REGARG_LASTGPR) {
|
||||
@@ -449,10 +461,27 @@ static void asm_gencall(ASMState *as, const CCallInfo *ci, IRRef *args)
|
||||
gpr++;
|
||||
} else {
|
||||
Reg r = ra_alloc1(as, ref, RSET_GPR);
|
||||
emit_spstore(as, ir, r, ofs + ((LJ_BE && !irt_is64(ir->t)) ? 4 : 0));
|
||||
ofs += 8;
|
||||
int32_t al = spalign;
|
||||
#if LJ_HASFFI && LJ_TARGET_OSX
|
||||
al |= irt_size(ir->t) - 1;
|
||||
#endif
|
||||
spofs = (spofs + al) & ~al;
|
||||
if (al >= 3) {
|
||||
if (LJ_BE && al >= 7 && !irt_is64(ir->t)) spofs += 4, al -= 4;
|
||||
emit_spstore(as, ir, r, spofs);
|
||||
} else {
|
||||
lj_assertA(al == 0 || al == 1, "size %d unexpected", al + 1);
|
||||
emit_lso(as, al ? A64I_STRH : A64I_STRB, r, RID_SP, spofs);
|
||||
}
|
||||
spofs += al + 1;
|
||||
}
|
||||
}
|
||||
#if LJ_HASFFI && LJ_TARGET_OSX
|
||||
} else { /* Marker for start of varargs. */
|
||||
gpr = REGARG_LASTGPR+1;
|
||||
fpr = REGARG_LASTFPR+1;
|
||||
spalign = 7;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -518,8 +547,6 @@ static void asm_retf(ASMState *as, IRIns *ir)
|
||||
as->topslot -= (BCReg)delta;
|
||||
if ((int32_t)as->topslot < 0) as->topslot = 0;
|
||||
irt_setmark(IR(REF_BASE)->t); /* Children must not coalesce with BASE reg. */
|
||||
/* Need to force a spill on REF_BASE now to update the stack slot. */
|
||||
emit_lso(as, A64I_STRx, base, RID_SP, ra_spill(as, IR(REF_BASE)));
|
||||
emit_setgl(as, base, jit_base);
|
||||
emit_addptr(as, base, -8*delta);
|
||||
asm_guardcc(as, CC_NE);
|
||||
@@ -643,25 +670,22 @@ static void asm_strto(ASMState *as, IRIns *ir)
|
||||
{
|
||||
const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_strscan_num];
|
||||
IRRef args[2];
|
||||
Reg dest = 0, tmp;
|
||||
int destused = ra_used(ir);
|
||||
Reg tmp;
|
||||
int32_t ofs = 0;
|
||||
ra_evictset(as, RSET_SCRATCH);
|
||||
if (destused) {
|
||||
if (ra_used(ir)) {
|
||||
if (ra_hasspill(ir->s)) {
|
||||
ofs = sps_scale(ir->s);
|
||||
destused = 0;
|
||||
if (ra_hasreg(ir->r)) {
|
||||
ra_free(as, ir->r);
|
||||
ra_modified(as, ir->r);
|
||||
emit_spload(as, ir, ir->r, ofs);
|
||||
}
|
||||
} else {
|
||||
dest = ra_dest(as, ir, RSET_FPR);
|
||||
Reg dest = ra_dest(as, ir, RSET_FPR);
|
||||
emit_lso(as, A64I_LDRd, (dest & 31), RID_SP, 0);
|
||||
}
|
||||
}
|
||||
if (destused)
|
||||
emit_lso(as, A64I_LDRd, (dest & 31), RID_SP, 0);
|
||||
asm_guardcnb(as, A64I_CBZ, RID_RET);
|
||||
args[0] = ir->op1; /* GCstr *str */
|
||||
args[1] = ASMREF_TMP1; /* TValue *n */
|
||||
@@ -752,113 +776,76 @@ static void asm_href(ASMState *as, IRIns *ir, IROp merge)
|
||||
int destused = ra_used(ir);
|
||||
Reg dest = ra_dest(as, ir, allow);
|
||||
Reg tab = ra_alloc1(as, ir->op1, rset_clear(allow, dest));
|
||||
Reg key = 0, tmp = RID_TMP;
|
||||
Reg ftmp = RID_NONE, type = RID_NONE, scr = RID_NONE, tisnum = RID_NONE;
|
||||
Reg key = 0, tmp = RID_TMP, type = RID_NONE, tkey;
|
||||
IRRef refkey = ir->op2;
|
||||
IRIns *irkey = IR(refkey);
|
||||
int isk = irref_isk(ir->op2);
|
||||
int isk = irref_isk(refkey);
|
||||
IRType1 kt = irkey->t;
|
||||
uint32_t k = 0;
|
||||
uint32_t khash;
|
||||
MCLabel l_end, l_loop, l_next;
|
||||
MCLabel l_end, l_loop;
|
||||
rset_clear(allow, tab);
|
||||
|
||||
if (!isk) {
|
||||
key = ra_alloc1(as, ir->op2, irt_isnum(kt) ? RSET_FPR : allow);
|
||||
/* Allocate registers outside of the loop. */
|
||||
if (irkey->o != IR_KNUM || !(k = emit_isk12((int64_t)ir_knum(irkey)->u64))) {
|
||||
key = ra_alloc1(as, refkey, irt_isnum(kt) ? RSET_FPR : allow);
|
||||
rset_clear(allow, key);
|
||||
if (!irt_isstr(kt)) {
|
||||
tmp = ra_scratch(as, allow);
|
||||
rset_clear(allow, tmp);
|
||||
}
|
||||
} else if (irt_isnum(kt)) {
|
||||
int64_t val = (int64_t)ir_knum(irkey)->u64;
|
||||
if (!(k = emit_isk12(val))) {
|
||||
key = ra_allock(as, val, allow);
|
||||
rset_clear(allow, key);
|
||||
}
|
||||
} else if (!irt_ispri(kt)) {
|
||||
if (!(k = emit_isk12(irkey->i))) {
|
||||
key = ra_alloc1(as, refkey, allow);
|
||||
rset_clear(allow, key);
|
||||
}
|
||||
}
|
||||
|
||||
/* Allocate constants early. */
|
||||
if (irt_isnum(kt)) {
|
||||
if (!isk) {
|
||||
tisnum = ra_allock(as, LJ_TISNUM << 15, allow);
|
||||
ftmp = ra_scratch(as, rset_exclude(RSET_FPR, key));
|
||||
rset_clear(allow, tisnum);
|
||||
}
|
||||
} else if (irt_isaddr(kt)) {
|
||||
if (isk) {
|
||||
int64_t kk = ((int64_t)irt_toitype(kt) << 47) | irkey[1].tv.u64;
|
||||
scr = ra_allock(as, kk, allow);
|
||||
} else {
|
||||
scr = ra_scratch(as, allow);
|
||||
}
|
||||
rset_clear(allow, scr);
|
||||
if (!isk) {
|
||||
tkey = ra_scratch(as, allow);
|
||||
rset_clear(allow, tkey);
|
||||
} else if (irt_isnum(kt)) {
|
||||
tkey = key; /* Assumes -0.0 is already canonicalized to +0.0. */
|
||||
} else {
|
||||
lj_assertA(irt_ispri(kt) && !irt_isnil(kt), "bad HREF key type");
|
||||
type = ra_allock(as, ~((int64_t)~irt_toitype(kt) << 47), allow);
|
||||
scr = ra_scratch(as, rset_clear(allow, type));
|
||||
rset_clear(allow, scr);
|
||||
int64_t kk;
|
||||
if (irt_isaddr(kt)) {
|
||||
kk = ((int64_t)irt_toitype(kt) << 47) | irkey[1].tv.u64;
|
||||
} else {
|
||||
lj_assertA(irt_ispri(kt) && !irt_isnil(kt), "bad HREF key type");
|
||||
kk = ~((int64_t)~irt_toitype(kt) << 47);
|
||||
}
|
||||
tkey = ra_allock(as, kk, allow);
|
||||
rset_clear(allow, tkey);
|
||||
}
|
||||
|
||||
/* Key not found in chain: jump to exit (if merged) or load niltv. */
|
||||
l_end = emit_label(as);
|
||||
as->invmcp = NULL;
|
||||
if (merge == IR_NE)
|
||||
if (merge == IR_NE) {
|
||||
asm_guardcc(as, CC_AL);
|
||||
else if (destused)
|
||||
emit_loada(as, dest, niltvg(J2G(as->J)));
|
||||
} else if (destused) {
|
||||
uint32_t k12 = emit_isk12(offsetof(global_State, nilnode.val));
|
||||
lj_assertA(k12 != 0, "Cannot k12 encode niltv(L)");
|
||||
emit_dn(as, A64I_ADDx^k12, dest, RID_GL);
|
||||
}
|
||||
|
||||
/* Follow hash chain until the end. */
|
||||
l_loop = --as->mcp;
|
||||
emit_n(as, A64I_CMPx^A64I_K12^0, dest);
|
||||
emit_lso(as, A64I_LDRx, dest, dest, offsetof(Node, next));
|
||||
l_next = emit_label(as);
|
||||
if (destused)
|
||||
emit_lso(as, A64I_LDRx, dest, dest, offsetof(Node, next));
|
||||
|
||||
/* Type and value comparison. */
|
||||
if (merge == IR_EQ)
|
||||
asm_guardcc(as, CC_EQ);
|
||||
else
|
||||
emit_cond_branch(as, CC_EQ, l_end);
|
||||
emit_nm(as, A64I_CMPx^k, tmp, tkey);
|
||||
if (!destused)
|
||||
emit_lso(as, A64I_LDRx, dest, dest, offsetof(Node, next));
|
||||
emit_lso(as, A64I_LDRx, tmp, dest, offsetof(Node, key));
|
||||
*l_loop = A64I_X | A64I_CBNZ | A64F_S19(as->mcp - l_loop) | dest;
|
||||
|
||||
if (irt_isnum(kt)) {
|
||||
if (isk) {
|
||||
/* Assumes -0.0 is already canonicalized to +0.0. */
|
||||
if (k)
|
||||
emit_n(as, A64I_CMPx^k, tmp);
|
||||
else
|
||||
emit_nm(as, A64I_CMPx, key, tmp);
|
||||
emit_lso(as, A64I_LDRx, tmp, dest, offsetof(Node, key.u64));
|
||||
/* Construct tkey as canonicalized or tagged key. */
|
||||
if (!isk) {
|
||||
if (irt_isnum(kt)) {
|
||||
emit_dnm(as, A64I_CSELx | A64F_CC(CC_EQ), tkey, RID_ZERO, tkey);
|
||||
} else {
|
||||
emit_nm(as, A64I_FCMPd, key, ftmp);
|
||||
emit_dn(as, A64I_FMOV_D_R, (ftmp & 31), (tmp & 31));
|
||||
emit_cond_branch(as, CC_LO, l_next);
|
||||
emit_nm(as, A64I_CMPx | A64F_SH(A64SH_LSR, 32), tisnum, tmp);
|
||||
emit_lso(as, A64I_LDRx, tmp, dest, offsetof(Node, key.n));
|
||||
lj_assertA(irt_isaddr(kt), "bad HREF key type");
|
||||
type = ra_allock(as, irt_toitype(kt) << 15, allow);
|
||||
emit_dnm(as, A64I_ADDx | A64F_SH(A64SH_LSL, 32), tkey, key, type);
|
||||
}
|
||||
} else if (irt_isaddr(kt)) {
|
||||
if (isk) {
|
||||
emit_nm(as, A64I_CMPx, scr, tmp);
|
||||
emit_lso(as, A64I_LDRx, tmp, dest, offsetof(Node, key.u64));
|
||||
} else {
|
||||
emit_nm(as, A64I_CMPx, tmp, scr);
|
||||
emit_lso(as, A64I_LDRx, scr, dest, offsetof(Node, key.u64));
|
||||
}
|
||||
} else {
|
||||
emit_nm(as, A64I_CMPx, scr, type);
|
||||
emit_lso(as, A64I_LDRx, scr, dest, offsetof(Node, key));
|
||||
}
|
||||
|
||||
*l_loop = A64I_BCC | A64F_S19(as->mcp - l_loop) | CC_NE;
|
||||
if (!isk && irt_isaddr(kt)) {
|
||||
type = ra_allock(as, (int32_t)irt_toitype(kt), allow);
|
||||
emit_dnm(as, A64I_ADDx | A64F_SH(A64SH_LSL, 47), tmp, key, type);
|
||||
rset_clear(allow, type);
|
||||
}
|
||||
/* Load main position relative to tab->node into dest. */
|
||||
khash = isk ? ir_khash(as, irkey) : 1;
|
||||
if (khash == 0) {
|
||||
@@ -872,7 +859,6 @@ static void asm_href(ASMState *as, IRIns *ir, IROp merge)
|
||||
emit_dnm(as, A64I_ANDw, dest, dest, tmphash);
|
||||
emit_lso(as, A64I_LDRw, dest, tab, offsetof(GCtab, hmask));
|
||||
} else if (irt_isstr(kt)) {
|
||||
/* Fetch of str->sid is cheaper than ra_allock. */
|
||||
emit_dnm(as, A64I_ANDw, dest, dest, tmp);
|
||||
emit_lso(as, A64I_LDRw, tmp, key, offsetof(GCstr, sid));
|
||||
emit_lso(as, A64I_LDRw, dest, tab, offsetof(GCtab, hmask));
|
||||
@@ -881,23 +867,18 @@ static void asm_href(ASMState *as, IRIns *ir, IROp merge)
|
||||
emit_lso(as, A64I_LDRw, tmp, tab, offsetof(GCtab, hmask));
|
||||
emit_dnm(as, A64I_SUBw, dest, dest, tmp);
|
||||
emit_dnm(as, A64I_EXTRw | (A64F_IMMS(32-HASH_ROT3)), tmp, tmp, tmp);
|
||||
emit_dnm(as, A64I_EORw, dest, dest, tmp);
|
||||
emit_dnm(as, A64I_EXTRw | (A64F_IMMS(32-HASH_ROT2)), dest, dest, dest);
|
||||
emit_dnm(as, A64I_EORw | A64F_SH(A64SH_ROR, 32-HASH_ROT2), dest, tmp, dest);
|
||||
emit_dnm(as, A64I_SUBw, tmp, tmp, dest);
|
||||
emit_dnm(as, A64I_EXTRw | (A64F_IMMS(32-HASH_ROT1)), dest, dest, dest);
|
||||
emit_dnm(as, A64I_EORw, tmp, tmp, dest);
|
||||
if (irt_isnum(kt)) {
|
||||
emit_dnm(as, A64I_EORw, tmp, tkey, dest);
|
||||
emit_dnm(as, A64I_ADDw, dest, dest, dest);
|
||||
emit_dn(as, A64I_LSRx | A64F_IMMR(32)|A64F_IMMS(32), dest, dest);
|
||||
emit_dm(as, A64I_MOVw, tmp, dest);
|
||||
emit_dn(as, A64I_FMOV_R_D, dest, (key & 31));
|
||||
emit_dn(as, A64I_LSRx | A64F_IMMR(32)|A64F_IMMS(32), dest, tkey);
|
||||
emit_nm(as, A64I_FCMPZd, (key & 31), 0);
|
||||
emit_dn(as, A64I_FMOV_R_D, tkey, (key & 31));
|
||||
} else {
|
||||
checkmclim(as);
|
||||
emit_dm(as, A64I_MOVw, tmp, key);
|
||||
emit_dnm(as, A64I_EORw, dest, dest,
|
||||
ra_allock(as, irt_toitype(kt) << 15, allow));
|
||||
emit_dn(as, A64I_LSRx | A64F_IMMR(32)|A64F_IMMS(32), dest, dest);
|
||||
emit_dm(as, A64I_MOVx, dest, key);
|
||||
emit_dnm(as, A64I_EORw, tmp, key, dest);
|
||||
emit_dnm(as, A64I_EORx | A64F_SH(A64SH_LSR, 32), dest, type, key);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -912,7 +893,7 @@ static void asm_hrefk(ASMState *as, IRIns *ir)
|
||||
int bigofs = !emit_checkofs(A64I_LDRx, kofs);
|
||||
Reg dest = (ra_used(ir) || bigofs) ? ra_dest(as, ir, RSET_GPR) : RID_NONE;
|
||||
Reg node = ra_alloc1(as, ir->op1, RSET_GPR);
|
||||
Reg key, idx = node;
|
||||
Reg idx = node;
|
||||
RegSet allow = rset_exclude(RSET_GPR, node);
|
||||
uint64_t k;
|
||||
lj_assertA(ofs % sizeof(Node) == 0, "unaligned HREFK slot");
|
||||
@@ -931,9 +912,8 @@ static void asm_hrefk(ASMState *as, IRIns *ir)
|
||||
} else {
|
||||
k = ((uint64_t)irt_toitype(irkey->t) << 47) | (uint64_t)ir_kgc(irkey);
|
||||
}
|
||||
key = ra_scratch(as, allow);
|
||||
emit_nm(as, A64I_CMPx, key, ra_allock(as, k, rset_exclude(allow, key)));
|
||||
emit_lso(as, A64I_LDRx, key, idx, kofs);
|
||||
emit_nm(as, A64I_CMPx, RID_TMP, ra_allock(as, k, allow));
|
||||
emit_lso(as, A64I_LDRx, RID_TMP, idx, kofs);
|
||||
if (bigofs)
|
||||
emit_opk(as, A64I_ADDx, dest, node, ofs, rset_exclude(RSET_GPR, node));
|
||||
}
|
||||
@@ -946,18 +926,16 @@ static void asm_uref(ASMState *as, IRIns *ir)
|
||||
MRef *v = &gcref(fn->l.uvptr[(ir->op2 >> 8)])->uv.v;
|
||||
emit_lsptr(as, A64I_LDRx, dest, v);
|
||||
} else {
|
||||
Reg uv = ra_scratch(as, RSET_GPR);
|
||||
Reg func = ra_alloc1(as, ir->op1, RSET_GPR);
|
||||
if (ir->o == IR_UREFC) {
|
||||
asm_guardcc(as, CC_NE);
|
||||
emit_n(as, (A64I_CMPx^A64I_K12) | A64F_U12(1), RID_TMP);
|
||||
emit_opk(as, A64I_ADDx, dest, uv,
|
||||
asm_guardcnb(as, A64I_CBZ, RID_TMP);
|
||||
emit_opk(as, A64I_ADDx, dest, dest,
|
||||
(int32_t)offsetof(GCupval, tv), RSET_GPR);
|
||||
emit_lso(as, A64I_LDRB, RID_TMP, uv, (int32_t)offsetof(GCupval, closed));
|
||||
emit_lso(as, A64I_LDRB, RID_TMP, dest,
|
||||
(int32_t)offsetof(GCupval, closed));
|
||||
} else {
|
||||
emit_lso(as, A64I_LDRx, dest, uv, (int32_t)offsetof(GCupval, v));
|
||||
emit_lso(as, A64I_LDRx, dest, dest, (int32_t)offsetof(GCupval, v));
|
||||
}
|
||||
emit_lso(as, A64I_LDRx, uv, func,
|
||||
emit_lso(as, A64I_LDRx, dest, ra_alloc1(as, ir->op1, RSET_GPR),
|
||||
(int32_t)offsetof(GCfuncL, uvptr) + 8*(int32_t)(ir->op2 >> 8));
|
||||
}
|
||||
}
|
||||
@@ -1063,7 +1041,7 @@ static void asm_xstore(ASMState *as, IRIns *ir)
|
||||
|
||||
static void asm_ahuvload(ASMState *as, IRIns *ir)
|
||||
{
|
||||
Reg idx, tmp, type;
|
||||
Reg idx, tmp;
|
||||
int32_t ofs = 0;
|
||||
RegSet gpr = RSET_GPR, allow = irt_isnum(ir->t) ? RSET_FPR : RSET_GPR;
|
||||
lj_assertA(irt_isnum(ir->t) || irt_ispri(ir->t) || irt_isaddr(ir->t) ||
|
||||
@@ -1082,8 +1060,9 @@ static void asm_ahuvload(ASMState *as, IRIns *ir)
|
||||
} else {
|
||||
tmp = ra_scratch(as, gpr);
|
||||
}
|
||||
type = ra_scratch(as, rset_clear(gpr, tmp));
|
||||
idx = asm_fuseahuref(as, ir->op1, &ofs, rset_clear(gpr, type), A64I_LDRx);
|
||||
idx = asm_fuseahuref(as, ir->op1, &ofs, rset_clear(gpr, tmp), A64I_LDRx);
|
||||
rset_clear(gpr, idx);
|
||||
if (ofs & FUSE_REG) rset_clear(gpr, ofs & 31);
|
||||
if (ir->o == IR_VLOAD) ofs += 8 * ir->op2;
|
||||
/* Always do the type check, even if the load result is unused. */
|
||||
asm_guardcc(as, irt_isnum(ir->t) ? CC_LS : CC_NE);
|
||||
@@ -1091,10 +1070,10 @@ static void asm_ahuvload(ASMState *as, IRIns *ir)
|
||||
lj_assertA(irt_isinteger(ir->t) || irt_isnum(ir->t),
|
||||
"bad load type %d", irt_type(ir->t));
|
||||
emit_nm(as, A64I_CMPx | A64F_SH(A64SH_LSR, 32),
|
||||
ra_allock(as, LJ_TISNUM << 15, rset_exclude(gpr, idx)), tmp);
|
||||
ra_allock(as, LJ_TISNUM << 15, gpr), tmp);
|
||||
} else if (irt_isaddr(ir->t)) {
|
||||
emit_n(as, (A64I_CMNx^A64I_K12) | A64F_U12(-irt_toitype(ir->t)), type);
|
||||
emit_dn(as, A64I_ASRx | A64F_IMMR(47), type, tmp);
|
||||
emit_n(as, (A64I_CMNx^A64I_K12) | A64F_U12(-irt_toitype(ir->t)), RID_TMP);
|
||||
emit_dn(as, A64I_ASRx | A64F_IMMR(47), RID_TMP, tmp);
|
||||
} else if (irt_isnil(ir->t)) {
|
||||
emit_n(as, (A64I_CMNx^A64I_K12) | A64F_U12(1), tmp);
|
||||
} else {
|
||||
@@ -1217,9 +1196,8 @@ dotypecheck:
|
||||
emit_nm(as, A64I_CMPx,
|
||||
ra_allock(as, ~((int64_t)~irt_toitype(t) << 47) , allow), tmp);
|
||||
} else {
|
||||
Reg type = ra_scratch(as, allow);
|
||||
emit_n(as, (A64I_CMNx^A64I_K12) | A64F_U12(-irt_toitype(t)), type);
|
||||
emit_dn(as, A64I_ASRx | A64F_IMMR(47), type, tmp);
|
||||
emit_n(as, (A64I_CMNx^A64I_K12) | A64F_U12(-irt_toitype(t)), RID_TMP);
|
||||
emit_dn(as, A64I_ASRx | A64F_IMMR(47), RID_TMP, tmp);
|
||||
}
|
||||
emit_lso(as, A64I_LDRx, tmp, base, ofs);
|
||||
return;
|
||||
@@ -1289,8 +1267,9 @@ static void asm_tbar(ASMState *as, IRIns *ir)
|
||||
Reg link = ra_scratch(as, rset_exclude(RSET_GPR, tab));
|
||||
Reg mark = RID_TMP;
|
||||
MCLabel l_end = emit_label(as);
|
||||
emit_lso(as, A64I_STRx, link, tab, (int32_t)offsetof(GCtab, gclist));
|
||||
emit_lso(as, A64I_STRB, mark, tab, (int32_t)offsetof(GCtab, marked));
|
||||
/* Keep STRx in the middle to avoid LDP/STP fusion with surrounding code. */
|
||||
emit_lso(as, A64I_STRx, link, tab, (int32_t)offsetof(GCtab, gclist));
|
||||
emit_setgl(as, tab, gc.grayagain);
|
||||
emit_dn(as, A64I_ANDw^emit_isk13(~LJ_GC_BLACK, 0), mark, mark);
|
||||
emit_getgl(as, link, gc.grayagain);
|
||||
@@ -1304,7 +1283,6 @@ static void asm_obar(ASMState *as, IRIns *ir)
|
||||
const CCallInfo *ci = &lj_ir_callinfo[IRCALL_lj_gc_barrieruv];
|
||||
IRRef args[2];
|
||||
MCLabel l_end;
|
||||
RegSet allow = RSET_GPR;
|
||||
Reg obj, val, tmp;
|
||||
/* No need for other object barriers (yet). */
|
||||
lj_assertA(IR(ir->op1)->o == IR_UREFC, "bad OBAR type");
|
||||
@@ -1315,14 +1293,13 @@ static void asm_obar(ASMState *as, IRIns *ir)
|
||||
asm_gencall(as, ci, args);
|
||||
emit_dm(as, A64I_MOVx, ra_releasetmp(as, ASMREF_TMP1), RID_GL);
|
||||
obj = IR(ir->op1)->r;
|
||||
tmp = ra_scratch(as, rset_exclude(allow, obj));
|
||||
emit_cond_branch(as, CC_EQ, l_end);
|
||||
emit_n(as, A64I_TSTw^emit_isk13(LJ_GC_BLACK, 0), tmp);
|
||||
tmp = ra_scratch(as, rset_exclude(RSET_GPR, obj));
|
||||
emit_tnb(as, A64I_TBZ, tmp, lj_ffs(LJ_GC_BLACK), l_end);
|
||||
emit_cond_branch(as, CC_EQ, l_end);
|
||||
emit_n(as, A64I_TSTw^emit_isk13(LJ_GC_WHITES, 0), RID_TMP);
|
||||
val = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, obj));
|
||||
emit_lso(as, A64I_LDRB, tmp, obj,
|
||||
(int32_t)offsetof(GCupval, marked)-(int32_t)offsetof(GCupval, tv));
|
||||
(int32_t)offsetof(GCupval, marked)-(int32_t)offsetof(GCupval, tv));
|
||||
emit_lso(as, A64I_LDRB, RID_TMP, val, (int32_t)offsetof(GChead, marked));
|
||||
}
|
||||
|
||||
@@ -1364,12 +1341,12 @@ static int asm_swapops(ASMState *as, IRRef lref, IRRef rref)
|
||||
if (irref_isk(lref))
|
||||
return 1; /* But swap constants to the right. */
|
||||
ir = IR(rref);
|
||||
if ((ir->o >= IR_BSHL && ir->o <= IR_BSAR) ||
|
||||
if ((ir->o >= IR_BSHL && ir->o <= IR_BROR) ||
|
||||
(ir->o == IR_ADD && ir->op1 == ir->op2) ||
|
||||
(ir->o == IR_CONV && ir->op2 == ((IRT_I64<<IRCONV_DSH)|IRT_INT|IRCONV_SEXT)))
|
||||
return 0; /* Don't swap fusable operands to the left. */
|
||||
ir = IR(lref);
|
||||
if ((ir->o >= IR_BSHL && ir->o <= IR_BSAR) ||
|
||||
if ((ir->o >= IR_BSHL && ir->o <= IR_BROR) ||
|
||||
(ir->o == IR_ADD && ir->op1 == ir->op2) ||
|
||||
(ir->o == IR_CONV && ir->op2 == ((IRT_I64<<IRCONV_DSH)|IRT_INT|IRCONV_SEXT)))
|
||||
return 1; /* But swap fusable operands to the right. */
|
||||
@@ -1415,13 +1392,12 @@ static void asm_intneg(ASMState *as, IRIns *ir)
|
||||
static void asm_intmul(ASMState *as, IRIns *ir)
|
||||
{
|
||||
Reg dest = ra_dest(as, ir, RSET_GPR);
|
||||
Reg left = ra_alloc1(as, ir->op1, rset_exclude(RSET_GPR, dest));
|
||||
Reg left = ra_alloc1(as, ir->op1, RSET_GPR);
|
||||
Reg right = ra_alloc1(as, ir->op2, rset_exclude(RSET_GPR, left));
|
||||
if (irt_isguard(ir->t)) { /* IR_MULOV */
|
||||
asm_guardcc(as, CC_NE);
|
||||
emit_dm(as, A64I_MOVw, dest, dest); /* Zero-extend. */
|
||||
emit_nm(as, A64I_CMPw | A64F_SH(A64SH_ASR, 31), RID_TMP, dest);
|
||||
emit_dn(as, A64I_ASRx | A64F_IMMR(32), RID_TMP, dest);
|
||||
emit_nm(as, A64I_CMPx | A64F_EX(A64EX_SXTW), dest, dest);
|
||||
emit_dnm(as, A64I_SMULL, dest, right, left);
|
||||
} else {
|
||||
emit_dnm(as, irt_is64(ir->t) ? A64I_MULx : A64I_MULw, dest, left, right);
|
||||
@@ -1681,16 +1657,15 @@ static void asm_intcomp(ASMState *as, IRIns *ir)
|
||||
if (asm_swapops(as, blref, brref)) {
|
||||
Reg tmp = blref; blref = brref; brref = tmp;
|
||||
}
|
||||
bleft = ra_alloc1(as, blref, RSET_GPR);
|
||||
if (irref_isk(brref)) {
|
||||
uint64_t k = get_k64val(as, brref);
|
||||
if (k && !(k & (k-1)) && (cc == CC_EQ || cc == CC_NE)) {
|
||||
asm_guardtnb(as, cc == CC_EQ ? A64I_TBZ : A64I_TBNZ,
|
||||
ra_alloc1(as, blref, RSET_GPR), emit_ctz64(k));
|
||||
if (k && !(k & (k-1)) && (cc == CC_EQ || cc == CC_NE) &&
|
||||
asm_guardtnb(as, cc == CC_EQ ? A64I_TBZ : A64I_TBNZ, bleft,
|
||||
emit_ctz64(k)))
|
||||
return;
|
||||
}
|
||||
m2 = emit_isk13(k, irt_is64(irl->t));
|
||||
}
|
||||
bleft = ra_alloc1(as, blref, RSET_GPR);
|
||||
ai = (irt_is64(irl->t) ? A64I_TSTx : A64I_TSTw);
|
||||
if (!m2)
|
||||
m2 = asm_fuseopm(as, ai, brref, rset_exclude(RSET_GPR, bleft));
|
||||
@@ -1765,37 +1740,28 @@ static void asm_prof(ASMState *as, IRIns *ir)
|
||||
static void asm_stack_check(ASMState *as, BCReg topslot,
|
||||
IRIns *irp, RegSet allow, ExitNo exitno)
|
||||
{
|
||||
Reg pbase;
|
||||
uint32_t k;
|
||||
Reg pbase = RID_BASE;
|
||||
if (irp) {
|
||||
if (!ra_hasspill(irp->s)) {
|
||||
pbase = irp->r;
|
||||
lj_assertA(ra_hasreg(pbase), "base reg lost");
|
||||
} else if (allow) {
|
||||
pbase = rset_pickbot(allow);
|
||||
} else {
|
||||
pbase = RID_RET;
|
||||
emit_lso(as, A64I_LDRx, RID_RET, RID_SP, 0); /* Restore temp register. */
|
||||
}
|
||||
} else {
|
||||
pbase = RID_BASE;
|
||||
pbase = irp->r;
|
||||
if (!ra_hasreg(pbase))
|
||||
pbase = allow ? (0x40 | rset_pickbot(allow)) : (0xC0 | RID_RET);
|
||||
}
|
||||
emit_cond_branch(as, CC_LS, asm_exitstub_addr(as, exitno));
|
||||
if (pbase & 0x80) /* Restore temp. register. */
|
||||
emit_lso(as, A64I_LDRx, (pbase & 31), RID_SP, 0);
|
||||
k = emit_isk12((8*topslot));
|
||||
lj_assertA(k, "slot offset %d does not fit in K12", 8*topslot);
|
||||
emit_n(as, A64I_CMPx^k, RID_TMP);
|
||||
emit_dnm(as, A64I_SUBx, RID_TMP, RID_TMP, pbase);
|
||||
emit_dnm(as, A64I_SUBx, RID_TMP, RID_TMP, (pbase & 31));
|
||||
emit_lso(as, A64I_LDRx, RID_TMP, RID_TMP,
|
||||
(int32_t)offsetof(lua_State, maxstack));
|
||||
if (irp) { /* Must not spill arbitrary registers in head of side trace. */
|
||||
if (ra_hasspill(irp->s))
|
||||
emit_lso(as, A64I_LDRx, pbase, RID_SP, sps_scale(irp->s));
|
||||
emit_lso(as, A64I_LDRx, RID_TMP, RID_GL, glofs(as, &J2G(as->J)->cur_L));
|
||||
if (ra_hasspill(irp->s) && !allow)
|
||||
emit_lso(as, A64I_STRx, RID_RET, RID_SP, 0); /* Save temp register. */
|
||||
} else {
|
||||
emit_getgl(as, RID_TMP, cur_L);
|
||||
if (pbase & 0x40) {
|
||||
emit_getgl(as, (pbase & 31), jit_base);
|
||||
if (pbase & 0x80) /* Save temp register. */
|
||||
emit_lso(as, A64I_STRx, (pbase & 31), RID_SP, 0);
|
||||
}
|
||||
emit_getgl(as, RID_TMP, cur_L);
|
||||
}
|
||||
|
||||
/* Restore Lua stack from on-trace state. */
|
||||
@@ -1837,7 +1803,7 @@ static void asm_stack_restore(ASMState *as, SnapShot *snap)
|
||||
|
||||
/* Marker to prevent patching the GC check exit. */
|
||||
#define ARM64_NOPATCH_GC_CHECK \
|
||||
(A64I_ORRx|A64F_D(RID_TMP)|A64F_M(RID_TMP)|A64F_N(RID_TMP))
|
||||
(A64I_ORRx|A64F_D(RID_ZERO)|A64F_M(RID_ZERO)|A64F_N(RID_ZERO))
|
||||
|
||||
/* Check GC threshold and do one or more GC steps. */
|
||||
static void asm_gc_check(ASMState *as)
|
||||
@@ -1892,46 +1858,40 @@ static void asm_loop_tail_fixup(ASMState *as)
|
||||
|
||||
/* -- Head of trace ------------------------------------------------------- */
|
||||
|
||||
/* Reload L register from g->cur_L. */
|
||||
static void asm_head_lreg(ASMState *as)
|
||||
{
|
||||
IRIns *ir = IR(ASMREF_L);
|
||||
if (ra_used(ir)) {
|
||||
Reg r = ra_dest(as, ir, RSET_GPR);
|
||||
emit_getgl(as, r, cur_L);
|
||||
ra_evictk(as);
|
||||
}
|
||||
}
|
||||
|
||||
/* Coalesce BASE register for a root trace. */
|
||||
static void asm_head_root_base(ASMState *as)
|
||||
{
|
||||
IRIns *ir;
|
||||
asm_head_lreg(as);
|
||||
ir = IR(REF_BASE);
|
||||
if (ra_hasreg(ir->r) && (rset_test(as->modset, ir->r) || irt_ismarked(ir->t)))
|
||||
ra_spill(as, ir);
|
||||
ra_destreg(as, ir, RID_BASE);
|
||||
IRIns *ir = IR(REF_BASE);
|
||||
Reg r = ir->r;
|
||||
if (ra_hasreg(r)) {
|
||||
ra_free(as, r);
|
||||
if (rset_test(as->modset, r) || irt_ismarked(ir->t))
|
||||
ir->r = RID_INIT; /* No inheritance for modified BASE register. */
|
||||
if (r != RID_BASE)
|
||||
emit_movrr(as, ir, r, RID_BASE);
|
||||
}
|
||||
}
|
||||
|
||||
/* Coalesce BASE register for a side trace. */
|
||||
static Reg asm_head_side_base(ASMState *as, IRIns *irp)
|
||||
{
|
||||
IRIns *ir;
|
||||
asm_head_lreg(as);
|
||||
ir = IR(REF_BASE);
|
||||
if (ra_hasreg(ir->r) && (rset_test(as->modset, ir->r) || irt_ismarked(ir->t)))
|
||||
ra_spill(as, ir);
|
||||
if (ra_hasspill(irp->s)) {
|
||||
return ra_dest(as, ir, RSET_GPR);
|
||||
} else {
|
||||
Reg r = irp->r;
|
||||
lj_assertA(ra_hasreg(r), "base reg lost");
|
||||
if (r != ir->r && !rset_test(as->freeset, r))
|
||||
ra_restore(as, regcost_ref(as->cost[r]));
|
||||
ra_destreg(as, ir, r);
|
||||
return r;
|
||||
IRIns *ir = IR(REF_BASE);
|
||||
Reg r = ir->r;
|
||||
if (ra_hasreg(r)) {
|
||||
ra_free(as, r);
|
||||
if (rset_test(as->modset, r) || irt_ismarked(ir->t))
|
||||
ir->r = RID_INIT; /* No inheritance for modified BASE register. */
|
||||
if (irp->r == r) {
|
||||
return r; /* Same BASE register already coalesced. */
|
||||
} else if (ra_hasreg(irp->r) && rset_test(as->freeset, irp->r)) {
|
||||
/* Move from coalesced parent reg. */
|
||||
emit_movrr(as, ir, r, irp->r);
|
||||
return irp->r;
|
||||
} else {
|
||||
emit_getgl(as, r, jit_base); /* Otherwise reload BASE. */
|
||||
}
|
||||
}
|
||||
return RID_NONE;
|
||||
}
|
||||
|
||||
/* -- Tail of trace ------------------------------------------------------- */
|
||||
@@ -1975,19 +1935,41 @@ static void asm_tail_prep(ASMState *as)
|
||||
/* Ensure there are enough stack slots for call arguments. */
|
||||
static Reg asm_setup_call_slots(ASMState *as, IRIns *ir, const CCallInfo *ci)
|
||||
{
|
||||
IRRef args[CCI_NARGS_MAX*2];
|
||||
#if LJ_HASFFI
|
||||
uint32_t i, nargs = CCI_XNARGS(ci);
|
||||
int nslots = 0, ngpr = REGARG_NUMGPR, nfpr = REGARG_NUMFPR;
|
||||
asm_collectargs(as, ir, ci, args);
|
||||
for (i = 0; i < nargs; i++) {
|
||||
if (args[i] && irt_isfp(IR(args[i])->t)) {
|
||||
if (nfpr > 0) nfpr--; else nslots += 2;
|
||||
} else {
|
||||
if (ngpr > 0) ngpr--; else nslots += 2;
|
||||
if (nargs > (REGARG_NUMGPR < REGARG_NUMFPR ? REGARG_NUMGPR : REGARG_NUMFPR) ||
|
||||
(LJ_TARGET_OSX && (ci->flags & CCI_VARARG))) {
|
||||
IRRef args[CCI_NARGS_MAX*2];
|
||||
int ngpr = REGARG_NUMGPR, nfpr = REGARG_NUMFPR;
|
||||
int spofs = 0, spalign = LJ_TARGET_OSX ? 0 : 7, nslots;
|
||||
asm_collectargs(as, ir, ci, args);
|
||||
for (i = 0; i < nargs; i++) {
|
||||
int al = spalign;
|
||||
if (!args[i]) {
|
||||
#if LJ_TARGET_OSX
|
||||
/* Marker for start of varaargs. */
|
||||
nfpr = 0;
|
||||
ngpr = 0;
|
||||
spalign = 7;
|
||||
#endif
|
||||
} else if (irt_isfp(IR(args[i])->t)) {
|
||||
if (nfpr > 0) { nfpr--; continue; }
|
||||
#if LJ_TARGET_OSX
|
||||
al |= irt_isnum(IR(args[i])->t) ? 7 : 3;
|
||||
#endif
|
||||
} else {
|
||||
if (ngpr > 0) { ngpr--; continue; }
|
||||
#if LJ_TARGET_OSX
|
||||
al |= irt_size(IR(args[i])->t) - 1;
|
||||
#endif
|
||||
}
|
||||
spofs = (spofs + 2*al+1) & ~al; /* Align and bump stack pointer. */
|
||||
}
|
||||
nslots = (spofs + 3) >> 2;
|
||||
if (nslots > as->evenspill) /* Leave room for args in stack slots. */
|
||||
as->evenspill = nslots;
|
||||
}
|
||||
if (nslots > as->evenspill) /* Leave room for args in stack slots. */
|
||||
as->evenspill = nslots;
|
||||
#endif
|
||||
return REGSP_HINT(RID_RET);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** MIPS IR assembler (SSA IR -> machine code).
|
||||
** Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
/* -- Register allocator extensions --------------------------------------- */
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** PPC IR assembler (SSA IR -> machine code).
|
||||
** Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
/* -- Register allocator extensions --------------------------------------- */
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** x86/x64 IR assembler (SSA IR -> machine code).
|
||||
** Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
/* -- Guard handling ------------------------------------------------------ */
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Internal assertions.
|
||||
** Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#define lj_assert_c
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Bytecode instruction modes.
|
||||
** Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#define lj_bc_c
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Bytecode instruction format.
|
||||
** Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#ifndef _LJ_BC_H
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Bytecode dump definitions.
|
||||
** Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#ifndef _LJ_BCDUMP_H
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Bytecode reader.
|
||||
** Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#define lj_bcread_c
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Bytecode writer.
|
||||
** Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#define lj_bcwrite_c
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Buffer handling.
|
||||
** Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#define lj_buf_c
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** Buffer handling.
|
||||
** Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#ifndef _LJ_BUF_H
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
** C data arithmetic.
|
||||
** Copyright (C) 2005-2022 Mike Pall. See Copyright Notice in luajit.h
|
||||
** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h
|
||||
*/
|
||||
|
||||
#include "lj_obj.h"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user