1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-27 18:02:13 +03:00
This commit is contained in:
Sergei Golubchik
2016-06-21 16:02:35 +02:00
parent e7591a1ba9
commit 1592fbd332
58 changed files with 5849 additions and 4430 deletions

View File

@ -8,7 +8,7 @@ Email domain: cam.ac.uk
University of Cambridge Computing Service, University of Cambridge Computing Service,
Cambridge, England. Cambridge, England.
Copyright (c) 1997-2015 University of Cambridge Copyright (c) 1997-2016 University of Cambridge
All rights reserved All rights reserved
@ -19,7 +19,7 @@ Written by: Zoltan Herczeg
Email local part: hzmester Email local part: hzmester
Emain domain: freemail.hu Emain domain: freemail.hu
Copyright(c) 2010-2015 Zoltan Herczeg Copyright(c) 2010-2016 Zoltan Herczeg
All rights reserved. All rights reserved.
@ -30,7 +30,7 @@ Written by: Zoltan Herczeg
Email local part: hzmester Email local part: hzmester
Emain domain: freemail.hu Emain domain: freemail.hu
Copyright(c) 2009-2015 Zoltan Herczeg Copyright(c) 2009-2016 Zoltan Herczeg
All rights reserved. All rights reserved.

View File

@ -65,12 +65,15 @@
# so it has been removed. # so it has been removed.
# 2013-10-08 PH got rid of the "source" command, which is a bash-ism (use ".") # 2013-10-08 PH got rid of the "source" command, which is a bash-ism (use ".")
# 2013-11-05 PH added support for PARENS_NEST_LIMIT # 2013-11-05 PH added support for PARENS_NEST_LIMIT
# 2016-03-01 PH applied Chris Wilson's patch for MSVC static build
PROJECT(PCRE C CXX) PROJECT(PCRE C CXX)
# Increased minimum to 2.8.0 to support newer add_test features # Increased minimum to 2.8.0 to support newer add_test features. Set policy
# CMP0026 to avoid warnings for the use of LOCATION in GET_TARGET_PROPERTY.
CMAKE_MINIMUM_REQUIRED(VERSION 2.8.0) CMAKE_MINIMUM_REQUIRED(VERSION 2.8.0)
CMAKE_POLICY(SET CMP0026 OLD)
SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) # for FindReadline.cmake SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) # for FindReadline.cmake
@ -567,6 +570,20 @@ SET(PCREPOSIX_SOURCES
ENDIF (EXISTS ${PROJECT_SOURCE_DIR}/pcreposix.rc) ENDIF (EXISTS ${PROJECT_SOURCE_DIR}/pcreposix.rc)
ENDIF(MSVC AND NOT PCRE_STATIC) ENDIF(MSVC AND NOT PCRE_STATIC)
# Fix static compilation with MSVC: https://bugs.exim.org/show_bug.cgi?id=1681
# This code was taken from the CMake wiki, not from WebM.
IF(MSVC AND PCRE_STATIC)
MESSAGE(STATUS "** MSVC and PCRE_STATIC: modifying compiler flags to use static runtime library")
foreach(flag_var
CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
endforeach()
ENDIF(MSVC AND PCRE_STATIC)
SET(PCRECPP_HEADERS SET(PCRECPP_HEADERS
pcrecpp.h pcrecpp.h
pcre_scanner.h pcre_scanner.h

View File

@ -4,12 +4,104 @@ ChangeLog for PCRE
Note that the PCRE 8.xx series (PCRE1) is now in a bugfix-only state. All Note that the PCRE 8.xx series (PCRE1) is now in a bugfix-only state. All
development is happening in the PCRE2 10.xx series. development is happening in the PCRE2 10.xx series.
Version 8.39 14-June-2016
-------------------------
1. If PCRE_AUTO_CALLOUT was set on a pattern that had a (?# comment between
an item and its qualifier (for example, A(?#comment)?B) pcre_compile()
misbehaved. This bug was found by the LLVM fuzzer.
2. Similar to the above, if an isolated \E was present between an item and its
qualifier when PCRE_AUTO_CALLOUT was set, pcre_compile() misbehaved. This
bug was found by the LLVM fuzzer.
3. Further to 8.38/46, negated classes such as [^[:^ascii:]\d] were also not
working correctly in UCP mode.
4. The POSIX wrapper function regexec() crashed if the option REG_STARTEND
was set when the pmatch argument was NULL. It now returns REG_INVARG.
5. Allow for up to 32-bit numbers in the ordin() function in pcregrep.
6. An empty \Q\E sequence between an item and its qualifier caused
pcre_compile() to misbehave when auto callouts were enabled. This bug was
found by the LLVM fuzzer.
7. If a pattern that was compiled with PCRE_EXTENDED started with white
space or a #-type comment that was followed by (?-x), which turns off
PCRE_EXTENDED, and there was no subsequent (?x) to turn it on again,
pcre_compile() assumed that (?-x) applied to the whole pattern and
consequently mis-compiled it. This bug was found by the LLVM fuzzer.
8. A call of pcre_copy_named_substring() for a named substring whose number
was greater than the space in the ovector could cause a crash.
9. Yet another buffer overflow bug involved duplicate named groups with a
group that reset capture numbers (compare 8.38/7 below). Once again, I have
just allowed for more memory, even if not needed. (A proper fix is
implemented in PCRE2, but it involves a lot of refactoring.)
10. pcre_get_substring_list() crashed if the use of \K in a match caused the
start of the match to be earlier than the end.
11. Migrating appropriate PCRE2 JIT improvements to PCRE.
12. A pattern such as /(?<=((?C)0))/, which has a callout inside a lookbehind
assertion, caused pcretest to generate incorrect output, and also to read
uninitialized memory (detected by ASAN or valgrind).
13. A pattern that included (*ACCEPT) in the middle of a sufficiently deeply
nested set of parentheses of sufficient size caused an overflow of the
compiling workspace (which was diagnosed, but of course is not desirable).
14. And yet another buffer overflow bug involving duplicate named groups, this
time nested, with a nested back reference. Yet again, I have just allowed
for more memory, because anything more needs all the refactoring that has
been done for PCRE2. An example pattern that provoked this bug is:
/((?J)(?'R'(?'R'(?'R'(?'R'(?'R'(?|(\k'R'))))))))/ and the bug was
registered as CVE-2016-1283.
15. pcretest went into a loop if global matching was requested with an ovector
size less than 2. It now gives an error message. This bug was found by
afl-fuzz.
16. An invalid pattern fragment such as (?(?C)0 was not diagnosing an error
("assertion expected") when (?(?C) was not followed by an opening
parenthesis.
17. Fixed typo ("&&" for "&") in pcre_study(). Fortunately, this could not
actually affect anything, by sheer luck.
18. Applied Chris Wilson's patch (Bugzilla #1681) to CMakeLists.txt for MSVC
static compilation.
19. Modified the RunTest script to incorporate a valgrind suppressions file so
that certain errors, provoked by the SSE2 instruction set when JIT is used,
are ignored.
20. A racing condition is fixed in JIT reported by Mozilla.
21. Minor code refactor to avoid "array subscript is below array bounds"
compiler warning.
22. Minor code refactor to avoid "left shift of negative number" warning.
23. Fix typo causing compile error when 16- or 32-bit JIT is compiled without
UCP support.
24. Refactor to avoid compiler warnings in pcrecpp.cc.
25. Refactor to fix a typo in pcre_jit_test.c
26. Patch to support compiling pcrecpp.cc with Intel compiler.
Version 8.38 23-November-2015 Version 8.38 23-November-2015
----------------------------- -----------------------------
1. If a group that contained a recursive back reference also contained a 1. If a group that contained a recursive back reference also contained a
forward reference subroutine call followed by a non-forward-reference forward reference subroutine call followed by a non-forward-reference
subroutine call, for example /.((?2)(?R)\1)()/, pcre2_compile() failed to subroutine call, for example /.((?2)(?R)\1)()/, pcre_compile() failed to
compile correct code, leading to undefined behaviour or an internally compile correct code, leading to undefined behaviour or an internally
detected error. This bug was discovered by the LLVM fuzzer. detected error. This bug was discovered by the LLVM fuzzer.

View File

@ -25,7 +25,7 @@ Email domain: cam.ac.uk
University of Cambridge Computing Service, University of Cambridge Computing Service,
Cambridge, England. Cambridge, England.
Copyright (c) 1997-2015 University of Cambridge Copyright (c) 1997-2016 University of Cambridge
All rights reserved. All rights reserved.
@ -36,7 +36,7 @@ Written by: Zoltan Herczeg
Email local part: hzmester Email local part: hzmester
Emain domain: freemail.hu Emain domain: freemail.hu
Copyright(c) 2010-2015 Zoltan Herczeg Copyright(c) 2010-2016 Zoltan Herczeg
All rights reserved. All rights reserved.
@ -47,7 +47,7 @@ Written by: Zoltan Herczeg
Email local part: hzmester Email local part: hzmester
Emain domain: freemail.hu Emain domain: freemail.hu
Copyright(c) 2009-2015 Zoltan Herczeg Copyright(c) 2009-2016 Zoltan Herczeg
All rights reserved. All rights reserved.

View File

@ -613,6 +613,7 @@ EXTRA_DIST += \
testdata/testoutput25 \ testdata/testoutput25 \
testdata/testoutput26 \ testdata/testoutput26 \
testdata/testoutputEBC \ testdata/testoutputEBC \
testdata/valgrind-jit.supp \
testdata/wintestinput3 \ testdata/wintestinput3 \
testdata/wintestoutput3 \ testdata/wintestoutput3 \
perltest.pl perltest.pl

View File

@ -1070,9 +1070,9 @@ EXTRA_DIST = m4/ax_pthread.m4 m4/pcre_visibility.m4 doc/perltest.txt \
testdata/testoutput22-16 testdata/testoutput22-32 \ testdata/testoutput22-16 testdata/testoutput22-32 \
testdata/testoutput23 testdata/testoutput24 \ testdata/testoutput23 testdata/testoutput24 \
testdata/testoutput25 testdata/testoutput26 \ testdata/testoutput25 testdata/testoutput26 \
testdata/testoutputEBC testdata/wintestinput3 \ testdata/testoutputEBC testdata/valgrind-jit.supp \
testdata/wintestoutput3 perltest.pl pcredemo.c $(pcrecpp_man) \ testdata/wintestinput3 testdata/wintestoutput3 perltest.pl \
cmake/COPYING-CMAKE-SCRIPTS \ pcredemo.c $(pcrecpp_man) cmake/COPYING-CMAKE-SCRIPTS \
cmake/FindPackageHandleStandardArgs.cmake \ cmake/FindPackageHandleStandardArgs.cmake \
cmake/FindReadline.cmake cmake/FindEditline.cmake \ cmake/FindReadline.cmake cmake/FindEditline.cmake \
CMakeLists.txt config-cmake.h.in CMakeLists.txt config-cmake.h.in

View File

@ -1,6 +1,15 @@
News about PCRE releases News about PCRE releases
------------------------ ------------------------
Release 8.39 14-June-2016
-------------------------
Some appropriate PCRE2 JIT improvements have been retro-fitted to PCRE1. Apart
from that, this is another bug-fix release. Note that this library (now called
PCRE1) is now being maintained for bug fixes only. New projects are advised to
use the new PCRE2 libraries.
Release 8.38 23-November-2015 Release 8.38 23-November-2015
----------------------------- -----------------------------

View File

@ -67,6 +67,15 @@ fi
./pcretest -C utf >/dev/null ./pcretest -C utf >/dev/null
utf8=$? utf8=$?
# We need valgrind suppressions when JIT is in use. (This isn't perfect because
# some tests are run with -no-jit, but as PCRE1 is in maintenance only, I have
# not bothered about that.)
./pcretest -C jit >/dev/null
if [ $? -eq 1 -a "$valgrind" != "" ] ; then
valgrind="$valgrind --suppressions=./testdata/valgrind-jit.supp"
fi
echo "Testing pcregrep main features" echo "Testing pcregrep main features"
echo "---------------------------- Test 1 ------------------------------" >testtrygrep echo "---------------------------- Test 1 ------------------------------" >testtrygrep

View File

@ -178,6 +178,7 @@ nojit=
sim= sim=
skip= skip=
valgrind= valgrind=
vjs=
# This is in case the caller has set aliases (as I do - PH) # This is in case the caller has set aliases (as I do - PH)
unset cp ls mv rm unset cp ls mv rm
@ -357,6 +358,9 @@ $sim ./pcretest -C jit >/dev/null
jit=$? jit=$?
if [ $jit -ne 0 -a "$nojit" != "yes" ] ; then if [ $jit -ne 0 -a "$nojit" != "yes" ] ; then
jitopt=-s+ jitopt=-s+
if [ "$valgrind" != "" ] ; then
vjs="--suppressions=$testdata/valgrind-jit.supp"
fi
fi fi
# If no specific tests were requested, select all. Those that are not # If no specific tests were requested, select all. Those that are not
@ -423,7 +427,7 @@ for bmode in "$test8" "$test16" "$test32"; do
if [ $do1 = yes ] ; then if [ $do1 = yes ] ; then
echo $title1 echo $title1
for opt in "" "-s" $jitopt; do for opt in "" "-s" $jitopt; do
$sim $valgrind ./pcretest -q $bmode $opt $testdata/testinput1 testtry $sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput1 testtry
if [ $? = 0 ] ; then if [ $? = 0 ] ; then
$cf $testdata/testoutput1 testtry $cf $testdata/testoutput1 testtry
if [ $? != 0 ] ; then exit 1; fi if [ $? != 0 ] ; then exit 1; fi
@ -441,7 +445,7 @@ fi
if [ $do2 = yes ] ; then if [ $do2 = yes ] ; then
echo $title2 "(not UTF-$bits)" echo $title2 "(not UTF-$bits)"
for opt in "" "-s" $jitopt; do for opt in "" "-s" $jitopt; do
$sim $valgrind ./pcretest -q $bmode $opt $testdata/testinput2 testtry $sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput2 testtry
if [ $? = 0 ] ; then if [ $? = 0 ] ; then
$cf $testdata/testoutput2 testtry $cf $testdata/testoutput2 testtry
if [ $? != 0 ] ; then exit 1; fi if [ $? != 0 ] ; then exit 1; fi
@ -504,7 +508,7 @@ if [ $do3 = yes ] ; then
if [ "$locale" != "" ] ; then if [ "$locale" != "" ] ; then
echo $title3 "(using '$locale' locale)" echo $title3 "(using '$locale' locale)"
for opt in "" "-s" $jitopt; do for opt in "" "-s" $jitopt; do
$sim $valgrind ./pcretest -q $bmode $opt $infile testtry $sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $infile testtry
if [ $? = 0 ] ; then if [ $? = 0 ] ; then
if $cf $outfile testtry >teststdout || \ if $cf $outfile testtry >teststdout || \
$cf $outfile2 testtry >teststdout || \ $cf $outfile2 testtry >teststdout || \
@ -540,7 +544,7 @@ if [ $do4 = yes ] ; then
echo " Skipped because UTF-$bits support is not available" echo " Skipped because UTF-$bits support is not available"
else else
for opt in "" "-s" $jitopt; do for opt in "" "-s" $jitopt; do
$sim $valgrind ./pcretest -q $bmode $opt $testdata/testinput4 testtry $sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput4 testtry
if [ $? = 0 ] ; then if [ $? = 0 ] ; then
$cf $testdata/testoutput4 testtry $cf $testdata/testoutput4 testtry
if [ $? != 0 ] ; then exit 1; fi if [ $? != 0 ] ; then exit 1; fi
@ -560,7 +564,7 @@ if [ $do5 = yes ] ; then
echo " Skipped because UTF-$bits support is not available" echo " Skipped because UTF-$bits support is not available"
else else
for opt in "" "-s" $jitopt; do for opt in "" "-s" $jitopt; do
$sim $valgrind ./pcretest -q $bmode $opt $testdata/testinput5 testtry $sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput5 testtry
if [ $? = 0 ] ; then if [ $? = 0 ] ; then
$cf $testdata/testoutput5 testtry $cf $testdata/testoutput5 testtry
if [ $? != 0 ] ; then exit 1; fi if [ $? != 0 ] ; then exit 1; fi
@ -580,7 +584,7 @@ if [ $do6 = yes ] ; then
echo " Skipped because Unicode property support is not available" echo " Skipped because Unicode property support is not available"
else else
for opt in "" "-s" $jitopt; do for opt in "" "-s" $jitopt; do
$sim $valgrind ./pcretest -q $bmode $opt $testdata/testinput6 testtry $sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput6 testtry
if [ $? = 0 ] ; then if [ $? = 0 ] ; then
$cf $testdata/testoutput6 testtry $cf $testdata/testoutput6 testtry
if [ $? != 0 ] ; then exit 1; fi if [ $? != 0 ] ; then exit 1; fi
@ -602,7 +606,7 @@ if [ $do7 = yes ] ; then
echo " Skipped because Unicode property support is not available" echo " Skipped because Unicode property support is not available"
else else
for opt in "" "-s" $jitopt; do for opt in "" "-s" $jitopt; do
$sim $valgrind ./pcretest -q $bmode $opt $testdata/testinput7 testtry $sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput7 testtry
if [ $? = 0 ] ; then if [ $? = 0 ] ; then
$cf $testdata/testoutput7 testtry $cf $testdata/testoutput7 testtry
if [ $? != 0 ] ; then exit 1; fi if [ $? != 0 ] ; then exit 1; fi
@ -698,7 +702,7 @@ if [ $do12 = yes ] ; then
if [ $jit -eq 0 -o "$nojit" = "yes" ] ; then if [ $jit -eq 0 -o "$nojit" = "yes" ] ; then
echo " Skipped because JIT is not available or not usable" echo " Skipped because JIT is not available or not usable"
else else
$sim $valgrind ./pcretest -q $bmode $testdata/testinput12 testtry $sim $valgrind $vjs ./pcretest -q $bmode $testdata/testinput12 testtry
if [ $? = 0 ] ; then if [ $? = 0 ] ; then
$cf $testdata/testoutput12 testtry $cf $testdata/testoutput12 testtry
if [ $? != 0 ] ; then exit 1; fi if [ $? != 0 ] ; then exit 1; fi
@ -735,7 +739,7 @@ if [ "$do14" = yes ] ; then
cp -f $testdata/saved16 testsaved16 cp -f $testdata/saved16 testsaved16
cp -f $testdata/saved32 testsaved32 cp -f $testdata/saved32 testsaved32
for opt in "" "-s" $jitopt; do for opt in "" "-s" $jitopt; do
$sim $valgrind ./pcretest -q $bmode $opt $testdata/testinput14 testtry $sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput14 testtry
if [ $? = 0 ] ; then if [ $? = 0 ] ; then
$cf $testdata/testoutput14 testtry $cf $testdata/testoutput14 testtry
if [ $? != 0 ] ; then exit 1; fi if [ $? != 0 ] ; then exit 1; fi
@ -759,7 +763,7 @@ if [ "$do15" = yes ] ; then
echo " Skipped because UTF-$bits support is not available" echo " Skipped because UTF-$bits support is not available"
else else
for opt in "" "-s" $jitopt; do for opt in "" "-s" $jitopt; do
$sim $valgrind ./pcretest -q $bmode $opt $testdata/testinput15 testtry $sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput15 testtry
if [ $? = 0 ] ; then if [ $? = 0 ] ; then
$cf $testdata/testoutput15 testtry $cf $testdata/testoutput15 testtry
if [ $? != 0 ] ; then exit 1; fi if [ $? != 0 ] ; then exit 1; fi
@ -783,7 +787,7 @@ if [ $do16 = yes ] ; then
echo " Skipped because Unicode property support is not available" echo " Skipped because Unicode property support is not available"
else else
for opt in "" "-s" $jitopt; do for opt in "" "-s" $jitopt; do
$sim $valgrind ./pcretest -q $bmode $opt $testdata/testinput16 testtry $sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput16 testtry
if [ $? = 0 ] ; then if [ $? = 0 ] ; then
$cf $testdata/testoutput16 testtry $cf $testdata/testoutput16 testtry
if [ $? != 0 ] ; then exit 1; fi if [ $? != 0 ] ; then exit 1; fi
@ -805,7 +809,7 @@ if [ $do17 = yes ] ; then
echo " Skipped when running 8-bit tests" echo " Skipped when running 8-bit tests"
else else
for opt in "" "-s" $jitopt; do for opt in "" "-s" $jitopt; do
$sim $valgrind ./pcretest -q $bmode $opt $testdata/testinput17 testtry $sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput17 testtry
if [ $? = 0 ] ; then if [ $? = 0 ] ; then
$cf $testdata/testoutput17 testtry $cf $testdata/testoutput17 testtry
if [ $? != 0 ] ; then exit 1; fi if [ $? != 0 ] ; then exit 1; fi
@ -829,7 +833,7 @@ if [ $do18 = yes ] ; then
echo " Skipped because UTF-$bits support is not available" echo " Skipped because UTF-$bits support is not available"
else else
for opt in "" "-s" $jitopt; do for opt in "" "-s" $jitopt; do
$sim $valgrind ./pcretest -q $bmode $opt $testdata/testinput18 testtry $sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput18 testtry
if [ $? = 0 ] ; then if [ $? = 0 ] ; then
$cf $testdata/testoutput18-$bits testtry $cf $testdata/testoutput18-$bits testtry
if [ $? != 0 ] ; then exit 1; fi if [ $? != 0 ] ; then exit 1; fi
@ -853,7 +857,7 @@ if [ $do19 = yes ] ; then
echo " Skipped because Unicode property support is not available" echo " Skipped because Unicode property support is not available"
else else
for opt in "" "-s" $jitopt; do for opt in "" "-s" $jitopt; do
$sim $valgrind ./pcretest -q $bmode $opt $testdata/testinput19 testtry $sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput19 testtry
if [ $? = 0 ] ; then if [ $? = 0 ] ; then
$cf $testdata/testoutput19 testtry $cf $testdata/testoutput19 testtry
if [ $? != 0 ] ; then exit 1; fi if [ $? != 0 ] ; then exit 1; fi

4
pcre/aclocal.m4 vendored
View File

@ -21,7 +21,7 @@ If you have problems, you may need to regenerate the build system entirely.
To do so, use the procedure documented by the package, typically 'autoreconf'.])]) To do so, use the procedure documented by the package, typically 'autoreconf'.])])
dnl pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- dnl pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
dnl serial 11 (pkg-config-0.29) dnl serial 11 (pkg-config-0.29.1)
dnl dnl
dnl Copyright © 2004 Scott James Remnant <scott@netsplit.com>. dnl Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
dnl Copyright © 2012-2015 Dan Nicholson <dbn.lists@gmail.com> dnl Copyright © 2012-2015 Dan Nicholson <dbn.lists@gmail.com>
@ -63,7 +63,7 @@ dnl
dnl See the "Since" comment for each macro you use to see what version dnl See the "Since" comment for each macro you use to see what version
dnl of the macros you require. dnl of the macros you require.
m4_defun([PKG_PREREQ], m4_defun([PKG_PREREQ],
[m4_define([PKG_MACROS_VERSION], [0.29]) [m4_define([PKG_MACROS_VERSION], [0.29.1])
m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1,
[m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])])
])dnl PKG_PREREQ ])dnl PKG_PREREQ

View File

@ -235,7 +235,7 @@ sure both macros are undefined; an emulation function will then be used. */
#define PACKAGE_NAME "PCRE" #define PACKAGE_NAME "PCRE"
/* Define to the full name and version of this package. */ /* Define to the full name and version of this package. */
#define PACKAGE_STRING "PCRE 8.38" #define PACKAGE_STRING "PCRE 8.39"
/* Define to the one symbol short name of this package. */ /* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "pcre" #define PACKAGE_TARNAME "pcre"
@ -244,7 +244,7 @@ sure both macros are undefined; an emulation function will then be used. */
#define PACKAGE_URL "" #define PACKAGE_URL ""
/* Define to the version of this package. */ /* Define to the version of this package. */
#define PACKAGE_VERSION "8.38" #define PACKAGE_VERSION "8.39"
/* The value of PARENS_NEST_LIMIT specifies the maximum depth of nested /* The value of PARENS_NEST_LIMIT specifies the maximum depth of nested
parentheses (of any kind) in a pattern. This limits the amount of system parentheses (of any kind) in a pattern. This limits the amount of system
@ -336,7 +336,7 @@ sure both macros are undefined; an emulation function will then be used. */
/* #undef SUPPORT_VALGRIND */ /* #undef SUPPORT_VALGRIND */
/* Version number of package */ /* Version number of package */
#define VERSION "8.38" #define VERSION "8.39"
/* Define to empty if `const' does not conform to ANSI C. */ /* Define to empty if `const' does not conform to ANSI C. */
/* #undef const */ /* #undef const */

32
pcre/configure vendored
View File

@ -1,6 +1,6 @@
#! /bin/sh #! /bin/sh
# Guess values for system-dependent variables and create Makefiles. # Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.69 for PCRE 8.38. # Generated by GNU Autoconf 2.69 for PCRE 8.39.
# #
# #
# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
@ -587,8 +587,8 @@ MAKEFLAGS=
# Identity of this package. # Identity of this package.
PACKAGE_NAME='PCRE' PACKAGE_NAME='PCRE'
PACKAGE_TARNAME='pcre' PACKAGE_TARNAME='pcre'
PACKAGE_VERSION='8.38' PACKAGE_VERSION='8.39'
PACKAGE_STRING='PCRE 8.38' PACKAGE_STRING='PCRE 8.39'
PACKAGE_BUGREPORT='' PACKAGE_BUGREPORT=''
PACKAGE_URL='' PACKAGE_URL=''
@ -1418,7 +1418,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing. # Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh. # This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF cat <<_ACEOF
\`configure' configures PCRE 8.38 to adapt to many kinds of systems. \`configure' configures PCRE 8.39 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]... Usage: $0 [OPTION]... [VAR=VALUE]...
@ -1488,7 +1488,7 @@ fi
if test -n "$ac_init_help"; then if test -n "$ac_init_help"; then
case $ac_init_help in case $ac_init_help in
short | recursive ) echo "Configuration of PCRE 8.38:";; short | recursive ) echo "Configuration of PCRE 8.39:";;
esac esac
cat <<\_ACEOF cat <<\_ACEOF
@ -1662,7 +1662,7 @@ fi
test -n "$ac_init_help" && exit $ac_status test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then if $ac_init_version; then
cat <<\_ACEOF cat <<\_ACEOF
PCRE configure 8.38 PCRE configure 8.39
generated by GNU Autoconf 2.69 generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc. Copyright (C) 2012 Free Software Foundation, Inc.
@ -2419,7 +2419,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake. running configure, to aid debugging if configure makes a mistake.
It was created by PCRE $as_me 8.38, which was It was created by PCRE $as_me 8.39, which was
generated by GNU Autoconf 2.69. Invocation command line was generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@ $ $0 $@
@ -3283,7 +3283,7 @@ fi
# Define the identity of the package. # Define the identity of the package.
PACKAGE='pcre' PACKAGE='pcre'
VERSION='8.38' VERSION='8.39'
cat >>confdefs.h <<_ACEOF cat >>confdefs.h <<_ACEOF
@ -17634,9 +17634,9 @@ _ACEOF
# Versioning # Versioning
PCRE_MAJOR="8" PCRE_MAJOR="8"
PCRE_MINOR="38" PCRE_MINOR="39"
PCRE_PRERELEASE="" PCRE_PRERELEASE=""
PCRE_DATE="2015-11-23" PCRE_DATE="2016-06-14"
if test "$PCRE_MINOR" = "08" -o "$PCRE_MINOR" = "09" if test "$PCRE_MINOR" = "08" -o "$PCRE_MINOR" = "09"
then then
@ -19658,16 +19658,16 @@ esac
# (Note: The libpcre*_version bits are m4 variables, assigned above) # (Note: The libpcre*_version bits are m4 variables, assigned above)
EXTRA_LIBPCRE_LDFLAGS="$EXTRA_LIBPCRE_LDFLAGS \ EXTRA_LIBPCRE_LDFLAGS="$EXTRA_LIBPCRE_LDFLAGS \
$NO_UNDEFINED -version-info 3:6:2" $NO_UNDEFINED -version-info 3:7:2"
EXTRA_LIBPCRE16_LDFLAGS="$EXTRA_LIBPCRE16_LDFLAGS \ EXTRA_LIBPCRE16_LDFLAGS="$EXTRA_LIBPCRE16_LDFLAGS \
$NO_UNDEFINED -version-info 2:6:2" $NO_UNDEFINED -version-info 2:7:2"
EXTRA_LIBPCRE32_LDFLAGS="$EXTRA_LIBPCRE32_LDFLAGS \ EXTRA_LIBPCRE32_LDFLAGS="$EXTRA_LIBPCRE32_LDFLAGS \
$NO_UNDEFINED -version-info 0:6:0" $NO_UNDEFINED -version-info 0:7:0"
EXTRA_LIBPCREPOSIX_LDFLAGS="$EXTRA_LIBPCREPOSIX_LDFLAGS \ EXTRA_LIBPCREPOSIX_LDFLAGS="$EXTRA_LIBPCREPOSIX_LDFLAGS \
$NO_UNDEFINED -version-info 0:3:0" $NO_UNDEFINED -version-info 0:4:0"
EXTRA_LIBPCRECPP_LDFLAGS="$EXTRA_LIBPCRECPP_LDFLAGS \ EXTRA_LIBPCRECPP_LDFLAGS="$EXTRA_LIBPCRECPP_LDFLAGS \
$NO_UNDEFINED -version-info 0:1:0 \ $NO_UNDEFINED -version-info 0:1:0 \
@ -20719,7 +20719,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their # report actual input values of CONFIG_FILES etc. instead of their
# values after options handling. # values after options handling.
ac_log=" ac_log="
This file was extended by PCRE $as_me 8.38, which was This file was extended by PCRE $as_me 8.39, which was
generated by GNU Autoconf 2.69. Invocation command line was generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES CONFIG_FILES = $CONFIG_FILES
@ -20785,7 +20785,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\ ac_cs_version="\\
PCRE config.status 8.38 PCRE config.status 8.39
configured by $0, generated by GNU Autoconf 2.69, configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\" with options \\"\$ac_cs_config\\"

View File

@ -9,18 +9,18 @@ dnl The PCRE_PRERELEASE feature is for identifying release candidates. It might
dnl be defined as -RC2, for example. For real releases, it should be empty. dnl be defined as -RC2, for example. For real releases, it should be empty.
m4_define(pcre_major, [8]) m4_define(pcre_major, [8])
m4_define(pcre_minor, [38]) m4_define(pcre_minor, [39])
m4_define(pcre_prerelease, []) m4_define(pcre_prerelease, [])
m4_define(pcre_date, [2015-11-23]) m4_define(pcre_date, [2016-06-14])
# NOTE: The CMakeLists.txt file searches for the above variables in the first # NOTE: The CMakeLists.txt file searches for the above variables in the first
# 50 lines of this file. Please update that if the variables above are moved. # 50 lines of this file. Please update that if the variables above are moved.
# Libtool shared library interface versions (current:revision:age) # Libtool shared library interface versions (current:revision:age)
m4_define(libpcre_version, [3:6:2]) m4_define(libpcre_version, [3:7:2])
m4_define(libpcre16_version, [2:6:2]) m4_define(libpcre16_version, [2:7:2])
m4_define(libpcre32_version, [0:6:0]) m4_define(libpcre32_version, [0:7:0])
m4_define(libpcreposix_version, [0:3:0]) m4_define(libpcreposix_version, [0:4:0])
m4_define(libpcrecpp_version, [0:1:0]) m4_define(libpcrecpp_version, [0:1:0])
AC_PREREQ(2.57) AC_PREREQ(2.57)

View File

@ -315,9 +315,8 @@ documentation for details of how to do this. It is a non-standard way of
building PCRE, for use in environments that have limited stacks. Because of the building PCRE, for use in environments that have limited stacks. Because of the
greater use of memory management, it runs more slowly. Separate functions are greater use of memory management, it runs more slowly. Separate functions are
provided so that special-purpose external code can be used for this case. When provided so that special-purpose external code can be used for this case. When
used, these functions are always called in a stack-like manner (last obtained, used, these functions always allocate memory blocks of the same size. There is
first freed), and always for memory blocks of the same size. There is a a discussion about PCRE's stack usage in the
discussion about PCRE's stack usage in the
<a href="pcrestack.html"><b>pcrestack</b></a> <a href="pcrestack.html"><b>pcrestack</b></a>
documentation. documentation.
</P> </P>
@ -2913,9 +2912,9 @@ Cambridge CB2 3QH, England.
</P> </P>
<br><a name="SEC26" href="#TOC1">REVISION</a><br> <br><a name="SEC26" href="#TOC1">REVISION</a><br>
<P> <P>
Last updated: 09 February 2014 Last updated: 18 December 2015
<br> <br>
Copyright &copy; 1997-2014 University of Cambridge. Copyright &copy; 1997-2015 University of Cambridge.
<br> <br>
<p> <p>
Return to the <a href="index.html">PCRE index page</a>. Return to the <a href="index.html">PCRE index page</a>.

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,4 @@
.TH PCREAPI 3 "09 February 2014" "PCRE 8.35" .TH PCREAPI 3 "18 December 2015" "PCRE 8.39"
.SH NAME .SH NAME
PCRE - Perl-compatible regular expressions PCRE - Perl-compatible regular expressions
.sp .sp
@ -273,9 +273,8 @@ documentation for details of how to do this. It is a non-standard way of
building PCRE, for use in environments that have limited stacks. Because of the building PCRE, for use in environments that have limited stacks. Because of the
greater use of memory management, it runs more slowly. Separate functions are greater use of memory management, it runs more slowly. Separate functions are
provided so that special-purpose external code can be used for this case. When provided so that special-purpose external code can be used for this case. When
used, these functions are always called in a stack-like manner (last obtained, used, these functions always allocate memory blocks of the same size. There is
first freed), and always for memory blocks of the same size. There is a a discussion about PCRE's stack usage in the
discussion about PCRE's stack usage in the
.\" HREF .\" HREF
\fBpcrestack\fP \fBpcrestack\fP
.\" .\"
@ -2914,6 +2913,6 @@ Cambridge CB2 3QH, England.
.rs .rs
.sp .sp
.nf .nf
Last updated: 09 February 2014 Last updated: 18 December 2015
Copyright (c) 1997-2014 University of Cambridge. Copyright (c) 1997-2015 University of Cambridge.
.fi .fi

View File

@ -42,9 +42,9 @@ POSSIBILITY OF SUCH DAMAGE.
/* The current PCRE version information. */ /* The current PCRE version information. */
#define PCRE_MAJOR 8 #define PCRE_MAJOR 8
#define PCRE_MINOR 38 #define PCRE_MINOR 39
#define PCRE_PRERELEASE #define PCRE_PRERELEASE
#define PCRE_DATE 2015-11-23 #define PCRE_DATE 2016-06-14
/* When an application links to a PCRE DLL in Windows, the symbols that are /* When an application links to a PCRE DLL in Windows, the symbols that are
imported have to be identified as such. When building PCRE, the appropriate imported have to be identified as such. When building PCRE, the appropriate

View File

@ -6,7 +6,7 @@
and semantics are as close as possible to those of the Perl 5 language. and semantics are as close as possible to those of the Perl 5 language.
Written by Philip Hazel Written by Philip Hazel
Copyright (c) 1997-2014 University of Cambridge Copyright (c) 1997-2016 University of Cambridge
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
@ -485,7 +485,7 @@ static const char error_texts[] =
"lookbehind assertion is not fixed length\0" "lookbehind assertion is not fixed length\0"
"malformed number or name after (?(\0" "malformed number or name after (?(\0"
"conditional group contains more than two branches\0" "conditional group contains more than two branches\0"
"assertion expected after (?(\0" "assertion expected after (?( or (?(?C)\0"
"(?R or (?[+-]digits must be followed by )\0" "(?R or (?[+-]digits must be followed by )\0"
/* 30 */ /* 30 */
"unknown POSIX class name\0" "unknown POSIX class name\0"
@ -560,6 +560,7 @@ static const char error_texts[] =
/* 85 */ /* 85 */
"parentheses are too deeply nested (stack check)\0" "parentheses are too deeply nested (stack check)\0"
"digits missing in \\x{} or \\o{}\0" "digits missing in \\x{} or \\o{}\0"
"regular expression is too complicated\0"
; ;
/* Table to identify digits and hex digits. This is used when compiling /* Table to identify digits and hex digits. This is used when compiling
@ -4566,6 +4567,10 @@ for (;; ptr++)
pcre_uint32 ec; pcre_uint32 ec;
pcre_uchar mcbuffer[8]; pcre_uchar mcbuffer[8];
/* Come here to restart the loop without advancing the pointer. */
REDO_LOOP:
/* Get next character in the pattern */ /* Get next character in the pattern */
c = *ptr; c = *ptr;
@ -4591,7 +4596,8 @@ for (;; ptr++)
if (code > cd->start_workspace + cd->workspace_size - if (code > cd->start_workspace + cd->workspace_size -
WORK_SIZE_SAFETY_MARGIN) /* Check for overrun */ WORK_SIZE_SAFETY_MARGIN) /* Check for overrun */
{ {
*errorcodeptr = ERR52; *errorcodeptr = (code >= cd->start_workspace + cd->workspace_size)?
ERR52 : ERR87;
goto FAILED; goto FAILED;
} }
@ -4645,9 +4651,10 @@ for (;; ptr++)
goto FAILED; goto FAILED;
} }
/* If in \Q...\E, check for the end; if not, we have a literal */ /* If in \Q...\E, check for the end; if not, we have a literal. Otherwise an
isolated \E is ignored. */
if (inescq && c != CHAR_NULL) if (c != CHAR_NULL)
{ {
if (c == CHAR_BACKSLASH && ptr[1] == CHAR_E) if (c == CHAR_BACKSLASH && ptr[1] == CHAR_E)
{ {
@ -4655,7 +4662,7 @@ for (;; ptr++)
ptr++; ptr++;
continue; continue;
} }
else else if (inescq)
{ {
if (previous_callout != NULL) if (previous_callout != NULL)
{ {
@ -4670,18 +4677,27 @@ for (;; ptr++)
} }
goto NORMAL_CHAR; goto NORMAL_CHAR;
} }
/* Control does not reach here. */
/* Check for the start of a \Q...\E sequence. We must do this here rather
than later in case it is immediately followed by \E, which turns it into a
"do nothing" sequence. */
if (c == CHAR_BACKSLASH && ptr[1] == CHAR_Q)
{
inescq = TRUE;
ptr++;
continue;
}
} }
/* In extended mode, skip white space and comments. We need a loop in order /* In extended mode, skip white space and comments. */
to check for more white space and more comments after a comment. */
if ((options & PCRE_EXTENDED) != 0) if ((options & PCRE_EXTENDED) != 0)
{ {
for (;;) const pcre_uchar *wscptr = ptr;
while (MAX_255(c) && (cd->ctypes[c] & ctype_space) != 0) c = *(++ptr);
if (c == CHAR_NUMBER_SIGN)
{ {
while (MAX_255(c) && (cd->ctypes[c] & ctype_space) != 0) c = *(++ptr);
if (c != CHAR_NUMBER_SIGN) break;
ptr++; ptr++;
while (*ptr != CHAR_NULL) while (*ptr != CHAR_NULL)
{ {
@ -4695,8 +4711,29 @@ for (;; ptr++)
if (utf) FORWARDCHAR(ptr); if (utf) FORWARDCHAR(ptr);
#endif #endif
} }
c = *ptr; /* Either NULL or the char after a newline */
} }
/* If we skipped any characters, restart the loop. Otherwise, we didn't see
a comment. */
if (ptr > wscptr) goto REDO_LOOP;
}
/* Skip over (?# comments. We need to do this here because we want to know if
the next thing is a quantifier, and these comments may come between an item
and its quantifier. */
if (c == CHAR_LEFT_PARENTHESIS && ptr[1] == CHAR_QUESTION_MARK &&
ptr[2] == CHAR_NUMBER_SIGN)
{
ptr += 3;
while (*ptr != CHAR_NULL && *ptr != CHAR_RIGHT_PARENTHESIS) ptr++;
if (*ptr == CHAR_NULL)
{
*errorcodeptr = ERR18;
goto FAILED;
}
continue;
} }
/* See if the next thing is a quantifier. */ /* See if the next thing is a quantifier. */
@ -4820,15 +4857,15 @@ for (;; ptr++)
if (STRNCMP_UC_C8(ptr+1, STRING_WEIRD_STARTWORD, 6) == 0) if (STRNCMP_UC_C8(ptr+1, STRING_WEIRD_STARTWORD, 6) == 0)
{ {
nestptr = ptr + 7; nestptr = ptr + 7;
ptr = sub_start_of_word - 1; ptr = sub_start_of_word;
continue; goto REDO_LOOP;
} }
if (STRNCMP_UC_C8(ptr+1, STRING_WEIRD_ENDWORD, 6) == 0) if (STRNCMP_UC_C8(ptr+1, STRING_WEIRD_ENDWORD, 6) == 0)
{ {
nestptr = ptr + 7; nestptr = ptr + 7;
ptr = sub_end_of_word - 1; ptr = sub_end_of_word;
continue; goto REDO_LOOP;
} }
/* Handle a real character class. */ /* Handle a real character class. */
@ -5046,20 +5083,22 @@ for (;; ptr++)
ptr = tempptr + 1; ptr = tempptr + 1;
continue; continue;
/* For the other POSIX classes (ascii, xdigit) we are going to fall /* For the other POSIX classes (ascii, cntrl, xdigit) we are going
through to the non-UCP case and build a bit map for characters with to fall through to the non-UCP case and build a bit map for
code points less than 256. If we are in a negated POSIX class characters with code points less than 256. If we are in a negated
within a non-negated overall class, characters with code points POSIX class, characters with code points greater than 255 must
greater than 255 must all match. In the special case where we have either all match or all not match. In the special case where we
not yet generated any xclass data, and this is the final item in have not yet generated any xclass data, and this is the final item
the overall class, we need do nothing: later on, the opcode in the overall class, we need do nothing: later on, the opcode
OP_NCLASS will be used to indicate that characters greater than 255 OP_NCLASS will be used to indicate that characters greater than 255
are acceptable. If we have already seen an xclass item or one may are acceptable. If we have already seen an xclass item or one may
follow (we have to assume that it might if this is not the end of follow (we have to assume that it might if this is not the end of
the class), explicitly match all wide codepoints. */ the class), explicitly list all wide codepoints, which will then
either not match or match, depending on whether the class is or is
not negated. */
default: default:
if (!negate_class && local_negate && if (local_negate &&
(xclass || tempptr[2] != CHAR_RIGHT_SQUARE_BRACKET)) (xclass || tempptr[2] != CHAR_RIGHT_SQUARE_BRACKET))
{ {
*class_uchardata++ = XCL_RANGE; *class_uchardata++ = XCL_RANGE;
@ -6529,21 +6568,6 @@ for (;; ptr++)
case CHAR_LEFT_PARENTHESIS: case CHAR_LEFT_PARENTHESIS:
ptr++; ptr++;
/* First deal with comments. Putting this code right at the start ensures
that comments have no bad side effects. */
if (ptr[0] == CHAR_QUESTION_MARK && ptr[1] == CHAR_NUMBER_SIGN)
{
ptr += 2;
while (*ptr != CHAR_NULL && *ptr != CHAR_RIGHT_PARENTHESIS) ptr++;
if (*ptr == CHAR_NULL)
{
*errorcodeptr = ERR18;
goto FAILED;
}
continue;
}
/* Now deal with various "verbs" that can be introduced by '*'. */ /* Now deal with various "verbs" that can be introduced by '*'. */
if (ptr[0] == CHAR_ASTERISK && (ptr[1] == ':' if (ptr[0] == CHAR_ASTERISK && (ptr[1] == ':'
@ -6604,8 +6628,21 @@ for (;; ptr++)
cd->had_accept = TRUE; cd->had_accept = TRUE;
for (oc = cd->open_caps; oc != NULL; oc = oc->next) for (oc = cd->open_caps; oc != NULL; oc = oc->next)
{ {
*code++ = OP_CLOSE; if (lengthptr != NULL)
PUT2INC(code, 0, oc->number); {
#ifdef COMPILE_PCRE8
*lengthptr += 1 + IMM2_SIZE;
#elif defined COMPILE_PCRE16
*lengthptr += 2 + IMM2_SIZE;
#elif defined COMPILE_PCRE32
*lengthptr += 4 + IMM2_SIZE;
#endif
}
else
{
*code++ = OP_CLOSE;
PUT2INC(code, 0, oc->number);
}
} }
setverb = *code++ = setverb = *code++ =
(cd->assert_depth > 0)? OP_ASSERT_ACCEPT : OP_ACCEPT; (cd->assert_depth > 0)? OP_ASSERT_ACCEPT : OP_ACCEPT;
@ -6734,6 +6771,15 @@ for (;; ptr++)
for (i = 3;; i++) if (!IS_DIGIT(ptr[i])) break; for (i = 3;; i++) if (!IS_DIGIT(ptr[i])) break;
if (ptr[i] == CHAR_RIGHT_PARENTHESIS) if (ptr[i] == CHAR_RIGHT_PARENTHESIS)
tempptr += i + 1; tempptr += i + 1;
/* tempptr should now be pointing to the opening parenthesis of the
assertion condition. */
if (*tempptr != CHAR_LEFT_PARENTHESIS)
{
*errorcodeptr = ERR28;
goto FAILED;
}
} }
/* For conditions that are assertions, check the syntax, and then exit /* For conditions that are assertions, check the syntax, and then exit
@ -7258,7 +7304,7 @@ for (;; ptr++)
issue is fixed "properly" in PCRE2. As PCRE1 is now in maintenance issue is fixed "properly" in PCRE2. As PCRE1 is now in maintenance
only mode, we finesse the bug by allowing more memory always. */ only mode, we finesse the bug by allowing more memory always. */
*lengthptr += 2 + 2*LINK_SIZE; *lengthptr += 4 + 4*LINK_SIZE;
/* It is even worse than that. The current reference may be to an /* It is even worse than that. The current reference may be to an
existing named group with a different number (so apparently not existing named group with a different number (so apparently not
@ -7274,7 +7320,12 @@ for (;; ptr++)
so far in order to get the number. If the name is not found, leave so far in order to get the number. If the name is not found, leave
the value of recno as 0 for a forward reference. */ the value of recno as 0 for a forward reference. */
else /* This patch (removing "else") fixes a problem when a reference is
to multiple identically named nested groups from within the nest.
Once again, it is not the "proper" fix, and it results in an
over-allocation of memory. */
/* else */
{ {
ng = cd->named_groups; ng = cd->named_groups;
for (i = 0; i < cd->names_found; i++, ng++) for (i = 0; i < cd->names_found; i++, ng++)
@ -7585,39 +7636,15 @@ for (;; ptr++)
newoptions = (options | set) & (~unset); newoptions = (options | set) & (~unset);
/* If the options ended with ')' this is not the start of a nested /* If the options ended with ')' this is not the start of a nested
group with option changes, so the options change at this level. If this group with option changes, so the options change at this level.
item is right at the start of the pattern, the options can be
abstracted and made external in the pre-compile phase, and ignored in
the compile phase. This can be helpful when matching -- for instance in
caseless checking of required bytes.
If the code pointer is not (cd->start_code + 1 + LINK_SIZE), we are
definitely *not* at the start of the pattern because something has been
compiled. In the pre-compile phase, however, the code pointer can have
that value after the start, because it gets reset as code is discarded
during the pre-compile. However, this can happen only at top level - if
we are within parentheses, the starting BRA will still be present. At
any parenthesis level, the length value can be used to test if anything
has been compiled at that level. Thus, a test for both these conditions
is necessary to ensure we correctly detect the start of the pattern in
both phases.
If we are not at the pattern start, reset the greedy defaults and the If we are not at the pattern start, reset the greedy defaults and the
case value for firstchar and reqchar. */ case value for firstchar and reqchar. */
if (*ptr == CHAR_RIGHT_PARENTHESIS) if (*ptr == CHAR_RIGHT_PARENTHESIS)
{ {
if (code == cd->start_code + 1 + LINK_SIZE && greedy_default = ((newoptions & PCRE_UNGREEDY) != 0);
(lengthptr == NULL || *lengthptr == 2 + 2*LINK_SIZE)) greedy_non_default = greedy_default ^ 1;
{ req_caseopt = ((newoptions & PCRE_CASELESS) != 0)? REQ_CASELESS:0;
cd->external_options = newoptions;
}
else
{
greedy_default = ((newoptions & PCRE_UNGREEDY) != 0);
greedy_non_default = greedy_default ^ 1;
req_caseopt = ((newoptions & PCRE_CASELESS) != 0)? REQ_CASELESS:0;
}
/* Change options at this level, and pass them back for use /* Change options at this level, and pass them back for use
in subsequent branches. */ in subsequent branches. */
@ -7896,16 +7923,6 @@ for (;; ptr++)
c = ec; c = ec;
else else
{ {
if (escape == ESC_Q) /* Handle start of quoted string */
{
if (ptr[1] == CHAR_BACKSLASH && ptr[2] == CHAR_E)
ptr += 2; /* avoid empty string */
else inescq = TRUE;
continue;
}
if (escape == ESC_E) continue; /* Perl ignores an orphan \E */
/* For metasequences that actually match a character, we disable the /* For metasequences that actually match a character, we disable the
setting of a first character if it hasn't already been set. */ setting of a first character if it hasn't already been set. */

View File

@ -250,6 +250,7 @@ Arguments:
code the compiled regex code the compiled regex
stringname the name of the capturing substring stringname the name of the capturing substring
ovector the vector of matched substrings ovector the vector of matched substrings
stringcount number of captured substrings
Returns: the number of the first that is set, Returns: the number of the first that is set,
or the number of the last one if none are set, or the number of the last one if none are set,
@ -258,13 +259,16 @@ Returns: the number of the first that is set,
#if defined COMPILE_PCRE8 #if defined COMPILE_PCRE8
static int static int
get_first_set(const pcre *code, const char *stringname, int *ovector) get_first_set(const pcre *code, const char *stringname, int *ovector,
int stringcount)
#elif defined COMPILE_PCRE16 #elif defined COMPILE_PCRE16
static int static int
get_first_set(const pcre16 *code, PCRE_SPTR16 stringname, int *ovector) get_first_set(const pcre16 *code, PCRE_SPTR16 stringname, int *ovector,
int stringcount)
#elif defined COMPILE_PCRE32 #elif defined COMPILE_PCRE32
static int static int
get_first_set(const pcre32 *code, PCRE_SPTR32 stringname, int *ovector) get_first_set(const pcre32 *code, PCRE_SPTR32 stringname, int *ovector,
int stringcount)
#endif #endif
{ {
const REAL_PCRE *re = (const REAL_PCRE *)code; const REAL_PCRE *re = (const REAL_PCRE *)code;
@ -295,7 +299,7 @@ if (entrysize <= 0) return entrysize;
for (entry = (pcre_uchar *)first; entry <= (pcre_uchar *)last; entry += entrysize) for (entry = (pcre_uchar *)first; entry <= (pcre_uchar *)last; entry += entrysize)
{ {
int n = GET2(entry, 0); int n = GET2(entry, 0);
if (ovector[n*2] >= 0) return n; if (n < stringcount && ovector[n*2] >= 0) return n;
} }
return GET2(entry, 0); return GET2(entry, 0);
} }
@ -402,7 +406,7 @@ pcre32_copy_named_substring(const pcre32 *code, PCRE_SPTR32 subject,
PCRE_UCHAR32 *buffer, int size) PCRE_UCHAR32 *buffer, int size)
#endif #endif
{ {
int n = get_first_set(code, stringname, ovector); int n = get_first_set(code, stringname, ovector, stringcount);
if (n <= 0) return n; if (n <= 0) return n;
#if defined COMPILE_PCRE8 #if defined COMPILE_PCRE8
return pcre_copy_substring(subject, ovector, stringcount, n, buffer, size); return pcre_copy_substring(subject, ovector, stringcount, n, buffer, size);
@ -457,7 +461,10 @@ pcre_uchar **stringlist;
pcre_uchar *p; pcre_uchar *p;
for (i = 0; i < double_count; i += 2) for (i = 0; i < double_count; i += 2)
size += sizeof(pcre_uchar *) + IN_UCHARS(ovector[i+1] - ovector[i] + 1); {
size += sizeof(pcre_uchar *) + IN_UCHARS(1);
if (ovector[i+1] > ovector[i]) size += IN_UCHARS(ovector[i+1] - ovector[i]);
}
stringlist = (pcre_uchar **)(PUBL(malloc))(size); stringlist = (pcre_uchar **)(PUBL(malloc))(size);
if (stringlist == NULL) return PCRE_ERROR_NOMEMORY; if (stringlist == NULL) return PCRE_ERROR_NOMEMORY;
@ -473,7 +480,7 @@ p = (pcre_uchar *)(stringlist + stringcount + 1);
for (i = 0; i < double_count; i += 2) for (i = 0; i < double_count; i += 2)
{ {
int len = ovector[i+1] - ovector[i]; int len = (ovector[i+1] > ovector[i])? (ovector[i+1] - ovector[i]) : 0;
memcpy(p, subject + ovector[i], IN_UCHARS(len)); memcpy(p, subject + ovector[i], IN_UCHARS(len));
*stringlist++ = p; *stringlist++ = p;
p += len; p += len;
@ -619,7 +626,7 @@ pcre32_get_named_substring(const pcre32 *code, PCRE_SPTR32 subject,
PCRE_SPTR32 *stringptr) PCRE_SPTR32 *stringptr)
#endif #endif
{ {
int n = get_first_set(code, stringname, ovector); int n = get_first_set(code, stringname, ovector, stringcount);
if (n <= 0) return n; if (n <= 0) return n;
#if defined COMPILE_PCRE8 #if defined COMPILE_PCRE8
return pcre_get_substring(subject, ovector, stringcount, n, stringptr); return pcre_get_substring(subject, ovector, stringcount, n, stringptr);

View File

@ -7,7 +7,7 @@
and semantics are as close as possible to those of the Perl 5 language. and semantics are as close as possible to those of the Perl 5 language.
Written by Philip Hazel Written by Philip Hazel
Copyright (c) 1997-2014 University of Cambridge Copyright (c) 1997-2016 University of Cambridge
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
@ -275,7 +275,7 @@ pcre.h(.in) and disable (comment out) this message. */
typedef pcre_uint16 pcre_uchar; typedef pcre_uint16 pcre_uchar;
#define UCHAR_SHIFT (1) #define UCHAR_SHIFT (1)
#define IN_UCHARS(x) ((x) << UCHAR_SHIFT) #define IN_UCHARS(x) ((x) * 2)
#define MAX_255(c) ((c) <= 255u) #define MAX_255(c) ((c) <= 255u)
#define TABLE_GET(c, table, default) (MAX_255(c)? ((table)[c]):(default)) #define TABLE_GET(c, table, default) (MAX_255(c)? ((table)[c]):(default))
@ -283,7 +283,7 @@ typedef pcre_uint16 pcre_uchar;
typedef pcre_uint32 pcre_uchar; typedef pcre_uint32 pcre_uchar;
#define UCHAR_SHIFT (2) #define UCHAR_SHIFT (2)
#define IN_UCHARS(x) ((x) << UCHAR_SHIFT) #define IN_UCHARS(x) ((x) * 4)
#define MAX_255(c) ((c) <= 255u) #define MAX_255(c) ((c) <= 255u)
#define TABLE_GET(c, table, default) (MAX_255(c)? ((table)[c]):(default)) #define TABLE_GET(c, table, default) (MAX_255(c)? ((table)[c]):(default))
@ -2289,7 +2289,7 @@ enum { ERR0, ERR1, ERR2, ERR3, ERR4, ERR5, ERR6, ERR7, ERR8, ERR9,
ERR50, ERR51, ERR52, ERR53, ERR54, ERR55, ERR56, ERR57, ERR58, ERR59, ERR50, ERR51, ERR52, ERR53, ERR54, ERR55, ERR56, ERR57, ERR58, ERR59,
ERR60, ERR61, ERR62, ERR63, ERR64, ERR65, ERR66, ERR67, ERR68, ERR69, ERR60, ERR61, ERR62, ERR63, ERR64, ERR65, ERR66, ERR67, ERR68, ERR69,
ERR70, ERR71, ERR72, ERR73, ERR74, ERR75, ERR76, ERR77, ERR78, ERR79, ERR70, ERR71, ERR72, ERR73, ERR74, ERR75, ERR76, ERR77, ERR78, ERR79,
ERR80, ERR81, ERR82, ERR83, ERR84, ERR85, ERR86, ERRCOUNT }; ERR80, ERR81, ERR82, ERR83, ERR84, ERR85, ERR86, ERR87, ERRCOUNT };
/* JIT compiling modes. The function list is indexed by them. */ /* JIT compiling modes. The function list is indexed by them. */

File diff suppressed because it is too large Load Diff

View File

@ -242,13 +242,17 @@ static struct regression_test_case regression_test_cases[] = {
{ MA, 0, "a\\z", "aaa" }, { MA, 0, "a\\z", "aaa" },
{ MA, 0 | F_NOMATCH, "a\\z", "aab" }, { MA, 0 | F_NOMATCH, "a\\z", "aab" },
/* Brackets. */ /* Brackets and alternatives. */
{ MUA, 0, "(ab|bb|cd)", "bacde" }, { MUA, 0, "(ab|bb|cd)", "bacde" },
{ MUA, 0, "(?:ab|a)(bc|c)", "ababc" }, { MUA, 0, "(?:ab|a)(bc|c)", "ababc" },
{ MUA, 0, "((ab|(cc))|(bb)|(?:cd|efg))", "abac" }, { MUA, 0, "((ab|(cc))|(bb)|(?:cd|efg))", "abac" },
{ CMUA, 0, "((aB|(Cc))|(bB)|(?:cd|EFg))", "AcCe" }, { CMUA, 0, "((aB|(Cc))|(bB)|(?:cd|EFg))", "AcCe" },
{ MUA, 0, "((ab|(cc))|(bb)|(?:cd|ebg))", "acebebg" }, { MUA, 0, "((ab|(cc))|(bb)|(?:cd|ebg))", "acebebg" },
{ MUA, 0, "(?:(a)|(?:b))(cc|(?:d|e))(a|b)k", "accabdbbccbk" }, { MUA, 0, "(?:(a)|(?:b))(cc|(?:d|e))(a|b)k", "accabdbbccbk" },
{ MUA, 0, "\xc7\x82|\xc6\x82", "\xf1\x83\x82\x82\xc7\x82\xc7\x83" },
{ MUA, 0, "=\xc7\x82|#\xc6\x82", "\xf1\x83\x82\x82=\xc7\x82\xc7\x83" },
{ MUA, 0, "\xc7\x82\xc7\x83|\xc6\x82\xc6\x82", "\xf1\x83\x82\x82\xc7\x82\xc7\x83" },
{ MUA, 0, "\xc6\x82\xc6\x82|\xc7\x83\xc7\x83|\xc8\x84\xc8\x84", "\xf1\x83\x82\x82\xc8\x84\xc8\x84" },
/* Greedy and non-greedy ? operators. */ /* Greedy and non-greedy ? operators. */
{ MUA, 0, "(?:a)?a", "laab" }, { MUA, 0, "(?:a)?a", "laab" },
@ -318,6 +322,14 @@ static struct regression_test_case regression_test_cases[] = {
{ CMUA, 0, "[^\xe1\xbd\xb8][^\xc3\xa9]", "\xe1\xbd\xb8\xe1\xbf\xb8\xc3\xa9\xc3\x89#" }, { CMUA, 0, "[^\xe1\xbd\xb8][^\xc3\xa9]", "\xe1\xbd\xb8\xe1\xbf\xb8\xc3\xa9\xc3\x89#" },
{ MUA, 0, "[^\xe1\xbd\xb8][^\xc3\xa9]", "\xe1\xbd\xb8\xe1\xbf\xb8\xc3\xa9\xc3\x89#" }, { MUA, 0, "[^\xe1\xbd\xb8][^\xc3\xa9]", "\xe1\xbd\xb8\xe1\xbf\xb8\xc3\xa9\xc3\x89#" },
{ MUA, 0, "[^\xe1\xbd\xb8]{3,}?", "##\xe1\xbd\xb8#\xe1\xbd\xb8#\xc3\x89#\xe1\xbd\xb8" }, { MUA, 0, "[^\xe1\xbd\xb8]{3,}?", "##\xe1\xbd\xb8#\xe1\xbd\xb8#\xc3\x89#\xe1\xbd\xb8" },
{ MUA, 0, "\\d+123", "987654321,01234" },
{ MUA, 0, "abcd*|\\w+xy", "aaaaa,abxyz" },
{ MUA, 0, "(?:abc|((?:amc|\\b\\w*xy)))", "aaaaa,abxyz" },
{ MUA, 0, "a(?R)|([a-z]++)#", ".abcd.abcd#."},
{ MUA, 0, "a(?R)|([a-z]++)#", ".abcd.mbcd#."},
{ MUA, 0, ".[ab]*.", "xx" },
{ MUA, 0, ".[ab]*a", "xxa" },
{ MUA, 0, ".[ab]?.", "xx" },
/* Bracket repeats with limit. */ /* Bracket repeats with limit. */
{ MUA, 0, "(?:(ab){2}){5}M", "abababababababababababM" }, { MUA, 0, "(?:(ab){2}){5}M", "abababababababababababM" },
@ -574,6 +586,16 @@ static struct regression_test_case regression_test_cases[] = {
{ MUA, 0, "(?:(?=.)??[a-c])+m", "abacdcbacacdcaccam" }, { MUA, 0, "(?:(?=.)??[a-c])+m", "abacdcbacacdcaccam" },
{ MUA, 0, "((?!a)?(?!([^a]))?)+$", "acbab" }, { MUA, 0, "((?!a)?(?!([^a]))?)+$", "acbab" },
{ MUA, 0, "((?!a)?\?(?!([^a]))?\?)+$", "acbab" }, { MUA, 0, "((?!a)?\?(?!([^a]))?\?)+$", "acbab" },
{ MUA, 0, "a(?=(?C)\\B)b", "ab" },
{ MUA, 0, "a(?!(?C)\\B)bb|ab", "abb" },
{ MUA, 0, "a(?=\\b|(?C)\\B)b", "ab" },
{ MUA, 0, "a(?!\\b|(?C)\\B)bb|ab", "abb" },
{ MUA, 0, "c(?(?=(?C)\\B)ab|a)", "cab" },
{ MUA, 0, "c(?(?!(?C)\\B)ab|a)", "cab" },
{ MUA, 0, "c(?(?=\\b|(?C)\\B)ab|a)", "cab" },
{ MUA, 0, "c(?(?!\\b|(?C)\\B)ab|a)", "cab" },
{ MUA, 0, "a(?=)b", "ab" },
{ MUA, 0 | F_NOMATCH, "a(?!)b", "ab" },
/* Not empty, ACCEPT, FAIL */ /* Not empty, ACCEPT, FAIL */
{ MUA | PCRE_NOTEMPTY, 0 | F_NOMATCH, "a*", "bcx" }, { MUA | PCRE_NOTEMPTY, 0 | F_NOMATCH, "a*", "bcx" },
@ -664,6 +686,7 @@ static struct regression_test_case regression_test_cases[] = {
{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_CRLF | PCRE_FIRSTLINE, 1, ".", "\r\n" }, { PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_CRLF | PCRE_FIRSTLINE, 1, ".", "\r\n" },
{ PCRE_FIRSTLINE | PCRE_NEWLINE_LF | PCRE_DOTALL, 0 | F_NOMATCH, "ab.", "ab" }, { PCRE_FIRSTLINE | PCRE_NEWLINE_LF | PCRE_DOTALL, 0 | F_NOMATCH, "ab.", "ab" },
{ MUA | PCRE_FIRSTLINE, 1 | F_NOMATCH, "^[a-d0-9]", "\nxx\nd" }, { MUA | PCRE_FIRSTLINE, 1 | F_NOMATCH, "^[a-d0-9]", "\nxx\nd" },
{ PCRE_NEWLINE_ANY | PCRE_FIRSTLINE | PCRE_DOTALL, 0, "....a", "012\n0a" },
/* Recurse. */ /* Recurse. */
{ MUA, 0, "(a)(?1)", "aa" }, { MUA, 0, "(a)(?1)", "aa" },
@ -798,6 +821,9 @@ static struct regression_test_case regression_test_cases[] = {
/* (*SKIP) verb. */ /* (*SKIP) verb. */
{ MUA, 0 | F_NOMATCH, "(?=a(*SKIP)b)ab|ad", "ad" }, { MUA, 0 | F_NOMATCH, "(?=a(*SKIP)b)ab|ad", "ad" },
{ MUA, 0, "(\\w+(*SKIP)#)", "abcd,xyz#," },
{ MUA, 0, "\\w+(*SKIP)#|mm", "abcd,xyz#," },
{ MUA, 0 | F_NOMATCH, "b+(?<=(*SKIP)#c)|b+", "#bbb" },
/* (*THEN) verb. */ /* (*THEN) verb. */
{ MUA, 0, "((?:a(*THEN)|aab)(*THEN)c|a+)+m", "aabcaabcaabcaabcnacm" }, { MUA, 0, "((?:a(*THEN)|aab)(*THEN)c|a+)+m", "aabcaabcaabcaabcnacm" },
@ -1534,10 +1560,10 @@ static int regression_tests(void)
is_successful = 0; is_successful = 0;
} }
#endif #endif
#if defined SUPPORT_PCRE16 && defined SUPPORT_PCRE16 #if defined SUPPORT_PCRE16 && defined SUPPORT_PCRE32
if (ovector16_1[i] != ovector16_2[i] || ovector16_1[i] != ovector16_1[i] || ovector16_1[i] != ovector16_2[i]) { if (ovector16_1[i] != ovector16_2[i] || ovector16_1[i] != ovector32_1[i] || ovector16_1[i] != ovector32_2[i]) {
printf("\n16 and 16 bit: Ovector[%d] value differs(J16:%d,I16:%d,J32:%d,I32:%d): [%d] '%s' @ '%s' \n", printf("\n16 and 32 bit: Ovector[%d] value differs(J16:%d,I16:%d,J32:%d,I32:%d): [%d] '%s' @ '%s' \n",
i, ovector16_1[i], ovector16_2[i], ovector16_1[i], ovector16_2[i], i, ovector16_1[i], ovector16_2[i], ovector32_1[i], ovector32_2[i],
total, current->pattern, current->input); total, current->pattern, current->input);
is_successful = 0; is_successful = 0;
} }

View File

@ -1371,7 +1371,7 @@ do
for (c = 0; c < 16; c++) start_bits[c] |= map[c]; for (c = 0; c < 16; c++) start_bits[c] |= map[c];
for (c = 128; c < 256; c++) for (c = 128; c < 256; c++)
{ {
if ((map[c/8] && (1 << (c&7))) != 0) if ((map[c/8] & (1 << (c&7))) != 0)
{ {
int d = (c >> 6) | 0xc0; /* Set bit for this starter */ int d = (c >> 6) | 0xc0; /* Set bit for this starter */
start_bits[d/8] |= (1 << (d&7)); /* and then skip on to the */ start_bits[d/8] |= (1 << (d&7)); /* and then skip on to the */

View File

@ -66,7 +66,7 @@ Arg RE::no_arg((void*)NULL);
// inclusive test if we ever needed it. (Note that not only the // inclusive test if we ever needed it. (Note that not only the
// __attribute__ syntax, but also __USER_LABEL_PREFIX__, are // __attribute__ syntax, but also __USER_LABEL_PREFIX__, are
// gnu-specific.) // gnu-specific.)
#if defined(__GNUC__) && __GNUC__ >= 3 && defined(__ELF__) #if defined(__GNUC__) && __GNUC__ >= 3 && defined(__ELF__) && !defined(__INTEL_COMPILER)
# define ULP_AS_STRING(x) ULP_AS_STRING_INTERNAL(x) # define ULP_AS_STRING(x) ULP_AS_STRING_INTERNAL(x)
# define ULP_AS_STRING_INTERNAL(x) #x # define ULP_AS_STRING_INTERNAL(x) #x
# define USER_LABEL_PREFIX_STR ULP_AS_STRING(__USER_LABEL_PREFIX__) # define USER_LABEL_PREFIX_STR ULP_AS_STRING(__USER_LABEL_PREFIX__)
@ -168,22 +168,22 @@ bool RE::FullMatch(const StringPiece& text,
const Arg& ptr16) const { const Arg& ptr16) const {
const Arg* args[kMaxArgs]; const Arg* args[kMaxArgs];
int n = 0; int n = 0;
if (&ptr1 == &no_arg) goto done; args[n++] = &ptr1; if (&ptr1 == &no_arg) { goto done; } args[n++] = &ptr1;
if (&ptr2 == &no_arg) goto done; args[n++] = &ptr2; if (&ptr2 == &no_arg) { goto done; } args[n++] = &ptr2;
if (&ptr3 == &no_arg) goto done; args[n++] = &ptr3; if (&ptr3 == &no_arg) { goto done; } args[n++] = &ptr3;
if (&ptr4 == &no_arg) goto done; args[n++] = &ptr4; if (&ptr4 == &no_arg) { goto done; } args[n++] = &ptr4;
if (&ptr5 == &no_arg) goto done; args[n++] = &ptr5; if (&ptr5 == &no_arg) { goto done; } args[n++] = &ptr5;
if (&ptr6 == &no_arg) goto done; args[n++] = &ptr6; if (&ptr6 == &no_arg) { goto done; } args[n++] = &ptr6;
if (&ptr7 == &no_arg) goto done; args[n++] = &ptr7; if (&ptr7 == &no_arg) { goto done; } args[n++] = &ptr7;
if (&ptr8 == &no_arg) goto done; args[n++] = &ptr8; if (&ptr8 == &no_arg) { goto done; } args[n++] = &ptr8;
if (&ptr9 == &no_arg) goto done; args[n++] = &ptr9; if (&ptr9 == &no_arg) { goto done; } args[n++] = &ptr9;
if (&ptr10 == &no_arg) goto done; args[n++] = &ptr10; if (&ptr10 == &no_arg) { goto done; } args[n++] = &ptr10;
if (&ptr11 == &no_arg) goto done; args[n++] = &ptr11; if (&ptr11 == &no_arg) { goto done; } args[n++] = &ptr11;
if (&ptr12 == &no_arg) goto done; args[n++] = &ptr12; if (&ptr12 == &no_arg) { goto done; } args[n++] = &ptr12;
if (&ptr13 == &no_arg) goto done; args[n++] = &ptr13; if (&ptr13 == &no_arg) { goto done; } args[n++] = &ptr13;
if (&ptr14 == &no_arg) goto done; args[n++] = &ptr14; if (&ptr14 == &no_arg) { goto done; } args[n++] = &ptr14;
if (&ptr15 == &no_arg) goto done; args[n++] = &ptr15; if (&ptr15 == &no_arg) { goto done; } args[n++] = &ptr15;
if (&ptr16 == &no_arg) goto done; args[n++] = &ptr16; if (&ptr16 == &no_arg) { goto done; } args[n++] = &ptr16;
done: done:
int consumed; int consumed;
@ -210,22 +210,22 @@ bool RE::PartialMatch(const StringPiece& text,
const Arg& ptr16) const { const Arg& ptr16) const {
const Arg* args[kMaxArgs]; const Arg* args[kMaxArgs];
int n = 0; int n = 0;
if (&ptr1 == &no_arg) goto done; args[n++] = &ptr1; if (&ptr1 == &no_arg) { goto done; } args[n++] = &ptr1;
if (&ptr2 == &no_arg) goto done; args[n++] = &ptr2; if (&ptr2 == &no_arg) { goto done; } args[n++] = &ptr2;
if (&ptr3 == &no_arg) goto done; args[n++] = &ptr3; if (&ptr3 == &no_arg) { goto done; } args[n++] = &ptr3;
if (&ptr4 == &no_arg) goto done; args[n++] = &ptr4; if (&ptr4 == &no_arg) { goto done; } args[n++] = &ptr4;
if (&ptr5 == &no_arg) goto done; args[n++] = &ptr5; if (&ptr5 == &no_arg) { goto done; } args[n++] = &ptr5;
if (&ptr6 == &no_arg) goto done; args[n++] = &ptr6; if (&ptr6 == &no_arg) { goto done; } args[n++] = &ptr6;
if (&ptr7 == &no_arg) goto done; args[n++] = &ptr7; if (&ptr7 == &no_arg) { goto done; } args[n++] = &ptr7;
if (&ptr8 == &no_arg) goto done; args[n++] = &ptr8; if (&ptr8 == &no_arg) { goto done; } args[n++] = &ptr8;
if (&ptr9 == &no_arg) goto done; args[n++] = &ptr9; if (&ptr9 == &no_arg) { goto done; } args[n++] = &ptr9;
if (&ptr10 == &no_arg) goto done; args[n++] = &ptr10; if (&ptr10 == &no_arg) { goto done; } args[n++] = &ptr10;
if (&ptr11 == &no_arg) goto done; args[n++] = &ptr11; if (&ptr11 == &no_arg) { goto done; } args[n++] = &ptr11;
if (&ptr12 == &no_arg) goto done; args[n++] = &ptr12; if (&ptr12 == &no_arg) { goto done; } args[n++] = &ptr12;
if (&ptr13 == &no_arg) goto done; args[n++] = &ptr13; if (&ptr13 == &no_arg) { goto done; } args[n++] = &ptr13;
if (&ptr14 == &no_arg) goto done; args[n++] = &ptr14; if (&ptr14 == &no_arg) { goto done; } args[n++] = &ptr14;
if (&ptr15 == &no_arg) goto done; args[n++] = &ptr15; if (&ptr15 == &no_arg) { goto done; } args[n++] = &ptr15;
if (&ptr16 == &no_arg) goto done; args[n++] = &ptr16; if (&ptr16 == &no_arg) { goto done; } args[n++] = &ptr16;
done: done:
int consumed; int consumed;
@ -252,22 +252,22 @@ bool RE::Consume(StringPiece* input,
const Arg& ptr16) const { const Arg& ptr16) const {
const Arg* args[kMaxArgs]; const Arg* args[kMaxArgs];
int n = 0; int n = 0;
if (&ptr1 == &no_arg) goto done; args[n++] = &ptr1; if (&ptr1 == &no_arg) { goto done; } args[n++] = &ptr1;
if (&ptr2 == &no_arg) goto done; args[n++] = &ptr2; if (&ptr2 == &no_arg) { goto done; } args[n++] = &ptr2;
if (&ptr3 == &no_arg) goto done; args[n++] = &ptr3; if (&ptr3 == &no_arg) { goto done; } args[n++] = &ptr3;
if (&ptr4 == &no_arg) goto done; args[n++] = &ptr4; if (&ptr4 == &no_arg) { goto done; } args[n++] = &ptr4;
if (&ptr5 == &no_arg) goto done; args[n++] = &ptr5; if (&ptr5 == &no_arg) { goto done; } args[n++] = &ptr5;
if (&ptr6 == &no_arg) goto done; args[n++] = &ptr6; if (&ptr6 == &no_arg) { goto done; } args[n++] = &ptr6;
if (&ptr7 == &no_arg) goto done; args[n++] = &ptr7; if (&ptr7 == &no_arg) { goto done; } args[n++] = &ptr7;
if (&ptr8 == &no_arg) goto done; args[n++] = &ptr8; if (&ptr8 == &no_arg) { goto done; } args[n++] = &ptr8;
if (&ptr9 == &no_arg) goto done; args[n++] = &ptr9; if (&ptr9 == &no_arg) { goto done; } args[n++] = &ptr9;
if (&ptr10 == &no_arg) goto done; args[n++] = &ptr10; if (&ptr10 == &no_arg) { goto done; } args[n++] = &ptr10;
if (&ptr11 == &no_arg) goto done; args[n++] = &ptr11; if (&ptr11 == &no_arg) { goto done; } args[n++] = &ptr11;
if (&ptr12 == &no_arg) goto done; args[n++] = &ptr12; if (&ptr12 == &no_arg) { goto done; } args[n++] = &ptr12;
if (&ptr13 == &no_arg) goto done; args[n++] = &ptr13; if (&ptr13 == &no_arg) { goto done; } args[n++] = &ptr13;
if (&ptr14 == &no_arg) goto done; args[n++] = &ptr14; if (&ptr14 == &no_arg) { goto done; } args[n++] = &ptr14;
if (&ptr15 == &no_arg) goto done; args[n++] = &ptr15; if (&ptr15 == &no_arg) { goto done; } args[n++] = &ptr15;
if (&ptr16 == &no_arg) goto done; args[n++] = &ptr16; if (&ptr16 == &no_arg) { goto done; } args[n++] = &ptr16;
done: done:
int consumed; int consumed;
@ -300,22 +300,22 @@ bool RE::FindAndConsume(StringPiece* input,
const Arg& ptr16) const { const Arg& ptr16) const {
const Arg* args[kMaxArgs]; const Arg* args[kMaxArgs];
int n = 0; int n = 0;
if (&ptr1 == &no_arg) goto done; args[n++] = &ptr1; if (&ptr1 == &no_arg) { goto done; } args[n++] = &ptr1;
if (&ptr2 == &no_arg) goto done; args[n++] = &ptr2; if (&ptr2 == &no_arg) { goto done; } args[n++] = &ptr2;
if (&ptr3 == &no_arg) goto done; args[n++] = &ptr3; if (&ptr3 == &no_arg) { goto done; } args[n++] = &ptr3;
if (&ptr4 == &no_arg) goto done; args[n++] = &ptr4; if (&ptr4 == &no_arg) { goto done; } args[n++] = &ptr4;
if (&ptr5 == &no_arg) goto done; args[n++] = &ptr5; if (&ptr5 == &no_arg) { goto done; } args[n++] = &ptr5;
if (&ptr6 == &no_arg) goto done; args[n++] = &ptr6; if (&ptr6 == &no_arg) { goto done; } args[n++] = &ptr6;
if (&ptr7 == &no_arg) goto done; args[n++] = &ptr7; if (&ptr7 == &no_arg) { goto done; } args[n++] = &ptr7;
if (&ptr8 == &no_arg) goto done; args[n++] = &ptr8; if (&ptr8 == &no_arg) { goto done; } args[n++] = &ptr8;
if (&ptr9 == &no_arg) goto done; args[n++] = &ptr9; if (&ptr9 == &no_arg) { goto done; } args[n++] = &ptr9;
if (&ptr10 == &no_arg) goto done; args[n++] = &ptr10; if (&ptr10 == &no_arg) { goto done; } args[n++] = &ptr10;
if (&ptr11 == &no_arg) goto done; args[n++] = &ptr11; if (&ptr11 == &no_arg) { goto done; } args[n++] = &ptr11;
if (&ptr12 == &no_arg) goto done; args[n++] = &ptr12; if (&ptr12 == &no_arg) { goto done; } args[n++] = &ptr12;
if (&ptr13 == &no_arg) goto done; args[n++] = &ptr13; if (&ptr13 == &no_arg) { goto done; } args[n++] = &ptr13;
if (&ptr14 == &no_arg) goto done; args[n++] = &ptr14; if (&ptr14 == &no_arg) { goto done; } args[n++] = &ptr14;
if (&ptr15 == &no_arg) goto done; args[n++] = &ptr15; if (&ptr15 == &no_arg) { goto done; } args[n++] = &ptr15;
if (&ptr16 == &no_arg) goto done; args[n++] = &ptr16; if (&ptr16 == &no_arg) { goto done; } args[n++] = &ptr16;
done: done:
int consumed; int consumed;

View File

@ -2437,7 +2437,7 @@ return options;
static char * static char *
ordin(int n) ordin(int n)
{ {
static char buffer[8]; static char buffer[14];
char *p = buffer; char *p = buffer;
sprintf(p, "%d", n); sprintf(p, "%d", n);
while (*p != 0) p++; while (*p != 0) p++;

View File

@ -6,7 +6,7 @@
and semantics are as close as possible to those of the Perl 5 language. and semantics are as close as possible to those of the Perl 5 language.
Written by Philip Hazel Written by Philip Hazel
Copyright (c) 1997-2014 University of Cambridge Copyright (c) 1997-2016 University of Cambridge
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
@ -173,7 +173,8 @@ static const int eint[] = {
REG_BADPAT, /* group name must start with a non-digit */ REG_BADPAT, /* group name must start with a non-digit */
/* 85 */ /* 85 */
REG_BADPAT, /* parentheses too deeply nested (stack check) */ REG_BADPAT, /* parentheses too deeply nested (stack check) */
REG_BADPAT /* missing digits in \x{} or \o{} */ REG_BADPAT, /* missing digits in \x{} or \o{} */
REG_BADPAT /* pattern too complicated */
}; };
/* Table of texts corresponding to POSIX error codes */ /* Table of texts corresponding to POSIX error codes */
@ -364,6 +365,7 @@ start location rather than being passed as a PCRE "starting offset". */
if ((eflags & REG_STARTEND) != 0) if ((eflags & REG_STARTEND) != 0)
{ {
if (pmatch == NULL) return REG_INVARG;
so = pmatch[0].rm_so; so = pmatch[0].rm_so;
eo = pmatch[0].rm_eo; eo = pmatch[0].rm_eo;
} }

View File

@ -2250,7 +2250,7 @@ data is not zero. */
static int callout(pcre_callout_block *cb) static int callout(pcre_callout_block *cb)
{ {
FILE *f = (first_callout | callout_extra)? outfile : NULL; FILE *f = (first_callout | callout_extra)? outfile : NULL;
int i, pre_start, post_start, subject_length; int i, current_position, pre_start, post_start, subject_length;
if (callout_extra) if (callout_extra)
{ {
@ -2280,14 +2280,19 @@ printed lengths of the substrings. */
if (f != NULL) fprintf(f, "--->"); if (f != NULL) fprintf(f, "--->");
/* If a lookbehind is involved, the current position may be earlier than the
match start. If so, use the match start instead. */
current_position = (cb->current_position >= cb->start_match)?
cb->current_position : cb->start_match;
PCHARS(pre_start, cb->subject, 0, cb->start_match, f); PCHARS(pre_start, cb->subject, 0, cb->start_match, f);
PCHARS(post_start, cb->subject, cb->start_match, PCHARS(post_start, cb->subject, cb->start_match,
cb->current_position - cb->start_match, f); current_position - cb->start_match, f);
PCHARS(subject_length, cb->subject, 0, cb->subject_length, NULL); PCHARS(subject_length, cb->subject, 0, cb->subject_length, NULL);
PCHARSV(cb->subject, cb->current_position, PCHARSV(cb->subject, current_position, cb->subject_length - current_position, f);
cb->subject_length - cb->current_position, f);
if (f != NULL) fprintf(f, "\n"); if (f != NULL) fprintf(f, "\n");
@ -5612,6 +5617,12 @@ while (!done)
break; break;
} }
if (use_size_offsets < 2)
{
fprintf(outfile, "Cannot do global matching with an ovector size < 2\n");
break;
}
/* If we have matched an empty string, first check to see if we are at /* If we have matched an empty string, first check to see if we are at
the end of the subject. If so, the /g loop is over. Otherwise, mimic what the end of the subject. If so, the /g loop is over. Otherwise, mimic what
Perl's /g options does. This turns out to be rather cunning. First we set Perl's /g options does. This turns out to be rather cunning. First we set
@ -5740,3 +5751,4 @@ return yield;
} }
/* End of pcretest.c */ /* End of pcretest.c */

View File

@ -31,14 +31,14 @@
SLJIT defines the following architecture dependent types and macros: SLJIT defines the following architecture dependent types and macros:
Types: Types:
sljit_sb, sljit_ub : signed and unsigned 8 bit byte sljit_s8, sljit_u8 : signed and unsigned 8 bit integer type
sljit_sh, sljit_uh : signed and unsigned 16 bit half-word (short) type sljit_s16, sljit_u16 : signed and unsigned 16 bit integer type
sljit_si, sljit_ui : signed and unsigned 32 bit integer type sljit_s32, sljit_u32 : signed and unsigned 32 bit integer type
sljit_sw, sljit_uw : signed and unsigned machine word, enough to store a pointer sljit_sw, sljit_uw : signed and unsigned machine word, enough to store a pointer
sljit_p : unsgined pointer value (usually the same as sljit_uw, but sljit_p : unsgined pointer value (usually the same as sljit_uw, but
some 64 bit ABIs may use 32 bit pointers) some 64 bit ABIs may use 32 bit pointers)
sljit_s : single precision floating point value sljit_f32 : 32 bit single precision floating point value
sljit_d : double precision floating point value sljit_f64 : 64 bit double precision floating point value
Macros for feature detection (boolean): Macros for feature detection (boolean):
SLJIT_32BIT_ARCHITECTURE : 32 bit architecture SLJIT_32BIT_ARCHITECTURE : 32 bit architecture
@ -56,10 +56,10 @@
SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS : number of available floating point scratch registers SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS : number of available floating point scratch registers
SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS : number of available floating point saved registers SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS : number of available floating point saved registers
SLJIT_WORD_SHIFT : the shift required to apply when accessing a sljit_sw/sljit_uw array by index SLJIT_WORD_SHIFT : the shift required to apply when accessing a sljit_sw/sljit_uw array by index
SLJIT_DOUBLE_SHIFT : the shift required to apply when accessing SLJIT_F32_SHIFT : the shift required to apply when accessing
a double precision floating point array by index a single precision floating point array by index
SLJIT_SINGLE_SHIFT : the shift required to apply when accessing SLJIT_F64_SHIFT : the shift required to apply when accessing
a single precision floating point array by index a double precision floating point array by index
SLJIT_LOCALS_OFFSET : local space starting offset (SLJIT_SP + SLJIT_LOCALS_OFFSET) SLJIT_LOCALS_OFFSET : local space starting offset (SLJIT_SP + SLJIT_LOCALS_OFFSET)
SLJIT_RETURN_ADDRESS_OFFSET : a return instruction always adds this offset to the return address SLJIT_RETURN_ADDRESS_OFFSET : a return instruction always adds this offset to the return address
@ -252,11 +252,6 @@
#endif #endif
#endif /* !SLJIT_INLINE */ #endif /* !SLJIT_INLINE */
#ifndef SLJIT_CONST
/* Const variables. */
#define SLJIT_CONST const
#endif
#ifndef SLJIT_UNUSED_ARG #ifndef SLJIT_UNUSED_ARG
/* Unused arguments. */ /* Unused arguments. */
#define SLJIT_UNUSED_ARG(arg) (void)arg #define SLJIT_UNUSED_ARG(arg) (void)arg
@ -284,6 +279,15 @@
/* Instruction cache flush. */ /* Instruction cache flush. */
/****************************/ /****************************/
#if (!defined SLJIT_CACHE_FLUSH && defined __has_builtin)
#if __has_builtin(__builtin___clear_cache)
#define SLJIT_CACHE_FLUSH(from, to) \
__builtin___clear_cache((char*)from, (char*)to)
#endif /* __has_builtin(__builtin___clear_cache) */
#endif /* (!defined SLJIT_CACHE_FLUSH && defined __has_builtin) */
#ifndef SLJIT_CACHE_FLUSH #ifndef SLJIT_CACHE_FLUSH
#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
@ -300,6 +304,11 @@
#define SLJIT_CACHE_FLUSH(from, to) \ #define SLJIT_CACHE_FLUSH(from, to) \
sys_icache_invalidate((char*)(from), (char*)(to) - (char*)(from)) sys_icache_invalidate((char*)(from), (char*)(to) - (char*)(from))
#elif (defined(__GNUC__) && (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)))
#define SLJIT_CACHE_FLUSH(from, to) \
__builtin___clear_cache((char*)from, (char*)to)
#elif defined __ANDROID__ #elif defined __ANDROID__
/* Android lacks __clear_cache; instead, cacheflush should be used. */ /* Android lacks __clear_cache; instead, cacheflush should be used. */
@ -312,12 +321,14 @@
/* The __clear_cache() implementation of GCC is a dummy function on PowerPC. */ /* The __clear_cache() implementation of GCC is a dummy function on PowerPC. */
#define SLJIT_CACHE_FLUSH(from, to) \ #define SLJIT_CACHE_FLUSH(from, to) \
ppc_cache_flush((from), (to)) ppc_cache_flush((from), (to))
#define SLJIT_CACHE_FLUSH_OWN_IMPL 1
#elif (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) #elif (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
/* The __clear_cache() implementation of GCC is a dummy function on Sparc. */ /* The __clear_cache() implementation of GCC is a dummy function on Sparc. */
#define SLJIT_CACHE_FLUSH(from, to) \ #define SLJIT_CACHE_FLUSH(from, to) \
sparc_cache_flush((from), (to)) sparc_cache_flush((from), (to))
#define SLJIT_CACHE_FLUSH_OWN_IMPL 1
#else #else
@ -330,20 +341,20 @@
#endif /* !SLJIT_CACHE_FLUSH */ #endif /* !SLJIT_CACHE_FLUSH */
/******************************************************/ /******************************************************/
/* Byte/half/int/word/single/double type definitions. */ /* Integer and floating point type definitions. */
/******************************************************/ /******************************************************/
/* 8 bit byte type. */ /* 8 bit byte type. */
typedef unsigned char sljit_ub; typedef unsigned char sljit_u8;
typedef signed char sljit_sb; typedef signed char sljit_s8;
/* 16 bit half-word type. */ /* 16 bit half-word type. */
typedef unsigned short int sljit_uh; typedef unsigned short int sljit_u16;
typedef signed short int sljit_sh; typedef signed short int sljit_s16;
/* 32 bit integer type. */ /* 32 bit integer type. */
typedef unsigned int sljit_ui; typedef unsigned int sljit_u32;
typedef signed int sljit_si; typedef signed int sljit_s32;
/* Machine word type. Enough for storing a pointer. /* Machine word type. Enough for storing a pointer.
32 bit for 32 bit machines. 32 bit for 32 bit machines.
@ -377,15 +388,15 @@ typedef long int sljit_sw;
typedef sljit_uw sljit_p; typedef sljit_uw sljit_p;
/* Floating point types. */ /* Floating point types. */
typedef float sljit_s; typedef float sljit_f32;
typedef double sljit_d; typedef double sljit_f64;
/* Shift for pointer sized data. */ /* Shift for pointer sized data. */
#define SLJIT_POINTER_SHIFT SLJIT_WORD_SHIFT #define SLJIT_POINTER_SHIFT SLJIT_WORD_SHIFT
/* Shift for double precision sized data. */ /* Shift for double precision sized data. */
#define SLJIT_DOUBLE_SHIFT 3 #define SLJIT_F32_SHIFT 2
#define SLJIT_SINGLE_SHIFT 2 #define SLJIT_F64_SHIFT 3
#ifndef SLJIT_W #ifndef SLJIT_W

View File

@ -137,10 +137,10 @@ struct free_block {
}; };
#define AS_BLOCK_HEADER(base, offset) \ #define AS_BLOCK_HEADER(base, offset) \
((struct block_header*)(((sljit_ub*)base) + offset)) ((struct block_header*)(((sljit_u8*)base) + offset))
#define AS_FREE_BLOCK(base, offset) \ #define AS_FREE_BLOCK(base, offset) \
((struct free_block*)(((sljit_ub*)base) + offset)) ((struct free_block*)(((sljit_u8*)base) + offset))
#define MEM_START(base) ((void*)(((sljit_ub*)base) + sizeof(struct block_header))) #define MEM_START(base) ((void*)(((sljit_u8*)base) + sizeof(struct block_header)))
#define ALIGN_SIZE(size) (((size) + sizeof(struct block_header) + 7) & ~7) #define ALIGN_SIZE(size) (((size) + sizeof(struct block_header) + 7) & ~7)
static struct free_block* free_blocks; static struct free_block* free_blocks;
@ -153,7 +153,7 @@ static SLJIT_INLINE void sljit_insert_free_block(struct free_block *free_block,
free_block->size = size; free_block->size = size;
free_block->next = free_blocks; free_block->next = free_blocks;
free_block->prev = 0; free_block->prev = NULL;
if (free_blocks) if (free_blocks)
free_blocks->prev = free_block; free_blocks->prev = free_block;
free_blocks = free_block; free_blocks = free_block;

File diff suppressed because it is too large Load Diff

View File

@ -226,7 +226,7 @@ of sljitConfigInternal.h */
/* Floating point registers */ /* Floating point registers */
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
/* Each floating point register can store a double or single precision /* Each floating point register can store a 32 or a 64 bit precision
value. The FR and FS register sets are overlap in the same way as R value. The FR and FS register sets are overlap in the same way as R
and S register sets. See above. */ and S register sets. See above. */
@ -271,7 +271,7 @@ struct sljit_memory_fragment {
struct sljit_memory_fragment *next; struct sljit_memory_fragment *next;
sljit_uw used_size; sljit_uw used_size;
/* Must be aligned to sljit_sw. */ /* Must be aligned to sljit_sw. */
sljit_ub memory[1]; sljit_u8 memory[1];
}; };
struct sljit_label { struct sljit_label {
@ -297,8 +297,8 @@ struct sljit_const {
}; };
struct sljit_compiler { struct sljit_compiler {
sljit_si error; sljit_s32 error;
sljit_si options; sljit_s32 options;
struct sljit_label *labels; struct sljit_label *labels;
struct sljit_jump *jumps; struct sljit_jump *jumps;
@ -312,36 +312,36 @@ struct sljit_compiler {
struct sljit_memory_fragment *abuf; struct sljit_memory_fragment *abuf;
/* Used scratch registers. */ /* Used scratch registers. */
sljit_si scratches; sljit_s32 scratches;
/* Used saved registers. */ /* Used saved registers. */
sljit_si saveds; sljit_s32 saveds;
/* Used float scratch registers. */ /* Used float scratch registers. */
sljit_si fscratches; sljit_s32 fscratches;
/* Used float saved registers. */ /* Used float saved registers. */
sljit_si fsaveds; sljit_s32 fsaveds;
/* Local stack size. */ /* Local stack size. */
sljit_si local_size; sljit_s32 local_size;
/* Code size. */ /* Code size. */
sljit_uw size; sljit_uw size;
/* For statistical purposes. */ /* For statistical purposes. */
sljit_uw executable_size; sljit_uw executable_size;
#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
sljit_si args; sljit_s32 args;
#endif #endif
#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
sljit_si mode32; sljit_s32 mode32;
#endif #endif
#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
sljit_si flags_saved; sljit_s32 flags_saved;
#endif #endif
#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
/* Constant pool handling. */ /* Constant pool handling. */
sljit_uw *cpool; sljit_uw *cpool;
sljit_ub *cpool_unique; sljit_u8 *cpool_unique;
sljit_uw cpool_diff; sljit_uw cpool_diff;
sljit_uw cpool_fill; sljit_uw cpool_fill;
/* Other members. */ /* Other members. */
@ -352,40 +352,40 @@ struct sljit_compiler {
#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
/* Temporary fields. */ /* Temporary fields. */
sljit_uw shift_imm; sljit_uw shift_imm;
sljit_si cache_arg; sljit_s32 cache_arg;
sljit_sw cache_argw; sljit_sw cache_argw;
#endif #endif
#if (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2) #if (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
sljit_si cache_arg; sljit_s32 cache_arg;
sljit_sw cache_argw; sljit_sw cache_argw;
#endif #endif
#if (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) #if (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)
sljit_si cache_arg; sljit_s32 cache_arg;
sljit_sw cache_argw; sljit_sw cache_argw;
#endif #endif
#if (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC) #if (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)
sljit_sw imm; sljit_sw imm;
sljit_si cache_arg; sljit_s32 cache_arg;
sljit_sw cache_argw; sljit_sw cache_argw;
#endif #endif
#if (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) #if (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS)
sljit_si delay_slot; sljit_s32 delay_slot;
sljit_si cache_arg; sljit_s32 cache_arg;
sljit_sw cache_argw; sljit_sw cache_argw;
#endif #endif
#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) #if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
sljit_si delay_slot; sljit_s32 delay_slot;
sljit_si cache_arg; sljit_s32 cache_arg;
sljit_sw cache_argw; sljit_sw cache_argw;
#endif #endif
#if (defined SLJIT_CONFIG_TILEGX && SLJIT_CONFIG_TILEGX) #if (defined SLJIT_CONFIG_TILEGX && SLJIT_CONFIG_TILEGX)
sljit_si cache_arg; sljit_s32 cache_arg;
sljit_sw cache_argw; sljit_sw cache_argw;
#endif #endif
@ -396,13 +396,13 @@ struct sljit_compiler {
#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) \ #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) \
|| (defined SLJIT_DEBUG && SLJIT_DEBUG) || (defined SLJIT_DEBUG && SLJIT_DEBUG)
/* Local size passed to the functions. */ /* Local size passed to the functions. */
sljit_si logical_local_size; sljit_s32 logical_local_size;
#endif #endif
#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) \ #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) \
|| (defined SLJIT_DEBUG && SLJIT_DEBUG) \ || (defined SLJIT_DEBUG && SLJIT_DEBUG) \
|| (defined SLJIT_VERBOSE && SLJIT_VERBOSE) || (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
sljit_si skip_checks; sljit_s32 skip_checks;
#endif #endif
}; };
@ -427,7 +427,7 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_free_compiler(struct sljit_compiler *compile
error code. Thus there is no need for checking the error after every error code. Thus there is no need for checking the error after every
call, it is enough to do it before the code is compiled. Removing call, it is enough to do it before the code is compiled. Removing
these checks increases the performance of the compiling process. */ these checks increases the performance of the compiling process. */
static SLJIT_INLINE sljit_si sljit_get_compiler_error(struct sljit_compiler *compiler) { return compiler->error; } static SLJIT_INLINE sljit_s32 sljit_get_compiler_error(struct sljit_compiler *compiler) { return compiler->error; }
/* Sets the compiler error code to SLJIT_ERR_ALLOC_FAILED except /* Sets the compiler error code to SLJIT_ERR_ALLOC_FAILED except
if an error was detected before. After the error code is set if an error was detected before. After the error code is set
@ -448,7 +448,7 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_compiler_memory_error(struct sljit_compi
indicate that there is no more memory (does not set the current error code indicate that there is no more memory (does not set the current error code
of the compiler to out-of-memory status). of the compiler to out-of-memory status).
*/ */
SLJIT_API_FUNC_ATTRIBUTE void* sljit_alloc_memory(struct sljit_compiler *compiler, sljit_si size); SLJIT_API_FUNC_ATTRIBUTE void* sljit_alloc_memory(struct sljit_compiler *compiler, sljit_s32 size);
#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
/* Passing NULL disables verbose. */ /* Passing NULL disables verbose. */
@ -518,9 +518,9 @@ offset 0 is aligned to sljit_d. Otherwise it is aligned to sljit_uw. */
/* The local_size must be >= 0 and <= SLJIT_MAX_LOCAL_SIZE. */ /* The local_size must be >= 0 and <= SLJIT_MAX_LOCAL_SIZE. */
#define SLJIT_MAX_LOCAL_SIZE 65536 #define SLJIT_MAX_LOCAL_SIZE 65536
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compiler, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler,
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds, sljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 saveds,
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size); sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size);
/* The machine code has a context (which contains the local stack space size, /* The machine code has a context (which contains the local stack space size,
number of used registers, etc.) which initialized by sljit_emit_enter. Several number of used registers, etc.) which initialized by sljit_emit_enter. Several
@ -532,9 +532,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
Note: every call of sljit_emit_enter and sljit_set_context overwrites Note: every call of sljit_emit_enter and sljit_set_context overwrites
the previous context. */ the previous context. */
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_set_context(struct sljit_compiler *compiler, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler,
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds, sljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 saveds,
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size); sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size);
/* Return from machine code. The op argument can be SLJIT_UNUSED which means the /* Return from machine code. The op argument can be SLJIT_UNUSED which means the
function does not return with anything or any opcode between SLJIT_MOV and function does not return with anything or any opcode between SLJIT_MOV and
@ -542,8 +542,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_set_context(struct sljit_compiler *compi
is SLJIT_UNUSED, otherwise see below the description about source and is SLJIT_UNUSED, otherwise see below the description about source and
destination arguments. */ destination arguments. */
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compiler, sljit_si op, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si src, sljit_sw srcw); sljit_s32 src, sljit_sw srcw);
/* Fast calling mechanism for utility functions (see SLJIT_FAST_CALL). All registers and /* Fast calling mechanism for utility functions (see SLJIT_FAST_CALL). All registers and
even the stack frame is passed to the callee. The return address is preserved in even the stack frame is passed to the callee. The return address is preserved in
@ -560,8 +560,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compi
/* Note: although sljit_emit_fast_return could be replaced by an ijump, it is not suggested, /* Note: although sljit_emit_fast_return could be replaced by an ijump, it is not suggested,
since many architectures do clever branch prediction on call / return instruction pairs. */ since many architectures do clever branch prediction on call / return instruction pairs. */
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_si dst, sljit_sw dstw); SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw);
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_si src, sljit_sw srcw); SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw);
/* /*
Source and destination values for arithmetical instructions Source and destination values for arithmetical instructions
@ -624,31 +624,29 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_return(struct sljit_compiler *
#define SLJIT_MEM2(r1, r2) (SLJIT_MEM | (r1) | ((r2) << 8)) #define SLJIT_MEM2(r1, r2) (SLJIT_MEM | (r1) | ((r2) << 8))
#define SLJIT_IMM 0x40 #define SLJIT_IMM 0x40
/* Set 32 bit operation mode (I) on 64 bit CPUs. The flag is totally ignored on /* Set 32 bit operation mode (I) on 64 bit CPUs. This flag is ignored on 32
32 bit CPUs. If this flag is set for an arithmetic operation, it uses only the bit CPUs. When this flag is set for an arithmetic operation, only the
lower 32 bit of the input register(s), and set the CPU status flags according lower 32 bit of the input register(s) are used, and the CPU status flags
to the 32 bit result. The higher 32 bits are undefined for both the input and are set according to the 32 bit result. Although the higher 32 bit of
output. However, the CPU might not ignore those higher 32 bits, like MIPS, which the input and the result registers are not defined by SLJIT, it might be
expects it to be the sign extension of the lower 32 bit. All 32 bit operations defined by the CPU architecture (e.g. MIPS). To satisfy these requirements
are undefined, if this condition is not fulfilled. Therefore, when SLJIT_INT_OP all source registers must be computed by operations where this flag is
is specified, all register arguments must be the result of other operations with also set. In other words 32 and 64 bit arithmetic operations cannot be
the same SLJIT_INT_OP flag. In other words, although a register can hold either mixed. The only exception is SLJIT_IMOV and SLJIT_IMOVU whose source
a 64 or 32 bit value, these values cannot be mixed. The only exceptions are register can hold any 32 or 64 bit value. This source register is
SLJIT_IMOV and SLJIT_IMOVU (SLJIT_MOV_SI/SLJIT_MOVU_SI with SLJIT_INT_OP flag) converted to a 32 bit compatible format. SLJIT does not generate any
which can convert any source argument to SLJIT_INT_OP compatible result. This instructions on certain CPUs (e.g. on x86 and ARM) if the source and
conversion might be unnecessary on some CPUs like x86-64, since the upper 32 destination operands are the same registers. Affects sljit_emit_op0,
bit is always ignored. In this case SLJIT is clever enough to not generate any sljit_emit_op1 and sljit_emit_op2. */
instructions if the source and destination operands are the same registers. #define SLJIT_I32_OP 0x100
Affects sljit_emit_op0, sljit_emit_op1 and sljit_emit_op2. */
#define SLJIT_INT_OP 0x100
/* Single precision mode (SP). This flag is similar to SLJIT_INT_OP, just /* F32 precision mode (SP). This flag is similar to SLJIT_I32_OP, just
it applies to floating point registers (it is even the same bit). When it applies to floating point registers (it is even the same bit). When
this flag is passed, the CPU performs single precision floating point this flag is passed, the CPU performs 32 bit floating point operations.
operations. Similar to SLJIT_INT_OP, all register arguments must be the Similar to SLJIT_I32_OP, all register arguments must be computed by
result of other floating point operations with this flag. Affects floating point operations where this flag is also set. Affects
sljit_emit_fop1, sljit_emit_fop2 and sljit_emit_fcmp. */ sljit_emit_fop1, sljit_emit_fop2 and sljit_emit_fcmp. */
#define SLJIT_SINGLE_OP 0x100 #define SLJIT_F32_OP 0x100
/* Common CPU status flags for all architectures (x86, ARM, PPC) /* Common CPU status flags for all architectures (x86, ARM, PPC)
- carry flag - carry flag
@ -697,43 +695,41 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_return(struct sljit_compiler *
/* Flags: - (may destroy flags) /* Flags: - (may destroy flags)
Unsigned multiplication of SLJIT_R0 and SLJIT_R1. Unsigned multiplication of SLJIT_R0 and SLJIT_R1.
Result is placed into SLJIT_R1:SLJIT_R0 (high:low) word */ Result is placed into SLJIT_R1:SLJIT_R0 (high:low) word */
#define SLJIT_LUMUL (SLJIT_OP0_BASE + 2) #define SLJIT_LMUL_UW (SLJIT_OP0_BASE + 2)
/* Flags: - (may destroy flags) /* Flags: - (may destroy flags)
Signed multiplication of SLJIT_R0 and SLJIT_R1. Signed multiplication of SLJIT_R0 and SLJIT_R1.
Result is placed into SLJIT_R1:SLJIT_R0 (high:low) word */ Result is placed into SLJIT_R1:SLJIT_R0 (high:low) word */
#define SLJIT_LSMUL (SLJIT_OP0_BASE + 3) #define SLJIT_LMUL_SW (SLJIT_OP0_BASE + 3)
/* Flags: I - (may destroy flags) /* Flags: I - (may destroy flags)
Unsigned divide of the value in SLJIT_R0 by the value in SLJIT_R1. Unsigned divide of the value in SLJIT_R0 by the value in SLJIT_R1.
The result is placed into SLJIT_R0 and the remainder into SLJIT_R1. The result is placed into SLJIT_R0 and the remainder into SLJIT_R1.
Note: if SLJIT_R1 is 0, the behaviour is undefined. */ Note: if SLJIT_R1 is 0, the behaviour is undefined. */
#define SLJIT_UDIVMOD (SLJIT_OP0_BASE + 4) #define SLJIT_DIVMOD_UW (SLJIT_OP0_BASE + 4)
#define SLJIT_IUDIVMOD (SLJIT_UDIVMOD | SLJIT_INT_OP) #define SLJIT_DIVMOD_U32 (SLJIT_DIVMOD_UW | SLJIT_I32_OP)
/* Flags: I - (may destroy flags) /* Flags: I - (may destroy flags)
Signed divide of the value in SLJIT_R0 by the value in SLJIT_R1. Signed divide of the value in SLJIT_R0 by the value in SLJIT_R1.
The result is placed into SLJIT_R0 and the remainder into SLJIT_R1. The result is placed into SLJIT_R0 and the remainder into SLJIT_R1.
Note: if SLJIT_R1 is 0, the behaviour is undefined. Note: if SLJIT_R1 is 0, the behaviour is undefined.
Note: if SLJIT_R1 is -1 and SLJIT_R0 is integer min (0x800..00), Note: if SLJIT_R1 is -1 and SLJIT_R0 is integer min (0x800..00),
the behaviour is undefined. */ the behaviour is undefined. */
#define SLJIT_SDIVMOD (SLJIT_OP0_BASE + 5) #define SLJIT_DIVMOD_SW (SLJIT_OP0_BASE + 5)
#define SLJIT_ISDIVMOD (SLJIT_SDIVMOD | SLJIT_INT_OP) #define SLJIT_DIVMOD_S32 (SLJIT_DIVMOD_SW | SLJIT_I32_OP)
/* Flags: I - (may destroy flags) /* Flags: I - (may destroy flags)
Unsigned divide of the value in SLJIT_R0 by the value in SLJIT_R1. Unsigned divide of the value in SLJIT_R0 by the value in SLJIT_R1.
The result is placed into SLJIT_R0. SLJIT_R1 preserves its value. The result is placed into SLJIT_R0. SLJIT_R1 preserves its value.
Note: if SLJIT_R1 is 0, the behaviour is undefined. Note: if SLJIT_R1 is 0, the behaviour is undefined. */
Note: SLJIT_SDIV is single precision divide. */ #define SLJIT_DIV_UW (SLJIT_OP0_BASE + 6)
#define SLJIT_UDIVI (SLJIT_OP0_BASE + 6) #define SLJIT_DIV_U32 (SLJIT_DIV_UW | SLJIT_I32_OP)
#define SLJIT_IUDIVI (SLJIT_UDIVI | SLJIT_INT_OP)
/* Flags: I - (may destroy flags) /* Flags: I - (may destroy flags)
Signed divide of the value in SLJIT_R0 by the value in SLJIT_R1. Signed divide of the value in SLJIT_R0 by the value in SLJIT_R1.
The result is placed into SLJIT_R0. SLJIT_R1 preserves its value. The result is placed into SLJIT_R0. SLJIT_R1 preserves its value.
Note: if SLJIT_R1 is 0, the behaviour is undefined. Note: if SLJIT_R1 is 0, the behaviour is undefined.
Note: if SLJIT_R1 is -1 and SLJIT_R0 is integer min (0x800..00), Note: if SLJIT_R1 is -1 and SLJIT_R0 is integer min (0x800..00),
the behaviour is undefined. the behaviour is undefined. */
Note: SLJIT_SDIV is single precision divide. */ #define SLJIT_DIV_SW (SLJIT_OP0_BASE + 7)
#define SLJIT_SDIVI (SLJIT_OP0_BASE + 7) #define SLJIT_DIV_S32 (SLJIT_DIV_SW | SLJIT_I32_OP)
#define SLJIT_ISDIVI (SLJIT_SDIVI | SLJIT_INT_OP)
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler, sljit_si op); SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op);
/* Starting index of opcodes for sljit_emit_op1. */ /* Starting index of opcodes for sljit_emit_op1. */
#define SLJIT_OP1_BASE 32 #define SLJIT_OP1_BASE 32
@ -752,188 +748,188 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler
/* Flags: - (never set any flags) */ /* Flags: - (never set any flags) */
#define SLJIT_MOV (SLJIT_OP1_BASE + 0) #define SLJIT_MOV (SLJIT_OP1_BASE + 0)
/* Flags: I - (never set any flags) */ /* Flags: I - (never set any flags) */
#define SLJIT_MOV_UB (SLJIT_OP1_BASE + 1) #define SLJIT_MOV_U8 (SLJIT_OP1_BASE + 1)
#define SLJIT_IMOV_UB (SLJIT_MOV_UB | SLJIT_INT_OP) #define SLJIT_MOV32_U8 (SLJIT_MOV_U8 | SLJIT_I32_OP)
/* Flags: I - (never set any flags) */ /* Flags: I - (never set any flags) */
#define SLJIT_MOV_SB (SLJIT_OP1_BASE + 2) #define SLJIT_MOV_S8 (SLJIT_OP1_BASE + 2)
#define SLJIT_IMOV_SB (SLJIT_MOV_SB | SLJIT_INT_OP) #define SLJIT_MOV32_S8 (SLJIT_MOV_S8 | SLJIT_I32_OP)
/* Flags: I - (never set any flags) */ /* Flags: I - (never set any flags) */
#define SLJIT_MOV_UH (SLJIT_OP1_BASE + 3) #define SLJIT_MOV_U16 (SLJIT_OP1_BASE + 3)
#define SLJIT_IMOV_UH (SLJIT_MOV_UH | SLJIT_INT_OP) #define SLJIT_MOV32_U16 (SLJIT_MOV_U16 | SLJIT_I32_OP)
/* Flags: I - (never set any flags) */ /* Flags: I - (never set any flags) */
#define SLJIT_MOV_SH (SLJIT_OP1_BASE + 4) #define SLJIT_MOV_S16 (SLJIT_OP1_BASE + 4)
#define SLJIT_IMOV_SH (SLJIT_MOV_SH | SLJIT_INT_OP) #define SLJIT_MOV32_S16 (SLJIT_MOV_S16 | SLJIT_I32_OP)
/* Flags: I - (never set any flags) /* Flags: I - (never set any flags)
Note: see SLJIT_INT_OP for further details. */ Note: no SLJIT_MOV32_U32 form, since it is the same as SLJIT_MOV32 */
#define SLJIT_MOV_UI (SLJIT_OP1_BASE + 5) #define SLJIT_MOV_U32 (SLJIT_OP1_BASE + 5)
/* No SLJIT_INT_OP form, since it is the same as SLJIT_IMOV. */
/* Flags: I - (never set any flags) /* Flags: I - (never set any flags)
Note: see SLJIT_INT_OP for further details. */ Note: no SLJIT_MOV32_S32 form, since it is the same as SLJIT_MOV32 */
#define SLJIT_MOV_SI (SLJIT_OP1_BASE + 6) #define SLJIT_MOV_S32 (SLJIT_OP1_BASE + 6)
#define SLJIT_IMOV (SLJIT_MOV_SI | SLJIT_INT_OP) /* Flags: I - (never set any flags) */
#define SLJIT_MOV32 (SLJIT_MOV_S32 | SLJIT_I32_OP)
/* Flags: - (never set any flags) */ /* Flags: - (never set any flags) */
#define SLJIT_MOV_P (SLJIT_OP1_BASE + 7) #define SLJIT_MOV_P (SLJIT_OP1_BASE + 7)
/* Flags: - (never set any flags) */ /* Flags: - (never set any flags) */
#define SLJIT_MOVU (SLJIT_OP1_BASE + 8) #define SLJIT_MOVU (SLJIT_OP1_BASE + 8)
/* Flags: I - (never set any flags) */ /* Flags: I - (never set any flags) */
#define SLJIT_MOVU_UB (SLJIT_OP1_BASE + 9) #define SLJIT_MOVU_U8 (SLJIT_OP1_BASE + 9)
#define SLJIT_IMOVU_UB (SLJIT_MOVU_UB | SLJIT_INT_OP) #define SLJIT_MOVU32_U8 (SLJIT_MOVU_U8 | SLJIT_I32_OP)
/* Flags: I - (never set any flags) */ /* Flags: I - (never set any flags) */
#define SLJIT_MOVU_SB (SLJIT_OP1_BASE + 10) #define SLJIT_MOVU_S8 (SLJIT_OP1_BASE + 10)
#define SLJIT_IMOVU_SB (SLJIT_MOVU_SB | SLJIT_INT_OP) #define SLJIT_MOVU32_S8 (SLJIT_MOVU_S8 | SLJIT_I32_OP)
/* Flags: I - (never set any flags) */ /* Flags: I - (never set any flags) */
#define SLJIT_MOVU_UH (SLJIT_OP1_BASE + 11) #define SLJIT_MOVU_U16 (SLJIT_OP1_BASE + 11)
#define SLJIT_IMOVU_UH (SLJIT_MOVU_UH | SLJIT_INT_OP) #define SLJIT_MOVU32_U16 (SLJIT_MOVU_U16 | SLJIT_I32_OP)
/* Flags: I - (never set any flags) */ /* Flags: I - (never set any flags) */
#define SLJIT_MOVU_SH (SLJIT_OP1_BASE + 12) #define SLJIT_MOVU_S16 (SLJIT_OP1_BASE + 12)
#define SLJIT_IMOVU_SH (SLJIT_MOVU_SH | SLJIT_INT_OP) #define SLJIT_MOVU32_S16 (SLJIT_MOVU_S16 | SLJIT_I32_OP)
/* Flags: I - (never set any flags) /* Flags: I - (never set any flags)
Note: see SLJIT_INT_OP for further details. */ Note: no SLJIT_MOVU32_U32 form, since it is the same as SLJIT_MOVU32 */
#define SLJIT_MOVU_UI (SLJIT_OP1_BASE + 13) #define SLJIT_MOVU_U32 (SLJIT_OP1_BASE + 13)
/* No SLJIT_INT_OP form, since it is the same as SLJIT_IMOVU. */
/* Flags: I - (never set any flags) /* Flags: I - (never set any flags)
Note: see SLJIT_INT_OP for further details. */ Note: no SLJIT_MOVU32_S32 form, since it is the same as SLJIT_MOVU32 */
#define SLJIT_MOVU_SI (SLJIT_OP1_BASE + 14) #define SLJIT_MOVU_S32 (SLJIT_OP1_BASE + 14)
#define SLJIT_IMOVU (SLJIT_MOVU_SI | SLJIT_INT_OP) /* Flags: I - (never set any flags) */
#define SLJIT_MOVU32 (SLJIT_MOVU_S32 | SLJIT_I32_OP)
/* Flags: - (never set any flags) */ /* Flags: - (never set any flags) */
#define SLJIT_MOVU_P (SLJIT_OP1_BASE + 15) #define SLJIT_MOVU_P (SLJIT_OP1_BASE + 15)
/* Flags: I | E | K */ /* Flags: I | E | K */
#define SLJIT_NOT (SLJIT_OP1_BASE + 16) #define SLJIT_NOT (SLJIT_OP1_BASE + 16)
#define SLJIT_INOT (SLJIT_NOT | SLJIT_INT_OP) #define SLJIT_NOT32 (SLJIT_NOT | SLJIT_I32_OP)
/* Flags: I | E | O | K */ /* Flags: I | E | O | K */
#define SLJIT_NEG (SLJIT_OP1_BASE + 17) #define SLJIT_NEG (SLJIT_OP1_BASE + 17)
#define SLJIT_INEG (SLJIT_NEG | SLJIT_INT_OP) #define SLJIT_NEG32 (SLJIT_NEG | SLJIT_I32_OP)
/* Count leading zeroes /* Count leading zeroes
Flags: I | E | K Flags: I | E | K
Important note! Sparc 32 does not support K flag, since Important note! Sparc 32 does not support K flag, since
the required popc instruction is introduced only in sparc 64. */ the required popc instruction is introduced only in sparc 64. */
#define SLJIT_CLZ (SLJIT_OP1_BASE + 18) #define SLJIT_CLZ (SLJIT_OP1_BASE + 18)
#define SLJIT_ICLZ (SLJIT_CLZ | SLJIT_INT_OP) #define SLJIT_CLZ32 (SLJIT_CLZ | SLJIT_I32_OP)
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler, sljit_si op, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src, sljit_sw srcw); sljit_s32 src, sljit_sw srcw);
/* Starting index of opcodes for sljit_emit_op2. */ /* Starting index of opcodes for sljit_emit_op2. */
#define SLJIT_OP2_BASE 96 #define SLJIT_OP2_BASE 96
/* Flags: I | E | O | C | K */ /* Flags: I | E | O | C | K */
#define SLJIT_ADD (SLJIT_OP2_BASE + 0) #define SLJIT_ADD (SLJIT_OP2_BASE + 0)
#define SLJIT_IADD (SLJIT_ADD | SLJIT_INT_OP) #define SLJIT_ADD32 (SLJIT_ADD | SLJIT_I32_OP)
/* Flags: I | C | K */ /* Flags: I | C | K */
#define SLJIT_ADDC (SLJIT_OP2_BASE + 1) #define SLJIT_ADDC (SLJIT_OP2_BASE + 1)
#define SLJIT_IADDC (SLJIT_ADDC | SLJIT_INT_OP) #define SLJIT_ADDC32 (SLJIT_ADDC | SLJIT_I32_OP)
/* Flags: I | E | U | S | O | C | K */ /* Flags: I | E | U | S | O | C | K */
#define SLJIT_SUB (SLJIT_OP2_BASE + 2) #define SLJIT_SUB (SLJIT_OP2_BASE + 2)
#define SLJIT_ISUB (SLJIT_SUB | SLJIT_INT_OP) #define SLJIT_SUB32 (SLJIT_SUB | SLJIT_I32_OP)
/* Flags: I | C | K */ /* Flags: I | C | K */
#define SLJIT_SUBC (SLJIT_OP2_BASE + 3) #define SLJIT_SUBC (SLJIT_OP2_BASE + 3)
#define SLJIT_ISUBC (SLJIT_SUBC | SLJIT_INT_OP) #define SLJIT_SUBC32 (SLJIT_SUBC | SLJIT_I32_OP)
/* Note: integer mul /* Note: integer mul
Flags: I | O (see SLJIT_C_MUL_*) | K */ Flags: I | O (see SLJIT_C_MUL_*) | K */
#define SLJIT_MUL (SLJIT_OP2_BASE + 4) #define SLJIT_MUL (SLJIT_OP2_BASE + 4)
#define SLJIT_IMUL (SLJIT_MUL | SLJIT_INT_OP) #define SLJIT_MUL32 (SLJIT_MUL | SLJIT_I32_OP)
/* Flags: I | E | K */ /* Flags: I | E | K */
#define SLJIT_AND (SLJIT_OP2_BASE + 5) #define SLJIT_AND (SLJIT_OP2_BASE + 5)
#define SLJIT_IAND (SLJIT_AND | SLJIT_INT_OP) #define SLJIT_AND32 (SLJIT_AND | SLJIT_I32_OP)
/* Flags: I | E | K */ /* Flags: I | E | K */
#define SLJIT_OR (SLJIT_OP2_BASE + 6) #define SLJIT_OR (SLJIT_OP2_BASE + 6)
#define SLJIT_IOR (SLJIT_OR | SLJIT_INT_OP) #define SLJIT_OR32 (SLJIT_OR | SLJIT_I32_OP)
/* Flags: I | E | K */ /* Flags: I | E | K */
#define SLJIT_XOR (SLJIT_OP2_BASE + 7) #define SLJIT_XOR (SLJIT_OP2_BASE + 7)
#define SLJIT_IXOR (SLJIT_XOR | SLJIT_INT_OP) #define SLJIT_XOR32 (SLJIT_XOR | SLJIT_I32_OP)
/* Flags: I | E | K /* Flags: I | E | K
Let bit_length be the length of the shift operation: 32 or 64. Let bit_length be the length of the shift operation: 32 or 64.
If src2 is immediate, src2w is masked by (bit_length - 1). If src2 is immediate, src2w is masked by (bit_length - 1).
Otherwise, if the content of src2 is outside the range from 0 Otherwise, if the content of src2 is outside the range from 0
to bit_length - 1, the result is undefined. */ to bit_length - 1, the result is undefined. */
#define SLJIT_SHL (SLJIT_OP2_BASE + 8) #define SLJIT_SHL (SLJIT_OP2_BASE + 8)
#define SLJIT_ISHL (SLJIT_SHL | SLJIT_INT_OP) #define SLJIT_SHL32 (SLJIT_SHL | SLJIT_I32_OP)
/* Flags: I | E | K /* Flags: I | E | K
Let bit_length be the length of the shift operation: 32 or 64. Let bit_length be the length of the shift operation: 32 or 64.
If src2 is immediate, src2w is masked by (bit_length - 1). If src2 is immediate, src2w is masked by (bit_length - 1).
Otherwise, if the content of src2 is outside the range from 0 Otherwise, if the content of src2 is outside the range from 0
to bit_length - 1, the result is undefined. */ to bit_length - 1, the result is undefined. */
#define SLJIT_LSHR (SLJIT_OP2_BASE + 9) #define SLJIT_LSHR (SLJIT_OP2_BASE + 9)
#define SLJIT_ILSHR (SLJIT_LSHR | SLJIT_INT_OP) #define SLJIT_LSHR32 (SLJIT_LSHR | SLJIT_I32_OP)
/* Flags: I | E | K /* Flags: I | E | K
Let bit_length be the length of the shift operation: 32 or 64. Let bit_length be the length of the shift operation: 32 or 64.
If src2 is immediate, src2w is masked by (bit_length - 1). If src2 is immediate, src2w is masked by (bit_length - 1).
Otherwise, if the content of src2 is outside the range from 0 Otherwise, if the content of src2 is outside the range from 0
to bit_length - 1, the result is undefined. */ to bit_length - 1, the result is undefined. */
#define SLJIT_ASHR (SLJIT_OP2_BASE + 10) #define SLJIT_ASHR (SLJIT_OP2_BASE + 10)
#define SLJIT_IASHR (SLJIT_ASHR | SLJIT_INT_OP) #define SLJIT_ASHR32 (SLJIT_ASHR | SLJIT_I32_OP)
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler, sljit_si op, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src1, sljit_sw src1w, sljit_s32 src1, sljit_sw src1w,
sljit_si src2, sljit_sw src2w); sljit_s32 src2, sljit_sw src2w);
/* Returns with non-zero if fpu is available. */ /* Returns with non-zero if fpu is available. */
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_is_fpu_available(void); SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_is_fpu_available(void);
/* Starting index of opcodes for sljit_emit_fop1. */ /* Starting index of opcodes for sljit_emit_fop1. */
#define SLJIT_FOP1_BASE 128 #define SLJIT_FOP1_BASE 128
/* Flags: SP - (never set any flags) */ /* Flags: SP - (never set any flags) */
#define SLJIT_DMOV (SLJIT_FOP1_BASE + 0) #define SLJIT_MOV_F64 (SLJIT_FOP1_BASE + 0)
#define SLJIT_SMOV (SLJIT_DMOV | SLJIT_SINGLE_OP) #define SLJIT_MOV_F32 (SLJIT_MOV_F64 | SLJIT_F32_OP)
/* Convert opcodes: CONV[DST_TYPE].FROM[SRC_TYPE] /* Convert opcodes: CONV[DST_TYPE].FROM[SRC_TYPE]
SRC/DST TYPE can be: D - double, S - single, W - signed word, I - signed int SRC/DST TYPE can be: D - double, S - single, W - signed word, I - signed int
Rounding mode when the destination is W or I: round towards zero. */ Rounding mode when the destination is W or I: round towards zero. */
/* Flags: SP - (never set any flags) */ /* Flags: SP - (never set any flags) */
#define SLJIT_CONVD_FROMS (SLJIT_FOP1_BASE + 1) #define SLJIT_CONV_F64_FROM_F32 (SLJIT_FOP1_BASE + 1)
#define SLJIT_CONVS_FROMD (SLJIT_CONVD_FROMS | SLJIT_SINGLE_OP) #define SLJIT_CONV_F32_FROM_F64 (SLJIT_CONV_F64_FROM_F32 | SLJIT_F32_OP)
/* Flags: SP - (never set any flags) */ /* Flags: SP - (never set any flags) */
#define SLJIT_CONVW_FROMD (SLJIT_FOP1_BASE + 2) #define SLJIT_CONV_SW_FROM_F64 (SLJIT_FOP1_BASE + 2)
#define SLJIT_CONVW_FROMS (SLJIT_CONVW_FROMD | SLJIT_SINGLE_OP) #define SLJIT_CONV_SW_FROM_F32 (SLJIT_CONV_SW_FROM_F64 | SLJIT_F32_OP)
/* Flags: SP - (never set any flags) */ /* Flags: SP - (never set any flags) */
#define SLJIT_CONVI_FROMD (SLJIT_FOP1_BASE + 3) #define SLJIT_CONV_S32_FROM_F64 (SLJIT_FOP1_BASE + 3)
#define SLJIT_CONVI_FROMS (SLJIT_CONVI_FROMD | SLJIT_SINGLE_OP) #define SLJIT_CONV_S32_FROM_F32 (SLJIT_CONV_S32_FROM_F64 | SLJIT_F32_OP)
/* Flags: SP - (never set any flags) */ /* Flags: SP - (never set any flags) */
#define SLJIT_CONVD_FROMW (SLJIT_FOP1_BASE + 4) #define SLJIT_CONV_F64_FROM_SW (SLJIT_FOP1_BASE + 4)
#define SLJIT_CONVS_FROMW (SLJIT_CONVD_FROMW | SLJIT_SINGLE_OP) #define SLJIT_CONV_F32_FROM_SW (SLJIT_CONV_F64_FROM_SW | SLJIT_F32_OP)
/* Flags: SP - (never set any flags) */ /* Flags: SP - (never set any flags) */
#define SLJIT_CONVD_FROMI (SLJIT_FOP1_BASE + 5) #define SLJIT_CONV_F64_FROM_S32 (SLJIT_FOP1_BASE + 5)
#define SLJIT_CONVS_FROMI (SLJIT_CONVD_FROMI | SLJIT_SINGLE_OP) #define SLJIT_CONV_F32_FROM_S32 (SLJIT_CONV_F64_FROM_S32 | SLJIT_F32_OP)
/* Note: dst is the left and src is the right operand for SLJIT_CMPD. /* Note: dst is the left and src is the right operand for SLJIT_CMPD.
Note: NaN check is always performed. If SLJIT_C_FLOAT_UNORDERED flag Note: NaN check is always performed. If SLJIT_C_FLOAT_UNORDERED flag
is set, the comparison result is unpredictable. is set, the comparison result is unpredictable.
Flags: SP | E | S (see SLJIT_C_FLOAT_*) */ Flags: SP | E | S (see SLJIT_C_FLOAT_*) */
#define SLJIT_DCMP (SLJIT_FOP1_BASE + 6) #define SLJIT_CMP_F64 (SLJIT_FOP1_BASE + 6)
#define SLJIT_SCMP (SLJIT_DCMP | SLJIT_SINGLE_OP) #define SLJIT_CMP_F32 (SLJIT_CMP_F64 | SLJIT_F32_OP)
/* Flags: SP - (never set any flags) */ /* Flags: SP - (never set any flags) */
#define SLJIT_DNEG (SLJIT_FOP1_BASE + 7) #define SLJIT_NEG_F64 (SLJIT_FOP1_BASE + 7)
#define SLJIT_SNEG (SLJIT_DNEG | SLJIT_SINGLE_OP) #define SLJIT_NEG_F32 (SLJIT_NEG_F64 | SLJIT_F32_OP)
/* Flags: SP - (never set any flags) */ /* Flags: SP - (never set any flags) */
#define SLJIT_DABS (SLJIT_FOP1_BASE + 8) #define SLJIT_ABS_F64 (SLJIT_FOP1_BASE + 8)
#define SLJIT_SABS (SLJIT_DABS | SLJIT_SINGLE_OP) #define SLJIT_ABS_F32 (SLJIT_ABS_F64 | SLJIT_F32_OP)
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop1(struct sljit_compiler *compiler, sljit_si op, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src, sljit_sw srcw); sljit_s32 src, sljit_sw srcw);
/* Starting index of opcodes for sljit_emit_fop2. */ /* Starting index of opcodes for sljit_emit_fop2. */
#define SLJIT_FOP2_BASE 160 #define SLJIT_FOP2_BASE 160
/* Flags: SP - (never set any flags) */ /* Flags: SP - (never set any flags) */
#define SLJIT_DADD (SLJIT_FOP2_BASE + 0) #define SLJIT_ADD_F64 (SLJIT_FOP2_BASE + 0)
#define SLJIT_SADD (SLJIT_DADD | SLJIT_SINGLE_OP) #define SLJIT_ADD_F32 (SLJIT_ADD_F64 | SLJIT_F32_OP)
/* Flags: SP - (never set any flags) */ /* Flags: SP - (never set any flags) */
#define SLJIT_DSUB (SLJIT_FOP2_BASE + 1) #define SLJIT_SUB_F64 (SLJIT_FOP2_BASE + 1)
#define SLJIT_SSUB (SLJIT_DSUB | SLJIT_SINGLE_OP) #define SLJIT_SUB_F32 (SLJIT_SUB_F64 | SLJIT_F32_OP)
/* Flags: SP - (never set any flags) */ /* Flags: SP - (never set any flags) */
#define SLJIT_DMUL (SLJIT_FOP2_BASE + 2) #define SLJIT_MUL_F64 (SLJIT_FOP2_BASE + 2)
#define SLJIT_SMUL (SLJIT_DMUL | SLJIT_SINGLE_OP) #define SLJIT_MUL_F32 (SLJIT_MUL_F64 | SLJIT_F32_OP)
/* Flags: SP - (never set any flags) */ /* Flags: SP - (never set any flags) */
#define SLJIT_DDIV (SLJIT_FOP2_BASE + 3) #define SLJIT_DIV_F64 (SLJIT_FOP2_BASE + 3)
#define SLJIT_SDIV (SLJIT_DDIV | SLJIT_SINGLE_OP) #define SLJIT_DIV_F32 (SLJIT_DIV_F64 | SLJIT_F32_OP)
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compiler, sljit_si op, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src1, sljit_sw src1w, sljit_s32 src1, sljit_sw src1w,
sljit_si src2, sljit_sw src2w); sljit_s32 src2, sljit_sw src2w);
/* Label and jump instructions. */ /* Label and jump instructions. */
@ -943,58 +939,58 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compi
/* Integer comparison types. */ /* Integer comparison types. */
#define SLJIT_EQUAL 0 #define SLJIT_EQUAL 0
#define SLJIT_I_EQUAL (SLJIT_EQUAL | SLJIT_INT_OP) #define SLJIT_EQUAL32 (SLJIT_EQUAL | SLJIT_I32_OP)
#define SLJIT_ZERO 0 #define SLJIT_ZERO 0
#define SLJIT_I_ZERO (SLJIT_ZERO | SLJIT_INT_OP) #define SLJIT_ZERO32 (SLJIT_ZERO | SLJIT_I32_OP)
#define SLJIT_NOT_EQUAL 1 #define SLJIT_NOT_EQUAL 1
#define SLJIT_I_NOT_EQUAL (SLJIT_NOT_EQUAL | SLJIT_INT_OP) #define SLJIT_NOT_EQUAL32 (SLJIT_NOT_EQUAL | SLJIT_I32_OP)
#define SLJIT_NOT_ZERO 1 #define SLJIT_NOT_ZERO 1
#define SLJIT_I_NOT_ZERO (SLJIT_NOT_ZERO | SLJIT_INT_OP) #define SLJIT_NOT_ZERO32 (SLJIT_NOT_ZERO | SLJIT_I32_OP)
#define SLJIT_LESS 2 #define SLJIT_LESS 2
#define SLJIT_I_LESS (SLJIT_LESS | SLJIT_INT_OP) #define SLJIT_LESS32 (SLJIT_LESS | SLJIT_I32_OP)
#define SLJIT_GREATER_EQUAL 3 #define SLJIT_GREATER_EQUAL 3
#define SLJIT_I_GREATER_EQUAL (SLJIT_GREATER_EQUAL | SLJIT_INT_OP) #define SLJIT_GREATER_EQUAL32 (SLJIT_GREATER_EQUAL | SLJIT_I32_OP)
#define SLJIT_GREATER 4 #define SLJIT_GREATER 4
#define SLJIT_I_GREATER (SLJIT_GREATER | SLJIT_INT_OP) #define SLJIT_GREATER32 (SLJIT_GREATER | SLJIT_I32_OP)
#define SLJIT_LESS_EQUAL 5 #define SLJIT_LESS_EQUAL 5
#define SLJIT_I_LESS_EQUAL (SLJIT_LESS_EQUAL | SLJIT_INT_OP) #define SLJIT_LESS_EQUAL32 (SLJIT_LESS_EQUAL | SLJIT_I32_OP)
#define SLJIT_SIG_LESS 6 #define SLJIT_SIG_LESS 6
#define SLJIT_I_SIG_LESS (SLJIT_SIG_LESS | SLJIT_INT_OP) #define SLJIT_SIG_LESS32 (SLJIT_SIG_LESS | SLJIT_I32_OP)
#define SLJIT_SIG_GREATER_EQUAL 7 #define SLJIT_SIG_GREATER_EQUAL 7
#define SLJIT_I_SIG_GREATER_EQUAL (SLJIT_SIG_GREATER_EQUAL | SLJIT_INT_OP) #define SLJIT_SIG_GREATER_EQUAL32 (SLJIT_SIG_GREATER_EQUAL | SLJIT_I32_OP)
#define SLJIT_SIG_GREATER 8 #define SLJIT_SIG_GREATER 8
#define SLJIT_I_SIG_GREATER (SLJIT_SIG_GREATER | SLJIT_INT_OP) #define SLJIT_SIG_GREATER32 (SLJIT_SIG_GREATER | SLJIT_I32_OP)
#define SLJIT_SIG_LESS_EQUAL 9 #define SLJIT_SIG_LESS_EQUAL 9
#define SLJIT_I_SIG_LESS_EQUAL (SLJIT_SIG_LESS_EQUAL | SLJIT_INT_OP) #define SLJIT_SIG_LESS_EQUAL32 (SLJIT_SIG_LESS_EQUAL | SLJIT_I32_OP)
#define SLJIT_OVERFLOW 10 #define SLJIT_OVERFLOW 10
#define SLJIT_I_OVERFLOW (SLJIT_OVERFLOW | SLJIT_INT_OP) #define SLJIT_OVERFLOW32 (SLJIT_OVERFLOW | SLJIT_I32_OP)
#define SLJIT_NOT_OVERFLOW 11 #define SLJIT_NOT_OVERFLOW 11
#define SLJIT_I_NOT_OVERFLOW (SLJIT_NOT_OVERFLOW | SLJIT_INT_OP) #define SLJIT_NOT_OVERFLOW32 (SLJIT_NOT_OVERFLOW | SLJIT_I32_OP)
#define SLJIT_MUL_OVERFLOW 12 #define SLJIT_MUL_OVERFLOW 12
#define SLJIT_I_MUL_OVERFLOW (SLJIT_MUL_OVERFLOW | SLJIT_INT_OP) #define SLJIT_MUL_OVERFLOW32 (SLJIT_MUL_OVERFLOW | SLJIT_I32_OP)
#define SLJIT_MUL_NOT_OVERFLOW 13 #define SLJIT_MUL_NOT_OVERFLOW 13
#define SLJIT_I_MUL_NOT_OVERFLOW (SLJIT_MUL_NOT_OVERFLOW | SLJIT_INT_OP) #define SLJIT_MUL_NOT_OVERFLOW32 (SLJIT_MUL_NOT_OVERFLOW | SLJIT_I32_OP)
/* Floating point comparison types. */ /* Floating point comparison types. */
#define SLJIT_D_EQUAL 14 #define SLJIT_EQUAL_F64 14
#define SLJIT_S_EQUAL (SLJIT_D_EQUAL | SLJIT_SINGLE_OP) #define SLJIT_EQUAL_F32 (SLJIT_EQUAL_F64 | SLJIT_F32_OP)
#define SLJIT_D_NOT_EQUAL 15 #define SLJIT_NOT_EQUAL_F64 15
#define SLJIT_S_NOT_EQUAL (SLJIT_D_NOT_EQUAL | SLJIT_SINGLE_OP) #define SLJIT_NOT_EQUAL_F32 (SLJIT_NOT_EQUAL_F64 | SLJIT_F32_OP)
#define SLJIT_D_LESS 16 #define SLJIT_LESS_F64 16
#define SLJIT_S_LESS (SLJIT_D_LESS | SLJIT_SINGLE_OP) #define SLJIT_LESS_F32 (SLJIT_LESS_F64 | SLJIT_F32_OP)
#define SLJIT_D_GREATER_EQUAL 17 #define SLJIT_GREATER_EQUAL_F64 17
#define SLJIT_S_GREATER_EQUAL (SLJIT_D_GREATER_EQUAL | SLJIT_SINGLE_OP) #define SLJIT_GREATER_EQUAL_F32 (SLJIT_GREATER_EQUAL_F64 | SLJIT_F32_OP)
#define SLJIT_D_GREATER 18 #define SLJIT_GREATER_F64 18
#define SLJIT_S_GREATER (SLJIT_D_GREATER | SLJIT_SINGLE_OP) #define SLJIT_GREATER_F32 (SLJIT_GREATER_F64 | SLJIT_F32_OP)
#define SLJIT_D_LESS_EQUAL 19 #define SLJIT_LESS_EQUAL_F64 19
#define SLJIT_S_LESS_EQUAL (SLJIT_D_LESS_EQUAL | SLJIT_SINGLE_OP) #define SLJIT_LESS_EQUAL_F32 (SLJIT_LESS_EQUAL_F64 | SLJIT_F32_OP)
#define SLJIT_D_UNORDERED 20 #define SLJIT_UNORDERED_F64 20
#define SLJIT_S_UNORDERED (SLJIT_D_UNORDERED | SLJIT_SINGLE_OP) #define SLJIT_UNORDERED_F32 (SLJIT_UNORDERED_F64 | SLJIT_F32_OP)
#define SLJIT_D_ORDERED 21 #define SLJIT_ORDERED_F64 21
#define SLJIT_S_ORDERED (SLJIT_D_ORDERED | SLJIT_SINGLE_OP) #define SLJIT_ORDERED_F32 (SLJIT_ORDERED_F64 | SLJIT_F32_OP)
/* Unconditional jump types. */ /* Unconditional jump types. */
#define SLJIT_JUMP 22 #define SLJIT_JUMP 22
@ -1014,7 +1010,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compi
type can be combined (or'ed) with SLJIT_REWRITABLE_JUMP type can be combined (or'ed) with SLJIT_REWRITABLE_JUMP
Flags: - (never set any flags) for both conditional and unconditional jumps. Flags: - (never set any flags) for both conditional and unconditional jumps.
Flags: destroy all flags for calls. */ Flags: destroy all flags for calls. */
SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_si type); SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type);
/* Basic arithmetic comparison. In most architectures it is implemented as /* Basic arithmetic comparison. In most architectures it is implemented as
an SLJIT_SUB operation (with SLJIT_UNUSED destination and setting an SLJIT_SUB operation (with SLJIT_UNUSED destination and setting
@ -1024,23 +1020,23 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile
type must be between SLJIT_EQUAL and SLJIT_I_SIG_LESS_EQUAL type must be between SLJIT_EQUAL and SLJIT_I_SIG_LESS_EQUAL
type can be combined (or'ed) with SLJIT_REWRITABLE_JUMP type can be combined (or'ed) with SLJIT_REWRITABLE_JUMP
Flags: destroy flags. */ Flags: destroy flags. */
SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler *compiler, sljit_si type, SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler *compiler, sljit_s32 type,
sljit_si src1, sljit_sw src1w, sljit_s32 src1, sljit_sw src1w,
sljit_si src2, sljit_sw src2w); sljit_s32 src2, sljit_sw src2w);
/* Basic floating point comparison. In most architectures it is implemented as /* Basic floating point comparison. In most architectures it is implemented as
an SLJIT_FCMP operation (setting appropriate flags) followed by a an SLJIT_FCMP operation (setting appropriate flags) followed by a
sljit_emit_jump. However some architectures (i.e: MIPS) may employ sljit_emit_jump. However some architectures (i.e: MIPS) may employ
special optimizations here. It is suggested to use this comparison form special optimizations here. It is suggested to use this comparison form
when appropriate. when appropriate.
type must be between SLJIT_D_EQUAL and SLJIT_S_ORDERED type must be between SLJIT_EQUAL_F64 and SLJIT_ORDERED_F32
type can be combined (or'ed) with SLJIT_REWRITABLE_JUMP type can be combined (or'ed) with SLJIT_REWRITABLE_JUMP
Flags: destroy flags. Flags: destroy flags.
Note: if either operand is NaN, the behaviour is undefined for Note: if either operand is NaN, the behaviour is undefined for
types up to SLJIT_S_LESS_EQUAL. */ types up to SLJIT_S_LESS_EQUAL. */
SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_fcmp(struct sljit_compiler *compiler, sljit_si type, SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_fcmp(struct sljit_compiler *compiler, sljit_s32 type,
sljit_si src1, sljit_sw src1w, sljit_s32 src1, sljit_sw src1w,
sljit_si src2, sljit_sw src2w); sljit_s32 src2, sljit_sw src2w);
/* Set the destination of the jump to this label. */ /* Set the destination of the jump to this label. */
SLJIT_API_FUNC_ATTRIBUTE void sljit_set_label(struct sljit_jump *jump, struct sljit_label* label); SLJIT_API_FUNC_ATTRIBUTE void sljit_set_label(struct sljit_jump *jump, struct sljit_label* label);
@ -1053,14 +1049,14 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_target(struct sljit_jump *jump, sljit_uw
Indirect form: any other valid addressing mode Indirect form: any other valid addressing mode
Flags: - (never set any flags) for unconditional jumps. Flags: - (never set any flags) for unconditional jumps.
Flags: destroy all flags for calls. */ Flags: destroy all flags for calls. */
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_ijump(struct sljit_compiler *compiler, sljit_si type, sljit_si src, sljit_sw srcw); SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src, sljit_sw srcw);
/* Perform the operation using the conditional flags as the second argument. /* Perform the operation using the conditional flags as the second argument.
Type must always be between SLJIT_EQUAL and SLJIT_S_ORDERED. The value Type must always be between SLJIT_EQUAL and SLJIT_S_ORDERED. The value
represented by the type is 1, if the condition represented by the type represented by the type is 1, if the condition represented by the type
is fulfilled, and 0 otherwise. is fulfilled, and 0 otherwise.
If op == SLJIT_MOV, SLJIT_MOV_SI, SLJIT_MOV_UI: If op == SLJIT_MOV, SLJIT_MOV_S32, SLJIT_MOV_U32:
Set dst to the value represented by the type (0 or 1). Set dst to the value represented by the type (0 or 1).
Src must be SLJIT_UNUSED, and srcw must be 0 Src must be SLJIT_UNUSED, and srcw must be 0
Flags: - (never set any flags) Flags: - (never set any flags)
@ -1070,18 +1066,18 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_ijump(struct sljit_compiler *compil
Important note: only dst=src and dstw=srcw is supported at the moment! Important note: only dst=src and dstw=srcw is supported at the moment!
Flags: I | E | K Flags: I | E | K
Note: sljit_emit_op_flags does nothing, if dst is SLJIT_UNUSED (regardless of op). */ Note: sljit_emit_op_flags does nothing, if dst is SLJIT_UNUSED (regardless of op). */
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_si op, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src, sljit_sw srcw, sljit_s32 src, sljit_sw srcw,
sljit_si type); sljit_s32 type);
/* Copies the base address of SLJIT_SP + offset to dst. /* Copies the base address of SLJIT_SP + offset to dst.
Flags: - (never set any flags) */ Flags: - (never set any flags) */
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_local_base(struct sljit_compiler *compiler, sljit_si dst, sljit_sw dstw, sljit_sw offset); SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_local_base(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw offset);
/* The constant can be changed runtime (see: sljit_set_const) /* The constant can be changed runtime (see: sljit_set_const)
Flags: - (never set any flags) */ Flags: - (never set any flags) */
SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_si dst, sljit_sw dstw, sljit_sw init_value); SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value);
/* After the code generation the address for label, jump and const instructions /* After the code generation the address for label, jump and const instructions
are computed. Since these structures are freed by sljit_free_compiler, the are computed. Since these structures are freed by sljit_free_compiler, the
@ -1104,7 +1100,7 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_consta
/* Get the human readable name of the platform. Can be useful on platforms /* Get the human readable name of the platform. Can be useful on platforms
like ARM, where ARM and Thumb2 functions can be mixed, and like ARM, where ARM and Thumb2 functions can be mixed, and
it is useful to know the type of the code generator. */ it is useful to know the type of the code generator. */
SLJIT_API_FUNC_ATTRIBUTE SLJIT_CONST char* sljit_get_platform_name(void); SLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void);
/* Portable helper function to get an offset of a member. */ /* Portable helper function to get an offset of a member. */
#define SLJIT_OFFSETOF(base, member) ((sljit_sw)(&((base*)0x10)->member) - 0x10) #define SLJIT_OFFSETOF(base, member) ((sljit_sw)(&((base*)0x10)->member) - 0x10)
@ -1196,14 +1192,14 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_function_context(void** func_ptr, struct
Note: it returns with -1 for virtual registers (only on x86-32). */ Note: it returns with -1 for virtual registers (only on x86-32). */
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_register_index(sljit_si reg); SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg);
/* The following function is a helper function for sljit_emit_op_custom. /* The following function is a helper function for sljit_emit_op_custom.
It returns with the real machine register index of any SLJIT_FLOAT register. It returns with the real machine register index of any SLJIT_FLOAT register.
Note: the index is always an even number on ARM (except ARM-64), MIPS, and SPARC. */ Note: the index is always an even number on ARM (except ARM-64), MIPS, and SPARC. */
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_float_register_index(sljit_si reg); SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg);
/* Any instruction can be inserted into the instruction stream by /* Any instruction can be inserted into the instruction stream by
sljit_emit_op_custom. It has a similar purpose as inline assembly. sljit_emit_op_custom. It has a similar purpose as inline assembly.
@ -1215,18 +1211,18 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_float_register_index(sljit_si reg);
if size == 4, the instruction argument must be 4 byte aligned. if size == 4, the instruction argument must be 4 byte aligned.
Otherwise: size must be 4 and instruction argument must be 4 byte aligned. */ Otherwise: size must be 4 and instruction argument must be 4 byte aligned. */
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_custom(struct sljit_compiler *compiler, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler,
void *instruction, sljit_si size); void *instruction, sljit_s32 size);
#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86) #if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
/* Returns with non-zero if sse2 is available. */ /* Returns with non-zero if sse2 is available. */
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_x86_is_sse2_available(void); SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_x86_is_sse2_available(void);
/* Returns with non-zero if cmov instruction is available. */ /* Returns with non-zero if cmov instruction is available. */
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_x86_is_cmov_available(void); SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_x86_is_cmov_available(void);
/* Emit a conditional mov instruction on x86 CPUs. This instruction /* Emit a conditional mov instruction on x86 CPUs. This instruction
moves src to destination, if the condition is satisfied. Unlike moves src to destination, if the condition is satisfied. Unlike
@ -1235,14 +1231,14 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_x86_is_cmov_available(void);
checked by sljit_x86_is_cmov_available function. checked by sljit_x86_is_cmov_available function.
type must be between SLJIT_EQUAL and SLJIT_S_ORDERED type must be between SLJIT_EQUAL and SLJIT_S_ORDERED
dst_reg must be a valid register and it can be combined dst_reg must be a valid register and it can be combined
with SLJIT_INT_OP to perform 32 bit arithmetic with SLJIT_I32_OP to perform 32 bit arithmetic
Flags: I - (never set any flags) Flags: I - (never set any flags)
*/ */
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_x86_emit_cmov(struct sljit_compiler *compiler, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_x86_emit_cmov(struct sljit_compiler *compiler,
sljit_si type, sljit_s32 type,
sljit_si dst_reg, sljit_s32 dst_reg,
sljit_si src, sljit_sw srcw); sljit_s32 src, sljit_sw srcw);
#endif #endif

View File

@ -24,7 +24,7 @@
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
SLJIT_API_FUNC_ATTRIBUTE SLJIT_CONST char* sljit_get_platform_name(void) SLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void)
{ {
#if (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) #if (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
return "ARMv7" SLJIT_CPUINFO; return "ARMv7" SLJIT_CPUINFO;
@ -52,10 +52,10 @@ SLJIT_API_FUNC_ATTRIBUTE SLJIT_CONST char* sljit_get_platform_name(void)
#define ALIGN_INSTRUCTION(ptr) \ #define ALIGN_INSTRUCTION(ptr) \
(sljit_uw*)(((sljit_uw)(ptr) + (CONST_POOL_ALIGNMENT * sizeof(sljit_uw)) - 1) & ~((CONST_POOL_ALIGNMENT * sizeof(sljit_uw)) - 1)) (sljit_uw*)(((sljit_uw)(ptr) + (CONST_POOL_ALIGNMENT * sizeof(sljit_uw)) - 1) & ~((CONST_POOL_ALIGNMENT * sizeof(sljit_uw)) - 1))
#define MAX_DIFFERENCE(max_diff) \ #define MAX_DIFFERENCE(max_diff) \
(((max_diff) / (sljit_si)sizeof(sljit_uw)) - (CONST_POOL_ALIGNMENT - 1)) (((max_diff) / (sljit_s32)sizeof(sljit_uw)) - (CONST_POOL_ALIGNMENT - 1))
/* See sljit_emit_enter and sljit_emit_op0 if you want to change them. */ /* See sljit_emit_enter and sljit_emit_op0 if you want to change them. */
static SLJIT_CONST sljit_ub reg_map[SLJIT_NUMBER_OF_REGISTERS + 6] = { static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 6] = {
0, 0, 1, 2, 11, 10, 9, 8, 7, 6, 5, 4, 13, 3, 12, 14, 15 0, 0, 1, 2, 11, 10, 9, 8, 7, 6, 5, 4, 13, 3, 12, 14, 15
}; };
@ -126,13 +126,13 @@ static SLJIT_CONST sljit_ub reg_map[SLJIT_NUMBER_OF_REGISTERS + 6] = {
#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
static sljit_si push_cpool(struct sljit_compiler *compiler) static sljit_s32 push_cpool(struct sljit_compiler *compiler)
{ {
/* Pushing the constant pool into the instruction stream. */ /* Pushing the constant pool into the instruction stream. */
sljit_uw* inst; sljit_uw* inst;
sljit_uw* cpool_ptr; sljit_uw* cpool_ptr;
sljit_uw* cpool_end; sljit_uw* cpool_end;
sljit_si i; sljit_s32 i;
/* The label could point the address after the constant pool. */ /* The label could point the address after the constant pool. */
if (compiler->last_label && compiler->last_label->size == compiler->size) if (compiler->last_label && compiler->last_label->size == compiler->size)
@ -164,7 +164,7 @@ static sljit_si push_cpool(struct sljit_compiler *compiler)
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
static sljit_si push_inst(struct sljit_compiler *compiler, sljit_uw inst) static sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_uw inst)
{ {
sljit_uw* ptr; sljit_uw* ptr;
@ -178,13 +178,13 @@ static sljit_si push_inst(struct sljit_compiler *compiler, sljit_uw inst)
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
static sljit_si push_inst_with_literal(struct sljit_compiler *compiler, sljit_uw inst, sljit_uw literal) static sljit_s32 push_inst_with_literal(struct sljit_compiler *compiler, sljit_uw inst, sljit_uw literal)
{ {
sljit_uw* ptr; sljit_uw* ptr;
sljit_uw cpool_index = CPOOL_SIZE; sljit_uw cpool_index = CPOOL_SIZE;
sljit_uw* cpool_ptr; sljit_uw* cpool_ptr;
sljit_uw* cpool_end; sljit_uw* cpool_end;
sljit_ub* cpool_unique_ptr; sljit_u8* cpool_unique_ptr;
if (SLJIT_UNLIKELY(compiler->cpool_diff != CONST_POOL_EMPTY && compiler->size - compiler->cpool_diff >= MAX_DIFFERENCE(4092))) if (SLJIT_UNLIKELY(compiler->cpool_diff != CONST_POOL_EMPTY && compiler->size - compiler->cpool_diff >= MAX_DIFFERENCE(4092)))
FAIL_IF(push_cpool(compiler)); FAIL_IF(push_cpool(compiler));
@ -228,7 +228,7 @@ static sljit_si push_inst_with_literal(struct sljit_compiler *compiler, sljit_uw
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
static sljit_si push_inst_with_unique_literal(struct sljit_compiler *compiler, sljit_uw inst, sljit_uw literal) static sljit_s32 push_inst_with_unique_literal(struct sljit_compiler *compiler, sljit_uw inst, sljit_uw literal)
{ {
sljit_uw* ptr; sljit_uw* ptr;
if (SLJIT_UNLIKELY((compiler->cpool_diff != CONST_POOL_EMPTY && compiler->size - compiler->cpool_diff >= MAX_DIFFERENCE(4092)) || compiler->cpool_fill >= CPOOL_SIZE)) if (SLJIT_UNLIKELY((compiler->cpool_diff != CONST_POOL_EMPTY && compiler->size - compiler->cpool_diff >= MAX_DIFFERENCE(4092)) || compiler->cpool_fill >= CPOOL_SIZE))
@ -248,7 +248,7 @@ static sljit_si push_inst_with_unique_literal(struct sljit_compiler *compiler, s
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
static SLJIT_INLINE sljit_si prepare_blx(struct sljit_compiler *compiler) static SLJIT_INLINE sljit_s32 prepare_blx(struct sljit_compiler *compiler)
{ {
/* Place for at least two instruction (doesn't matter whether the first has a literal). */ /* Place for at least two instruction (doesn't matter whether the first has a literal). */
if (SLJIT_UNLIKELY(compiler->cpool_diff != CONST_POOL_EMPTY && compiler->size - compiler->cpool_diff >= MAX_DIFFERENCE(4088))) if (SLJIT_UNLIKELY(compiler->cpool_diff != CONST_POOL_EMPTY && compiler->size - compiler->cpool_diff >= MAX_DIFFERENCE(4088)))
@ -256,7 +256,7 @@ static SLJIT_INLINE sljit_si prepare_blx(struct sljit_compiler *compiler)
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
static SLJIT_INLINE sljit_si emit_blx(struct sljit_compiler *compiler) static SLJIT_INLINE sljit_s32 emit_blx(struct sljit_compiler *compiler)
{ {
/* Must follow tightly the previous instruction (to be able to convert it to bl instruction). */ /* Must follow tightly the previous instruction (to be able to convert it to bl instruction). */
SLJIT_ASSERT(compiler->cpool_diff == CONST_POOL_EMPTY || compiler->size - compiler->cpool_diff < MAX_DIFFERENCE(4092)); SLJIT_ASSERT(compiler->cpool_diff == CONST_POOL_EMPTY || compiler->size - compiler->cpool_diff < MAX_DIFFERENCE(4092));
@ -286,7 +286,7 @@ static sljit_uw patch_pc_relative_loads(sljit_uw *last_pc_patch, sljit_uw *code_
/* Must be a load instruction with immediate offset. */ /* Must be a load instruction with immediate offset. */
SLJIT_ASSERT(ind < cpool_size && !(*last_pc_patch & (1 << 25)) && (*last_pc_patch & (1 << 20))); SLJIT_ASSERT(ind < cpool_size && !(*last_pc_patch & (1 << 25)) && (*last_pc_patch & (1 << 20)));
if ((sljit_si)const_pool[ind] < 0) { if ((sljit_s32)const_pool[ind] < 0) {
const_pool[ind] = counter; const_pool[ind] = counter;
ind = counter; ind = counter;
counter++; counter++;
@ -311,26 +311,26 @@ static sljit_uw patch_pc_relative_loads(sljit_uw *last_pc_patch, sljit_uw *code_
/* In some rare ocasions we may need future patches. The probability is close to 0 in practice. */ /* In some rare ocasions we may need future patches. The probability is close to 0 in practice. */
struct future_patch { struct future_patch {
struct future_patch* next; struct future_patch* next;
sljit_si index; sljit_s32 index;
sljit_si value; sljit_s32 value;
}; };
static sljit_si resolve_const_pool_index(struct sljit_compiler *compiler, struct future_patch **first_patch, sljit_uw cpool_current_index, sljit_uw *cpool_start_address, sljit_uw *buf_ptr) static sljit_s32 resolve_const_pool_index(struct sljit_compiler *compiler, struct future_patch **first_patch, sljit_uw cpool_current_index, sljit_uw *cpool_start_address, sljit_uw *buf_ptr)
{ {
sljit_si value; sljit_s32 value;
struct future_patch *curr_patch, *prev_patch; struct future_patch *curr_patch, *prev_patch;
SLJIT_UNUSED_ARG(compiler); SLJIT_UNUSED_ARG(compiler);
/* Using the values generated by patch_pc_relative_loads. */ /* Using the values generated by patch_pc_relative_loads. */
if (!*first_patch) if (!*first_patch)
value = (sljit_si)cpool_start_address[cpool_current_index]; value = (sljit_s32)cpool_start_address[cpool_current_index];
else { else {
curr_patch = *first_patch; curr_patch = *first_patch;
prev_patch = 0; prev_patch = NULL;
while (1) { while (1) {
if (!curr_patch) { if (!curr_patch) {
value = (sljit_si)cpool_start_address[cpool_current_index]; value = (sljit_s32)cpool_start_address[cpool_current_index];
break; break;
} }
if ((sljit_uw)curr_patch->index == cpool_current_index) { if ((sljit_uw)curr_patch->index == cpool_current_index) {
@ -370,7 +370,7 @@ static sljit_si resolve_const_pool_index(struct sljit_compiler *compiler, struct
#else #else
static sljit_si push_inst(struct sljit_compiler *compiler, sljit_uw inst) static sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_uw inst)
{ {
sljit_uw* ptr; sljit_uw* ptr;
@ -381,7 +381,7 @@ static sljit_si push_inst(struct sljit_compiler *compiler, sljit_uw inst)
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
static SLJIT_INLINE sljit_si emit_imm(struct sljit_compiler *compiler, sljit_si reg, sljit_sw imm) static SLJIT_INLINE sljit_s32 emit_imm(struct sljit_compiler *compiler, sljit_s32 reg, sljit_sw imm)
{ {
FAIL_IF(push_inst(compiler, MOVW | RD(reg) | ((imm << 4) & 0xf0000) | (imm & 0xfff))); FAIL_IF(push_inst(compiler, MOVW | RD(reg) | ((imm << 4) & 0xf0000) | (imm & 0xfff)));
return push_inst(compiler, MOVT | RD(reg) | ((imm >> 12) & 0xf0000) | ((imm >> 16) & 0xfff)); return push_inst(compiler, MOVT | RD(reg) | ((imm >> 12) & 0xf0000) | ((imm >> 16) & 0xfff));
@ -389,7 +389,7 @@ static SLJIT_INLINE sljit_si emit_imm(struct sljit_compiler *compiler, sljit_si
#endif #endif
static SLJIT_INLINE sljit_si detect_jump_type(struct sljit_jump *jump, sljit_uw *code_ptr, sljit_uw *code) static SLJIT_INLINE sljit_s32 detect_jump_type(struct sljit_jump *jump, sljit_uw *code_ptr, sljit_uw *code)
{ {
sljit_sw diff; sljit_sw diff;
@ -446,13 +446,13 @@ static SLJIT_INLINE sljit_si detect_jump_type(struct sljit_jump *jump, sljit_uw
return 0; return 0;
} }
static SLJIT_INLINE void inline_set_jump_addr(sljit_uw addr, sljit_uw new_addr, sljit_si flush) static SLJIT_INLINE void inline_set_jump_addr(sljit_uw addr, sljit_uw new_addr, sljit_s32 flush)
{ {
#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
sljit_uw *ptr = (sljit_uw*)addr; sljit_uw *ptr = (sljit_uw*)addr;
sljit_uw *inst = (sljit_uw*)ptr[0]; sljit_uw *inst = (sljit_uw*)ptr[0];
sljit_uw mov_pc = ptr[1]; sljit_uw mov_pc = ptr[1];
sljit_si bl = (mov_pc & 0x0000f000) != RD(TMP_PC); sljit_s32 bl = (mov_pc & 0x0000f000) != RD(TMP_PC);
sljit_sw diff = (sljit_sw)(((sljit_sw)new_addr - (sljit_sw)(inst + 2)) >> 2); sljit_sw diff = (sljit_sw)(((sljit_sw)new_addr - (sljit_sw)(inst + 2)) >> 2);
if (diff <= 0x7fffff && diff >= -0x800000) { if (diff <= 0x7fffff && diff >= -0x800000) {
@ -504,7 +504,7 @@ static SLJIT_INLINE void inline_set_jump_addr(sljit_uw addr, sljit_uw new_addr,
static sljit_uw get_imm(sljit_uw imm); static sljit_uw get_imm(sljit_uw imm);
static SLJIT_INLINE void inline_set_const(sljit_uw addr, sljit_sw new_constant, sljit_si flush) static SLJIT_INLINE void inline_set_const(sljit_uw addr, sljit_sw new_constant, sljit_s32 flush)
{ {
#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
sljit_uw *ptr = (sljit_uw*)addr; sljit_uw *ptr = (sljit_uw*)addr;
@ -789,7 +789,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
} }
#endif #endif
SLJIT_ASSERT(code_ptr - code <= (sljit_si)size); SLJIT_ASSERT(code_ptr - code <= (sljit_s32)size);
compiler->error = SLJIT_ERR_COMPILED; compiler->error = SLJIT_ERR_COMPILED;
compiler->executable_size = (code_ptr - code) * sizeof(sljit_uw); compiler->executable_size = (code_ptr - code) * sizeof(sljit_uw);
@ -820,16 +820,16 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
#define EMIT_DATA_PROCESS_INS(opcode, set_flags, dst, src1, src2) \ #define EMIT_DATA_PROCESS_INS(opcode, set_flags, dst, src1, src2) \
(0xe0000000 | ((opcode) << 21) | (set_flags) | RD(dst) | RN(src1) | (src2)) (0xe0000000 | ((opcode) << 21) | (set_flags) | RD(dst) | RN(src1) | (src2))
static sljit_si emit_op(struct sljit_compiler *compiler, sljit_si op, sljit_si inp_flags, static sljit_s32 emit_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 inp_flags,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src1, sljit_sw src1w, sljit_s32 src1, sljit_sw src1w,
sljit_si src2, sljit_sw src2w); sljit_s32 src2, sljit_sw src2w);
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compiler, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler,
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds, sljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 saveds,
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size) sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
{ {
sljit_si size, i, tmp; sljit_s32 size, i, tmp;
sljit_uw push; sljit_uw push;
CHECK_ERROR(); CHECK_ERROR();
@ -866,11 +866,11 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_set_context(struct sljit_compiler *compiler, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler,
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds, sljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 saveds,
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size) sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
{ {
sljit_si size; sljit_s32 size;
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size)); CHECK(check_sljit_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size));
@ -881,9 +881,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_set_context(struct sljit_compiler *compi
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compiler, sljit_si op, sljit_si src, sljit_sw srcw) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw)
{ {
sljit_si i, tmp; sljit_s32 i, tmp;
sljit_uw pop; sljit_uw pop;
CHECK_ERROR(); CHECK_ERROR();
@ -983,8 +983,8 @@ static sljit_sw data_transfer_insts[16] = {
} \ } \
return push_inst(compiler, EMIT_DATA_PROCESS_INS(MOV_DP, flags & SET_FLAGS, dst, SLJIT_UNUSED, (reg_map[(flags & ARGS_SWAPPED) ? src1 : src2] << 8) | (opcode << 5) | 0x10 | ((flags & ARGS_SWAPPED) ? reg_map[src2] : reg_map[src1]))); return push_inst(compiler, EMIT_DATA_PROCESS_INS(MOV_DP, flags & SET_FLAGS, dst, SLJIT_UNUSED, (reg_map[(flags & ARGS_SWAPPED) ? src1 : src2] << 8) | (opcode << 5) | 0x10 | ((flags & ARGS_SWAPPED) ? reg_map[src2] : reg_map[src1])));
static SLJIT_INLINE sljit_si emit_single_op(struct sljit_compiler *compiler, sljit_si op, sljit_si flags, static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 flags,
sljit_si dst, sljit_si src1, sljit_si src2) sljit_s32 dst, sljit_s32 src1, sljit_s32 src2)
{ {
sljit_sw mul_inst; sljit_sw mul_inst;
@ -1001,17 +1001,17 @@ static SLJIT_INLINE sljit_si emit_single_op(struct sljit_compiler *compiler, slj
} }
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
case SLJIT_MOV_UB: case SLJIT_MOV_U8:
case SLJIT_MOV_SB: case SLJIT_MOV_S8:
SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & ARGS_SWAPPED)); SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & ARGS_SWAPPED));
if ((flags & (REG_DEST | REG_SOURCE)) == (REG_DEST | REG_SOURCE)) { if ((flags & (REG_DEST | REG_SOURCE)) == (REG_DEST | REG_SOURCE)) {
#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
if (op == SLJIT_MOV_UB) if (op == SLJIT_MOV_U8)
return push_inst(compiler, EMIT_DATA_PROCESS_INS(AND_DP, 0, dst, src2, SRC2_IMM | 0xff)); return push_inst(compiler, EMIT_DATA_PROCESS_INS(AND_DP, 0, dst, src2, SRC2_IMM | 0xff));
FAIL_IF(push_inst(compiler, EMIT_DATA_PROCESS_INS(MOV_DP, 0, dst, SLJIT_UNUSED, (24 << 7) | reg_map[src2]))); FAIL_IF(push_inst(compiler, EMIT_DATA_PROCESS_INS(MOV_DP, 0, dst, SLJIT_UNUSED, (24 << 7) | reg_map[src2])));
return push_inst(compiler, EMIT_DATA_PROCESS_INS(MOV_DP, 0, dst, SLJIT_UNUSED, (24 << 7) | (op == SLJIT_MOV_UB ? 0x20 : 0x40) | reg_map[dst])); return push_inst(compiler, EMIT_DATA_PROCESS_INS(MOV_DP, 0, dst, SLJIT_UNUSED, (24 << 7) | (op == SLJIT_MOV_U8 ? 0x20 : 0x40) | reg_map[dst]));
#else #else
return push_inst(compiler, (op == SLJIT_MOV_UB ? UXTB : SXTB) | RD(dst) | RM(src2)); return push_inst(compiler, (op == SLJIT_MOV_U8 ? UXTB : SXTB) | RD(dst) | RM(src2));
#endif #endif
} }
else if (dst != src2) { else if (dst != src2) {
@ -1022,15 +1022,15 @@ static SLJIT_INLINE sljit_si emit_single_op(struct sljit_compiler *compiler, slj
} }
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
case SLJIT_MOV_UH: case SLJIT_MOV_U16:
case SLJIT_MOV_SH: case SLJIT_MOV_S16:
SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & ARGS_SWAPPED)); SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & ARGS_SWAPPED));
if ((flags & (REG_DEST | REG_SOURCE)) == (REG_DEST | REG_SOURCE)) { if ((flags & (REG_DEST | REG_SOURCE)) == (REG_DEST | REG_SOURCE)) {
#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
FAIL_IF(push_inst(compiler, EMIT_DATA_PROCESS_INS(MOV_DP, 0, dst, SLJIT_UNUSED, (16 << 7) | reg_map[src2]))); FAIL_IF(push_inst(compiler, EMIT_DATA_PROCESS_INS(MOV_DP, 0, dst, SLJIT_UNUSED, (16 << 7) | reg_map[src2])));
return push_inst(compiler, EMIT_DATA_PROCESS_INS(MOV_DP, 0, dst, SLJIT_UNUSED, (16 << 7) | (op == SLJIT_MOV_UH ? 0x20 : 0x40) | reg_map[dst])); return push_inst(compiler, EMIT_DATA_PROCESS_INS(MOV_DP, 0, dst, SLJIT_UNUSED, (16 << 7) | (op == SLJIT_MOV_U16 ? 0x20 : 0x40) | reg_map[dst]));
#else #else
return push_inst(compiler, (op == SLJIT_MOV_UH ? UXTH : SXTH) | RD(dst) | RM(src2)); return push_inst(compiler, (op == SLJIT_MOV_U16 ? UXTH : SXTH) | RD(dst) | RM(src2));
#endif #endif
} }
else if (dst != src2) { else if (dst != src2) {
@ -1139,7 +1139,7 @@ static SLJIT_INLINE sljit_si emit_single_op(struct sljit_compiler *compiler, slj
Returns with 0 if not possible. */ Returns with 0 if not possible. */
static sljit_uw get_imm(sljit_uw imm) static sljit_uw get_imm(sljit_uw imm)
{ {
sljit_si rol; sljit_s32 rol;
if (imm <= 0xff) if (imm <= 0xff)
return SRC2_IMM | imm; return SRC2_IMM | imm;
@ -1175,12 +1175,12 @@ static sljit_uw get_imm(sljit_uw imm)
} }
#if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) #if (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5)
static sljit_si generate_int(struct sljit_compiler *compiler, sljit_si reg, sljit_uw imm, sljit_si positive) static sljit_s32 generate_int(struct sljit_compiler *compiler, sljit_s32 reg, sljit_uw imm, sljit_s32 positive)
{ {
sljit_uw mask; sljit_uw mask;
sljit_uw imm1; sljit_uw imm1;
sljit_uw imm2; sljit_uw imm2;
sljit_si rol; sljit_s32 rol;
/* Step1: Search a zero byte (8 continous zero bit). */ /* Step1: Search a zero byte (8 continous zero bit). */
mask = 0xff000000; mask = 0xff000000;
@ -1286,7 +1286,7 @@ static sljit_si generate_int(struct sljit_compiler *compiler, sljit_si reg, slji
} }
#endif #endif
static sljit_si load_immediate(struct sljit_compiler *compiler, sljit_si reg, sljit_uw imm) static sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 reg, sljit_uw imm)
{ {
sljit_uw tmp; sljit_uw tmp;
@ -1317,7 +1317,7 @@ static sljit_si load_immediate(struct sljit_compiler *compiler, sljit_si reg, sl
} }
/* Helper function. Dst should be reg + value, using at most 1 instruction, flags does not set. */ /* Helper function. Dst should be reg + value, using at most 1 instruction, flags does not set. */
static sljit_si emit_set_delta(struct sljit_compiler *compiler, sljit_si dst, sljit_si reg, sljit_sw value) static sljit_s32 emit_set_delta(struct sljit_compiler *compiler, sljit_s32 dst, sljit_s32 reg, sljit_sw value)
{ {
if (value >= 0) { if (value >= 0) {
value = get_imm(value); value = get_imm(value);
@ -1333,7 +1333,7 @@ static sljit_si emit_set_delta(struct sljit_compiler *compiler, sljit_si dst, sl
} }
/* Can perform an operation using at most 1 instruction. */ /* Can perform an operation using at most 1 instruction. */
static sljit_si getput_arg_fast(struct sljit_compiler *compiler, sljit_si inp_flags, sljit_si reg, sljit_si arg, sljit_sw argw) static sljit_s32 getput_arg_fast(struct sljit_compiler *compiler, sljit_s32 inp_flags, sljit_s32 reg, sljit_s32 arg, sljit_sw argw)
{ {
sljit_uw imm; sljit_uw imm;
@ -1408,7 +1408,7 @@ static sljit_si getput_arg_fast(struct sljit_compiler *compiler, sljit_si inp_fl
/* See getput_arg below. /* See getput_arg below.
Note: can_cache is called only for binary operators. Those Note: can_cache is called only for binary operators. Those
operators always uses word arguments without write back. */ operators always uses word arguments without write back. */
static sljit_si can_cache(sljit_si arg, sljit_sw argw, sljit_si next_arg, sljit_sw next_argw) static sljit_s32 can_cache(sljit_s32 arg, sljit_sw argw, sljit_s32 next_arg, sljit_sw next_argw)
{ {
/* Immediate caching is not supported as it would be an operation on constant arguments. */ /* Immediate caching is not supported as it would be an operation on constant arguments. */
if (arg & SLJIT_IMM) if (arg & SLJIT_IMM)
@ -1456,9 +1456,9 @@ static sljit_si can_cache(sljit_si arg, sljit_sw argw, sljit_si next_arg, sljit_
} }
/* Emit the necessary instructions. See can_cache above. */ /* Emit the necessary instructions. See can_cache above. */
static sljit_si getput_arg(struct sljit_compiler *compiler, sljit_si inp_flags, sljit_si reg, sljit_si arg, sljit_sw argw, sljit_si next_arg, sljit_sw next_argw) static sljit_s32 getput_arg(struct sljit_compiler *compiler, sljit_s32 inp_flags, sljit_s32 reg, sljit_s32 arg, sljit_sw argw, sljit_s32 next_arg, sljit_sw next_argw)
{ {
sljit_si tmp_r; sljit_s32 tmp_r;
sljit_sw max_delta; sljit_sw max_delta;
sljit_sw sign; sljit_sw sign;
sljit_uw imm; sljit_uw imm;
@ -1583,7 +1583,7 @@ static sljit_si getput_arg(struct sljit_compiler *compiler, sljit_si inp_flags,
return push_inst(compiler, EMIT_DATA_TRANSFER(inp_flags, 1, inp_flags & WRITE_BACK, reg, arg & REG_MASK, reg_map[tmp_r] | (max_delta & 0xf00 ? SRC2_IMM : 0))); return push_inst(compiler, EMIT_DATA_TRANSFER(inp_flags, 1, inp_flags & WRITE_BACK, reg, arg & REG_MASK, reg_map[tmp_r] | (max_delta & 0xf00 ? SRC2_IMM : 0)));
} }
static SLJIT_INLINE sljit_si emit_op_mem(struct sljit_compiler *compiler, sljit_si flags, sljit_si reg, sljit_si arg, sljit_sw argw) static SLJIT_INLINE sljit_s32 emit_op_mem(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg, sljit_sw argw)
{ {
if (getput_arg_fast(compiler, flags, reg, arg, argw)) if (getput_arg_fast(compiler, flags, reg, arg, argw))
return compiler->error; return compiler->error;
@ -1592,17 +1592,17 @@ static SLJIT_INLINE sljit_si emit_op_mem(struct sljit_compiler *compiler, sljit_
return getput_arg(compiler, flags, reg, arg, argw, 0, 0); return getput_arg(compiler, flags, reg, arg, argw, 0, 0);
} }
static SLJIT_INLINE sljit_si emit_op_mem2(struct sljit_compiler *compiler, sljit_si flags, sljit_si reg, sljit_si arg1, sljit_sw arg1w, sljit_si arg2, sljit_sw arg2w) static SLJIT_INLINE sljit_s32 emit_op_mem2(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg1, sljit_sw arg1w, sljit_s32 arg2, sljit_sw arg2w)
{ {
if (getput_arg_fast(compiler, flags, reg, arg1, arg1w)) if (getput_arg_fast(compiler, flags, reg, arg1, arg1w))
return compiler->error; return compiler->error;
return getput_arg(compiler, flags, reg, arg1, arg1w, arg2, arg2w); return getput_arg(compiler, flags, reg, arg1, arg1w, arg2, arg2w);
} }
static sljit_si emit_op(struct sljit_compiler *compiler, sljit_si op, sljit_si inp_flags, static sljit_s32 emit_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 inp_flags,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src1, sljit_sw src1w, sljit_s32 src1, sljit_sw src1w,
sljit_si src2, sljit_sw src2w) sljit_s32 src2, sljit_sw src2w)
{ {
/* arg1 goes to TMP_REG1 or src reg /* arg1 goes to TMP_REG1 or src reg
arg2 goes to TMP_REG2, imm or src reg arg2 goes to TMP_REG2, imm or src reg
@ -1610,25 +1610,25 @@ static sljit_si emit_op(struct sljit_compiler *compiler, sljit_si op, sljit_si i
result goes to TMP_REG2, so put result can use TMP_REG1 and TMP_REG3. */ result goes to TMP_REG2, so put result can use TMP_REG1 and TMP_REG3. */
/* We prefers register and simple consts. */ /* We prefers register and simple consts. */
sljit_si dst_r; sljit_s32 dst_r;
sljit_si src1_r; sljit_s32 src1_r;
sljit_si src2_r = 0; sljit_s32 src2_r = 0;
sljit_si sugg_src2_r = TMP_REG2; sljit_s32 sugg_src2_r = TMP_REG2;
sljit_si flags = GET_FLAGS(op) ? SET_FLAGS : 0; sljit_s32 flags = GET_FLAGS(op) ? SET_FLAGS : 0;
compiler->cache_arg = 0; compiler->cache_arg = 0;
compiler->cache_argw = 0; compiler->cache_argw = 0;
/* Destination check. */ /* Destination check. */
if (SLJIT_UNLIKELY(dst == SLJIT_UNUSED)) { if (SLJIT_UNLIKELY(dst == SLJIT_UNUSED)) {
if (op >= SLJIT_MOV && op <= SLJIT_MOVU_SI && !(src2 & SLJIT_MEM)) if (op >= SLJIT_MOV && op <= SLJIT_MOVU_S32 && !(src2 & SLJIT_MEM))
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
dst_r = TMP_REG2; dst_r = TMP_REG2;
} }
else if (FAST_IS_REG(dst)) { else if (FAST_IS_REG(dst)) {
dst_r = dst; dst_r = dst;
flags |= REG_DEST; flags |= REG_DEST;
if (op >= SLJIT_MOV && op <= SLJIT_MOVU_SI) if (op >= SLJIT_MOV && op <= SLJIT_MOVU_S32)
sugg_src2_r = dst_r; sugg_src2_r = dst_r;
} }
else { else {
@ -1695,7 +1695,7 @@ static sljit_si emit_op(struct sljit_compiler *compiler, sljit_si op, sljit_si i
if (FAST_IS_REG(src2)) { if (FAST_IS_REG(src2)) {
src2_r = src2; src2_r = src2;
flags |= REG_SOURCE; flags |= REG_SOURCE;
if (!(flags & REG_DEST) && op >= SLJIT_MOV && op <= SLJIT_MOVU_SI) if (!(flags & REG_DEST) && op >= SLJIT_MOV && op <= SLJIT_MOVU_S32)
dst_r = src2_r; dst_r = src2_r;
} }
else do { /* do { } while(0) is used because of breaks. */ else do { /* do { } while(0) is used because of breaks. */
@ -1804,7 +1804,7 @@ extern int __aeabi_idivmod(int numerator, int denominator);
} }
#endif #endif
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler, sljit_si op) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op)
{ {
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_op0(compiler, op)); CHECK(check_sljit_emit_op0(compiler, op));
@ -1817,58 +1817,58 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler
case SLJIT_NOP: case SLJIT_NOP:
FAIL_IF(push_inst(compiler, NOP)); FAIL_IF(push_inst(compiler, NOP));
break; break;
case SLJIT_LUMUL: case SLJIT_LMUL_UW:
case SLJIT_LSMUL: case SLJIT_LMUL_SW:
#if (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7) #if (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
return push_inst(compiler, (op == SLJIT_LUMUL ? UMULL : SMULL) return push_inst(compiler, (op == SLJIT_LMUL_UW ? UMULL : SMULL)
| (reg_map[SLJIT_R1] << 16) | (reg_map[SLJIT_R1] << 16)
| (reg_map[SLJIT_R0] << 12) | (reg_map[SLJIT_R0] << 12)
| (reg_map[SLJIT_R0] << 8) | (reg_map[SLJIT_R0] << 8)
| reg_map[SLJIT_R1]); | reg_map[SLJIT_R1]);
#else #else
FAIL_IF(push_inst(compiler, EMIT_DATA_PROCESS_INS(MOV_DP, 0, TMP_REG1, SLJIT_UNUSED, RM(SLJIT_R1)))); FAIL_IF(push_inst(compiler, EMIT_DATA_PROCESS_INS(MOV_DP, 0, TMP_REG1, SLJIT_UNUSED, RM(SLJIT_R1))));
return push_inst(compiler, (op == SLJIT_LUMUL ? UMULL : SMULL) return push_inst(compiler, (op == SLJIT_LMUL_UW ? UMULL : SMULL)
| (reg_map[SLJIT_R1] << 16) | (reg_map[SLJIT_R1] << 16)
| (reg_map[SLJIT_R0] << 12) | (reg_map[SLJIT_R0] << 12)
| (reg_map[SLJIT_R0] << 8) | (reg_map[SLJIT_R0] << 8)
| reg_map[TMP_REG1]); | reg_map[TMP_REG1]);
#endif #endif
case SLJIT_UDIVMOD: case SLJIT_DIVMOD_UW:
case SLJIT_SDIVMOD: case SLJIT_DIVMOD_SW:
case SLJIT_UDIVI: case SLJIT_DIV_UW:
case SLJIT_SDIVI: case SLJIT_DIV_SW:
SLJIT_COMPILE_ASSERT((SLJIT_UDIVMOD & 0x2) == 0 && SLJIT_UDIVI - 0x2 == SLJIT_UDIVMOD, bad_div_opcode_assignments); SLJIT_COMPILE_ASSERT((SLJIT_DIVMOD_UW & 0x2) == 0 && SLJIT_DIV_UW - 0x2 == SLJIT_DIVMOD_UW, bad_div_opcode_assignments);
SLJIT_COMPILE_ASSERT(reg_map[2] == 1 && reg_map[3] == 2, bad_register_mapping); SLJIT_COMPILE_ASSERT(reg_map[2] == 1 && reg_map[3] == 2, bad_register_mapping);
if ((op >= SLJIT_UDIVI) && (compiler->scratches >= 3)) { if ((op >= SLJIT_DIV_UW) && (compiler->scratches >= 3)) {
FAIL_IF(push_inst(compiler, 0xe52d2008 /* str r2, [sp, #-8]! */)); FAIL_IF(push_inst(compiler, 0xe52d2008 /* str r2, [sp, #-8]! */));
FAIL_IF(push_inst(compiler, 0xe58d1004 /* str r1, [sp, #4] */)); FAIL_IF(push_inst(compiler, 0xe58d1004 /* str r1, [sp, #4] */));
} }
else if ((op >= SLJIT_UDIVI) || (compiler->scratches >= 3)) else if ((op >= SLJIT_DIV_UW) || (compiler->scratches >= 3))
FAIL_IF(push_inst(compiler, 0xe52d0008 | (op >= SLJIT_UDIVI ? 0x1000 : 0x2000) /* str r1/r2, [sp, #-8]! */)); FAIL_IF(push_inst(compiler, 0xe52d0008 | (op >= SLJIT_DIV_UW ? 0x1000 : 0x2000) /* str r1/r2, [sp, #-8]! */));
#if defined(__GNUC__) #if defined(__GNUC__)
FAIL_IF(sljit_emit_ijump(compiler, SLJIT_FAST_CALL, SLJIT_IMM, FAIL_IF(sljit_emit_ijump(compiler, SLJIT_FAST_CALL, SLJIT_IMM,
((op | 0x2) == SLJIT_UDIVI ? SLJIT_FUNC_OFFSET(__aeabi_uidivmod) : SLJIT_FUNC_OFFSET(__aeabi_idivmod)))); ((op | 0x2) == SLJIT_DIV_UW ? SLJIT_FUNC_OFFSET(__aeabi_uidivmod) : SLJIT_FUNC_OFFSET(__aeabi_idivmod))));
#else #else
#error "Software divmod functions are needed" #error "Software divmod functions are needed"
#endif #endif
if ((op >= SLJIT_UDIVI) && (compiler->scratches >= 3)) { if ((op >= SLJIT_DIV_UW) && (compiler->scratches >= 3)) {
FAIL_IF(push_inst(compiler, 0xe59d1004 /* ldr r1, [sp, #4] */)); FAIL_IF(push_inst(compiler, 0xe59d1004 /* ldr r1, [sp, #4] */));
FAIL_IF(push_inst(compiler, 0xe49d2008 /* ldr r2, [sp], #8 */)); FAIL_IF(push_inst(compiler, 0xe49d2008 /* ldr r2, [sp], #8 */));
} }
else if ((op >= SLJIT_UDIVI) || (compiler->scratches >= 3)) else if ((op >= SLJIT_DIV_UW) || (compiler->scratches >= 3))
return push_inst(compiler, 0xe49d0008 | (op >= SLJIT_UDIVI ? 0x1000 : 0x2000) /* ldr r1/r2, [sp], #8 */); return push_inst(compiler, 0xe49d0008 | (op >= SLJIT_DIV_UW ? 0x1000 : 0x2000) /* ldr r1/r2, [sp], #8 */);
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler, sljit_si op, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src, sljit_sw srcw) sljit_s32 src, sljit_sw srcw)
{ {
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw)); CHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw));
@ -1877,40 +1877,40 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler
switch (GET_OPCODE(op)) { switch (GET_OPCODE(op)) {
case SLJIT_MOV: case SLJIT_MOV:
case SLJIT_MOV_UI: case SLJIT_MOV_U32:
case SLJIT_MOV_SI: case SLJIT_MOV_S32:
case SLJIT_MOV_P: case SLJIT_MOV_P:
return emit_op(compiler, SLJIT_MOV, ALLOW_ANY_IMM, dst, dstw, TMP_REG1, 0, src, srcw); return emit_op(compiler, SLJIT_MOV, ALLOW_ANY_IMM, dst, dstw, TMP_REG1, 0, src, srcw);
case SLJIT_MOV_UB: case SLJIT_MOV_U8:
return emit_op(compiler, SLJIT_MOV_UB, ALLOW_ANY_IMM | BYTE_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_ub)srcw : srcw); return emit_op(compiler, SLJIT_MOV_U8, ALLOW_ANY_IMM | BYTE_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u8)srcw : srcw);
case SLJIT_MOV_SB: case SLJIT_MOV_S8:
return emit_op(compiler, SLJIT_MOV_SB, ALLOW_ANY_IMM | SIGNED_DATA | BYTE_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_sb)srcw : srcw); return emit_op(compiler, SLJIT_MOV_S8, ALLOW_ANY_IMM | SIGNED_DATA | BYTE_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s8)srcw : srcw);
case SLJIT_MOV_UH: case SLJIT_MOV_U16:
return emit_op(compiler, SLJIT_MOV_UH, ALLOW_ANY_IMM | HALF_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_uh)srcw : srcw); return emit_op(compiler, SLJIT_MOV_U16, ALLOW_ANY_IMM | HALF_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u16)srcw : srcw);
case SLJIT_MOV_SH: case SLJIT_MOV_S16:
return emit_op(compiler, SLJIT_MOV_SH, ALLOW_ANY_IMM | SIGNED_DATA | HALF_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_sh)srcw : srcw); return emit_op(compiler, SLJIT_MOV_S16, ALLOW_ANY_IMM | SIGNED_DATA | HALF_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s16)srcw : srcw);
case SLJIT_MOVU: case SLJIT_MOVU:
case SLJIT_MOVU_UI: case SLJIT_MOVU_U32:
case SLJIT_MOVU_SI: case SLJIT_MOVU_S32:
case SLJIT_MOVU_P: case SLJIT_MOVU_P:
return emit_op(compiler, SLJIT_MOV, ALLOW_ANY_IMM | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, srcw); return emit_op(compiler, SLJIT_MOV, ALLOW_ANY_IMM | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, srcw);
case SLJIT_MOVU_UB: case SLJIT_MOVU_U8:
return emit_op(compiler, SLJIT_MOV_UB, ALLOW_ANY_IMM | BYTE_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_ub)srcw : srcw); return emit_op(compiler, SLJIT_MOV_U8, ALLOW_ANY_IMM | BYTE_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u8)srcw : srcw);
case SLJIT_MOVU_SB: case SLJIT_MOVU_S8:
return emit_op(compiler, SLJIT_MOV_SB, ALLOW_ANY_IMM | SIGNED_DATA | BYTE_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_sb)srcw : srcw); return emit_op(compiler, SLJIT_MOV_S8, ALLOW_ANY_IMM | SIGNED_DATA | BYTE_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s8)srcw : srcw);
case SLJIT_MOVU_UH: case SLJIT_MOVU_U16:
return emit_op(compiler, SLJIT_MOV_UH, ALLOW_ANY_IMM | HALF_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_uh)srcw : srcw); return emit_op(compiler, SLJIT_MOV_U16, ALLOW_ANY_IMM | HALF_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u16)srcw : srcw);
case SLJIT_MOVU_SH: case SLJIT_MOVU_S16:
return emit_op(compiler, SLJIT_MOV_SH, ALLOW_ANY_IMM | SIGNED_DATA | HALF_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_sh)srcw : srcw); return emit_op(compiler, SLJIT_MOV_S16, ALLOW_ANY_IMM | SIGNED_DATA | HALF_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s16)srcw : srcw);
case SLJIT_NOT: case SLJIT_NOT:
return emit_op(compiler, op, ALLOW_ANY_IMM, dst, dstw, TMP_REG1, 0, src, srcw); return emit_op(compiler, op, ALLOW_ANY_IMM, dst, dstw, TMP_REG1, 0, src, srcw);
@ -1929,10 +1929,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler, sljit_si op, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src1, sljit_sw src1w, sljit_s32 src1, sljit_sw src1w,
sljit_si src2, sljit_sw src2w) sljit_s32 src2, sljit_sw src2w)
{ {
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_op2(compiler, op, dst, dstw, src1, src1w, src2, src2w)); CHECK(check_sljit_emit_op2(compiler, op, dst, dstw, src1, src1w, src2, src2w));
@ -1971,20 +1971,20 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_register_index(sljit_si reg) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg)
{ {
CHECK_REG_INDEX(check_sljit_get_register_index(reg)); CHECK_REG_INDEX(check_sljit_get_register_index(reg));
return reg_map[reg]; return reg_map[reg];
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_float_register_index(sljit_si reg) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg)
{ {
CHECK_REG_INDEX(check_sljit_get_float_register_index(reg)); CHECK_REG_INDEX(check_sljit_get_float_register_index(reg));
return reg << 1; return reg << 1;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_custom(struct sljit_compiler *compiler, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler,
void *instruction, sljit_si size) void *instruction, sljit_s32 size)
{ {
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_op_custom(compiler, instruction, size)); CHECK(check_sljit_emit_op_custom(compiler, instruction, size));
@ -2000,7 +2000,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_custom(struct sljit_compiler *co
/* 0 - no fpu /* 0 - no fpu
1 - vfp */ 1 - vfp */
static sljit_si arm_fpu_type = -1; static sljit_s32 arm_fpu_type = -1;
static void init_compiler(void) static void init_compiler(void)
{ {
@ -2011,7 +2011,7 @@ static void init_compiler(void)
arm_fpu_type = 1; arm_fpu_type = 1;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_is_fpu_available(void) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_is_fpu_available(void)
{ {
#ifdef SLJIT_IS_FPU_AVAILABLE #ifdef SLJIT_IS_FPU_AVAILABLE
return SLJIT_IS_FPU_AVAILABLE; return SLJIT_IS_FPU_AVAILABLE;
@ -2026,7 +2026,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_is_fpu_available(void)
#define arm_fpu_type 1 #define arm_fpu_type 1
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_is_fpu_available(void) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_is_fpu_available(void)
{ {
/* Always available. */ /* Always available. */
return 1; return 1;
@ -2040,11 +2040,11 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_is_fpu_available(void)
#define EMIT_FPU_OPERATION(opcode, mode, dst, src1, src2) \ #define EMIT_FPU_OPERATION(opcode, mode, dst, src1, src2) \
((opcode) | (mode) | ((dst) << 12) | (src1) | ((src2) << 16)) ((opcode) | (mode) | ((dst) << 12) | (src1) | ((src2) << 16))
static sljit_si emit_fop_mem(struct sljit_compiler *compiler, sljit_si flags, sljit_si reg, sljit_si arg, sljit_sw argw) static sljit_s32 emit_fop_mem(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg, sljit_sw argw)
{ {
sljit_sw tmp; sljit_sw tmp;
sljit_uw imm; sljit_uw imm;
sljit_sw inst = VSTR_F32 | (flags & (SLJIT_SINGLE_OP | FPU_LOAD)); sljit_sw inst = VSTR_F32 | (flags & (SLJIT_F32_OP | FPU_LOAD));
SLJIT_ASSERT(arg & SLJIT_MEM); SLJIT_ASSERT(arg & SLJIT_MEM);
if (SLJIT_UNLIKELY(arg & OFFS_REG_MASK)) { if (SLJIT_UNLIKELY(arg & OFFS_REG_MASK)) {
@ -2104,16 +2104,16 @@ static sljit_si emit_fop_mem(struct sljit_compiler *compiler, sljit_si flags, sl
return push_inst(compiler, EMIT_FPU_DATA_TRANSFER(inst, 1, TMP_REG3, reg, 0)); return push_inst(compiler, EMIT_FPU_DATA_TRANSFER(inst, 1, TMP_REG3, reg, 0));
} }
static SLJIT_INLINE sljit_si sljit_emit_fop1_convw_fromd(struct sljit_compiler *compiler, sljit_si op, static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src, sljit_sw srcw) sljit_s32 src, sljit_sw srcw)
{ {
if (src & SLJIT_MEM) { if (src & SLJIT_MEM) {
FAIL_IF(emit_fop_mem(compiler, (op & SLJIT_SINGLE_OP) | FPU_LOAD, TMP_FREG1, src, srcw)); FAIL_IF(emit_fop_mem(compiler, (op & SLJIT_F32_OP) | FPU_LOAD, TMP_FREG1, src, srcw));
src = TMP_FREG1; src = TMP_FREG1;
} }
FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VCVT_S32_F32, op & SLJIT_SINGLE_OP, TMP_FREG1, src, 0))); FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VCVT_S32_F32, op & SLJIT_F32_OP, TMP_FREG1, src, 0)));
if (dst == SLJIT_UNUSED) if (dst == SLJIT_UNUSED)
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
@ -2125,11 +2125,11 @@ static SLJIT_INLINE sljit_si sljit_emit_fop1_convw_fromd(struct sljit_compiler *
return emit_fop_mem(compiler, 0, TMP_FREG1, dst, dstw); return emit_fop_mem(compiler, 0, TMP_FREG1, dst, dstw);
} }
static SLJIT_INLINE sljit_si sljit_emit_fop1_convd_fromw(struct sljit_compiler *compiler, sljit_si op, static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src, sljit_sw srcw) sljit_s32 src, sljit_sw srcw)
{ {
sljit_si dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;
if (FAST_IS_REG(src)) if (FAST_IS_REG(src))
FAIL_IF(push_inst(compiler, VMOV | RD(src) | (TMP_FREG1 << 16))); FAIL_IF(push_inst(compiler, VMOV | RD(src) | (TMP_FREG1 << 16)));
@ -2142,85 +2142,85 @@ static SLJIT_INLINE sljit_si sljit_emit_fop1_convd_fromw(struct sljit_compiler *
FAIL_IF(push_inst(compiler, VMOV | RD(TMP_REG1) | (TMP_FREG1 << 16))); FAIL_IF(push_inst(compiler, VMOV | RD(TMP_REG1) | (TMP_FREG1 << 16)));
} }
FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VCVT_F32_S32, op & SLJIT_SINGLE_OP, dst_r, TMP_FREG1, 0))); FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VCVT_F32_S32, op & SLJIT_F32_OP, dst_r, TMP_FREG1, 0)));
if (dst & SLJIT_MEM) if (dst & SLJIT_MEM)
return emit_fop_mem(compiler, (op & SLJIT_SINGLE_OP), TMP_FREG1, dst, dstw); return emit_fop_mem(compiler, (op & SLJIT_F32_OP), TMP_FREG1, dst, dstw);
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
static SLJIT_INLINE sljit_si sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_si op, static SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si src1, sljit_sw src1w, sljit_s32 src1, sljit_sw src1w,
sljit_si src2, sljit_sw src2w) sljit_s32 src2, sljit_sw src2w)
{ {
if (src1 & SLJIT_MEM) { if (src1 & SLJIT_MEM) {
FAIL_IF(emit_fop_mem(compiler, (op & SLJIT_SINGLE_OP) | FPU_LOAD, TMP_FREG1, src1, src1w)); FAIL_IF(emit_fop_mem(compiler, (op & SLJIT_F32_OP) | FPU_LOAD, TMP_FREG1, src1, src1w));
src1 = TMP_FREG1; src1 = TMP_FREG1;
} }
if (src2 & SLJIT_MEM) { if (src2 & SLJIT_MEM) {
FAIL_IF(emit_fop_mem(compiler, (op & SLJIT_SINGLE_OP) | FPU_LOAD, TMP_FREG2, src2, src2w)); FAIL_IF(emit_fop_mem(compiler, (op & SLJIT_F32_OP) | FPU_LOAD, TMP_FREG2, src2, src2w));
src2 = TMP_FREG2; src2 = TMP_FREG2;
} }
FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VCMP_F32, op & SLJIT_SINGLE_OP, src1, src2, 0))); FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VCMP_F32, op & SLJIT_F32_OP, src1, src2, 0)));
return push_inst(compiler, VMRS); return push_inst(compiler, VMRS);
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop1(struct sljit_compiler *compiler, sljit_si op, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src, sljit_sw srcw) sljit_s32 src, sljit_sw srcw)
{ {
sljit_si dst_r; sljit_s32 dst_r;
CHECK_ERROR(); CHECK_ERROR();
compiler->cache_arg = 0; compiler->cache_arg = 0;
compiler->cache_argw = 0; compiler->cache_argw = 0;
if (GET_OPCODE(op) != SLJIT_CONVD_FROMS) if (GET_OPCODE(op) != SLJIT_CONV_F64_FROM_F32)
op ^= SLJIT_SINGLE_OP; op ^= SLJIT_F32_OP;
SLJIT_COMPILE_ASSERT((SLJIT_SINGLE_OP == 0x100), float_transfer_bit_error); SLJIT_COMPILE_ASSERT((SLJIT_F32_OP == 0x100), float_transfer_bit_error);
SELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw); SELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw);
dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;
if (src & SLJIT_MEM) { if (src & SLJIT_MEM) {
FAIL_IF(emit_fop_mem(compiler, (op & SLJIT_SINGLE_OP) | FPU_LOAD, dst_r, src, srcw)); FAIL_IF(emit_fop_mem(compiler, (op & SLJIT_F32_OP) | FPU_LOAD, dst_r, src, srcw));
src = dst_r; src = dst_r;
} }
switch (GET_OPCODE(op)) { switch (GET_OPCODE(op)) {
case SLJIT_DMOV: case SLJIT_MOV_F64:
if (src != dst_r) { if (src != dst_r) {
if (dst_r != TMP_FREG1) if (dst_r != TMP_FREG1)
FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VMOV_F32, op & SLJIT_SINGLE_OP, dst_r, src, 0))); FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VMOV_F32, op & SLJIT_F32_OP, dst_r, src, 0)));
else else
dst_r = src; dst_r = src;
} }
break; break;
case SLJIT_DNEG: case SLJIT_NEG_F64:
FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VNEG_F32, op & SLJIT_SINGLE_OP, dst_r, src, 0))); FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VNEG_F32, op & SLJIT_F32_OP, dst_r, src, 0)));
break; break;
case SLJIT_DABS: case SLJIT_ABS_F64:
FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VABS_F32, op & SLJIT_SINGLE_OP, dst_r, src, 0))); FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VABS_F32, op & SLJIT_F32_OP, dst_r, src, 0)));
break; break;
case SLJIT_CONVD_FROMS: case SLJIT_CONV_F64_FROM_F32:
FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VCVT_F64_F32, op & SLJIT_SINGLE_OP, dst_r, src, 0))); FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VCVT_F64_F32, op & SLJIT_F32_OP, dst_r, src, 0)));
op ^= SLJIT_SINGLE_OP; op ^= SLJIT_F32_OP;
break; break;
} }
if (dst & SLJIT_MEM) if (dst & SLJIT_MEM)
return emit_fop_mem(compiler, (op & SLJIT_SINGLE_OP), dst_r, dst, dstw); return emit_fop_mem(compiler, (op & SLJIT_F32_OP), dst_r, dst, dstw);
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compiler, sljit_si op, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src1, sljit_sw src1w, sljit_s32 src1, sljit_sw src1w,
sljit_si src2, sljit_sw src2w) sljit_s32 src2, sljit_sw src2w)
{ {
sljit_si dst_r; sljit_s32 dst_r;
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_fop2(compiler, op, dst, dstw, src1, src1w, src2, src2w)); CHECK(check_sljit_emit_fop2(compiler, op, dst, dstw, src1, src1w, src2, src2w));
@ -2230,40 +2230,40 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compile
compiler->cache_arg = 0; compiler->cache_arg = 0;
compiler->cache_argw = 0; compiler->cache_argw = 0;
op ^= SLJIT_SINGLE_OP; op ^= SLJIT_F32_OP;
dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;
if (src2 & SLJIT_MEM) { if (src2 & SLJIT_MEM) {
FAIL_IF(emit_fop_mem(compiler, (op & SLJIT_SINGLE_OP) | FPU_LOAD, TMP_FREG2, src2, src2w)); FAIL_IF(emit_fop_mem(compiler, (op & SLJIT_F32_OP) | FPU_LOAD, TMP_FREG2, src2, src2w));
src2 = TMP_FREG2; src2 = TMP_FREG2;
} }
if (src1 & SLJIT_MEM) { if (src1 & SLJIT_MEM) {
FAIL_IF(emit_fop_mem(compiler, (op & SLJIT_SINGLE_OP) | FPU_LOAD, TMP_FREG1, src1, src1w)); FAIL_IF(emit_fop_mem(compiler, (op & SLJIT_F32_OP) | FPU_LOAD, TMP_FREG1, src1, src1w));
src1 = TMP_FREG1; src1 = TMP_FREG1;
} }
switch (GET_OPCODE(op)) { switch (GET_OPCODE(op)) {
case SLJIT_DADD: case SLJIT_ADD_F64:
FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VADD_F32, op & SLJIT_SINGLE_OP, dst_r, src2, src1))); FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VADD_F32, op & SLJIT_F32_OP, dst_r, src2, src1)));
break; break;
case SLJIT_DSUB: case SLJIT_SUB_F64:
FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VSUB_F32, op & SLJIT_SINGLE_OP, dst_r, src2, src1))); FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VSUB_F32, op & SLJIT_F32_OP, dst_r, src2, src1)));
break; break;
case SLJIT_DMUL: case SLJIT_MUL_F64:
FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VMUL_F32, op & SLJIT_SINGLE_OP, dst_r, src2, src1))); FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VMUL_F32, op & SLJIT_F32_OP, dst_r, src2, src1)));
break; break;
case SLJIT_DDIV: case SLJIT_DIV_F64:
FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VDIV_F32, op & SLJIT_SINGLE_OP, dst_r, src2, src1))); FAIL_IF(push_inst(compiler, EMIT_FPU_OPERATION(VDIV_F32, op & SLJIT_F32_OP, dst_r, src2, src1)));
break; break;
} }
if (dst_r == TMP_FREG1) if (dst_r == TMP_FREG1)
FAIL_IF(emit_fop_mem(compiler, (op & SLJIT_SINGLE_OP), TMP_FREG1, dst, dstw)); FAIL_IF(emit_fop_mem(compiler, (op & SLJIT_F32_OP), TMP_FREG1, dst, dstw));
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
@ -2276,7 +2276,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compile
/* Other instructions */ /* Other instructions */
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_si dst, sljit_sw dstw) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)
{ {
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw)); CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw));
@ -2299,7 +2299,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_enter(struct sljit_compiler *c
return getput_arg(compiler, WORD_DATA, TMP_REG2, dst, dstw, 0, 0); return getput_arg(compiler, WORD_DATA, TMP_REG2, dst, dstw, 0, 0);
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_si src, sljit_sw srcw) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw)
{ {
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_fast_return(compiler, src, srcw)); CHECK(check_sljit_emit_fast_return(compiler, src, srcw));
@ -2326,33 +2326,33 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_return(struct sljit_compiler *
/* Conditional instructions */ /* Conditional instructions */
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
static sljit_uw get_cc(sljit_si type) static sljit_uw get_cc(sljit_s32 type)
{ {
switch (type) { switch (type) {
case SLJIT_EQUAL: case SLJIT_EQUAL:
case SLJIT_MUL_NOT_OVERFLOW: case SLJIT_MUL_NOT_OVERFLOW:
case SLJIT_D_EQUAL: case SLJIT_EQUAL_F64:
return 0x00000000; return 0x00000000;
case SLJIT_NOT_EQUAL: case SLJIT_NOT_EQUAL:
case SLJIT_MUL_OVERFLOW: case SLJIT_MUL_OVERFLOW:
case SLJIT_D_NOT_EQUAL: case SLJIT_NOT_EQUAL_F64:
return 0x10000000; return 0x10000000;
case SLJIT_LESS: case SLJIT_LESS:
case SLJIT_D_LESS: case SLJIT_LESS_F64:
return 0x30000000; return 0x30000000;
case SLJIT_GREATER_EQUAL: case SLJIT_GREATER_EQUAL:
case SLJIT_D_GREATER_EQUAL: case SLJIT_GREATER_EQUAL_F64:
return 0x20000000; return 0x20000000;
case SLJIT_GREATER: case SLJIT_GREATER:
case SLJIT_D_GREATER: case SLJIT_GREATER_F64:
return 0x80000000; return 0x80000000;
case SLJIT_LESS_EQUAL: case SLJIT_LESS_EQUAL:
case SLJIT_D_LESS_EQUAL: case SLJIT_LESS_EQUAL_F64:
return 0x90000000; return 0x90000000;
case SLJIT_SIG_LESS: case SLJIT_SIG_LESS:
@ -2368,11 +2368,11 @@ static sljit_uw get_cc(sljit_si type)
return 0xd0000000; return 0xd0000000;
case SLJIT_OVERFLOW: case SLJIT_OVERFLOW:
case SLJIT_D_UNORDERED: case SLJIT_UNORDERED_F64:
return 0x60000000; return 0x60000000;
case SLJIT_NOT_OVERFLOW: case SLJIT_NOT_OVERFLOW:
case SLJIT_D_ORDERED: case SLJIT_ORDERED_F64:
return 0x70000000; return 0x70000000;
default: default:
@ -2397,7 +2397,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compi
return label; return label;
} }
SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_si type) SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type)
{ {
struct sljit_jump *jump; struct sljit_jump *jump;
@ -2438,7 +2438,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile
return jump; return jump;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_ijump(struct sljit_compiler *compiler, sljit_si type, sljit_si src, sljit_sw srcw) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src, sljit_sw srcw)
{ {
struct sljit_jump *jump; struct sljit_jump *jump;
@ -2475,12 +2475,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_ijump(struct sljit_compiler *compil
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_si op, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src, sljit_sw srcw, sljit_s32 src, sljit_sw srcw,
sljit_si type) sljit_s32 type)
{ {
sljit_si dst_r, flags = GET_ALL_FLAGS(op); sljit_s32 dst_r, flags = GET_ALL_FLAGS(op);
sljit_uw cc, ins; sljit_uw cc, ins;
CHECK_ERROR(); CHECK_ERROR();
@ -2528,10 +2528,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *com
return (flags & SLJIT_SET_E) ? push_inst(compiler, EMIT_DATA_PROCESS_INS(MOV_DP, SET_FLAGS, TMP_REG1, SLJIT_UNUSED, RM(dst_r))) : SLJIT_SUCCESS; return (flags & SLJIT_SET_E) ? push_inst(compiler, EMIT_DATA_PROCESS_INS(MOV_DP, SET_FLAGS, TMP_REG1, SLJIT_UNUSED, RM(dst_r))) : SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_si dst, sljit_sw dstw, sljit_sw init_value) SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value)
{ {
struct sljit_const *const_; struct sljit_const *const_;
sljit_si reg; sljit_s32 reg;
CHECK_ERROR_PTR(); CHECK_ERROR_PTR();
CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value)); CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value));

View File

@ -24,13 +24,13 @@
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
SLJIT_API_FUNC_ATTRIBUTE SLJIT_CONST char* sljit_get_platform_name(void) SLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void)
{ {
return "ARM-64" SLJIT_CPUINFO; return "ARM-64" SLJIT_CPUINFO;
} }
/* Length of an instruction word */ /* Length of an instruction word */
typedef sljit_ui sljit_ins; typedef sljit_u32 sljit_ins;
#define TMP_ZERO (0) #define TMP_ZERO (0)
@ -43,7 +43,7 @@ typedef sljit_ui sljit_ins;
#define TMP_FREG1 (0) #define TMP_FREG1 (0)
#define TMP_FREG2 (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1) #define TMP_FREG2 (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1)
static SLJIT_CONST sljit_ub reg_map[SLJIT_NUMBER_OF_REGISTERS + 8] = { static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 8] = {
31, 0, 1, 2, 3, 4, 5, 6, 7, 12, 13, 14, 15, 16, 17, 8, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 29, 9, 10, 11, 30, 31 31, 0, 1, 2, 3, 4, 5, 6, 7, 12, 13, 14, 15, 16, 17, 8, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 29, 9, 10, 11, 30, 31
}; };
@ -124,7 +124,7 @@ static SLJIT_CONST sljit_ub reg_map[SLJIT_NUMBER_OF_REGISTERS + 8] = {
/* dest_reg is the absolute name of the register /* dest_reg is the absolute name of the register
Useful for reordering instructions in the delay slot. */ Useful for reordering instructions in the delay slot. */
static sljit_si push_inst(struct sljit_compiler *compiler, sljit_ins ins) static sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_ins ins)
{ {
sljit_ins *ptr = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins)); sljit_ins *ptr = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins));
FAIL_IF(!ptr); FAIL_IF(!ptr);
@ -133,7 +133,7 @@ static sljit_si push_inst(struct sljit_compiler *compiler, sljit_ins ins)
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
static SLJIT_INLINE sljit_si emit_imm64_const(struct sljit_compiler *compiler, sljit_si dst, sljit_uw imm) static SLJIT_INLINE sljit_s32 emit_imm64_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_uw imm)
{ {
FAIL_IF(push_inst(compiler, MOVZ | RD(dst) | ((imm & 0xffff) << 5))); FAIL_IF(push_inst(compiler, MOVZ | RD(dst) | ((imm & 0xffff) << 5)));
FAIL_IF(push_inst(compiler, MOVK | RD(dst) | (((imm >> 16) & 0xffff) << 5) | (1 << 21))); FAIL_IF(push_inst(compiler, MOVK | RD(dst) | (((imm >> 16) & 0xffff) << 5) | (1 << 21)));
@ -143,7 +143,7 @@ static SLJIT_INLINE sljit_si emit_imm64_const(struct sljit_compiler *compiler, s
static SLJIT_INLINE void modify_imm64_const(sljit_ins* inst, sljit_uw new_imm) static SLJIT_INLINE void modify_imm64_const(sljit_ins* inst, sljit_uw new_imm)
{ {
sljit_si dst = inst[0] & 0x1f; sljit_s32 dst = inst[0] & 0x1f;
SLJIT_ASSERT((inst[0] & 0xffe00000) == MOVZ && (inst[1] & 0xffe00000) == (MOVK | (1 << 21))); SLJIT_ASSERT((inst[0] & 0xffe00000) == MOVZ && (inst[1] & 0xffe00000) == (MOVK | (1 << 21)));
inst[0] = MOVZ | dst | ((new_imm & 0xffff) << 5); inst[0] = MOVZ | dst | ((new_imm & 0xffff) << 5);
inst[1] = MOVK | dst | (((new_imm >> 16) & 0xffff) << 5) | (1 << 21); inst[1] = MOVK | dst | (((new_imm >> 16) & 0xffff) << 5) | (1 << 21);
@ -151,7 +151,7 @@ static SLJIT_INLINE void modify_imm64_const(sljit_ins* inst, sljit_uw new_imm)
inst[3] = MOVK | dst | ((new_imm >> 48) << 5) | (3 << 21); inst[3] = MOVK | dst | ((new_imm >> 48) << 5) | (3 << 21);
} }
static SLJIT_INLINE sljit_si detect_jump_type(struct sljit_jump *jump, sljit_ins *code_ptr, sljit_ins *code) static SLJIT_INLINE sljit_s32 detect_jump_type(struct sljit_jump *jump, sljit_ins *code_ptr, sljit_ins *code)
{ {
sljit_sw diff; sljit_sw diff;
sljit_uw target_addr; sljit_uw target_addr;
@ -212,7 +212,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
sljit_ins *buf_end; sljit_ins *buf_end;
sljit_uw word_count; sljit_uw word_count;
sljit_uw addr; sljit_uw addr;
sljit_si dst; sljit_s32 dst;
struct sljit_label *label; struct sljit_label *label;
struct sljit_jump *jump; struct sljit_jump *jump;
@ -346,9 +346,9 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
#define LOGICAL_IMM_CHECK 0x100 #define LOGICAL_IMM_CHECK 0x100
static sljit_ins logical_imm(sljit_sw imm, sljit_si len) static sljit_ins logical_imm(sljit_sw imm, sljit_s32 len)
{ {
sljit_si negated, ones, right; sljit_s32 negated, ones, right;
sljit_uw mask, uimm; sljit_uw mask, uimm;
sljit_ins ins; sljit_ins ins;
@ -356,12 +356,12 @@ static sljit_ins logical_imm(sljit_sw imm, sljit_si len)
len &= ~LOGICAL_IMM_CHECK; len &= ~LOGICAL_IMM_CHECK;
if (len == 32 && (imm == 0 || imm == -1)) if (len == 32 && (imm == 0 || imm == -1))
return 0; return 0;
if (len == 16 && ((sljit_si)imm == 0 || (sljit_si)imm == -1)) if (len == 16 && ((sljit_s32)imm == 0 || (sljit_s32)imm == -1))
return 0; return 0;
} }
SLJIT_ASSERT((len == 32 && imm != 0 && imm != -1) SLJIT_ASSERT((len == 32 && imm != 0 && imm != -1)
|| (len == 16 && (sljit_si)imm != 0 && (sljit_si)imm != -1)); || (len == 16 && (sljit_s32)imm != 0 && (sljit_s32)imm != -1));
uimm = (sljit_uw)imm; uimm = (sljit_uw)imm;
while (1) { while (1) {
if (len <= 0) { if (len <= 0) {
@ -410,10 +410,10 @@ static sljit_ins logical_imm(sljit_sw imm, sljit_si len)
#undef COUNT_TRAILING_ZERO #undef COUNT_TRAILING_ZERO
static sljit_si load_immediate(struct sljit_compiler *compiler, sljit_si dst, sljit_sw simm) static sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw simm)
{ {
sljit_uw imm = (sljit_uw)simm; sljit_uw imm = (sljit_uw)simm;
sljit_si i, zeros, ones, first; sljit_s32 i, zeros, ones, first;
sljit_ins bitmask; sljit_ins bitmask;
if (imm <= 0xffff) if (imm <= 0xffff)
@ -512,15 +512,15 @@ static sljit_si load_immediate(struct sljit_compiler *compiler, sljit_si dst, sl
dst = TMP_ZERO; \ dst = TMP_ZERO; \
} }
static sljit_si emit_op_imm(struct sljit_compiler *compiler, sljit_si flags, sljit_si dst, sljit_sw arg1, sljit_sw arg2) static sljit_s32 emit_op_imm(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 dst, sljit_sw arg1, sljit_sw arg2)
{ {
/* dst must be register, TMP_REG1 /* dst must be register, TMP_REG1
arg1 must be register, TMP_REG1, imm arg1 must be register, TMP_REG1, imm
arg2 must be register, TMP_REG2, imm */ arg2 must be register, TMP_REG2, imm */
sljit_ins inv_bits = (flags & INT_OP) ? (1 << 31) : 0; sljit_ins inv_bits = (flags & INT_OP) ? (1 << 31) : 0;
sljit_ins inst_bits; sljit_ins inst_bits;
sljit_si op = (flags & 0xffff); sljit_s32 op = (flags & 0xffff);
sljit_si reg; sljit_s32 reg;
sljit_sw imm, nimm; sljit_sw imm, nimm;
if (SLJIT_UNLIKELY((flags & (ARG1_IMM | ARG2_IMM)) == (ARG1_IMM | ARG2_IMM))) { if (SLJIT_UNLIKELY((flags & (ARG1_IMM | ARG2_IMM)) == (ARG1_IMM | ARG2_IMM))) {
@ -667,34 +667,34 @@ static sljit_si emit_op_imm(struct sljit_compiler *compiler, sljit_si flags, slj
if (dst == arg2) if (dst == arg2)
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
return push_inst(compiler, ORR | RD(dst) | RN(TMP_ZERO) | RM(arg2)); return push_inst(compiler, ORR | RD(dst) | RN(TMP_ZERO) | RM(arg2));
case SLJIT_MOV_UB: case SLJIT_MOV_U8:
case SLJIT_MOVU_UB: case SLJIT_MOVU_U8:
SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1); SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1);
return push_inst(compiler, (UBFM ^ (1 << 31)) | RD(dst) | RN(arg2) | (7 << 10)); return push_inst(compiler, (UBFM ^ (1 << 31)) | RD(dst) | RN(arg2) | (7 << 10));
case SLJIT_MOV_SB: case SLJIT_MOV_S8:
case SLJIT_MOVU_SB: case SLJIT_MOVU_S8:
SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1); SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1);
if (!(flags & INT_OP)) if (!(flags & INT_OP))
inv_bits |= 1 << 22; inv_bits |= 1 << 22;
return push_inst(compiler, (SBFM ^ inv_bits) | RD(dst) | RN(arg2) | (7 << 10)); return push_inst(compiler, (SBFM ^ inv_bits) | RD(dst) | RN(arg2) | (7 << 10));
case SLJIT_MOV_UH: case SLJIT_MOV_U16:
case SLJIT_MOVU_UH: case SLJIT_MOVU_U16:
SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1); SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1);
return push_inst(compiler, (UBFM ^ (1 << 31)) | RD(dst) | RN(arg2) | (15 << 10)); return push_inst(compiler, (UBFM ^ (1 << 31)) | RD(dst) | RN(arg2) | (15 << 10));
case SLJIT_MOV_SH: case SLJIT_MOV_S16:
case SLJIT_MOVU_SH: case SLJIT_MOVU_S16:
SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1); SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1);
if (!(flags & INT_OP)) if (!(flags & INT_OP))
inv_bits |= 1 << 22; inv_bits |= 1 << 22;
return push_inst(compiler, (SBFM ^ inv_bits) | RD(dst) | RN(arg2) | (15 << 10)); return push_inst(compiler, (SBFM ^ inv_bits) | RD(dst) | RN(arg2) | (15 << 10));
case SLJIT_MOV_UI: case SLJIT_MOV_U32:
case SLJIT_MOVU_UI: case SLJIT_MOVU_U32:
SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1); SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1);
if ((flags & INT_OP) && dst == arg2) if ((flags & INT_OP) && dst == arg2)
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
return push_inst(compiler, (ORR ^ (1 << 31)) | RD(dst) | RN(TMP_ZERO) | RM(arg2)); return push_inst(compiler, (ORR ^ (1 << 31)) | RD(dst) | RN(TMP_ZERO) | RM(arg2));
case SLJIT_MOV_SI: case SLJIT_MOV_S32:
case SLJIT_MOVU_SI: case SLJIT_MOVU_S32:
SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1); SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1);
if ((flags & INT_OP) && dst == arg2) if ((flags & INT_OP) && dst == arg2)
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
@ -777,28 +777,28 @@ set_flags:
#define MEM_SIZE_SHIFT(flags) ((flags) >> 8) #define MEM_SIZE_SHIFT(flags) ((flags) >> 8)
static SLJIT_CONST sljit_ins sljit_mem_imm[4] = { static const sljit_ins sljit_mem_imm[4] = {
/* u l */ 0x39400000 /* ldrb [reg,imm] */, /* u l */ 0x39400000 /* ldrb [reg,imm] */,
/* u s */ 0x39000000 /* strb [reg,imm] */, /* u s */ 0x39000000 /* strb [reg,imm] */,
/* s l */ 0x39800000 /* ldrsb [reg,imm] */, /* s l */ 0x39800000 /* ldrsb [reg,imm] */,
/* s s */ 0x39000000 /* strb [reg,imm] */, /* s s */ 0x39000000 /* strb [reg,imm] */,
}; };
static SLJIT_CONST sljit_ins sljit_mem_simm[4] = { static const sljit_ins sljit_mem_simm[4] = {
/* u l */ 0x38400000 /* ldurb [reg,imm] */, /* u l */ 0x38400000 /* ldurb [reg,imm] */,
/* u s */ 0x38000000 /* sturb [reg,imm] */, /* u s */ 0x38000000 /* sturb [reg,imm] */,
/* s l */ 0x38800000 /* ldursb [reg,imm] */, /* s l */ 0x38800000 /* ldursb [reg,imm] */,
/* s s */ 0x38000000 /* sturb [reg,imm] */, /* s s */ 0x38000000 /* sturb [reg,imm] */,
}; };
static SLJIT_CONST sljit_ins sljit_mem_pre_simm[4] = { static const sljit_ins sljit_mem_pre_simm[4] = {
/* u l */ 0x38400c00 /* ldrb [reg,imm]! */, /* u l */ 0x38400c00 /* ldrb [reg,imm]! */,
/* u s */ 0x38000c00 /* strb [reg,imm]! */, /* u s */ 0x38000c00 /* strb [reg,imm]! */,
/* s l */ 0x38800c00 /* ldrsb [reg,imm]! */, /* s l */ 0x38800c00 /* ldrsb [reg,imm]! */,
/* s s */ 0x38000c00 /* strb [reg,imm]! */, /* s s */ 0x38000c00 /* strb [reg,imm]! */,
}; };
static SLJIT_CONST sljit_ins sljit_mem_reg[4] = { static const sljit_ins sljit_mem_reg[4] = {
/* u l */ 0x38606800 /* ldrb [reg,reg] */, /* u l */ 0x38606800 /* ldrb [reg,reg] */,
/* u s */ 0x38206800 /* strb [reg,reg] */, /* u s */ 0x38206800 /* strb [reg,reg] */,
/* s l */ 0x38a06800 /* ldrsb [reg,reg] */, /* s l */ 0x38a06800 /* ldrsb [reg,reg] */,
@ -806,7 +806,7 @@ static SLJIT_CONST sljit_ins sljit_mem_reg[4] = {
}; };
/* Helper function. Dst should be reg + value, using at most 1 instruction, flags does not set. */ /* Helper function. Dst should be reg + value, using at most 1 instruction, flags does not set. */
static sljit_si emit_set_delta(struct sljit_compiler *compiler, sljit_si dst, sljit_si reg, sljit_sw value) static sljit_s32 emit_set_delta(struct sljit_compiler *compiler, sljit_s32 dst, sljit_s32 reg, sljit_sw value)
{ {
if (value >= 0) { if (value >= 0) {
if (value <= 0xfff) if (value <= 0xfff)
@ -825,9 +825,9 @@ static sljit_si emit_set_delta(struct sljit_compiler *compiler, sljit_si dst, sl
} }
/* Can perform an operation using at most 1 instruction. */ /* Can perform an operation using at most 1 instruction. */
static sljit_si getput_arg_fast(struct sljit_compiler *compiler, sljit_si flags, sljit_si reg, sljit_si arg, sljit_sw argw) static sljit_s32 getput_arg_fast(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg, sljit_sw argw)
{ {
sljit_ui shift = MEM_SIZE_SHIFT(flags); sljit_u32 shift = MEM_SIZE_SHIFT(flags);
SLJIT_ASSERT(arg & SLJIT_MEM); SLJIT_ASSERT(arg & SLJIT_MEM);
@ -882,7 +882,7 @@ static sljit_si getput_arg_fast(struct sljit_compiler *compiler, sljit_si flags,
/* see getput_arg below. /* see getput_arg below.
Note: can_cache is called only for binary operators. Those Note: can_cache is called only for binary operators. Those
operators always uses word arguments without write back. */ operators always uses word arguments without write back. */
static sljit_si can_cache(sljit_si arg, sljit_sw argw, sljit_si next_arg, sljit_sw next_argw) static sljit_s32 can_cache(sljit_s32 arg, sljit_sw argw, sljit_s32 next_arg, sljit_sw next_argw)
{ {
sljit_sw diff; sljit_sw diff;
if ((arg & OFFS_REG_MASK) || !(next_arg & SLJIT_MEM)) if ((arg & OFFS_REG_MASK) || !(next_arg & SLJIT_MEM))
@ -906,11 +906,11 @@ static sljit_si can_cache(sljit_si arg, sljit_sw argw, sljit_si next_arg, sljit_
} }
/* Emit the necessary instructions. See can_cache above. */ /* Emit the necessary instructions. See can_cache above. */
static sljit_si getput_arg(struct sljit_compiler *compiler, sljit_si flags, sljit_si reg, static sljit_s32 getput_arg(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg,
sljit_si arg, sljit_sw argw, sljit_si next_arg, sljit_sw next_argw) sljit_s32 arg, sljit_sw argw, sljit_s32 next_arg, sljit_sw next_argw)
{ {
sljit_ui shift = MEM_SIZE_SHIFT(flags); sljit_u32 shift = MEM_SIZE_SHIFT(flags);
sljit_si tmp_r, other_r; sljit_s32 tmp_r, other_r;
sljit_sw diff; sljit_sw diff;
SLJIT_ASSERT(arg & SLJIT_MEM); SLJIT_ASSERT(arg & SLJIT_MEM);
@ -1040,7 +1040,7 @@ static sljit_si getput_arg(struct sljit_compiler *compiler, sljit_si flags, slji
return push_inst(compiler, sljit_mem_imm[flags & 0x3] | (shift << 30) | RT(reg) | RN(TMP_REG3)); return push_inst(compiler, sljit_mem_imm[flags & 0x3] | (shift << 30) | RT(reg) | RN(TMP_REG3));
} }
static SLJIT_INLINE sljit_si emit_op_mem(struct sljit_compiler *compiler, sljit_si flags, sljit_si reg, sljit_si arg, sljit_sw argw) static SLJIT_INLINE sljit_s32 emit_op_mem(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg, sljit_sw argw)
{ {
if (getput_arg_fast(compiler, flags, reg, arg, argw)) if (getput_arg_fast(compiler, flags, reg, arg, argw))
return compiler->error; return compiler->error;
@ -1049,7 +1049,7 @@ static SLJIT_INLINE sljit_si emit_op_mem(struct sljit_compiler *compiler, sljit_
return getput_arg(compiler, flags, reg, arg, argw, 0, 0); return getput_arg(compiler, flags, reg, arg, argw, 0, 0);
} }
static SLJIT_INLINE sljit_si emit_op_mem2(struct sljit_compiler *compiler, sljit_si flags, sljit_si reg, sljit_si arg1, sljit_sw arg1w, sljit_si arg2, sljit_sw arg2w) static SLJIT_INLINE sljit_s32 emit_op_mem2(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg1, sljit_sw arg1w, sljit_s32 arg2, sljit_sw arg2w)
{ {
if (getput_arg_fast(compiler, flags, reg, arg1, arg1w)) if (getput_arg_fast(compiler, flags, reg, arg1, arg1w))
return compiler->error; return compiler->error;
@ -1060,11 +1060,11 @@ static SLJIT_INLINE sljit_si emit_op_mem2(struct sljit_compiler *compiler, sljit
/* Entry, exit */ /* Entry, exit */
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compiler, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler,
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds, sljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 saveds,
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size) sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
{ {
sljit_si i, tmp, offs, prev, saved_regs_size; sljit_s32 i, tmp, offs, prev, saved_regs_size;
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_enter(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size)); CHECK(check_sljit_emit_enter(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size));
@ -1148,9 +1148,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_set_context(struct sljit_compiler *compiler, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler,
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds, sljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 saveds,
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size) sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
{ {
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size)); CHECK(check_sljit_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size));
@ -1162,10 +1162,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_set_context(struct sljit_compiler *compi
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compiler, sljit_si op, sljit_si src, sljit_sw srcw) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw)
{ {
sljit_si local_size; sljit_s32 local_size;
sljit_si i, tmp, offs, prev, saved_regs_size; sljit_s32 i, tmp, offs, prev, saved_regs_size;
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_return(compiler, op, src, srcw)); CHECK(check_sljit_emit_return(compiler, op, src, srcw));
@ -1243,9 +1243,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compi
/* Operators */ /* Operators */
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler, sljit_si op) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op)
{ {
sljit_ins inv_bits = (op & SLJIT_INT_OP) ? (1 << 31) : 0; sljit_ins inv_bits = (op & SLJIT_I32_OP) ? (1 << 31) : 0;
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_op0(compiler, op)); CHECK(check_sljit_emit_op0(compiler, op));
@ -1256,31 +1256,31 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler
return push_inst(compiler, BRK); return push_inst(compiler, BRK);
case SLJIT_NOP: case SLJIT_NOP:
return push_inst(compiler, NOP); return push_inst(compiler, NOP);
case SLJIT_LUMUL: case SLJIT_LMUL_UW:
case SLJIT_LSMUL: case SLJIT_LMUL_SW:
FAIL_IF(push_inst(compiler, ORR | RD(TMP_REG1) | RN(TMP_ZERO) | RM(SLJIT_R0))); FAIL_IF(push_inst(compiler, ORR | RD(TMP_REG1) | RN(TMP_ZERO) | RM(SLJIT_R0)));
FAIL_IF(push_inst(compiler, MADD | RD(SLJIT_R0) | RN(SLJIT_R0) | RM(SLJIT_R1) | RT2(TMP_ZERO))); FAIL_IF(push_inst(compiler, MADD | RD(SLJIT_R0) | RN(SLJIT_R0) | RM(SLJIT_R1) | RT2(TMP_ZERO)));
return push_inst(compiler, (op == SLJIT_LUMUL ? UMULH : SMULH) | RD(SLJIT_R1) | RN(TMP_REG1) | RM(SLJIT_R1)); return push_inst(compiler, (op == SLJIT_LMUL_UW ? UMULH : SMULH) | RD(SLJIT_R1) | RN(TMP_REG1) | RM(SLJIT_R1));
case SLJIT_UDIVMOD: case SLJIT_DIVMOD_UW:
case SLJIT_SDIVMOD: case SLJIT_DIVMOD_SW:
FAIL_IF(push_inst(compiler, (ORR ^ inv_bits) | RD(TMP_REG1) | RN(TMP_ZERO) | RM(SLJIT_R0))); FAIL_IF(push_inst(compiler, (ORR ^ inv_bits) | RD(TMP_REG1) | RN(TMP_ZERO) | RM(SLJIT_R0)));
FAIL_IF(push_inst(compiler, ((op == SLJIT_UDIVMOD ? UDIV : SDIV) ^ inv_bits) | RD(SLJIT_R0) | RN(SLJIT_R0) | RM(SLJIT_R1))); FAIL_IF(push_inst(compiler, ((op == SLJIT_DIVMOD_UW ? UDIV : SDIV) ^ inv_bits) | RD(SLJIT_R0) | RN(SLJIT_R0) | RM(SLJIT_R1)));
FAIL_IF(push_inst(compiler, (MADD ^ inv_bits) | RD(SLJIT_R1) | RN(SLJIT_R0) | RM(SLJIT_R1) | RT2(TMP_ZERO))); FAIL_IF(push_inst(compiler, (MADD ^ inv_bits) | RD(SLJIT_R1) | RN(SLJIT_R0) | RM(SLJIT_R1) | RT2(TMP_ZERO)));
return push_inst(compiler, (SUB ^ inv_bits) | RD(SLJIT_R1) | RN(TMP_REG1) | RM(SLJIT_R1)); return push_inst(compiler, (SUB ^ inv_bits) | RD(SLJIT_R1) | RN(TMP_REG1) | RM(SLJIT_R1));
case SLJIT_UDIVI: case SLJIT_DIV_UW:
case SLJIT_SDIVI: case SLJIT_DIV_SW:
return push_inst(compiler, ((op == SLJIT_UDIVI ? UDIV : SDIV) ^ inv_bits) | RD(SLJIT_R0) | RN(SLJIT_R0) | RM(SLJIT_R1)); return push_inst(compiler, ((op == SLJIT_DIV_UW ? UDIV : SDIV) ^ inv_bits) | RD(SLJIT_R0) | RN(SLJIT_R0) | RM(SLJIT_R1));
} }
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler, sljit_si op, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src, sljit_sw srcw) sljit_s32 src, sljit_sw srcw)
{ {
sljit_si dst_r, flags, mem_flags; sljit_s32 dst_r, flags, mem_flags;
sljit_si op_flags = GET_ALL_FLAGS(op); sljit_s32 op_flags = GET_ALL_FLAGS(op);
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw)); CHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw));
@ -1299,69 +1299,69 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler
case SLJIT_MOV_P: case SLJIT_MOV_P:
flags = WORD_SIZE; flags = WORD_SIZE;
break; break;
case SLJIT_MOV_UB: case SLJIT_MOV_U8:
flags = BYTE_SIZE; flags = BYTE_SIZE;
if (src & SLJIT_IMM) if (src & SLJIT_IMM)
srcw = (sljit_ub)srcw; srcw = (sljit_u8)srcw;
break; break;
case SLJIT_MOV_SB: case SLJIT_MOV_S8:
flags = BYTE_SIZE | SIGNED; flags = BYTE_SIZE | SIGNED;
if (src & SLJIT_IMM) if (src & SLJIT_IMM)
srcw = (sljit_sb)srcw; srcw = (sljit_s8)srcw;
break; break;
case SLJIT_MOV_UH: case SLJIT_MOV_U16:
flags = HALF_SIZE; flags = HALF_SIZE;
if (src & SLJIT_IMM) if (src & SLJIT_IMM)
srcw = (sljit_uh)srcw; srcw = (sljit_u16)srcw;
break; break;
case SLJIT_MOV_SH: case SLJIT_MOV_S16:
flags = HALF_SIZE | SIGNED; flags = HALF_SIZE | SIGNED;
if (src & SLJIT_IMM) if (src & SLJIT_IMM)
srcw = (sljit_sh)srcw; srcw = (sljit_s16)srcw;
break; break;
case SLJIT_MOV_UI: case SLJIT_MOV_U32:
flags = INT_SIZE; flags = INT_SIZE;
if (src & SLJIT_IMM) if (src & SLJIT_IMM)
srcw = (sljit_ui)srcw; srcw = (sljit_u32)srcw;
break; break;
case SLJIT_MOV_SI: case SLJIT_MOV_S32:
flags = INT_SIZE | SIGNED; flags = INT_SIZE | SIGNED;
if (src & SLJIT_IMM) if (src & SLJIT_IMM)
srcw = (sljit_si)srcw; srcw = (sljit_s32)srcw;
break; break;
case SLJIT_MOVU: case SLJIT_MOVU:
case SLJIT_MOVU_P: case SLJIT_MOVU_P:
flags = WORD_SIZE | UPDATE; flags = WORD_SIZE | UPDATE;
break; break;
case SLJIT_MOVU_UB: case SLJIT_MOVU_U8:
flags = BYTE_SIZE | UPDATE; flags = BYTE_SIZE | UPDATE;
if (src & SLJIT_IMM) if (src & SLJIT_IMM)
srcw = (sljit_ub)srcw; srcw = (sljit_u8)srcw;
break; break;
case SLJIT_MOVU_SB: case SLJIT_MOVU_S8:
flags = BYTE_SIZE | SIGNED | UPDATE; flags = BYTE_SIZE | SIGNED | UPDATE;
if (src & SLJIT_IMM) if (src & SLJIT_IMM)
srcw = (sljit_sb)srcw; srcw = (sljit_s8)srcw;
break; break;
case SLJIT_MOVU_UH: case SLJIT_MOVU_U16:
flags = HALF_SIZE | UPDATE; flags = HALF_SIZE | UPDATE;
if (src & SLJIT_IMM) if (src & SLJIT_IMM)
srcw = (sljit_uh)srcw; srcw = (sljit_u16)srcw;
break; break;
case SLJIT_MOVU_SH: case SLJIT_MOVU_S16:
flags = HALF_SIZE | SIGNED | UPDATE; flags = HALF_SIZE | SIGNED | UPDATE;
if (src & SLJIT_IMM) if (src & SLJIT_IMM)
srcw = (sljit_sh)srcw; srcw = (sljit_s16)srcw;
break; break;
case SLJIT_MOVU_UI: case SLJIT_MOVU_U32:
flags = INT_SIZE | UPDATE; flags = INT_SIZE | UPDATE;
if (src & SLJIT_IMM) if (src & SLJIT_IMM)
srcw = (sljit_ui)srcw; srcw = (sljit_u32)srcw;
break; break;
case SLJIT_MOVU_SI: case SLJIT_MOVU_S32:
flags = INT_SIZE | SIGNED | UPDATE; flags = INT_SIZE | SIGNED | UPDATE;
if (src & SLJIT_IMM) if (src & SLJIT_IMM)
srcw = (sljit_si)srcw; srcw = (sljit_s32)srcw;
break; break;
default: default:
SLJIT_ASSERT_STOP(); SLJIT_ASSERT_STOP();
@ -1378,7 +1378,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler
FAIL_IF(getput_arg(compiler, flags, dst_r, src, srcw, dst, dstw)); FAIL_IF(getput_arg(compiler, flags, dst_r, src, srcw, dst, dstw));
} else { } else {
if (dst_r != TMP_REG1) if (dst_r != TMP_REG1)
return emit_op_imm(compiler, op | ((op_flags & SLJIT_INT_OP) ? INT_OP : 0), dst_r, TMP_REG1, src); return emit_op_imm(compiler, op | ((op_flags & SLJIT_I32_OP) ? INT_OP : 0), dst_r, TMP_REG1, src);
dst_r = src; dst_r = src;
} }
@ -1393,7 +1393,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler
flags = GET_FLAGS(op_flags) ? SET_FLAGS : 0; flags = GET_FLAGS(op_flags) ? SET_FLAGS : 0;
mem_flags = WORD_SIZE; mem_flags = WORD_SIZE;
if (op_flags & SLJIT_INT_OP) { if (op_flags & SLJIT_I32_OP) {
flags |= INT_OP; flags |= INT_OP;
mem_flags = INT_SIZE; mem_flags = INT_SIZE;
} }
@ -1411,8 +1411,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler
if (src & SLJIT_IMM) { if (src & SLJIT_IMM) {
flags |= ARG2_IMM; flags |= ARG2_IMM;
if (op_flags & SLJIT_INT_OP) if (op_flags & SLJIT_I32_OP)
srcw = (sljit_si)srcw; srcw = (sljit_s32)srcw;
} else } else
srcw = src; srcw = src;
@ -1427,12 +1427,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler, sljit_si op, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src1, sljit_sw src1w, sljit_s32 src1, sljit_sw src1w,
sljit_si src2, sljit_sw src2w) sljit_s32 src2, sljit_sw src2w)
{ {
sljit_si dst_r, flags, mem_flags; sljit_s32 dst_r, flags, mem_flags;
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_op2(compiler, op, dst, dstw, src1, src1w, src2, src2w)); CHECK(check_sljit_emit_op2(compiler, op, dst, dstw, src1, src1w, src2, src2w));
@ -1446,7 +1446,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler
dst_r = SLOW_IS_REG(dst) ? dst : TMP_REG1; dst_r = SLOW_IS_REG(dst) ? dst : TMP_REG1;
flags = GET_FLAGS(op) ? SET_FLAGS : 0; flags = GET_FLAGS(op) ? SET_FLAGS : 0;
mem_flags = WORD_SIZE; mem_flags = WORD_SIZE;
if (op & SLJIT_INT_OP) { if (op & SLJIT_I32_OP) {
flags |= INT_OP; flags |= INT_OP;
mem_flags = INT_SIZE; mem_flags = INT_SIZE;
} }
@ -1512,20 +1512,20 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_register_index(sljit_si reg) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg)
{ {
CHECK_REG_INDEX(check_sljit_get_register_index(reg)); CHECK_REG_INDEX(check_sljit_get_register_index(reg));
return reg_map[reg]; return reg_map[reg];
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_float_register_index(sljit_si reg) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg)
{ {
CHECK_REG_INDEX(check_sljit_get_float_register_index(reg)); CHECK_REG_INDEX(check_sljit_get_float_register_index(reg));
return reg; return reg;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_custom(struct sljit_compiler *compiler, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler,
void *instruction, sljit_si size) void *instruction, sljit_s32 size)
{ {
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_op_custom(compiler, instruction, size)); CHECK(check_sljit_emit_op_custom(compiler, instruction, size));
@ -1537,7 +1537,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_custom(struct sljit_compiler *co
/* Floating point operators */ /* Floating point operators */
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_is_fpu_available(void) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_is_fpu_available(void)
{ {
#ifdef SLJIT_IS_FPU_AVAILABLE #ifdef SLJIT_IS_FPU_AVAILABLE
return SLJIT_IS_FPU_AVAILABLE; return SLJIT_IS_FPU_AVAILABLE;
@ -1547,11 +1547,11 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_is_fpu_available(void)
#endif #endif
} }
static sljit_si emit_fop_mem(struct sljit_compiler *compiler, sljit_si flags, sljit_si reg, sljit_si arg, sljit_sw argw) static sljit_s32 emit_fop_mem(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg, sljit_sw argw)
{ {
sljit_ui shift = MEM_SIZE_SHIFT(flags); sljit_u32 shift = MEM_SIZE_SHIFT(flags);
sljit_ins ins_bits = (shift << 30); sljit_ins ins_bits = (shift << 30);
sljit_si other_r; sljit_s32 other_r;
sljit_sw diff; sljit_sw diff;
SLJIT_ASSERT(arg & SLJIT_MEM); SLJIT_ASSERT(arg & SLJIT_MEM);
@ -1600,45 +1600,45 @@ static sljit_si emit_fop_mem(struct sljit_compiler *compiler, sljit_si flags, sl
return push_inst(compiler, STR_FI | ins_bits | VT(reg) | RN(TMP_REG3)); return push_inst(compiler, STR_FI | ins_bits | VT(reg) | RN(TMP_REG3));
} }
static SLJIT_INLINE sljit_si sljit_emit_fop1_convw_fromd(struct sljit_compiler *compiler, sljit_si op, static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src, sljit_sw srcw) sljit_s32 src, sljit_sw srcw)
{ {
sljit_si dst_r = SLOW_IS_REG(dst) ? dst : TMP_REG1; sljit_s32 dst_r = SLOW_IS_REG(dst) ? dst : TMP_REG1;
sljit_ins inv_bits = (op & SLJIT_SINGLE_OP) ? (1 << 22) : 0; sljit_ins inv_bits = (op & SLJIT_F32_OP) ? (1 << 22) : 0;
if (GET_OPCODE(op) == SLJIT_CONVI_FROMD) if (GET_OPCODE(op) == SLJIT_CONV_S32_FROM_F64)
inv_bits |= (1 << 31); inv_bits |= (1 << 31);
if (src & SLJIT_MEM) { if (src & SLJIT_MEM) {
emit_fop_mem(compiler, (op & SLJIT_SINGLE_OP) ? INT_SIZE : WORD_SIZE, TMP_FREG1, src, srcw); emit_fop_mem(compiler, (op & SLJIT_F32_OP) ? INT_SIZE : WORD_SIZE, TMP_FREG1, src, srcw);
src = TMP_FREG1; src = TMP_FREG1;
} }
FAIL_IF(push_inst(compiler, (FCVTZS ^ inv_bits) | RD(dst_r) | VN(src))); FAIL_IF(push_inst(compiler, (FCVTZS ^ inv_bits) | RD(dst_r) | VN(src)));
if (dst_r == TMP_REG1 && dst != SLJIT_UNUSED) if (dst_r == TMP_REG1 && dst != SLJIT_UNUSED)
return emit_op_mem(compiler, ((GET_OPCODE(op) == SLJIT_CONVI_FROMD) ? INT_SIZE : WORD_SIZE) | STORE, TMP_REG1, dst, dstw); return emit_op_mem(compiler, ((GET_OPCODE(op) == SLJIT_CONV_S32_FROM_F64) ? INT_SIZE : WORD_SIZE) | STORE, TMP_REG1, dst, dstw);
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
static SLJIT_INLINE sljit_si sljit_emit_fop1_convd_fromw(struct sljit_compiler *compiler, sljit_si op, static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src, sljit_sw srcw) sljit_s32 src, sljit_sw srcw)
{ {
sljit_si dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;
sljit_ins inv_bits = (op & SLJIT_SINGLE_OP) ? (1 << 22) : 0; sljit_ins inv_bits = (op & SLJIT_F32_OP) ? (1 << 22) : 0;
if (GET_OPCODE(op) == SLJIT_CONVD_FROMI) if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32)
inv_bits |= (1 << 31); inv_bits |= (1 << 31);
if (src & SLJIT_MEM) { if (src & SLJIT_MEM) {
emit_op_mem(compiler, ((GET_OPCODE(op) == SLJIT_CONVD_FROMI) ? INT_SIZE : WORD_SIZE), TMP_REG1, src, srcw); emit_op_mem(compiler, ((GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32) ? INT_SIZE : WORD_SIZE), TMP_REG1, src, srcw);
src = TMP_REG1; src = TMP_REG1;
} else if (src & SLJIT_IMM) { } else if (src & SLJIT_IMM) {
#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
if (GET_OPCODE(op) == SLJIT_CONVD_FROMI) if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32)
srcw = (sljit_si)srcw; srcw = (sljit_s32)srcw;
#endif #endif
FAIL_IF(load_immediate(compiler, TMP_REG1, srcw)); FAIL_IF(load_immediate(compiler, TMP_REG1, srcw));
src = TMP_REG1; src = TMP_REG1;
@ -1647,16 +1647,16 @@ static SLJIT_INLINE sljit_si sljit_emit_fop1_convd_fromw(struct sljit_compiler *
FAIL_IF(push_inst(compiler, (SCVTF ^ inv_bits) | VD(dst_r) | RN(src))); FAIL_IF(push_inst(compiler, (SCVTF ^ inv_bits) | VD(dst_r) | RN(src)));
if (dst & SLJIT_MEM) if (dst & SLJIT_MEM)
return emit_fop_mem(compiler, ((op & SLJIT_SINGLE_OP) ? INT_SIZE : WORD_SIZE) | STORE, TMP_FREG1, dst, dstw); return emit_fop_mem(compiler, ((op & SLJIT_F32_OP) ? INT_SIZE : WORD_SIZE) | STORE, TMP_FREG1, dst, dstw);
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
static SLJIT_INLINE sljit_si sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_si op, static SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si src1, sljit_sw src1w, sljit_s32 src1, sljit_sw src1w,
sljit_si src2, sljit_sw src2w) sljit_s32 src2, sljit_sw src2w)
{ {
sljit_si mem_flags = (op & SLJIT_SINGLE_OP) ? INT_SIZE : WORD_SIZE; sljit_s32 mem_flags = (op & SLJIT_F32_OP) ? INT_SIZE : WORD_SIZE;
sljit_ins inv_bits = (op & SLJIT_SINGLE_OP) ? (1 << 22) : 0; sljit_ins inv_bits = (op & SLJIT_F32_OP) ? (1 << 22) : 0;
if (src1 & SLJIT_MEM) { if (src1 & SLJIT_MEM) {
emit_fop_mem(compiler, mem_flags, TMP_FREG1, src1, src1w); emit_fop_mem(compiler, mem_flags, TMP_FREG1, src1, src1w);
@ -1671,11 +1671,11 @@ static SLJIT_INLINE sljit_si sljit_emit_fop1_cmp(struct sljit_compiler *compiler
return push_inst(compiler, (FCMP ^ inv_bits) | VN(src1) | VM(src2)); return push_inst(compiler, (FCMP ^ inv_bits) | VN(src1) | VM(src2));
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop1(struct sljit_compiler *compiler, sljit_si op, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src, sljit_sw srcw) sljit_s32 src, sljit_sw srcw)
{ {
sljit_si dst_r, mem_flags = (op & SLJIT_SINGLE_OP) ? INT_SIZE : WORD_SIZE; sljit_s32 dst_r, mem_flags = (op & SLJIT_F32_OP) ? INT_SIZE : WORD_SIZE;
sljit_ins inv_bits; sljit_ins inv_bits;
CHECK_ERROR(); CHECK_ERROR();
@ -1685,16 +1685,16 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop1(struct sljit_compiler *compile
SLJIT_COMPILE_ASSERT((INT_SIZE ^ 0x100) == WORD_SIZE, must_be_one_bit_difference); SLJIT_COMPILE_ASSERT((INT_SIZE ^ 0x100) == WORD_SIZE, must_be_one_bit_difference);
SELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw); SELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw);
inv_bits = (op & SLJIT_SINGLE_OP) ? (1 << 22) : 0; inv_bits = (op & SLJIT_F32_OP) ? (1 << 22) : 0;
dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;
if (src & SLJIT_MEM) { if (src & SLJIT_MEM) {
emit_fop_mem(compiler, (GET_OPCODE(op) == SLJIT_CONVD_FROMS) ? (mem_flags ^ 0x100) : mem_flags, dst_r, src, srcw); emit_fop_mem(compiler, (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_F32) ? (mem_flags ^ 0x100) : mem_flags, dst_r, src, srcw);
src = dst_r; src = dst_r;
} }
switch (GET_OPCODE(op)) { switch (GET_OPCODE(op)) {
case SLJIT_DMOV: case SLJIT_MOV_F64:
if (src != dst_r) { if (src != dst_r) {
if (dst_r != TMP_FREG1) if (dst_r != TMP_FREG1)
FAIL_IF(push_inst(compiler, (FMOV ^ inv_bits) | VD(dst_r) | VN(src))); FAIL_IF(push_inst(compiler, (FMOV ^ inv_bits) | VD(dst_r) | VN(src)));
@ -1702,14 +1702,14 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop1(struct sljit_compiler *compile
dst_r = src; dst_r = src;
} }
break; break;
case SLJIT_DNEG: case SLJIT_NEG_F64:
FAIL_IF(push_inst(compiler, (FNEG ^ inv_bits) | VD(dst_r) | VN(src))); FAIL_IF(push_inst(compiler, (FNEG ^ inv_bits) | VD(dst_r) | VN(src)));
break; break;
case SLJIT_DABS: case SLJIT_ABS_F64:
FAIL_IF(push_inst(compiler, (FABS ^ inv_bits) | VD(dst_r) | VN(src))); FAIL_IF(push_inst(compiler, (FABS ^ inv_bits) | VD(dst_r) | VN(src)));
break; break;
case SLJIT_CONVD_FROMS: case SLJIT_CONV_F64_FROM_F32:
FAIL_IF(push_inst(compiler, FCVT | ((op & SLJIT_SINGLE_OP) ? (1 << 22) : (1 << 15)) | VD(dst_r) | VN(src))); FAIL_IF(push_inst(compiler, FCVT | ((op & SLJIT_F32_OP) ? (1 << 22) : (1 << 15)) | VD(dst_r) | VN(src)));
break; break;
} }
@ -1718,13 +1718,13 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop1(struct sljit_compiler *compile
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compiler, sljit_si op, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src1, sljit_sw src1w, sljit_s32 src1, sljit_sw src1w,
sljit_si src2, sljit_sw src2w) sljit_s32 src2, sljit_sw src2w)
{ {
sljit_si dst_r, mem_flags = (op & SLJIT_SINGLE_OP) ? INT_SIZE : WORD_SIZE; sljit_s32 dst_r, mem_flags = (op & SLJIT_F32_OP) ? INT_SIZE : WORD_SIZE;
sljit_ins inv_bits = (op & SLJIT_SINGLE_OP) ? (1 << 22) : 0; sljit_ins inv_bits = (op & SLJIT_F32_OP) ? (1 << 22) : 0;
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_fop2(compiler, op, dst, dstw, src1, src1w, src2, src2w)); CHECK(check_sljit_emit_fop2(compiler, op, dst, dstw, src1, src1w, src2, src2w));
@ -1746,16 +1746,16 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compile
} }
switch (GET_OPCODE(op)) { switch (GET_OPCODE(op)) {
case SLJIT_DADD: case SLJIT_ADD_F64:
FAIL_IF(push_inst(compiler, (FADD ^ inv_bits) | VD(dst_r) | VN(src1) | VM(src2))); FAIL_IF(push_inst(compiler, (FADD ^ inv_bits) | VD(dst_r) | VN(src1) | VM(src2)));
break; break;
case SLJIT_DSUB: case SLJIT_SUB_F64:
FAIL_IF(push_inst(compiler, (FSUB ^ inv_bits) | VD(dst_r) | VN(src1) | VM(src2))); FAIL_IF(push_inst(compiler, (FSUB ^ inv_bits) | VD(dst_r) | VN(src1) | VM(src2)));
break; break;
case SLJIT_DMUL: case SLJIT_MUL_F64:
FAIL_IF(push_inst(compiler, (FMUL ^ inv_bits) | VD(dst_r) | VN(src1) | VM(src2))); FAIL_IF(push_inst(compiler, (FMUL ^ inv_bits) | VD(dst_r) | VN(src1) | VM(src2)));
break; break;
case SLJIT_DDIV: case SLJIT_DIV_F64:
FAIL_IF(push_inst(compiler, (FDIV ^ inv_bits) | VD(dst_r) | VN(src1) | VM(src2))); FAIL_IF(push_inst(compiler, (FDIV ^ inv_bits) | VD(dst_r) | VN(src1) | VM(src2)));
break; break;
} }
@ -1769,7 +1769,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compile
/* Other instructions */ /* Other instructions */
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_si dst, sljit_sw dstw) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)
{ {
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw)); CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw));
@ -1786,7 +1786,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_enter(struct sljit_compiler *c
return emit_op_mem(compiler, WORD_SIZE | STORE, TMP_LR, dst, dstw); return emit_op_mem(compiler, WORD_SIZE | STORE, TMP_LR, dst, dstw);
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_si src, sljit_sw srcw) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw)
{ {
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_fast_return(compiler, src, srcw)); CHECK(check_sljit_emit_fast_return(compiler, src, srcw));
@ -1806,33 +1806,33 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_return(struct sljit_compiler *
/* Conditional instructions */ /* Conditional instructions */
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
static sljit_uw get_cc(sljit_si type) static sljit_uw get_cc(sljit_s32 type)
{ {
switch (type) { switch (type) {
case SLJIT_EQUAL: case SLJIT_EQUAL:
case SLJIT_MUL_NOT_OVERFLOW: case SLJIT_MUL_NOT_OVERFLOW:
case SLJIT_D_EQUAL: case SLJIT_EQUAL_F64:
return 0x1; return 0x1;
case SLJIT_NOT_EQUAL: case SLJIT_NOT_EQUAL:
case SLJIT_MUL_OVERFLOW: case SLJIT_MUL_OVERFLOW:
case SLJIT_D_NOT_EQUAL: case SLJIT_NOT_EQUAL_F64:
return 0x0; return 0x0;
case SLJIT_LESS: case SLJIT_LESS:
case SLJIT_D_LESS: case SLJIT_LESS_F64:
return 0x2; return 0x2;
case SLJIT_GREATER_EQUAL: case SLJIT_GREATER_EQUAL:
case SLJIT_D_GREATER_EQUAL: case SLJIT_GREATER_EQUAL_F64:
return 0x3; return 0x3;
case SLJIT_GREATER: case SLJIT_GREATER:
case SLJIT_D_GREATER: case SLJIT_GREATER_F64:
return 0x9; return 0x9;
case SLJIT_LESS_EQUAL: case SLJIT_LESS_EQUAL:
case SLJIT_D_LESS_EQUAL: case SLJIT_LESS_EQUAL_F64:
return 0x8; return 0x8;
case SLJIT_SIG_LESS: case SLJIT_SIG_LESS:
@ -1848,11 +1848,11 @@ static sljit_uw get_cc(sljit_si type)
return 0xc; return 0xc;
case SLJIT_OVERFLOW: case SLJIT_OVERFLOW:
case SLJIT_D_UNORDERED: case SLJIT_UNORDERED_F64:
return 0x7; return 0x7;
case SLJIT_NOT_OVERFLOW: case SLJIT_NOT_OVERFLOW:
case SLJIT_D_ORDERED: case SLJIT_ORDERED_F64:
return 0x6; return 0x6;
default: default:
@ -1877,7 +1877,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compi
return label; return label;
} }
SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_si type) SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type)
{ {
struct sljit_jump *jump; struct sljit_jump *jump;
@ -1903,11 +1903,11 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile
return jump; return jump;
} }
static SLJIT_INLINE struct sljit_jump* emit_cmp_to0(struct sljit_compiler *compiler, sljit_si type, static SLJIT_INLINE struct sljit_jump* emit_cmp_to0(struct sljit_compiler *compiler, sljit_s32 type,
sljit_si src, sljit_sw srcw) sljit_s32 src, sljit_sw srcw)
{ {
struct sljit_jump *jump; struct sljit_jump *jump;
sljit_ins inv_bits = (type & SLJIT_INT_OP) ? (1 << 31) : 0; sljit_ins inv_bits = (type & SLJIT_I32_OP) ? (1 << 31) : 0;
SLJIT_ASSERT((type & 0xff) == SLJIT_EQUAL || (type & 0xff) == SLJIT_NOT_EQUAL); SLJIT_ASSERT((type & 0xff) == SLJIT_EQUAL || (type & 0xff) == SLJIT_NOT_EQUAL);
ADJUST_LOCAL_OFFSET(src, srcw); ADJUST_LOCAL_OFFSET(src, srcw);
@ -1937,7 +1937,7 @@ static SLJIT_INLINE struct sljit_jump* emit_cmp_to0(struct sljit_compiler *compi
return jump; return jump;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_ijump(struct sljit_compiler *compiler, sljit_si type, sljit_si src, sljit_sw srcw) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src, sljit_sw srcw)
{ {
struct sljit_jump *jump; struct sljit_jump *jump;
@ -1964,12 +1964,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_ijump(struct sljit_compiler *compil
return push_inst(compiler, ((type >= SLJIT_FAST_CALL) ? BLR : BR) | RN(TMP_REG1)); return push_inst(compiler, ((type >= SLJIT_FAST_CALL) ? BLR : BR) | RN(TMP_REG1));
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_si op, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src, sljit_sw srcw, sljit_s32 src, sljit_sw srcw,
sljit_si type) sljit_s32 type)
{ {
sljit_si dst_r, flags, mem_flags; sljit_s32 dst_r, flags, mem_flags;
sljit_ins cc; sljit_ins cc;
CHECK_ERROR(); CHECK_ERROR();
@ -1994,7 +1994,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *com
compiler->cache_argw = 0; compiler->cache_argw = 0;
flags = GET_FLAGS(op) ? SET_FLAGS : 0; flags = GET_FLAGS(op) ? SET_FLAGS : 0;
mem_flags = WORD_SIZE; mem_flags = WORD_SIZE;
if (op & SLJIT_INT_OP) { if (op & SLJIT_I32_OP) {
flags |= INT_OP; flags |= INT_OP;
mem_flags = INT_SIZE; mem_flags = INT_SIZE;
} }
@ -2014,10 +2014,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *com
return emit_op_mem2(compiler, mem_flags | STORE, TMP_REG1, dst, dstw, 0, 0); return emit_op_mem2(compiler, mem_flags | STORE, TMP_REG1, dst, dstw, 0, 0);
} }
SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_si dst, sljit_sw dstw, sljit_sw init_value) SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value)
{ {
struct sljit_const *const_; struct sljit_const *const_;
sljit_si dst_r; sljit_s32 dst_r;
CHECK_ERROR_PTR(); CHECK_ERROR_PTR();
CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value)); CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value));

View File

@ -24,13 +24,13 @@
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
SLJIT_API_FUNC_ATTRIBUTE SLJIT_CONST char* sljit_get_platform_name(void) SLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void)
{ {
return "ARM-Thumb2" SLJIT_CPUINFO; return "ARM-Thumb2" SLJIT_CPUINFO;
} }
/* Length of an instruction word. */ /* Length of an instruction word. */
typedef sljit_ui sljit_ins; typedef sljit_u32 sljit_ins;
/* Last register + 1. */ /* Last register + 1. */
#define TMP_REG1 (SLJIT_NUMBER_OF_REGISTERS + 2) #define TMP_REG1 (SLJIT_NUMBER_OF_REGISTERS + 2)
@ -42,7 +42,7 @@ typedef sljit_ui sljit_ins;
#define TMP_FREG2 (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1) #define TMP_FREG2 (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1)
/* See sljit_emit_enter and sljit_emit_op0 if you want to change them. */ /* See sljit_emit_enter and sljit_emit_op0 if you want to change them. */
static SLJIT_CONST sljit_ub reg_map[SLJIT_NUMBER_OF_REGISTERS + 6] = { static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 6] = {
0, 0, 1, 2, 12, 11, 10, 9, 8, 7, 6, 5, 13, 3, 4, 14, 15 0, 0, 1, 2, 12, 11, 10, 9, 8, 7, 6, 5, 13, 3, 4, 14, 15
}; };
@ -181,21 +181,21 @@ static SLJIT_CONST sljit_ub reg_map[SLJIT_NUMBER_OF_REGISTERS + 6] = {
#define VSTR_F32 0xed000a00 #define VSTR_F32 0xed000a00
#define VSUB_F32 0xee300a40 #define VSUB_F32 0xee300a40
static sljit_si push_inst16(struct sljit_compiler *compiler, sljit_ins inst) static sljit_s32 push_inst16(struct sljit_compiler *compiler, sljit_ins inst)
{ {
sljit_uh *ptr; sljit_u16 *ptr;
SLJIT_ASSERT(!(inst & 0xffff0000)); SLJIT_ASSERT(!(inst & 0xffff0000));
ptr = (sljit_uh*)ensure_buf(compiler, sizeof(sljit_uh)); ptr = (sljit_u16*)ensure_buf(compiler, sizeof(sljit_u16));
FAIL_IF(!ptr); FAIL_IF(!ptr);
*ptr = inst; *ptr = inst;
compiler->size++; compiler->size++;
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
static sljit_si push_inst32(struct sljit_compiler *compiler, sljit_ins inst) static sljit_s32 push_inst32(struct sljit_compiler *compiler, sljit_ins inst)
{ {
sljit_uh *ptr = (sljit_uh*)ensure_buf(compiler, sizeof(sljit_ins)); sljit_u16 *ptr = (sljit_u16*)ensure_buf(compiler, sizeof(sljit_ins));
FAIL_IF(!ptr); FAIL_IF(!ptr);
*ptr++ = inst >> 16; *ptr++ = inst >> 16;
*ptr = inst; *ptr = inst;
@ -203,7 +203,7 @@ static sljit_si push_inst32(struct sljit_compiler *compiler, sljit_ins inst)
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
static SLJIT_INLINE sljit_si emit_imm32_const(struct sljit_compiler *compiler, sljit_si dst, sljit_uw imm) static SLJIT_INLINE sljit_s32 emit_imm32_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_uw imm)
{ {
FAIL_IF(push_inst32(compiler, MOVW | RD4(dst) | FAIL_IF(push_inst32(compiler, MOVW | RD4(dst) |
COPY_BITS(imm, 12, 16, 4) | COPY_BITS(imm, 11, 26, 1) | COPY_BITS(imm, 8, 12, 3) | (imm & 0xff))); COPY_BITS(imm, 12, 16, 4) | COPY_BITS(imm, 11, 26, 1) | COPY_BITS(imm, 8, 12, 3) | (imm & 0xff)));
@ -211,9 +211,9 @@ static SLJIT_INLINE sljit_si emit_imm32_const(struct sljit_compiler *compiler, s
COPY_BITS(imm, 12 + 16, 16, 4) | COPY_BITS(imm, 11 + 16, 26, 1) | COPY_BITS(imm, 8 + 16, 12, 3) | ((imm & 0xff0000) >> 16)); COPY_BITS(imm, 12 + 16, 16, 4) | COPY_BITS(imm, 11 + 16, 26, 1) | COPY_BITS(imm, 8 + 16, 12, 3) | ((imm & 0xff0000) >> 16));
} }
static SLJIT_INLINE void modify_imm32_const(sljit_uh *inst, sljit_uw new_imm) static SLJIT_INLINE void modify_imm32_const(sljit_u16 *inst, sljit_uw new_imm)
{ {
sljit_si dst = inst[1] & 0x0f00; sljit_s32 dst = inst[1] & 0x0f00;
SLJIT_ASSERT(((inst[0] & 0xfbf0) == (MOVW >> 16)) && ((inst[2] & 0xfbf0) == (MOVT >> 16)) && dst == (inst[3] & 0x0f00)); SLJIT_ASSERT(((inst[0] & 0xfbf0) == (MOVW >> 16)) && ((inst[2] & 0xfbf0) == (MOVT >> 16)) && dst == (inst[3] & 0x0f00));
inst[0] = (MOVW >> 16) | COPY_BITS(new_imm, 12, 0, 4) | COPY_BITS(new_imm, 11, 10, 1); inst[0] = (MOVW >> 16) | COPY_BITS(new_imm, 12, 0, 4) | COPY_BITS(new_imm, 11, 10, 1);
inst[1] = dst | COPY_BITS(new_imm, 8, 12, 3) | (new_imm & 0xff); inst[1] = dst | COPY_BITS(new_imm, 8, 12, 3) | (new_imm & 0xff);
@ -221,7 +221,7 @@ static SLJIT_INLINE void modify_imm32_const(sljit_uh *inst, sljit_uw new_imm)
inst[3] = dst | COPY_BITS(new_imm, 8 + 16, 12, 3) | ((new_imm & 0xff0000) >> 16); inst[3] = dst | COPY_BITS(new_imm, 8 + 16, 12, 3) | ((new_imm & 0xff0000) >> 16);
} }
static SLJIT_INLINE sljit_si detect_jump_type(struct sljit_jump *jump, sljit_uh *code_ptr, sljit_uh *code) static SLJIT_INLINE sljit_s32 detect_jump_type(struct sljit_jump *jump, sljit_u16 *code_ptr, sljit_u16 *code)
{ {
sljit_sw diff; sljit_sw diff;
@ -278,13 +278,13 @@ static SLJIT_INLINE sljit_si detect_jump_type(struct sljit_jump *jump, sljit_uh
static SLJIT_INLINE void set_jump_instruction(struct sljit_jump *jump) static SLJIT_INLINE void set_jump_instruction(struct sljit_jump *jump)
{ {
sljit_si type = (jump->flags >> 4) & 0xf; sljit_s32 type = (jump->flags >> 4) & 0xf;
sljit_sw diff; sljit_sw diff;
sljit_uh *jump_inst; sljit_u16 *jump_inst;
sljit_si s, j1, j2; sljit_s32 s, j1, j2;
if (SLJIT_UNLIKELY(type == 0)) { if (SLJIT_UNLIKELY(type == 0)) {
modify_imm32_const((sljit_uh*)jump->addr, (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target); modify_imm32_const((sljit_u16*)jump->addr, (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target);
return; return;
} }
@ -294,7 +294,7 @@ static SLJIT_INLINE void set_jump_instruction(struct sljit_jump *jump)
} }
else else
diff = ((sljit_sw)(jump->u.label->addr) - (sljit_sw)(jump->addr + 4)) >> 1; diff = ((sljit_sw)(jump->u.label->addr) - (sljit_sw)(jump->addr + 4)) >> 1;
jump_inst = (sljit_uh*)jump->addr; jump_inst = (sljit_u16*)jump->addr;
switch (type) { switch (type) {
case 1: case 1:
@ -342,10 +342,10 @@ static SLJIT_INLINE void set_jump_instruction(struct sljit_jump *jump)
SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler) SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler)
{ {
struct sljit_memory_fragment *buf; struct sljit_memory_fragment *buf;
sljit_uh *code; sljit_u16 *code;
sljit_uh *code_ptr; sljit_u16 *code_ptr;
sljit_uh *buf_ptr; sljit_u16 *buf_ptr;
sljit_uh *buf_end; sljit_u16 *buf_end;
sljit_uw half_count; sljit_uw half_count;
struct sljit_label *label; struct sljit_label *label;
@ -356,7 +356,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
CHECK_PTR(check_sljit_generate_code(compiler)); CHECK_PTR(check_sljit_generate_code(compiler));
reverse_buf(compiler); reverse_buf(compiler);
code = (sljit_uh*)SLJIT_MALLOC_EXEC(compiler->size * sizeof(sljit_uh)); code = (sljit_u16*)SLJIT_MALLOC_EXEC(compiler->size * sizeof(sljit_u16));
PTR_FAIL_WITH_EXEC_IF(code); PTR_FAIL_WITH_EXEC_IF(code);
buf = compiler->buf; buf = compiler->buf;
@ -367,7 +367,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
const_ = compiler->consts; const_ = compiler->consts;
do { do {
buf_ptr = (sljit_uh*)buf->memory; buf_ptr = (sljit_u16*)buf->memory;
buf_end = buf_ptr + (buf->used_size >> 1); buf_end = buf_ptr + (buf->used_size >> 1);
do { do {
*code_ptr = *buf_ptr++; *code_ptr = *buf_ptr++;
@ -414,7 +414,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
} }
compiler->error = SLJIT_ERR_COMPILED; compiler->error = SLJIT_ERR_COMPILED;
compiler->executable_size = (code_ptr - code) * sizeof(sljit_uh); compiler->executable_size = (code_ptr - code) * sizeof(sljit_u16);
SLJIT_CACHE_FLUSH(code, code_ptr); SLJIT_CACHE_FLUSH(code, code_ptr);
/* Set thumb mode flag. */ /* Set thumb mode flag. */
return (void*)((sljit_uw)code | 0x1); return (void*)((sljit_uw)code | 0x1);
@ -428,7 +428,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
static sljit_uw get_imm(sljit_uw imm) static sljit_uw get_imm(sljit_uw imm)
{ {
/* Thumb immediate form. */ /* Thumb immediate form. */
sljit_si counter; sljit_s32 counter;
if (imm <= 0xff) if (imm <= 0xff)
return imm; return imm;
@ -474,7 +474,7 @@ static sljit_uw get_imm(sljit_uw imm)
return ((imm >> 24) & 0x7f) | COPY_BITS(counter, 4, 26, 1) | COPY_BITS(counter, 1, 12, 3) | COPY_BITS(counter, 0, 7, 1); return ((imm >> 24) & 0x7f) | COPY_BITS(counter, 4, 26, 1) | COPY_BITS(counter, 1, 12, 3) | COPY_BITS(counter, 0, 7, 1);
} }
static sljit_si load_immediate(struct sljit_compiler *compiler, sljit_si dst, sljit_uw imm) static sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 dst, sljit_uw imm)
{ {
sljit_uw tmp; sljit_uw tmp;
@ -508,12 +508,12 @@ static sljit_si load_immediate(struct sljit_compiler *compiler, sljit_si dst, sl
#define SLOW_SRC1 0x0800000 #define SLOW_SRC1 0x0800000
#define SLOW_SRC2 0x1000000 #define SLOW_SRC2 0x1000000
static sljit_si emit_op_imm(struct sljit_compiler *compiler, sljit_si flags, sljit_si dst, sljit_uw arg1, sljit_uw arg2) static sljit_s32 emit_op_imm(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 dst, sljit_uw arg1, sljit_uw arg2)
{ {
/* dst must be register, TMP_REG1 /* dst must be register, TMP_REG1
arg1 must be register, TMP_REG1, imm arg1 must be register, TMP_REG1, imm
arg2 must be register, TMP_REG2, imm */ arg2 must be register, TMP_REG2, imm */
sljit_si reg; sljit_s32 reg;
sljit_uw imm, nimm; sljit_uw imm, nimm;
if (SLJIT_UNLIKELY((flags & (ARG1_IMM | ARG2_IMM)) == (ARG1_IMM | ARG2_IMM))) { if (SLJIT_UNLIKELY((flags & (ARG1_IMM | ARG2_IMM)) == (ARG1_IMM | ARG2_IMM))) {
@ -677,37 +677,37 @@ static sljit_si emit_op_imm(struct sljit_compiler *compiler, sljit_si flags, slj
/* Both arguments are registers. */ /* Both arguments are registers. */
switch (flags & 0xffff) { switch (flags & 0xffff) {
case SLJIT_MOV: case SLJIT_MOV:
case SLJIT_MOV_UI: case SLJIT_MOV_U32:
case SLJIT_MOV_SI: case SLJIT_MOV_S32:
case SLJIT_MOV_P: case SLJIT_MOV_P:
case SLJIT_MOVU: case SLJIT_MOVU:
case SLJIT_MOVU_UI: case SLJIT_MOVU_U32:
case SLJIT_MOVU_SI: case SLJIT_MOVU_S32:
case SLJIT_MOVU_P: case SLJIT_MOVU_P:
SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1); SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1);
if (dst == arg2) if (dst == arg2)
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
return push_inst16(compiler, MOV | SET_REGS44(dst, arg2)); return push_inst16(compiler, MOV | SET_REGS44(dst, arg2));
case SLJIT_MOV_UB: case SLJIT_MOV_U8:
case SLJIT_MOVU_UB: case SLJIT_MOVU_U8:
SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1); SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1);
if (IS_2_LO_REGS(dst, arg2)) if (IS_2_LO_REGS(dst, arg2))
return push_inst16(compiler, UXTB | RD3(dst) | RN3(arg2)); return push_inst16(compiler, UXTB | RD3(dst) | RN3(arg2));
return push_inst32(compiler, UXTB_W | RD4(dst) | RM4(arg2)); return push_inst32(compiler, UXTB_W | RD4(dst) | RM4(arg2));
case SLJIT_MOV_SB: case SLJIT_MOV_S8:
case SLJIT_MOVU_SB: case SLJIT_MOVU_S8:
SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1); SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1);
if (IS_2_LO_REGS(dst, arg2)) if (IS_2_LO_REGS(dst, arg2))
return push_inst16(compiler, SXTB | RD3(dst) | RN3(arg2)); return push_inst16(compiler, SXTB | RD3(dst) | RN3(arg2));
return push_inst32(compiler, SXTB_W | RD4(dst) | RM4(arg2)); return push_inst32(compiler, SXTB_W | RD4(dst) | RM4(arg2));
case SLJIT_MOV_UH: case SLJIT_MOV_U16:
case SLJIT_MOVU_UH: case SLJIT_MOVU_U16:
SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1); SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1);
if (IS_2_LO_REGS(dst, arg2)) if (IS_2_LO_REGS(dst, arg2))
return push_inst16(compiler, UXTH | RD3(dst) | RN3(arg2)); return push_inst16(compiler, UXTH | RD3(dst) | RN3(arg2));
return push_inst32(compiler, UXTH_W | RD4(dst) | RM4(arg2)); return push_inst32(compiler, UXTH_W | RD4(dst) | RM4(arg2));
case SLJIT_MOV_SH: case SLJIT_MOV_S16:
case SLJIT_MOVU_SH: case SLJIT_MOVU_S16:
SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1); SLJIT_ASSERT(!(flags & SET_FLAGS) && arg1 == TMP_REG1);
if (IS_2_LO_REGS(dst, arg2)) if (IS_2_LO_REGS(dst, arg2))
return push_inst16(compiler, SXTH | RD3(dst) | RN3(arg2)); return push_inst16(compiler, SXTH | RD3(dst) | RN3(arg2));
@ -813,7 +813,7 @@ static sljit_si emit_op_imm(struct sljit_compiler *compiler, sljit_si flags, slj
s = store s = store
*/ */
static SLJIT_CONST sljit_ins sljit_mem16[12] = { static const sljit_ins sljit_mem16[12] = {
/* w u l */ 0x5800 /* ldr */, /* w u l */ 0x5800 /* ldr */,
/* w u s */ 0x5000 /* str */, /* w u s */ 0x5000 /* str */,
/* w s l */ 0x5800 /* ldr */, /* w s l */ 0x5800 /* ldr */,
@ -830,7 +830,7 @@ static SLJIT_CONST sljit_ins sljit_mem16[12] = {
/* h s s */ 0x5200 /* strh */, /* h s s */ 0x5200 /* strh */,
}; };
static SLJIT_CONST sljit_ins sljit_mem16_imm5[12] = { static const sljit_ins sljit_mem16_imm5[12] = {
/* w u l */ 0x6800 /* ldr imm5 */, /* w u l */ 0x6800 /* ldr imm5 */,
/* w u s */ 0x6000 /* str imm5 */, /* w u s */ 0x6000 /* str imm5 */,
/* w s l */ 0x6800 /* ldr imm5 */, /* w s l */ 0x6800 /* ldr imm5 */,
@ -849,7 +849,7 @@ static SLJIT_CONST sljit_ins sljit_mem16_imm5[12] = {
#define MEM_IMM8 0xc00 #define MEM_IMM8 0xc00
#define MEM_IMM12 0x800000 #define MEM_IMM12 0x800000
static SLJIT_CONST sljit_ins sljit_mem32[12] = { static const sljit_ins sljit_mem32[12] = {
/* w u l */ 0xf8500000 /* ldr.w */, /* w u l */ 0xf8500000 /* ldr.w */,
/* w u s */ 0xf8400000 /* str.w */, /* w u s */ 0xf8400000 /* str.w */,
/* w s l */ 0xf8500000 /* ldr.w */, /* w s l */ 0xf8500000 /* ldr.w */,
@ -867,7 +867,7 @@ static SLJIT_CONST sljit_ins sljit_mem32[12] = {
}; };
/* Helper function. Dst should be reg + value, using at most 1 instruction, flags does not set. */ /* Helper function. Dst should be reg + value, using at most 1 instruction, flags does not set. */
static sljit_si emit_set_delta(struct sljit_compiler *compiler, sljit_si dst, sljit_si reg, sljit_sw value) static sljit_s32 emit_set_delta(struct sljit_compiler *compiler, sljit_s32 dst, sljit_s32 reg, sljit_sw value)
{ {
if (value >= 0) { if (value >= 0) {
if (value <= 0xfff) if (value <= 0xfff)
@ -888,9 +888,9 @@ static sljit_si emit_set_delta(struct sljit_compiler *compiler, sljit_si dst, sl
} }
/* Can perform an operation using at most 1 instruction. */ /* Can perform an operation using at most 1 instruction. */
static sljit_si getput_arg_fast(struct sljit_compiler *compiler, sljit_si flags, sljit_si reg, sljit_si arg, sljit_sw argw) static sljit_s32 getput_arg_fast(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg, sljit_sw argw)
{ {
sljit_si other_r, shift; sljit_s32 other_r, shift;
SLJIT_ASSERT(arg & SLJIT_MEM); SLJIT_ASSERT(arg & SLJIT_MEM);
@ -975,7 +975,7 @@ static sljit_si getput_arg_fast(struct sljit_compiler *compiler, sljit_si flags,
/* see getput_arg below. /* see getput_arg below.
Note: can_cache is called only for binary operators. Those Note: can_cache is called only for binary operators. Those
operators always uses word arguments without write back. */ operators always uses word arguments without write back. */
static sljit_si can_cache(sljit_si arg, sljit_sw argw, sljit_si next_arg, sljit_sw next_argw) static sljit_s32 can_cache(sljit_s32 arg, sljit_sw argw, sljit_s32 next_arg, sljit_sw next_argw)
{ {
sljit_sw diff; sljit_sw diff;
if ((arg & OFFS_REG_MASK) || !(next_arg & SLJIT_MEM)) if ((arg & OFFS_REG_MASK) || !(next_arg & SLJIT_MEM))
@ -999,10 +999,10 @@ static sljit_si can_cache(sljit_si arg, sljit_sw argw, sljit_si next_arg, sljit_
} }
/* Emit the necessary instructions. See can_cache above. */ /* Emit the necessary instructions. See can_cache above. */
static sljit_si getput_arg(struct sljit_compiler *compiler, sljit_si flags, sljit_si reg, static sljit_s32 getput_arg(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg,
sljit_si arg, sljit_sw argw, sljit_si next_arg, sljit_sw next_argw) sljit_s32 arg, sljit_sw argw, sljit_s32 next_arg, sljit_sw next_argw)
{ {
sljit_si tmp_r, other_r; sljit_s32 tmp_r, other_r;
sljit_sw diff; sljit_sw diff;
SLJIT_ASSERT(arg & SLJIT_MEM); SLJIT_ASSERT(arg & SLJIT_MEM);
@ -1107,7 +1107,7 @@ static sljit_si getput_arg(struct sljit_compiler *compiler, sljit_si flags, slji
return push_inst32(compiler, sljit_mem32[flags] | MEM_IMM12 | RT4(reg) | RN4(TMP_REG3) | 0); return push_inst32(compiler, sljit_mem32[flags] | MEM_IMM12 | RT4(reg) | RN4(TMP_REG3) | 0);
} }
static SLJIT_INLINE sljit_si emit_op_mem(struct sljit_compiler *compiler, sljit_si flags, sljit_si reg, sljit_si arg, sljit_sw argw) static SLJIT_INLINE sljit_s32 emit_op_mem(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg, sljit_sw argw)
{ {
if (getput_arg_fast(compiler, flags, reg, arg, argw)) if (getput_arg_fast(compiler, flags, reg, arg, argw))
return compiler->error; return compiler->error;
@ -1116,7 +1116,7 @@ static SLJIT_INLINE sljit_si emit_op_mem(struct sljit_compiler *compiler, sljit_
return getput_arg(compiler, flags, reg, arg, argw, 0, 0); return getput_arg(compiler, flags, reg, arg, argw, 0, 0);
} }
static SLJIT_INLINE sljit_si emit_op_mem2(struct sljit_compiler *compiler, sljit_si flags, sljit_si reg, sljit_si arg1, sljit_sw arg1w, sljit_si arg2, sljit_sw arg2w) static SLJIT_INLINE sljit_s32 emit_op_mem2(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg1, sljit_sw arg1w, sljit_s32 arg2, sljit_sw arg2w)
{ {
if (getput_arg_fast(compiler, flags, reg, arg1, arg1w)) if (getput_arg_fast(compiler, flags, reg, arg1, arg1w))
return compiler->error; return compiler->error;
@ -1127,11 +1127,11 @@ static SLJIT_INLINE sljit_si emit_op_mem2(struct sljit_compiler *compiler, sljit
/* Entry, exit */ /* Entry, exit */
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compiler, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler,
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds, sljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 saveds,
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size) sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
{ {
sljit_si size, i, tmp; sljit_s32 size, i, tmp;
sljit_ins push; sljit_ins push;
CHECK_ERROR(); CHECK_ERROR();
@ -1172,11 +1172,11 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_set_context(struct sljit_compiler *compiler, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler,
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds, sljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 saveds,
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size) sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
{ {
sljit_si size; sljit_s32 size;
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size)); CHECK(check_sljit_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size));
@ -1187,9 +1187,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_set_context(struct sljit_compiler *compi
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compiler, sljit_si op, sljit_si src, sljit_sw srcw) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw)
{ {
sljit_si i, tmp; sljit_s32 i, tmp;
sljit_ins pop; sljit_ins pop;
CHECK_ERROR(); CHECK_ERROR();
@ -1237,7 +1237,7 @@ extern int __aeabi_idivmod(int numerator, int denominator);
} }
#endif #endif
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler, sljit_si op) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op)
{ {
sljit_sw saved_reg_list[3]; sljit_sw saved_reg_list[3];
sljit_sw saved_reg_count; sljit_sw saved_reg_count;
@ -1251,18 +1251,18 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler
return push_inst16(compiler, BKPT); return push_inst16(compiler, BKPT);
case SLJIT_NOP: case SLJIT_NOP:
return push_inst16(compiler, NOP); return push_inst16(compiler, NOP);
case SLJIT_LUMUL: case SLJIT_LMUL_UW:
case SLJIT_LSMUL: case SLJIT_LMUL_SW:
return push_inst32(compiler, (op == SLJIT_LUMUL ? UMULL : SMULL) return push_inst32(compiler, (op == SLJIT_LMUL_UW ? UMULL : SMULL)
| (reg_map[SLJIT_R1] << 8) | (reg_map[SLJIT_R1] << 8)
| (reg_map[SLJIT_R0] << 12) | (reg_map[SLJIT_R0] << 12)
| (reg_map[SLJIT_R0] << 16) | (reg_map[SLJIT_R0] << 16)
| reg_map[SLJIT_R1]); | reg_map[SLJIT_R1]);
case SLJIT_UDIVMOD: case SLJIT_DIVMOD_UW:
case SLJIT_SDIVMOD: case SLJIT_DIVMOD_SW:
case SLJIT_UDIVI: case SLJIT_DIV_UW:
case SLJIT_SDIVI: case SLJIT_DIV_SW:
SLJIT_COMPILE_ASSERT((SLJIT_UDIVMOD & 0x2) == 0 && SLJIT_UDIVI - 0x2 == SLJIT_UDIVMOD, bad_div_opcode_assignments); SLJIT_COMPILE_ASSERT((SLJIT_DIVMOD_UW & 0x2) == 0 && SLJIT_DIV_UW - 0x2 == SLJIT_DIVMOD_UW, bad_div_opcode_assignments);
SLJIT_COMPILE_ASSERT(reg_map[2] == 1 && reg_map[3] == 2 && reg_map[4] == 12, bad_register_mapping); SLJIT_COMPILE_ASSERT(reg_map[2] == 1 && reg_map[3] == 2 && reg_map[4] == 12, bad_register_mapping);
saved_reg_count = 0; saved_reg_count = 0;
@ -1270,7 +1270,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler
saved_reg_list[saved_reg_count++] = 12; saved_reg_list[saved_reg_count++] = 12;
if (compiler->scratches >= 3) if (compiler->scratches >= 3)
saved_reg_list[saved_reg_count++] = 2; saved_reg_list[saved_reg_count++] = 2;
if (op >= SLJIT_UDIVI) if (op >= SLJIT_DIV_UW)
saved_reg_list[saved_reg_count++] = 1; saved_reg_list[saved_reg_count++] = 1;
if (saved_reg_count > 0) { if (saved_reg_count > 0) {
@ -1288,7 +1288,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler
#if defined(__GNUC__) #if defined(__GNUC__)
FAIL_IF(sljit_emit_ijump(compiler, SLJIT_FAST_CALL, SLJIT_IMM, FAIL_IF(sljit_emit_ijump(compiler, SLJIT_FAST_CALL, SLJIT_IMM,
((op | 0x2) == SLJIT_UDIVI ? SLJIT_FUNC_OFFSET(__aeabi_uidivmod) : SLJIT_FUNC_OFFSET(__aeabi_idivmod)))); ((op | 0x2) == SLJIT_DIV_UW ? SLJIT_FUNC_OFFSET(__aeabi_uidivmod) : SLJIT_FUNC_OFFSET(__aeabi_idivmod))));
#else #else
#error "Software divmod functions are needed" #error "Software divmod functions are needed"
#endif #endif
@ -1311,12 +1311,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler, sljit_si op, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src, sljit_sw srcw) sljit_s32 src, sljit_sw srcw)
{ {
sljit_si dst_r, flags; sljit_s32 dst_r, flags;
sljit_si op_flags = GET_ALL_FLAGS(op); sljit_s32 op_flags = GET_ALL_FLAGS(op);
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw)); CHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw));
@ -1332,56 +1332,56 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler
if (op >= SLJIT_MOV && op <= SLJIT_MOVU_P) { if (op >= SLJIT_MOV && op <= SLJIT_MOVU_P) {
switch (op) { switch (op) {
case SLJIT_MOV: case SLJIT_MOV:
case SLJIT_MOV_UI: case SLJIT_MOV_U32:
case SLJIT_MOV_SI: case SLJIT_MOV_S32:
case SLJIT_MOV_P: case SLJIT_MOV_P:
flags = WORD_SIZE; flags = WORD_SIZE;
break; break;
case SLJIT_MOV_UB: case SLJIT_MOV_U8:
flags = BYTE_SIZE; flags = BYTE_SIZE;
if (src & SLJIT_IMM) if (src & SLJIT_IMM)
srcw = (sljit_ub)srcw; srcw = (sljit_u8)srcw;
break; break;
case SLJIT_MOV_SB: case SLJIT_MOV_S8:
flags = BYTE_SIZE | SIGNED; flags = BYTE_SIZE | SIGNED;
if (src & SLJIT_IMM) if (src & SLJIT_IMM)
srcw = (sljit_sb)srcw; srcw = (sljit_s8)srcw;
break; break;
case SLJIT_MOV_UH: case SLJIT_MOV_U16:
flags = HALF_SIZE; flags = HALF_SIZE;
if (src & SLJIT_IMM) if (src & SLJIT_IMM)
srcw = (sljit_uh)srcw; srcw = (sljit_u16)srcw;
break; break;
case SLJIT_MOV_SH: case SLJIT_MOV_S16:
flags = HALF_SIZE | SIGNED; flags = HALF_SIZE | SIGNED;
if (src & SLJIT_IMM) if (src & SLJIT_IMM)
srcw = (sljit_sh)srcw; srcw = (sljit_s16)srcw;
break; break;
case SLJIT_MOVU: case SLJIT_MOVU:
case SLJIT_MOVU_UI: case SLJIT_MOVU_U32:
case SLJIT_MOVU_SI: case SLJIT_MOVU_S32:
case SLJIT_MOVU_P: case SLJIT_MOVU_P:
flags = WORD_SIZE | UPDATE; flags = WORD_SIZE | UPDATE;
break; break;
case SLJIT_MOVU_UB: case SLJIT_MOVU_U8:
flags = BYTE_SIZE | UPDATE; flags = BYTE_SIZE | UPDATE;
if (src & SLJIT_IMM) if (src & SLJIT_IMM)
srcw = (sljit_ub)srcw; srcw = (sljit_u8)srcw;
break; break;
case SLJIT_MOVU_SB: case SLJIT_MOVU_S8:
flags = BYTE_SIZE | SIGNED | UPDATE; flags = BYTE_SIZE | SIGNED | UPDATE;
if (src & SLJIT_IMM) if (src & SLJIT_IMM)
srcw = (sljit_sb)srcw; srcw = (sljit_s8)srcw;
break; break;
case SLJIT_MOVU_UH: case SLJIT_MOVU_U16:
flags = HALF_SIZE | UPDATE; flags = HALF_SIZE | UPDATE;
if (src & SLJIT_IMM) if (src & SLJIT_IMM)
srcw = (sljit_uh)srcw; srcw = (sljit_u16)srcw;
break; break;
case SLJIT_MOVU_SH: case SLJIT_MOVU_S16:
flags = HALF_SIZE | SIGNED | UPDATE; flags = HALF_SIZE | SIGNED | UPDATE;
if (src & SLJIT_IMM) if (src & SLJIT_IMM)
srcw = (sljit_sh)srcw; srcw = (sljit_s16)srcw;
break; break;
default: default:
SLJIT_ASSERT_STOP(); SLJIT_ASSERT_STOP();
@ -1444,12 +1444,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler, sljit_si op, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src1, sljit_sw src1w, sljit_s32 src1, sljit_sw src1w,
sljit_si src2, sljit_sw src2w) sljit_s32 src2, sljit_sw src2w)
{ {
sljit_si dst_r, flags; sljit_s32 dst_r, flags;
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_op2(compiler, op, dst, dstw, src1, src1w, src2, src2w)); CHECK(check_sljit_emit_op2(compiler, op, dst, dstw, src1, src1w, src2, src2w));
@ -1523,26 +1523,26 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_register_index(sljit_si reg) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg)
{ {
CHECK_REG_INDEX(check_sljit_get_register_index(reg)); CHECK_REG_INDEX(check_sljit_get_register_index(reg));
return reg_map[reg]; return reg_map[reg];
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_float_register_index(sljit_si reg) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg)
{ {
CHECK_REG_INDEX(check_sljit_get_float_register_index(reg)); CHECK_REG_INDEX(check_sljit_get_float_register_index(reg));
return reg << 1; return reg << 1;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_custom(struct sljit_compiler *compiler, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler,
void *instruction, sljit_si size) void *instruction, sljit_s32 size)
{ {
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_op_custom(compiler, instruction, size)); CHECK(check_sljit_emit_op_custom(compiler, instruction, size));
if (size == 2) if (size == 2)
return push_inst16(compiler, *(sljit_uh*)instruction); return push_inst16(compiler, *(sljit_u16*)instruction);
return push_inst32(compiler, *(sljit_ins*)instruction); return push_inst32(compiler, *(sljit_ins*)instruction);
} }
@ -1550,7 +1550,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_custom(struct sljit_compiler *co
/* Floating point operators */ /* Floating point operators */
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_is_fpu_available(void) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_is_fpu_available(void)
{ {
#ifdef SLJIT_IS_FPU_AVAILABLE #ifdef SLJIT_IS_FPU_AVAILABLE
return SLJIT_IS_FPU_AVAILABLE; return SLJIT_IS_FPU_AVAILABLE;
@ -1562,11 +1562,11 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_is_fpu_available(void)
#define FPU_LOAD (1 << 20) #define FPU_LOAD (1 << 20)
static sljit_si emit_fop_mem(struct sljit_compiler *compiler, sljit_si flags, sljit_si reg, sljit_si arg, sljit_sw argw) static sljit_s32 emit_fop_mem(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg, sljit_sw argw)
{ {
sljit_sw tmp; sljit_sw tmp;
sljit_uw imm; sljit_uw imm;
sljit_sw inst = VSTR_F32 | (flags & (SLJIT_SINGLE_OP | FPU_LOAD)); sljit_sw inst = VSTR_F32 | (flags & (SLJIT_F32_OP | FPU_LOAD));
SLJIT_ASSERT(arg & SLJIT_MEM); SLJIT_ASSERT(arg & SLJIT_MEM);
@ -1626,16 +1626,16 @@ static sljit_si emit_fop_mem(struct sljit_compiler *compiler, sljit_si flags, sl
return push_inst32(compiler, inst | 0x800000 | RN4(TMP_REG3) | DD4(reg)); return push_inst32(compiler, inst | 0x800000 | RN4(TMP_REG3) | DD4(reg));
} }
static SLJIT_INLINE sljit_si sljit_emit_fop1_convw_fromd(struct sljit_compiler *compiler, sljit_si op, static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src, sljit_sw srcw) sljit_s32 src, sljit_sw srcw)
{ {
if (src & SLJIT_MEM) { if (src & SLJIT_MEM) {
FAIL_IF(emit_fop_mem(compiler, (op & SLJIT_SINGLE_OP) | FPU_LOAD, TMP_FREG1, src, srcw)); FAIL_IF(emit_fop_mem(compiler, (op & SLJIT_F32_OP) | FPU_LOAD, TMP_FREG1, src, srcw));
src = TMP_FREG1; src = TMP_FREG1;
} }
FAIL_IF(push_inst32(compiler, VCVT_S32_F32 | (op & SLJIT_SINGLE_OP) | DD4(TMP_FREG1) | DM4(src))); FAIL_IF(push_inst32(compiler, VCVT_S32_F32 | (op & SLJIT_F32_OP) | DD4(TMP_FREG1) | DM4(src)));
if (dst == SLJIT_UNUSED) if (dst == SLJIT_UNUSED)
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
@ -1647,11 +1647,11 @@ static SLJIT_INLINE sljit_si sljit_emit_fop1_convw_fromd(struct sljit_compiler *
return emit_fop_mem(compiler, 0, TMP_FREG1, dst, dstw); return emit_fop_mem(compiler, 0, TMP_FREG1, dst, dstw);
} }
static SLJIT_INLINE sljit_si sljit_emit_fop1_convd_fromw(struct sljit_compiler *compiler, sljit_si op, static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src, sljit_sw srcw) sljit_s32 src, sljit_sw srcw)
{ {
sljit_si dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;
if (FAST_IS_REG(src)) if (FAST_IS_REG(src))
FAIL_IF(push_inst32(compiler, VMOV | RT4(src) | DN4(TMP_FREG1))); FAIL_IF(push_inst32(compiler, VMOV | RT4(src) | DN4(TMP_FREG1)));
@ -1664,85 +1664,85 @@ static SLJIT_INLINE sljit_si sljit_emit_fop1_convd_fromw(struct sljit_compiler *
FAIL_IF(push_inst32(compiler, VMOV | RT4(TMP_REG1) | DN4(TMP_FREG1))); FAIL_IF(push_inst32(compiler, VMOV | RT4(TMP_REG1) | DN4(TMP_FREG1)));
} }
FAIL_IF(push_inst32(compiler, VCVT_F32_S32 | (op & SLJIT_SINGLE_OP) | DD4(dst_r) | DM4(TMP_FREG1))); FAIL_IF(push_inst32(compiler, VCVT_F32_S32 | (op & SLJIT_F32_OP) | DD4(dst_r) | DM4(TMP_FREG1)));
if (dst & SLJIT_MEM) if (dst & SLJIT_MEM)
return emit_fop_mem(compiler, (op & SLJIT_SINGLE_OP), TMP_FREG1, dst, dstw); return emit_fop_mem(compiler, (op & SLJIT_F32_OP), TMP_FREG1, dst, dstw);
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
static SLJIT_INLINE sljit_si sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_si op, static SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si src1, sljit_sw src1w, sljit_s32 src1, sljit_sw src1w,
sljit_si src2, sljit_sw src2w) sljit_s32 src2, sljit_sw src2w)
{ {
if (src1 & SLJIT_MEM) { if (src1 & SLJIT_MEM) {
emit_fop_mem(compiler, (op & SLJIT_SINGLE_OP) | FPU_LOAD, TMP_FREG1, src1, src1w); emit_fop_mem(compiler, (op & SLJIT_F32_OP) | FPU_LOAD, TMP_FREG1, src1, src1w);
src1 = TMP_FREG1; src1 = TMP_FREG1;
} }
if (src2 & SLJIT_MEM) { if (src2 & SLJIT_MEM) {
emit_fop_mem(compiler, (op & SLJIT_SINGLE_OP) | FPU_LOAD, TMP_FREG2, src2, src2w); emit_fop_mem(compiler, (op & SLJIT_F32_OP) | FPU_LOAD, TMP_FREG2, src2, src2w);
src2 = TMP_FREG2; src2 = TMP_FREG2;
} }
FAIL_IF(push_inst32(compiler, VCMP_F32 | (op & SLJIT_SINGLE_OP) | DD4(src1) | DM4(src2))); FAIL_IF(push_inst32(compiler, VCMP_F32 | (op & SLJIT_F32_OP) | DD4(src1) | DM4(src2)));
return push_inst32(compiler, VMRS); return push_inst32(compiler, VMRS);
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop1(struct sljit_compiler *compiler, sljit_si op, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src, sljit_sw srcw) sljit_s32 src, sljit_sw srcw)
{ {
sljit_si dst_r; sljit_s32 dst_r;
CHECK_ERROR(); CHECK_ERROR();
compiler->cache_arg = 0; compiler->cache_arg = 0;
compiler->cache_argw = 0; compiler->cache_argw = 0;
if (GET_OPCODE(op) != SLJIT_CONVD_FROMS) if (GET_OPCODE(op) != SLJIT_CONV_F64_FROM_F32)
op ^= SLJIT_SINGLE_OP; op ^= SLJIT_F32_OP;
SLJIT_COMPILE_ASSERT((SLJIT_SINGLE_OP == 0x100), float_transfer_bit_error); SLJIT_COMPILE_ASSERT((SLJIT_F32_OP == 0x100), float_transfer_bit_error);
SELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw); SELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw);
dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;
if (src & SLJIT_MEM) { if (src & SLJIT_MEM) {
emit_fop_mem(compiler, (op & SLJIT_SINGLE_OP) | FPU_LOAD, dst_r, src, srcw); emit_fop_mem(compiler, (op & SLJIT_F32_OP) | FPU_LOAD, dst_r, src, srcw);
src = dst_r; src = dst_r;
} }
switch (GET_OPCODE(op)) { switch (GET_OPCODE(op)) {
case SLJIT_DMOV: case SLJIT_MOV_F64:
if (src != dst_r) { if (src != dst_r) {
if (dst_r != TMP_FREG1) if (dst_r != TMP_FREG1)
FAIL_IF(push_inst32(compiler, VMOV_F32 | (op & SLJIT_SINGLE_OP) | DD4(dst_r) | DM4(src))); FAIL_IF(push_inst32(compiler, VMOV_F32 | (op & SLJIT_F32_OP) | DD4(dst_r) | DM4(src)));
else else
dst_r = src; dst_r = src;
} }
break; break;
case SLJIT_DNEG: case SLJIT_NEG_F64:
FAIL_IF(push_inst32(compiler, VNEG_F32 | (op & SLJIT_SINGLE_OP) | DD4(dst_r) | DM4(src))); FAIL_IF(push_inst32(compiler, VNEG_F32 | (op & SLJIT_F32_OP) | DD4(dst_r) | DM4(src)));
break; break;
case SLJIT_DABS: case SLJIT_ABS_F64:
FAIL_IF(push_inst32(compiler, VABS_F32 | (op & SLJIT_SINGLE_OP) | DD4(dst_r) | DM4(src))); FAIL_IF(push_inst32(compiler, VABS_F32 | (op & SLJIT_F32_OP) | DD4(dst_r) | DM4(src)));
break; break;
case SLJIT_CONVD_FROMS: case SLJIT_CONV_F64_FROM_F32:
FAIL_IF(push_inst32(compiler, VCVT_F64_F32 | (op & SLJIT_SINGLE_OP) | DD4(dst_r) | DM4(src))); FAIL_IF(push_inst32(compiler, VCVT_F64_F32 | (op & SLJIT_F32_OP) | DD4(dst_r) | DM4(src)));
op ^= SLJIT_SINGLE_OP; op ^= SLJIT_F32_OP;
break; break;
} }
if (dst & SLJIT_MEM) if (dst & SLJIT_MEM)
return emit_fop_mem(compiler, (op & SLJIT_SINGLE_OP), dst_r, dst, dstw); return emit_fop_mem(compiler, (op & SLJIT_F32_OP), dst_r, dst, dstw);
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compiler, sljit_si op, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src1, sljit_sw src1w, sljit_s32 src1, sljit_sw src1w,
sljit_si src2, sljit_sw src2w) sljit_s32 src2, sljit_sw src2w)
{ {
sljit_si dst_r; sljit_s32 dst_r;
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_fop2(compiler, op, dst, dstw, src1, src1w, src2, src2w)); CHECK(check_sljit_emit_fop2(compiler, op, dst, dstw, src1, src1w, src2, src2w));
@ -1752,36 +1752,36 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compile
compiler->cache_arg = 0; compiler->cache_arg = 0;
compiler->cache_argw = 0; compiler->cache_argw = 0;
op ^= SLJIT_SINGLE_OP; op ^= SLJIT_F32_OP;
dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;
if (src1 & SLJIT_MEM) { if (src1 & SLJIT_MEM) {
emit_fop_mem(compiler, (op & SLJIT_SINGLE_OP) | FPU_LOAD, TMP_FREG1, src1, src1w); emit_fop_mem(compiler, (op & SLJIT_F32_OP) | FPU_LOAD, TMP_FREG1, src1, src1w);
src1 = TMP_FREG1; src1 = TMP_FREG1;
} }
if (src2 & SLJIT_MEM) { if (src2 & SLJIT_MEM) {
emit_fop_mem(compiler, (op & SLJIT_SINGLE_OP) | FPU_LOAD, TMP_FREG2, src2, src2w); emit_fop_mem(compiler, (op & SLJIT_F32_OP) | FPU_LOAD, TMP_FREG2, src2, src2w);
src2 = TMP_FREG2; src2 = TMP_FREG2;
} }
switch (GET_OPCODE(op)) { switch (GET_OPCODE(op)) {
case SLJIT_DADD: case SLJIT_ADD_F64:
FAIL_IF(push_inst32(compiler, VADD_F32 | (op & SLJIT_SINGLE_OP) | DD4(dst_r) | DN4(src1) | DM4(src2))); FAIL_IF(push_inst32(compiler, VADD_F32 | (op & SLJIT_F32_OP) | DD4(dst_r) | DN4(src1) | DM4(src2)));
break; break;
case SLJIT_DSUB: case SLJIT_SUB_F64:
FAIL_IF(push_inst32(compiler, VSUB_F32 | (op & SLJIT_SINGLE_OP) | DD4(dst_r) | DN4(src1) | DM4(src2))); FAIL_IF(push_inst32(compiler, VSUB_F32 | (op & SLJIT_F32_OP) | DD4(dst_r) | DN4(src1) | DM4(src2)));
break; break;
case SLJIT_DMUL: case SLJIT_MUL_F64:
FAIL_IF(push_inst32(compiler, VMUL_F32 | (op & SLJIT_SINGLE_OP) | DD4(dst_r) | DN4(src1) | DM4(src2))); FAIL_IF(push_inst32(compiler, VMUL_F32 | (op & SLJIT_F32_OP) | DD4(dst_r) | DN4(src1) | DM4(src2)));
break; break;
case SLJIT_DDIV: case SLJIT_DIV_F64:
FAIL_IF(push_inst32(compiler, VDIV_F32 | (op & SLJIT_SINGLE_OP) | DD4(dst_r) | DN4(src1) | DM4(src2))); FAIL_IF(push_inst32(compiler, VDIV_F32 | (op & SLJIT_F32_OP) | DD4(dst_r) | DN4(src1) | DM4(src2)));
break; break;
} }
if (!(dst & SLJIT_MEM)) if (!(dst & SLJIT_MEM))
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
return emit_fop_mem(compiler, (op & SLJIT_SINGLE_OP), TMP_FREG1, dst, dstw); return emit_fop_mem(compiler, (op & SLJIT_F32_OP), TMP_FREG1, dst, dstw);
} }
#undef FPU_LOAD #undef FPU_LOAD
@ -1790,7 +1790,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compile
/* Other instructions */ /* Other instructions */
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_si dst, sljit_sw dstw) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)
{ {
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw)); CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw));
@ -1813,7 +1813,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_enter(struct sljit_compiler *c
return getput_arg(compiler, WORD_SIZE | STORE, TMP_REG2, dst, dstw, 0, 0); return getput_arg(compiler, WORD_SIZE | STORE, TMP_REG2, dst, dstw, 0, 0);
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_si src, sljit_sw srcw) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw)
{ {
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_fast_return(compiler, src, srcw)); CHECK(check_sljit_emit_fast_return(compiler, src, srcw));
@ -1840,33 +1840,33 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_return(struct sljit_compiler *
/* Conditional instructions */ /* Conditional instructions */
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
static sljit_uw get_cc(sljit_si type) static sljit_uw get_cc(sljit_s32 type)
{ {
switch (type) { switch (type) {
case SLJIT_EQUAL: case SLJIT_EQUAL:
case SLJIT_MUL_NOT_OVERFLOW: case SLJIT_MUL_NOT_OVERFLOW:
case SLJIT_D_EQUAL: case SLJIT_EQUAL_F64:
return 0x0; return 0x0;
case SLJIT_NOT_EQUAL: case SLJIT_NOT_EQUAL:
case SLJIT_MUL_OVERFLOW: case SLJIT_MUL_OVERFLOW:
case SLJIT_D_NOT_EQUAL: case SLJIT_NOT_EQUAL_F64:
return 0x1; return 0x1;
case SLJIT_LESS: case SLJIT_LESS:
case SLJIT_D_LESS: case SLJIT_LESS_F64:
return 0x3; return 0x3;
case SLJIT_GREATER_EQUAL: case SLJIT_GREATER_EQUAL:
case SLJIT_D_GREATER_EQUAL: case SLJIT_GREATER_EQUAL_F64:
return 0x2; return 0x2;
case SLJIT_GREATER: case SLJIT_GREATER:
case SLJIT_D_GREATER: case SLJIT_GREATER_F64:
return 0x8; return 0x8;
case SLJIT_LESS_EQUAL: case SLJIT_LESS_EQUAL:
case SLJIT_D_LESS_EQUAL: case SLJIT_LESS_EQUAL_F64:
return 0x9; return 0x9;
case SLJIT_SIG_LESS: case SLJIT_SIG_LESS:
@ -1882,11 +1882,11 @@ static sljit_uw get_cc(sljit_si type)
return 0xd; return 0xd;
case SLJIT_OVERFLOW: case SLJIT_OVERFLOW:
case SLJIT_D_UNORDERED: case SLJIT_UNORDERED_F64:
return 0x6; return 0x6;
case SLJIT_NOT_OVERFLOW: case SLJIT_NOT_OVERFLOW:
case SLJIT_D_ORDERED: case SLJIT_ORDERED_F64:
return 0x7; return 0x7;
default: /* SLJIT_JUMP */ default: /* SLJIT_JUMP */
@ -1911,7 +1911,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compi
return label; return label;
} }
SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_si type) SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type)
{ {
struct sljit_jump *jump; struct sljit_jump *jump;
sljit_ins cc; sljit_ins cc;
@ -1944,7 +1944,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile
return jump; return jump;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_ijump(struct sljit_compiler *compiler, sljit_si type, sljit_si src, sljit_sw srcw) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src, sljit_sw srcw)
{ {
struct sljit_jump *jump; struct sljit_jump *jump;
@ -1972,12 +1972,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_ijump(struct sljit_compiler *compil
return push_inst16(compiler, (type <= SLJIT_JUMP ? BX : BLX) | RN3(TMP_REG1)); return push_inst16(compiler, (type <= SLJIT_JUMP ? BX : BLX) | RN3(TMP_REG1));
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_si op, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src, sljit_sw srcw, sljit_s32 src, sljit_sw srcw,
sljit_si type) sljit_s32 type)
{ {
sljit_si dst_r, flags = GET_ALL_FLAGS(op); sljit_s32 dst_r, flags = GET_ALL_FLAGS(op);
sljit_ins cc, ins; sljit_ins cc, ins;
CHECK_ERROR(); CHECK_ERROR();
@ -2054,10 +2054,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *com
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_si dst, sljit_sw dstw, sljit_sw init_value) SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value)
{ {
struct sljit_const *const_; struct sljit_const *const_;
sljit_si dst_r; sljit_s32 dst_r;
CHECK_ERROR_PTR(); CHECK_ERROR_PTR();
CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value)); CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value));
@ -2077,14 +2077,14 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi
SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_addr) SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_addr)
{ {
sljit_uh *inst = (sljit_uh*)addr; sljit_u16 *inst = (sljit_u16*)addr;
modify_imm32_const(inst, new_addr); modify_imm32_const(inst, new_addr);
SLJIT_CACHE_FLUSH(inst, inst + 4); SLJIT_CACHE_FLUSH(inst, inst + 4);
} }
SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant) SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant)
{ {
sljit_uh *inst = (sljit_uh*)addr; sljit_u16 *inst = (sljit_u16*)addr;
modify_imm32_const(inst, new_constant); modify_imm32_const(inst, new_constant);
SLJIT_CACHE_FLUSH(inst, inst + 4); SLJIT_CACHE_FLUSH(inst, inst + 4);
} }

View File

@ -26,7 +26,7 @@
/* mips 32-bit arch dependent functions. */ /* mips 32-bit arch dependent functions. */
static sljit_si load_immediate(struct sljit_compiler *compiler, sljit_si dst_ar, sljit_sw imm) static sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 dst_ar, sljit_sw imm)
{ {
if (!(imm & ~0xffff)) if (!(imm & ~0xffff))
return push_inst(compiler, ORI | SA(0) | TA(dst_ar) | IMM(imm), dst_ar); return push_inst(compiler, ORI | SA(0) | TA(dst_ar) | IMM(imm), dst_ar);
@ -66,24 +66,24 @@ static sljit_si load_immediate(struct sljit_compiler *compiler, sljit_si dst_ar,
FAIL_IF(push_inst(compiler, op_v | S(src2) | T(src1) | D(dst), DR(dst))); \ FAIL_IF(push_inst(compiler, op_v | S(src2) | T(src1) | D(dst), DR(dst))); \
} }
static SLJIT_INLINE sljit_si emit_single_op(struct sljit_compiler *compiler, sljit_si op, sljit_si flags, static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 flags,
sljit_si dst, sljit_si src1, sljit_sw src2) sljit_s32 dst, sljit_s32 src1, sljit_sw src2)
{ {
switch (GET_OPCODE(op)) { switch (GET_OPCODE(op)) {
case SLJIT_MOV: case SLJIT_MOV:
case SLJIT_MOV_UI: case SLJIT_MOV_U32:
case SLJIT_MOV_SI: case SLJIT_MOV_S32:
case SLJIT_MOV_P: case SLJIT_MOV_P:
SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));
if (dst != src2) if (dst != src2)
return push_inst(compiler, ADDU | S(src2) | TA(0) | D(dst), DR(dst)); return push_inst(compiler, ADDU | S(src2) | TA(0) | D(dst), DR(dst));
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
case SLJIT_MOV_UB: case SLJIT_MOV_U8:
case SLJIT_MOV_SB: case SLJIT_MOV_S8:
SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));
if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) { if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {
if (op == SLJIT_MOV_SB) { if (op == SLJIT_MOV_S8) {
#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1) #if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1)
return push_inst(compiler, SEB | T(src2) | D(dst), DR(dst)); return push_inst(compiler, SEB | T(src2) | D(dst), DR(dst));
#else #else
@ -97,11 +97,11 @@ static SLJIT_INLINE sljit_si emit_single_op(struct sljit_compiler *compiler, slj
SLJIT_ASSERT_STOP(); SLJIT_ASSERT_STOP();
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
case SLJIT_MOV_UH: case SLJIT_MOV_U16:
case SLJIT_MOV_SH: case SLJIT_MOV_S16:
SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));
if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) { if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {
if (op == SLJIT_MOV_SH) { if (op == SLJIT_MOV_S16) {
#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1) #if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1)
return push_inst(compiler, SEH | T(src2) | D(dst), DR(dst)); return push_inst(compiler, SEH | T(src2) | D(dst), DR(dst));
#else #else
@ -341,7 +341,7 @@ static SLJIT_INLINE sljit_si emit_single_op(struct sljit_compiler *compiler, slj
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
static SLJIT_INLINE sljit_si emit_const(struct sljit_compiler *compiler, sljit_si dst, sljit_sw init_value) static SLJIT_INLINE sljit_s32 emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw init_value)
{ {
FAIL_IF(push_inst(compiler, LUI | T(dst) | IMM(init_value >> 16), DR(dst))); FAIL_IF(push_inst(compiler, LUI | T(dst) | IMM(init_value >> 16), DR(dst)));
return push_inst(compiler, ORI | S(dst) | T(dst) | IMM(init_value), DR(dst)); return push_inst(compiler, ORI | S(dst) | T(dst) | IMM(init_value), DR(dst));

View File

@ -26,11 +26,11 @@
/* mips 64-bit arch dependent functions. */ /* mips 64-bit arch dependent functions. */
static sljit_si load_immediate(struct sljit_compiler *compiler, sljit_si dst_ar, sljit_sw imm) static sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 dst_ar, sljit_sw imm)
{ {
sljit_si shift = 32; sljit_s32 shift = 32;
sljit_si shift2; sljit_s32 shift2;
sljit_si inv = 0; sljit_s32 inv = 0;
sljit_ins ins; sljit_ins ins;
sljit_uw uimm; sljit_uw uimm;
@ -119,7 +119,7 @@ static sljit_si load_immediate(struct sljit_compiler *compiler, sljit_si dst_ar,
} }
#define SELECT_OP(a, b) \ #define SELECT_OP(a, b) \
(!(op & SLJIT_INT_OP) ? a : b) (!(op & SLJIT_I32_OP) ? a : b)
#define EMIT_LOGICAL(op_imm, op_norm) \ #define EMIT_LOGICAL(op_imm, op_norm) \
if (flags & SRC2_IMM) { \ if (flags & SRC2_IMM) { \
@ -138,27 +138,27 @@ static sljit_si load_immediate(struct sljit_compiler *compiler, sljit_si dst_ar,
#define EMIT_SHIFT(op_dimm, op_dimm32, op_imm, op_dv, op_v) \ #define EMIT_SHIFT(op_dimm, op_dimm32, op_imm, op_dv, op_v) \
if (flags & SRC2_IMM) { \ if (flags & SRC2_IMM) { \
if (src2 >= 32) { \ if (src2 >= 32) { \
SLJIT_ASSERT(!(op & SLJIT_INT_OP)); \ SLJIT_ASSERT(!(op & SLJIT_I32_OP)); \
ins = op_dimm32; \ ins = op_dimm32; \
src2 -= 32; \ src2 -= 32; \
} \ } \
else \ else \
ins = (op & SLJIT_INT_OP) ? op_imm : op_dimm; \ ins = (op & SLJIT_I32_OP) ? op_imm : op_dimm; \
if (op & SLJIT_SET_E) \ if (op & SLJIT_SET_E) \
FAIL_IF(push_inst(compiler, ins | T(src1) | DA(EQUAL_FLAG) | SH_IMM(src2), EQUAL_FLAG)); \ FAIL_IF(push_inst(compiler, ins | T(src1) | DA(EQUAL_FLAG) | SH_IMM(src2), EQUAL_FLAG)); \
if (CHECK_FLAGS(SLJIT_SET_E)) \ if (CHECK_FLAGS(SLJIT_SET_E)) \
FAIL_IF(push_inst(compiler, ins | T(src1) | D(dst) | SH_IMM(src2), DR(dst))); \ FAIL_IF(push_inst(compiler, ins | T(src1) | D(dst) | SH_IMM(src2), DR(dst))); \
} \ } \
else { \ else { \
ins = (op & SLJIT_INT_OP) ? op_v : op_dv; \ ins = (op & SLJIT_I32_OP) ? op_v : op_dv; \
if (op & SLJIT_SET_E) \ if (op & SLJIT_SET_E) \
FAIL_IF(push_inst(compiler, ins | S(src2) | T(src1) | DA(EQUAL_FLAG), EQUAL_FLAG)); \ FAIL_IF(push_inst(compiler, ins | S(src2) | T(src1) | DA(EQUAL_FLAG), EQUAL_FLAG)); \
if (CHECK_FLAGS(SLJIT_SET_E)) \ if (CHECK_FLAGS(SLJIT_SET_E)) \
FAIL_IF(push_inst(compiler, ins | S(src2) | T(src1) | D(dst), DR(dst))); \ FAIL_IF(push_inst(compiler, ins | S(src2) | T(src1) | D(dst), DR(dst))); \
} }
static SLJIT_INLINE sljit_si emit_single_op(struct sljit_compiler *compiler, sljit_si op, sljit_si flags, static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 flags,
sljit_si dst, sljit_si src1, sljit_sw src2) sljit_s32 dst, sljit_s32 src1, sljit_sw src2)
{ {
sljit_ins ins; sljit_ins ins;
@ -170,11 +170,11 @@ static SLJIT_INLINE sljit_si emit_single_op(struct sljit_compiler *compiler, slj
return push_inst(compiler, SELECT_OP(DADDU, ADDU) | S(src2) | TA(0) | D(dst), DR(dst)); return push_inst(compiler, SELECT_OP(DADDU, ADDU) | S(src2) | TA(0) | D(dst), DR(dst));
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
case SLJIT_MOV_UB: case SLJIT_MOV_U8:
case SLJIT_MOV_SB: case SLJIT_MOV_S8:
SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));
if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) { if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {
if (op == SLJIT_MOV_SB) { if (op == SLJIT_MOV_S8) {
FAIL_IF(push_inst(compiler, DSLL32 | T(src2) | D(dst) | SH_IMM(24), DR(dst))); FAIL_IF(push_inst(compiler, DSLL32 | T(src2) | D(dst) | SH_IMM(24), DR(dst)));
return push_inst(compiler, DSRA32 | T(dst) | D(dst) | SH_IMM(24), DR(dst)); return push_inst(compiler, DSRA32 | T(dst) | D(dst) | SH_IMM(24), DR(dst));
} }
@ -184,11 +184,11 @@ static SLJIT_INLINE sljit_si emit_single_op(struct sljit_compiler *compiler, slj
SLJIT_ASSERT_STOP(); SLJIT_ASSERT_STOP();
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
case SLJIT_MOV_UH: case SLJIT_MOV_U16:
case SLJIT_MOV_SH: case SLJIT_MOV_S16:
SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));
if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) { if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {
if (op == SLJIT_MOV_SH) { if (op == SLJIT_MOV_S16) {
FAIL_IF(push_inst(compiler, DSLL32 | T(src2) | D(dst) | SH_IMM(16), DR(dst))); FAIL_IF(push_inst(compiler, DSLL32 | T(src2) | D(dst) | SH_IMM(16), DR(dst)));
return push_inst(compiler, DSRA32 | T(dst) | D(dst) | SH_IMM(16), DR(dst)); return push_inst(compiler, DSRA32 | T(dst) | D(dst) | SH_IMM(16), DR(dst));
} }
@ -198,12 +198,12 @@ static SLJIT_INLINE sljit_si emit_single_op(struct sljit_compiler *compiler, slj
SLJIT_ASSERT_STOP(); SLJIT_ASSERT_STOP();
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
case SLJIT_MOV_UI: case SLJIT_MOV_U32:
SLJIT_ASSERT(!(op & SLJIT_INT_OP)); SLJIT_ASSERT(!(op & SLJIT_I32_OP));
FAIL_IF(push_inst(compiler, DSLL32 | T(src2) | D(dst) | SH_IMM(0), DR(dst))); FAIL_IF(push_inst(compiler, DSLL32 | T(src2) | D(dst) | SH_IMM(0), DR(dst)));
return push_inst(compiler, DSRL32 | T(dst) | D(dst) | SH_IMM(0), DR(dst)); return push_inst(compiler, DSRL32 | T(dst) | D(dst) | SH_IMM(0), DR(dst));
case SLJIT_MOV_SI: case SLJIT_MOV_S32:
SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));
return push_inst(compiler, SLL | T(src2) | D(dst) | SH_IMM(0), DR(dst)); return push_inst(compiler, SLL | T(src2) | D(dst) | SH_IMM(0), DR(dst));
@ -231,7 +231,7 @@ static SLJIT_INLINE sljit_si emit_single_op(struct sljit_compiler *compiler, slj
FAIL_IF(push_inst(compiler, SELECT_OP(DADDU, ADDU) | S(src2) | TA(0) | D(TMP_REG1), DR(TMP_REG1))); FAIL_IF(push_inst(compiler, SELECT_OP(DADDU, ADDU) | S(src2) | TA(0) | D(TMP_REG1), DR(TMP_REG1)));
/* Check zero. */ /* Check zero. */
FAIL_IF(push_inst(compiler, BEQ | S(TMP_REG1) | TA(0) | IMM(5), UNMOVABLE_INS)); FAIL_IF(push_inst(compiler, BEQ | S(TMP_REG1) | TA(0) | IMM(5), UNMOVABLE_INS));
FAIL_IF(push_inst(compiler, ORI | SA(0) | T(dst) | IMM((op & SLJIT_INT_OP) ? 32 : 64), UNMOVABLE_INS)); FAIL_IF(push_inst(compiler, ORI | SA(0) | T(dst) | IMM((op & SLJIT_I32_OP) ? 32 : 64), UNMOVABLE_INS));
FAIL_IF(push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | SA(0) | T(dst) | IMM(-1), DR(dst))); FAIL_IF(push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | SA(0) | T(dst) | IMM(-1), DR(dst)));
/* Loop for searching the highest bit. */ /* Loop for searching the highest bit. */
FAIL_IF(push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | S(dst) | T(dst) | IMM(1), DR(dst))); FAIL_IF(push_inst(compiler, SELECT_OP(DADDIU, ADDIU) | S(dst) | T(dst) | IMM(1), DR(dst)));
@ -392,7 +392,7 @@ static SLJIT_INLINE sljit_si emit_single_op(struct sljit_compiler *compiler, slj
SLJIT_ASSERT(!(flags & SRC2_IMM)); SLJIT_ASSERT(!(flags & SRC2_IMM));
if (!(op & SLJIT_SET_O)) { if (!(op & SLJIT_SET_O)) {
#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1) #if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1)
if (op & SLJIT_INT_OP) if (op & SLJIT_I32_OP)
return push_inst(compiler, MUL | S(src1) | T(src2) | D(dst), DR(dst)); return push_inst(compiler, MUL | S(src1) | T(src2) | D(dst), DR(dst));
FAIL_IF(push_inst(compiler, DMULT | S(src1) | T(src2), MOVABLE_INS)); FAIL_IF(push_inst(compiler, DMULT | S(src1) | T(src2), MOVABLE_INS));
return push_inst(compiler, MFLO | D(dst), DR(dst)); return push_inst(compiler, MFLO | D(dst), DR(dst));
@ -436,7 +436,7 @@ static SLJIT_INLINE sljit_si emit_single_op(struct sljit_compiler *compiler, slj
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
static SLJIT_INLINE sljit_si emit_const(struct sljit_compiler *compiler, sljit_si dst, sljit_sw init_value) static SLJIT_INLINE sljit_s32 emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw init_value)
{ {
FAIL_IF(push_inst(compiler, LUI | T(dst) | IMM(init_value >> 48), DR(dst))); FAIL_IF(push_inst(compiler, LUI | T(dst) | IMM(init_value >> 48), DR(dst)));
FAIL_IF(push_inst(compiler, ORI | S(dst) | T(dst) | IMM(init_value >> 32), DR(dst))); FAIL_IF(push_inst(compiler, ORI | S(dst) | T(dst) | IMM(init_value >> 32), DR(dst)));

View File

@ -27,7 +27,7 @@
/* Latest MIPS architecture. */ /* Latest MIPS architecture. */
/* Automatically detect SLJIT_MIPS_R1 */ /* Automatically detect SLJIT_MIPS_R1 */
SLJIT_API_FUNC_ATTRIBUTE SLJIT_CONST char* sljit_get_platform_name(void) SLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void)
{ {
#if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1) #if (defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1)
#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
@ -42,7 +42,7 @@ SLJIT_API_FUNC_ATTRIBUTE SLJIT_CONST char* sljit_get_platform_name(void)
/* Length of an instruction word /* Length of an instruction word
Both for mips-32 and mips-64 */ Both for mips-32 and mips-64 */
typedef sljit_ui sljit_ins; typedef sljit_u32 sljit_ins;
#define TMP_REG1 (SLJIT_NUMBER_OF_REGISTERS + 2) #define TMP_REG1 (SLJIT_NUMBER_OF_REGISTERS + 2)
#define TMP_REG2 (SLJIT_NUMBER_OF_REGISTERS + 3) #define TMP_REG2 (SLJIT_NUMBER_OF_REGISTERS + 3)
@ -68,7 +68,7 @@ typedef sljit_ui sljit_ins;
#define TMP_FREG1 (0) #define TMP_FREG1 (0)
#define TMP_FREG2 ((SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1) << 1) #define TMP_FREG2 ((SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1) << 1)
static SLJIT_CONST sljit_ub reg_map[SLJIT_NUMBER_OF_REGISTERS + 5] = { static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 5] = {
0, 2, 5, 6, 7, 8, 9, 10, 11, 24, 23, 22, 21, 20, 19, 18, 17, 16, 29, 3, 25, 4 0, 2, 5, 6, 7, 8, 9, 10, 11, 24, 23, 22, 21, 20, 19, 18, 17, 16, 29, 3, 25, 4
}; };
@ -201,7 +201,7 @@ static SLJIT_CONST sljit_ub reg_map[SLJIT_NUMBER_OF_REGISTERS + 5] = {
/* dest_reg is the absolute name of the register /* dest_reg is the absolute name of the register
Useful for reordering instructions in the delay slot. */ Useful for reordering instructions in the delay slot. */
static sljit_si push_inst(struct sljit_compiler *compiler, sljit_ins ins, sljit_si delay_slot) static sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_ins ins, sljit_s32 delay_slot)
{ {
SLJIT_ASSERT(delay_slot == MOVABLE_INS || delay_slot >= UNMOVABLE_INS SLJIT_ASSERT(delay_slot == MOVABLE_INS || delay_slot >= UNMOVABLE_INS
|| delay_slot == ((ins >> 11) & 0x1f) || delay_slot == ((ins >> 16) & 0x1f)); || delay_slot == ((ins >> 11) & 0x1f) || delay_slot == ((ins >> 16) & 0x1f));
@ -213,7 +213,7 @@ static sljit_si push_inst(struct sljit_compiler *compiler, sljit_ins ins, sljit_
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
static SLJIT_INLINE sljit_ins invert_branch(sljit_si flags) static SLJIT_INLINE sljit_ins invert_branch(sljit_s32 flags)
{ {
return (flags & IS_BIT26_COND) ? (1 << 26) : (1 << 16); return (flags & IS_BIT26_COND) ? (1 << 26) : (1 << 16);
} }
@ -538,12 +538,12 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
#include "sljitNativeMIPS_64.c" #include "sljitNativeMIPS_64.c"
#endif #endif
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compiler, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler,
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds, sljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 saveds,
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size) sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
{ {
sljit_ins base; sljit_ins base;
sljit_si i, tmp, offs; sljit_s32 i, tmp, offs;
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_enter(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size)); CHECK(check_sljit_emit_enter(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size));
@ -575,12 +575,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
tmp = saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - saveds) : SLJIT_FIRST_SAVED_REG; tmp = saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - saveds) : SLJIT_FIRST_SAVED_REG;
for (i = SLJIT_S0; i >= tmp; i--) { for (i = SLJIT_S0; i >= tmp; i--) {
offs -= (sljit_si)(sizeof(sljit_sw)); offs -= (sljit_s32)(sizeof(sljit_sw));
FAIL_IF(push_inst(compiler, STACK_STORE | base | T(i) | IMM(offs), MOVABLE_INS)); FAIL_IF(push_inst(compiler, STACK_STORE | base | T(i) | IMM(offs), MOVABLE_INS));
} }
for (i = scratches; i >= SLJIT_FIRST_SAVED_REG; i--) { for (i = scratches; i >= SLJIT_FIRST_SAVED_REG; i--) {
offs -= (sljit_si)(sizeof(sljit_sw)); offs -= (sljit_s32)(sizeof(sljit_sw));
FAIL_IF(push_inst(compiler, STACK_STORE | base | T(i) | IMM(offs), MOVABLE_INS)); FAIL_IF(push_inst(compiler, STACK_STORE | base | T(i) | IMM(offs), MOVABLE_INS));
} }
@ -594,9 +594,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_set_context(struct sljit_compiler *compiler, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler,
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds, sljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 saveds,
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size) sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
{ {
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size)); CHECK(check_sljit_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size));
@ -611,9 +611,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_set_context(struct sljit_compiler *compi
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compiler, sljit_si op, sljit_si src, sljit_sw srcw) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw)
{ {
sljit_si local_size, i, tmp, offs; sljit_s32 local_size, i, tmp, offs;
sljit_ins base; sljit_ins base;
CHECK_ERROR(); CHECK_ERROR();
@ -631,19 +631,19 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compi
local_size = 0; local_size = 0;
} }
FAIL_IF(push_inst(compiler, STACK_LOAD | base | TA(RETURN_ADDR_REG) | IMM(local_size - (sljit_si)sizeof(sljit_sw)), RETURN_ADDR_REG)); FAIL_IF(push_inst(compiler, STACK_LOAD | base | TA(RETURN_ADDR_REG) | IMM(local_size - (sljit_s32)sizeof(sljit_sw)), RETURN_ADDR_REG));
offs = local_size - (sljit_si)GET_SAVED_REGISTERS_SIZE(compiler->scratches, compiler->saveds, 1); offs = local_size - (sljit_s32)GET_SAVED_REGISTERS_SIZE(compiler->scratches, compiler->saveds, 1);
tmp = compiler->scratches; tmp = compiler->scratches;
for (i = SLJIT_FIRST_SAVED_REG; i <= tmp; i++) { for (i = SLJIT_FIRST_SAVED_REG; i <= tmp; i++) {
FAIL_IF(push_inst(compiler, STACK_LOAD | base | T(i) | IMM(offs), DR(i))); FAIL_IF(push_inst(compiler, STACK_LOAD | base | T(i) | IMM(offs), DR(i)));
offs += (sljit_si)(sizeof(sljit_sw)); offs += (sljit_s32)(sizeof(sljit_sw));
} }
tmp = compiler->saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - compiler->saveds) : SLJIT_FIRST_SAVED_REG; tmp = compiler->saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - compiler->saveds) : SLJIT_FIRST_SAVED_REG;
for (i = tmp; i <= SLJIT_S0; i++) { for (i = tmp; i <= SLJIT_S0; i++) {
FAIL_IF(push_inst(compiler, STACK_LOAD | base | T(i) | IMM(offs), DR(i))); FAIL_IF(push_inst(compiler, STACK_LOAD | base | T(i) | IMM(offs), DR(i)));
offs += (sljit_si)(sizeof(sljit_sw)); offs += (sljit_s32)(sizeof(sljit_sw));
} }
SLJIT_ASSERT(offs == local_size - (sljit_sw)(sizeof(sljit_sw))); SLJIT_ASSERT(offs == local_size - (sljit_sw)(sizeof(sljit_sw)));
@ -668,7 +668,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compi
#define ARCH_32_64(a, b) b #define ARCH_32_64(a, b) b
#endif #endif
static SLJIT_CONST sljit_ins data_transfer_insts[16 + 4] = { static const sljit_ins data_transfer_insts[16 + 4] = {
/* u w s */ ARCH_32_64(HI(43) /* sw */, HI(63) /* sd */), /* u w s */ ARCH_32_64(HI(43) /* sw */, HI(63) /* sd */),
/* u w l */ ARCH_32_64(HI(35) /* lw */, HI(55) /* ld */), /* u w l */ ARCH_32_64(HI(35) /* lw */, HI(55) /* ld */),
/* u b s */ HI(40) /* sb */, /* u b s */ HI(40) /* sb */,
@ -698,7 +698,7 @@ static SLJIT_CONST sljit_ins data_transfer_insts[16 + 4] = {
/* reg_ar is an absoulute register! */ /* reg_ar is an absoulute register! */
/* Can perform an operation using at most 1 instruction. */ /* Can perform an operation using at most 1 instruction. */
static sljit_si getput_arg_fast(struct sljit_compiler *compiler, sljit_si flags, sljit_si reg_ar, sljit_si arg, sljit_sw argw) static sljit_s32 getput_arg_fast(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg_ar, sljit_s32 arg, sljit_sw argw)
{ {
SLJIT_ASSERT(arg & SLJIT_MEM); SLJIT_ASSERT(arg & SLJIT_MEM);
@ -716,7 +716,7 @@ static sljit_si getput_arg_fast(struct sljit_compiler *compiler, sljit_si flags,
/* See getput_arg below. /* See getput_arg below.
Note: can_cache is called only for binary operators. Those Note: can_cache is called only for binary operators. Those
operators always uses word arguments without write back. */ operators always uses word arguments without write back. */
static sljit_si can_cache(sljit_si arg, sljit_sw argw, sljit_si next_arg, sljit_sw next_argw) static sljit_s32 can_cache(sljit_s32 arg, sljit_sw argw, sljit_s32 next_arg, sljit_sw next_argw)
{ {
SLJIT_ASSERT((arg & SLJIT_MEM) && (next_arg & SLJIT_MEM)); SLJIT_ASSERT((arg & SLJIT_MEM) && (next_arg & SLJIT_MEM));
@ -739,9 +739,9 @@ static sljit_si can_cache(sljit_si arg, sljit_sw argw, sljit_si next_arg, sljit_
} }
/* Emit the necessary instructions. See can_cache above. */ /* Emit the necessary instructions. See can_cache above. */
static sljit_si getput_arg(struct sljit_compiler *compiler, sljit_si flags, sljit_si reg_ar, sljit_si arg, sljit_sw argw, sljit_si next_arg, sljit_sw next_argw) static sljit_s32 getput_arg(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg_ar, sljit_s32 arg, sljit_sw argw, sljit_s32 next_arg, sljit_sw next_argw)
{ {
sljit_si tmp_ar, base, delay_slot; sljit_s32 tmp_ar, base, delay_slot;
SLJIT_ASSERT(arg & SLJIT_MEM); SLJIT_ASSERT(arg & SLJIT_MEM);
if (!(next_arg & SLJIT_MEM)) { if (!(next_arg & SLJIT_MEM)) {
@ -878,7 +878,7 @@ static sljit_si getput_arg(struct sljit_compiler *compiler, sljit_si flags, slji
return push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | SA(tmp_ar) | TA(reg_ar), delay_slot); return push_inst(compiler, data_transfer_insts[flags & MEM_MASK] | SA(tmp_ar) | TA(reg_ar), delay_slot);
} }
static SLJIT_INLINE sljit_si emit_op_mem(struct sljit_compiler *compiler, sljit_si flags, sljit_si reg_ar, sljit_si arg, sljit_sw argw) static SLJIT_INLINE sljit_s32 emit_op_mem(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg_ar, sljit_s32 arg, sljit_sw argw)
{ {
if (getput_arg_fast(compiler, flags, reg_ar, arg, argw)) if (getput_arg_fast(compiler, flags, reg_ar, arg, argw))
return compiler->error; return compiler->error;
@ -887,26 +887,26 @@ static SLJIT_INLINE sljit_si emit_op_mem(struct sljit_compiler *compiler, sljit_
return getput_arg(compiler, flags, reg_ar, arg, argw, 0, 0); return getput_arg(compiler, flags, reg_ar, arg, argw, 0, 0);
} }
static SLJIT_INLINE sljit_si emit_op_mem2(struct sljit_compiler *compiler, sljit_si flags, sljit_si reg, sljit_si arg1, sljit_sw arg1w, sljit_si arg2, sljit_sw arg2w) static SLJIT_INLINE sljit_s32 emit_op_mem2(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg1, sljit_sw arg1w, sljit_s32 arg2, sljit_sw arg2w)
{ {
if (getput_arg_fast(compiler, flags, reg, arg1, arg1w)) if (getput_arg_fast(compiler, flags, reg, arg1, arg1w))
return compiler->error; return compiler->error;
return getput_arg(compiler, flags, reg, arg1, arg1w, arg2, arg2w); return getput_arg(compiler, flags, reg, arg1, arg1w, arg2, arg2w);
} }
static sljit_si emit_op(struct sljit_compiler *compiler, sljit_si op, sljit_si flags, static sljit_s32 emit_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 flags,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src1, sljit_sw src1w, sljit_s32 src1, sljit_sw src1w,
sljit_si src2, sljit_sw src2w) sljit_s32 src2, sljit_sw src2w)
{ {
/* arg1 goes to TMP_REG1 or src reg /* arg1 goes to TMP_REG1 or src reg
arg2 goes to TMP_REG2, imm or src reg arg2 goes to TMP_REG2, imm or src reg
TMP_REG3 can be used for caching TMP_REG3 can be used for caching
result goes to TMP_REG2, so put result can use TMP_REG1 and TMP_REG3. */ result goes to TMP_REG2, so put result can use TMP_REG1 and TMP_REG3. */
sljit_si dst_r = TMP_REG2; sljit_s32 dst_r = TMP_REG2;
sljit_si src1_r; sljit_s32 src1_r;
sljit_sw src2_r = 0; sljit_sw src2_r = 0;
sljit_si sugg_src2_r = TMP_REG2; sljit_s32 sugg_src2_r = TMP_REG2;
if (!(flags & ALT_KEEP_CACHE)) { if (!(flags & ALT_KEEP_CACHE)) {
compiler->cache_arg = 0; compiler->cache_arg = 0;
@ -914,7 +914,7 @@ static sljit_si emit_op(struct sljit_compiler *compiler, sljit_si op, sljit_si f
} }
if (SLJIT_UNLIKELY(dst == SLJIT_UNUSED)) { if (SLJIT_UNLIKELY(dst == SLJIT_UNUSED)) {
if (op >= SLJIT_MOV && op <= SLJIT_MOVU_SI && !(src2 & SLJIT_MEM)) if (op >= SLJIT_MOV && op <= SLJIT_MOVU_S32 && !(src2 & SLJIT_MEM))
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
if (GET_FLAGS(op)) if (GET_FLAGS(op))
flags |= UNUSED_DEST; flags |= UNUSED_DEST;
@ -922,7 +922,7 @@ static sljit_si emit_op(struct sljit_compiler *compiler, sljit_si op, sljit_si f
else if (FAST_IS_REG(dst)) { else if (FAST_IS_REG(dst)) {
dst_r = dst; dst_r = dst;
flags |= REG_DEST; flags |= REG_DEST;
if (op >= SLJIT_MOV && op <= SLJIT_MOVU_SI) if (op >= SLJIT_MOV && op <= SLJIT_MOVU_S32)
sugg_src2_r = dst_r; sugg_src2_r = dst_r;
} }
else if ((dst & SLJIT_MEM) && !getput_arg_fast(compiler, flags | ARG_TEST, DR(TMP_REG1), dst, dstw)) else if ((dst & SLJIT_MEM) && !getput_arg_fast(compiler, flags | ARG_TEST, DR(TMP_REG1), dst, dstw))
@ -976,7 +976,7 @@ static sljit_si emit_op(struct sljit_compiler *compiler, sljit_si op, sljit_si f
if (FAST_IS_REG(src2)) { if (FAST_IS_REG(src2)) {
src2_r = src2; src2_r = src2;
flags |= REG2_SOURCE; flags |= REG2_SOURCE;
if (!(flags & REG_DEST) && op >= SLJIT_MOV && op <= SLJIT_MOVU_SI) if (!(flags & REG_DEST) && op >= SLJIT_MOV && op <= SLJIT_MOVU_S32)
dst_r = src2_r; dst_r = src2_r;
} }
else if (src2 & SLJIT_IMM) { else if (src2 & SLJIT_IMM) {
@ -987,7 +987,7 @@ static sljit_si emit_op(struct sljit_compiler *compiler, sljit_si op, sljit_si f
} }
else { else {
src2_r = 0; src2_r = 0;
if ((op >= SLJIT_MOV && op <= SLJIT_MOVU_SI) && (dst & SLJIT_MEM)) if ((op >= SLJIT_MOV && op <= SLJIT_MOVU_S32) && (dst & SLJIT_MEM))
dst_r = 0; dst_r = 0;
} }
} }
@ -1029,10 +1029,10 @@ static sljit_si emit_op(struct sljit_compiler *compiler, sljit_si op, sljit_si f
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler, sljit_si op) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op)
{ {
#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
sljit_si int_op = op & SLJIT_INT_OP; sljit_s32 int_op = op & SLJIT_I32_OP;
#endif #endif
CHECK_ERROR(); CHECK_ERROR();
@ -1044,20 +1044,20 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler
return push_inst(compiler, BREAK, UNMOVABLE_INS); return push_inst(compiler, BREAK, UNMOVABLE_INS);
case SLJIT_NOP: case SLJIT_NOP:
return push_inst(compiler, NOP, UNMOVABLE_INS); return push_inst(compiler, NOP, UNMOVABLE_INS);
case SLJIT_LUMUL: case SLJIT_LMUL_UW:
case SLJIT_LSMUL: case SLJIT_LMUL_SW:
#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
FAIL_IF(push_inst(compiler, (op == SLJIT_LUMUL ? DMULTU : DMULT) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS)); FAIL_IF(push_inst(compiler, (op == SLJIT_LMUL_UW ? DMULTU : DMULT) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS));
#else #else
FAIL_IF(push_inst(compiler, (op == SLJIT_LUMUL ? MULTU : MULT) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS)); FAIL_IF(push_inst(compiler, (op == SLJIT_LMUL_UW ? MULTU : MULT) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS));
#endif #endif
FAIL_IF(push_inst(compiler, MFLO | D(SLJIT_R0), DR(SLJIT_R0))); FAIL_IF(push_inst(compiler, MFLO | D(SLJIT_R0), DR(SLJIT_R0)));
return push_inst(compiler, MFHI | D(SLJIT_R1), DR(SLJIT_R1)); return push_inst(compiler, MFHI | D(SLJIT_R1), DR(SLJIT_R1));
case SLJIT_UDIVMOD: case SLJIT_DIVMOD_UW:
case SLJIT_SDIVMOD: case SLJIT_DIVMOD_SW:
case SLJIT_UDIVI: case SLJIT_DIV_UW:
case SLJIT_SDIVI: case SLJIT_DIV_SW:
SLJIT_COMPILE_ASSERT((SLJIT_UDIVMOD & 0x2) == 0 && SLJIT_UDIVI - 0x2 == SLJIT_UDIVMOD, bad_div_opcode_assignments); SLJIT_COMPILE_ASSERT((SLJIT_DIVMOD_UW & 0x2) == 0 && SLJIT_DIV_UW - 0x2 == SLJIT_DIVMOD_UW, bad_div_opcode_assignments);
#if !(defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1) #if !(defined SLJIT_MIPS_R1 && SLJIT_MIPS_R1)
FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS)); FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));
FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS)); FAIL_IF(push_inst(compiler, NOP, UNMOVABLE_INS));
@ -1065,28 +1065,28 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler
#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
if (int_op) if (int_op)
FAIL_IF(push_inst(compiler, ((op | 0x2) == SLJIT_UDIVI ? DIVU : DIV) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS)); FAIL_IF(push_inst(compiler, ((op | 0x2) == SLJIT_DIV_UW ? DIVU : DIV) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS));
else else
FAIL_IF(push_inst(compiler, ((op | 0x2) == SLJIT_UDIVI ? DDIVU : DDIV) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS)); FAIL_IF(push_inst(compiler, ((op | 0x2) == SLJIT_DIV_UW ? DDIVU : DDIV) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS));
#else #else
FAIL_IF(push_inst(compiler, ((op | 0x2) == SLJIT_UDIVI ? DIVU : DIV) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS)); FAIL_IF(push_inst(compiler, ((op | 0x2) == SLJIT_DIV_UW ? DIVU : DIV) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS));
#endif #endif
FAIL_IF(push_inst(compiler, MFLO | D(SLJIT_R0), DR(SLJIT_R0))); FAIL_IF(push_inst(compiler, MFLO | D(SLJIT_R0), DR(SLJIT_R0)));
return (op >= SLJIT_UDIVI) ? SLJIT_SUCCESS : push_inst(compiler, MFHI | D(SLJIT_R1), DR(SLJIT_R1)); return (op >= SLJIT_DIV_UW) ? SLJIT_SUCCESS : push_inst(compiler, MFHI | D(SLJIT_R1), DR(SLJIT_R1));
} }
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler, sljit_si op, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src, sljit_sw srcw) sljit_s32 src, sljit_sw srcw)
{ {
#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
# define flags 0 # define flags 0
#else #else
sljit_si flags = 0; sljit_s32 flags = 0;
#endif #endif
CHECK_ERROR(); CHECK_ERROR();
@ -1095,10 +1095,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler
ADJUST_LOCAL_OFFSET(src, srcw); ADJUST_LOCAL_OFFSET(src, srcw);
#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
if ((op & SLJIT_INT_OP) && GET_OPCODE(op) >= SLJIT_NOT) { if ((op & SLJIT_I32_OP) && GET_OPCODE(op) >= SLJIT_NOT) {
flags |= INT_DATA | SIGNED_DATA; flags |= INT_DATA | SIGNED_DATA;
if (src & SLJIT_IMM) if (src & SLJIT_IMM)
srcw = (sljit_si)srcw; srcw = (sljit_s32)srcw;
} }
#endif #endif
@ -1107,61 +1107,61 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler
case SLJIT_MOV_P: case SLJIT_MOV_P:
return emit_op(compiler, SLJIT_MOV, WORD_DATA, dst, dstw, TMP_REG1, 0, src, srcw); return emit_op(compiler, SLJIT_MOV, WORD_DATA, dst, dstw, TMP_REG1, 0, src, srcw);
case SLJIT_MOV_UI: case SLJIT_MOV_U32:
#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
return emit_op(compiler, SLJIT_MOV_UI, INT_DATA, dst, dstw, TMP_REG1, 0, src, srcw); return emit_op(compiler, SLJIT_MOV_U32, INT_DATA, dst, dstw, TMP_REG1, 0, src, srcw);
#else #else
return emit_op(compiler, SLJIT_MOV_UI, INT_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_ui)srcw : srcw); return emit_op(compiler, SLJIT_MOV_U32, INT_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u32)srcw : srcw);
#endif #endif
case SLJIT_MOV_SI: case SLJIT_MOV_S32:
#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
return emit_op(compiler, SLJIT_MOV_SI, INT_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, srcw); return emit_op(compiler, SLJIT_MOV_S32, INT_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, srcw);
#else #else
return emit_op(compiler, SLJIT_MOV_SI, INT_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_si)srcw : srcw); return emit_op(compiler, SLJIT_MOV_S32, INT_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s32)srcw : srcw);
#endif #endif
case SLJIT_MOV_UB: case SLJIT_MOV_U8:
return emit_op(compiler, SLJIT_MOV_UB, BYTE_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_ub)srcw : srcw); return emit_op(compiler, SLJIT_MOV_U8, BYTE_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u8)srcw : srcw);
case SLJIT_MOV_SB: case SLJIT_MOV_S8:
return emit_op(compiler, SLJIT_MOV_SB, BYTE_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_sb)srcw : srcw); return emit_op(compiler, SLJIT_MOV_S8, BYTE_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s8)srcw : srcw);
case SLJIT_MOV_UH: case SLJIT_MOV_U16:
return emit_op(compiler, SLJIT_MOV_UH, HALF_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_uh)srcw : srcw); return emit_op(compiler, SLJIT_MOV_U16, HALF_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u16)srcw : srcw);
case SLJIT_MOV_SH: case SLJIT_MOV_S16:
return emit_op(compiler, SLJIT_MOV_SH, HALF_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_sh)srcw : srcw); return emit_op(compiler, SLJIT_MOV_S16, HALF_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s16)srcw : srcw);
case SLJIT_MOVU: case SLJIT_MOVU:
case SLJIT_MOVU_P: case SLJIT_MOVU_P:
return emit_op(compiler, SLJIT_MOV, WORD_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, srcw); return emit_op(compiler, SLJIT_MOV, WORD_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, srcw);
case SLJIT_MOVU_UI: case SLJIT_MOVU_U32:
#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
return emit_op(compiler, SLJIT_MOV_UI, INT_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, srcw); return emit_op(compiler, SLJIT_MOV_U32, INT_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, srcw);
#else #else
return emit_op(compiler, SLJIT_MOV_UI, INT_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_ui)srcw : srcw); return emit_op(compiler, SLJIT_MOV_U32, INT_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u32)srcw : srcw);
#endif #endif
case SLJIT_MOVU_SI: case SLJIT_MOVU_S32:
#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
return emit_op(compiler, SLJIT_MOV_SI, INT_DATA | SIGNED_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, srcw); return emit_op(compiler, SLJIT_MOV_S32, INT_DATA | SIGNED_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, srcw);
#else #else
return emit_op(compiler, SLJIT_MOV_SI, INT_DATA | SIGNED_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_si)srcw : srcw); return emit_op(compiler, SLJIT_MOV_S32, INT_DATA | SIGNED_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s32)srcw : srcw);
#endif #endif
case SLJIT_MOVU_UB: case SLJIT_MOVU_U8:
return emit_op(compiler, SLJIT_MOV_UB, BYTE_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_ub)srcw : srcw); return emit_op(compiler, SLJIT_MOV_U8, BYTE_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u8)srcw : srcw);
case SLJIT_MOVU_SB: case SLJIT_MOVU_S8:
return emit_op(compiler, SLJIT_MOV_SB, BYTE_DATA | SIGNED_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_sb)srcw : srcw); return emit_op(compiler, SLJIT_MOV_S8, BYTE_DATA | SIGNED_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s8)srcw : srcw);
case SLJIT_MOVU_UH: case SLJIT_MOVU_U16:
return emit_op(compiler, SLJIT_MOV_UH, HALF_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_uh)srcw : srcw); return emit_op(compiler, SLJIT_MOV_U16, HALF_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u16)srcw : srcw);
case SLJIT_MOVU_SH: case SLJIT_MOVU_S16:
return emit_op(compiler, SLJIT_MOV_SH, HALF_DATA | SIGNED_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_sh)srcw : srcw); return emit_op(compiler, SLJIT_MOV_S16, HALF_DATA | SIGNED_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s16)srcw : srcw);
case SLJIT_NOT: case SLJIT_NOT:
return emit_op(compiler, op, flags, dst, dstw, TMP_REG1, 0, src, srcw); return emit_op(compiler, op, flags, dst, dstw, TMP_REG1, 0, src, srcw);
@ -1180,15 +1180,15 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler
#endif #endif
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler, sljit_si op, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src1, sljit_sw src1w, sljit_s32 src1, sljit_sw src1w,
sljit_si src2, sljit_sw src2w) sljit_s32 src2, sljit_sw src2w)
{ {
#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
# define flags 0 # define flags 0
#else #else
sljit_si flags = 0; sljit_s32 flags = 0;
#endif #endif
CHECK_ERROR(); CHECK_ERROR();
@ -1198,12 +1198,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler
ADJUST_LOCAL_OFFSET(src2, src2w); ADJUST_LOCAL_OFFSET(src2, src2w);
#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
if (op & SLJIT_INT_OP) { if (op & SLJIT_I32_OP) {
flags |= INT_DATA | SIGNED_DATA; flags |= INT_DATA | SIGNED_DATA;
if (src1 & SLJIT_IMM) if (src1 & SLJIT_IMM)
src1w = (sljit_si)src1w; src1w = (sljit_s32)src1w;
if (src2 & SLJIT_IMM) if (src2 & SLJIT_IMM)
src2w = (sljit_si)src2w; src2w = (sljit_s32)src2w;
} }
#endif #endif
@ -1232,7 +1232,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler
src2w &= 0x1f; src2w &= 0x1f;
#else #else
if (src2 & SLJIT_IMM) { if (src2 & SLJIT_IMM) {
if (op & SLJIT_INT_OP) if (op & SLJIT_I32_OP)
src2w &= 0x1f; src2w &= 0x1f;
else else
src2w &= 0x3f; src2w &= 0x3f;
@ -1248,20 +1248,20 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler
#endif #endif
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_register_index(sljit_si reg) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg)
{ {
CHECK_REG_INDEX(check_sljit_get_register_index(reg)); CHECK_REG_INDEX(check_sljit_get_register_index(reg));
return reg_map[reg]; return reg_map[reg];
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_float_register_index(sljit_si reg) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg)
{ {
CHECK_REG_INDEX(check_sljit_get_float_register_index(reg)); CHECK_REG_INDEX(check_sljit_get_float_register_index(reg));
return reg << 1; return reg << 1;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_custom(struct sljit_compiler *compiler, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler,
void *instruction, sljit_si size) void *instruction, sljit_s32 size)
{ {
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_op_custom(compiler, instruction, size)); CHECK(check_sljit_emit_op_custom(compiler, instruction, size));
@ -1273,7 +1273,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_custom(struct sljit_compiler *co
/* Floating point operators */ /* Floating point operators */
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_is_fpu_available(void) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_is_fpu_available(void)
{ {
#ifdef SLJIT_IS_FPU_AVAILABLE #ifdef SLJIT_IS_FPU_AVAILABLE
return SLJIT_IS_FPU_AVAILABLE; return SLJIT_IS_FPU_AVAILABLE;
@ -1286,17 +1286,17 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_is_fpu_available(void)
#endif #endif
} }
#define FLOAT_DATA(op) (DOUBLE_DATA | ((op & SLJIT_SINGLE_OP) >> 7)) #define FLOAT_DATA(op) (DOUBLE_DATA | ((op & SLJIT_F32_OP) >> 7))
#define FMT(op) (((op & SLJIT_SINGLE_OP) ^ SLJIT_SINGLE_OP) << (21 - 8)) #define FMT(op) (((op & SLJIT_F32_OP) ^ SLJIT_F32_OP) << (21 - 8))
static SLJIT_INLINE sljit_si sljit_emit_fop1_convw_fromd(struct sljit_compiler *compiler, sljit_si op, static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src, sljit_sw srcw) sljit_s32 src, sljit_sw srcw)
{ {
#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
# define flags 0 # define flags 0
#else #else
sljit_si flags = (GET_OPCODE(op) == SLJIT_CONVW_FROMD) << 21; sljit_s32 flags = (GET_OPCODE(op) == SLJIT_CONV_SW_FROM_F64) << 21;
#endif #endif
if (src & SLJIT_MEM) { if (src & SLJIT_MEM) {
@ -1322,17 +1322,17 @@ static SLJIT_INLINE sljit_si sljit_emit_fop1_convw_fromd(struct sljit_compiler *
#endif #endif
} }
static SLJIT_INLINE sljit_si sljit_emit_fop1_convd_fromw(struct sljit_compiler *compiler, sljit_si op, static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src, sljit_sw srcw) sljit_s32 src, sljit_sw srcw)
{ {
#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
# define flags 0 # define flags 0
#else #else
sljit_si flags = (GET_OPCODE(op) == SLJIT_CONVD_FROMW) << 21; sljit_s32 flags = (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_SW) << 21;
#endif #endif
sljit_si dst_r = FAST_IS_REG(dst) ? (dst << 1) : TMP_FREG1; sljit_s32 dst_r = FAST_IS_REG(dst) ? (dst << 1) : TMP_FREG1;
if (FAST_IS_REG(src)) if (FAST_IS_REG(src))
FAIL_IF(push_inst(compiler, MTC1 | flags | T(src) | FS(TMP_FREG1), MOVABLE_INS)); FAIL_IF(push_inst(compiler, MTC1 | flags | T(src) | FS(TMP_FREG1), MOVABLE_INS));
@ -1342,14 +1342,14 @@ static SLJIT_INLINE sljit_si sljit_emit_fop1_convd_fromw(struct sljit_compiler *
} }
else { else {
#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
if (GET_OPCODE(op) == SLJIT_CONVD_FROMI) if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32)
srcw = (sljit_si)srcw; srcw = (sljit_s32)srcw;
#endif #endif
FAIL_IF(load_immediate(compiler, DR(TMP_REG1), srcw)); FAIL_IF(load_immediate(compiler, DR(TMP_REG1), srcw));
FAIL_IF(push_inst(compiler, MTC1 | flags | T(TMP_REG1) | FS(TMP_FREG1), MOVABLE_INS)); FAIL_IF(push_inst(compiler, MTC1 | flags | T(TMP_REG1) | FS(TMP_FREG1), MOVABLE_INS));
} }
FAIL_IF(push_inst(compiler, CVT_S_S | flags | (4 << 21) | (((op & SLJIT_SINGLE_OP) ^ SLJIT_SINGLE_OP) >> 8) | FS(TMP_FREG1) | FD(dst_r), MOVABLE_INS)); FAIL_IF(push_inst(compiler, CVT_S_S | flags | (4 << 21) | (((op & SLJIT_F32_OP) ^ SLJIT_F32_OP) >> 8) | FS(TMP_FREG1) | FD(dst_r), MOVABLE_INS));
if (dst & SLJIT_MEM) if (dst & SLJIT_MEM)
return emit_op_mem2(compiler, FLOAT_DATA(op), TMP_FREG1, dst, dstw, 0, 0); return emit_op_mem2(compiler, FLOAT_DATA(op), TMP_FREG1, dst, dstw, 0, 0);
@ -1360,9 +1360,9 @@ static SLJIT_INLINE sljit_si sljit_emit_fop1_convd_fromw(struct sljit_compiler *
#endif #endif
} }
static SLJIT_INLINE sljit_si sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_si op, static SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si src1, sljit_sw src1w, sljit_s32 src1, sljit_sw src1w,
sljit_si src2, sljit_sw src2w) sljit_s32 src2, sljit_sw src2w)
{ {
if (src1 & SLJIT_MEM) { if (src1 & SLJIT_MEM) {
FAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, src1, src1w, src2, src2w)); FAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, src1, src1w, src2, src2w));
@ -1399,21 +1399,21 @@ static SLJIT_INLINE sljit_si sljit_emit_fop1_cmp(struct sljit_compiler *compiler
return push_inst(compiler, C_UN_S | FMT(op) | FT(src2) | FS(src1), FCSR_FCC); return push_inst(compiler, C_UN_S | FMT(op) | FT(src2) | FS(src1), FCSR_FCC);
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop1(struct sljit_compiler *compiler, sljit_si op, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src, sljit_sw srcw) sljit_s32 src, sljit_sw srcw)
{ {
sljit_si dst_r; sljit_s32 dst_r;
CHECK_ERROR(); CHECK_ERROR();
compiler->cache_arg = 0; compiler->cache_arg = 0;
compiler->cache_argw = 0; compiler->cache_argw = 0;
SLJIT_COMPILE_ASSERT((SLJIT_SINGLE_OP == 0x100) && !(DOUBLE_DATA & 0x2), float_transfer_bit_error); SLJIT_COMPILE_ASSERT((SLJIT_F32_OP == 0x100) && !(DOUBLE_DATA & 0x2), float_transfer_bit_error);
SELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw); SELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw);
if (GET_OPCODE(op) == SLJIT_CONVD_FROMS) if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_F32)
op ^= SLJIT_SINGLE_OP; op ^= SLJIT_F32_OP;
dst_r = FAST_IS_REG(dst) ? (dst << 1) : TMP_FREG1; dst_r = FAST_IS_REG(dst) ? (dst << 1) : TMP_FREG1;
@ -1425,7 +1425,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop1(struct sljit_compiler *compile
src <<= 1; src <<= 1;
switch (GET_OPCODE(op)) { switch (GET_OPCODE(op)) {
case SLJIT_DMOV: case SLJIT_MOV_F64:
if (src != dst_r) { if (src != dst_r) {
if (dst_r != TMP_FREG1) if (dst_r != TMP_FREG1)
FAIL_IF(push_inst(compiler, MOV_S | FMT(op) | FS(src) | FD(dst_r), MOVABLE_INS)); FAIL_IF(push_inst(compiler, MOV_S | FMT(op) | FS(src) | FD(dst_r), MOVABLE_INS));
@ -1433,15 +1433,15 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop1(struct sljit_compiler *compile
dst_r = src; dst_r = src;
} }
break; break;
case SLJIT_DNEG: case SLJIT_NEG_F64:
FAIL_IF(push_inst(compiler, NEG_S | FMT(op) | FS(src) | FD(dst_r), MOVABLE_INS)); FAIL_IF(push_inst(compiler, NEG_S | FMT(op) | FS(src) | FD(dst_r), MOVABLE_INS));
break; break;
case SLJIT_DABS: case SLJIT_ABS_F64:
FAIL_IF(push_inst(compiler, ABS_S | FMT(op) | FS(src) | FD(dst_r), MOVABLE_INS)); FAIL_IF(push_inst(compiler, ABS_S | FMT(op) | FS(src) | FD(dst_r), MOVABLE_INS));
break; break;
case SLJIT_CONVD_FROMS: case SLJIT_CONV_F64_FROM_F32:
FAIL_IF(push_inst(compiler, CVT_S_S | ((op & SLJIT_SINGLE_OP) ? 1 : (1 << 21)) | FS(src) | FD(dst_r), MOVABLE_INS)); FAIL_IF(push_inst(compiler, CVT_S_S | ((op & SLJIT_F32_OP) ? 1 : (1 << 21)) | FS(src) | FD(dst_r), MOVABLE_INS));
op ^= SLJIT_SINGLE_OP; op ^= SLJIT_F32_OP;
break; break;
} }
@ -1450,12 +1450,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop1(struct sljit_compiler *compile
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compiler, sljit_si op, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src1, sljit_sw src1w, sljit_s32 src1, sljit_sw src1w,
sljit_si src2, sljit_sw src2w) sljit_s32 src2, sljit_sw src2w)
{ {
sljit_si dst_r, flags = 0; sljit_s32 dst_r, flags = 0;
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_fop2(compiler, op, dst, dstw, src1, src1w, src2, src2w)); CHECK(check_sljit_emit_fop2(compiler, op, dst, dstw, src1, src1w, src2, src2w));
@ -1509,19 +1509,19 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compile
src2 = TMP_FREG2; src2 = TMP_FREG2;
switch (GET_OPCODE(op)) { switch (GET_OPCODE(op)) {
case SLJIT_DADD: case SLJIT_ADD_F64:
FAIL_IF(push_inst(compiler, ADD_S | FMT(op) | FT(src2) | FS(src1) | FD(dst_r), MOVABLE_INS)); FAIL_IF(push_inst(compiler, ADD_S | FMT(op) | FT(src2) | FS(src1) | FD(dst_r), MOVABLE_INS));
break; break;
case SLJIT_DSUB: case SLJIT_SUB_F64:
FAIL_IF(push_inst(compiler, SUB_S | FMT(op) | FT(src2) | FS(src1) | FD(dst_r), MOVABLE_INS)); FAIL_IF(push_inst(compiler, SUB_S | FMT(op) | FT(src2) | FS(src1) | FD(dst_r), MOVABLE_INS));
break; break;
case SLJIT_DMUL: case SLJIT_MUL_F64:
FAIL_IF(push_inst(compiler, MUL_S | FMT(op) | FT(src2) | FS(src1) | FD(dst_r), MOVABLE_INS)); FAIL_IF(push_inst(compiler, MUL_S | FMT(op) | FT(src2) | FS(src1) | FD(dst_r), MOVABLE_INS));
break; break;
case SLJIT_DDIV: case SLJIT_DIV_F64:
FAIL_IF(push_inst(compiler, DIV_S | FMT(op) | FT(src2) | FS(src1) | FD(dst_r), MOVABLE_INS)); FAIL_IF(push_inst(compiler, DIV_S | FMT(op) | FT(src2) | FS(src1) | FD(dst_r), MOVABLE_INS));
break; break;
} }
@ -1536,7 +1536,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compile
/* Other instructions */ /* Other instructions */
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_si dst, sljit_sw dstw) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)
{ {
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw)); CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw));
@ -1553,7 +1553,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_enter(struct sljit_compiler *c
return emit_op_mem(compiler, WORD_DATA, RETURN_ADDR_REG, dst, dstw); return emit_op_mem(compiler, WORD_DATA, RETURN_ADDR_REG, dst, dstw);
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_si src, sljit_sw srcw) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw)
{ {
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_fast_return(compiler, src, srcw)); CHECK(check_sljit_emit_fast_return(compiler, src, srcw));
@ -1617,12 +1617,12 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compi
flags = IS_BIT16_COND; \ flags = IS_BIT16_COND; \
delay_check = FCSR_FCC; delay_check = FCSR_FCC;
SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_si type) SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type)
{ {
struct sljit_jump *jump; struct sljit_jump *jump;
sljit_ins inst; sljit_ins inst;
sljit_si flags = 0; sljit_s32 flags = 0;
sljit_si delay_check = UNMOVABLE_INS; sljit_s32 delay_check = UNMOVABLE_INS;
CHECK_ERROR_PTR(); CHECK_ERROR_PTR();
CHECK_PTR(check_sljit_emit_jump(compiler, type)); CHECK_PTR(check_sljit_emit_jump(compiler, type));
@ -1634,27 +1634,27 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile
switch (type) { switch (type) {
case SLJIT_EQUAL: case SLJIT_EQUAL:
case SLJIT_D_NOT_EQUAL: case SLJIT_NOT_EQUAL_F64:
BR_NZ(EQUAL_FLAG); BR_NZ(EQUAL_FLAG);
break; break;
case SLJIT_NOT_EQUAL: case SLJIT_NOT_EQUAL:
case SLJIT_D_EQUAL: case SLJIT_EQUAL_F64:
BR_Z(EQUAL_FLAG); BR_Z(EQUAL_FLAG);
break; break;
case SLJIT_LESS: case SLJIT_LESS:
case SLJIT_D_LESS: case SLJIT_LESS_F64:
BR_Z(ULESS_FLAG); BR_Z(ULESS_FLAG);
break; break;
case SLJIT_GREATER_EQUAL: case SLJIT_GREATER_EQUAL:
case SLJIT_D_GREATER_EQUAL: case SLJIT_GREATER_EQUAL_F64:
BR_NZ(ULESS_FLAG); BR_NZ(ULESS_FLAG);
break; break;
case SLJIT_GREATER: case SLJIT_GREATER:
case SLJIT_D_GREATER: case SLJIT_GREATER_F64:
BR_Z(UGREATER_FLAG); BR_Z(UGREATER_FLAG);
break; break;
case SLJIT_LESS_EQUAL: case SLJIT_LESS_EQUAL:
case SLJIT_D_LESS_EQUAL: case SLJIT_LESS_EQUAL_F64:
BR_NZ(UGREATER_FLAG); BR_NZ(UGREATER_FLAG);
break; break;
case SLJIT_SIG_LESS: case SLJIT_SIG_LESS:
@ -1677,10 +1677,10 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile
case SLJIT_MUL_NOT_OVERFLOW: case SLJIT_MUL_NOT_OVERFLOW:
BR_NZ(OVERFLOW_FLAG); BR_NZ(OVERFLOW_FLAG);
break; break;
case SLJIT_D_UNORDERED: case SLJIT_UNORDERED_F64:
BR_F(); BR_F();
break; break;
case SLJIT_D_ORDERED: case SLJIT_ORDERED_F64:
BR_T(); BR_T();
break; break;
default: default:
@ -1733,12 +1733,12 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile
src2 = 0; \ src2 = 0; \
} }
SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler *compiler, sljit_si type, SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler *compiler, sljit_s32 type,
sljit_si src1, sljit_sw src1w, sljit_s32 src1, sljit_sw src1w,
sljit_si src2, sljit_sw src2w) sljit_s32 src2, sljit_sw src2w)
{ {
struct sljit_jump *jump; struct sljit_jump *jump;
sljit_si flags; sljit_s32 flags;
sljit_ins inst; sljit_ins inst;
CHECK_ERROR_PTR(); CHECK_ERROR_PTR();
@ -1748,7 +1748,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler
compiler->cache_arg = 0; compiler->cache_arg = 0;
compiler->cache_argw = 0; compiler->cache_argw = 0;
flags = ((type & SLJIT_INT_OP) ? INT_DATA : WORD_DATA) | LOAD_DATA; flags = ((type & SLJIT_I32_OP) ? INT_DATA : WORD_DATA) | LOAD_DATA;
if (src1 & SLJIT_MEM) { if (src1 & SLJIT_MEM) {
PTR_FAIL_IF(emit_op_mem2(compiler, flags, DR(TMP_REG1), src1, src1w, src2, src2w)); PTR_FAIL_IF(emit_op_mem2(compiler, flags, DR(TMP_REG1), src1, src1w, src2, src2w));
src1 = TMP_REG1; src1 = TMP_REG1;
@ -1854,13 +1854,13 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler
#undef RESOLVE_IMM1 #undef RESOLVE_IMM1
#undef RESOLVE_IMM2 #undef RESOLVE_IMM2
SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_fcmp(struct sljit_compiler *compiler, sljit_si type, SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_fcmp(struct sljit_compiler *compiler, sljit_s32 type,
sljit_si src1, sljit_sw src1w, sljit_s32 src1, sljit_sw src1w,
sljit_si src2, sljit_sw src2w) sljit_s32 src2, sljit_sw src2w)
{ {
struct sljit_jump *jump; struct sljit_jump *jump;
sljit_ins inst; sljit_ins inst;
sljit_si if_true; sljit_s32 if_true;
CHECK_ERROR_PTR(); CHECK_ERROR_PTR();
CHECK_PTR(check_sljit_emit_fcmp(compiler, type, src1, src1w, src2, src2w)); CHECK_PTR(check_sljit_emit_fcmp(compiler, type, src1, src1w, src2, src2w));
@ -1888,37 +1888,37 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_fcmp(struct sljit_compile
jump->flags |= IS_BIT16_COND; jump->flags |= IS_BIT16_COND;
switch (type & 0xff) { switch (type & 0xff) {
case SLJIT_D_EQUAL: case SLJIT_EQUAL_F64:
inst = C_UEQ_S; inst = C_UEQ_S;
if_true = 1; if_true = 1;
break; break;
case SLJIT_D_NOT_EQUAL: case SLJIT_NOT_EQUAL_F64:
inst = C_UEQ_S; inst = C_UEQ_S;
if_true = 0; if_true = 0;
break; break;
case SLJIT_D_LESS: case SLJIT_LESS_F64:
inst = C_ULT_S; inst = C_ULT_S;
if_true = 1; if_true = 1;
break; break;
case SLJIT_D_GREATER_EQUAL: case SLJIT_GREATER_EQUAL_F64:
inst = C_ULT_S; inst = C_ULT_S;
if_true = 0; if_true = 0;
break; break;
case SLJIT_D_GREATER: case SLJIT_GREATER_F64:
inst = C_ULE_S; inst = C_ULE_S;
if_true = 0; if_true = 0;
break; break;
case SLJIT_D_LESS_EQUAL: case SLJIT_LESS_EQUAL_F64:
inst = C_ULE_S; inst = C_ULE_S;
if_true = 1; if_true = 1;
break; break;
case SLJIT_D_UNORDERED: case SLJIT_UNORDERED_F64:
inst = C_UN_S; inst = C_UN_S;
if_true = 1; if_true = 1;
break; break;
default: /* Make compilers happy. */ default: /* Make compilers happy. */
SLJIT_ASSERT_STOP(); SLJIT_ASSERT_STOP();
case SLJIT_D_ORDERED: case SLJIT_ORDERED_F64:
inst = C_UN_S; inst = C_UN_S;
if_true = 0; if_true = 0;
break; break;
@ -1943,9 +1943,9 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_fcmp(struct sljit_compile
#undef FLOAT_DATA #undef FLOAT_DATA
#undef FMT #undef FMT
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_ijump(struct sljit_compiler *compiler, sljit_si type, sljit_si src, sljit_sw srcw) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src, sljit_sw srcw)
{ {
sljit_si src_r = TMP_REG2; sljit_s32 src_r = TMP_REG2;
struct sljit_jump *jump = NULL; struct sljit_jump *jump = NULL;
CHECK_ERROR(); CHECK_ERROR();
@ -2001,17 +2001,17 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_ijump(struct sljit_compiler *compil
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_si op, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src, sljit_sw srcw, sljit_s32 src, sljit_sw srcw,
sljit_si type) sljit_s32 type)
{ {
sljit_si sugg_dst_ar, dst_ar; sljit_s32 sugg_dst_ar, dst_ar;
sljit_si flags = GET_ALL_FLAGS(op); sljit_s32 flags = GET_ALL_FLAGS(op);
#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32) #if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
# define mem_type WORD_DATA # define mem_type WORD_DATA
#else #else
sljit_si mem_type = (op & SLJIT_INT_OP) ? (INT_DATA | SIGNED_DATA) : WORD_DATA; sljit_s32 mem_type = (op & SLJIT_I32_OP) ? (INT_DATA | SIGNED_DATA) : WORD_DATA;
#endif #endif
CHECK_ERROR(); CHECK_ERROR();
@ -2023,7 +2023,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *com
op = GET_OPCODE(op); op = GET_OPCODE(op);
#if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64) #if (defined SLJIT_CONFIG_MIPS_64 && SLJIT_CONFIG_MIPS_64)
if (op == SLJIT_MOV_SI || op == SLJIT_MOV_UI) if (op == SLJIT_MOV_S32 || op == SLJIT_MOV_U32)
mem_type = INT_DATA | SIGNED_DATA; mem_type = INT_DATA | SIGNED_DATA;
#endif #endif
sugg_dst_ar = DR((op < SLJIT_ADD && FAST_IS_REG(dst)) ? dst : TMP_REG2); sugg_dst_ar = DR((op < SLJIT_ADD && FAST_IS_REG(dst)) ? dst : TMP_REG2);
@ -2045,14 +2045,14 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *com
break; break;
case SLJIT_LESS: case SLJIT_LESS:
case SLJIT_GREATER_EQUAL: case SLJIT_GREATER_EQUAL:
case SLJIT_D_LESS: case SLJIT_LESS_F64:
case SLJIT_D_GREATER_EQUAL: case SLJIT_GREATER_EQUAL_F64:
dst_ar = ULESS_FLAG; dst_ar = ULESS_FLAG;
break; break;
case SLJIT_GREATER: case SLJIT_GREATER:
case SLJIT_LESS_EQUAL: case SLJIT_LESS_EQUAL:
case SLJIT_D_GREATER: case SLJIT_GREATER_F64:
case SLJIT_D_LESS_EQUAL: case SLJIT_LESS_EQUAL_F64:
dst_ar = UGREATER_FLAG; dst_ar = UGREATER_FLAG;
break; break;
case SLJIT_SIG_LESS: case SLJIT_SIG_LESS:
@ -2073,13 +2073,13 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *com
dst_ar = sugg_dst_ar; dst_ar = sugg_dst_ar;
type ^= 0x1; /* Flip type bit for the XORI below. */ type ^= 0x1; /* Flip type bit for the XORI below. */
break; break;
case SLJIT_D_EQUAL: case SLJIT_EQUAL_F64:
case SLJIT_D_NOT_EQUAL: case SLJIT_NOT_EQUAL_F64:
dst_ar = EQUAL_FLAG; dst_ar = EQUAL_FLAG;
break; break;
case SLJIT_D_UNORDERED: case SLJIT_UNORDERED_F64:
case SLJIT_D_ORDERED: case SLJIT_ORDERED_F64:
FAIL_IF(push_inst(compiler, CFC1 | TA(sugg_dst_ar) | DA(FCSR_REG), sugg_dst_ar)); FAIL_IF(push_inst(compiler, CFC1 | TA(sugg_dst_ar) | DA(FCSR_REG), sugg_dst_ar));
FAIL_IF(push_inst(compiler, SRL | TA(sugg_dst_ar) | DA(sugg_dst_ar) | SH_IMM(23), sugg_dst_ar)); FAIL_IF(push_inst(compiler, SRL | TA(sugg_dst_ar) | DA(sugg_dst_ar) | SH_IMM(23), sugg_dst_ar));
FAIL_IF(push_inst(compiler, ANDI | SA(sugg_dst_ar) | TA(sugg_dst_ar) | IMM(1), sugg_dst_ar)); FAIL_IF(push_inst(compiler, ANDI | SA(sugg_dst_ar) | TA(sugg_dst_ar) | IMM(1), sugg_dst_ar));
@ -2115,10 +2115,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *com
#endif #endif
} }
SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_si dst, sljit_sw dstw, sljit_sw init_value) SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value)
{ {
struct sljit_const *const_; struct sljit_const *const_;
sljit_si reg; sljit_s32 reg;
CHECK_ERROR_PTR(); CHECK_ERROR_PTR();
CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value)); CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value));

View File

@ -26,7 +26,7 @@
/* ppc 32-bit arch dependent functions. */ /* ppc 32-bit arch dependent functions. */
static sljit_si load_immediate(struct sljit_compiler *compiler, sljit_si reg, sljit_sw imm) static sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 reg, sljit_sw imm)
{ {
if (imm <= SIMM_MAX && imm >= SIMM_MIN) if (imm <= SIMM_MAX && imm >= SIMM_MIN)
return push_inst(compiler, ADDI | D(reg) | A(0) | IMM(imm)); return push_inst(compiler, ADDI | D(reg) | A(0) | IMM(imm));
@ -41,39 +41,39 @@ static sljit_si load_immediate(struct sljit_compiler *compiler, sljit_si reg, sl
#define INS_CLEAR_LEFT(dst, src, from) \ #define INS_CLEAR_LEFT(dst, src, from) \
(RLWINM | S(src) | A(dst) | ((from) << 6) | (31 << 1)) (RLWINM | S(src) | A(dst) | ((from) << 6) | (31 << 1))
static SLJIT_INLINE sljit_si emit_single_op(struct sljit_compiler *compiler, sljit_si op, sljit_si flags, static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 flags,
sljit_si dst, sljit_si src1, sljit_si src2) sljit_s32 dst, sljit_s32 src1, sljit_s32 src2)
{ {
switch (op) { switch (op) {
case SLJIT_MOV: case SLJIT_MOV:
case SLJIT_MOV_UI: case SLJIT_MOV_U32:
case SLJIT_MOV_SI: case SLJIT_MOV_S32:
case SLJIT_MOV_P: case SLJIT_MOV_P:
SLJIT_ASSERT(src1 == TMP_REG1); SLJIT_ASSERT(src1 == TMP_REG1);
if (dst != src2) if (dst != src2)
return push_inst(compiler, OR | S(src2) | A(dst) | B(src2)); return push_inst(compiler, OR | S(src2) | A(dst) | B(src2));
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
case SLJIT_MOV_UB: case SLJIT_MOV_U8:
case SLJIT_MOV_SB: case SLJIT_MOV_S8:
SLJIT_ASSERT(src1 == TMP_REG1); SLJIT_ASSERT(src1 == TMP_REG1);
if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) { if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {
if (op == SLJIT_MOV_SB) if (op == SLJIT_MOV_S8)
return push_inst(compiler, EXTSB | S(src2) | A(dst)); return push_inst(compiler, EXTSB | S(src2) | A(dst));
return push_inst(compiler, INS_CLEAR_LEFT(dst, src2, 24)); return push_inst(compiler, INS_CLEAR_LEFT(dst, src2, 24));
} }
else if ((flags & REG_DEST) && op == SLJIT_MOV_SB) else if ((flags & REG_DEST) && op == SLJIT_MOV_S8)
return push_inst(compiler, EXTSB | S(src2) | A(dst)); return push_inst(compiler, EXTSB | S(src2) | A(dst));
else { else {
SLJIT_ASSERT(dst == src2); SLJIT_ASSERT(dst == src2);
} }
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
case SLJIT_MOV_UH: case SLJIT_MOV_U16:
case SLJIT_MOV_SH: case SLJIT_MOV_S16:
SLJIT_ASSERT(src1 == TMP_REG1); SLJIT_ASSERT(src1 == TMP_REG1);
if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) { if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {
if (op == SLJIT_MOV_SH) if (op == SLJIT_MOV_S16)
return push_inst(compiler, EXTSH | S(src2) | A(dst)); return push_inst(compiler, EXTSH | S(src2) | A(dst));
return push_inst(compiler, INS_CLEAR_LEFT(dst, src2, 16)); return push_inst(compiler, INS_CLEAR_LEFT(dst, src2, 16));
} }
@ -244,7 +244,7 @@ static SLJIT_INLINE sljit_si emit_single_op(struct sljit_compiler *compiler, slj
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
static SLJIT_INLINE sljit_si emit_const(struct sljit_compiler *compiler, sljit_si reg, sljit_sw init_value) static SLJIT_INLINE sljit_s32 emit_const(struct sljit_compiler *compiler, sljit_s32 reg, sljit_sw init_value)
{ {
FAIL_IF(push_inst(compiler, ADDIS | D(reg) | A(0) | IMM(init_value >> 16))); FAIL_IF(push_inst(compiler, ADDIS | D(reg) | A(0) | IMM(init_value >> 16)));
return push_inst(compiler, ORI | S(reg) | A(reg) | IMM(init_value)); return push_inst(compiler, ORI | S(reg) | A(reg) | IMM(init_value));

View File

@ -41,7 +41,7 @@
#define PUSH_RLDICR(reg, shift) \ #define PUSH_RLDICR(reg, shift) \
push_inst(compiler, RLDI(reg, reg, 63 - shift, shift, 1)) push_inst(compiler, RLDI(reg, reg, 63 - shift, shift, 1))
static sljit_si load_immediate(struct sljit_compiler *compiler, sljit_si reg, sljit_sw imm) static sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 reg, sljit_sw imm)
{ {
sljit_uw tmp; sljit_uw tmp;
sljit_uw shift; sljit_uw shift;
@ -145,8 +145,8 @@ static sljit_si load_immediate(struct sljit_compiler *compiler, sljit_si reg, sl
src1 = TMP_REG1; \ src1 = TMP_REG1; \
} }
static SLJIT_INLINE sljit_si emit_single_op(struct sljit_compiler *compiler, sljit_si op, sljit_si flags, static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 flags,
sljit_si dst, sljit_si src1, sljit_si src2) sljit_s32 dst, sljit_s32 src1, sljit_s32 src2)
{ {
switch (op) { switch (op) {
case SLJIT_MOV: case SLJIT_MOV:
@ -156,11 +156,11 @@ static SLJIT_INLINE sljit_si emit_single_op(struct sljit_compiler *compiler, slj
return push_inst(compiler, OR | S(src2) | A(dst) | B(src2)); return push_inst(compiler, OR | S(src2) | A(dst) | B(src2));
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
case SLJIT_MOV_UI: case SLJIT_MOV_U32:
case SLJIT_MOV_SI: case SLJIT_MOV_S32:
SLJIT_ASSERT(src1 == TMP_REG1); SLJIT_ASSERT(src1 == TMP_REG1);
if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) { if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {
if (op == SLJIT_MOV_SI) if (op == SLJIT_MOV_S32)
return push_inst(compiler, EXTSW | S(src2) | A(dst)); return push_inst(compiler, EXTSW | S(src2) | A(dst));
return push_inst(compiler, INS_CLEAR_LEFT(dst, src2, 0)); return push_inst(compiler, INS_CLEAR_LEFT(dst, src2, 0));
} }
@ -169,26 +169,26 @@ static SLJIT_INLINE sljit_si emit_single_op(struct sljit_compiler *compiler, slj
} }
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
case SLJIT_MOV_UB: case SLJIT_MOV_U8:
case SLJIT_MOV_SB: case SLJIT_MOV_S8:
SLJIT_ASSERT(src1 == TMP_REG1); SLJIT_ASSERT(src1 == TMP_REG1);
if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) { if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {
if (op == SLJIT_MOV_SB) if (op == SLJIT_MOV_S8)
return push_inst(compiler, EXTSB | S(src2) | A(dst)); return push_inst(compiler, EXTSB | S(src2) | A(dst));
return push_inst(compiler, INS_CLEAR_LEFT(dst, src2, 24)); return push_inst(compiler, INS_CLEAR_LEFT(dst, src2, 24));
} }
else if ((flags & REG_DEST) && op == SLJIT_MOV_SB) else if ((flags & REG_DEST) && op == SLJIT_MOV_S8)
return push_inst(compiler, EXTSB | S(src2) | A(dst)); return push_inst(compiler, EXTSB | S(src2) | A(dst));
else { else {
SLJIT_ASSERT(dst == src2); SLJIT_ASSERT(dst == src2);
} }
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
case SLJIT_MOV_UH: case SLJIT_MOV_U16:
case SLJIT_MOV_SH: case SLJIT_MOV_S16:
SLJIT_ASSERT(src1 == TMP_REG1); SLJIT_ASSERT(src1 == TMP_REG1);
if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) { if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {
if (op == SLJIT_MOV_SH) if (op == SLJIT_MOV_S16)
return push_inst(compiler, EXTSH | S(src2) | A(dst)); return push_inst(compiler, EXTSH | S(src2) | A(dst));
return push_inst(compiler, INS_CLEAR_LEFT(dst, src2, 16)); return push_inst(compiler, INS_CLEAR_LEFT(dst, src2, 16));
} }
@ -389,7 +389,7 @@ static SLJIT_INLINE sljit_si emit_single_op(struct sljit_compiler *compiler, slj
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
static SLJIT_INLINE sljit_si emit_const(struct sljit_compiler *compiler, sljit_si reg, sljit_sw init_value) static SLJIT_INLINE sljit_s32 emit_const(struct sljit_compiler *compiler, sljit_s32 reg, sljit_sw init_value)
{ {
FAIL_IF(push_inst(compiler, ADDIS | D(reg) | A(0) | IMM(init_value >> 48))); FAIL_IF(push_inst(compiler, ADDIS | D(reg) | A(0) | IMM(init_value >> 48)));
FAIL_IF(push_inst(compiler, ORI | S(reg) | A(reg) | IMM(init_value >> 32))); FAIL_IF(push_inst(compiler, ORI | S(reg) | A(reg) | IMM(init_value >> 32)));

View File

@ -24,14 +24,14 @@
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
SLJIT_API_FUNC_ATTRIBUTE SLJIT_CONST char* sljit_get_platform_name(void) SLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void)
{ {
return "PowerPC" SLJIT_CPUINFO; return "PowerPC" SLJIT_CPUINFO;
} }
/* Length of an instruction word. /* Length of an instruction word.
Both for ppc-32 and ppc-64. */ Both for ppc-32 and ppc-64. */
typedef sljit_ui sljit_ins; typedef sljit_u32 sljit_ins;
#if ((defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) && (defined _AIX)) \ #if ((defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) && (defined _AIX)) \
|| (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) || (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
@ -46,6 +46,8 @@ typedef sljit_ui sljit_ins;
#define SLJIT_PASS_ENTRY_ADDR_TO_CALL 1 #define SLJIT_PASS_ENTRY_ADDR_TO_CALL 1
#endif #endif
#if (defined SLJIT_CACHE_FLUSH_OWN_IMPL && SLJIT_CACHE_FLUSH_OWN_IMPL)
static void ppc_cache_flush(sljit_ins *from, sljit_ins *to) static void ppc_cache_flush(sljit_ins *from, sljit_ins *to)
{ {
#ifdef _AIX #ifdef _AIX
@ -87,6 +89,8 @@ static void ppc_cache_flush(sljit_ins *from, sljit_ins *to)
#endif /* _AIX */ #endif /* _AIX */
} }
#endif /* (defined SLJIT_CACHE_FLUSH_OWN_IMPL && SLJIT_CACHE_FLUSH_OWN_IMPL) */
#define TMP_REG1 (SLJIT_NUMBER_OF_REGISTERS + 2) #define TMP_REG1 (SLJIT_NUMBER_OF_REGISTERS + 2)
#define TMP_REG2 (SLJIT_NUMBER_OF_REGISTERS + 3) #define TMP_REG2 (SLJIT_NUMBER_OF_REGISTERS + 3)
#define TMP_REG3 (SLJIT_NUMBER_OF_REGISTERS + 4) #define TMP_REG3 (SLJIT_NUMBER_OF_REGISTERS + 4)
@ -101,7 +105,7 @@ static void ppc_cache_flush(sljit_ins *from, sljit_ins *to)
#define TMP_FREG1 (0) #define TMP_FREG1 (0)
#define TMP_FREG2 (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1) #define TMP_FREG2 (SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1)
static SLJIT_CONST sljit_ub reg_map[SLJIT_NUMBER_OF_REGISTERS + 7] = { static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 7] = {
0, 3, 4, 5, 6, 7, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 1, 8, 9, 10, 31, 12 0, 3, 4, 5, 6, 7, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 1, 8, 9, 10, 31, 12
}; };
@ -236,7 +240,7 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_function_context(void** func_ptr, struct
} }
#endif #endif
static sljit_si push_inst(struct sljit_compiler *compiler, sljit_ins ins) static sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_ins ins)
{ {
sljit_ins *ptr = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins)); sljit_ins *ptr = (sljit_ins*)ensure_buf(compiler, sizeof(sljit_ins));
FAIL_IF(!ptr); FAIL_IF(!ptr);
@ -245,7 +249,7 @@ static sljit_si push_inst(struct sljit_compiler *compiler, sljit_ins ins)
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
static SLJIT_INLINE sljit_si detect_jump_type(struct sljit_jump *jump, sljit_ins *code_ptr, sljit_ins *code) static SLJIT_INLINE sljit_s32 detect_jump_type(struct sljit_jump *jump, sljit_ins *code_ptr, sljit_ins *code)
{ {
sljit_sw diff; sljit_sw diff;
sljit_uw target_addr; sljit_uw target_addr;
@ -571,32 +575,32 @@ ALT_FORM6 0x200000 */
#define STACK_LOAD LD #define STACK_LOAD LD
#endif #endif
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compiler, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler,
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds, sljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 saveds,
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size) sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
{ {
sljit_si i, tmp, offs; sljit_s32 i, tmp, offs;
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_enter(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size)); CHECK(check_sljit_emit_enter(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size));
set_emit_enter(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size); set_emit_enter(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size);
FAIL_IF(push_inst(compiler, MFLR | D(0))); FAIL_IF(push_inst(compiler, MFLR | D(0)));
offs = -(sljit_si)(sizeof(sljit_sw)); offs = -(sljit_s32)(sizeof(sljit_sw));
FAIL_IF(push_inst(compiler, STACK_STORE | S(TMP_ZERO) | A(SLJIT_SP) | IMM(offs))); FAIL_IF(push_inst(compiler, STACK_STORE | S(TMP_ZERO) | A(SLJIT_SP) | IMM(offs)));
tmp = saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - saveds) : SLJIT_FIRST_SAVED_REG; tmp = saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - saveds) : SLJIT_FIRST_SAVED_REG;
for (i = SLJIT_S0; i >= tmp; i--) { for (i = SLJIT_S0; i >= tmp; i--) {
offs -= (sljit_si)(sizeof(sljit_sw)); offs -= (sljit_s32)(sizeof(sljit_sw));
FAIL_IF(push_inst(compiler, STACK_STORE | S(i) | A(SLJIT_SP) | IMM(offs))); FAIL_IF(push_inst(compiler, STACK_STORE | S(i) | A(SLJIT_SP) | IMM(offs)));
} }
for (i = scratches; i >= SLJIT_FIRST_SAVED_REG; i--) { for (i = scratches; i >= SLJIT_FIRST_SAVED_REG; i--) {
offs -= (sljit_si)(sizeof(sljit_sw)); offs -= (sljit_s32)(sizeof(sljit_sw));
FAIL_IF(push_inst(compiler, STACK_STORE | S(i) | A(SLJIT_SP) | IMM(offs))); FAIL_IF(push_inst(compiler, STACK_STORE | S(i) | A(SLJIT_SP) | IMM(offs)));
} }
SLJIT_ASSERT(offs == -(sljit_si)GET_SAVED_REGISTERS_SIZE(compiler->scratches, compiler->saveds, 1)); SLJIT_ASSERT(offs == -(sljit_s32)GET_SAVED_REGISTERS_SIZE(compiler->scratches, compiler->saveds, 1));
#if (defined SLJIT_PPC_STACK_FRAME_V2 && SLJIT_PPC_STACK_FRAME_V2) #if (defined SLJIT_PPC_STACK_FRAME_V2 && SLJIT_PPC_STACK_FRAME_V2)
FAIL_IF(push_inst(compiler, STACK_STORE | S(0) | A(SLJIT_SP) | IMM(2 * sizeof(sljit_sw)))); FAIL_IF(push_inst(compiler, STACK_STORE | S(0) | A(SLJIT_SP) | IMM(2 * sizeof(sljit_sw))));
@ -635,9 +639,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_set_context(struct sljit_compiler *compiler, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler,
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds, sljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 saveds,
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size) sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
{ {
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size)); CHECK(check_sljit_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size));
@ -648,9 +652,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_set_context(struct sljit_compiler *compi
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compiler, sljit_si op, sljit_si src, sljit_sw srcw) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw)
{ {
sljit_si i, tmp, offs; sljit_s32 i, tmp, offs;
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_return(compiler, op, src, srcw)); CHECK(check_sljit_emit_return(compiler, op, src, srcw));
@ -670,18 +674,18 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compi
FAIL_IF(push_inst(compiler, STACK_LOAD | D(0) | A(SLJIT_SP) | IMM(sizeof(sljit_sw)))); FAIL_IF(push_inst(compiler, STACK_LOAD | D(0) | A(SLJIT_SP) | IMM(sizeof(sljit_sw))));
#endif #endif
offs = -(sljit_si)GET_SAVED_REGISTERS_SIZE(compiler->scratches, compiler->saveds, 1); offs = -(sljit_s32)GET_SAVED_REGISTERS_SIZE(compiler->scratches, compiler->saveds, 1);
tmp = compiler->scratches; tmp = compiler->scratches;
for (i = SLJIT_FIRST_SAVED_REG; i <= tmp; i++) { for (i = SLJIT_FIRST_SAVED_REG; i <= tmp; i++) {
FAIL_IF(push_inst(compiler, STACK_LOAD | D(i) | A(SLJIT_SP) | IMM(offs))); FAIL_IF(push_inst(compiler, STACK_LOAD | D(i) | A(SLJIT_SP) | IMM(offs)));
offs += (sljit_si)(sizeof(sljit_sw)); offs += (sljit_s32)(sizeof(sljit_sw));
} }
tmp = compiler->saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - compiler->saveds) : SLJIT_FIRST_SAVED_REG; tmp = compiler->saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - compiler->saveds) : SLJIT_FIRST_SAVED_REG;
for (i = tmp; i <= SLJIT_S0; i++) { for (i = tmp; i <= SLJIT_S0; i++) {
FAIL_IF(push_inst(compiler, STACK_LOAD | D(i) | A(SLJIT_SP) | IMM(offs))); FAIL_IF(push_inst(compiler, STACK_LOAD | D(i) | A(SLJIT_SP) | IMM(offs)));
offs += (sljit_si)(sizeof(sljit_sw)); offs += (sljit_s32)(sizeof(sljit_sw));
} }
FAIL_IF(push_inst(compiler, STACK_LOAD | D(TMP_ZERO) | A(SLJIT_SP) | IMM(offs))); FAIL_IF(push_inst(compiler, STACK_LOAD | D(TMP_ZERO) | A(SLJIT_SP) | IMM(offs)));
@ -722,7 +726,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compi
(((inst) & ~(INT_ALIGNED | UPDATE_REQ)) | (((flags) & MEM_MASK) <= GPR_REG ? D(reg) : FD(reg))) (((inst) & ~(INT_ALIGNED | UPDATE_REQ)) | (((flags) & MEM_MASK) <= GPR_REG ? D(reg) : FD(reg)))
#endif #endif
static SLJIT_CONST sljit_ins data_transfer_insts[64 + 8] = { static const sljit_ins data_transfer_insts[64 + 8] = {
/* -------- Unsigned -------- */ /* -------- Unsigned -------- */
@ -841,7 +845,7 @@ static SLJIT_CONST sljit_ins data_transfer_insts[64 + 8] = {
#undef ARCH_32_64 #undef ARCH_32_64
/* Simple cases, (no caching is required). */ /* Simple cases, (no caching is required). */
static sljit_si getput_arg_fast(struct sljit_compiler *compiler, sljit_si inp_flags, sljit_si reg, sljit_si arg, sljit_sw argw) static sljit_s32 getput_arg_fast(struct sljit_compiler *compiler, sljit_s32 inp_flags, sljit_s32 reg, sljit_s32 arg, sljit_sw argw)
{ {
sljit_ins inst; sljit_ins inst;
@ -891,7 +895,7 @@ static sljit_si getput_arg_fast(struct sljit_compiler *compiler, sljit_si inp_fl
/* See getput_arg below. /* See getput_arg below.
Note: can_cache is called only for binary operators. Those operator always Note: can_cache is called only for binary operators. Those operator always
uses word arguments without write back. */ uses word arguments without write back. */
static sljit_si can_cache(sljit_si arg, sljit_sw argw, sljit_si next_arg, sljit_sw next_argw) static sljit_s32 can_cache(sljit_s32 arg, sljit_sw argw, sljit_s32 next_arg, sljit_sw next_argw)
{ {
sljit_sw high_short, next_high_short; sljit_sw high_short, next_high_short;
#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
@ -940,9 +944,9 @@ static sljit_si can_cache(sljit_si arg, sljit_sw argw, sljit_si next_arg, sljit_
#endif #endif
/* Emit the necessary instructions. See can_cache above. */ /* Emit the necessary instructions. See can_cache above. */
static sljit_si getput_arg(struct sljit_compiler *compiler, sljit_si inp_flags, sljit_si reg, sljit_si arg, sljit_sw argw, sljit_si next_arg, sljit_sw next_argw) static sljit_s32 getput_arg(struct sljit_compiler *compiler, sljit_s32 inp_flags, sljit_s32 reg, sljit_s32 arg, sljit_sw argw, sljit_s32 next_arg, sljit_sw next_argw)
{ {
sljit_si tmp_r; sljit_s32 tmp_r;
sljit_ins inst; sljit_ins inst;
sljit_sw high_short, next_high_short; sljit_sw high_short, next_high_short;
#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
@ -992,7 +996,7 @@ static sljit_si getput_arg(struct sljit_compiler *compiler, sljit_si inp_flags,
#endif #endif
arg &= REG_MASK; arg &= REG_MASK;
high_short = (sljit_si)(argw + ((argw & 0x8000) << 1)) & ~0xffff; high_short = (sljit_s32)(argw + ((argw & 0x8000) << 1)) & ~0xffff;
/* The getput_arg_fast should handle this otherwise. */ /* The getput_arg_fast should handle this otherwise. */
#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
SLJIT_ASSERT(high_short && high_short <= 0x7fffffffl && high_short >= -0x80000000l); SLJIT_ASSERT(high_short && high_short <= 0x7fffffffl && high_short >= -0x80000000l);
@ -1010,7 +1014,7 @@ static sljit_si getput_arg(struct sljit_compiler *compiler, sljit_si inp_flags,
} }
else if (compiler->cache_arg != (SLJIT_MEM | arg) || high_short != compiler->cache_argw) { else if (compiler->cache_arg != (SLJIT_MEM | arg) || high_short != compiler->cache_argw) {
if ((next_arg & SLJIT_MEM) && !(next_arg & OFFS_REG_MASK)) { if ((next_arg & SLJIT_MEM) && !(next_arg & OFFS_REG_MASK)) {
next_high_short = (sljit_si)(next_argw + ((next_argw & 0x8000) << 1)) & ~0xffff; next_high_short = (sljit_s32)(next_argw + ((next_argw & 0x8000) << 1)) & ~0xffff;
if (high_short == next_high_short) { if (high_short == next_high_short) {
compiler->cache_arg = SLJIT_MEM | arg; compiler->cache_arg = SLJIT_MEM | arg;
compiler->cache_argw = high_short; compiler->cache_argw = high_short;
@ -1107,27 +1111,27 @@ static sljit_si getput_arg(struct sljit_compiler *compiler, sljit_si inp_flags,
#endif #endif
} }
static SLJIT_INLINE sljit_si emit_op_mem2(struct sljit_compiler *compiler, sljit_si flags, sljit_si reg, sljit_si arg1, sljit_sw arg1w, sljit_si arg2, sljit_sw arg2w) static SLJIT_INLINE sljit_s32 emit_op_mem2(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg1, sljit_sw arg1w, sljit_s32 arg2, sljit_sw arg2w)
{ {
if (getput_arg_fast(compiler, flags, reg, arg1, arg1w)) if (getput_arg_fast(compiler, flags, reg, arg1, arg1w))
return compiler->error; return compiler->error;
return getput_arg(compiler, flags, reg, arg1, arg1w, arg2, arg2w); return getput_arg(compiler, flags, reg, arg1, arg1w, arg2, arg2w);
} }
static sljit_si emit_op(struct sljit_compiler *compiler, sljit_si op, sljit_si input_flags, static sljit_s32 emit_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 input_flags,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src1, sljit_sw src1w, sljit_s32 src1, sljit_sw src1w,
sljit_si src2, sljit_sw src2w) sljit_s32 src2, sljit_sw src2w)
{ {
/* arg1 goes to TMP_REG1 or src reg /* arg1 goes to TMP_REG1 or src reg
arg2 goes to TMP_REG2, imm or src reg arg2 goes to TMP_REG2, imm or src reg
TMP_REG3 can be used for caching TMP_REG3 can be used for caching
result goes to TMP_REG2, so put result can use TMP_REG1 and TMP_REG3. */ result goes to TMP_REG2, so put result can use TMP_REG1 and TMP_REG3. */
sljit_si dst_r; sljit_s32 dst_r;
sljit_si src1_r; sljit_s32 src1_r;
sljit_si src2_r; sljit_s32 src2_r;
sljit_si sugg_src2_r = TMP_REG2; sljit_s32 sugg_src2_r = TMP_REG2;
sljit_si flags = input_flags & (ALT_FORM1 | ALT_FORM2 | ALT_FORM3 | ALT_FORM4 | ALT_FORM5 | ALT_FORM6 | ALT_SIGN_EXT | ALT_SET_FLAGS); sljit_s32 flags = input_flags & (ALT_FORM1 | ALT_FORM2 | ALT_FORM3 | ALT_FORM4 | ALT_FORM5 | ALT_FORM6 | ALT_SIGN_EXT | ALT_SET_FLAGS);
if (!(input_flags & ALT_KEEP_CACHE)) { if (!(input_flags & ALT_KEEP_CACHE)) {
compiler->cache_arg = 0; compiler->cache_arg = 0;
@ -1136,14 +1140,14 @@ static sljit_si emit_op(struct sljit_compiler *compiler, sljit_si op, sljit_si i
/* Destination check. */ /* Destination check. */
if (SLJIT_UNLIKELY(dst == SLJIT_UNUSED)) { if (SLJIT_UNLIKELY(dst == SLJIT_UNUSED)) {
if (op >= SLJIT_MOV && op <= SLJIT_MOVU_SI && !(src2 & SLJIT_MEM)) if (op >= SLJIT_MOV && op <= SLJIT_MOVU_S32 && !(src2 & SLJIT_MEM))
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
dst_r = TMP_REG2; dst_r = TMP_REG2;
} }
else if (FAST_IS_REG(dst)) { else if (FAST_IS_REG(dst)) {
dst_r = dst; dst_r = dst;
flags |= REG_DEST; flags |= REG_DEST;
if (op >= SLJIT_MOV && op <= SLJIT_MOVU_SI) if (op >= SLJIT_MOV && op <= SLJIT_MOVU_S32)
sugg_src2_r = dst_r; sugg_src2_r = dst_r;
} }
else { else {
@ -1178,7 +1182,7 @@ static sljit_si emit_op(struct sljit_compiler *compiler, sljit_si op, sljit_si i
if (FAST_IS_REG(src2)) { if (FAST_IS_REG(src2)) {
src2_r = src2; src2_r = src2;
flags |= REG2_SOURCE; flags |= REG2_SOURCE;
if (!(flags & REG_DEST) && op >= SLJIT_MOV && op <= SLJIT_MOVU_SI) if (!(flags & REG_DEST) && op >= SLJIT_MOV && op <= SLJIT_MOVU_S32)
dst_r = src2_r; dst_r = src2_r;
} }
else if (src2 & SLJIT_IMM) { else if (src2 & SLJIT_IMM) {
@ -1243,10 +1247,10 @@ static sljit_si emit_op(struct sljit_compiler *compiler, sljit_si op, sljit_si i
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler, sljit_si op) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op)
{ {
#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
sljit_si int_op = op & SLJIT_INT_OP; sljit_s32 int_op = op & SLJIT_I32_OP;
#endif #endif
CHECK_ERROR(); CHECK_ERROR();
@ -1257,33 +1261,33 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler
case SLJIT_BREAKPOINT: case SLJIT_BREAKPOINT:
case SLJIT_NOP: case SLJIT_NOP:
return push_inst(compiler, NOP); return push_inst(compiler, NOP);
case SLJIT_LUMUL: case SLJIT_LMUL_UW:
case SLJIT_LSMUL: case SLJIT_LMUL_SW:
FAIL_IF(push_inst(compiler, OR | S(SLJIT_R0) | A(TMP_REG1) | B(SLJIT_R0))); FAIL_IF(push_inst(compiler, OR | S(SLJIT_R0) | A(TMP_REG1) | B(SLJIT_R0)));
#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
FAIL_IF(push_inst(compiler, MULLD | D(SLJIT_R0) | A(TMP_REG1) | B(SLJIT_R1))); FAIL_IF(push_inst(compiler, MULLD | D(SLJIT_R0) | A(TMP_REG1) | B(SLJIT_R1)));
return push_inst(compiler, (op == SLJIT_LUMUL ? MULHDU : MULHD) | D(SLJIT_R1) | A(TMP_REG1) | B(SLJIT_R1)); return push_inst(compiler, (op == SLJIT_LMUL_UW ? MULHDU : MULHD) | D(SLJIT_R1) | A(TMP_REG1) | B(SLJIT_R1));
#else #else
FAIL_IF(push_inst(compiler, MULLW | D(SLJIT_R0) | A(TMP_REG1) | B(SLJIT_R1))); FAIL_IF(push_inst(compiler, MULLW | D(SLJIT_R0) | A(TMP_REG1) | B(SLJIT_R1)));
return push_inst(compiler, (op == SLJIT_LUMUL ? MULHWU : MULHW) | D(SLJIT_R1) | A(TMP_REG1) | B(SLJIT_R1)); return push_inst(compiler, (op == SLJIT_LMUL_UW ? MULHWU : MULHW) | D(SLJIT_R1) | A(TMP_REG1) | B(SLJIT_R1));
#endif #endif
case SLJIT_UDIVMOD: case SLJIT_DIVMOD_UW:
case SLJIT_SDIVMOD: case SLJIT_DIVMOD_SW:
FAIL_IF(push_inst(compiler, OR | S(SLJIT_R0) | A(TMP_REG1) | B(SLJIT_R0))); FAIL_IF(push_inst(compiler, OR | S(SLJIT_R0) | A(TMP_REG1) | B(SLJIT_R0)));
#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
FAIL_IF(push_inst(compiler, (int_op ? (op == SLJIT_UDIVMOD ? DIVWU : DIVW) : (op == SLJIT_UDIVMOD ? DIVDU : DIVD)) | D(SLJIT_R0) | A(SLJIT_R0) | B(SLJIT_R1))); FAIL_IF(push_inst(compiler, (int_op ? (op == SLJIT_DIVMOD_UW ? DIVWU : DIVW) : (op == SLJIT_DIVMOD_UW ? DIVDU : DIVD)) | D(SLJIT_R0) | A(SLJIT_R0) | B(SLJIT_R1)));
FAIL_IF(push_inst(compiler, (int_op ? MULLW : MULLD) | D(SLJIT_R1) | A(SLJIT_R0) | B(SLJIT_R1))); FAIL_IF(push_inst(compiler, (int_op ? MULLW : MULLD) | D(SLJIT_R1) | A(SLJIT_R0) | B(SLJIT_R1)));
#else #else
FAIL_IF(push_inst(compiler, (op == SLJIT_UDIVMOD ? DIVWU : DIVW) | D(SLJIT_R0) | A(SLJIT_R0) | B(SLJIT_R1))); FAIL_IF(push_inst(compiler, (op == SLJIT_DIVMOD_UW ? DIVWU : DIVW) | D(SLJIT_R0) | A(SLJIT_R0) | B(SLJIT_R1)));
FAIL_IF(push_inst(compiler, MULLW | D(SLJIT_R1) | A(SLJIT_R0) | B(SLJIT_R1))); FAIL_IF(push_inst(compiler, MULLW | D(SLJIT_R1) | A(SLJIT_R0) | B(SLJIT_R1)));
#endif #endif
return push_inst(compiler, SUBF | D(SLJIT_R1) | A(SLJIT_R1) | B(TMP_REG1)); return push_inst(compiler, SUBF | D(SLJIT_R1) | A(SLJIT_R1) | B(TMP_REG1));
case SLJIT_UDIVI: case SLJIT_DIV_UW:
case SLJIT_SDIVI: case SLJIT_DIV_SW:
#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
return push_inst(compiler, (int_op ? (op == SLJIT_UDIVI ? DIVWU : DIVW) : (op == SLJIT_UDIVI ? DIVDU : DIVD)) | D(SLJIT_R0) | A(SLJIT_R0) | B(SLJIT_R1)); return push_inst(compiler, (int_op ? (op == SLJIT_DIV_UW ? DIVWU : DIVW) : (op == SLJIT_DIV_UW ? DIVDU : DIVD)) | D(SLJIT_R0) | A(SLJIT_R0) | B(SLJIT_R1));
#else #else
return push_inst(compiler, (op == SLJIT_UDIVI ? DIVWU : DIVW) | D(SLJIT_R0) | A(SLJIT_R0) | B(SLJIT_R1)); return push_inst(compiler, (op == SLJIT_DIV_UW ? DIVWU : DIVW) | D(SLJIT_R0) | A(SLJIT_R0) | B(SLJIT_R1));
#endif #endif
} }
@ -1293,12 +1297,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler
#define EMIT_MOV(type, type_flags, type_cast) \ #define EMIT_MOV(type, type_flags, type_cast) \
emit_op(compiler, (src & SLJIT_IMM) ? SLJIT_MOV : type, flags | (type_flags), dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? type_cast srcw : srcw) emit_op(compiler, (src & SLJIT_IMM) ? SLJIT_MOV : type, flags | (type_flags), dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? type_cast srcw : srcw)
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler, sljit_si op, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src, sljit_sw srcw) sljit_s32 src, sljit_sw srcw)
{ {
sljit_si flags = GET_FLAGS(op) ? ALT_SET_FLAGS : 0; sljit_s32 flags = GET_FLAGS(op) ? ALT_SET_FLAGS : 0;
sljit_si op_flags = GET_ALL_FLAGS(op); sljit_s32 op_flags = GET_ALL_FLAGS(op);
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw)); CHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw));
@ -1312,21 +1316,21 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler
if (op_flags & SLJIT_SET_O) if (op_flags & SLJIT_SET_O)
FAIL_IF(push_inst(compiler, MTXER | S(TMP_ZERO))); FAIL_IF(push_inst(compiler, MTXER | S(TMP_ZERO)));
if (op_flags & SLJIT_INT_OP) { if (op_flags & SLJIT_I32_OP) {
if (op < SLJIT_NOT) { if (op < SLJIT_NOT) {
if (FAST_IS_REG(src) && src == dst) { if (FAST_IS_REG(src) && src == dst) {
if (!TYPE_CAST_NEEDED(op)) if (!TYPE_CAST_NEEDED(op))
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
if (op == SLJIT_MOV_SI && (src & SLJIT_MEM)) if (op == SLJIT_MOV_S32 && (src & SLJIT_MEM))
op = SLJIT_MOV_UI; op = SLJIT_MOV_U32;
if (op == SLJIT_MOVU_SI && (src & SLJIT_MEM)) if (op == SLJIT_MOVU_S32 && (src & SLJIT_MEM))
op = SLJIT_MOVU_UI; op = SLJIT_MOVU_U32;
if (op == SLJIT_MOV_UI && (src & SLJIT_IMM)) if (op == SLJIT_MOV_U32 && (src & SLJIT_IMM))
op = SLJIT_MOV_SI; op = SLJIT_MOV_S32;
if (op == SLJIT_MOVU_UI && (src & SLJIT_IMM)) if (op == SLJIT_MOVU_U32 && (src & SLJIT_IMM))
op = SLJIT_MOVU_SI; op = SLJIT_MOVU_S32;
#endif #endif
} }
#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
@ -1334,7 +1338,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler
/* Most operations expect sign extended arguments. */ /* Most operations expect sign extended arguments. */
flags |= INT_DATA | SIGNED_DATA; flags |= INT_DATA | SIGNED_DATA;
if (src & SLJIT_IMM) if (src & SLJIT_IMM)
srcw = (sljit_si)srcw; srcw = (sljit_s32)srcw;
} }
#endif #endif
} }
@ -1343,58 +1347,58 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler
case SLJIT_MOV: case SLJIT_MOV:
case SLJIT_MOV_P: case SLJIT_MOV_P:
#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) #if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)
case SLJIT_MOV_UI: case SLJIT_MOV_U32:
case SLJIT_MOV_SI: case SLJIT_MOV_S32:
#endif #endif
return emit_op(compiler, SLJIT_MOV, flags | WORD_DATA, dst, dstw, TMP_REG1, 0, src, srcw); return emit_op(compiler, SLJIT_MOV, flags | WORD_DATA, dst, dstw, TMP_REG1, 0, src, srcw);
#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
case SLJIT_MOV_UI: case SLJIT_MOV_U32:
return EMIT_MOV(SLJIT_MOV_UI, INT_DATA, (sljit_ui)); return EMIT_MOV(SLJIT_MOV_U32, INT_DATA, (sljit_u32));
case SLJIT_MOV_SI: case SLJIT_MOV_S32:
return EMIT_MOV(SLJIT_MOV_SI, INT_DATA | SIGNED_DATA, (sljit_si)); return EMIT_MOV(SLJIT_MOV_S32, INT_DATA | SIGNED_DATA, (sljit_s32));
#endif #endif
case SLJIT_MOV_UB: case SLJIT_MOV_U8:
return EMIT_MOV(SLJIT_MOV_UB, BYTE_DATA, (sljit_ub)); return EMIT_MOV(SLJIT_MOV_U8, BYTE_DATA, (sljit_u8));
case SLJIT_MOV_SB: case SLJIT_MOV_S8:
return EMIT_MOV(SLJIT_MOV_SB, BYTE_DATA | SIGNED_DATA, (sljit_sb)); return EMIT_MOV(SLJIT_MOV_S8, BYTE_DATA | SIGNED_DATA, (sljit_s8));
case SLJIT_MOV_UH: case SLJIT_MOV_U16:
return EMIT_MOV(SLJIT_MOV_UH, HALF_DATA, (sljit_uh)); return EMIT_MOV(SLJIT_MOV_U16, HALF_DATA, (sljit_u16));
case SLJIT_MOV_SH: case SLJIT_MOV_S16:
return EMIT_MOV(SLJIT_MOV_SH, HALF_DATA | SIGNED_DATA, (sljit_sh)); return EMIT_MOV(SLJIT_MOV_S16, HALF_DATA | SIGNED_DATA, (sljit_s16));
case SLJIT_MOVU: case SLJIT_MOVU:
case SLJIT_MOVU_P: case SLJIT_MOVU_P:
#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) #if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)
case SLJIT_MOVU_UI: case SLJIT_MOVU_U32:
case SLJIT_MOVU_SI: case SLJIT_MOVU_S32:
#endif #endif
return emit_op(compiler, SLJIT_MOV, flags | WORD_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, srcw); return emit_op(compiler, SLJIT_MOV, flags | WORD_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, srcw);
#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
case SLJIT_MOVU_UI: case SLJIT_MOVU_U32:
return EMIT_MOV(SLJIT_MOV_UI, INT_DATA | WRITE_BACK, (sljit_ui)); return EMIT_MOV(SLJIT_MOV_U32, INT_DATA | WRITE_BACK, (sljit_u32));
case SLJIT_MOVU_SI: case SLJIT_MOVU_S32:
return EMIT_MOV(SLJIT_MOV_SI, INT_DATA | SIGNED_DATA | WRITE_BACK, (sljit_si)); return EMIT_MOV(SLJIT_MOV_S32, INT_DATA | SIGNED_DATA | WRITE_BACK, (sljit_s32));
#endif #endif
case SLJIT_MOVU_UB: case SLJIT_MOVU_U8:
return EMIT_MOV(SLJIT_MOV_UB, BYTE_DATA | WRITE_BACK, (sljit_ub)); return EMIT_MOV(SLJIT_MOV_U8, BYTE_DATA | WRITE_BACK, (sljit_u8));
case SLJIT_MOVU_SB: case SLJIT_MOVU_S8:
return EMIT_MOV(SLJIT_MOV_SB, BYTE_DATA | SIGNED_DATA | WRITE_BACK, (sljit_sb)); return EMIT_MOV(SLJIT_MOV_S8, BYTE_DATA | SIGNED_DATA | WRITE_BACK, (sljit_s8));
case SLJIT_MOVU_UH: case SLJIT_MOVU_U16:
return EMIT_MOV(SLJIT_MOV_UH, HALF_DATA | WRITE_BACK, (sljit_uh)); return EMIT_MOV(SLJIT_MOV_U16, HALF_DATA | WRITE_BACK, (sljit_u16));
case SLJIT_MOVU_SH: case SLJIT_MOVU_S16:
return EMIT_MOV(SLJIT_MOV_SH, HALF_DATA | SIGNED_DATA | WRITE_BACK, (sljit_sh)); return EMIT_MOV(SLJIT_MOV_S16, HALF_DATA | SIGNED_DATA | WRITE_BACK, (sljit_s16));
case SLJIT_NOT: case SLJIT_NOT:
return emit_op(compiler, SLJIT_NOT, flags, dst, dstw, TMP_REG1, 0, src, srcw); return emit_op(compiler, SLJIT_NOT, flags, dst, dstw, TMP_REG1, 0, src, srcw);
@ -1404,7 +1408,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler
case SLJIT_CLZ: case SLJIT_CLZ:
#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
return emit_op(compiler, SLJIT_CLZ, flags | (!(op_flags & SLJIT_INT_OP) ? 0 : ALT_FORM1), dst, dstw, TMP_REG1, 0, src, srcw); return emit_op(compiler, SLJIT_CLZ, flags | (!(op_flags & SLJIT_I32_OP) ? 0 : ALT_FORM1), dst, dstw, TMP_REG1, 0, src, srcw);
#else #else
return emit_op(compiler, SLJIT_CLZ, flags, dst, dstw, TMP_REG1, 0, src, srcw); return emit_op(compiler, SLJIT_CLZ, flags, dst, dstw, TMP_REG1, 0, src, srcw);
#endif #endif
@ -1448,12 +1452,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler
((src) & SLJIT_IMM) ((src) & SLJIT_IMM)
#endif #endif
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler, sljit_si op, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src1, sljit_sw src1w, sljit_s32 src1, sljit_sw src1w,
sljit_si src2, sljit_sw src2w) sljit_s32 src2, sljit_sw src2w)
{ {
sljit_si flags = GET_FLAGS(op) ? ALT_SET_FLAGS : 0; sljit_s32 flags = GET_FLAGS(op) ? ALT_SET_FLAGS : 0;
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_op2(compiler, op, dst, dstw, src1, src1w, src2, src2w)); CHECK(check_sljit_emit_op2(compiler, op, dst, dstw, src1, src1w, src2, src2w));
@ -1467,13 +1471,13 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler
src2 = TMP_ZERO; src2 = TMP_ZERO;
#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
if (op & SLJIT_INT_OP) { if (op & SLJIT_I32_OP) {
/* Most operations expect sign extended arguments. */ /* Most operations expect sign extended arguments. */
flags |= INT_DATA | SIGNED_DATA; flags |= INT_DATA | SIGNED_DATA;
if (src1 & SLJIT_IMM) if (src1 & SLJIT_IMM)
src1w = (sljit_si)(src1w); src1w = (sljit_s32)(src1w);
if (src2 & SLJIT_IMM) if (src2 & SLJIT_IMM)
src2w = (sljit_si)(src2w); src2w = (sljit_s32)(src2w);
if (GET_FLAGS(op)) if (GET_FLAGS(op))
flags |= ALT_SIGN_EXT; flags |= ALT_SIGN_EXT;
} }
@ -1549,7 +1553,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler
} }
if (dst == SLJIT_UNUSED && (op & (SLJIT_SET_E | SLJIT_SET_U | SLJIT_SET_S)) && !(op & (SLJIT_SET_O | SLJIT_SET_C))) { if (dst == SLJIT_UNUSED && (op & (SLJIT_SET_E | SLJIT_SET_U | SLJIT_SET_S)) && !(op & (SLJIT_SET_O | SLJIT_SET_C))) {
if (!(op & SLJIT_SET_U)) { if (!(op & SLJIT_SET_U)) {
/* We know ALT_SIGN_EXT is set if it is an SLJIT_INT_OP on 64 bit systems. */ /* We know ALT_SIGN_EXT is set if it is an SLJIT_I32_OP on 64 bit systems. */
if (TEST_SL_IMM(src2, src2w)) { if (TEST_SL_IMM(src2, src2w)) {
compiler->imm = src2w & 0xffff; compiler->imm = src2w & 0xffff;
return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM2, dst, dstw, src1, src1w, TMP_REG2, 0); return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM2, dst, dstw, src1, src1w, TMP_REG2, 0);
@ -1560,7 +1564,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler
} }
} }
if (!(op & (SLJIT_SET_E | SLJIT_SET_S))) { if (!(op & (SLJIT_SET_E | SLJIT_SET_S))) {
/* We know ALT_SIGN_EXT is set if it is an SLJIT_INT_OP on 64 bit systems. */ /* We know ALT_SIGN_EXT is set if it is an SLJIT_I32_OP on 64 bit systems. */
if (TEST_UL_IMM(src2, src2w)) { if (TEST_UL_IMM(src2, src2w)) {
compiler->imm = src2w & 0xffff; compiler->imm = src2w & 0xffff;
return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM3, dst, dstw, src1, src1w, TMP_REG2, 0); return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM3, dst, dstw, src1, src1w, TMP_REG2, 0);
@ -1579,7 +1583,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler
return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM3, dst, dstw, src1, src1w, TMP_REG2, 0); return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM3, dst, dstw, src1, src1w, TMP_REG2, 0);
} }
} }
/* We know ALT_SIGN_EXT is set if it is an SLJIT_INT_OP on 64 bit systems. */ /* We know ALT_SIGN_EXT is set if it is an SLJIT_I32_OP on 64 bit systems. */
return emit_op(compiler, SLJIT_SUB, flags | (!(op & SLJIT_SET_U) ? 0 : ALT_FORM6), dst, dstw, src1, src1w, src2, src2w); return emit_op(compiler, SLJIT_SUB, flags | (!(op & SLJIT_SET_U) ? 0 : ALT_FORM6), dst, dstw, src1, src1w, src2, src2w);
case SLJIT_SUBC: case SLJIT_SUBC:
@ -1587,7 +1591,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler
case SLJIT_MUL: case SLJIT_MUL:
#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
if (op & SLJIT_INT_OP) if (op & SLJIT_I32_OP)
flags |= ALT_FORM2; flags |= ALT_FORM2;
#endif #endif
if (!GET_FLAGS(op)) { if (!GET_FLAGS(op)) {
@ -1643,7 +1647,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler
case SLJIT_SHL: case SLJIT_SHL:
case SLJIT_LSHR: case SLJIT_LSHR:
#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
if (op & SLJIT_INT_OP) if (op & SLJIT_I32_OP)
flags |= ALT_FORM2; flags |= ALT_FORM2;
#endif #endif
if (src2 & SLJIT_IMM) { if (src2 & SLJIT_IMM) {
@ -1656,20 +1660,20 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_register_index(sljit_si reg) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg)
{ {
CHECK_REG_INDEX(check_sljit_get_register_index(reg)); CHECK_REG_INDEX(check_sljit_get_register_index(reg));
return reg_map[reg]; return reg_map[reg];
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_float_register_index(sljit_si reg) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg)
{ {
CHECK_REG_INDEX(check_sljit_get_float_register_index(reg)); CHECK_REG_INDEX(check_sljit_get_float_register_index(reg));
return reg; return reg;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_custom(struct sljit_compiler *compiler, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler,
void *instruction, sljit_si size) void *instruction, sljit_s32 size)
{ {
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_op_custom(compiler, instruction, size)); CHECK(check_sljit_emit_op_custom(compiler, instruction, size));
@ -1681,7 +1685,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_custom(struct sljit_compiler *co
/* Floating point operators */ /* Floating point operators */
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_is_fpu_available(void) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_is_fpu_available(void)
{ {
#ifdef SLJIT_IS_FPU_AVAILABLE #ifdef SLJIT_IS_FPU_AVAILABLE
return SLJIT_IS_FPU_AVAILABLE; return SLJIT_IS_FPU_AVAILABLE;
@ -1691,8 +1695,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_is_fpu_available(void)
#endif #endif
} }
#define FLOAT_DATA(op) (DOUBLE_DATA | ((op & SLJIT_SINGLE_OP) >> 6)) #define FLOAT_DATA(op) (DOUBLE_DATA | ((op & SLJIT_F32_OP) >> 6))
#define SELECT_FOP(op, single, double) ((op & SLJIT_SINGLE_OP) ? single : double) #define SELECT_FOP(op, single, double) ((op & SLJIT_F32_OP) ? single : double)
#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
#define FLOAT_TMP_MEM_OFFSET (6 * sizeof(sljit_sw)) #define FLOAT_TMP_MEM_OFFSET (6 * sizeof(sljit_sw))
@ -1709,9 +1713,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_is_fpu_available(void)
#endif /* SLJIT_CONFIG_PPC_64 */ #endif /* SLJIT_CONFIG_PPC_64 */
static SLJIT_INLINE sljit_si sljit_emit_fop1_convw_fromd(struct sljit_compiler *compiler, sljit_si op, static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src, sljit_sw srcw) sljit_s32 src, sljit_sw srcw)
{ {
if (src & SLJIT_MEM) { if (src & SLJIT_MEM) {
/* We can ignore the temporary data store on the stack from caching point of view. */ /* We can ignore the temporary data store on the stack from caching point of view. */
@ -1721,12 +1725,12 @@ static SLJIT_INLINE sljit_si sljit_emit_fop1_convw_fromd(struct sljit_compiler *
#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
op = GET_OPCODE(op); op = GET_OPCODE(op);
FAIL_IF(push_inst(compiler, (op == SLJIT_CONVI_FROMD ? FCTIWZ : FCTIDZ) | FD(TMP_FREG1) | FB(src))); FAIL_IF(push_inst(compiler, (op == SLJIT_CONV_S32_FROM_F64 ? FCTIWZ : FCTIDZ) | FD(TMP_FREG1) | FB(src)));
if (dst == SLJIT_UNUSED) if (dst == SLJIT_UNUSED)
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
if (op == SLJIT_CONVW_FROMD) { if (op == SLJIT_CONV_SW_FROM_F64) {
if (FAST_IS_REG(dst)) { if (FAST_IS_REG(dst)) {
FAIL_IF(emit_op_mem2(compiler, DOUBLE_DATA, TMP_FREG1, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET, 0, 0)); FAIL_IF(emit_op_mem2(compiler, DOUBLE_DATA, TMP_FREG1, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET, 0, 0));
return emit_op_mem2(compiler, WORD_DATA | LOAD_DATA, dst, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET, 0, 0); return emit_op_mem2(compiler, WORD_DATA | LOAD_DATA, dst, SLJIT_MEM1(SLJIT_SP), FLOAT_TMP_MEM_OFFSET, 0, 0);
@ -1777,21 +1781,21 @@ static SLJIT_INLINE sljit_si sljit_emit_fop1_convw_fromd(struct sljit_compiler *
return push_inst(compiler, STFIWX | FS(TMP_FREG1) | A(dst & REG_MASK) | B(dstw)); return push_inst(compiler, STFIWX | FS(TMP_FREG1) | A(dst & REG_MASK) | B(dstw));
} }
static SLJIT_INLINE sljit_si sljit_emit_fop1_convd_fromw(struct sljit_compiler *compiler, sljit_si op, static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src, sljit_sw srcw) sljit_s32 src, sljit_sw srcw)
{ {
#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
sljit_si dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;
if (src & SLJIT_IMM) { if (src & SLJIT_IMM) {
if (GET_OPCODE(op) == SLJIT_CONVD_FROMI) if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32)
srcw = (sljit_si)srcw; srcw = (sljit_s32)srcw;
FAIL_IF(load_immediate(compiler, TMP_REG1, srcw)); FAIL_IF(load_immediate(compiler, TMP_REG1, srcw));
src = TMP_REG1; src = TMP_REG1;
} }
else if (GET_OPCODE(op) == SLJIT_CONVD_FROMI) { else if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32) {
if (FAST_IS_REG(src)) if (FAST_IS_REG(src))
FAIL_IF(push_inst(compiler, EXTSW | S(src) | A(TMP_REG1))); FAIL_IF(push_inst(compiler, EXTSW | S(src) | A(TMP_REG1)));
else else
@ -1810,14 +1814,14 @@ static SLJIT_INLINE sljit_si sljit_emit_fop1_convd_fromw(struct sljit_compiler *
if (dst & SLJIT_MEM) if (dst & SLJIT_MEM)
return emit_op_mem2(compiler, FLOAT_DATA(op), TMP_FREG1, dst, dstw, 0, 0); return emit_op_mem2(compiler, FLOAT_DATA(op), TMP_FREG1, dst, dstw, 0, 0);
if (op & SLJIT_SINGLE_OP) if (op & SLJIT_F32_OP)
return push_inst(compiler, FRSP | FD(dst_r) | FB(dst_r)); return push_inst(compiler, FRSP | FD(dst_r) | FB(dst_r));
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
#else #else
sljit_si dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; sljit_s32 dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;
sljit_si invert_sign = 1; sljit_s32 invert_sign = 1;
if (src & SLJIT_IMM) { if (src & SLJIT_IMM) {
FAIL_IF(load_immediate(compiler, TMP_REG1, srcw ^ 0x80000000)); FAIL_IF(load_immediate(compiler, TMP_REG1, srcw ^ 0x80000000));
@ -1848,16 +1852,16 @@ static SLJIT_INLINE sljit_si sljit_emit_fop1_convd_fromw(struct sljit_compiler *
if (dst & SLJIT_MEM) if (dst & SLJIT_MEM)
return emit_op_mem2(compiler, FLOAT_DATA(op), TMP_FREG1, dst, dstw, 0, 0); return emit_op_mem2(compiler, FLOAT_DATA(op), TMP_FREG1, dst, dstw, 0, 0);
if (op & SLJIT_SINGLE_OP) if (op & SLJIT_F32_OP)
return push_inst(compiler, FRSP | FD(dst_r) | FB(dst_r)); return push_inst(compiler, FRSP | FD(dst_r) | FB(dst_r));
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
#endif #endif
} }
static SLJIT_INLINE sljit_si sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_si op, static SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si src1, sljit_sw src1w, sljit_s32 src1, sljit_sw src1w,
sljit_si src2, sljit_sw src2w) sljit_s32 src2, sljit_sw src2w)
{ {
if (src1 & SLJIT_MEM) { if (src1 & SLJIT_MEM) {
FAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, src1, src1w, src2, src2w)); FAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, src1, src1w, src2, src2w));
@ -1872,21 +1876,21 @@ static SLJIT_INLINE sljit_si sljit_emit_fop1_cmp(struct sljit_compiler *compiler
return push_inst(compiler, FCMPU | CRD(4) | FA(src1) | FB(src2)); return push_inst(compiler, FCMPU | CRD(4) | FA(src1) | FB(src2));
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop1(struct sljit_compiler *compiler, sljit_si op, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src, sljit_sw srcw) sljit_s32 src, sljit_sw srcw)
{ {
sljit_si dst_r; sljit_s32 dst_r;
CHECK_ERROR(); CHECK_ERROR();
compiler->cache_arg = 0; compiler->cache_arg = 0;
compiler->cache_argw = 0; compiler->cache_argw = 0;
SLJIT_COMPILE_ASSERT((SLJIT_SINGLE_OP == 0x100) && !(DOUBLE_DATA & 0x4), float_transfer_bit_error); SLJIT_COMPILE_ASSERT((SLJIT_F32_OP == 0x100) && !(DOUBLE_DATA & 0x4), float_transfer_bit_error);
SELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw); SELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw);
if (GET_OPCODE(op) == SLJIT_CONVD_FROMS) if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_F32)
op ^= SLJIT_SINGLE_OP; op ^= SLJIT_F32_OP;
dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1; dst_r = FAST_IS_REG(dst) ? dst : TMP_FREG1;
@ -1896,14 +1900,14 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop1(struct sljit_compiler *compile
} }
switch (GET_OPCODE(op)) { switch (GET_OPCODE(op)) {
case SLJIT_CONVD_FROMS: case SLJIT_CONV_F64_FROM_F32:
op ^= SLJIT_SINGLE_OP; op ^= SLJIT_F32_OP;
if (op & SLJIT_SINGLE_OP) { if (op & SLJIT_F32_OP) {
FAIL_IF(push_inst(compiler, FRSP | FD(dst_r) | FB(src))); FAIL_IF(push_inst(compiler, FRSP | FD(dst_r) | FB(src)));
break; break;
} }
/* Fall through. */ /* Fall through. */
case SLJIT_DMOV: case SLJIT_MOV_F64:
if (src != dst_r) { if (src != dst_r) {
if (dst_r != TMP_FREG1) if (dst_r != TMP_FREG1)
FAIL_IF(push_inst(compiler, FMR | FD(dst_r) | FB(src))); FAIL_IF(push_inst(compiler, FMR | FD(dst_r) | FB(src)));
@ -1911,10 +1915,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop1(struct sljit_compiler *compile
dst_r = src; dst_r = src;
} }
break; break;
case SLJIT_DNEG: case SLJIT_NEG_F64:
FAIL_IF(push_inst(compiler, FNEG | FD(dst_r) | FB(src))); FAIL_IF(push_inst(compiler, FNEG | FD(dst_r) | FB(src)));
break; break;
case SLJIT_DABS: case SLJIT_ABS_F64:
FAIL_IF(push_inst(compiler, FABS | FD(dst_r) | FB(src))); FAIL_IF(push_inst(compiler, FABS | FD(dst_r) | FB(src)));
break; break;
} }
@ -1924,12 +1928,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop1(struct sljit_compiler *compile
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compiler, sljit_si op, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src1, sljit_sw src1w, sljit_s32 src1, sljit_sw src1w,
sljit_si src2, sljit_sw src2w) sljit_s32 src2, sljit_sw src2w)
{ {
sljit_si dst_r, flags = 0; sljit_s32 dst_r, flags = 0;
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_fop2(compiler, op, dst, dstw, src1, src1w, src2, src2w)); CHECK(check_sljit_emit_fop2(compiler, op, dst, dstw, src1, src1w, src2, src2w));
@ -1979,19 +1983,19 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compile
src2 = TMP_FREG2; src2 = TMP_FREG2;
switch (GET_OPCODE(op)) { switch (GET_OPCODE(op)) {
case SLJIT_DADD: case SLJIT_ADD_F64:
FAIL_IF(push_inst(compiler, SELECT_FOP(op, FADDS, FADD) | FD(dst_r) | FA(src1) | FB(src2))); FAIL_IF(push_inst(compiler, SELECT_FOP(op, FADDS, FADD) | FD(dst_r) | FA(src1) | FB(src2)));
break; break;
case SLJIT_DSUB: case SLJIT_SUB_F64:
FAIL_IF(push_inst(compiler, SELECT_FOP(op, FSUBS, FSUB) | FD(dst_r) | FA(src1) | FB(src2))); FAIL_IF(push_inst(compiler, SELECT_FOP(op, FSUBS, FSUB) | FD(dst_r) | FA(src1) | FB(src2)));
break; break;
case SLJIT_DMUL: case SLJIT_MUL_F64:
FAIL_IF(push_inst(compiler, SELECT_FOP(op, FMULS, FMUL) | FD(dst_r) | FA(src1) | FC(src2) /* FMUL use FC as src2 */)); FAIL_IF(push_inst(compiler, SELECT_FOP(op, FMULS, FMUL) | FD(dst_r) | FA(src1) | FC(src2) /* FMUL use FC as src2 */));
break; break;
case SLJIT_DDIV: case SLJIT_DIV_F64:
FAIL_IF(push_inst(compiler, SELECT_FOP(op, FDIVS, FDIV) | FD(dst_r) | FA(src1) | FB(src2))); FAIL_IF(push_inst(compiler, SELECT_FOP(op, FDIVS, FDIV) | FD(dst_r) | FA(src1) | FB(src2)));
break; break;
} }
@ -2009,7 +2013,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compile
/* Other instructions */ /* Other instructions */
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_si dst, sljit_sw dstw) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)
{ {
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw)); CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw));
@ -2027,7 +2031,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_enter(struct sljit_compiler *c
return emit_op(compiler, SLJIT_MOV, WORD_DATA, dst, dstw, TMP_REG1, 0, TMP_REG2, 0); return emit_op(compiler, SLJIT_MOV, WORD_DATA, dst, dstw, TMP_REG1, 0, TMP_REG2, 0);
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_si src, sljit_sw srcw) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw)
{ {
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_fast_return(compiler, src, srcw)); CHECK(check_sljit_emit_fast_return(compiler, src, srcw));
@ -2065,7 +2069,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compi
return label; return label;
} }
static sljit_ins get_bo_bi_flags(sljit_si type) static sljit_ins get_bo_bi_flags(sljit_s32 type)
{ {
switch (type) { switch (type) {
case SLJIT_EQUAL: case SLJIT_EQUAL:
@ -2075,19 +2079,19 @@ static sljit_ins get_bo_bi_flags(sljit_si type)
return (4 << 21) | (2 << 16); return (4 << 21) | (2 << 16);
case SLJIT_LESS: case SLJIT_LESS:
case SLJIT_D_LESS: case SLJIT_LESS_F64:
return (12 << 21) | ((4 + 0) << 16); return (12 << 21) | ((4 + 0) << 16);
case SLJIT_GREATER_EQUAL: case SLJIT_GREATER_EQUAL:
case SLJIT_D_GREATER_EQUAL: case SLJIT_GREATER_EQUAL_F64:
return (4 << 21) | ((4 + 0) << 16); return (4 << 21) | ((4 + 0) << 16);
case SLJIT_GREATER: case SLJIT_GREATER:
case SLJIT_D_GREATER: case SLJIT_GREATER_F64:
return (12 << 21) | ((4 + 1) << 16); return (12 << 21) | ((4 + 1) << 16);
case SLJIT_LESS_EQUAL: case SLJIT_LESS_EQUAL:
case SLJIT_D_LESS_EQUAL: case SLJIT_LESS_EQUAL_F64:
return (4 << 21) | ((4 + 1) << 16); return (4 << 21) | ((4 + 1) << 16);
case SLJIT_SIG_LESS: case SLJIT_SIG_LESS:
@ -2110,16 +2114,16 @@ static sljit_ins get_bo_bi_flags(sljit_si type)
case SLJIT_MUL_NOT_OVERFLOW: case SLJIT_MUL_NOT_OVERFLOW:
return (4 << 21) | (3 << 16); return (4 << 21) | (3 << 16);
case SLJIT_D_EQUAL: case SLJIT_EQUAL_F64:
return (12 << 21) | ((4 + 2) << 16); return (12 << 21) | ((4 + 2) << 16);
case SLJIT_D_NOT_EQUAL: case SLJIT_NOT_EQUAL_F64:
return (4 << 21) | ((4 + 2) << 16); return (4 << 21) | ((4 + 2) << 16);
case SLJIT_D_UNORDERED: case SLJIT_UNORDERED_F64:
return (12 << 21) | ((4 + 3) << 16); return (12 << 21) | ((4 + 3) << 16);
case SLJIT_D_ORDERED: case SLJIT_ORDERED_F64:
return (4 << 21) | ((4 + 3) << 16); return (4 << 21) | ((4 + 3) << 16);
default: default:
@ -2128,7 +2132,7 @@ static sljit_ins get_bo_bi_flags(sljit_si type)
} }
} }
SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_si type) SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type)
{ {
struct sljit_jump *jump; struct sljit_jump *jump;
sljit_ins bo_bi_flags; sljit_ins bo_bi_flags;
@ -2160,10 +2164,10 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile
return jump; return jump;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_ijump(struct sljit_compiler *compiler, sljit_si type, sljit_si src, sljit_sw srcw) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src, sljit_sw srcw)
{ {
struct sljit_jump *jump = NULL; struct sljit_jump *jump = NULL;
sljit_si src_r; sljit_s32 src_r;
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_ijump(compiler, type, src, srcw)); CHECK(check_sljit_emit_ijump(compiler, type, src, srcw));
@ -2211,13 +2215,13 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_ijump(struct sljit_compiler *compil
#define INVERT_BIT(dst) \ #define INVERT_BIT(dst) \
FAIL_IF(push_inst(compiler, XORI | S(dst) | A(dst) | 0x1)); FAIL_IF(push_inst(compiler, XORI | S(dst) | A(dst) | 0x1));
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_si op, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src, sljit_sw srcw, sljit_s32 src, sljit_sw srcw,
sljit_si type) sljit_s32 type)
{ {
sljit_si reg, input_flags; sljit_s32 reg, input_flags;
sljit_si flags = GET_ALL_FLAGS(op); sljit_s32 flags = GET_ALL_FLAGS(op);
sljit_sw original_dstw = dstw; sljit_sw original_dstw = dstw;
CHECK_ERROR(); CHECK_ERROR();
@ -2235,7 +2239,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *com
if (op >= SLJIT_ADD && (src & SLJIT_MEM)) { if (op >= SLJIT_ADD && (src & SLJIT_MEM)) {
ADJUST_LOCAL_OFFSET(src, srcw); ADJUST_LOCAL_OFFSET(src, srcw);
#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) #if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
input_flags = (flags & SLJIT_INT_OP) ? INT_DATA : WORD_DATA; input_flags = (flags & SLJIT_I32_OP) ? INT_DATA : WORD_DATA;
#else #else
input_flags = WORD_DATA; input_flags = WORD_DATA;
#endif #endif
@ -2255,23 +2259,23 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *com
break; break;
case SLJIT_LESS: case SLJIT_LESS:
case SLJIT_D_LESS: case SLJIT_LESS_F64:
GET_CR_BIT(4 + 0, reg); GET_CR_BIT(4 + 0, reg);
break; break;
case SLJIT_GREATER_EQUAL: case SLJIT_GREATER_EQUAL:
case SLJIT_D_GREATER_EQUAL: case SLJIT_GREATER_EQUAL_F64:
GET_CR_BIT(4 + 0, reg); GET_CR_BIT(4 + 0, reg);
INVERT_BIT(reg); INVERT_BIT(reg);
break; break;
case SLJIT_GREATER: case SLJIT_GREATER:
case SLJIT_D_GREATER: case SLJIT_GREATER_F64:
GET_CR_BIT(4 + 1, reg); GET_CR_BIT(4 + 1, reg);
break; break;
case SLJIT_LESS_EQUAL: case SLJIT_LESS_EQUAL:
case SLJIT_D_LESS_EQUAL: case SLJIT_LESS_EQUAL_F64:
GET_CR_BIT(4 + 1, reg); GET_CR_BIT(4 + 1, reg);
INVERT_BIT(reg); INVERT_BIT(reg);
break; break;
@ -2305,20 +2309,20 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *com
INVERT_BIT(reg); INVERT_BIT(reg);
break; break;
case SLJIT_D_EQUAL: case SLJIT_EQUAL_F64:
GET_CR_BIT(4 + 2, reg); GET_CR_BIT(4 + 2, reg);
break; break;
case SLJIT_D_NOT_EQUAL: case SLJIT_NOT_EQUAL_F64:
GET_CR_BIT(4 + 2, reg); GET_CR_BIT(4 + 2, reg);
INVERT_BIT(reg); INVERT_BIT(reg);
break; break;
case SLJIT_D_UNORDERED: case SLJIT_UNORDERED_F64:
GET_CR_BIT(4 + 3, reg); GET_CR_BIT(4 + 3, reg);
break; break;
case SLJIT_D_ORDERED: case SLJIT_ORDERED_F64:
GET_CR_BIT(4 + 3, reg); GET_CR_BIT(4 + 3, reg);
INVERT_BIT(reg); INVERT_BIT(reg);
break; break;
@ -2333,7 +2337,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *com
if (op == SLJIT_MOV) if (op == SLJIT_MOV)
input_flags = WORD_DATA; input_flags = WORD_DATA;
else { else {
op = SLJIT_MOV_UI; op = SLJIT_MOV_U32;
input_flags = INT_DATA; input_flags = INT_DATA;
} }
#else #else
@ -2352,10 +2356,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *com
return sljit_emit_op2(compiler, op | flags, dst, original_dstw, src, srcw, TMP_REG2, 0); return sljit_emit_op2(compiler, op | flags, dst, original_dstw, src, srcw, TMP_REG2, 0);
} }
SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_si dst, sljit_sw dstw, sljit_sw init_value) SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value)
{ {
struct sljit_const *const_; struct sljit_const *const_;
sljit_si reg; sljit_s32 reg;
CHECK_ERROR_PTR(); CHECK_ERROR_PTR();
CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value)); CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value));

View File

@ -24,7 +24,7 @@
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
static sljit_si load_immediate(struct sljit_compiler *compiler, sljit_si dst, sljit_sw imm) static sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw imm)
{ {
if (imm <= SIMM_MAX && imm >= SIMM_MIN) if (imm <= SIMM_MAX && imm >= SIMM_MIN)
return push_inst(compiler, OR | D(dst) | S1(0) | IMM(imm), DR(dst)); return push_inst(compiler, OR | D(dst) | S1(0) | IMM(imm), DR(dst));
@ -35,26 +35,26 @@ static sljit_si load_immediate(struct sljit_compiler *compiler, sljit_si dst, sl
#define ARG2(flags, src2) ((flags & SRC2_IMM) ? IMM(src2) : S2(src2)) #define ARG2(flags, src2) ((flags & SRC2_IMM) ? IMM(src2) : S2(src2))
static SLJIT_INLINE sljit_si emit_single_op(struct sljit_compiler *compiler, sljit_si op, sljit_si flags, static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 flags,
sljit_si dst, sljit_si src1, sljit_sw src2) sljit_s32 dst, sljit_s32 src1, sljit_sw src2)
{ {
SLJIT_COMPILE_ASSERT(ICC_IS_SET == SET_FLAGS, icc_is_set_and_set_flags_must_be_the_same); SLJIT_COMPILE_ASSERT(ICC_IS_SET == SET_FLAGS, icc_is_set_and_set_flags_must_be_the_same);
switch (op) { switch (op) {
case SLJIT_MOV: case SLJIT_MOV:
case SLJIT_MOV_UI: case SLJIT_MOV_U32:
case SLJIT_MOV_SI: case SLJIT_MOV_S32:
case SLJIT_MOV_P: case SLJIT_MOV_P:
SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));
if (dst != src2) if (dst != src2)
return push_inst(compiler, OR | D(dst) | S1(0) | S2(src2), DR(dst)); return push_inst(compiler, OR | D(dst) | S1(0) | S2(src2), DR(dst));
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
case SLJIT_MOV_UB: case SLJIT_MOV_U8:
case SLJIT_MOV_SB: case SLJIT_MOV_S8:
SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));
if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) { if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {
if (op == SLJIT_MOV_UB) if (op == SLJIT_MOV_U8)
return push_inst(compiler, AND | D(dst) | S1(src2) | IMM(0xff), DR(dst)); return push_inst(compiler, AND | D(dst) | S1(src2) | IMM(0xff), DR(dst));
FAIL_IF(push_inst(compiler, SLL | D(dst) | S1(src2) | IMM(24), DR(dst))); FAIL_IF(push_inst(compiler, SLL | D(dst) | S1(src2) | IMM(24), DR(dst)));
return push_inst(compiler, SRA | D(dst) | S1(dst) | IMM(24), DR(dst)); return push_inst(compiler, SRA | D(dst) | S1(dst) | IMM(24), DR(dst));
@ -63,12 +63,12 @@ static SLJIT_INLINE sljit_si emit_single_op(struct sljit_compiler *compiler, slj
SLJIT_ASSERT_STOP(); SLJIT_ASSERT_STOP();
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
case SLJIT_MOV_UH: case SLJIT_MOV_U16:
case SLJIT_MOV_SH: case SLJIT_MOV_S16:
SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));
if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) { if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {
FAIL_IF(push_inst(compiler, SLL | D(dst) | S1(src2) | IMM(16), DR(dst))); FAIL_IF(push_inst(compiler, SLL | D(dst) | S1(src2) | IMM(16), DR(dst)));
return push_inst(compiler, (op == SLJIT_MOV_SH ? SRA : SRL) | D(dst) | S1(dst) | IMM(16), DR(dst)); return push_inst(compiler, (op == SLJIT_MOV_S16 ? SRA : SRL) | D(dst) | S1(dst) | IMM(16), DR(dst));
} }
else if (dst != src2) else if (dst != src2)
SLJIT_ASSERT_STOP(); SLJIT_ASSERT_STOP();
@ -139,7 +139,7 @@ static SLJIT_INLINE sljit_si emit_single_op(struct sljit_compiler *compiler, slj
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
static SLJIT_INLINE sljit_si emit_const(struct sljit_compiler *compiler, sljit_si dst, sljit_sw init_value) static SLJIT_INLINE sljit_s32 emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw init_value)
{ {
FAIL_IF(push_inst(compiler, SETHI | D(dst) | ((init_value >> 10) & 0x3fffff), DR(dst))); FAIL_IF(push_inst(compiler, SETHI | D(dst) | ((init_value >> 10) & 0x3fffff), DR(dst)));
return push_inst(compiler, OR | D(dst) | S1(dst) | IMM_ARG | (init_value & 0x3ff), DR(dst)); return push_inst(compiler, OR | D(dst) | S1(dst) | IMM_ARG | (init_value & 0x3ff), DR(dst));

View File

@ -24,14 +24,16 @@
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
SLJIT_API_FUNC_ATTRIBUTE SLJIT_CONST char* sljit_get_platform_name(void) SLJIT_API_FUNC_ATTRIBUTE const char* sljit_get_platform_name(void)
{ {
return "SPARC" SLJIT_CPUINFO; return "SPARC" SLJIT_CPUINFO;
} }
/* Length of an instruction word /* Length of an instruction word
Both for sparc-32 and sparc-64 */ Both for sparc-32 and sparc-64 */
typedef sljit_ui sljit_ins; typedef sljit_u32 sljit_ins;
#if (defined SLJIT_CACHE_FLUSH_OWN_IMPL && SLJIT_CACHE_FLUSH_OWN_IMPL)
static void sparc_cache_flush(sljit_ins *from, sljit_ins *to) static void sparc_cache_flush(sljit_ins *from, sljit_ins *to)
{ {
@ -82,6 +84,8 @@ static void sparc_cache_flush(sljit_ins *from, sljit_ins *to)
#endif #endif
} }
#endif /* (defined SLJIT_CACHE_FLUSH_OWN_IMPL && SLJIT_CACHE_FLUSH_OWN_IMPL) */
/* TMP_REG2 is not used by getput_arg */ /* TMP_REG2 is not used by getput_arg */
#define TMP_REG1 (SLJIT_NUMBER_OF_REGISTERS + 2) #define TMP_REG1 (SLJIT_NUMBER_OF_REGISTERS + 2)
#define TMP_REG2 (SLJIT_NUMBER_OF_REGISTERS + 3) #define TMP_REG2 (SLJIT_NUMBER_OF_REGISTERS + 3)
@ -91,7 +95,7 @@ static void sparc_cache_flush(sljit_ins *from, sljit_ins *to)
#define TMP_FREG1 (0) #define TMP_FREG1 (0)
#define TMP_FREG2 ((SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1) << 1) #define TMP_FREG2 ((SLJIT_NUMBER_OF_FLOAT_REGISTERS + 1) << 1)
static SLJIT_CONST sljit_ub reg_map[SLJIT_NUMBER_OF_REGISTERS + 6] = { static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 6] = {
0, 8, 9, 10, 13, 29, 28, 27, 23, 22, 21, 20, 19, 18, 17, 16, 26, 25, 24, 14, 1, 11, 12, 15 0, 8, 9, 10, 13, 29, 28, 27, 23, 22, 21, 20, 19, 18, 17, 16, 26, 25, 24, 14, 1, 11, 12, 15
}; };
@ -181,7 +185,7 @@ static SLJIT_CONST sljit_ub reg_map[SLJIT_NUMBER_OF_REGISTERS + 6] = {
/* dest_reg is the absolute name of the register /* dest_reg is the absolute name of the register
Useful for reordering instructions in the delay slot. */ Useful for reordering instructions in the delay slot. */
static sljit_si push_inst(struct sljit_compiler *compiler, sljit_ins ins, sljit_si delay_slot) static sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_ins ins, sljit_s32 delay_slot)
{ {
sljit_ins *ptr; sljit_ins *ptr;
SLJIT_ASSERT((delay_slot & DST_INS_MASK) == UNMOVABLE_INS SLJIT_ASSERT((delay_slot & DST_INS_MASK) == UNMOVABLE_INS
@ -340,7 +344,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
SLJIT_ASSERT(!label); SLJIT_ASSERT(!label);
SLJIT_ASSERT(!jump); SLJIT_ASSERT(!jump);
SLJIT_ASSERT(!const_); SLJIT_ASSERT(!const_);
SLJIT_ASSERT(code_ptr - code <= (sljit_si)compiler->size); SLJIT_ASSERT(code_ptr - code <= (sljit_s32)compiler->size);
jump = compiler->jumps; jump = compiler->jumps;
while (jump) { while (jump) {
@ -418,9 +422,9 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
#include "sljitNativeSPARC_64.c" #include "sljitNativeSPARC_64.c"
#endif #endif
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compiler, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler,
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds, sljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 saveds,
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size) sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
{ {
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_enter(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size)); CHECK(check_sljit_emit_enter(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size));
@ -442,9 +446,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_set_context(struct sljit_compiler *compiler, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler,
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds, sljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 saveds,
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size) sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
{ {
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size)); CHECK(check_sljit_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size));
@ -454,7 +458,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_set_context(struct sljit_compiler *compi
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compiler, sljit_si op, sljit_si src, sljit_sw srcw) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw)
{ {
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_return(compiler, op, src, srcw)); CHECK(check_sljit_emit_return(compiler, op, src, srcw));
@ -478,7 +482,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compi
#define ARCH_32_64(a, b) b #define ARCH_32_64(a, b) b
#endif #endif
static SLJIT_CONST sljit_ins data_transfer_insts[16 + 4] = { static const sljit_ins data_transfer_insts[16 + 4] = {
/* u w s */ ARCH_32_64(OPC1(3) | OPC3(0x04) /* stw */, OPC1(3) | OPC3(0x0e) /* stx */), /* u w s */ ARCH_32_64(OPC1(3) | OPC3(0x04) /* stw */, OPC1(3) | OPC3(0x0e) /* stx */),
/* u w l */ ARCH_32_64(OPC1(3) | OPC3(0x00) /* lduw */, OPC1(3) | OPC3(0x0b) /* ldx */), /* u w l */ ARCH_32_64(OPC1(3) | OPC3(0x00) /* lduw */, OPC1(3) | OPC3(0x0b) /* ldx */),
/* u b s */ OPC1(3) | OPC3(0x05) /* stb */, /* u b s */ OPC1(3) | OPC3(0x05) /* stb */,
@ -506,7 +510,7 @@ static SLJIT_CONST sljit_ins data_transfer_insts[16 + 4] = {
#undef ARCH_32_64 #undef ARCH_32_64
/* Can perform an operation using at most 1 instruction. */ /* Can perform an operation using at most 1 instruction. */
static sljit_si getput_arg_fast(struct sljit_compiler *compiler, sljit_si flags, sljit_si reg, sljit_si arg, sljit_sw argw) static sljit_s32 getput_arg_fast(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg, sljit_sw argw)
{ {
SLJIT_ASSERT(arg & SLJIT_MEM); SLJIT_ASSERT(arg & SLJIT_MEM);
@ -529,7 +533,7 @@ static sljit_si getput_arg_fast(struct sljit_compiler *compiler, sljit_si flags,
/* See getput_arg below. /* See getput_arg below.
Note: can_cache is called only for binary operators. Those Note: can_cache is called only for binary operators. Those
operators always uses word arguments without write back. */ operators always uses word arguments without write back. */
static sljit_si can_cache(sljit_si arg, sljit_sw argw, sljit_si next_arg, sljit_sw next_argw) static sljit_s32 can_cache(sljit_s32 arg, sljit_sw argw, sljit_s32 next_arg, sljit_sw next_argw)
{ {
SLJIT_ASSERT((arg & SLJIT_MEM) && (next_arg & SLJIT_MEM)); SLJIT_ASSERT((arg & SLJIT_MEM) && (next_arg & SLJIT_MEM));
@ -549,9 +553,9 @@ static sljit_si can_cache(sljit_si arg, sljit_sw argw, sljit_si next_arg, sljit_
} }
/* Emit the necessary instructions. See can_cache above. */ /* Emit the necessary instructions. See can_cache above. */
static sljit_si getput_arg(struct sljit_compiler *compiler, sljit_si flags, sljit_si reg, sljit_si arg, sljit_sw argw, sljit_si next_arg, sljit_sw next_argw) static sljit_s32 getput_arg(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg, sljit_sw argw, sljit_s32 next_arg, sljit_sw next_argw)
{ {
sljit_si base, arg2, delay_slot; sljit_s32 base, arg2, delay_slot;
sljit_ins dest; sljit_ins dest;
SLJIT_ASSERT(arg & SLJIT_MEM); SLJIT_ASSERT(arg & SLJIT_MEM);
@ -613,7 +617,7 @@ static sljit_si getput_arg(struct sljit_compiler *compiler, sljit_si flags, slji
return push_inst(compiler, ADD | D(base) | S1(base) | S2(arg2), DR(base)); return push_inst(compiler, ADD | D(base) | S1(base) | S2(arg2), DR(base));
} }
static SLJIT_INLINE sljit_si emit_op_mem(struct sljit_compiler *compiler, sljit_si flags, sljit_si reg, sljit_si arg, sljit_sw argw) static SLJIT_INLINE sljit_s32 emit_op_mem(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg, sljit_sw argw)
{ {
if (getput_arg_fast(compiler, flags, reg, arg, argw)) if (getput_arg_fast(compiler, flags, reg, arg, argw))
return compiler->error; return compiler->error;
@ -622,26 +626,26 @@ static SLJIT_INLINE sljit_si emit_op_mem(struct sljit_compiler *compiler, sljit_
return getput_arg(compiler, flags, reg, arg, argw, 0, 0); return getput_arg(compiler, flags, reg, arg, argw, 0, 0);
} }
static SLJIT_INLINE sljit_si emit_op_mem2(struct sljit_compiler *compiler, sljit_si flags, sljit_si reg, sljit_si arg1, sljit_sw arg1w, sljit_si arg2, sljit_sw arg2w) static SLJIT_INLINE sljit_s32 emit_op_mem2(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg1, sljit_sw arg1w, sljit_s32 arg2, sljit_sw arg2w)
{ {
if (getput_arg_fast(compiler, flags, reg, arg1, arg1w)) if (getput_arg_fast(compiler, flags, reg, arg1, arg1w))
return compiler->error; return compiler->error;
return getput_arg(compiler, flags, reg, arg1, arg1w, arg2, arg2w); return getput_arg(compiler, flags, reg, arg1, arg1w, arg2, arg2w);
} }
static sljit_si emit_op(struct sljit_compiler *compiler, sljit_si op, sljit_si flags, static sljit_s32 emit_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 flags,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src1, sljit_sw src1w, sljit_s32 src1, sljit_sw src1w,
sljit_si src2, sljit_sw src2w) sljit_s32 src2, sljit_sw src2w)
{ {
/* arg1 goes to TMP_REG1 or src reg /* arg1 goes to TMP_REG1 or src reg
arg2 goes to TMP_REG2, imm or src reg arg2 goes to TMP_REG2, imm or src reg
TMP_REG3 can be used for caching TMP_REG3 can be used for caching
result goes to TMP_REG2, so put result can use TMP_REG1 and TMP_REG3. */ result goes to TMP_REG2, so put result can use TMP_REG1 and TMP_REG3. */
sljit_si dst_r = TMP_REG2; sljit_s32 dst_r = TMP_REG2;
sljit_si src1_r; sljit_s32 src1_r;
sljit_sw src2_r = 0; sljit_sw src2_r = 0;
sljit_si sugg_src2_r = TMP_REG2; sljit_s32 sugg_src2_r = TMP_REG2;
if (!(flags & ALT_KEEP_CACHE)) { if (!(flags & ALT_KEEP_CACHE)) {
compiler->cache_arg = 0; compiler->cache_arg = 0;
@ -649,13 +653,13 @@ static sljit_si emit_op(struct sljit_compiler *compiler, sljit_si op, sljit_si f
} }
if (SLJIT_UNLIKELY(dst == SLJIT_UNUSED)) { if (SLJIT_UNLIKELY(dst == SLJIT_UNUSED)) {
if (op >= SLJIT_MOV && op <= SLJIT_MOVU_SI && !(src2 & SLJIT_MEM)) if (op >= SLJIT_MOV && op <= SLJIT_MOVU_S32 && !(src2 & SLJIT_MEM))
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
else if (FAST_IS_REG(dst)) { else if (FAST_IS_REG(dst)) {
dst_r = dst; dst_r = dst;
flags |= REG_DEST; flags |= REG_DEST;
if (op >= SLJIT_MOV && op <= SLJIT_MOVU_SI) if (op >= SLJIT_MOV && op <= SLJIT_MOVU_S32)
sugg_src2_r = dst_r; sugg_src2_r = dst_r;
} }
else if ((dst & SLJIT_MEM) && !getput_arg_fast(compiler, flags | ARG_TEST, TMP_REG1, dst, dstw)) else if ((dst & SLJIT_MEM) && !getput_arg_fast(compiler, flags | ARG_TEST, TMP_REG1, dst, dstw))
@ -705,7 +709,7 @@ static sljit_si emit_op(struct sljit_compiler *compiler, sljit_si op, sljit_si f
if (FAST_IS_REG(src2)) { if (FAST_IS_REG(src2)) {
src2_r = src2; src2_r = src2;
flags |= REG2_SOURCE; flags |= REG2_SOURCE;
if (!(flags & REG_DEST) && op >= SLJIT_MOV && op <= SLJIT_MOVU_SI) if (!(flags & REG_DEST) && op >= SLJIT_MOV && op <= SLJIT_MOVU_S32)
dst_r = src2_r; dst_r = src2_r;
} }
else if (src2 & SLJIT_IMM) { else if (src2 & SLJIT_IMM) {
@ -716,7 +720,7 @@ static sljit_si emit_op(struct sljit_compiler *compiler, sljit_si op, sljit_si f
} }
else { else {
src2_r = 0; src2_r = 0;
if ((op >= SLJIT_MOV && op <= SLJIT_MOVU_SI) && (dst & SLJIT_MEM)) if ((op >= SLJIT_MOV && op <= SLJIT_MOVU_S32) && (dst & SLJIT_MEM))
dst_r = 0; dst_r = 0;
} }
} }
@ -758,7 +762,7 @@ static sljit_si emit_op(struct sljit_compiler *compiler, sljit_si op, sljit_si f
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler, sljit_si op) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op)
{ {
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_op0(compiler, op)); CHECK(check_sljit_emit_op0(compiler, op));
@ -769,30 +773,30 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler
return push_inst(compiler, TA, UNMOVABLE_INS); return push_inst(compiler, TA, UNMOVABLE_INS);
case SLJIT_NOP: case SLJIT_NOP:
return push_inst(compiler, NOP, UNMOVABLE_INS); return push_inst(compiler, NOP, UNMOVABLE_INS);
case SLJIT_LUMUL: case SLJIT_LMUL_UW:
case SLJIT_LSMUL: case SLJIT_LMUL_SW:
#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) #if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
FAIL_IF(push_inst(compiler, (op == SLJIT_LUMUL ? UMUL : SMUL) | D(SLJIT_R0) | S1(SLJIT_R0) | S2(SLJIT_R1), DR(SLJIT_R0))); FAIL_IF(push_inst(compiler, (op == SLJIT_LMUL_UW ? UMUL : SMUL) | D(SLJIT_R0) | S1(SLJIT_R0) | S2(SLJIT_R1), DR(SLJIT_R0)));
return push_inst(compiler, RDY | D(SLJIT_R1), DR(SLJIT_R1)); return push_inst(compiler, RDY | D(SLJIT_R1), DR(SLJIT_R1));
#else #else
#error "Implementation required" #error "Implementation required"
#endif #endif
case SLJIT_UDIVMOD: case SLJIT_DIVMOD_UW:
case SLJIT_SDIVMOD: case SLJIT_DIVMOD_SW:
case SLJIT_UDIVI: case SLJIT_DIV_UW:
case SLJIT_SDIVI: case SLJIT_DIV_SW:
SLJIT_COMPILE_ASSERT((SLJIT_UDIVMOD & 0x2) == 0 && SLJIT_UDIVI - 0x2 == SLJIT_UDIVMOD, bad_div_opcode_assignments); SLJIT_COMPILE_ASSERT((SLJIT_DIVMOD_UW & 0x2) == 0 && SLJIT_DIV_UW - 0x2 == SLJIT_DIVMOD_UW, bad_div_opcode_assignments);
#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32) #if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
if ((op | 0x2) == SLJIT_UDIVI) if ((op | 0x2) == SLJIT_DIV_UW)
FAIL_IF(push_inst(compiler, WRY | S1(0), MOVABLE_INS)); FAIL_IF(push_inst(compiler, WRY | S1(0), MOVABLE_INS));
else { else {
FAIL_IF(push_inst(compiler, SRA | D(TMP_REG1) | S1(SLJIT_R0) | IMM(31), DR(TMP_REG1))); FAIL_IF(push_inst(compiler, SRA | D(TMP_REG1) | S1(SLJIT_R0) | IMM(31), DR(TMP_REG1)));
FAIL_IF(push_inst(compiler, WRY | S1(TMP_REG1), MOVABLE_INS)); FAIL_IF(push_inst(compiler, WRY | S1(TMP_REG1), MOVABLE_INS));
} }
if (op <= SLJIT_SDIVMOD) if (op <= SLJIT_DIVMOD_SW)
FAIL_IF(push_inst(compiler, OR | D(TMP_REG2) | S1(0) | S2(SLJIT_R0), DR(TMP_REG2))); FAIL_IF(push_inst(compiler, OR | D(TMP_REG2) | S1(0) | S2(SLJIT_R0), DR(TMP_REG2)));
FAIL_IF(push_inst(compiler, ((op | 0x2) == SLJIT_UDIVI ? UDIV : SDIV) | D(SLJIT_R0) | S1(SLJIT_R0) | S2(SLJIT_R1), DR(SLJIT_R0))); FAIL_IF(push_inst(compiler, ((op | 0x2) == SLJIT_DIV_UW ? UDIV : SDIV) | D(SLJIT_R0) | S1(SLJIT_R0) | S2(SLJIT_R1), DR(SLJIT_R0)));
if (op >= SLJIT_UDIVI) if (op >= SLJIT_DIV_UW)
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
FAIL_IF(push_inst(compiler, SMUL | D(SLJIT_R1) | S1(SLJIT_R0) | S2(SLJIT_R1), DR(SLJIT_R1))); FAIL_IF(push_inst(compiler, SMUL | D(SLJIT_R1) | S1(SLJIT_R0) | S2(SLJIT_R1), DR(SLJIT_R1)));
return push_inst(compiler, SUB | D(SLJIT_R1) | S1(TMP_REG2) | S2(SLJIT_R1), DR(SLJIT_R1)); return push_inst(compiler, SUB | D(SLJIT_R1) | S1(TMP_REG2) | S2(SLJIT_R1), DR(SLJIT_R1));
@ -804,11 +808,11 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler, sljit_si op, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src, sljit_sw srcw) sljit_s32 src, sljit_sw srcw)
{ {
sljit_si flags = GET_FLAGS(op) ? SET_FLAGS : 0; sljit_s32 flags = GET_FLAGS(op) ? SET_FLAGS : 0;
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw)); CHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw));
@ -821,45 +825,45 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler
case SLJIT_MOV_P: case SLJIT_MOV_P:
return emit_op(compiler, SLJIT_MOV, flags | WORD_DATA, dst, dstw, TMP_REG1, 0, src, srcw); return emit_op(compiler, SLJIT_MOV, flags | WORD_DATA, dst, dstw, TMP_REG1, 0, src, srcw);
case SLJIT_MOV_UI: case SLJIT_MOV_U32:
return emit_op(compiler, SLJIT_MOV_UI, flags | INT_DATA, dst, dstw, TMP_REG1, 0, src, srcw); return emit_op(compiler, SLJIT_MOV_U32, flags | INT_DATA, dst, dstw, TMP_REG1, 0, src, srcw);
case SLJIT_MOV_SI: case SLJIT_MOV_S32:
return emit_op(compiler, SLJIT_MOV_SI, flags | INT_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, srcw); return emit_op(compiler, SLJIT_MOV_S32, flags | INT_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, srcw);
case SLJIT_MOV_UB: case SLJIT_MOV_U8:
return emit_op(compiler, SLJIT_MOV_UB, flags | BYTE_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_ub)srcw : srcw); return emit_op(compiler, SLJIT_MOV_U8, flags | BYTE_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u8)srcw : srcw);
case SLJIT_MOV_SB: case SLJIT_MOV_S8:
return emit_op(compiler, SLJIT_MOV_SB, flags | BYTE_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_sb)srcw : srcw); return emit_op(compiler, SLJIT_MOV_S8, flags | BYTE_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s8)srcw : srcw);
case SLJIT_MOV_UH: case SLJIT_MOV_U16:
return emit_op(compiler, SLJIT_MOV_UH, flags | HALF_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_uh)srcw : srcw); return emit_op(compiler, SLJIT_MOV_U16, flags | HALF_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u16)srcw : srcw);
case SLJIT_MOV_SH: case SLJIT_MOV_S16:
return emit_op(compiler, SLJIT_MOV_SH, flags | HALF_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_sh)srcw : srcw); return emit_op(compiler, SLJIT_MOV_S16, flags | HALF_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s16)srcw : srcw);
case SLJIT_MOVU: case SLJIT_MOVU:
case SLJIT_MOVU_P: case SLJIT_MOVU_P:
return emit_op(compiler, SLJIT_MOV, flags | WORD_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, srcw); return emit_op(compiler, SLJIT_MOV, flags | WORD_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, srcw);
case SLJIT_MOVU_UI: case SLJIT_MOVU_U32:
return emit_op(compiler, SLJIT_MOV_UI, flags | INT_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, srcw); return emit_op(compiler, SLJIT_MOV_U32, flags | INT_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, srcw);
case SLJIT_MOVU_SI: case SLJIT_MOVU_S32:
return emit_op(compiler, SLJIT_MOV_SI, flags | INT_DATA | SIGNED_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, srcw); return emit_op(compiler, SLJIT_MOV_S32, flags | INT_DATA | SIGNED_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, srcw);
case SLJIT_MOVU_UB: case SLJIT_MOVU_U8:
return emit_op(compiler, SLJIT_MOV_UB, flags | BYTE_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_ub)srcw : srcw); return emit_op(compiler, SLJIT_MOV_U8, flags | BYTE_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u8)srcw : srcw);
case SLJIT_MOVU_SB: case SLJIT_MOVU_S8:
return emit_op(compiler, SLJIT_MOV_SB, flags | BYTE_DATA | SIGNED_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_sb)srcw : srcw); return emit_op(compiler, SLJIT_MOV_S8, flags | BYTE_DATA | SIGNED_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s8)srcw : srcw);
case SLJIT_MOVU_UH: case SLJIT_MOVU_U16:
return emit_op(compiler, SLJIT_MOV_UH, flags | HALF_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_uh)srcw : srcw); return emit_op(compiler, SLJIT_MOV_U16, flags | HALF_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u16)srcw : srcw);
case SLJIT_MOVU_SH: case SLJIT_MOVU_S16:
return emit_op(compiler, SLJIT_MOV_SH, flags | HALF_DATA | SIGNED_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_sh)srcw : srcw); return emit_op(compiler, SLJIT_MOV_S16, flags | HALF_DATA | SIGNED_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s16)srcw : srcw);
case SLJIT_NOT: case SLJIT_NOT:
case SLJIT_CLZ: case SLJIT_CLZ:
@ -872,12 +876,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler, sljit_si op, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src1, sljit_sw src1w, sljit_s32 src1, sljit_sw src1w,
sljit_si src2, sljit_sw src2w) sljit_s32 src2, sljit_sw src2w)
{ {
sljit_si flags = GET_FLAGS(op) ? SET_FLAGS : 0; sljit_s32 flags = GET_FLAGS(op) ? SET_FLAGS : 0;
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_op2(compiler, op, dst, dstw, src1, src1w, src2, src2w)); CHECK(check_sljit_emit_op2(compiler, op, dst, dstw, src1, src1w, src2, src2w));
@ -914,20 +918,20 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_register_index(sljit_si reg) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg)
{ {
CHECK_REG_INDEX(check_sljit_get_register_index(reg)); CHECK_REG_INDEX(check_sljit_get_register_index(reg));
return reg_map[reg]; return reg_map[reg];
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_float_register_index(sljit_si reg) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg)
{ {
CHECK_REG_INDEX(check_sljit_get_float_register_index(reg)); CHECK_REG_INDEX(check_sljit_get_float_register_index(reg));
return reg << 1; return reg << 1;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_custom(struct sljit_compiler *compiler, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler,
void *instruction, sljit_si size) void *instruction, sljit_s32 size)
{ {
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_op_custom(compiler, instruction, size)); CHECK(check_sljit_emit_op_custom(compiler, instruction, size));
@ -939,7 +943,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_custom(struct sljit_compiler *co
/* Floating point operators */ /* Floating point operators */
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_is_fpu_available(void) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_is_fpu_available(void)
{ {
#ifdef SLJIT_IS_FPU_AVAILABLE #ifdef SLJIT_IS_FPU_AVAILABLE
return SLJIT_IS_FPU_AVAILABLE; return SLJIT_IS_FPU_AVAILABLE;
@ -949,13 +953,13 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_is_fpu_available(void)
#endif #endif
} }
#define FLOAT_DATA(op) (DOUBLE_DATA | ((op & SLJIT_SINGLE_OP) >> 7)) #define FLOAT_DATA(op) (DOUBLE_DATA | ((op & SLJIT_F32_OP) >> 7))
#define SELECT_FOP(op, single, double) ((op & SLJIT_SINGLE_OP) ? single : double) #define SELECT_FOP(op, single, double) ((op & SLJIT_F32_OP) ? single : double)
#define FLOAT_TMP_MEM_OFFSET (22 * sizeof(sljit_sw)) #define FLOAT_TMP_MEM_OFFSET (22 * sizeof(sljit_sw))
static SLJIT_INLINE sljit_si sljit_emit_fop1_convw_fromd(struct sljit_compiler *compiler, sljit_si op, static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_sw_from_f64(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src, sljit_sw srcw) sljit_s32 src, sljit_sw srcw)
{ {
if (src & SLJIT_MEM) { if (src & SLJIT_MEM) {
FAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, src, srcw, dst, dstw)); FAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, src, srcw, dst, dstw));
@ -978,16 +982,16 @@ static SLJIT_INLINE sljit_si sljit_emit_fop1_convw_fromd(struct sljit_compiler *
return emit_op_mem2(compiler, SINGLE_DATA, TMP_FREG1, dst, dstw, 0, 0); return emit_op_mem2(compiler, SINGLE_DATA, TMP_FREG1, dst, dstw, 0, 0);
} }
static SLJIT_INLINE sljit_si sljit_emit_fop1_convd_fromw(struct sljit_compiler *compiler, sljit_si op, static SLJIT_INLINE sljit_s32 sljit_emit_fop1_conv_f64_from_sw(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src, sljit_sw srcw) sljit_s32 src, sljit_sw srcw)
{ {
sljit_si dst_r = FAST_IS_REG(dst) ? (dst << 1) : TMP_FREG1; sljit_s32 dst_r = FAST_IS_REG(dst) ? (dst << 1) : TMP_FREG1;
if (src & SLJIT_IMM) { if (src & SLJIT_IMM) {
#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) #if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
if (GET_OPCODE(op) == SLJIT_CONVD_FROMI) if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_S32)
srcw = (sljit_si)srcw; srcw = (sljit_s32)srcw;
#endif #endif
FAIL_IF(load_immediate(compiler, TMP_REG1, srcw)); FAIL_IF(load_immediate(compiler, TMP_REG1, srcw));
src = TMP_REG1; src = TMP_REG1;
@ -1008,9 +1012,9 @@ static SLJIT_INLINE sljit_si sljit_emit_fop1_convd_fromw(struct sljit_compiler *
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
static SLJIT_INLINE sljit_si sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_si op, static SLJIT_INLINE sljit_s32 sljit_emit_fop1_cmp(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si src1, sljit_sw src1w, sljit_s32 src1, sljit_sw src1w,
sljit_si src2, sljit_sw src2w) sljit_s32 src2, sljit_sw src2w)
{ {
if (src1 & SLJIT_MEM) { if (src1 & SLJIT_MEM) {
FAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, src1, src1w, src2, src2w)); FAIL_IF(emit_op_mem2(compiler, FLOAT_DATA(op) | LOAD_DATA, TMP_FREG1, src1, src1w, src2, src2w));
@ -1029,21 +1033,21 @@ static SLJIT_INLINE sljit_si sljit_emit_fop1_cmp(struct sljit_compiler *compiler
return push_inst(compiler, SELECT_FOP(op, FCMPS, FCMPD) | S1A(src1) | S2A(src2), FCC_IS_SET | MOVABLE_INS); return push_inst(compiler, SELECT_FOP(op, FCMPS, FCMPD) | S1A(src1) | S2A(src2), FCC_IS_SET | MOVABLE_INS);
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop1(struct sljit_compiler *compiler, sljit_si op, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src, sljit_sw srcw) sljit_s32 src, sljit_sw srcw)
{ {
sljit_si dst_r; sljit_s32 dst_r;
CHECK_ERROR(); CHECK_ERROR();
compiler->cache_arg = 0; compiler->cache_arg = 0;
compiler->cache_argw = 0; compiler->cache_argw = 0;
SLJIT_COMPILE_ASSERT((SLJIT_SINGLE_OP == 0x100) && !(DOUBLE_DATA & 0x2), float_transfer_bit_error); SLJIT_COMPILE_ASSERT((SLJIT_F32_OP == 0x100) && !(DOUBLE_DATA & 0x2), float_transfer_bit_error);
SELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw); SELECT_FOP1_OPERATION_WITH_CHECKS(compiler, op, dst, dstw, src, srcw);
if (GET_OPCODE(op) == SLJIT_CONVD_FROMS) if (GET_OPCODE(op) == SLJIT_CONV_F64_FROM_F32)
op ^= SLJIT_SINGLE_OP; op ^= SLJIT_F32_OP;
dst_r = FAST_IS_REG(dst) ? (dst << 1) : TMP_FREG1; dst_r = FAST_IS_REG(dst) ? (dst << 1) : TMP_FREG1;
@ -1055,30 +1059,30 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop1(struct sljit_compiler *compile
src <<= 1; src <<= 1;
switch (GET_OPCODE(op)) { switch (GET_OPCODE(op)) {
case SLJIT_DMOV: case SLJIT_MOV_F64:
if (src != dst_r) { if (src != dst_r) {
if (dst_r != TMP_FREG1) { if (dst_r != TMP_FREG1) {
FAIL_IF(push_inst(compiler, FMOVS | DA(dst_r) | S2A(src), MOVABLE_INS)); FAIL_IF(push_inst(compiler, FMOVS | DA(dst_r) | S2A(src), MOVABLE_INS));
if (!(op & SLJIT_SINGLE_OP)) if (!(op & SLJIT_F32_OP))
FAIL_IF(push_inst(compiler, FMOVS | DA(dst_r | 1) | S2A(src | 1), MOVABLE_INS)); FAIL_IF(push_inst(compiler, FMOVS | DA(dst_r | 1) | S2A(src | 1), MOVABLE_INS));
} }
else else
dst_r = src; dst_r = src;
} }
break; break;
case SLJIT_DNEG: case SLJIT_NEG_F64:
FAIL_IF(push_inst(compiler, FNEGS | DA(dst_r) | S2A(src), MOVABLE_INS)); FAIL_IF(push_inst(compiler, FNEGS | DA(dst_r) | S2A(src), MOVABLE_INS));
if (dst_r != src && !(op & SLJIT_SINGLE_OP)) if (dst_r != src && !(op & SLJIT_F32_OP))
FAIL_IF(push_inst(compiler, FMOVS | DA(dst_r | 1) | S2A(src | 1), MOVABLE_INS)); FAIL_IF(push_inst(compiler, FMOVS | DA(dst_r | 1) | S2A(src | 1), MOVABLE_INS));
break; break;
case SLJIT_DABS: case SLJIT_ABS_F64:
FAIL_IF(push_inst(compiler, FABSS | DA(dst_r) | S2A(src), MOVABLE_INS)); FAIL_IF(push_inst(compiler, FABSS | DA(dst_r) | S2A(src), MOVABLE_INS));
if (dst_r != src && !(op & SLJIT_SINGLE_OP)) if (dst_r != src && !(op & SLJIT_F32_OP))
FAIL_IF(push_inst(compiler, FMOVS | DA(dst_r | 1) | S2A(src | 1), MOVABLE_INS)); FAIL_IF(push_inst(compiler, FMOVS | DA(dst_r | 1) | S2A(src | 1), MOVABLE_INS));
break; break;
case SLJIT_CONVD_FROMS: case SLJIT_CONV_F64_FROM_F32:
FAIL_IF(push_inst(compiler, SELECT_FOP(op, FSTOD, FDTOS) | DA(dst_r) | S2A(src), MOVABLE_INS)); FAIL_IF(push_inst(compiler, SELECT_FOP(op, FSTOD, FDTOS) | DA(dst_r) | S2A(src), MOVABLE_INS));
op ^= SLJIT_SINGLE_OP; op ^= SLJIT_F32_OP;
break; break;
} }
@ -1087,12 +1091,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop1(struct sljit_compiler *compile
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compiler, sljit_si op, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src1, sljit_sw src1w, sljit_s32 src1, sljit_sw src1w,
sljit_si src2, sljit_sw src2w) sljit_s32 src2, sljit_sw src2w)
{ {
sljit_si dst_r, flags = 0; sljit_s32 dst_r, flags = 0;
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_fop2(compiler, op, dst, dstw, src1, src1w, src2, src2w)); CHECK(check_sljit_emit_fop2(compiler, op, dst, dstw, src1, src1w, src2, src2w));
@ -1146,19 +1150,19 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compile
src2 = TMP_FREG2; src2 = TMP_FREG2;
switch (GET_OPCODE(op)) { switch (GET_OPCODE(op)) {
case SLJIT_DADD: case SLJIT_ADD_F64:
FAIL_IF(push_inst(compiler, SELECT_FOP(op, FADDS, FADDD) | DA(dst_r) | S1A(src1) | S2A(src2), MOVABLE_INS)); FAIL_IF(push_inst(compiler, SELECT_FOP(op, FADDS, FADDD) | DA(dst_r) | S1A(src1) | S2A(src2), MOVABLE_INS));
break; break;
case SLJIT_DSUB: case SLJIT_SUB_F64:
FAIL_IF(push_inst(compiler, SELECT_FOP(op, FSUBS, FSUBD) | DA(dst_r) | S1A(src1) | S2A(src2), MOVABLE_INS)); FAIL_IF(push_inst(compiler, SELECT_FOP(op, FSUBS, FSUBD) | DA(dst_r) | S1A(src1) | S2A(src2), MOVABLE_INS));
break; break;
case SLJIT_DMUL: case SLJIT_MUL_F64:
FAIL_IF(push_inst(compiler, SELECT_FOP(op, FMULS, FMULD) | DA(dst_r) | S1A(src1) | S2A(src2), MOVABLE_INS)); FAIL_IF(push_inst(compiler, SELECT_FOP(op, FMULS, FMULD) | DA(dst_r) | S1A(src1) | S2A(src2), MOVABLE_INS));
break; break;
case SLJIT_DDIV: case SLJIT_DIV_F64:
FAIL_IF(push_inst(compiler, SELECT_FOP(op, FDIVS, FDIVD) | DA(dst_r) | S1A(src1) | S2A(src2), MOVABLE_INS)); FAIL_IF(push_inst(compiler, SELECT_FOP(op, FDIVS, FDIVD) | DA(dst_r) | S1A(src1) | S2A(src2), MOVABLE_INS));
break; break;
} }
@ -1176,7 +1180,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compile
/* Other instructions */ /* Other instructions */
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_si dst, sljit_sw dstw) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)
{ {
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw)); CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw));
@ -1193,7 +1197,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_enter(struct sljit_compiler *c
return emit_op_mem(compiler, WORD_DATA, TMP_LINK, dst, dstw); return emit_op_mem(compiler, WORD_DATA, TMP_LINK, dst, dstw);
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_si src, sljit_sw srcw) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw)
{ {
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_fast_return(compiler, src, srcw)); CHECK(check_sljit_emit_fast_return(compiler, src, srcw));
@ -1231,33 +1235,33 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compi
return label; return label;
} }
static sljit_ins get_cc(sljit_si type) static sljit_ins get_cc(sljit_s32 type)
{ {
switch (type) { switch (type) {
case SLJIT_EQUAL: case SLJIT_EQUAL:
case SLJIT_MUL_NOT_OVERFLOW: case SLJIT_MUL_NOT_OVERFLOW:
case SLJIT_D_NOT_EQUAL: /* Unordered. */ case SLJIT_NOT_EQUAL_F64: /* Unordered. */
return DA(0x1); return DA(0x1);
case SLJIT_NOT_EQUAL: case SLJIT_NOT_EQUAL:
case SLJIT_MUL_OVERFLOW: case SLJIT_MUL_OVERFLOW:
case SLJIT_D_EQUAL: case SLJIT_EQUAL_F64:
return DA(0x9); return DA(0x9);
case SLJIT_LESS: case SLJIT_LESS:
case SLJIT_D_GREATER: /* Unordered. */ case SLJIT_GREATER_F64: /* Unordered. */
return DA(0x5); return DA(0x5);
case SLJIT_GREATER_EQUAL: case SLJIT_GREATER_EQUAL:
case SLJIT_D_LESS_EQUAL: case SLJIT_LESS_EQUAL_F64:
return DA(0xd); return DA(0xd);
case SLJIT_GREATER: case SLJIT_GREATER:
case SLJIT_D_GREATER_EQUAL: /* Unordered. */ case SLJIT_GREATER_EQUAL_F64: /* Unordered. */
return DA(0xc); return DA(0xc);
case SLJIT_LESS_EQUAL: case SLJIT_LESS_EQUAL:
case SLJIT_D_LESS: case SLJIT_LESS_F64:
return DA(0x4); return DA(0x4);
case SLJIT_SIG_LESS: case SLJIT_SIG_LESS:
@ -1273,11 +1277,11 @@ static sljit_ins get_cc(sljit_si type)
return DA(0x2); return DA(0x2);
case SLJIT_OVERFLOW: case SLJIT_OVERFLOW:
case SLJIT_D_UNORDERED: case SLJIT_UNORDERED_F64:
return DA(0x7); return DA(0x7);
case SLJIT_NOT_OVERFLOW: case SLJIT_NOT_OVERFLOW:
case SLJIT_D_ORDERED: case SLJIT_ORDERED_F64:
return DA(0xf); return DA(0xf);
default: default:
@ -1286,7 +1290,7 @@ static sljit_ins get_cc(sljit_si type)
} }
} }
SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_si type) SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type)
{ {
struct sljit_jump *jump; struct sljit_jump *jump;
@ -1298,7 +1302,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile
set_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP); set_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP);
type &= 0xff; type &= 0xff;
if (type < SLJIT_D_EQUAL) { if (type < SLJIT_EQUAL_F64) {
jump->flags |= IS_COND; jump->flags |= IS_COND;
if (((compiler->delay_slot & DST_INS_MASK) != UNMOVABLE_INS) && !(compiler->delay_slot & ICC_IS_SET)) if (((compiler->delay_slot & DST_INS_MASK) != UNMOVABLE_INS) && !(compiler->delay_slot & ICC_IS_SET))
jump->flags |= IS_MOVABLE; jump->flags |= IS_MOVABLE;
@ -1332,10 +1336,10 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile
return jump; return jump;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_ijump(struct sljit_compiler *compiler, sljit_si type, sljit_si src, sljit_sw srcw) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src, sljit_sw srcw)
{ {
struct sljit_jump *jump = NULL; struct sljit_jump *jump = NULL;
sljit_si src_r; sljit_s32 src_r;
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_ijump(compiler, type, src, srcw)); CHECK(check_sljit_emit_ijump(compiler, type, src, srcw));
@ -1367,12 +1371,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_ijump(struct sljit_compiler *compil
return push_inst(compiler, NOP, UNMOVABLE_INS); return push_inst(compiler, NOP, UNMOVABLE_INS);
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_si op, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src, sljit_sw srcw, sljit_s32 src, sljit_sw srcw,
sljit_si type) sljit_s32 type)
{ {
sljit_si reg, flags = (GET_FLAGS(op) ? SET_FLAGS : 0); sljit_s32 reg, flags = (GET_FLAGS(op) ? SET_FLAGS : 0);
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_op_flags(compiler, op, dst, dstw, src, srcw, type)); CHECK(check_sljit_emit_op_flags(compiler, op, dst, dstw, src, srcw, type));
@ -1395,7 +1399,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *com
} }
type &= 0xff; type &= 0xff;
if (type < SLJIT_D_EQUAL) if (type < SLJIT_EQUAL_F64)
FAIL_IF(push_inst(compiler, BICC | get_cc(type) | 3, UNMOVABLE_INS)); FAIL_IF(push_inst(compiler, BICC | get_cc(type) | 3, UNMOVABLE_INS));
else else
FAIL_IF(push_inst(compiler, FBFCC | get_cc(type) | 3, UNMOVABLE_INS)); FAIL_IF(push_inst(compiler, FBFCC | get_cc(type) | 3, UNMOVABLE_INS));
@ -1412,9 +1416,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *com
#endif #endif
} }
SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_si dst, sljit_sw dstw, sljit_sw init_value) SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value)
{ {
sljit_si reg; sljit_s32 reg;
struct sljit_const *const_; struct sljit_const *const_;
CHECK_ERROR_PTR(); CHECK_ERROR_PTR();

View File

@ -49,7 +49,7 @@
#define ADDR_TMP (SLJIT_NUMBER_OF_REGISTERS + 5) #define ADDR_TMP (SLJIT_NUMBER_OF_REGISTERS + 5)
#define PIC_ADDR_REG TMP_REG2 #define PIC_ADDR_REG TMP_REG2
static SLJIT_CONST sljit_ub reg_map[SLJIT_NUMBER_OF_REGISTERS + 6] = { static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 6] = {
63, 0, 1, 2, 3, 4, 30, 31, 32, 33, 34, 54, 5, 16, 6, 7 63, 0, 1, 2, 3, 4, 30, 31, 32, 33, 34, 54, 5, 16, 6, 7
}; };
@ -106,7 +106,7 @@ static SLJIT_CONST sljit_ub reg_map[SLJIT_NUMBER_OF_REGISTERS + 6] = {
*/ */
#define CHECK_FLAGS(list) (!(flags & UNUSED_DEST) || (op & GET_FLAGS(~(list)))) #define CHECK_FLAGS(list) (!(flags & UNUSED_DEST) || (op & GET_FLAGS(~(list))))
SLJIT_API_FUNC_ATTRIBUTE SLJIT_CONST char *sljit_get_platform_name(void) SLJIT_API_FUNC_ATTRIBUTE const char *sljit_get_platform_name(void)
{ {
return "TileGX" SLJIT_CPUINFO; return "TileGX" SLJIT_CPUINFO;
} }
@ -307,7 +307,7 @@ struct jit_instr {
#define JOFF_X1(x) create_JumpOff_X1(x) #define JOFF_X1(x) create_JumpOff_X1(x)
#define BOFF_X1(x) create_BrOff_X1(x) #define BOFF_X1(x) create_BrOff_X1(x)
static SLJIT_CONST tilegx_mnemonic data_transfer_insts[16] = { static const tilegx_mnemonic data_transfer_insts[16] = {
/* u w s */ TILEGX_OPC_ST /* st */, /* u w s */ TILEGX_OPC_ST /* st */,
/* u w l */ TILEGX_OPC_LD /* ld */, /* u w l */ TILEGX_OPC_LD /* ld */,
/* u b s */ TILEGX_OPC_ST1 /* st1 */, /* u b s */ TILEGX_OPC_ST1 /* st1 */,
@ -327,7 +327,7 @@ static SLJIT_CONST tilegx_mnemonic data_transfer_insts[16] = {
}; };
#ifdef TILEGX_JIT_DEBUG #ifdef TILEGX_JIT_DEBUG
static sljit_si push_inst_debug(struct sljit_compiler *compiler, sljit_ins ins, int line) static sljit_s32 push_inst_debug(struct sljit_compiler *compiler, sljit_ins ins, int line)
{ {
sljit_ins *ptr = (sljit_ins *)ensure_buf(compiler, sizeof(sljit_ins)); sljit_ins *ptr = (sljit_ins *)ensure_buf(compiler, sizeof(sljit_ins));
FAIL_IF(!ptr); FAIL_IF(!ptr);
@ -338,7 +338,7 @@ static sljit_si push_inst_debug(struct sljit_compiler *compiler, sljit_ins ins,
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
static sljit_si push_inst_nodebug(struct sljit_compiler *compiler, sljit_ins ins) static sljit_s32 push_inst_nodebug(struct sljit_compiler *compiler, sljit_ins ins)
{ {
sljit_ins *ptr = (sljit_ins *)ensure_buf(compiler, sizeof(sljit_ins)); sljit_ins *ptr = (sljit_ins *)ensure_buf(compiler, sizeof(sljit_ins));
FAIL_IF(!ptr); FAIL_IF(!ptr);
@ -349,7 +349,7 @@ static sljit_si push_inst_nodebug(struct sljit_compiler *compiler, sljit_ins ins
#define push_inst(a, b) push_inst_debug(a, b, __LINE__) #define push_inst(a, b) push_inst_debug(a, b, __LINE__)
#else #else
static sljit_si push_inst(struct sljit_compiler *compiler, sljit_ins ins) static sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_ins ins)
{ {
sljit_ins *ptr = (sljit_ins *)ensure_buf(compiler, sizeof(sljit_ins)); sljit_ins *ptr = (sljit_ins *)ensure_buf(compiler, sizeof(sljit_ins));
FAIL_IF(!ptr); FAIL_IF(!ptr);
@ -557,7 +557,7 @@ const struct Format* compute_format()
return match; return match;
} }
sljit_si assign_pipes() sljit_s32 assign_pipes()
{ {
unsigned long output_registers = 0; unsigned long output_registers = 0;
unsigned int i = 0; unsigned int i = 0;
@ -621,7 +621,7 @@ tilegx_bundle_bits get_bundle_bit(struct jit_instr *inst)
return bits; return bits;
} }
static sljit_si update_buffer(struct sljit_compiler *compiler) static sljit_s32 update_buffer(struct sljit_compiler *compiler)
{ {
int i; int i;
int orig_index = inst_buf_index; int orig_index = inst_buf_index;
@ -733,7 +733,7 @@ static sljit_si update_buffer(struct sljit_compiler *compiler)
SLJIT_ASSERT_STOP(); SLJIT_ASSERT_STOP();
} }
static sljit_si flush_buffer(struct sljit_compiler *compiler) static sljit_s32 flush_buffer(struct sljit_compiler *compiler)
{ {
while (inst_buf_index != 0) { while (inst_buf_index != 0) {
FAIL_IF(update_buffer(compiler)); FAIL_IF(update_buffer(compiler));
@ -741,7 +741,7 @@ static sljit_si flush_buffer(struct sljit_compiler *compiler)
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
static sljit_si push_4_buffer(struct sljit_compiler *compiler, tilegx_mnemonic opc, int op0, int op1, int op2, int op3, int line) static sljit_s32 push_4_buffer(struct sljit_compiler *compiler, tilegx_mnemonic opc, int op0, int op1, int op2, int op3, int line)
{ {
if (inst_buf_index == TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE) if (inst_buf_index == TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE)
FAIL_IF(update_buffer(compiler)); FAIL_IF(update_buffer(compiler));
@ -761,7 +761,7 @@ static sljit_si push_4_buffer(struct sljit_compiler *compiler, tilegx_mnemonic o
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
static sljit_si push_3_buffer(struct sljit_compiler *compiler, tilegx_mnemonic opc, int op0, int op1, int op2, int line) static sljit_s32 push_3_buffer(struct sljit_compiler *compiler, tilegx_mnemonic opc, int op0, int op1, int op2, int line)
{ {
if (inst_buf_index == TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE) if (inst_buf_index == TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE)
FAIL_IF(update_buffer(compiler)); FAIL_IF(update_buffer(compiler));
@ -822,7 +822,7 @@ static sljit_si push_3_buffer(struct sljit_compiler *compiler, tilegx_mnemonic o
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
static sljit_si push_2_buffer(struct sljit_compiler *compiler, tilegx_mnemonic opc, int op0, int op1, int line) static sljit_s32 push_2_buffer(struct sljit_compiler *compiler, tilegx_mnemonic opc, int op0, int op1, int line)
{ {
if (inst_buf_index == TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE) if (inst_buf_index == TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE)
FAIL_IF(update_buffer(compiler)); FAIL_IF(update_buffer(compiler));
@ -867,7 +867,7 @@ static sljit_si push_2_buffer(struct sljit_compiler *compiler, tilegx_mnemonic o
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
static sljit_si push_0_buffer(struct sljit_compiler *compiler, tilegx_mnemonic opc, int line) static sljit_s32 push_0_buffer(struct sljit_compiler *compiler, tilegx_mnemonic opc, int line)
{ {
if (inst_buf_index == TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE) if (inst_buf_index == TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE)
FAIL_IF(update_buffer(compiler)); FAIL_IF(update_buffer(compiler));
@ -883,7 +883,7 @@ static sljit_si push_0_buffer(struct sljit_compiler *compiler, tilegx_mnemonic o
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
static sljit_si push_jr_buffer(struct sljit_compiler *compiler, tilegx_mnemonic opc, int op0, int line) static sljit_s32 push_jr_buffer(struct sljit_compiler *compiler, tilegx_mnemonic opc, int op0, int line)
{ {
if (inst_buf_index == TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE) if (inst_buf_index == TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE)
FAIL_IF(update_buffer(compiler)); FAIL_IF(update_buffer(compiler));
@ -1117,7 +1117,7 @@ SLJIT_API_FUNC_ATTRIBUTE void * sljit_generate_code(struct sljit_compiler *compi
return code; return code;
} }
static sljit_si load_immediate(struct sljit_compiler *compiler, sljit_si dst_ar, sljit_sw imm) static sljit_s32 load_immediate(struct sljit_compiler *compiler, sljit_s32 dst_ar, sljit_sw imm)
{ {
if (imm <= SIMM_16BIT_MAX && imm >= SIMM_16BIT_MIN) if (imm <= SIMM_16BIT_MAX && imm >= SIMM_16BIT_MIN)
@ -1140,7 +1140,7 @@ static sljit_si load_immediate(struct sljit_compiler *compiler, sljit_si dst_ar,
return SHL16INSLI(dst_ar, dst_ar, imm); return SHL16INSLI(dst_ar, dst_ar, imm);
} }
static sljit_si emit_const(struct sljit_compiler *compiler, sljit_si dst_ar, sljit_sw imm, int flush) static sljit_s32 emit_const(struct sljit_compiler *compiler, sljit_s32 dst_ar, sljit_sw imm, int flush)
{ {
/* Should *not* be optimized as load_immediate, as pcre relocation /* Should *not* be optimized as load_immediate, as pcre relocation
mechanism will match this fixed 4-instruction pattern. */ mechanism will match this fixed 4-instruction pattern. */
@ -1155,7 +1155,7 @@ static sljit_si emit_const(struct sljit_compiler *compiler, sljit_si dst_ar, slj
return SHL16INSLI(dst_ar, dst_ar, imm); return SHL16INSLI(dst_ar, dst_ar, imm);
} }
static sljit_si emit_const_64(struct sljit_compiler *compiler, sljit_si dst_ar, sljit_sw imm, int flush) static sljit_s32 emit_const_64(struct sljit_compiler *compiler, sljit_s32 dst_ar, sljit_sw imm, int flush)
{ {
/* Should *not* be optimized as load_immediate, as pcre relocation /* Should *not* be optimized as load_immediate, as pcre relocation
mechanism will match this fixed 4-instruction pattern. */ mechanism will match this fixed 4-instruction pattern. */
@ -1172,12 +1172,12 @@ static sljit_si emit_const_64(struct sljit_compiler *compiler, sljit_si dst_ar,
return SHL16INSLI(reg_map[dst_ar], reg_map[dst_ar], imm); return SHL16INSLI(reg_map[dst_ar], reg_map[dst_ar], imm);
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compiler, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler,
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds, sljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 saveds,
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size) sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
{ {
sljit_ins base; sljit_ins base;
sljit_si i, tmp; sljit_s32 i, tmp;
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_enter(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size)); CHECK(check_sljit_emit_enter(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size));
@ -1222,9 +1222,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_set_context(struct sljit_compiler *compiler, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler,
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds, sljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 saveds,
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size) sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
{ {
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size)); CHECK(check_sljit_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size));
@ -1236,12 +1236,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_set_context(struct sljit_compiler *compi
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compiler, sljit_si op, sljit_si src, sljit_sw srcw) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw)
{ {
sljit_si local_size; sljit_s32 local_size;
sljit_ins base; sljit_ins base;
sljit_si i, tmp; sljit_s32 i, tmp;
sljit_si saveds; sljit_s32 saveds;
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_return(compiler, op, src, srcw)); CHECK(check_sljit_emit_return(compiler, op, src, srcw));
@ -1285,7 +1285,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compi
/* reg_ar is an absoulute register! */ /* reg_ar is an absoulute register! */
/* Can perform an operation using at most 1 instruction. */ /* Can perform an operation using at most 1 instruction. */
static sljit_si getput_arg_fast(struct sljit_compiler *compiler, sljit_si flags, sljit_si reg_ar, sljit_si arg, sljit_sw argw) static sljit_s32 getput_arg_fast(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg_ar, sljit_s32 arg, sljit_sw argw)
{ {
SLJIT_ASSERT(arg & SLJIT_MEM); SLJIT_ASSERT(arg & SLJIT_MEM);
@ -1311,7 +1311,7 @@ static sljit_si getput_arg_fast(struct sljit_compiler *compiler, sljit_si flags,
/* See getput_arg below. /* See getput_arg below.
Note: can_cache is called only for binary operators. Those Note: can_cache is called only for binary operators. Those
operators always uses word arguments without write back. */ operators always uses word arguments without write back. */
static sljit_si can_cache(sljit_si arg, sljit_sw argw, sljit_si next_arg, sljit_sw next_argw) static sljit_s32 can_cache(sljit_s32 arg, sljit_sw argw, sljit_s32 next_arg, sljit_sw next_argw)
{ {
SLJIT_ASSERT((arg & SLJIT_MEM) && (next_arg & SLJIT_MEM)); SLJIT_ASSERT((arg & SLJIT_MEM) && (next_arg & SLJIT_MEM));
@ -1337,9 +1337,9 @@ static sljit_si can_cache(sljit_si arg, sljit_sw argw, sljit_si next_arg, sljit_
} }
/* Emit the necessary instructions. See can_cache above. */ /* Emit the necessary instructions. See can_cache above. */
static sljit_si getput_arg(struct sljit_compiler *compiler, sljit_si flags, sljit_si reg_ar, sljit_si arg, sljit_sw argw, sljit_si next_arg, sljit_sw next_argw) static sljit_s32 getput_arg(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg_ar, sljit_s32 arg, sljit_sw argw, sljit_s32 next_arg, sljit_sw next_argw)
{ {
sljit_si tmp_ar, base; sljit_s32 tmp_ar, base;
SLJIT_ASSERT(arg & SLJIT_MEM); SLJIT_ASSERT(arg & SLJIT_MEM);
if (!(next_arg & SLJIT_MEM)) { if (!(next_arg & SLJIT_MEM)) {
@ -1530,7 +1530,7 @@ static sljit_si getput_arg(struct sljit_compiler *compiler, sljit_si flags, slji
return PB2(data_transfer_insts[flags & MEM_MASK], tmp_ar, reg_ar); return PB2(data_transfer_insts[flags & MEM_MASK], tmp_ar, reg_ar);
} }
static SLJIT_INLINE sljit_si emit_op_mem(struct sljit_compiler *compiler, sljit_si flags, sljit_si reg_ar, sljit_si arg, sljit_sw argw) static SLJIT_INLINE sljit_s32 emit_op_mem(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg_ar, sljit_s32 arg, sljit_sw argw)
{ {
if (getput_arg_fast(compiler, flags, reg_ar, arg, argw)) if (getput_arg_fast(compiler, flags, reg_ar, arg, argw))
return compiler->error; return compiler->error;
@ -1540,14 +1540,14 @@ static SLJIT_INLINE sljit_si emit_op_mem(struct sljit_compiler *compiler, sljit_
return getput_arg(compiler, flags, reg_ar, arg, argw, 0, 0); return getput_arg(compiler, flags, reg_ar, arg, argw, 0, 0);
} }
static SLJIT_INLINE sljit_si emit_op_mem2(struct sljit_compiler *compiler, sljit_si flags, sljit_si reg, sljit_si arg1, sljit_sw arg1w, sljit_si arg2, sljit_sw arg2w) static SLJIT_INLINE sljit_s32 emit_op_mem2(struct sljit_compiler *compiler, sljit_s32 flags, sljit_s32 reg, sljit_s32 arg1, sljit_sw arg1w, sljit_s32 arg2, sljit_sw arg2w)
{ {
if (getput_arg_fast(compiler, flags, reg, arg1, arg1w)) if (getput_arg_fast(compiler, flags, reg, arg1, arg1w))
return compiler->error; return compiler->error;
return getput_arg(compiler, flags, reg, arg1, arg1w, arg2, arg2w); return getput_arg(compiler, flags, reg, arg1, arg1w, arg2, arg2w);
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_si dst, sljit_sw dstw) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)
{ {
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw)); CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw));
@ -1564,7 +1564,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_enter(struct sljit_compiler *c
return emit_op_mem(compiler, WORD_DATA, RA, dst, dstw); return emit_op_mem(compiler, WORD_DATA, RA, dst, dstw);
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_si src, sljit_sw srcw) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw)
{ {
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_fast_return(compiler, src, srcw)); CHECK(check_sljit_emit_fast_return(compiler, src, srcw));
@ -1582,9 +1582,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_return(struct sljit_compiler *
return JR(RA); return JR(RA);
} }
static SLJIT_INLINE sljit_si emit_single_op(struct sljit_compiler *compiler, sljit_si op, sljit_si flags, sljit_si dst, sljit_si src1, sljit_sw src2) static SLJIT_INLINE sljit_s32 emit_single_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 flags, sljit_s32 dst, sljit_s32 src1, sljit_sw src2)
{ {
sljit_si overflow_ra = 0; sljit_s32 overflow_ra = 0;
switch (GET_OPCODE(op)) { switch (GET_OPCODE(op)) {
case SLJIT_MOV: case SLJIT_MOV:
@ -1594,11 +1594,11 @@ static SLJIT_INLINE sljit_si emit_single_op(struct sljit_compiler *compiler, slj
return ADD(reg_map[dst], reg_map[src2], ZERO); return ADD(reg_map[dst], reg_map[src2], ZERO);
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
case SLJIT_MOV_UI: case SLJIT_MOV_U32:
case SLJIT_MOV_SI: case SLJIT_MOV_S32:
SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));
if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) { if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {
if (op == SLJIT_MOV_SI) if (op == SLJIT_MOV_S32)
return BFEXTS(reg_map[dst], reg_map[src2], 0, 31); return BFEXTS(reg_map[dst], reg_map[src2], 0, 31);
return BFEXTU(reg_map[dst], reg_map[src2], 0, 31); return BFEXTU(reg_map[dst], reg_map[src2], 0, 31);
@ -1609,11 +1609,11 @@ static SLJIT_INLINE sljit_si emit_single_op(struct sljit_compiler *compiler, slj
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
case SLJIT_MOV_UB: case SLJIT_MOV_U8:
case SLJIT_MOV_SB: case SLJIT_MOV_S8:
SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));
if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) { if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {
if (op == SLJIT_MOV_SB) if (op == SLJIT_MOV_S8)
return BFEXTS(reg_map[dst], reg_map[src2], 0, 7); return BFEXTS(reg_map[dst], reg_map[src2], 0, 7);
return BFEXTU(reg_map[dst], reg_map[src2], 0, 7); return BFEXTU(reg_map[dst], reg_map[src2], 0, 7);
@ -1624,11 +1624,11 @@ static SLJIT_INLINE sljit_si emit_single_op(struct sljit_compiler *compiler, slj
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
case SLJIT_MOV_UH: case SLJIT_MOV_U16:
case SLJIT_MOV_SH: case SLJIT_MOV_S16:
SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM)); SLJIT_ASSERT(src1 == TMP_REG1 && !(flags & SRC2_IMM));
if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) { if ((flags & (REG_DEST | REG2_SOURCE)) == (REG_DEST | REG2_SOURCE)) {
if (op == SLJIT_MOV_SH) if (op == SLJIT_MOV_S16)
return BFEXTS(reg_map[dst], reg_map[src2], 0, 15); return BFEXTS(reg_map[dst], reg_map[src2], 0, 15);
return BFEXTU(reg_map[dst], reg_map[src2], 0, 15); return BFEXTU(reg_map[dst], reg_map[src2], 0, 15);
@ -1956,16 +1956,16 @@ static SLJIT_INLINE sljit_si emit_single_op(struct sljit_compiler *compiler, slj
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
static sljit_si emit_op(struct sljit_compiler *compiler, sljit_si op, sljit_si flags, sljit_si dst, sljit_sw dstw, sljit_si src1, sljit_sw src1w, sljit_si src2, sljit_sw src2w) static sljit_s32 emit_op(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 flags, sljit_s32 dst, sljit_sw dstw, sljit_s32 src1, sljit_sw src1w, sljit_s32 src2, sljit_sw src2w)
{ {
/* arg1 goes to TMP_REG1 or src reg. /* arg1 goes to TMP_REG1 or src reg.
arg2 goes to TMP_REG2, imm or src reg. arg2 goes to TMP_REG2, imm or src reg.
TMP_REG3 can be used for caching. TMP_REG3 can be used for caching.
result goes to TMP_REG2, so put result can use TMP_REG1 and TMP_REG3. */ result goes to TMP_REG2, so put result can use TMP_REG1 and TMP_REG3. */
sljit_si dst_r = TMP_REG2; sljit_s32 dst_r = TMP_REG2;
sljit_si src1_r; sljit_s32 src1_r;
sljit_sw src2_r = 0; sljit_sw src2_r = 0;
sljit_si sugg_src2_r = TMP_REG2; sljit_s32 sugg_src2_r = TMP_REG2;
if (!(flags & ALT_KEEP_CACHE)) { if (!(flags & ALT_KEEP_CACHE)) {
compiler->cache_arg = 0; compiler->cache_arg = 0;
@ -1973,14 +1973,14 @@ static sljit_si emit_op(struct sljit_compiler *compiler, sljit_si op, sljit_si f
} }
if (SLJIT_UNLIKELY(dst == SLJIT_UNUSED)) { if (SLJIT_UNLIKELY(dst == SLJIT_UNUSED)) {
if (op >= SLJIT_MOV && op <= SLJIT_MOVU_SI && !(src2 & SLJIT_MEM)) if (op >= SLJIT_MOV && op <= SLJIT_MOVU_S32 && !(src2 & SLJIT_MEM))
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
if (GET_FLAGS(op)) if (GET_FLAGS(op))
flags |= UNUSED_DEST; flags |= UNUSED_DEST;
} else if (FAST_IS_REG(dst)) { } else if (FAST_IS_REG(dst)) {
dst_r = dst; dst_r = dst;
flags |= REG_DEST; flags |= REG_DEST;
if (op >= SLJIT_MOV && op <= SLJIT_MOVU_SI) if (op >= SLJIT_MOV && op <= SLJIT_MOVU_S32)
sugg_src2_r = dst_r; sugg_src2_r = dst_r;
} else if ((dst & SLJIT_MEM) && !getput_arg_fast(compiler, flags | ARG_TEST, TMP_REG1_mapped, dst, dstw)) } else if ((dst & SLJIT_MEM) && !getput_arg_fast(compiler, flags | ARG_TEST, TMP_REG1_mapped, dst, dstw))
flags |= SLOW_DEST; flags |= SLOW_DEST;
@ -2033,7 +2033,7 @@ static sljit_si emit_op(struct sljit_compiler *compiler, sljit_si op, sljit_si f
if (FAST_IS_REG(src2)) { if (FAST_IS_REG(src2)) {
src2_r = src2; src2_r = src2;
flags |= REG2_SOURCE; flags |= REG2_SOURCE;
if (!(flags & REG_DEST) && op >= SLJIT_MOV && op <= SLJIT_MOVU_SI) if (!(flags & REG_DEST) && op >= SLJIT_MOV && op <= SLJIT_MOVU_S32)
dst_r = src2_r; dst_r = src2_r;
} else if (src2 & SLJIT_IMM) { } else if (src2 & SLJIT_IMM) {
if (!(flags & SRC2_IMM)) { if (!(flags & SRC2_IMM)) {
@ -2042,7 +2042,7 @@ static sljit_si emit_op(struct sljit_compiler *compiler, sljit_si op, sljit_si f
src2_r = sugg_src2_r; src2_r = sugg_src2_r;
} else { } else {
src2_r = 0; src2_r = 0;
if ((op >= SLJIT_MOV && op <= SLJIT_MOVU_SI) && (dst & SLJIT_MEM)) if ((op >= SLJIT_MOV && op <= SLJIT_MOVU_S32) && (dst & SLJIT_MEM))
dst_r = 0; dst_r = 0;
} }
} }
@ -2082,11 +2082,11 @@ static sljit_si emit_op(struct sljit_compiler *compiler, sljit_si op, sljit_si f
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_si op, sljit_si dst, sljit_sw dstw, sljit_si src, sljit_sw srcw, sljit_si type) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw dstw, sljit_s32 src, sljit_sw srcw, sljit_s32 type)
{ {
sljit_si sugg_dst_ar, dst_ar; sljit_s32 sugg_dst_ar, dst_ar;
sljit_si flags = GET_ALL_FLAGS(op); sljit_s32 flags = GET_ALL_FLAGS(op);
sljit_si mem_type = (op & SLJIT_INT_OP) ? (INT_DATA | SIGNED_DATA) : WORD_DATA; sljit_s32 mem_type = (op & SLJIT_I32_OP) ? (INT_DATA | SIGNED_DATA) : WORD_DATA;
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_op_flags(compiler, op, dst, dstw, src, srcw, type)); CHECK(check_sljit_emit_op_flags(compiler, op, dst, dstw, src, srcw, type));
@ -2096,7 +2096,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *com
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
op = GET_OPCODE(op); op = GET_OPCODE(op);
if (op == SLJIT_MOV_SI || op == SLJIT_MOV_UI) if (op == SLJIT_MOV_S32 || op == SLJIT_MOV_U32)
mem_type = INT_DATA | SIGNED_DATA; mem_type = INT_DATA | SIGNED_DATA;
sugg_dst_ar = reg_map[(op < SLJIT_ADD && FAST_IS_REG(dst)) ? dst : TMP_REG2]; sugg_dst_ar = reg_map[(op < SLJIT_ADD && FAST_IS_REG(dst)) ? dst : TMP_REG2];
@ -2168,7 +2168,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *com
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler, sljit_si op) { SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op) {
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_op0(compiler, op)); CHECK(check_sljit_emit_op0(compiler, op));
@ -2180,17 +2180,19 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler
case SLJIT_BREAKPOINT: case SLJIT_BREAKPOINT:
return PI(BPT); return PI(BPT);
case SLJIT_LUMUL: case SLJIT_LMUL_UW:
case SLJIT_LSMUL: case SLJIT_LMUL_SW:
case SLJIT_UDIVI: case SLJIT_DIVMOD_UW:
case SLJIT_SDIVI: case SLJIT_DIVMOD_SW:
case SLJIT_DIV_UW:
case SLJIT_DIV_SW:
SLJIT_ASSERT_STOP(); SLJIT_ASSERT_STOP();
} }
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler, sljit_si op, sljit_si dst, sljit_sw dstw, sljit_si src, sljit_sw srcw) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw dstw, sljit_s32 src, sljit_sw srcw)
{ {
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw)); CHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw));
@ -2202,45 +2204,45 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler
case SLJIT_MOV_P: case SLJIT_MOV_P:
return emit_op(compiler, SLJIT_MOV, WORD_DATA, dst, dstw, TMP_REG1, 0, src, srcw); return emit_op(compiler, SLJIT_MOV, WORD_DATA, dst, dstw, TMP_REG1, 0, src, srcw);
case SLJIT_MOV_UI: case SLJIT_MOV_U32:
return emit_op(compiler, SLJIT_MOV_UI, INT_DATA, dst, dstw, TMP_REG1, 0, src, srcw); return emit_op(compiler, SLJIT_MOV_U32, INT_DATA, dst, dstw, TMP_REG1, 0, src, srcw);
case SLJIT_MOV_SI: case SLJIT_MOV_S32:
return emit_op(compiler, SLJIT_MOV_SI, INT_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, srcw); return emit_op(compiler, SLJIT_MOV_S32, INT_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, srcw);
case SLJIT_MOV_UB: case SLJIT_MOV_U8:
return emit_op(compiler, SLJIT_MOV_UB, BYTE_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_ub) srcw : srcw); return emit_op(compiler, SLJIT_MOV_U8, BYTE_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u8) srcw : srcw);
case SLJIT_MOV_SB: case SLJIT_MOV_S8:
return emit_op(compiler, SLJIT_MOV_SB, BYTE_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_sb) srcw : srcw); return emit_op(compiler, SLJIT_MOV_S8, BYTE_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s8) srcw : srcw);
case SLJIT_MOV_UH: case SLJIT_MOV_U16:
return emit_op(compiler, SLJIT_MOV_UH, HALF_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_uh) srcw : srcw); return emit_op(compiler, SLJIT_MOV_U16, HALF_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u16) srcw : srcw);
case SLJIT_MOV_SH: case SLJIT_MOV_S16:
return emit_op(compiler, SLJIT_MOV_SH, HALF_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_sh) srcw : srcw); return emit_op(compiler, SLJIT_MOV_S16, HALF_DATA | SIGNED_DATA, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s16) srcw : srcw);
case SLJIT_MOVU: case SLJIT_MOVU:
case SLJIT_MOVU_P: case SLJIT_MOVU_P:
return emit_op(compiler, SLJIT_MOV, WORD_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, srcw); return emit_op(compiler, SLJIT_MOV, WORD_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, srcw);
case SLJIT_MOVU_UI: case SLJIT_MOVU_U32:
return emit_op(compiler, SLJIT_MOV_UI, INT_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, srcw); return emit_op(compiler, SLJIT_MOV_U32, INT_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, srcw);
case SLJIT_MOVU_SI: case SLJIT_MOVU_S32:
return emit_op(compiler, SLJIT_MOV_SI, INT_DATA | SIGNED_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, srcw); return emit_op(compiler, SLJIT_MOV_S32, INT_DATA | SIGNED_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, srcw);
case SLJIT_MOVU_UB: case SLJIT_MOVU_U8:
return emit_op(compiler, SLJIT_MOV_UB, BYTE_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_ub) srcw : srcw); return emit_op(compiler, SLJIT_MOV_U8, BYTE_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u8) srcw : srcw);
case SLJIT_MOVU_SB: case SLJIT_MOVU_S8:
return emit_op(compiler, SLJIT_MOV_SB, BYTE_DATA | SIGNED_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_sb) srcw : srcw); return emit_op(compiler, SLJIT_MOV_S8, BYTE_DATA | SIGNED_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s8) srcw : srcw);
case SLJIT_MOVU_UH: case SLJIT_MOVU_U16:
return emit_op(compiler, SLJIT_MOV_UH, HALF_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_uh) srcw : srcw); return emit_op(compiler, SLJIT_MOV_U16, HALF_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_u16) srcw : srcw);
case SLJIT_MOVU_SH: case SLJIT_MOVU_S16:
return emit_op(compiler, SLJIT_MOV_SH, HALF_DATA | SIGNED_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_sh) srcw : srcw); return emit_op(compiler, SLJIT_MOV_S16, HALF_DATA | SIGNED_DATA | WRITE_BACK, dst, dstw, TMP_REG1, 0, src, (src & SLJIT_IMM) ? (sljit_s16) srcw : srcw);
case SLJIT_NOT: case SLJIT_NOT:
return emit_op(compiler, op, 0, dst, dstw, TMP_REG1, 0, src, srcw); return emit_op(compiler, op, 0, dst, dstw, TMP_REG1, 0, src, srcw);
@ -2249,13 +2251,13 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler
return emit_op(compiler, SLJIT_SUB | GET_ALL_FLAGS(op), IMM_OP, dst, dstw, SLJIT_IMM, 0, src, srcw); return emit_op(compiler, SLJIT_SUB | GET_ALL_FLAGS(op), IMM_OP, dst, dstw, SLJIT_IMM, 0, src, srcw);
case SLJIT_CLZ: case SLJIT_CLZ:
return emit_op(compiler, op, (op & SLJIT_INT_OP) ? INT_DATA : WORD_DATA, dst, dstw, TMP_REG1, 0, src, srcw); return emit_op(compiler, op, (op & SLJIT_I32_OP) ? INT_DATA : WORD_DATA, dst, dstw, TMP_REG1, 0, src, srcw);
} }
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler, sljit_si op, sljit_si dst, sljit_sw dstw, sljit_si src1, sljit_sw src1w, sljit_si src2, sljit_sw src2w) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw dstw, sljit_s32 src1, sljit_sw src1w, sljit_s32 src2, sljit_sw src2w)
{ {
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_op2(compiler, op, dst, dstw, src1, src1w, src2, src2w)); CHECK(check_sljit_emit_op2(compiler, op, dst, dstw, src1, src1w, src2, src2w));
@ -2285,7 +2287,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler
case SLJIT_ASHR: case SLJIT_ASHR:
if (src2 & SLJIT_IMM) if (src2 & SLJIT_IMM)
src2w &= 0x3f; src2w &= 0x3f;
if (op & SLJIT_INT_OP) if (op & SLJIT_I32_OP)
src2w &= 0x1f; src2w &= 0x1f;
return emit_op(compiler, op, IMM_OP, dst, dstw, src1, src1w, src2, src2w); return emit_op(compiler, op, IMM_OP, dst, dstw, src1, src1w, src2, src2w);
@ -2312,9 +2314,9 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label * sljit_emit_label(struct sljit_comp
return label; return label;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_ijump(struct sljit_compiler *compiler, sljit_si type, sljit_si src, sljit_sw srcw) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src, sljit_sw srcw)
{ {
sljit_si src_r = TMP_REG2; sljit_s32 src_r = TMP_REG2;
struct sljit_jump *jump = NULL; struct sljit_jump *jump = NULL;
flush_buffer(compiler); flush_buffer(compiler);
@ -2401,11 +2403,11 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_ijump(struct sljit_compiler *compil
inst = BNEZ_X1 | SRCA_X1(src); \ inst = BNEZ_X1 | SRCA_X1(src); \
flags = IS_COND; flags = IS_COND;
SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump * sljit_emit_jump(struct sljit_compiler *compiler, sljit_si type) SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump * sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type)
{ {
struct sljit_jump *jump; struct sljit_jump *jump;
sljit_ins inst; sljit_ins inst;
sljit_si flags = 0; sljit_s32 flags = 0;
flush_buffer(compiler); flush_buffer(compiler);
@ -2485,25 +2487,25 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump * sljit_emit_jump(struct sljit_compil
return jump; return jump;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_is_fpu_available(void) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_is_fpu_available(void)
{ {
return 0; return 0;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop1(struct sljit_compiler *compiler, sljit_si op, sljit_si dst, sljit_sw dstw, sljit_si src, sljit_sw srcw) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw dstw, sljit_s32 src, sljit_sw srcw)
{ {
SLJIT_ASSERT_STOP(); SLJIT_ASSERT_STOP();
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compiler, sljit_si op, sljit_si dst, sljit_sw dstw, sljit_si src1, sljit_sw src1w, sljit_si src2, sljit_sw src2w) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw dstw, sljit_s32 src1, sljit_sw src1w, sljit_s32 src2, sljit_sw src2w)
{ {
SLJIT_ASSERT_STOP(); SLJIT_ASSERT_STOP();
} }
SLJIT_API_FUNC_ATTRIBUTE struct sljit_const * sljit_emit_const(struct sljit_compiler *compiler, sljit_si dst, sljit_sw dstw, sljit_sw init_value) SLJIT_API_FUNC_ATTRIBUTE struct sljit_const * sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value)
{ {
struct sljit_const *const_; struct sljit_const *const_;
sljit_si reg; sljit_s32 reg;
flush_buffer(compiler); flush_buffer(compiler);
@ -2545,14 +2547,14 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_consta
SLJIT_CACHE_FLUSH(inst, inst + 4); SLJIT_CACHE_FLUSH(inst, inst + 4);
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_register_index(sljit_si reg) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg)
{ {
CHECK_REG_INDEX(check_sljit_get_register_index(reg)); CHECK_REG_INDEX(check_sljit_get_register_index(reg));
return reg_map[reg]; return reg_map[reg];
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_custom(struct sljit_compiler *compiler, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler,
void *instruction, sljit_si size) void *instruction, sljit_s32 size)
{ {
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_op_custom(compiler, instruction, size)); CHECK(check_sljit_emit_op_custom(compiler, instruction, size));

View File

@ -26,11 +26,11 @@
/* x86 32-bit arch dependent functions. */ /* x86 32-bit arch dependent functions. */
static sljit_si emit_do_imm(struct sljit_compiler *compiler, sljit_ub opcode, sljit_sw imm) static sljit_s32 emit_do_imm(struct sljit_compiler *compiler, sljit_u8 opcode, sljit_sw imm)
{ {
sljit_ub *inst; sljit_u8 *inst;
inst = (sljit_ub*)ensure_buf(compiler, 1 + 1 + sizeof(sljit_sw)); inst = (sljit_u8*)ensure_buf(compiler, 1 + 1 + sizeof(sljit_sw));
FAIL_IF(!inst); FAIL_IF(!inst);
INC_SIZE(1 + sizeof(sljit_sw)); INC_SIZE(1 + sizeof(sljit_sw));
*inst++ = opcode; *inst++ = opcode;
@ -38,7 +38,7 @@ static sljit_si emit_do_imm(struct sljit_compiler *compiler, sljit_ub opcode, sl
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
static sljit_ub* generate_far_jump_code(struct sljit_jump *jump, sljit_ub *code_ptr, sljit_si type) static sljit_u8* generate_far_jump_code(struct sljit_jump *jump, sljit_u8 *code_ptr, sljit_s32 type)
{ {
if (type == SLJIT_JUMP) { if (type == SLJIT_JUMP) {
*code_ptr++ = JMP_i32; *code_ptr++ = JMP_i32;
@ -63,12 +63,12 @@ static sljit_ub* generate_far_jump_code(struct sljit_jump *jump, sljit_ub *code_
return code_ptr; return code_ptr;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compiler, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler,
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds, sljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 saveds,
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size) sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
{ {
sljit_si size; sljit_s32 size;
sljit_ub *inst; sljit_u8 *inst;
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_enter(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size)); CHECK(check_sljit_emit_enter(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size));
@ -83,7 +83,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
#else #else
size += (args > 0 ? (2 + args * 3) : 0); size += (args > 0 ? (2 + args * 3) : 0);
#endif #endif
inst = (sljit_ub*)ensure_buf(compiler, 1 + size); inst = (sljit_u8*)ensure_buf(compiler, 1 + size);
FAIL_IF(!inst); FAIL_IF(!inst);
INC_SIZE(size); INC_SIZE(size);
@ -143,7 +143,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
if (options & SLJIT_DOUBLE_ALIGNMENT) { if (options & SLJIT_DOUBLE_ALIGNMENT) {
local_size = SLJIT_LOCALS_OFFSET + ((local_size + 7) & ~7); local_size = SLJIT_LOCALS_OFFSET + ((local_size + 7) & ~7);
inst = (sljit_ub*)ensure_buf(compiler, 1 + 17); inst = (sljit_u8*)ensure_buf(compiler, 1 + 17);
FAIL_IF(!inst); FAIL_IF(!inst);
INC_SIZE(17); INC_SIZE(17);
@ -183,9 +183,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
SLJIT_SP, 0, SLJIT_SP, 0, SLJIT_IMM, local_size); SLJIT_SP, 0, SLJIT_SP, 0, SLJIT_IMM, local_size);
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_set_context(struct sljit_compiler *compiler, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler,
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds, sljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 saveds,
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size) sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
{ {
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size)); CHECK(check_sljit_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size));
@ -205,10 +205,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_set_context(struct sljit_compiler *compi
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compiler, sljit_si op, sljit_si src, sljit_sw srcw) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw)
{ {
sljit_si size; sljit_s32 size;
sljit_ub *inst; sljit_u8 *inst;
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_return(compiler, op, src, srcw)); CHECK(check_sljit_emit_return(compiler, op, src, srcw));
@ -223,7 +223,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compi
#if !defined(__APPLE__) #if !defined(__APPLE__)
if (compiler->options & SLJIT_DOUBLE_ALIGNMENT) { if (compiler->options & SLJIT_DOUBLE_ALIGNMENT) {
inst = (sljit_ub*)ensure_buf(compiler, 1 + 3); inst = (sljit_u8*)ensure_buf(compiler, 1 + 3);
FAIL_IF(!inst); FAIL_IF(!inst);
INC_SIZE(3); INC_SIZE(3);
@ -242,7 +242,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compi
if (compiler->args > 0) if (compiler->args > 0)
size += 2; size += 2;
#endif #endif
inst = (sljit_ub*)ensure_buf(compiler, 1 + size); inst = (sljit_u8*)ensure_buf(compiler, 1 + size);
FAIL_IF(!inst); FAIL_IF(!inst);
INC_SIZE(size); INC_SIZE(size);
@ -271,16 +271,16 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compi
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
/* Size contains the flags as well. */ /* Size contains the flags as well. */
static sljit_ub* emit_x86_instruction(struct sljit_compiler *compiler, sljit_si size, static sljit_u8* emit_x86_instruction(struct sljit_compiler *compiler, sljit_s32 size,
/* The register or immediate operand. */ /* The register or immediate operand. */
sljit_si a, sljit_sw imma, sljit_s32 a, sljit_sw imma,
/* The general operand (not immediate). */ /* The general operand (not immediate). */
sljit_si b, sljit_sw immb) sljit_s32 b, sljit_sw immb)
{ {
sljit_ub *inst; sljit_u8 *inst;
sljit_ub *buf_ptr; sljit_u8 *buf_ptr;
sljit_si flags = size & ~0xf; sljit_s32 flags = size & ~0xf;
sljit_si inst_size; sljit_s32 inst_size;
/* Both cannot be switched on. */ /* Both cannot be switched on. */
SLJIT_ASSERT((flags & (EX86_BIN_INS | EX86_SHIFT_INS)) != (EX86_BIN_INS | EX86_SHIFT_INS)); SLJIT_ASSERT((flags & (EX86_BIN_INS | EX86_SHIFT_INS)) != (EX86_BIN_INS | EX86_SHIFT_INS));
@ -310,7 +310,7 @@ static sljit_ub* emit_x86_instruction(struct sljit_compiler *compiler, sljit_si
else if (immb != 0 && !(b & OFFS_REG_MASK)) { else if (immb != 0 && !(b & OFFS_REG_MASK)) {
/* Immediate operand. */ /* Immediate operand. */
if (immb <= 127 && immb >= -128) if (immb <= 127 && immb >= -128)
inst_size += sizeof(sljit_sb); inst_size += sizeof(sljit_s8);
else else
inst_size += sizeof(sljit_sw); inst_size += sizeof(sljit_sw);
} }
@ -347,7 +347,7 @@ static sljit_ub* emit_x86_instruction(struct sljit_compiler *compiler, sljit_si
else else
SLJIT_ASSERT(!(flags & EX86_SHIFT_INS) || a == SLJIT_PREF_SHIFT_REG); SLJIT_ASSERT(!(flags & EX86_SHIFT_INS) || a == SLJIT_PREF_SHIFT_REG);
inst = (sljit_ub*)ensure_buf(compiler, 1 + inst_size); inst = (sljit_u8*)ensure_buf(compiler, 1 + inst_size);
PTR_FAIL_IF(!inst); PTR_FAIL_IF(!inst);
/* Encoding the byte. */ /* Encoding the byte. */
@ -438,12 +438,12 @@ static sljit_ub* emit_x86_instruction(struct sljit_compiler *compiler, sljit_si
/* Call / return instructions */ /* Call / return instructions */
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
static SLJIT_INLINE sljit_si call_with_args(struct sljit_compiler *compiler, sljit_si type) static SLJIT_INLINE sljit_s32 call_with_args(struct sljit_compiler *compiler, sljit_s32 type)
{ {
sljit_ub *inst; sljit_u8 *inst;
#if (defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL) #if (defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL)
inst = (sljit_ub*)ensure_buf(compiler, type >= SLJIT_CALL3 ? 1 + 2 + 1 : 1 + 2); inst = (sljit_u8*)ensure_buf(compiler, type >= SLJIT_CALL3 ? 1 + 2 + 1 : 1 + 2);
FAIL_IF(!inst); FAIL_IF(!inst);
INC_SIZE(type >= SLJIT_CALL3 ? 2 + 1 : 2); INC_SIZE(type >= SLJIT_CALL3 ? 2 + 1 : 2);
@ -452,7 +452,7 @@ static SLJIT_INLINE sljit_si call_with_args(struct sljit_compiler *compiler, slj
*inst++ = MOV_r_rm; *inst++ = MOV_r_rm;
*inst++ = MOD_REG | (reg_map[SLJIT_R2] << 3) | reg_map[SLJIT_R0]; *inst++ = MOD_REG | (reg_map[SLJIT_R2] << 3) | reg_map[SLJIT_R0];
#else #else
inst = (sljit_ub*)ensure_buf(compiler, 1 + 4 * (type - SLJIT_CALL0)); inst = (sljit_u8*)ensure_buf(compiler, 1 + 4 * (type - SLJIT_CALL0));
FAIL_IF(!inst); FAIL_IF(!inst);
INC_SIZE(4 * (type - SLJIT_CALL0)); INC_SIZE(4 * (type - SLJIT_CALL0));
@ -476,9 +476,9 @@ static SLJIT_INLINE sljit_si call_with_args(struct sljit_compiler *compiler, slj
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_si dst, sljit_sw dstw) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)
{ {
sljit_ub *inst; sljit_u8 *inst;
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw)); CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw));
@ -492,7 +492,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_enter(struct sljit_compiler *c
if (FAST_IS_REG(dst)) { if (FAST_IS_REG(dst)) {
/* Unused dest is possible here. */ /* Unused dest is possible here. */
inst = (sljit_ub*)ensure_buf(compiler, 1 + 1); inst = (sljit_u8*)ensure_buf(compiler, 1 + 1);
FAIL_IF(!inst); FAIL_IF(!inst);
INC_SIZE(1); INC_SIZE(1);
@ -507,9 +507,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_enter(struct sljit_compiler *c
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_si src, sljit_sw srcw) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw)
{ {
sljit_ub *inst; sljit_u8 *inst;
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_fast_return(compiler, src, srcw)); CHECK(check_sljit_emit_fast_return(compiler, src, srcw));
@ -518,7 +518,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_return(struct sljit_compiler *
CHECK_EXTRA_REGS(src, srcw, (void)0); CHECK_EXTRA_REGS(src, srcw, (void)0);
if (FAST_IS_REG(src)) { if (FAST_IS_REG(src)) {
inst = (sljit_ub*)ensure_buf(compiler, 1 + 1 + 1); inst = (sljit_u8*)ensure_buf(compiler, 1 + 1 + 1);
FAIL_IF(!inst); FAIL_IF(!inst);
INC_SIZE(1 + 1); INC_SIZE(1 + 1);
@ -530,13 +530,13 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_return(struct sljit_compiler *
*inst++ = GROUP_FF; *inst++ = GROUP_FF;
*inst |= PUSH_rm; *inst |= PUSH_rm;
inst = (sljit_ub*)ensure_buf(compiler, 1 + 1); inst = (sljit_u8*)ensure_buf(compiler, 1 + 1);
FAIL_IF(!inst); FAIL_IF(!inst);
INC_SIZE(1); INC_SIZE(1);
} }
else { else {
/* SLJIT_IMM. */ /* SLJIT_IMM. */
inst = (sljit_ub*)ensure_buf(compiler, 1 + 5 + 1); inst = (sljit_u8*)ensure_buf(compiler, 1 + 5 + 1);
FAIL_IF(!inst); FAIL_IF(!inst);
INC_SIZE(5 + 1); INC_SIZE(5 + 1);

View File

@ -26,11 +26,11 @@
/* x86 64-bit arch dependent functions. */ /* x86 64-bit arch dependent functions. */
static sljit_si emit_load_imm64(struct sljit_compiler *compiler, sljit_si reg, sljit_sw imm) static sljit_s32 emit_load_imm64(struct sljit_compiler *compiler, sljit_s32 reg, sljit_sw imm)
{ {
sljit_ub *inst; sljit_u8 *inst;
inst = (sljit_ub*)ensure_buf(compiler, 1 + 2 + sizeof(sljit_sw)); inst = (sljit_u8*)ensure_buf(compiler, 1 + 2 + sizeof(sljit_sw));
FAIL_IF(!inst); FAIL_IF(!inst);
INC_SIZE(2 + sizeof(sljit_sw)); INC_SIZE(2 + sizeof(sljit_sw));
*inst++ = REX_W | ((reg_map[reg] <= 7) ? 0 : REX_B); *inst++ = REX_W | ((reg_map[reg] <= 7) ? 0 : REX_B);
@ -39,7 +39,7 @@ static sljit_si emit_load_imm64(struct sljit_compiler *compiler, sljit_si reg, s
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
static sljit_ub* generate_far_jump_code(struct sljit_jump *jump, sljit_ub *code_ptr, sljit_si type) static sljit_u8* generate_far_jump_code(struct sljit_jump *jump, sljit_u8 *code_ptr, sljit_s32 type)
{ {
if (type < SLJIT_JUMP) { if (type < SLJIT_JUMP) {
/* Invert type. */ /* Invert type. */
@ -65,9 +65,9 @@ static sljit_ub* generate_far_jump_code(struct sljit_jump *jump, sljit_ub *code_
return code_ptr; return code_ptr;
} }
static sljit_ub* generate_fixed_jump(sljit_ub *code_ptr, sljit_sw addr, sljit_si type) static sljit_u8* generate_fixed_jump(sljit_u8 *code_ptr, sljit_sw addr, sljit_s32 type)
{ {
sljit_sw delta = addr - ((sljit_sw)code_ptr + 1 + sizeof(sljit_si)); sljit_sw delta = addr - ((sljit_sw)code_ptr + 1 + sizeof(sljit_s32));
if (delta <= HALFWORD_MAX && delta >= HALFWORD_MIN) { if (delta <= HALFWORD_MAX && delta >= HALFWORD_MIN) {
*code_ptr++ = (type == 2) ? CALL_i32 : JMP_i32; *code_ptr++ = (type == 2) ? CALL_i32 : JMP_i32;
@ -87,12 +87,12 @@ static sljit_ub* generate_fixed_jump(sljit_ub *code_ptr, sljit_sw addr, sljit_si
return code_ptr; return code_ptr;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compiler, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler,
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds, sljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 saveds,
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size) sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
{ {
sljit_si i, tmp, size, saved_register_size; sljit_s32 i, tmp, size, saved_register_size;
sljit_ub *inst; sljit_u8 *inst;
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_enter(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size)); CHECK(check_sljit_emit_enter(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size));
@ -106,7 +106,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
tmp = saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - saveds) : SLJIT_FIRST_SAVED_REG; tmp = saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - saveds) : SLJIT_FIRST_SAVED_REG;
for (i = SLJIT_S0; i >= tmp; i--) { for (i = SLJIT_S0; i >= tmp; i--) {
size = reg_map[i] >= 8 ? 2 : 1; size = reg_map[i] >= 8 ? 2 : 1;
inst = (sljit_ub*)ensure_buf(compiler, 1 + size); inst = (sljit_u8*)ensure_buf(compiler, 1 + size);
FAIL_IF(!inst); FAIL_IF(!inst);
INC_SIZE(size); INC_SIZE(size);
if (reg_map[i] >= 8) if (reg_map[i] >= 8)
@ -116,7 +116,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
for (i = scratches; i >= SLJIT_FIRST_SAVED_REG; i--) { for (i = scratches; i >= SLJIT_FIRST_SAVED_REG; i--) {
size = reg_map[i] >= 8 ? 2 : 1; size = reg_map[i] >= 8 ? 2 : 1;
inst = (sljit_ub*)ensure_buf(compiler, 1 + size); inst = (sljit_u8*)ensure_buf(compiler, 1 + size);
FAIL_IF(!inst); FAIL_IF(!inst);
INC_SIZE(size); INC_SIZE(size);
if (reg_map[i] >= 8) if (reg_map[i] >= 8)
@ -126,7 +126,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
if (args > 0) { if (args > 0) {
size = args * 3; size = args * 3;
inst = (sljit_ub*)ensure_buf(compiler, 1 + size); inst = (sljit_u8*)ensure_buf(compiler, 1 + size);
FAIL_IF(!inst); FAIL_IF(!inst);
INC_SIZE(size); INC_SIZE(size);
@ -172,9 +172,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
#ifdef _WIN64 #ifdef _WIN64
if (local_size > 1024) { if (local_size > 1024) {
/* Allocate stack for the callback, which grows the stack. */ /* Allocate stack for the callback, which grows the stack. */
inst = (sljit_ub*)ensure_buf(compiler, 1 + 4 + (3 + sizeof(sljit_si))); inst = (sljit_u8*)ensure_buf(compiler, 1 + 4 + (3 + sizeof(sljit_s32)));
FAIL_IF(!inst); FAIL_IF(!inst);
INC_SIZE(4 + (3 + sizeof(sljit_si))); INC_SIZE(4 + (3 + sizeof(sljit_s32)));
*inst++ = REX_W; *inst++ = REX_W;
*inst++ = GROUP_BINARY_83; *inst++ = GROUP_BINARY_83;
*inst++ = MOD_REG | SUB | 4; *inst++ = MOD_REG | SUB | 4;
@ -193,7 +193,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
*inst++ = REX_W; *inst++ = REX_W;
*inst++ = MOV_rm_i32; *inst++ = MOV_rm_i32;
*inst++ = MOD_REG | reg_lmap[SLJIT_R0]; *inst++ = MOD_REG | reg_lmap[SLJIT_R0];
*(sljit_si*)inst = local_size; *(sljit_s32*)inst = local_size;
#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \ #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \
|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
compiler->skip_checks = 1; compiler->skip_checks = 1;
@ -204,7 +204,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
SLJIT_ASSERT(local_size > 0); SLJIT_ASSERT(local_size > 0);
if (local_size <= 127) { if (local_size <= 127) {
inst = (sljit_ub*)ensure_buf(compiler, 1 + 4); inst = (sljit_u8*)ensure_buf(compiler, 1 + 4);
FAIL_IF(!inst); FAIL_IF(!inst);
INC_SIZE(4); INC_SIZE(4);
*inst++ = REX_W; *inst++ = REX_W;
@ -213,35 +213,35 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
*inst++ = local_size; *inst++ = local_size;
} }
else { else {
inst = (sljit_ub*)ensure_buf(compiler, 1 + 7); inst = (sljit_u8*)ensure_buf(compiler, 1 + 7);
FAIL_IF(!inst); FAIL_IF(!inst);
INC_SIZE(7); INC_SIZE(7);
*inst++ = REX_W; *inst++ = REX_W;
*inst++ = GROUP_BINARY_81; *inst++ = GROUP_BINARY_81;
*inst++ = MOD_REG | SUB | 4; *inst++ = MOD_REG | SUB | 4;
*(sljit_si*)inst = local_size; *(sljit_s32*)inst = local_size;
inst += sizeof(sljit_si); inst += sizeof(sljit_s32);
} }
#ifdef _WIN64 #ifdef _WIN64
/* Save xmm6 register: movaps [rsp + 0x20], xmm6 */ /* Save xmm6 register: movaps [rsp + 0x20], xmm6 */
if (fscratches >= 6 || fsaveds >= 1) { if (fscratches >= 6 || fsaveds >= 1) {
inst = (sljit_ub*)ensure_buf(compiler, 1 + 5); inst = (sljit_u8*)ensure_buf(compiler, 1 + 5);
FAIL_IF(!inst); FAIL_IF(!inst);
INC_SIZE(5); INC_SIZE(5);
*inst++ = GROUP_0F; *inst++ = GROUP_0F;
*(sljit_si*)inst = 0x20247429; *(sljit_s32*)inst = 0x20247429;
} }
#endif #endif
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_set_context(struct sljit_compiler *compiler, SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler,
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds, sljit_s32 options, sljit_s32 args, sljit_s32 scratches, sljit_s32 saveds,
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size) sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)
{ {
sljit_si saved_register_size; sljit_s32 saved_register_size;
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size)); CHECK(check_sljit_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size));
@ -253,10 +253,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_set_context(struct sljit_compiler *compi
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compiler, sljit_si op, sljit_si src, sljit_sw srcw) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw)
{ {
sljit_si i, tmp, size; sljit_s32 i, tmp, size;
sljit_ub *inst; sljit_u8 *inst;
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_return(compiler, op, src, srcw)); CHECK(check_sljit_emit_return(compiler, op, src, srcw));
@ -267,17 +267,17 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compi
#ifdef _WIN64 #ifdef _WIN64
/* Restore xmm6 register: movaps xmm6, [rsp + 0x20] */ /* Restore xmm6 register: movaps xmm6, [rsp + 0x20] */
if (compiler->fscratches >= 6 || compiler->fsaveds >= 1) { if (compiler->fscratches >= 6 || compiler->fsaveds >= 1) {
inst = (sljit_ub*)ensure_buf(compiler, 1 + 5); inst = (sljit_u8*)ensure_buf(compiler, 1 + 5);
FAIL_IF(!inst); FAIL_IF(!inst);
INC_SIZE(5); INC_SIZE(5);
*inst++ = GROUP_0F; *inst++ = GROUP_0F;
*(sljit_si*)inst = 0x20247428; *(sljit_s32*)inst = 0x20247428;
} }
#endif #endif
SLJIT_ASSERT(compiler->local_size > 0); SLJIT_ASSERT(compiler->local_size > 0);
if (compiler->local_size <= 127) { if (compiler->local_size <= 127) {
inst = (sljit_ub*)ensure_buf(compiler, 1 + 4); inst = (sljit_u8*)ensure_buf(compiler, 1 + 4);
FAIL_IF(!inst); FAIL_IF(!inst);
INC_SIZE(4); INC_SIZE(4);
*inst++ = REX_W; *inst++ = REX_W;
@ -286,19 +286,19 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compi
*inst = compiler->local_size; *inst = compiler->local_size;
} }
else { else {
inst = (sljit_ub*)ensure_buf(compiler, 1 + 7); inst = (sljit_u8*)ensure_buf(compiler, 1 + 7);
FAIL_IF(!inst); FAIL_IF(!inst);
INC_SIZE(7); INC_SIZE(7);
*inst++ = REX_W; *inst++ = REX_W;
*inst++ = GROUP_BINARY_81; *inst++ = GROUP_BINARY_81;
*inst++ = MOD_REG | ADD | 4; *inst++ = MOD_REG | ADD | 4;
*(sljit_si*)inst = compiler->local_size; *(sljit_s32*)inst = compiler->local_size;
} }
tmp = compiler->scratches; tmp = compiler->scratches;
for (i = SLJIT_FIRST_SAVED_REG; i <= tmp; i++) { for (i = SLJIT_FIRST_SAVED_REG; i <= tmp; i++) {
size = reg_map[i] >= 8 ? 2 : 1; size = reg_map[i] >= 8 ? 2 : 1;
inst = (sljit_ub*)ensure_buf(compiler, 1 + size); inst = (sljit_u8*)ensure_buf(compiler, 1 + size);
FAIL_IF(!inst); FAIL_IF(!inst);
INC_SIZE(size); INC_SIZE(size);
if (reg_map[i] >= 8) if (reg_map[i] >= 8)
@ -309,7 +309,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compi
tmp = compiler->saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - compiler->saveds) : SLJIT_FIRST_SAVED_REG; tmp = compiler->saveds < SLJIT_NUMBER_OF_SAVED_REGISTERS ? (SLJIT_S0 + 1 - compiler->saveds) : SLJIT_FIRST_SAVED_REG;
for (i = tmp; i <= SLJIT_S0; i++) { for (i = tmp; i <= SLJIT_S0; i++) {
size = reg_map[i] >= 8 ? 2 : 1; size = reg_map[i] >= 8 ? 2 : 1;
inst = (sljit_ub*)ensure_buf(compiler, 1 + size); inst = (sljit_u8*)ensure_buf(compiler, 1 + size);
FAIL_IF(!inst); FAIL_IF(!inst);
INC_SIZE(size); INC_SIZE(size);
if (reg_map[i] >= 8) if (reg_map[i] >= 8)
@ -317,7 +317,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compi
POP_REG(reg_lmap[i]); POP_REG(reg_lmap[i]);
} }
inst = (sljit_ub*)ensure_buf(compiler, 1 + 1); inst = (sljit_u8*)ensure_buf(compiler, 1 + 1);
FAIL_IF(!inst); FAIL_IF(!inst);
INC_SIZE(1); INC_SIZE(1);
RET(); RET();
@ -328,32 +328,32 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compi
/* Operators */ /* Operators */
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
static sljit_si emit_do_imm32(struct sljit_compiler *compiler, sljit_ub rex, sljit_ub opcode, sljit_sw imm) static sljit_s32 emit_do_imm32(struct sljit_compiler *compiler, sljit_u8 rex, sljit_u8 opcode, sljit_sw imm)
{ {
sljit_ub *inst; sljit_u8 *inst;
sljit_si length = 1 + (rex ? 1 : 0) + sizeof(sljit_si); sljit_s32 length = 1 + (rex ? 1 : 0) + sizeof(sljit_s32);
inst = (sljit_ub*)ensure_buf(compiler, 1 + length); inst = (sljit_u8*)ensure_buf(compiler, 1 + length);
FAIL_IF(!inst); FAIL_IF(!inst);
INC_SIZE(length); INC_SIZE(length);
if (rex) if (rex)
*inst++ = rex; *inst++ = rex;
*inst++ = opcode; *inst++ = opcode;
*(sljit_si*)inst = imm; *(sljit_s32*)inst = imm;
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
static sljit_ub* emit_x86_instruction(struct sljit_compiler *compiler, sljit_si size, static sljit_u8* emit_x86_instruction(struct sljit_compiler *compiler, sljit_s32 size,
/* The register or immediate operand. */ /* The register or immediate operand. */
sljit_si a, sljit_sw imma, sljit_s32 a, sljit_sw imma,
/* The general operand (not immediate). */ /* The general operand (not immediate). */
sljit_si b, sljit_sw immb) sljit_s32 b, sljit_sw immb)
{ {
sljit_ub *inst; sljit_u8 *inst;
sljit_ub *buf_ptr; sljit_u8 *buf_ptr;
sljit_ub rex = 0; sljit_u8 rex = 0;
sljit_si flags = size & ~0xf; sljit_s32 flags = size & ~0xf;
sljit_si inst_size; sljit_s32 inst_size;
/* The immediate operand must be 32 bit. */ /* The immediate operand must be 32 bit. */
SLJIT_ASSERT(!(a & SLJIT_IMM) || compiler->mode32 || IS_HALFWORD(imma)); SLJIT_ASSERT(!(a & SLJIT_IMM) || compiler->mode32 || IS_HALFWORD(imma));
@ -400,7 +400,7 @@ static sljit_ub* emit_x86_instruction(struct sljit_compiler *compiler, sljit_si
} }
if ((b & REG_MASK) == SLJIT_UNUSED) if ((b & REG_MASK) == SLJIT_UNUSED)
inst_size += 1 + sizeof(sljit_si); /* SIB byte required to avoid RIP based addressing. */ inst_size += 1 + sizeof(sljit_s32); /* SIB byte required to avoid RIP based addressing. */
else { else {
if (reg_map[b & REG_MASK] >= 8) if (reg_map[b & REG_MASK] >= 8)
rex |= REX_B; rex |= REX_B;
@ -408,12 +408,12 @@ static sljit_ub* emit_x86_instruction(struct sljit_compiler *compiler, sljit_si
if (immb != 0 && (!(b & OFFS_REG_MASK) || (b & OFFS_REG_MASK) == TO_OFFS_REG(SLJIT_SP))) { if (immb != 0 && (!(b & OFFS_REG_MASK) || (b & OFFS_REG_MASK) == TO_OFFS_REG(SLJIT_SP))) {
/* Immediate operand. */ /* Immediate operand. */
if (immb <= 127 && immb >= -128) if (immb <= 127 && immb >= -128)
inst_size += sizeof(sljit_sb); inst_size += sizeof(sljit_s8);
else else
inst_size += sizeof(sljit_si); inst_size += sizeof(sljit_s32);
} }
else if (reg_lmap[b & REG_MASK] == 5) else if (reg_lmap[b & REG_MASK] == 5)
inst_size += sizeof(sljit_sb); inst_size += sizeof(sljit_s8);
if ((b & OFFS_REG_MASK) != SLJIT_UNUSED) { if ((b & OFFS_REG_MASK) != SLJIT_UNUSED) {
inst_size += 1; /* SIB byte. */ inst_size += 1; /* SIB byte. */
@ -444,7 +444,7 @@ static sljit_ub* emit_x86_instruction(struct sljit_compiler *compiler, sljit_si
else if (flags & EX86_HALF_ARG) else if (flags & EX86_HALF_ARG)
inst_size += sizeof(short); inst_size += sizeof(short);
else else
inst_size += sizeof(sljit_si); inst_size += sizeof(sljit_s32);
} }
else { else {
SLJIT_ASSERT(!(flags & EX86_SHIFT_INS) || a == SLJIT_PREF_SHIFT_REG); SLJIT_ASSERT(!(flags & EX86_SHIFT_INS) || a == SLJIT_PREF_SHIFT_REG);
@ -456,7 +456,7 @@ static sljit_ub* emit_x86_instruction(struct sljit_compiler *compiler, sljit_si
if (rex) if (rex)
inst_size++; inst_size++;
inst = (sljit_ub*)ensure_buf(compiler, 1 + inst_size); inst = (sljit_u8*)ensure_buf(compiler, 1 + inst_size);
PTR_FAIL_IF(!inst); PTR_FAIL_IF(!inst);
/* Encoding the byte. */ /* Encoding the byte. */
@ -516,8 +516,8 @@ static sljit_ub* emit_x86_instruction(struct sljit_compiler *compiler, sljit_si
if (immb <= 127 && immb >= -128) if (immb <= 127 && immb >= -128)
*buf_ptr++ = immb; /* 8 bit displacement. */ *buf_ptr++ = immb; /* 8 bit displacement. */
else { else {
*(sljit_si*)buf_ptr = immb; /* 32 bit displacement. */ *(sljit_s32*)buf_ptr = immb; /* 32 bit displacement. */
buf_ptr += sizeof(sljit_si); buf_ptr += sizeof(sljit_s32);
} }
} }
} }
@ -533,8 +533,8 @@ static sljit_ub* emit_x86_instruction(struct sljit_compiler *compiler, sljit_si
else { else {
*buf_ptr++ |= 0x04; *buf_ptr++ |= 0x04;
*buf_ptr++ = 0x25; *buf_ptr++ = 0x25;
*(sljit_si*)buf_ptr = immb; /* 32 bit displacement. */ *(sljit_s32*)buf_ptr = immb; /* 32 bit displacement. */
buf_ptr += sizeof(sljit_si); buf_ptr += sizeof(sljit_s32);
} }
if (a & SLJIT_IMM) { if (a & SLJIT_IMM) {
@ -543,7 +543,7 @@ static sljit_ub* emit_x86_instruction(struct sljit_compiler *compiler, sljit_si
else if (flags & EX86_HALF_ARG) else if (flags & EX86_HALF_ARG)
*(short*)buf_ptr = imma; *(short*)buf_ptr = imma;
else if (!(flags & EX86_SHIFT_INS)) else if (!(flags & EX86_SHIFT_INS))
*(sljit_si*)buf_ptr = imma; *(sljit_s32*)buf_ptr = imma;
} }
return !(flags & EX86_SHIFT_INS) ? inst : (inst + 1); return !(flags & EX86_SHIFT_INS) ? inst : (inst + 1);
@ -553,14 +553,14 @@ static sljit_ub* emit_x86_instruction(struct sljit_compiler *compiler, sljit_si
/* Call / return instructions */ /* Call / return instructions */
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
static SLJIT_INLINE sljit_si call_with_args(struct sljit_compiler *compiler, sljit_si type) static SLJIT_INLINE sljit_s32 call_with_args(struct sljit_compiler *compiler, sljit_s32 type)
{ {
sljit_ub *inst; sljit_u8 *inst;
#ifndef _WIN64 #ifndef _WIN64
SLJIT_COMPILE_ASSERT(reg_map[SLJIT_R1] == 6 && reg_map[SLJIT_R0] < 8 && reg_map[SLJIT_R2] < 8, args_registers); SLJIT_COMPILE_ASSERT(reg_map[SLJIT_R1] == 6 && reg_map[SLJIT_R0] < 8 && reg_map[SLJIT_R2] < 8, args_registers);
inst = (sljit_ub*)ensure_buf(compiler, 1 + ((type < SLJIT_CALL3) ? 3 : 6)); inst = (sljit_u8*)ensure_buf(compiler, 1 + ((type < SLJIT_CALL3) ? 3 : 6));
FAIL_IF(!inst); FAIL_IF(!inst);
INC_SIZE((type < SLJIT_CALL3) ? 3 : 6); INC_SIZE((type < SLJIT_CALL3) ? 3 : 6);
if (type >= SLJIT_CALL3) { if (type >= SLJIT_CALL3) {
@ -574,7 +574,7 @@ static SLJIT_INLINE sljit_si call_with_args(struct sljit_compiler *compiler, slj
#else #else
SLJIT_COMPILE_ASSERT(reg_map[SLJIT_R1] == 2 && reg_map[SLJIT_R0] < 8 && reg_map[SLJIT_R2] < 8, args_registers); SLJIT_COMPILE_ASSERT(reg_map[SLJIT_R1] == 2 && reg_map[SLJIT_R0] < 8 && reg_map[SLJIT_R2] < 8, args_registers);
inst = (sljit_ub*)ensure_buf(compiler, 1 + ((type < SLJIT_CALL3) ? 3 : 6)); inst = (sljit_u8*)ensure_buf(compiler, 1 + ((type < SLJIT_CALL3) ? 3 : 6));
FAIL_IF(!inst); FAIL_IF(!inst);
INC_SIZE((type < SLJIT_CALL3) ? 3 : 6); INC_SIZE((type < SLJIT_CALL3) ? 3 : 6);
if (type >= SLJIT_CALL3) { if (type >= SLJIT_CALL3) {
@ -589,9 +589,9 @@ static SLJIT_INLINE sljit_si call_with_args(struct sljit_compiler *compiler, slj
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_si dst, sljit_sw dstw) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)
{ {
sljit_ub *inst; sljit_u8 *inst;
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw)); CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw));
@ -603,14 +603,14 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_enter(struct sljit_compiler *c
if (FAST_IS_REG(dst)) { if (FAST_IS_REG(dst)) {
if (reg_map[dst] < 8) { if (reg_map[dst] < 8) {
inst = (sljit_ub*)ensure_buf(compiler, 1 + 1); inst = (sljit_u8*)ensure_buf(compiler, 1 + 1);
FAIL_IF(!inst); FAIL_IF(!inst);
INC_SIZE(1); INC_SIZE(1);
POP_REG(reg_lmap[dst]); POP_REG(reg_lmap[dst]);
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
inst = (sljit_ub*)ensure_buf(compiler, 1 + 2); inst = (sljit_u8*)ensure_buf(compiler, 1 + 2);
FAIL_IF(!inst); FAIL_IF(!inst);
INC_SIZE(2); INC_SIZE(2);
*inst++ = REX_B; *inst++ = REX_B;
@ -626,9 +626,9 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_enter(struct sljit_compiler *c
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
} }
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_si src, sljit_sw srcw) SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_s32 src, sljit_sw srcw)
{ {
sljit_ub *inst; sljit_u8 *inst;
CHECK_ERROR(); CHECK_ERROR();
CHECK(check_sljit_emit_fast_return(compiler, src, srcw)); CHECK(check_sljit_emit_fast_return(compiler, src, srcw));
@ -641,14 +641,14 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_return(struct sljit_compiler *
if (FAST_IS_REG(src)) { if (FAST_IS_REG(src)) {
if (reg_map[src] < 8) { if (reg_map[src] < 8) {
inst = (sljit_ub*)ensure_buf(compiler, 1 + 1 + 1); inst = (sljit_u8*)ensure_buf(compiler, 1 + 1 + 1);
FAIL_IF(!inst); FAIL_IF(!inst);
INC_SIZE(1 + 1); INC_SIZE(1 + 1);
PUSH_REG(reg_lmap[src]); PUSH_REG(reg_lmap[src]);
} }
else { else {
inst = (sljit_ub*)ensure_buf(compiler, 1 + 2 + 1); inst = (sljit_u8*)ensure_buf(compiler, 1 + 2 + 1);
FAIL_IF(!inst); FAIL_IF(!inst);
INC_SIZE(2 + 1); INC_SIZE(2 + 1);
@ -664,20 +664,20 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_return(struct sljit_compiler *
*inst++ = GROUP_FF; *inst++ = GROUP_FF;
*inst |= PUSH_rm; *inst |= PUSH_rm;
inst = (sljit_ub*)ensure_buf(compiler, 1 + 1); inst = (sljit_u8*)ensure_buf(compiler, 1 + 1);
FAIL_IF(!inst); FAIL_IF(!inst);
INC_SIZE(1); INC_SIZE(1);
} }
else { else {
SLJIT_ASSERT(IS_HALFWORD(srcw)); SLJIT_ASSERT(IS_HALFWORD(srcw));
/* SLJIT_IMM. */ /* SLJIT_IMM. */
inst = (sljit_ub*)ensure_buf(compiler, 1 + 5 + 1); inst = (sljit_u8*)ensure_buf(compiler, 1 + 5 + 1);
FAIL_IF(!inst); FAIL_IF(!inst);
INC_SIZE(5 + 1); INC_SIZE(5 + 1);
*inst++ = PUSH_i32; *inst++ = PUSH_i32;
*(sljit_si*)inst = srcw; *(sljit_s32*)inst = srcw;
inst += sizeof(sljit_si); inst += sizeof(sljit_s32);
} }
RET(); RET();
@ -689,12 +689,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_return(struct sljit_compiler *
/* Extend input */ /* Extend input */
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
static sljit_si emit_mov_int(struct sljit_compiler *compiler, sljit_si sign, static sljit_s32 emit_mov_int(struct sljit_compiler *compiler, sljit_s32 sign,
sljit_si dst, sljit_sw dstw, sljit_s32 dst, sljit_sw dstw,
sljit_si src, sljit_sw srcw) sljit_s32 src, sljit_sw srcw)
{ {
sljit_ub* inst; sljit_u8* inst;
sljit_si dst_r; sljit_s32 dst_r;
compiler->mode32 = 0; compiler->mode32 = 0;
@ -704,7 +704,7 @@ static sljit_si emit_mov_int(struct sljit_compiler *compiler, sljit_si sign,
if (src & SLJIT_IMM) { if (src & SLJIT_IMM) {
if (FAST_IS_REG(dst)) { if (FAST_IS_REG(dst)) {
if (sign || ((sljit_uw)srcw <= 0x7fffffff)) { if (sign || ((sljit_uw)srcw <= 0x7fffffff)) {
inst = emit_x86_instruction(compiler, 1, SLJIT_IMM, (sljit_sw)(sljit_si)srcw, dst, dstw); inst = emit_x86_instruction(compiler, 1, SLJIT_IMM, (sljit_sw)(sljit_s32)srcw, dst, dstw);
FAIL_IF(!inst); FAIL_IF(!inst);
*inst = MOV_rm_i32; *inst = MOV_rm_i32;
return SLJIT_SUCCESS; return SLJIT_SUCCESS;
@ -712,7 +712,7 @@ static sljit_si emit_mov_int(struct sljit_compiler *compiler, sljit_si sign,
return emit_load_imm64(compiler, dst, srcw); return emit_load_imm64(compiler, dst, srcw);
} }
compiler->mode32 = 1; compiler->mode32 = 1;
inst = emit_x86_instruction(compiler, 1, SLJIT_IMM, (sljit_sw)(sljit_si)srcw, dst, dstw); inst = emit_x86_instruction(compiler, 1, SLJIT_IMM, (sljit_sw)(sljit_s32)srcw, dst, dstw);
FAIL_IF(!inst); FAIL_IF(!inst);
*inst = MOV_rm_i32; *inst = MOV_rm_i32;
compiler->mode32 = 0; compiler->mode32 = 0;

File diff suppressed because it is too large Load Diff

View File

@ -163,11 +163,11 @@ SLJIT_API_FUNC_ATTRIBUTE void SLJIT_CALL sljit_release_lock(void)
#include <fcntl.h> #include <fcntl.h>
/* Some old systems does not have MAP_ANON. */ /* Some old systems does not have MAP_ANON. */
static sljit_si dev_zero = -1; static sljit_s32 dev_zero = -1;
#if (defined SLJIT_SINGLE_THREADED && SLJIT_SINGLE_THREADED) #if (defined SLJIT_SINGLE_THREADED && SLJIT_SINGLE_THREADED)
static SLJIT_INLINE sljit_si open_dev_zero(void) static SLJIT_INLINE sljit_s32 open_dev_zero(void)
{ {
dev_zero = open("/dev/zero", O_RDWR); dev_zero = open("/dev/zero", O_RDWR);
return dev_zero < 0; return dev_zero < 0;
@ -179,10 +179,13 @@ static SLJIT_INLINE sljit_si open_dev_zero(void)
static pthread_mutex_t dev_zero_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t dev_zero_mutex = PTHREAD_MUTEX_INITIALIZER;
static SLJIT_INLINE sljit_si open_dev_zero(void) static SLJIT_INLINE sljit_s32 open_dev_zero(void)
{ {
pthread_mutex_lock(&dev_zero_mutex); pthread_mutex_lock(&dev_zero_mutex);
dev_zero = open("/dev/zero", O_RDWR); /* The dev_zero might be initialized by another thread during the waiting. */
if (dev_zero < 0) {
dev_zero = open("/dev/zero", O_RDWR);
}
pthread_mutex_unlock(&dev_zero_mutex); pthread_mutex_unlock(&dev_zero_mutex);
return dev_zero < 0; return dev_zero < 0;
} }

View File

@ -138,4 +138,6 @@ is required for these tests. --/
/.((?2)(?R)\1)()/B /.((?2)(?R)\1)()/B
/([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00](*ACCEPT)/
/-- End of testinput11 --/ /-- End of testinput11 --/

View File

@ -4217,4 +4217,30 @@ backtracking verbs. --/
/a[[:punct:]b]/BZ /a[[:punct:]b]/BZ
/L(?#(|++<!(2)?/BZ
/L(?#(|++<!(2)?/BOZ
/L(?#(|++<!(2)?/BCZ
/L(?#(|++<!(2)?/BCOZ
/(A*)\E+/CBZ
/()\Q\E*]/BCZ
/(?<A>)(?J:(?<B>)(?<B>))(?<C>)/
\O\CC
/(?=a\K)/
ring bpattingbobnd $ 1,oern cou \rb\L
/(?<=((?C)0))/
9010
abcd
/((?J)(?'R'(?'R'(?'R'(?'R'(?'R'(?|(\k'R'))))))))/
/\N(?(?C)0?!.)*/
/-- End of testinput2 --/ /-- End of testinput2 --/

View File

@ -1553,4 +1553,13 @@
\x{200} \x{200}
\x{37e} \x{37e}
/[^[:^ascii:]\d]/8W
a
~
0
\a
\x{7f}
\x{389}
\x{20ac}
/-- End of testinput6 --/ /-- End of testinput6 --/

View File

@ -853,4 +853,8 @@ of case for anything other than the ASCII letters. --/
/a[b[:punct:]]/8WBZ /a[b[:punct:]]/8WBZ
/L(?#(|++<!(2)?/B8COZ
/L(?#(|++<!(2)?/B8WCZ
/-- End of testinput7 --/ /-- End of testinput7 --/

View File

@ -231,7 +231,7 @@ Memory allocation (code space): 73
------------------------------------------------------------------ ------------------------------------------------------------------
/(?P<a>a)...(?P=a)bbb(?P>a)d/BM /(?P<a>a)...(?P=a)bbb(?P>a)d/BM
Memory allocation (code space): 77 Memory allocation (code space): 93
------------------------------------------------------------------ ------------------------------------------------------------------
0 24 Bra 0 24 Bra
2 5 CBra 1 2 5 CBra 1
@ -765,4 +765,7 @@ Memory allocation (code space): 14
25 End 25 End
------------------------------------------------------------------ ------------------------------------------------------------------
/([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00](*ACCEPT)/
Failed: regular expression is too complicated at offset 490
/-- End of testinput11 --/ /-- End of testinput11 --/

View File

@ -231,7 +231,7 @@ Memory allocation (code space): 155
------------------------------------------------------------------ ------------------------------------------------------------------
/(?P<a>a)...(?P=a)bbb(?P>a)d/BM /(?P<a>a)...(?P=a)bbb(?P>a)d/BM
Memory allocation (code space): 157 Memory allocation (code space): 189
------------------------------------------------------------------ ------------------------------------------------------------------
0 24 Bra 0 24 Bra
2 5 CBra 1 2 5 CBra 1
@ -765,4 +765,7 @@ Memory allocation (code space): 28
25 End 25 End
------------------------------------------------------------------ ------------------------------------------------------------------
/([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00](*ACCEPT)/
Failed: missing ) at offset 509
/-- End of testinput11 --/ /-- End of testinput11 --/

View File

@ -231,7 +231,7 @@ Memory allocation (code space): 45
------------------------------------------------------------------ ------------------------------------------------------------------
/(?P<a>a)...(?P=a)bbb(?P>a)d/BM /(?P<a>a)...(?P=a)bbb(?P>a)d/BM
Memory allocation (code space): 50 Memory allocation (code space): 62
------------------------------------------------------------------ ------------------------------------------------------------------
0 30 Bra 0 30 Bra
3 7 CBra 1 3 7 CBra 1
@ -765,4 +765,7 @@ Memory allocation (code space): 10
38 End 38 End
------------------------------------------------------------------ ------------------------------------------------------------------
/([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00](*ACCEPT)/
Failed: missing ) at offset 509
/-- End of testinput11 --/ /-- End of testinput11 --/

View File

@ -419,7 +419,7 @@ Need char = '>'
/(?U)<.*>/I /(?U)<.*>/I
Capturing subpattern count = 0 Capturing subpattern count = 0
Options: ungreedy No options
First char = '<' First char = '<'
Need char = '>' Need char = '>'
abc<def>ghi<klm>nop abc<def>ghi<klm>nop
@ -443,7 +443,7 @@ Need char = '='
/(?U)={3,}?/I /(?U)={3,}?/I
Capturing subpattern count = 0 Capturing subpattern count = 0
Options: ungreedy No options
First char = '=' First char = '='
Need char = '=' Need char = '='
abc========def abc========def
@ -477,7 +477,7 @@ Failed: lookbehind assertion is not fixed length at offset 12
/(?i)abc/I /(?i)abc/I
Capturing subpattern count = 0 Capturing subpattern count = 0
Options: caseless No options
First char = 'a' (caseless) First char = 'a' (caseless)
Need char = 'c' (caseless) Need char = 'c' (caseless)
@ -489,7 +489,7 @@ No need char
/(?i)^1234/I /(?i)^1234/I
Capturing subpattern count = 0 Capturing subpattern count = 0
Options: anchored caseless Options: anchored
No first char No first char
No need char No need char
@ -502,7 +502,7 @@ No need char
/(?s).*/I /(?s).*/I
Capturing subpattern count = 0 Capturing subpattern count = 0
May match empty string May match empty string
Options: anchored dotall Options: anchored
No first char No first char
No need char No need char
@ -516,7 +516,7 @@ Starting chars: a b c d
/(?i)[abcd]/IS /(?i)[abcd]/IS
Capturing subpattern count = 0 Capturing subpattern count = 0
Options: caseless No options
No first char No first char
No need char No need char
Subject length lower bound = 1 Subject length lower bound = 1
@ -524,7 +524,7 @@ Starting chars: A B C D a b c d
/(?m)[xy]|(b|c)/IS /(?m)[xy]|(b|c)/IS
Capturing subpattern count = 1 Capturing subpattern count = 1
Options: multiline No options
No first char No first char
No need char No need char
Subject length lower bound = 1 Subject length lower bound = 1
@ -538,7 +538,7 @@ No need char
/(?i)(^a|^b)/Im /(?i)(^a|^b)/Im
Capturing subpattern count = 1 Capturing subpattern count = 1
Options: caseless multiline Options: multiline
First char at start or follows newline First char at start or follows newline
No need char No need char
@ -555,13 +555,13 @@ Failed: malformed number or name after (?( at offset 4
Failed: malformed number or name after (?( at offset 4 Failed: malformed number or name after (?( at offset 4
/(?(?i))/ /(?(?i))/
Failed: assertion expected after (?( at offset 3 Failed: assertion expected after (?( or (?(?C) at offset 3
/(?(abc))/ /(?(abc))/
Failed: reference to non-existent subpattern at offset 7 Failed: reference to non-existent subpattern at offset 7
/(?(?<ab))/ /(?(?<ab))/
Failed: assertion expected after (?( at offset 3 Failed: assertion expected after (?( or (?(?C) at offset 3
/((?s)blah)\s+\1/I /((?s)blah)\s+\1/I
Capturing subpattern count = 1 Capturing subpattern count = 1
@ -1179,7 +1179,7 @@ No need char
End End
------------------------------------------------------------------ ------------------------------------------------------------------
Capturing subpattern count = 1 Capturing subpattern count = 1
Options: anchored dotall Options: anchored
No first char No first char
No need char No need char
@ -2735,7 +2735,7 @@ No match
End End
------------------------------------------------------------------ ------------------------------------------------------------------
Capturing subpattern count = 0 Capturing subpattern count = 0
Options: caseless extended Options: extended
First char = 'a' (caseless) First char = 'a' (caseless)
Need char = 'c' (caseless) Need char = 'c' (caseless)
@ -2748,7 +2748,7 @@ Need char = 'c' (caseless)
End End
------------------------------------------------------------------ ------------------------------------------------------------------
Capturing subpattern count = 0 Capturing subpattern count = 0
Options: caseless extended Options: extended
First char = 'a' (caseless) First char = 'a' (caseless)
Need char = 'c' (caseless) Need char = 'c' (caseless)
@ -3095,7 +3095,7 @@ Need char = 'b'
End End
------------------------------------------------------------------ ------------------------------------------------------------------
Capturing subpattern count = 0 Capturing subpattern count = 0
Options: ungreedy No options
First char = 'x' First char = 'x'
Need char = 'b' Need char = 'b'
xaaaab xaaaab
@ -3497,7 +3497,7 @@ Need char = 'c'
/(?i)[ab]/IS /(?i)[ab]/IS
Capturing subpattern count = 0 Capturing subpattern count = 0
Options: caseless No options
No first char No first char
No need char No need char
Subject length lower bound = 1 Subject length lower bound = 1
@ -6299,7 +6299,7 @@ Capturing subpattern count = 3
Named capturing subpatterns: Named capturing subpatterns:
A 2 A 2
A 3 A 3
Options: anchored dupnames Options: anchored
Duplicate name status changes Duplicate name status changes
No first char No first char
No need char No need char
@ -7870,7 +7870,7 @@ No match
Failed: malformed number or name after (?( at offset 6 Failed: malformed number or name after (?( at offset 6
/(?(''))/ /(?(''))/
Failed: assertion expected after (?( at offset 4 Failed: assertion expected after (?( or (?(?C) at offset 4
/(?('R')stuff)/ /(?('R')stuff)/
Failed: reference to non-existent subpattern at offset 7 Failed: reference to non-existent subpattern at offset 7
@ -14346,7 +14346,7 @@ No match
"((?2)+)((?1))" "((?2)+)((?1))"
"(?(?<E>.*!.*)?)" "(?(?<E>.*!.*)?)"
Failed: assertion expected after (?( at offset 3 Failed: assertion expected after (?( or (?(?C) at offset 3
"X((?2)()*+){2}+"BZ "X((?2)()*+){2}+"BZ
------------------------------------------------------------------ ------------------------------------------------------------------
@ -14574,4 +14574,100 @@ No match
End End
------------------------------------------------------------------ ------------------------------------------------------------------
/L(?#(|++<!(2)?/BZ
------------------------------------------------------------------
Bra
L?+
Ket
End
------------------------------------------------------------------
/L(?#(|++<!(2)?/BOZ
------------------------------------------------------------------
Bra
L?
Ket
End
------------------------------------------------------------------
/L(?#(|++<!(2)?/BCZ
------------------------------------------------------------------
Bra
Callout 255 0 14
L?+
Callout 255 14 0
Ket
End
------------------------------------------------------------------
/L(?#(|++<!(2)?/BCOZ
------------------------------------------------------------------
Bra
Callout 255 0 14
L?
Callout 255 14 0
Ket
End
------------------------------------------------------------------
/(A*)\E+/CBZ
------------------------------------------------------------------
Bra
Callout 255 0 7
SCBra 1
Callout 255 1 2
A*
Callout 255 3 0
KetRmax
Callout 255 7 0
Ket
End
------------------------------------------------------------------
/()\Q\E*]/BCZ
------------------------------------------------------------------
Bra
Callout 255 0 7
Brazero
SCBra 1
Callout 255 1 0
KetRmax
Callout 255 7 1
]
Callout 255 8 0
Ket
End
------------------------------------------------------------------
/(?<A>)(?J:(?<B>)(?<B>))(?<C>)/
\O\CC
Matched, but too many substrings
copy substring C failed -7
/(?=a\K)/
ring bpattingbobnd $ 1,oern cou \rb\L
Start of matched string is beyond its end - displaying from end to start.
0: a
0L
/(?<=((?C)0))/
9010
--->9010
0 ^ 0
0 ^ 0
0:
1: 0
abcd
--->abcd
0 ^ 0
0 ^ 0
0 ^ 0
0 ^ 0
No match
/((?J)(?'R'(?'R'(?'R'(?'R'(?'R'(?|(\k'R'))))))))/
/\N(?(?C)0?!.)*/
Failed: assertion expected after (?( or (?(?C) at offset 4
/-- End of testinput2 --/ /-- End of testinput2 --/

View File

@ -2557,4 +2557,20 @@ No match
\x{37e} \x{37e}
0: \x{37e} 0: \x{37e}
/[^[:^ascii:]\d]/8W
a
0: a
~
0: ~
0
No match
\a
0: \x{07}
\x{7f}
0: \x{7f}
\x{389}
No match
\x{20ac}
No match
/-- End of testinput6 --/ /-- End of testinput6 --/

View File

@ -2348,4 +2348,24 @@ No match
End End
------------------------------------------------------------------ ------------------------------------------------------------------
/L(?#(|++<!(2)?/B8COZ
------------------------------------------------------------------
Bra
Callout 255 0 14
L?
Callout 255 14 0
Ket
End
------------------------------------------------------------------
/L(?#(|++<!(2)?/B8WCZ
------------------------------------------------------------------
Bra
Callout 255 0 14
L?+
Callout 255 14 0
Ket
End
------------------------------------------------------------------
/-- End of testinput7 --/ /-- End of testinput7 --/

15
pcre/testdata/valgrind-jit.supp vendored Normal file
View File

@ -0,0 +1,15 @@
{
name
Memcheck:Addr16
obj:???
obj:???
obj:???
}
{
name
Memcheck:Cond
obj:???
obj:???
obj:???
}