8.37
This commit is contained in:
parent
553b437d38
commit
c4cc91cdc9
@ -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-2014 University of Cambridge
|
Copyright (c) 1997-2015 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-2014 Zoltan Herczeg
|
Copyright(c) 2010-2015 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-2014 Zoltan Herczeg
|
Copyright(c) 2009-2015 Zoltan Herczeg
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
|
|
||||||
|
167
pcre/ChangeLog
167
pcre/ChangeLog
@ -1,6 +1,173 @@
|
|||||||
ChangeLog for PCRE
|
ChangeLog for PCRE
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
|
Version 8.37 28-April-2015
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
1. When an (*ACCEPT) is triggered inside capturing parentheses, it arranges
|
||||||
|
for those parentheses to be closed with whatever has been captured so far.
|
||||||
|
However, it was failing to mark any other groups between the hightest
|
||||||
|
capture so far and the currrent group as "unset". Thus, the ovector for
|
||||||
|
those groups contained whatever was previously there. An example is the
|
||||||
|
pattern /(x)|((*ACCEPT))/ when matched against "abcd".
|
||||||
|
|
||||||
|
2. If an assertion condition was quantified with a minimum of zero (an odd
|
||||||
|
thing to do, but it happened), SIGSEGV or other misbehaviour could occur.
|
||||||
|
|
||||||
|
3. If a pattern in pcretest input had the P (POSIX) modifier followed by an
|
||||||
|
unrecognized modifier, a crash could occur.
|
||||||
|
|
||||||
|
4. An attempt to do global matching in pcretest with a zero-length ovector
|
||||||
|
caused a crash.
|
||||||
|
|
||||||
|
5. Fixed a memory leak during matching that could occur for a subpattern
|
||||||
|
subroutine call (recursive or otherwise) if the number of captured groups
|
||||||
|
that had to be saved was greater than ten.
|
||||||
|
|
||||||
|
6. Catch a bad opcode during auto-possessification after compiling a bad UTF
|
||||||
|
string with NO_UTF_CHECK. This is a tidyup, not a bug fix, as passing bad
|
||||||
|
UTF with NO_UTF_CHECK is documented as having an undefined outcome.
|
||||||
|
|
||||||
|
7. A UTF pattern containing a "not" match of a non-ASCII character and a
|
||||||
|
subroutine reference could loop at compile time. Example: /[^\xff]((?1))/.
|
||||||
|
|
||||||
|
8. When a pattern is compiled, it remembers the highest back reference so that
|
||||||
|
when matching, if the ovector is too small, extra memory can be obtained to
|
||||||
|
use instead. A conditional subpattern whose condition is a check on a
|
||||||
|
capture having happened, such as, for example in the pattern
|
||||||
|
/^(?:(a)|b)(?(1)A|B)/, is another kind of back reference, but it was not
|
||||||
|
setting the highest backreference number. This mattered only if pcre_exec()
|
||||||
|
was called with an ovector that was too small to hold the capture, and there
|
||||||
|
was no other kind of back reference (a situation which is probably quite
|
||||||
|
rare). The effect of the bug was that the condition was always treated as
|
||||||
|
FALSE when the capture could not be consulted, leading to a incorrect
|
||||||
|
behaviour by pcre_exec(). This bug has been fixed.
|
||||||
|
|
||||||
|
9. A reference to a duplicated named group (either a back reference or a test
|
||||||
|
for being set in a conditional) that occurred in a part of the pattern where
|
||||||
|
PCRE_DUPNAMES was not set caused the amount of memory needed for the pattern
|
||||||
|
to be incorrectly calculated, leading to overwriting.
|
||||||
|
|
||||||
|
10. A mutually recursive set of back references such as (\2)(\1) caused a
|
||||||
|
segfault at study time (while trying to find the minimum matching length).
|
||||||
|
The infinite loop is now broken (with the minimum length unset, that is,
|
||||||
|
zero).
|
||||||
|
|
||||||
|
11. If an assertion that was used as a condition was quantified with a minimum
|
||||||
|
of zero, matching went wrong. In particular, if the whole group had
|
||||||
|
unlimited repetition and could match an empty string, a segfault was
|
||||||
|
likely. The pattern (?(?=0)?)+ is an example that caused this. Perl allows
|
||||||
|
assertions to be quantified, but not if they are being used as conditions,
|
||||||
|
so the above pattern is faulted by Perl. PCRE has now been changed so that
|
||||||
|
it also rejects such patterns.
|
||||||
|
|
||||||
|
12. A possessive capturing group such as (a)*+ with a minimum repeat of zero
|
||||||
|
failed to allow the zero-repeat case if pcre2_exec() was called with an
|
||||||
|
ovector too small to capture the group.
|
||||||
|
|
||||||
|
13. Fixed two bugs in pcretest that were discovered by fuzzing and reported by
|
||||||
|
Red Hat Product Security:
|
||||||
|
|
||||||
|
(a) A crash if /K and /F were both set with the option to save the compiled
|
||||||
|
pattern.
|
||||||
|
|
||||||
|
(b) Another crash if the option to print captured substrings in a callout
|
||||||
|
was combined with setting a null ovector, for example \O\C+ as a subject
|
||||||
|
string.
|
||||||
|
|
||||||
|
14. A pattern such as "((?2){0,1999}())?", which has a group containing a
|
||||||
|
forward reference repeated a large (but limited) number of times within a
|
||||||
|
repeated outer group that has a zero minimum quantifier, caused incorrect
|
||||||
|
code to be compiled, leading to the error "internal error:
|
||||||
|
previously-checked referenced subpattern not found" when an incorrect
|
||||||
|
memory address was read. This bug was reported as "heap overflow",
|
||||||
|
discovered by Kai Lu of Fortinet's FortiGuard Labs and given the CVE number
|
||||||
|
CVE-2015-2325.
|
||||||
|
|
||||||
|
23. A pattern such as "((?+1)(\1))/" containing a forward reference subroutine
|
||||||
|
call within a group that also contained a recursive back reference caused
|
||||||
|
incorrect code to be compiled. This bug was reported as "heap overflow",
|
||||||
|
discovered by Kai Lu of Fortinet's FortiGuard Labs, and given the CVE
|
||||||
|
number CVE-2015-2326.
|
||||||
|
|
||||||
|
24. Computing the size of the JIT read-only data in advance has been a source
|
||||||
|
of various issues, and new ones are still appear unfortunately. To fix
|
||||||
|
existing and future issues, size computation is eliminated from the code,
|
||||||
|
and replaced by on-demand memory allocation.
|
||||||
|
|
||||||
|
25. A pattern such as /(?i)[A-`]/, where characters in the other case are
|
||||||
|
adjacent to the end of the range, and the range contained characters with
|
||||||
|
more than one other case, caused incorrect behaviour when compiled in UTF
|
||||||
|
mode. In that example, the range a-j was left out of the class.
|
||||||
|
|
||||||
|
26. Fix JIT compilation of conditional blocks, which assertion
|
||||||
|
is converted to (*FAIL). E.g: /(?(?!))/.
|
||||||
|
|
||||||
|
27. The pattern /(?(?!)^)/ caused references to random memory. This bug was
|
||||||
|
discovered by the LLVM fuzzer.
|
||||||
|
|
||||||
|
28. The assertion (?!) is optimized to (*FAIL). This was not handled correctly
|
||||||
|
when this assertion was used as a condition, for example (?(?!)a|b). In
|
||||||
|
pcre2_match() it worked by luck; in pcre2_dfa_match() it gave an incorrect
|
||||||
|
error about an unsupported item.
|
||||||
|
|
||||||
|
29. For some types of pattern, for example /Z*(|d*){216}/, the auto-
|
||||||
|
possessification code could take exponential time to complete. A recursion
|
||||||
|
depth limit of 1000 has been imposed to limit the resources used by this
|
||||||
|
optimization.
|
||||||
|
|
||||||
|
30. A pattern such as /(*UTF)[\S\V\H]/, which contains a negated special class
|
||||||
|
such as \S in non-UCP mode, explicit wide characters (> 255) can be ignored
|
||||||
|
because \S ensures they are all in the class. The code for doing this was
|
||||||
|
interacting badly with the code for computing the amount of space needed to
|
||||||
|
compile the pattern, leading to a buffer overflow. This bug was discovered
|
||||||
|
by the LLVM fuzzer.
|
||||||
|
|
||||||
|
31. A pattern such as /((?2)+)((?1))/ which has mutual recursion nested inside
|
||||||
|
other kinds of group caused stack overflow at compile time. This bug was
|
||||||
|
discovered by the LLVM fuzzer.
|
||||||
|
|
||||||
|
32. A pattern such as /(?1)(?#?'){8}(a)/ which had a parenthesized comment
|
||||||
|
between a subroutine call and its quantifier was incorrectly compiled,
|
||||||
|
leading to buffer overflow or other errors. This bug was discovered by the
|
||||||
|
LLVM fuzzer.
|
||||||
|
|
||||||
|
33. The illegal pattern /(?(?<E>.*!.*)?)/ was not being diagnosed as missing an
|
||||||
|
assertion after (?(. The code was failing to check the character after
|
||||||
|
(?(?< for the ! or = that would indicate a lookbehind assertion. This bug
|
||||||
|
was discovered by the LLVM fuzzer.
|
||||||
|
|
||||||
|
34. A pattern such as /X((?2)()*+){2}+/ which has a possessive quantifier with
|
||||||
|
a fixed maximum following a group that contains a subroutine reference was
|
||||||
|
incorrectly compiled and could trigger buffer overflow. This bug was
|
||||||
|
discovered by the LLVM fuzzer.
|
||||||
|
|
||||||
|
35. A mutual recursion within a lookbehind assertion such as (?<=((?2))((?1)))
|
||||||
|
caused a stack overflow instead of the diagnosis of a non-fixed length
|
||||||
|
lookbehind assertion. This bug was discovered by the LLVM fuzzer.
|
||||||
|
|
||||||
|
36. The use of \K in a positive lookbehind assertion in a non-anchored pattern
|
||||||
|
(e.g. /(?<=\Ka)/) could make pcregrep loop.
|
||||||
|
|
||||||
|
37. There was a similar problem to 36 in pcretest for global matches.
|
||||||
|
|
||||||
|
38. If a greedy quantified \X was preceded by \C in UTF mode (e.g. \C\X*),
|
||||||
|
and a subsequent item in the pattern caused a non-match, backtracking over
|
||||||
|
the repeated \X did not stop, but carried on past the start of the subject,
|
||||||
|
causing reference to random memory and/or a segfault. There were also some
|
||||||
|
other cases where backtracking after \C could crash. This set of bugs was
|
||||||
|
discovered by the LLVM fuzzer.
|
||||||
|
|
||||||
|
39. The function for finding the minimum length of a matching string could take
|
||||||
|
a very long time if mutual recursion was present many times in a pattern,
|
||||||
|
for example, /((?2){73}(?2))((?1))/. A better mutual recursion detection
|
||||||
|
method has been implemented. This infelicity was discovered by the LLVM
|
||||||
|
fuzzer.
|
||||||
|
|
||||||
|
40. Static linking against the PCRE library using the pkg-config module was
|
||||||
|
failing on missing pthread symbols.
|
||||||
|
|
||||||
|
|
||||||
Version 8.36 26-September-2014
|
Version 8.36 26-September-2014
|
||||||
------------------------------
|
------------------------------
|
||||||
|
|
||||||
|
@ -6,7 +6,8 @@ and semantics are as close as possible to those of the Perl 5 language.
|
|||||||
|
|
||||||
Release 8 of PCRE is distributed under the terms of the "BSD" licence, as
|
Release 8 of PCRE is distributed under the terms of the "BSD" licence, as
|
||||||
specified below. The documentation for PCRE, supplied in the "doc"
|
specified below. The documentation for PCRE, supplied in the "doc"
|
||||||
directory, is distributed under the same terms as the software itself.
|
directory, is distributed under the same terms as the software itself. The data
|
||||||
|
in the testdata directory is not copyrighted and is in the public domain.
|
||||||
|
|
||||||
The basic library functions are written in C and are freestanding. Also
|
The basic library functions are written in C and are freestanding. Also
|
||||||
included in the distribution is a set of C++ wrapper functions, and a
|
included in the distribution is a set of C++ wrapper functions, and a
|
||||||
@ -24,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-2014 University of Cambridge
|
Copyright (c) 1997-2015 University of Cambridge
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
|
|
||||||
@ -35,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-2014 Zoltan Herczeg
|
Copyright(c) 2010-2015 Zoltan Herczeg
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
|
|
||||||
@ -46,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-2014 Zoltan Herczeg
|
Copyright(c) 2009-2015 Zoltan Herczeg
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
# Makefile.in generated by automake 1.14.1 from Makefile.am.
|
# Makefile.in generated by automake 1.15 from Makefile.am.
|
||||||
# @configure_input@
|
# @configure_input@
|
||||||
|
|
||||||
# Copyright (C) 1994-2013 Free Software Foundation, Inc.
|
# Copyright (C) 1994-2014 Free Software Foundation, Inc.
|
||||||
|
|
||||||
# This Makefile.in is free software; the Free Software Foundation
|
# This Makefile.in is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
@ -19,7 +19,17 @@
|
|||||||
|
|
||||||
|
|
||||||
VPATH = @srcdir@
|
VPATH = @srcdir@
|
||||||
am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
|
am__is_gnu_make = { \
|
||||||
|
if test -z '$(MAKELEVEL)'; then \
|
||||||
|
false; \
|
||||||
|
elif test -n '$(MAKE_HOST)'; then \
|
||||||
|
true; \
|
||||||
|
elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
|
||||||
|
true; \
|
||||||
|
else \
|
||||||
|
false; \
|
||||||
|
fi; \
|
||||||
|
}
|
||||||
am__make_running_with_option = \
|
am__make_running_with_option = \
|
||||||
case $${target_option-} in \
|
case $${target_option-} in \
|
||||||
?) ;; \
|
?) ;; \
|
||||||
@ -151,18 +161,6 @@ noinst_PROGRAMS = $(am__EXEEXT_2) $(am__EXEEXT_3) $(am__EXEEXT_4)
|
|||||||
@WITH_PCRE32_TRUE@am__append_44 = libpcre32.pc
|
@WITH_PCRE32_TRUE@am__append_44 = libpcre32.pc
|
||||||
@WITH_PCRE_CPP_TRUE@am__append_45 = libpcrecpp.pc
|
@WITH_PCRE_CPP_TRUE@am__append_45 = libpcrecpp.pc
|
||||||
subdir = .
|
subdir = .
|
||||||
DIST_COMMON = INSTALL NEWS README AUTHORS ChangeLog \
|
|
||||||
$(srcdir)/Makefile.in $(srcdir)/Makefile.am \
|
|
||||||
$(top_srcdir)/configure $(am__configure_deps) \
|
|
||||||
$(srcdir)/config.h.in $(srcdir)/libpcre.pc.in \
|
|
||||||
$(srcdir)/libpcre16.pc.in $(srcdir)/libpcre32.pc.in \
|
|
||||||
$(srcdir)/libpcreposix.pc.in $(srcdir)/libpcrecpp.pc.in \
|
|
||||||
$(srcdir)/pcre-config.in $(srcdir)/pcre.h.in \
|
|
||||||
$(srcdir)/pcre_stringpiece.h.in $(srcdir)/pcrecpparg.h.in \
|
|
||||||
$(am__dist_noinst_SCRIPTS_DIST) depcomp $(dist_man_MANS) \
|
|
||||||
$(dist_doc_DATA) $(dist_html_DATA) $(dist_noinst_DATA) \
|
|
||||||
$(am__include_HEADERS_DIST) test-driver COPYING ar-lib compile \
|
|
||||||
config.guess config.sub install-sh missing ltmain.sh
|
|
||||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
||||||
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \
|
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \
|
||||||
$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
|
$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
|
||||||
@ -171,6 +169,10 @@ am__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \
|
|||||||
$(top_srcdir)/m4/pcre_visibility.m4 $(top_srcdir)/configure.ac
|
$(top_srcdir)/m4/pcre_visibility.m4 $(top_srcdir)/configure.ac
|
||||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
||||||
$(ACLOCAL_M4)
|
$(ACLOCAL_M4)
|
||||||
|
DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
|
||||||
|
$(am__configure_deps) $(am__dist_noinst_SCRIPTS_DIST) \
|
||||||
|
$(dist_doc_DATA) $(dist_html_DATA) $(dist_noinst_DATA) \
|
||||||
|
$(am__include_HEADERS_DIST) $(am__DIST_COMMON)
|
||||||
am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
|
am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
|
||||||
configure.lineno config.status.lineno
|
configure.lineno config.status.lineno
|
||||||
mkinstalldirs = $(install_sh) -d
|
mkinstalldirs = $(install_sh) -d
|
||||||
@ -722,6 +724,15 @@ TEST_LOGS = $(am__test_logs2:.test.log=.log)
|
|||||||
TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
|
TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver
|
||||||
TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
|
TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
|
||||||
$(TEST_LOG_FLAGS)
|
$(TEST_LOG_FLAGS)
|
||||||
|
am__DIST_COMMON = $(dist_man_MANS) $(srcdir)/Makefile.in \
|
||||||
|
$(srcdir)/config.h.in $(srcdir)/libpcre.pc.in \
|
||||||
|
$(srcdir)/libpcre16.pc.in $(srcdir)/libpcre32.pc.in \
|
||||||
|
$(srcdir)/libpcrecpp.pc.in $(srcdir)/libpcreposix.pc.in \
|
||||||
|
$(srcdir)/pcre-config.in $(srcdir)/pcre.h.in \
|
||||||
|
$(srcdir)/pcre_stringpiece.h.in $(srcdir)/pcrecpparg.h.in \
|
||||||
|
AUTHORS COPYING ChangeLog INSTALL NEWS README ar-lib compile \
|
||||||
|
config.guess config.sub depcomp install-sh ltmain.sh missing \
|
||||||
|
test-driver
|
||||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
||||||
distdir = $(PACKAGE)-$(VERSION)
|
distdir = $(PACKAGE)-$(VERSION)
|
||||||
top_distdir = $(distdir)
|
top_distdir = $(distdir)
|
||||||
@ -798,6 +809,7 @@ LIBZ = @LIBZ@
|
|||||||
LIPO = @LIPO@
|
LIPO = @LIPO@
|
||||||
LN_S = @LN_S@
|
LN_S = @LN_S@
|
||||||
LTLIBOBJS = @LTLIBOBJS@
|
LTLIBOBJS = @LTLIBOBJS@
|
||||||
|
LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
|
||||||
MAKEINFO = @MAKEINFO@
|
MAKEINFO = @MAKEINFO@
|
||||||
MANIFEST_TOOL = @MANIFEST_TOOL@
|
MANIFEST_TOOL = @MANIFEST_TOOL@
|
||||||
MKDIR_P = @MKDIR_P@
|
MKDIR_P = @MKDIR_P@
|
||||||
@ -1326,7 +1338,6 @@ $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
|||||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \
|
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \
|
||||||
$(am__cd) $(top_srcdir) && \
|
$(am__cd) $(top_srcdir) && \
|
||||||
$(AUTOMAKE) --gnu Makefile
|
$(AUTOMAKE) --gnu Makefile
|
||||||
.PRECIOUS: Makefile
|
|
||||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
||||||
@case '$?' in \
|
@case '$?' in \
|
||||||
*config.status*) \
|
*config.status*) \
|
||||||
@ -2613,7 +2624,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
|
|||||||
if test -n "$$am__remaking_logs"; then \
|
if test -n "$$am__remaking_logs"; then \
|
||||||
echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
|
echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
|
||||||
"recursion detected" >&2; \
|
"recursion detected" >&2; \
|
||||||
else \
|
elif test -n "$$redo_logs"; then \
|
||||||
am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
|
am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
|
||||||
fi; \
|
fi; \
|
||||||
if $(am__make_dryrun); then :; else \
|
if $(am__make_dryrun); then :; else \
|
||||||
@ -2836,15 +2847,15 @@ dist-xz: distdir
|
|||||||
$(am__post_remove_distdir)
|
$(am__post_remove_distdir)
|
||||||
|
|
||||||
dist-tarZ: distdir
|
dist-tarZ: distdir
|
||||||
@echo WARNING: "Support for shar distribution archives is" \
|
@echo WARNING: "Support for distribution archives compressed with" \
|
||||||
"deprecated." >&2
|
"legacy program 'compress' is deprecated." >&2
|
||||||
@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
|
@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
|
||||||
tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
|
tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
|
||||||
$(am__post_remove_distdir)
|
$(am__post_remove_distdir)
|
||||||
|
|
||||||
dist-shar: distdir
|
dist-shar: distdir
|
||||||
@echo WARNING: "Support for distribution archives compressed with" \
|
@echo WARNING: "Support for shar distribution archives is" \
|
||||||
"legacy program 'compress' is deprecated." >&2
|
"deprecated." >&2
|
||||||
@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
|
@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
|
||||||
shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
|
shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
|
||||||
$(am__post_remove_distdir)
|
$(am__post_remove_distdir)
|
||||||
@ -2879,17 +2890,17 @@ distcheck: dist
|
|||||||
esac
|
esac
|
||||||
chmod -R a-w $(distdir)
|
chmod -R a-w $(distdir)
|
||||||
chmod u+w $(distdir)
|
chmod u+w $(distdir)
|
||||||
mkdir $(distdir)/_build $(distdir)/_inst
|
mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst
|
||||||
chmod a-w $(distdir)
|
chmod a-w $(distdir)
|
||||||
test -d $(distdir)/_build || exit 0; \
|
test -d $(distdir)/_build || exit 0; \
|
||||||
dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
|
dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
|
||||||
&& dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
|
&& dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
|
||||||
&& am__cwd=`pwd` \
|
&& am__cwd=`pwd` \
|
||||||
&& $(am__cd) $(distdir)/_build \
|
&& $(am__cd) $(distdir)/_build/sub \
|
||||||
&& ../configure \
|
&& ../../configure \
|
||||||
$(AM_DISTCHECK_CONFIGURE_FLAGS) \
|
$(AM_DISTCHECK_CONFIGURE_FLAGS) \
|
||||||
$(DISTCHECK_CONFIGURE_FLAGS) \
|
$(DISTCHECK_CONFIGURE_FLAGS) \
|
||||||
--srcdir=.. --prefix="$$dc_install_base" \
|
--srcdir=../.. --prefix="$$dc_install_base" \
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) \
|
&& $(MAKE) $(AM_MAKEFLAGS) \
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) dvi \
|
&& $(MAKE) $(AM_MAKEFLAGS) dvi \
|
||||||
&& $(MAKE) $(AM_MAKEFLAGS) check \
|
&& $(MAKE) $(AM_MAKEFLAGS) check \
|
||||||
@ -3110,6 +3121,8 @@ uninstall-man: uninstall-man1 uninstall-man3
|
|||||||
uninstall-man3 uninstall-nodist_includeHEADERS \
|
uninstall-man3 uninstall-nodist_includeHEADERS \
|
||||||
uninstall-pkgconfigDATA
|
uninstall-pkgconfigDATA
|
||||||
|
|
||||||
|
.PRECIOUS: Makefile
|
||||||
|
|
||||||
|
|
||||||
# The only difference between pcre.h.in and pcre.h is the setting of the PCRE
|
# The only difference between pcre.h.in and pcre.h is the setting of the PCRE
|
||||||
# version number. Therefore, we can create the generic version just by copying.
|
# version number. Therefore, we can create the generic version just by copying.
|
||||||
|
@ -1,6 +1,14 @@
|
|||||||
News about PCRE releases
|
News about PCRE releases
|
||||||
------------------------
|
------------------------
|
||||||
|
|
||||||
|
Release 8.37 28-April-2015
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
This is 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.36 26-September-2014
|
Release 8.36 26-September-2014
|
||||||
------------------------------
|
------------------------------
|
||||||
|
|
||||||
|
@ -1,6 +1,14 @@
|
|||||||
Building PCRE without using autotools
|
Building PCRE without using autotools
|
||||||
-------------------------------------
|
-------------------------------------
|
||||||
|
|
||||||
|
NOTE: This document relates to PCRE releases that use the original API, with
|
||||||
|
library names libpcre, libpcre16, and libpcre32. January 2015 saw the first
|
||||||
|
release of a new API, known as PCRE2, with release numbers starting at 10.00
|
||||||
|
and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old libraries
|
||||||
|
(now called PCRE1) are still being maintained for bug fixes, but there will be
|
||||||
|
no new development. New projects are advised to use the new PCRE2 libraries.
|
||||||
|
|
||||||
|
|
||||||
This document contains the following sections:
|
This document contains the following sections:
|
||||||
|
|
||||||
General
|
General
|
||||||
@ -761,4 +769,4 @@ There is also a mirror here:
|
|||||||
http://www.vsoft-software.com/downloads.html
|
http://www.vsoft-software.com/downloads.html
|
||||||
|
|
||||||
==========================
|
==========================
|
||||||
Last Updated: 14 May 2013
|
Last Updated: 10 February 2015
|
||||||
|
13
pcre/README
13
pcre/README
@ -1,7 +1,16 @@
|
|||||||
README file for PCRE (Perl-compatible regular expression library)
|
README file for PCRE (Perl-compatible regular expression library)
|
||||||
-----------------------------------------------------------------
|
-----------------------------------------------------------------
|
||||||
|
|
||||||
The latest release of PCRE is always available in three alternative formats
|
NOTE: This set of files relates to PCRE releases that use the original API,
|
||||||
|
with library names libpcre, libpcre16, and libpcre32. January 2015 saw the
|
||||||
|
first release of a new API, known as PCRE2, with release numbers starting at
|
||||||
|
10.00 and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old
|
||||||
|
libraries (now called PCRE1) are still being maintained for bug fixes, but
|
||||||
|
there will be no new development. New projects are advised to use the new PCRE2
|
||||||
|
libraries.
|
||||||
|
|
||||||
|
|
||||||
|
The latest release of PCRE1 is always available in three alternative formats
|
||||||
from:
|
from:
|
||||||
|
|
||||||
ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.gz
|
ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.gz
|
||||||
@ -990,4 +999,4 @@ pcre_xxx, one with the name pcre16_xx, and a third with the name pcre32_xxx.
|
|||||||
Philip Hazel
|
Philip Hazel
|
||||||
Email local part: ph10
|
Email local part: ph10
|
||||||
Email domain: cam.ac.uk
|
Email domain: cam.ac.uk
|
||||||
Last updated: 24 October 2014
|
Last updated: 10 February 2015
|
||||||
|
@ -506,6 +506,11 @@ echo "---------------------------- Test 106 -----------------------------" >>tes
|
|||||||
(cd $srcdir; echo "a" | $valgrind $pcregrep -M "|a" ) >>testtrygrep 2>&1
|
(cd $srcdir; echo "a" | $valgrind $pcregrep -M "|a" ) >>testtrygrep 2>&1
|
||||||
echo "RC=$?" >>testtrygrep
|
echo "RC=$?" >>testtrygrep
|
||||||
|
|
||||||
|
echo "---------------------------- Test 107 -----------------------------" >>testtrygrep
|
||||||
|
echo "a" >testtemp1grep
|
||||||
|
echo "aaaaa" >>testtemp1grep
|
||||||
|
(cd $srcdir; $valgrind $pcregrep --line-offsets '(?<=\Ka)' $builddir/testtemp1grep) >>testtrygrep 2>&1
|
||||||
|
echo "RC=$?" >>testtrygrep
|
||||||
|
|
||||||
# Now compare the results.
|
# Now compare the results.
|
||||||
|
|
||||||
|
67
pcre/aclocal.m4
vendored
67
pcre/aclocal.m4
vendored
@ -1,6 +1,6 @@
|
|||||||
# generated automatically by aclocal 1.14.1 -*- Autoconf -*-
|
# generated automatically by aclocal 1.15 -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 1996-2013 Free Software Foundation, Inc.
|
# Copyright (C) 1996-2014 Free Software Foundation, Inc.
|
||||||
|
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
@ -235,7 +235,7 @@ AS_VAR_COPY([$1], [pkg_cv_][$1])
|
|||||||
AS_VAR_IF([$1], [""], [$5], [$4])dnl
|
AS_VAR_IF([$1], [""], [$5], [$4])dnl
|
||||||
])# PKG_CHECK_VAR
|
])# PKG_CHECK_VAR
|
||||||
|
|
||||||
# Copyright (C) 2002-2013 Free Software Foundation, Inc.
|
# Copyright (C) 2002-2014 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
@ -247,10 +247,10 @@ AS_VAR_IF([$1], [""], [$5], [$4])dnl
|
|||||||
# generated from the m4 files accompanying Automake X.Y.
|
# generated from the m4 files accompanying Automake X.Y.
|
||||||
# (This private macro should not be called outside this file.)
|
# (This private macro should not be called outside this file.)
|
||||||
AC_DEFUN([AM_AUTOMAKE_VERSION],
|
AC_DEFUN([AM_AUTOMAKE_VERSION],
|
||||||
[am__api_version='1.14'
|
[am__api_version='1.15'
|
||||||
dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
|
dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
|
||||||
dnl require some minimum version. Point them to the right macro.
|
dnl require some minimum version. Point them to the right macro.
|
||||||
m4_if([$1], [1.14.1], [],
|
m4_if([$1], [1.15], [],
|
||||||
[AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
|
[AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
|
||||||
])
|
])
|
||||||
|
|
||||||
@ -266,12 +266,12 @@ m4_define([_AM_AUTOCONF_VERSION], [])
|
|||||||
# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
|
# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
|
||||||
# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
|
# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
|
||||||
AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
|
AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
|
||||||
[AM_AUTOMAKE_VERSION([1.14.1])dnl
|
[AM_AUTOMAKE_VERSION([1.15])dnl
|
||||||
m4_ifndef([AC_AUTOCONF_VERSION],
|
m4_ifndef([AC_AUTOCONF_VERSION],
|
||||||
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
|
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
|
||||||
_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
|
_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
|
||||||
|
|
||||||
# Copyright (C) 2011-2013 Free Software Foundation, Inc.
|
# Copyright (C) 2011-2014 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
@ -333,7 +333,7 @@ AC_SUBST([AR])dnl
|
|||||||
|
|
||||||
# AM_AUX_DIR_EXPAND -*- Autoconf -*-
|
# AM_AUX_DIR_EXPAND -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 2001-2013 Free Software Foundation, Inc.
|
# Copyright (C) 2001-2014 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
@ -378,15 +378,14 @@ AC_SUBST([AR])dnl
|
|||||||
# configured tree to be moved without reconfiguration.
|
# configured tree to be moved without reconfiguration.
|
||||||
|
|
||||||
AC_DEFUN([AM_AUX_DIR_EXPAND],
|
AC_DEFUN([AM_AUX_DIR_EXPAND],
|
||||||
[dnl Rely on autoconf to set up CDPATH properly.
|
[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
|
||||||
AC_PREREQ([2.50])dnl
|
# Expand $ac_aux_dir to an absolute path.
|
||||||
# expand $ac_aux_dir to an absolute path
|
am_aux_dir=`cd "$ac_aux_dir" && pwd`
|
||||||
am_aux_dir=`cd $ac_aux_dir && pwd`
|
|
||||||
])
|
])
|
||||||
|
|
||||||
# AM_CONDITIONAL -*- Autoconf -*-
|
# AM_CONDITIONAL -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 1997-2013 Free Software Foundation, Inc.
|
# Copyright (C) 1997-2014 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
@ -417,7 +416,7 @@ AC_CONFIG_COMMANDS_PRE(
|
|||||||
Usually this means the macro was only invoked conditionally.]])
|
Usually this means the macro was only invoked conditionally.]])
|
||||||
fi])])
|
fi])])
|
||||||
|
|
||||||
# Copyright (C) 1999-2013 Free Software Foundation, Inc.
|
# Copyright (C) 1999-2014 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
@ -608,7 +607,7 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl
|
|||||||
|
|
||||||
# Generate code to set up dependency tracking. -*- Autoconf -*-
|
# Generate code to set up dependency tracking. -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 1999-2013 Free Software Foundation, Inc.
|
# Copyright (C) 1999-2014 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
@ -684,7 +683,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
|
|||||||
|
|
||||||
# Do all the work for Automake. -*- Autoconf -*-
|
# Do all the work for Automake. -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 1996-2013 Free Software Foundation, Inc.
|
# Copyright (C) 1996-2014 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
@ -774,8 +773,8 @@ AC_REQUIRE([AC_PROG_MKDIR_P])dnl
|
|||||||
# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
|
# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
|
||||||
# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
|
# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
|
||||||
AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
|
AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
|
||||||
# We need awk for the "check" target. The system "awk" is bad on
|
# We need awk for the "check" target (and possibly the TAP driver). The
|
||||||
# some platforms.
|
# system "awk" is bad on some platforms.
|
||||||
AC_REQUIRE([AC_PROG_AWK])dnl
|
AC_REQUIRE([AC_PROG_AWK])dnl
|
||||||
AC_REQUIRE([AC_PROG_MAKE_SET])dnl
|
AC_REQUIRE([AC_PROG_MAKE_SET])dnl
|
||||||
AC_REQUIRE([AM_SET_LEADING_DOT])dnl
|
AC_REQUIRE([AM_SET_LEADING_DOT])dnl
|
||||||
@ -848,7 +847,11 @@ to "yes", and re-run configure.
|
|||||||
END
|
END
|
||||||
AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
|
AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
|
||||||
fi
|
fi
|
||||||
fi])
|
fi
|
||||||
|
dnl The trailing newline in this macro's definition is deliberate, for
|
||||||
|
dnl backward compatibility and to allow trailing 'dnl'-style comments
|
||||||
|
dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841.
|
||||||
|
])
|
||||||
|
|
||||||
dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not
|
dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not
|
||||||
dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
|
dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
|
||||||
@ -877,7 +880,7 @@ for _am_header in $config_headers :; do
|
|||||||
done
|
done
|
||||||
echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
|
echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
|
||||||
|
|
||||||
# Copyright (C) 2001-2013 Free Software Foundation, Inc.
|
# Copyright (C) 2001-2014 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
@ -888,7 +891,7 @@ echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_co
|
|||||||
# Define $install_sh.
|
# Define $install_sh.
|
||||||
AC_DEFUN([AM_PROG_INSTALL_SH],
|
AC_DEFUN([AM_PROG_INSTALL_SH],
|
||||||
[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
|
[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
|
||||||
if test x"${install_sh}" != xset; then
|
if test x"${install_sh+set}" != xset; then
|
||||||
case $am_aux_dir in
|
case $am_aux_dir in
|
||||||
*\ * | *\ *)
|
*\ * | *\ *)
|
||||||
install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
|
install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
|
||||||
@ -898,7 +901,7 @@ if test x"${install_sh}" != xset; then
|
|||||||
fi
|
fi
|
||||||
AC_SUBST([install_sh])])
|
AC_SUBST([install_sh])])
|
||||||
|
|
||||||
# Copyright (C) 2003-2013 Free Software Foundation, Inc.
|
# Copyright (C) 2003-2014 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
@ -919,7 +922,7 @@ AC_SUBST([am__leading_dot])])
|
|||||||
|
|
||||||
# Check to see how 'make' treats includes. -*- Autoconf -*-
|
# Check to see how 'make' treats includes. -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 2001-2013 Free Software Foundation, Inc.
|
# Copyright (C) 2001-2014 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
@ -969,7 +972,7 @@ rm -f confinc confmf
|
|||||||
|
|
||||||
# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
|
# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 1997-2013 Free Software Foundation, Inc.
|
# Copyright (C) 1997-2014 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
@ -1008,7 +1011,7 @@ fi
|
|||||||
|
|
||||||
# Helper functions for option handling. -*- Autoconf -*-
|
# Helper functions for option handling. -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 2001-2013 Free Software Foundation, Inc.
|
# Copyright (C) 2001-2014 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
@ -1037,7 +1040,7 @@ AC_DEFUN([_AM_SET_OPTIONS],
|
|||||||
AC_DEFUN([_AM_IF_OPTION],
|
AC_DEFUN([_AM_IF_OPTION],
|
||||||
[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
|
[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
|
||||||
|
|
||||||
# Copyright (C) 1999-2013 Free Software Foundation, Inc.
|
# Copyright (C) 1999-2014 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
@ -1084,7 +1087,7 @@ AC_LANG_POP([C])])
|
|||||||
# For backward compatibility.
|
# For backward compatibility.
|
||||||
AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
|
AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
|
||||||
|
|
||||||
# Copyright (C) 2001-2013 Free Software Foundation, Inc.
|
# Copyright (C) 2001-2014 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
@ -1103,7 +1106,7 @@ AC_DEFUN([AM_RUN_LOG],
|
|||||||
|
|
||||||
# Check to make sure that the build environment is sane. -*- Autoconf -*-
|
# Check to make sure that the build environment is sane. -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 1996-2013 Free Software Foundation, Inc.
|
# Copyright (C) 1996-2014 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
@ -1184,7 +1187,7 @@ AC_CONFIG_COMMANDS_PRE(
|
|||||||
rm -f conftest.file
|
rm -f conftest.file
|
||||||
])
|
])
|
||||||
|
|
||||||
# Copyright (C) 2009-2013 Free Software Foundation, Inc.
|
# Copyright (C) 2009-2014 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
@ -1244,7 +1247,7 @@ AC_SUBST([AM_BACKSLASH])dnl
|
|||||||
_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
|
_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
|
||||||
])
|
])
|
||||||
|
|
||||||
# Copyright (C) 2001-2013 Free Software Foundation, Inc.
|
# Copyright (C) 2001-2014 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
@ -1272,7 +1275,7 @@ fi
|
|||||||
INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
|
INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
|
||||||
AC_SUBST([INSTALL_STRIP_PROGRAM])])
|
AC_SUBST([INSTALL_STRIP_PROGRAM])])
|
||||||
|
|
||||||
# Copyright (C) 2006-2013 Free Software Foundation, Inc.
|
# Copyright (C) 2006-2014 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
@ -1291,7 +1294,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
|
|||||||
|
|
||||||
# Check how to create a tarball. -*- Autoconf -*-
|
# Check how to create a tarball. -*- Autoconf -*-
|
||||||
|
|
||||||
# Copyright (C) 2004-2013 Free Software Foundation, Inc.
|
# Copyright (C) 2004-2014 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation
|
# This file is free software; the Free Software Foundation
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
# gives unlimited permission to copy and/or distribute it,
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
me=ar-lib
|
me=ar-lib
|
||||||
scriptversion=2012-03-01.08; # UTC
|
scriptversion=2012-03-01.08; # UTC
|
||||||
|
|
||||||
# Copyright (C) 2010-2013 Free Software Foundation, Inc.
|
# Copyright (C) 2010-2014 Free Software Foundation, Inc.
|
||||||
# Written by Peter Rosin <peda@lysator.liu.se>.
|
# Written by Peter Rosin <peda@lysator.liu.se>.
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
scriptversion=2012-10-14.11; # UTC
|
scriptversion=2012-10-14.11; # UTC
|
||||||
|
|
||||||
# Copyright (C) 1999-2013 Free Software Foundation, Inc.
|
# Copyright (C) 1999-2014 Free Software Foundation, Inc.
|
||||||
# Written by Tom Tromey <tromey@cygnus.com>.
|
# Written by Tom Tromey <tromey@cygnus.com>.
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
173
pcre/config.guess
vendored
173
pcre/config.guess
vendored
@ -1,8 +1,8 @@
|
|||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
# Attempt to guess a canonical system name.
|
# Attempt to guess a canonical system name.
|
||||||
# Copyright 1992-2013 Free Software Foundation, Inc.
|
# Copyright 1992-2014 Free Software Foundation, Inc.
|
||||||
|
|
||||||
timestamp='2013-11-29'
|
timestamp='2014-11-04'
|
||||||
|
|
||||||
# This file is free software; you can redistribute it and/or modify it
|
# This file is free software; you can redistribute it and/or modify it
|
||||||
# under the terms of the GNU General Public License as published by
|
# under the terms of the GNU General Public License as published by
|
||||||
@ -24,12 +24,12 @@ timestamp='2013-11-29'
|
|||||||
# program. This Exception is an additional permission under section 7
|
# program. This Exception is an additional permission under section 7
|
||||||
# of the GNU General Public License, version 3 ("GPLv3").
|
# of the GNU General Public License, version 3 ("GPLv3").
|
||||||
#
|
#
|
||||||
# Originally written by Per Bothner.
|
# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
|
||||||
#
|
#
|
||||||
# You can get the latest version of this script from:
|
# You can get the latest version of this script from:
|
||||||
# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
|
# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
|
||||||
#
|
#
|
||||||
# Please send patches with a ChangeLog entry to config-patches@gnu.org.
|
# Please send patches to <config-patches@gnu.org>.
|
||||||
|
|
||||||
|
|
||||||
me=`echo "$0" | sed -e 's,.*/,,'`
|
me=`echo "$0" | sed -e 's,.*/,,'`
|
||||||
@ -50,7 +50,7 @@ version="\
|
|||||||
GNU config.guess ($timestamp)
|
GNU config.guess ($timestamp)
|
||||||
|
|
||||||
Originally written by Per Bothner.
|
Originally written by Per Bothner.
|
||||||
Copyright 1992-2013 Free Software Foundation, Inc.
|
Copyright 1992-2014 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This is free software; see the source for copying conditions. There is NO
|
This is free software; see the source for copying conditions. There is NO
|
||||||
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
|
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
|
||||||
@ -149,7 +149,7 @@ Linux|GNU|GNU/*)
|
|||||||
LIBC=gnu
|
LIBC=gnu
|
||||||
#endif
|
#endif
|
||||||
EOF
|
EOF
|
||||||
eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
|
eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
@ -579,8 +579,9 @@ EOF
|
|||||||
else
|
else
|
||||||
IBM_ARCH=powerpc
|
IBM_ARCH=powerpc
|
||||||
fi
|
fi
|
||||||
if [ -x /usr/bin/oslevel ] ; then
|
if [ -x /usr/bin/lslpp ] ; then
|
||||||
IBM_REV=`/usr/bin/oslevel`
|
IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc |
|
||||||
|
awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
|
||||||
else
|
else
|
||||||
IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
|
IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
|
||||||
fi
|
fi
|
||||||
@ -826,7 +827,7 @@ EOF
|
|||||||
*:MINGW*:*)
|
*:MINGW*:*)
|
||||||
echo ${UNAME_MACHINE}-pc-mingw32
|
echo ${UNAME_MACHINE}-pc-mingw32
|
||||||
exit ;;
|
exit ;;
|
||||||
i*:MSYS*:*)
|
*:MSYS*:*)
|
||||||
echo ${UNAME_MACHINE}-pc-msys
|
echo ${UNAME_MACHINE}-pc-msys
|
||||||
exit ;;
|
exit ;;
|
||||||
i*:windows32*:*)
|
i*:windows32*:*)
|
||||||
@ -969,10 +970,10 @@ EOF
|
|||||||
eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
|
eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
|
||||||
test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
|
test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
|
||||||
;;
|
;;
|
||||||
or1k:Linux:*:*)
|
openrisc*:Linux:*:*)
|
||||||
echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
|
echo or1k-unknown-linux-${LIBC}
|
||||||
exit ;;
|
exit ;;
|
||||||
or32:Linux:*:*)
|
or32:Linux:*:* | or1k*:Linux:*:*)
|
||||||
echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
|
echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
|
||||||
exit ;;
|
exit ;;
|
||||||
padre:Linux:*:*)
|
padre:Linux:*:*)
|
||||||
@ -1371,154 +1372,6 @@ EOF
|
|||||||
exit ;;
|
exit ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
eval $set_cc_for_build
|
|
||||||
cat >$dummy.c <<EOF
|
|
||||||
#ifdef _SEQUENT_
|
|
||||||
# include <sys/types.h>
|
|
||||||
# include <sys/utsname.h>
|
|
||||||
#endif
|
|
||||||
main ()
|
|
||||||
{
|
|
||||||
#if defined (sony)
|
|
||||||
#if defined (MIPSEB)
|
|
||||||
/* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
|
|
||||||
I don't know.... */
|
|
||||||
printf ("mips-sony-bsd\n"); exit (0);
|
|
||||||
#else
|
|
||||||
#include <sys/param.h>
|
|
||||||
printf ("m68k-sony-newsos%s\n",
|
|
||||||
#ifdef NEWSOS4
|
|
||||||
"4"
|
|
||||||
#else
|
|
||||||
""
|
|
||||||
#endif
|
|
||||||
); exit (0);
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined (__arm) && defined (__acorn) && defined (__unix)
|
|
||||||
printf ("arm-acorn-riscix\n"); exit (0);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined (hp300) && !defined (hpux)
|
|
||||||
printf ("m68k-hp-bsd\n"); exit (0);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined (NeXT)
|
|
||||||
#if !defined (__ARCHITECTURE__)
|
|
||||||
#define __ARCHITECTURE__ "m68k"
|
|
||||||
#endif
|
|
||||||
int version;
|
|
||||||
version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
|
|
||||||
if (version < 4)
|
|
||||||
printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
|
|
||||||
else
|
|
||||||
printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
|
|
||||||
exit (0);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined (MULTIMAX) || defined (n16)
|
|
||||||
#if defined (UMAXV)
|
|
||||||
printf ("ns32k-encore-sysv\n"); exit (0);
|
|
||||||
#else
|
|
||||||
#if defined (CMU)
|
|
||||||
printf ("ns32k-encore-mach\n"); exit (0);
|
|
||||||
#else
|
|
||||||
printf ("ns32k-encore-bsd\n"); exit (0);
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined (__386BSD__)
|
|
||||||
printf ("i386-pc-bsd\n"); exit (0);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined (sequent)
|
|
||||||
#if defined (i386)
|
|
||||||
printf ("i386-sequent-dynix\n"); exit (0);
|
|
||||||
#endif
|
|
||||||
#if defined (ns32000)
|
|
||||||
printf ("ns32k-sequent-dynix\n"); exit (0);
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined (_SEQUENT_)
|
|
||||||
struct utsname un;
|
|
||||||
|
|
||||||
uname(&un);
|
|
||||||
|
|
||||||
if (strncmp(un.version, "V2", 2) == 0) {
|
|
||||||
printf ("i386-sequent-ptx2\n"); exit (0);
|
|
||||||
}
|
|
||||||
if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
|
|
||||||
printf ("i386-sequent-ptx1\n"); exit (0);
|
|
||||||
}
|
|
||||||
printf ("i386-sequent-ptx\n"); exit (0);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined (vax)
|
|
||||||
# if !defined (ultrix)
|
|
||||||
# include <sys/param.h>
|
|
||||||
# if defined (BSD)
|
|
||||||
# if BSD == 43
|
|
||||||
printf ("vax-dec-bsd4.3\n"); exit (0);
|
|
||||||
# else
|
|
||||||
# if BSD == 199006
|
|
||||||
printf ("vax-dec-bsd4.3reno\n"); exit (0);
|
|
||||||
# else
|
|
||||||
printf ("vax-dec-bsd\n"); exit (0);
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
# else
|
|
||||||
printf ("vax-dec-bsd\n"); exit (0);
|
|
||||||
# endif
|
|
||||||
# else
|
|
||||||
printf ("vax-dec-ultrix\n"); exit (0);
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined (alliant) && defined (i860)
|
|
||||||
printf ("i860-alliant-bsd\n"); exit (0);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
exit (1);
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
|
|
||||||
$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
|
|
||||||
{ echo "$SYSTEM_NAME"; exit; }
|
|
||||||
|
|
||||||
# Apollos put the system type in the environment.
|
|
||||||
|
|
||||||
test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
|
|
||||||
|
|
||||||
# Convex versions that predate uname can use getsysinfo(1)
|
|
||||||
|
|
||||||
if [ -x /usr/convex/getsysinfo ]
|
|
||||||
then
|
|
||||||
case `getsysinfo -f cpu_type` in
|
|
||||||
c1*)
|
|
||||||
echo c1-convex-bsd
|
|
||||||
exit ;;
|
|
||||||
c2*)
|
|
||||||
if getsysinfo -f scalar_acc
|
|
||||||
then echo c32-convex-bsd
|
|
||||||
else echo c2-convex-bsd
|
|
||||||
fi
|
|
||||||
exit ;;
|
|
||||||
c34*)
|
|
||||||
echo c34-convex-bsd
|
|
||||||
exit ;;
|
|
||||||
c38*)
|
|
||||||
echo c38-convex-bsd
|
|
||||||
exit ;;
|
|
||||||
c4*)
|
|
||||||
echo c4-convex-bsd
|
|
||||||
exit ;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
cat >&2 <<EOF
|
cat >&2 <<EOF
|
||||||
$0: unable to guess system type
|
$0: unable to guess system type
|
||||||
|
|
||||||
|
@ -162,8 +162,7 @@ sure both macros are undefined; an emulation function will then be used. */
|
|||||||
#define LINK_SIZE 2
|
#define LINK_SIZE 2
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Define to the sub-directory in which libtool stores uninstalled libraries.
|
/* Define to the sub-directory where libtool stores uninstalled libraries. */
|
||||||
*/
|
|
||||||
/* This is ignored unless you are using libtool. */
|
/* This is ignored unless you are using libtool. */
|
||||||
#ifndef LT_OBJDIR
|
#ifndef LT_OBJDIR
|
||||||
#define LT_OBJDIR ".libs/"
|
#define LT_OBJDIR ".libs/"
|
||||||
@ -236,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.36"
|
#define PACKAGE_STRING "PCRE 8.37"
|
||||||
|
|
||||||
/* 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"
|
||||||
@ -245,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.36"
|
#define PACKAGE_VERSION "8.37"
|
||||||
|
|
||||||
/* 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
|
||||||
@ -337,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.36"
|
#define VERSION "8.37"
|
||||||
|
|
||||||
/* 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 */
|
||||||
|
@ -160,8 +160,7 @@ sure both macros are undefined; an emulation function will then be used. */
|
|||||||
for longer patterns in extreme cases. */
|
for longer patterns in extreme cases. */
|
||||||
#undef LINK_SIZE
|
#undef LINK_SIZE
|
||||||
|
|
||||||
/* Define to the sub-directory in which libtool stores uninstalled libraries.
|
/* Define to the sub-directory where libtool stores uninstalled libraries. */
|
||||||
*/
|
|
||||||
#undef LT_OBJDIR
|
#undef LT_OBJDIR
|
||||||
|
|
||||||
/* The value of MATCH_LIMIT determines the default number of times the
|
/* The value of MATCH_LIMIT determines the default number of times the
|
||||||
|
36
pcre/config.sub
vendored
36
pcre/config.sub
vendored
@ -1,8 +1,8 @@
|
|||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
# Configuration validation subroutine script.
|
# Configuration validation subroutine script.
|
||||||
# Copyright 1992-2013 Free Software Foundation, Inc.
|
# Copyright 1992-2014 Free Software Foundation, Inc.
|
||||||
|
|
||||||
timestamp='2013-10-01'
|
timestamp='2014-12-03'
|
||||||
|
|
||||||
# This file is free software; you can redistribute it and/or modify it
|
# This file is free software; you can redistribute it and/or modify it
|
||||||
# under the terms of the GNU General Public License as published by
|
# under the terms of the GNU General Public License as published by
|
||||||
@ -25,7 +25,7 @@ timestamp='2013-10-01'
|
|||||||
# of the GNU General Public License, version 3 ("GPLv3").
|
# of the GNU General Public License, version 3 ("GPLv3").
|
||||||
|
|
||||||
|
|
||||||
# Please send patches with a ChangeLog entry to config-patches@gnu.org.
|
# Please send patches to <config-patches@gnu.org>.
|
||||||
#
|
#
|
||||||
# Configuration subroutine to validate and canonicalize a configuration type.
|
# Configuration subroutine to validate and canonicalize a configuration type.
|
||||||
# Supply the specified configuration type as an argument.
|
# Supply the specified configuration type as an argument.
|
||||||
@ -68,7 +68,7 @@ Report bugs and patches to <config-patches@gnu.org>."
|
|||||||
version="\
|
version="\
|
||||||
GNU config.sub ($timestamp)
|
GNU config.sub ($timestamp)
|
||||||
|
|
||||||
Copyright 1992-2013 Free Software Foundation, Inc.
|
Copyright 1992-2014 Free Software Foundation, Inc.
|
||||||
|
|
||||||
This is free software; see the source for copying conditions. There is NO
|
This is free software; see the source for copying conditions. There is NO
|
||||||
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
|
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
|
||||||
@ -283,8 +283,10 @@ case $basic_machine in
|
|||||||
| mips64vr5900 | mips64vr5900el \
|
| mips64vr5900 | mips64vr5900el \
|
||||||
| mipsisa32 | mipsisa32el \
|
| mipsisa32 | mipsisa32el \
|
||||||
| mipsisa32r2 | mipsisa32r2el \
|
| mipsisa32r2 | mipsisa32r2el \
|
||||||
|
| mipsisa32r6 | mipsisa32r6el \
|
||||||
| mipsisa64 | mipsisa64el \
|
| mipsisa64 | mipsisa64el \
|
||||||
| mipsisa64r2 | mipsisa64r2el \
|
| mipsisa64r2 | mipsisa64r2el \
|
||||||
|
| mipsisa64r6 | mipsisa64r6el \
|
||||||
| mipsisa64sb1 | mipsisa64sb1el \
|
| mipsisa64sb1 | mipsisa64sb1el \
|
||||||
| mipsisa64sr71k | mipsisa64sr71kel \
|
| mipsisa64sr71k | mipsisa64sr71kel \
|
||||||
| mipsr5900 | mipsr5900el \
|
| mipsr5900 | mipsr5900el \
|
||||||
@ -296,11 +298,11 @@ case $basic_machine in
|
|||||||
| nds32 | nds32le | nds32be \
|
| nds32 | nds32le | nds32be \
|
||||||
| nios | nios2 | nios2eb | nios2el \
|
| nios | nios2 | nios2eb | nios2el \
|
||||||
| ns16k | ns32k \
|
| ns16k | ns32k \
|
||||||
| open8 \
|
| open8 | or1k | or1knd | or32 \
|
||||||
| or1k | or32 \
|
|
||||||
| pdp10 | pdp11 | pj | pjl \
|
| pdp10 | pdp11 | pj | pjl \
|
||||||
| powerpc | powerpc64 | powerpc64le | powerpcle \
|
| powerpc | powerpc64 | powerpc64le | powerpcle \
|
||||||
| pyramid \
|
| pyramid \
|
||||||
|
| riscv32 | riscv64 \
|
||||||
| rl78 | rx \
|
| rl78 | rx \
|
||||||
| score \
|
| score \
|
||||||
| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
|
| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
|
||||||
@ -311,6 +313,7 @@ case $basic_machine in
|
|||||||
| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
|
| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
|
||||||
| ubicom32 \
|
| ubicom32 \
|
||||||
| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
|
| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
|
||||||
|
| visium \
|
||||||
| we32k \
|
| we32k \
|
||||||
| x86 | xc16x | xstormy16 | xtensa \
|
| x86 | xc16x | xstormy16 | xtensa \
|
||||||
| z8k | z80)
|
| z8k | z80)
|
||||||
@ -325,6 +328,9 @@ case $basic_machine in
|
|||||||
c6x)
|
c6x)
|
||||||
basic_machine=tic6x-unknown
|
basic_machine=tic6x-unknown
|
||||||
;;
|
;;
|
||||||
|
leon|leon[3-9])
|
||||||
|
basic_machine=sparc-$basic_machine
|
||||||
|
;;
|
||||||
m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
|
m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
|
||||||
basic_machine=$basic_machine-unknown
|
basic_machine=$basic_machine-unknown
|
||||||
os=-none
|
os=-none
|
||||||
@ -402,8 +408,10 @@ case $basic_machine in
|
|||||||
| mips64vr5900-* | mips64vr5900el-* \
|
| mips64vr5900-* | mips64vr5900el-* \
|
||||||
| mipsisa32-* | mipsisa32el-* \
|
| mipsisa32-* | mipsisa32el-* \
|
||||||
| mipsisa32r2-* | mipsisa32r2el-* \
|
| mipsisa32r2-* | mipsisa32r2el-* \
|
||||||
|
| mipsisa32r6-* | mipsisa32r6el-* \
|
||||||
| mipsisa64-* | mipsisa64el-* \
|
| mipsisa64-* | mipsisa64el-* \
|
||||||
| mipsisa64r2-* | mipsisa64r2el-* \
|
| mipsisa64r2-* | mipsisa64r2el-* \
|
||||||
|
| mipsisa64r6-* | mipsisa64r6el-* \
|
||||||
| mipsisa64sb1-* | mipsisa64sb1el-* \
|
| mipsisa64sb1-* | mipsisa64sb1el-* \
|
||||||
| mipsisa64sr71k-* | mipsisa64sr71kel-* \
|
| mipsisa64sr71k-* | mipsisa64sr71kel-* \
|
||||||
| mipsr5900-* | mipsr5900el-* \
|
| mipsr5900-* | mipsr5900el-* \
|
||||||
@ -415,6 +423,7 @@ case $basic_machine in
|
|||||||
| nios-* | nios2-* | nios2eb-* | nios2el-* \
|
| nios-* | nios2-* | nios2eb-* | nios2el-* \
|
||||||
| none-* | np1-* | ns16k-* | ns32k-* \
|
| none-* | np1-* | ns16k-* | ns32k-* \
|
||||||
| open8-* \
|
| open8-* \
|
||||||
|
| or1k*-* \
|
||||||
| orion-* \
|
| orion-* \
|
||||||
| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
|
| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
|
||||||
| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
|
| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
|
||||||
@ -432,6 +441,7 @@ case $basic_machine in
|
|||||||
| ubicom32-* \
|
| ubicom32-* \
|
||||||
| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
|
| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
|
||||||
| vax-* \
|
| vax-* \
|
||||||
|
| visium-* \
|
||||||
| we32k-* \
|
| we32k-* \
|
||||||
| x86-* | x86_64-* | xc16x-* | xps100-* \
|
| x86-* | x86_64-* | xc16x-* | xps100-* \
|
||||||
| xstormy16-* | xtensa*-* \
|
| xstormy16-* | xtensa*-* \
|
||||||
@ -769,6 +779,9 @@ case $basic_machine in
|
|||||||
basic_machine=m68k-isi
|
basic_machine=m68k-isi
|
||||||
os=-sysv
|
os=-sysv
|
||||||
;;
|
;;
|
||||||
|
leon-*|leon[3-9]-*)
|
||||||
|
basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'`
|
||||||
|
;;
|
||||||
m68knommu)
|
m68knommu)
|
||||||
basic_machine=m68k-unknown
|
basic_machine=m68k-unknown
|
||||||
os=-linux
|
os=-linux
|
||||||
@ -824,6 +837,10 @@ case $basic_machine in
|
|||||||
basic_machine=powerpc-unknown
|
basic_machine=powerpc-unknown
|
||||||
os=-morphos
|
os=-morphos
|
||||||
;;
|
;;
|
||||||
|
moxiebox)
|
||||||
|
basic_machine=moxie-unknown
|
||||||
|
os=-moxiebox
|
||||||
|
;;
|
||||||
msdos)
|
msdos)
|
||||||
basic_machine=i386-pc
|
basic_machine=i386-pc
|
||||||
os=-msdos
|
os=-msdos
|
||||||
@ -1369,14 +1386,14 @@ case $os in
|
|||||||
| -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
|
| -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
|
||||||
| -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
|
| -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
|
||||||
| -linux-newlib* | -linux-musl* | -linux-uclibc* \
|
| -linux-newlib* | -linux-musl* | -linux-uclibc* \
|
||||||
| -uxpv* | -beos* | -mpeix* | -udk* \
|
| -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
|
||||||
| -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
|
| -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
|
||||||
| -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
|
| -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
|
||||||
| -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
|
| -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
|
||||||
| -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
|
| -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
|
||||||
| -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
|
| -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
|
||||||
| -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
|
| -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
|
||||||
| -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
|
| -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*)
|
||||||
# Remember, each alternative MUST END IN *, to match a version number.
|
# Remember, each alternative MUST END IN *, to match a version number.
|
||||||
;;
|
;;
|
||||||
-qnx*)
|
-qnx*)
|
||||||
@ -1594,9 +1611,6 @@ case $basic_machine in
|
|||||||
mips*-*)
|
mips*-*)
|
||||||
os=-elf
|
os=-elf
|
||||||
;;
|
;;
|
||||||
or1k-*)
|
|
||||||
os=-elf
|
|
||||||
;;
|
|
||||||
or32-*)
|
or32-*)
|
||||||
os=-coff
|
os=-coff
|
||||||
;;
|
;;
|
||||||
|
3059
pcre/configure
vendored
3059
pcre/configure
vendored
File diff suppressed because it is too large
Load Diff
@ -9,17 +9,17 @@ 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, [36])
|
m4_define(pcre_minor, [37])
|
||||||
m4_define(pcre_prerelease, [])
|
m4_define(pcre_prerelease, [])
|
||||||
m4_define(pcre_date, [2014-09-26])
|
m4_define(pcre_date, [2015-04-28])
|
||||||
|
|
||||||
# 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:4:2])
|
m4_define(libpcre_version, [3:5:2])
|
||||||
m4_define(libpcre16_version, [2:4:2])
|
m4_define(libpcre16_version, [2:5:2])
|
||||||
m4_define(libpcre32_version, [0:4:0])
|
m4_define(libpcre32_version, [0:5:0])
|
||||||
m4_define(libpcreposix_version, [0:3:0])
|
m4_define(libpcreposix_version, [0:3:0])
|
||||||
m4_define(libpcrecpp_version, [0:1:0])
|
m4_define(libpcrecpp_version, [0:1:0])
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
scriptversion=2013-05-30.07; # UTC
|
scriptversion=2013-05-30.07; # UTC
|
||||||
|
|
||||||
# Copyright (C) 1999-2013 Free Software Foundation, Inc.
|
# Copyright (C) 1999-2014 Free Software Foundation, Inc.
|
||||||
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# This program is free software; you can redistribute it and/or modify
|
||||||
# it under the terms of the GNU General Public License as published by
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
@ -1,6 +1,14 @@
|
|||||||
Building PCRE without using autotools
|
Building PCRE without using autotools
|
||||||
-------------------------------------
|
-------------------------------------
|
||||||
|
|
||||||
|
NOTE: This document relates to PCRE releases that use the original API, with
|
||||||
|
library names libpcre, libpcre16, and libpcre32. January 2015 saw the first
|
||||||
|
release of a new API, known as PCRE2, with release numbers starting at 10.00
|
||||||
|
and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old libraries
|
||||||
|
(now called PCRE1) are still being maintained for bug fixes, but there will be
|
||||||
|
no new development. New projects are advised to use the new PCRE2 libraries.
|
||||||
|
|
||||||
|
|
||||||
This document contains the following sections:
|
This document contains the following sections:
|
||||||
|
|
||||||
General
|
General
|
||||||
@ -761,4 +769,4 @@ There is also a mirror here:
|
|||||||
http://www.vsoft-software.com/downloads.html
|
http://www.vsoft-software.com/downloads.html
|
||||||
|
|
||||||
==========================
|
==========================
|
||||||
Last Updated: 14 May 2013
|
Last Updated: 10 February 2015
|
||||||
|
@ -1,7 +1,16 @@
|
|||||||
README file for PCRE (Perl-compatible regular expression library)
|
README file for PCRE (Perl-compatible regular expression library)
|
||||||
-----------------------------------------------------------------
|
-----------------------------------------------------------------
|
||||||
|
|
||||||
The latest release of PCRE is always available in three alternative formats
|
NOTE: This set of files relates to PCRE releases that use the original API,
|
||||||
|
with library names libpcre, libpcre16, and libpcre32. January 2015 saw the
|
||||||
|
first release of a new API, known as PCRE2, with release numbers starting at
|
||||||
|
10.00 and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old
|
||||||
|
libraries (now called PCRE1) are still being maintained for bug fixes, but
|
||||||
|
there will be no new development. New projects are advised to use the new PCRE2
|
||||||
|
libraries.
|
||||||
|
|
||||||
|
|
||||||
|
The latest release of PCRE1 is always available in three alternative formats
|
||||||
from:
|
from:
|
||||||
|
|
||||||
ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.gz
|
ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.gz
|
||||||
@ -990,4 +999,4 @@ pcre_xxx, one with the name pcre16_xx, and a third with the name pcre32_xxx.
|
|||||||
Philip Hazel
|
Philip Hazel
|
||||||
Email local part: ph10
|
Email local part: ph10
|
||||||
Email domain: cam.ac.uk
|
Email domain: cam.ac.uk
|
||||||
Last updated: 24 October 2014
|
Last updated: 10 February 2015
|
||||||
|
@ -13,13 +13,24 @@ from the original man page. If there is any nonsense in it, please consult the
|
|||||||
man page, in case the conversion went wrong.
|
man page, in case the conversion went wrong.
|
||||||
<br>
|
<br>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a name="TOC1" href="#SEC1">INTRODUCTION</a>
|
<li><a name="TOC1" href="#SEC1">PLEASE TAKE NOTE</a>
|
||||||
<li><a name="TOC2" href="#SEC2">SECURITY CONSIDERATIONS</a>
|
<li><a name="TOC2" href="#SEC2">INTRODUCTION</a>
|
||||||
<li><a name="TOC3" href="#SEC3">USER DOCUMENTATION</a>
|
<li><a name="TOC3" href="#SEC3">SECURITY CONSIDERATIONS</a>
|
||||||
<li><a name="TOC4" href="#SEC4">AUTHOR</a>
|
<li><a name="TOC4" href="#SEC4">USER DOCUMENTATION</a>
|
||||||
<li><a name="TOC5" href="#SEC5">REVISION</a>
|
<li><a name="TOC5" href="#SEC5">AUTHOR</a>
|
||||||
|
<li><a name="TOC6" href="#SEC6">REVISION</a>
|
||||||
</ul>
|
</ul>
|
||||||
<br><a name="SEC1" href="#TOC1">INTRODUCTION</a><br>
|
<br><a name="SEC1" href="#TOC1">PLEASE TAKE NOTE</a><br>
|
||||||
|
<P>
|
||||||
|
This document relates to PCRE releases that use the original API,
|
||||||
|
with library names libpcre, libpcre16, and libpcre32. January 2015 saw the
|
||||||
|
first release of a new API, known as PCRE2, with release numbers starting at
|
||||||
|
10.00 and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old
|
||||||
|
libraries (now called PCRE1) are still being maintained for bug fixes, but
|
||||||
|
there will be no new development. New projects are advised to use the new PCRE2
|
||||||
|
libraries.
|
||||||
|
</P>
|
||||||
|
<br><a name="SEC2" href="#TOC1">INTRODUCTION</a><br>
|
||||||
<P>
|
<P>
|
||||||
The PCRE library is a set of functions that implement regular expression
|
The PCRE library is a set of functions that implement regular expression
|
||||||
pattern matching using the same syntax and semantics as Perl, with just a few
|
pattern matching using the same syntax and semantics as Perl, with just a few
|
||||||
@ -115,7 +126,7 @@ clashes. In some environments, it is possible to control which external symbols
|
|||||||
are exported when a shared library is built, and in these cases the
|
are exported when a shared library is built, and in these cases the
|
||||||
undocumented symbols are not exported.
|
undocumented symbols are not exported.
|
||||||
</P>
|
</P>
|
||||||
<br><a name="SEC2" href="#TOC1">SECURITY CONSIDERATIONS</a><br>
|
<br><a name="SEC3" href="#TOC1">SECURITY CONSIDERATIONS</a><br>
|
||||||
<P>
|
<P>
|
||||||
If you are using PCRE in a non-UTF application that permits users to supply
|
If you are using PCRE in a non-UTF application that permits users to supply
|
||||||
arbitrary patterns for compilation, you should be aware of a feature that
|
arbitrary patterns for compilation, you should be aware of a feature that
|
||||||
@ -149,7 +160,7 @@ against this: see the PCRE_EXTRA_MATCH_LIMIT feature in the
|
|||||||
<a href="pcreapi.html"><b>pcreapi</b></a>
|
<a href="pcreapi.html"><b>pcreapi</b></a>
|
||||||
page.
|
page.
|
||||||
</P>
|
</P>
|
||||||
<br><a name="SEC3" href="#TOC1">USER DOCUMENTATION</a><br>
|
<br><a name="SEC4" href="#TOC1">USER DOCUMENTATION</a><br>
|
||||||
<P>
|
<P>
|
||||||
The user documentation for PCRE comprises a number of different sections. In
|
The user documentation for PCRE comprises a number of different sections. In
|
||||||
the "man" format, each of these is a separate "man page". In the HTML format,
|
the "man" format, each of these is a separate "man page". In the HTML format,
|
||||||
@ -188,7 +199,7 @@ follows:
|
|||||||
In the "man" and HTML formats, there is also a short page for each C library
|
In the "man" and HTML formats, there is also a short page for each C library
|
||||||
function, listing its arguments and results.
|
function, listing its arguments and results.
|
||||||
</P>
|
</P>
|
||||||
<br><a name="SEC4" href="#TOC1">AUTHOR</a><br>
|
<br><a name="SEC5" href="#TOC1">AUTHOR</a><br>
|
||||||
<P>
|
<P>
|
||||||
Philip Hazel
|
Philip Hazel
|
||||||
<br>
|
<br>
|
||||||
@ -202,11 +213,11 @@ Putting an actual email address here seems to have been a spam magnet, so I've
|
|||||||
taken it away. If you want to email me, use my two initials, followed by the
|
taken it away. If you want to email me, use my two initials, followed by the
|
||||||
two digits 10, at the domain cam.ac.uk.
|
two digits 10, at the domain cam.ac.uk.
|
||||||
</P>
|
</P>
|
||||||
<br><a name="SEC5" href="#TOC1">REVISION</a><br>
|
<br><a name="SEC6" href="#TOC1">REVISION</a><br>
|
||||||
<P>
|
<P>
|
||||||
Last updated: 08 January 2014
|
Last updated: 10 February 2015
|
||||||
<br>
|
<br>
|
||||||
Copyright © 1997-2014 University of Cambridge.
|
Copyright © 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>.
|
||||||
|
@ -1,6 +1,18 @@
|
|||||||
.TH PCRE 3 "08 January 2014" "PCRE 8.35"
|
.TH PCRE 3 "10 February 2015" "PCRE 8.37"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
PCRE - Perl-compatible regular expressions
|
PCRE - Perl-compatible regular expressions (original API)
|
||||||
|
.SH "PLEASE TAKE NOTE"
|
||||||
|
.rs
|
||||||
|
.sp
|
||||||
|
This document relates to PCRE releases that use the original API,
|
||||||
|
with library names libpcre, libpcre16, and libpcre32. January 2015 saw the
|
||||||
|
first release of a new API, known as PCRE2, with release numbers starting at
|
||||||
|
10.00 and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old
|
||||||
|
libraries (now called PCRE1) are still being maintained for bug fixes, but
|
||||||
|
there will be no new development. New projects are advised to use the new PCRE2
|
||||||
|
libraries.
|
||||||
|
.
|
||||||
|
.
|
||||||
.SH INTRODUCTION
|
.SH INTRODUCTION
|
||||||
.rs
|
.rs
|
||||||
.sp
|
.sp
|
||||||
@ -213,6 +225,6 @@ two digits 10, at the domain cam.ac.uk.
|
|||||||
.rs
|
.rs
|
||||||
.sp
|
.sp
|
||||||
.nf
|
.nf
|
||||||
Last updated: 08 January 2014
|
Last updated: 10 February 2015
|
||||||
Copyright (c) 1997-2014 University of Cambridge.
|
Copyright (c) 1997-2015 University of Cambridge.
|
||||||
.fi
|
.fi
|
||||||
|
@ -13,7 +13,18 @@ PCRE(3) Library Functions Manual PCRE(3)
|
|||||||
|
|
||||||
|
|
||||||
NAME
|
NAME
|
||||||
PCRE - Perl-compatible regular expressions
|
PCRE - Perl-compatible regular expressions (original API)
|
||||||
|
|
||||||
|
PLEASE TAKE NOTE
|
||||||
|
|
||||||
|
This document relates to PCRE releases that use the original API, with
|
||||||
|
library names libpcre, libpcre16, and libpcre32. January 2015 saw the
|
||||||
|
first release of a new API, known as PCRE2, with release numbers start-
|
||||||
|
ing at 10.00 and library names libpcre2-8, libpcre2-16, and
|
||||||
|
libpcre2-32. The old libraries (now called PCRE1) are still being main-
|
||||||
|
tained for bug fixes, but there will be no new development. New
|
||||||
|
projects are advised to use the new PCRE2 libraries.
|
||||||
|
|
||||||
|
|
||||||
INTRODUCTION
|
INTRODUCTION
|
||||||
|
|
||||||
@ -179,8 +190,8 @@ AUTHOR
|
|||||||
|
|
||||||
REVISION
|
REVISION
|
||||||
|
|
||||||
Last updated: 08 January 2014
|
Last updated: 10 February 2015
|
||||||
Copyright (c) 1997-2014 University of Cambridge.
|
Copyright (c) 1997-2015 University of Cambridge.
|
||||||
------------------------------------------------------------------------------
|
------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# install - install a program, script, or datafile
|
# install - install a program, script, or datafile
|
||||||
|
|
||||||
scriptversion=2011-11-20.07; # UTC
|
scriptversion=2013-12-25.23; # UTC
|
||||||
|
|
||||||
# This originates from X11R5 (mit/util/scripts/install.sh), which was
|
# This originates from X11R5 (mit/util/scripts/install.sh), which was
|
||||||
# later released in X11R6 (xc/config/util/install.sh) with the
|
# later released in X11R6 (xc/config/util/install.sh) with the
|
||||||
@ -41,19 +41,15 @@ scriptversion=2011-11-20.07; # UTC
|
|||||||
# This script is compatible with the BSD install script, but was written
|
# This script is compatible with the BSD install script, but was written
|
||||||
# from scratch.
|
# from scratch.
|
||||||
|
|
||||||
|
tab=' '
|
||||||
nl='
|
nl='
|
||||||
'
|
'
|
||||||
IFS=" "" $nl"
|
IFS=" $tab$nl"
|
||||||
|
|
||||||
# set DOITPROG to echo to test this script
|
# Set DOITPROG to "echo" to test this script.
|
||||||
|
|
||||||
# Don't use :- since 4.3BSD and earlier shells don't like it.
|
|
||||||
doit=${DOITPROG-}
|
doit=${DOITPROG-}
|
||||||
if test -z "$doit"; then
|
doit_exec=${doit:-exec}
|
||||||
doit_exec=exec
|
|
||||||
else
|
|
||||||
doit_exec=$doit
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Put in absolute file names if you don't have them in your path;
|
# Put in absolute file names if you don't have them in your path;
|
||||||
# or use environment vars.
|
# or use environment vars.
|
||||||
@ -68,17 +64,6 @@ mvprog=${MVPROG-mv}
|
|||||||
rmprog=${RMPROG-rm}
|
rmprog=${RMPROG-rm}
|
||||||
stripprog=${STRIPPROG-strip}
|
stripprog=${STRIPPROG-strip}
|
||||||
|
|
||||||
posix_glob='?'
|
|
||||||
initialize_posix_glob='
|
|
||||||
test "$posix_glob" != "?" || {
|
|
||||||
if (set -f) 2>/dev/null; then
|
|
||||||
posix_glob=
|
|
||||||
else
|
|
||||||
posix_glob=:
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
'
|
|
||||||
|
|
||||||
posix_mkdir=
|
posix_mkdir=
|
||||||
|
|
||||||
# Desired mode of installed file.
|
# Desired mode of installed file.
|
||||||
@ -97,7 +82,7 @@ dir_arg=
|
|||||||
dst_arg=
|
dst_arg=
|
||||||
|
|
||||||
copy_on_change=false
|
copy_on_change=false
|
||||||
no_target_directory=
|
is_target_a_directory=possibly
|
||||||
|
|
||||||
usage="\
|
usage="\
|
||||||
Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
|
Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
|
||||||
@ -143,8 +128,7 @@ while test $# -ne 0; do
|
|||||||
|
|
||||||
-m) mode=$2
|
-m) mode=$2
|
||||||
case $mode in
|
case $mode in
|
||||||
*' '* | *' '* | *'
|
*' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
|
||||||
'* | *'*'* | *'?'* | *'['*)
|
|
||||||
echo "$0: invalid mode: $mode" >&2
|
echo "$0: invalid mode: $mode" >&2
|
||||||
exit 1;;
|
exit 1;;
|
||||||
esac
|
esac
|
||||||
@ -155,14 +139,16 @@ while test $# -ne 0; do
|
|||||||
|
|
||||||
-s) stripcmd=$stripprog;;
|
-s) stripcmd=$stripprog;;
|
||||||
|
|
||||||
-t) dst_arg=$2
|
-t)
|
||||||
|
is_target_a_directory=always
|
||||||
|
dst_arg=$2
|
||||||
# Protect names problematic for 'test' and other utilities.
|
# Protect names problematic for 'test' and other utilities.
|
||||||
case $dst_arg in
|
case $dst_arg in
|
||||||
-* | [=\(\)!]) dst_arg=./$dst_arg;;
|
-* | [=\(\)!]) dst_arg=./$dst_arg;;
|
||||||
esac
|
esac
|
||||||
shift;;
|
shift;;
|
||||||
|
|
||||||
-T) no_target_directory=true;;
|
-T) is_target_a_directory=never;;
|
||||||
|
|
||||||
--version) echo "$0 $scriptversion"; exit $?;;
|
--version) echo "$0 $scriptversion"; exit $?;;
|
||||||
|
|
||||||
@ -177,6 +163,16 @@ while test $# -ne 0; do
|
|||||||
shift
|
shift
|
||||||
done
|
done
|
||||||
|
|
||||||
|
# We allow the use of options -d and -T together, by making -d
|
||||||
|
# take the precedence; this is for compatibility with GNU install.
|
||||||
|
|
||||||
|
if test -n "$dir_arg"; then
|
||||||
|
if test -n "$dst_arg"; then
|
||||||
|
echo "$0: target directory not allowed when installing a directory." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
|
if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
|
||||||
# When -d is used, all remaining arguments are directories to create.
|
# When -d is used, all remaining arguments are directories to create.
|
||||||
# When -t is used, the destination is already specified.
|
# When -t is used, the destination is already specified.
|
||||||
@ -207,6 +203,15 @@ if test $# -eq 0; then
|
|||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if test -z "$dir_arg"; then
|
||||||
|
if test $# -gt 1 || test "$is_target_a_directory" = always; then
|
||||||
|
if test ! -d "$dst_arg"; then
|
||||||
|
echo "$0: $dst_arg: Is not a directory." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
if test -z "$dir_arg"; then
|
if test -z "$dir_arg"; then
|
||||||
do_exit='(exit $ret); exit $ret'
|
do_exit='(exit $ret); exit $ret'
|
||||||
trap "ret=129; $do_exit" 1
|
trap "ret=129; $do_exit" 1
|
||||||
@ -269,7 +274,7 @@ do
|
|||||||
# If destination is a directory, append the input filename; won't work
|
# If destination is a directory, append the input filename; won't work
|
||||||
# if double slashes aren't ignored.
|
# if double slashes aren't ignored.
|
||||||
if test -d "$dst"; then
|
if test -d "$dst"; then
|
||||||
if test -n "$no_target_directory"; then
|
if test "$is_target_a_directory" = never; then
|
||||||
echo "$0: $dst_arg: Is a directory" >&2
|
echo "$0: $dst_arg: Is a directory" >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
@ -277,33 +282,7 @@ do
|
|||||||
dst=$dstdir/`basename "$src"`
|
dst=$dstdir/`basename "$src"`
|
||||||
dstdir_status=0
|
dstdir_status=0
|
||||||
else
|
else
|
||||||
# Prefer dirname, but fall back on a substitute if dirname fails.
|
dstdir=`dirname "$dst"`
|
||||||
dstdir=`
|
|
||||||
(dirname "$dst") 2>/dev/null ||
|
|
||||||
expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
|
|
||||||
X"$dst" : 'X\(//\)[^/]' \| \
|
|
||||||
X"$dst" : 'X\(//\)$' \| \
|
|
||||||
X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
|
|
||||||
echo X"$dst" |
|
|
||||||
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
/^X\(\/\/\)[^/].*/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
/^X\(\/\/\)$/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
/^X\(\/\).*/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
s/.*/./; q'
|
|
||||||
`
|
|
||||||
|
|
||||||
test -d "$dstdir"
|
test -d "$dstdir"
|
||||||
dstdir_status=$?
|
dstdir_status=$?
|
||||||
fi
|
fi
|
||||||
@ -396,14 +375,12 @@ do
|
|||||||
*) prefix='';;
|
*) prefix='';;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
eval "$initialize_posix_glob"
|
|
||||||
|
|
||||||
oIFS=$IFS
|
oIFS=$IFS
|
||||||
IFS=/
|
IFS=/
|
||||||
$posix_glob set -f
|
set -f
|
||||||
set fnord $dstdir
|
set fnord $dstdir
|
||||||
shift
|
shift
|
||||||
$posix_glob set +f
|
set +f
|
||||||
IFS=$oIFS
|
IFS=$oIFS
|
||||||
|
|
||||||
prefixes=
|
prefixes=
|
||||||
@ -474,13 +451,10 @@ do
|
|||||||
if $copy_on_change &&
|
if $copy_on_change &&
|
||||||
old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
|
old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
|
||||||
new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
|
new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
|
||||||
|
set -f &&
|
||||||
eval "$initialize_posix_glob" &&
|
|
||||||
$posix_glob set -f &&
|
|
||||||
set X $old && old=:$2:$4:$5:$6 &&
|
set X $old && old=:$2:$4:$5:$6 &&
|
||||||
set X $new && new=:$2:$4:$5:$6 &&
|
set X $new && new=:$2:$4:$5:$6 &&
|
||||||
$posix_glob set +f &&
|
set +f &&
|
||||||
|
|
||||||
test "$old" = "$new" &&
|
test "$old" = "$new" &&
|
||||||
$cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
|
$cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
|
||||||
then
|
then
|
||||||
|
@ -9,4 +9,5 @@ Name: libpcre
|
|||||||
Description: PCRE - Perl compatible regular expressions C library with 8 bit character support
|
Description: PCRE - Perl compatible regular expressions C library with 8 bit character support
|
||||||
Version: @PACKAGE_VERSION@
|
Version: @PACKAGE_VERSION@
|
||||||
Libs: -L${libdir} -lpcre
|
Libs: -L${libdir} -lpcre
|
||||||
|
Libs.private: @PTHREAD_CFLAGS@ @PTHREAD_LIBS@
|
||||||
Cflags: -I${includedir} @PCRE_STATIC_CFLAG@
|
Cflags: -I${includedir} @PCRE_STATIC_CFLAG@
|
||||||
|
@ -9,4 +9,5 @@ Name: libpcre16
|
|||||||
Description: PCRE - Perl compatible regular expressions C library with 16 bit character support
|
Description: PCRE - Perl compatible regular expressions C library with 16 bit character support
|
||||||
Version: @PACKAGE_VERSION@
|
Version: @PACKAGE_VERSION@
|
||||||
Libs: -L${libdir} -lpcre16
|
Libs: -L${libdir} -lpcre16
|
||||||
|
Libs.private: @PTHREAD_CFLAGS@ @PTHREAD_LIBS@
|
||||||
Cflags: -I${includedir} @PCRE_STATIC_CFLAG@
|
Cflags: -I${includedir} @PCRE_STATIC_CFLAG@
|
||||||
|
@ -9,4 +9,5 @@ Name: libpcre32
|
|||||||
Description: PCRE - Perl compatible regular expressions C library with 32 bit character support
|
Description: PCRE - Perl compatible regular expressions C library with 32 bit character support
|
||||||
Version: @PACKAGE_VERSION@
|
Version: @PACKAGE_VERSION@
|
||||||
Libs: -L${libdir} -lpcre32
|
Libs: -L${libdir} -lpcre32
|
||||||
|
Libs.private: @PTHREAD_CFLAGS@ @PTHREAD_LIBS@
|
||||||
Cflags: -I${includedir} @PCRE_STATIC_CFLAG@
|
Cflags: -I${includedir} @PCRE_STATIC_CFLAG@
|
||||||
|
5120
pcre/ltmain.sh
5120
pcre/ltmain.sh
File diff suppressed because it is too large
Load Diff
2421
pcre/m4/libtool.m4
vendored
2421
pcre/m4/libtool.m4
vendored
File diff suppressed because it is too large
Load Diff
125
pcre/m4/ltoptions.m4
vendored
125
pcre/m4/ltoptions.m4
vendored
@ -1,14 +1,14 @@
|
|||||||
# Helper functions for option handling. -*- Autoconf -*-
|
# Helper functions for option handling. -*- Autoconf -*-
|
||||||
#
|
#
|
||||||
# Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation,
|
# Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software
|
||||||
# Inc.
|
# Foundation, Inc.
|
||||||
# Written by Gary V. Vaughan, 2004
|
# Written by Gary V. Vaughan, 2004
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation gives
|
# This file is free software; the Free Software Foundation gives
|
||||||
# unlimited permission to copy and/or distribute it, with or without
|
# unlimited permission to copy and/or distribute it, with or without
|
||||||
# modifications, as long as this notice is preserved.
|
# modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
# serial 7 ltoptions.m4
|
# serial 8 ltoptions.m4
|
||||||
|
|
||||||
# This is to help aclocal find these macros, as it can't see m4_define.
|
# This is to help aclocal find these macros, as it can't see m4_define.
|
||||||
AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
|
AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
|
||||||
@ -29,7 +29,7 @@ m4_define([_LT_SET_OPTION],
|
|||||||
[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
|
[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
|
||||||
m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
|
m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
|
||||||
_LT_MANGLE_DEFUN([$1], [$2]),
|
_LT_MANGLE_DEFUN([$1], [$2]),
|
||||||
[m4_warning([Unknown $1 option `$2'])])[]dnl
|
[m4_warning([Unknown $1 option '$2'])])[]dnl
|
||||||
])
|
])
|
||||||
|
|
||||||
|
|
||||||
@ -75,13 +75,15 @@ m4_if([$1],[LT_INIT],[
|
|||||||
dnl
|
dnl
|
||||||
dnl If no reference was made to various pairs of opposing options, then
|
dnl If no reference was made to various pairs of opposing options, then
|
||||||
dnl we run the default mode handler for the pair. For example, if neither
|
dnl we run the default mode handler for the pair. For example, if neither
|
||||||
dnl `shared' nor `disable-shared' was passed, we enable building of shared
|
dnl 'shared' nor 'disable-shared' was passed, we enable building of shared
|
||||||
dnl archives by default:
|
dnl archives by default:
|
||||||
_LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
|
_LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
|
||||||
_LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
|
_LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
|
||||||
_LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
|
_LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
|
||||||
_LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
|
_LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
|
||||||
[_LT_ENABLE_FAST_INSTALL])
|
[_LT_ENABLE_FAST_INSTALL])
|
||||||
|
_LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4],
|
||||||
|
[_LT_WITH_AIX_SONAME([aix])])
|
||||||
])
|
])
|
||||||
])# _LT_SET_OPTIONS
|
])# _LT_SET_OPTIONS
|
||||||
|
|
||||||
@ -112,7 +114,7 @@ AU_DEFUN([AC_LIBTOOL_DLOPEN],
|
|||||||
[_LT_SET_OPTION([LT_INIT], [dlopen])
|
[_LT_SET_OPTION([LT_INIT], [dlopen])
|
||||||
AC_DIAGNOSE([obsolete],
|
AC_DIAGNOSE([obsolete],
|
||||||
[$0: Remove this warning and the call to _LT_SET_OPTION when you
|
[$0: Remove this warning and the call to _LT_SET_OPTION when you
|
||||||
put the `dlopen' option into LT_INIT's first parameter.])
|
put the 'dlopen' option into LT_INIT's first parameter.])
|
||||||
])
|
])
|
||||||
|
|
||||||
dnl aclocal-1.4 backwards compatibility:
|
dnl aclocal-1.4 backwards compatibility:
|
||||||
@ -148,7 +150,7 @@ AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
|
|||||||
_LT_SET_OPTION([LT_INIT], [win32-dll])
|
_LT_SET_OPTION([LT_INIT], [win32-dll])
|
||||||
AC_DIAGNOSE([obsolete],
|
AC_DIAGNOSE([obsolete],
|
||||||
[$0: Remove this warning and the call to _LT_SET_OPTION when you
|
[$0: Remove this warning and the call to _LT_SET_OPTION when you
|
||||||
put the `win32-dll' option into LT_INIT's first parameter.])
|
put the 'win32-dll' option into LT_INIT's first parameter.])
|
||||||
])
|
])
|
||||||
|
|
||||||
dnl aclocal-1.4 backwards compatibility:
|
dnl aclocal-1.4 backwards compatibility:
|
||||||
@ -157,9 +159,9 @@ dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
|
|||||||
|
|
||||||
# _LT_ENABLE_SHARED([DEFAULT])
|
# _LT_ENABLE_SHARED([DEFAULT])
|
||||||
# ----------------------------
|
# ----------------------------
|
||||||
# implement the --enable-shared flag, and supports the `shared' and
|
# implement the --enable-shared flag, and supports the 'shared' and
|
||||||
# `disable-shared' LT_INIT options.
|
# 'disable-shared' LT_INIT options.
|
||||||
# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
|
# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'.
|
||||||
m4_define([_LT_ENABLE_SHARED],
|
m4_define([_LT_ENABLE_SHARED],
|
||||||
[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
|
[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
|
||||||
AC_ARG_ENABLE([shared],
|
AC_ARG_ENABLE([shared],
|
||||||
@ -172,14 +174,14 @@ AC_ARG_ENABLE([shared],
|
|||||||
*)
|
*)
|
||||||
enable_shared=no
|
enable_shared=no
|
||||||
# Look at the argument we got. We use all the common list separators.
|
# Look at the argument we got. We use all the common list separators.
|
||||||
lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
|
lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
|
||||||
for pkg in $enableval; do
|
for pkg in $enableval; do
|
||||||
IFS="$lt_save_ifs"
|
IFS=$lt_save_ifs
|
||||||
if test "X$pkg" = "X$p"; then
|
if test "X$pkg" = "X$p"; then
|
||||||
enable_shared=yes
|
enable_shared=yes
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
IFS="$lt_save_ifs"
|
IFS=$lt_save_ifs
|
||||||
;;
|
;;
|
||||||
esac],
|
esac],
|
||||||
[enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
|
[enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
|
||||||
@ -211,9 +213,9 @@ dnl AC_DEFUN([AM_DISABLE_SHARED], [])
|
|||||||
|
|
||||||
# _LT_ENABLE_STATIC([DEFAULT])
|
# _LT_ENABLE_STATIC([DEFAULT])
|
||||||
# ----------------------------
|
# ----------------------------
|
||||||
# implement the --enable-static flag, and support the `static' and
|
# implement the --enable-static flag, and support the 'static' and
|
||||||
# `disable-static' LT_INIT options.
|
# 'disable-static' LT_INIT options.
|
||||||
# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
|
# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'.
|
||||||
m4_define([_LT_ENABLE_STATIC],
|
m4_define([_LT_ENABLE_STATIC],
|
||||||
[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
|
[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
|
||||||
AC_ARG_ENABLE([static],
|
AC_ARG_ENABLE([static],
|
||||||
@ -226,14 +228,14 @@ AC_ARG_ENABLE([static],
|
|||||||
*)
|
*)
|
||||||
enable_static=no
|
enable_static=no
|
||||||
# Look at the argument we got. We use all the common list separators.
|
# Look at the argument we got. We use all the common list separators.
|
||||||
lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
|
lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
|
||||||
for pkg in $enableval; do
|
for pkg in $enableval; do
|
||||||
IFS="$lt_save_ifs"
|
IFS=$lt_save_ifs
|
||||||
if test "X$pkg" = "X$p"; then
|
if test "X$pkg" = "X$p"; then
|
||||||
enable_static=yes
|
enable_static=yes
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
IFS="$lt_save_ifs"
|
IFS=$lt_save_ifs
|
||||||
;;
|
;;
|
||||||
esac],
|
esac],
|
||||||
[enable_static=]_LT_ENABLE_STATIC_DEFAULT)
|
[enable_static=]_LT_ENABLE_STATIC_DEFAULT)
|
||||||
@ -265,9 +267,9 @@ dnl AC_DEFUN([AM_DISABLE_STATIC], [])
|
|||||||
|
|
||||||
# _LT_ENABLE_FAST_INSTALL([DEFAULT])
|
# _LT_ENABLE_FAST_INSTALL([DEFAULT])
|
||||||
# ----------------------------------
|
# ----------------------------------
|
||||||
# implement the --enable-fast-install flag, and support the `fast-install'
|
# implement the --enable-fast-install flag, and support the 'fast-install'
|
||||||
# and `disable-fast-install' LT_INIT options.
|
# and 'disable-fast-install' LT_INIT options.
|
||||||
# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
|
# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'.
|
||||||
m4_define([_LT_ENABLE_FAST_INSTALL],
|
m4_define([_LT_ENABLE_FAST_INSTALL],
|
||||||
[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
|
[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
|
||||||
AC_ARG_ENABLE([fast-install],
|
AC_ARG_ENABLE([fast-install],
|
||||||
@ -280,14 +282,14 @@ AC_ARG_ENABLE([fast-install],
|
|||||||
*)
|
*)
|
||||||
enable_fast_install=no
|
enable_fast_install=no
|
||||||
# Look at the argument we got. We use all the common list separators.
|
# Look at the argument we got. We use all the common list separators.
|
||||||
lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
|
lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
|
||||||
for pkg in $enableval; do
|
for pkg in $enableval; do
|
||||||
IFS="$lt_save_ifs"
|
IFS=$lt_save_ifs
|
||||||
if test "X$pkg" = "X$p"; then
|
if test "X$pkg" = "X$p"; then
|
||||||
enable_fast_install=yes
|
enable_fast_install=yes
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
IFS="$lt_save_ifs"
|
IFS=$lt_save_ifs
|
||||||
;;
|
;;
|
||||||
esac],
|
esac],
|
||||||
[enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
|
[enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
|
||||||
@ -304,14 +306,14 @@ AU_DEFUN([AC_ENABLE_FAST_INSTALL],
|
|||||||
[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
|
[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
|
||||||
AC_DIAGNOSE([obsolete],
|
AC_DIAGNOSE([obsolete],
|
||||||
[$0: Remove this warning and the call to _LT_SET_OPTION when you put
|
[$0: Remove this warning and the call to _LT_SET_OPTION when you put
|
||||||
the `fast-install' option into LT_INIT's first parameter.])
|
the 'fast-install' option into LT_INIT's first parameter.])
|
||||||
])
|
])
|
||||||
|
|
||||||
AU_DEFUN([AC_DISABLE_FAST_INSTALL],
|
AU_DEFUN([AC_DISABLE_FAST_INSTALL],
|
||||||
[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
|
[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
|
||||||
AC_DIAGNOSE([obsolete],
|
AC_DIAGNOSE([obsolete],
|
||||||
[$0: Remove this warning and the call to _LT_SET_OPTION when you put
|
[$0: Remove this warning and the call to _LT_SET_OPTION when you put
|
||||||
the `disable-fast-install' option into LT_INIT's first parameter.])
|
the 'disable-fast-install' option into LT_INIT's first parameter.])
|
||||||
])
|
])
|
||||||
|
|
||||||
dnl aclocal-1.4 backwards compatibility:
|
dnl aclocal-1.4 backwards compatibility:
|
||||||
@ -319,11 +321,64 @@ dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
|
|||||||
dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
|
dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
|
||||||
|
|
||||||
|
|
||||||
|
# _LT_WITH_AIX_SONAME([DEFAULT])
|
||||||
|
# ----------------------------------
|
||||||
|
# implement the --with-aix-soname flag, and support the `aix-soname=aix'
|
||||||
|
# and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT
|
||||||
|
# is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'.
|
||||||
|
m4_define([_LT_WITH_AIX_SONAME],
|
||||||
|
[m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl
|
||||||
|
shared_archive_member_spec=
|
||||||
|
case $host,$enable_shared in
|
||||||
|
power*-*-aix[[5-9]]*,yes)
|
||||||
|
AC_MSG_CHECKING([which variant of shared library versioning to provide])
|
||||||
|
AC_ARG_WITH([aix-soname],
|
||||||
|
[AS_HELP_STRING([--with-aix-soname=aix|svr4|both],
|
||||||
|
[shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])],
|
||||||
|
[case $withval in
|
||||||
|
aix|svr4|both)
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
AC_MSG_ERROR([Unknown argument to --with-aix-soname])
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
lt_cv_with_aix_soname=$with_aix_soname],
|
||||||
|
[AC_CACHE_VAL([lt_cv_with_aix_soname],
|
||||||
|
[lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT)
|
||||||
|
with_aix_soname=$lt_cv_with_aix_soname])
|
||||||
|
AC_MSG_RESULT([$with_aix_soname])
|
||||||
|
if test aix != "$with_aix_soname"; then
|
||||||
|
# For the AIX way of multilib, we name the shared archive member
|
||||||
|
# based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o',
|
||||||
|
# and 'shr.imp' or 'shr_64.imp', respectively, for the Import File.
|
||||||
|
# Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag,
|
||||||
|
# the AIX toolchain works better with OBJECT_MODE set (default 32).
|
||||||
|
if test 64 = "${OBJECT_MODE-32}"; then
|
||||||
|
shared_archive_member_spec=shr_64
|
||||||
|
else
|
||||||
|
shared_archive_member_spec=shr
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
with_aix_soname=aix
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
_LT_DECL([], [shared_archive_member_spec], [0],
|
||||||
|
[Shared archive member basename, for filename based shared library versioning on AIX])dnl
|
||||||
|
])# _LT_WITH_AIX_SONAME
|
||||||
|
|
||||||
|
LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])])
|
||||||
|
LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])])
|
||||||
|
LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])])
|
||||||
|
|
||||||
|
|
||||||
# _LT_WITH_PIC([MODE])
|
# _LT_WITH_PIC([MODE])
|
||||||
# --------------------
|
# --------------------
|
||||||
# implement the --with-pic flag, and support the `pic-only' and `no-pic'
|
# implement the --with-pic flag, and support the 'pic-only' and 'no-pic'
|
||||||
# LT_INIT options.
|
# LT_INIT options.
|
||||||
# MODE is either `yes' or `no'. If omitted, it defaults to `both'.
|
# MODE is either 'yes' or 'no'. If omitted, it defaults to 'both'.
|
||||||
m4_define([_LT_WITH_PIC],
|
m4_define([_LT_WITH_PIC],
|
||||||
[AC_ARG_WITH([pic],
|
[AC_ARG_WITH([pic],
|
||||||
[AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],
|
[AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],
|
||||||
@ -334,19 +389,17 @@ m4_define([_LT_WITH_PIC],
|
|||||||
*)
|
*)
|
||||||
pic_mode=default
|
pic_mode=default
|
||||||
# Look at the argument we got. We use all the common list separators.
|
# Look at the argument we got. We use all the common list separators.
|
||||||
lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
|
lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
|
||||||
for lt_pkg in $withval; do
|
for lt_pkg in $withval; do
|
||||||
IFS="$lt_save_ifs"
|
IFS=$lt_save_ifs
|
||||||
if test "X$lt_pkg" = "X$lt_p"; then
|
if test "X$lt_pkg" = "X$lt_p"; then
|
||||||
pic_mode=yes
|
pic_mode=yes
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
IFS="$lt_save_ifs"
|
IFS=$lt_save_ifs
|
||||||
;;
|
;;
|
||||||
esac],
|
esac],
|
||||||
[pic_mode=default])
|
[pic_mode=m4_default([$1], [default])])
|
||||||
|
|
||||||
test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
|
|
||||||
|
|
||||||
_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
|
_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
|
||||||
])# _LT_WITH_PIC
|
])# _LT_WITH_PIC
|
||||||
@ -359,7 +412,7 @@ AU_DEFUN([AC_LIBTOOL_PICMODE],
|
|||||||
[_LT_SET_OPTION([LT_INIT], [pic-only])
|
[_LT_SET_OPTION([LT_INIT], [pic-only])
|
||||||
AC_DIAGNOSE([obsolete],
|
AC_DIAGNOSE([obsolete],
|
||||||
[$0: Remove this warning and the call to _LT_SET_OPTION when you
|
[$0: Remove this warning and the call to _LT_SET_OPTION when you
|
||||||
put the `pic-only' option into LT_INIT's first parameter.])
|
put the 'pic-only' option into LT_INIT's first parameter.])
|
||||||
])
|
])
|
||||||
|
|
||||||
dnl aclocal-1.4 backwards compatibility:
|
dnl aclocal-1.4 backwards compatibility:
|
||||||
|
7
pcre/m4/ltsugar.m4
vendored
7
pcre/m4/ltsugar.m4
vendored
@ -1,6 +1,7 @@
|
|||||||
# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*-
|
# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*-
|
||||||
#
|
#
|
||||||
# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
|
# Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software
|
||||||
|
# Foundation, Inc.
|
||||||
# Written by Gary V. Vaughan, 2004
|
# Written by Gary V. Vaughan, 2004
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation gives
|
# This file is free software; the Free Software Foundation gives
|
||||||
@ -33,7 +34,7 @@ m4_define([_lt_join],
|
|||||||
# ------------
|
# ------------
|
||||||
# Manipulate m4 lists.
|
# Manipulate m4 lists.
|
||||||
# These macros are necessary as long as will still need to support
|
# These macros are necessary as long as will still need to support
|
||||||
# Autoconf-2.59 which quotes differently.
|
# Autoconf-2.59, which quotes differently.
|
||||||
m4_define([lt_car], [[$1]])
|
m4_define([lt_car], [[$1]])
|
||||||
m4_define([lt_cdr],
|
m4_define([lt_cdr],
|
||||||
[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
|
[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
|
||||||
@ -44,7 +45,7 @@ m4_define([lt_unquote], $1)
|
|||||||
|
|
||||||
# lt_append(MACRO-NAME, STRING, [SEPARATOR])
|
# lt_append(MACRO-NAME, STRING, [SEPARATOR])
|
||||||
# ------------------------------------------
|
# ------------------------------------------
|
||||||
# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
|
# Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'.
|
||||||
# Note that neither SEPARATOR nor STRING are expanded; they are appended
|
# Note that neither SEPARATOR nor STRING are expanded; they are appended
|
||||||
# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
|
# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
|
||||||
# No SEPARATOR is output if MACRO-NAME was previously undefined (different
|
# No SEPARATOR is output if MACRO-NAME was previously undefined (different
|
||||||
|
12
pcre/m4/ltversion.m4
vendored
12
pcre/m4/ltversion.m4
vendored
@ -1,6 +1,6 @@
|
|||||||
# ltversion.m4 -- version numbers -*- Autoconf -*-
|
# ltversion.m4 -- version numbers -*- Autoconf -*-
|
||||||
#
|
#
|
||||||
# Copyright (C) 2004 Free Software Foundation, Inc.
|
# Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc.
|
||||||
# Written by Scott James Remnant, 2004
|
# Written by Scott James Remnant, 2004
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation gives
|
# This file is free software; the Free Software Foundation gives
|
||||||
@ -9,15 +9,15 @@
|
|||||||
|
|
||||||
# @configure_input@
|
# @configure_input@
|
||||||
|
|
||||||
# serial 3337 ltversion.m4
|
# serial 4179 ltversion.m4
|
||||||
# This file is part of GNU Libtool
|
# This file is part of GNU Libtool
|
||||||
|
|
||||||
m4_define([LT_PACKAGE_VERSION], [2.4.2])
|
m4_define([LT_PACKAGE_VERSION], [2.4.6])
|
||||||
m4_define([LT_PACKAGE_REVISION], [1.3337])
|
m4_define([LT_PACKAGE_REVISION], [2.4.6])
|
||||||
|
|
||||||
AC_DEFUN([LTVERSION_VERSION],
|
AC_DEFUN([LTVERSION_VERSION],
|
||||||
[macro_version='2.4.2'
|
[macro_version='2.4.6'
|
||||||
macro_revision='1.3337'
|
macro_revision='2.4.6'
|
||||||
_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
|
_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
|
||||||
_LT_DECL(, macro_revision, 0)
|
_LT_DECL(, macro_revision, 0)
|
||||||
])
|
])
|
||||||
|
5
pcre/m4/lt~obsolete.m4
vendored
5
pcre/m4/lt~obsolete.m4
vendored
@ -1,6 +1,7 @@
|
|||||||
# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*-
|
# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*-
|
||||||
#
|
#
|
||||||
# Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
|
# Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software
|
||||||
|
# Foundation, Inc.
|
||||||
# Written by Scott James Remnant, 2004.
|
# Written by Scott James Remnant, 2004.
|
||||||
#
|
#
|
||||||
# This file is free software; the Free Software Foundation gives
|
# This file is free software; the Free Software Foundation gives
|
||||||
@ -11,7 +12,7 @@
|
|||||||
|
|
||||||
# These exist entirely to fool aclocal when bootstrapping libtool.
|
# These exist entirely to fool aclocal when bootstrapping libtool.
|
||||||
#
|
#
|
||||||
# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
|
# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN),
|
||||||
# which have later been changed to m4_define as they aren't part of the
|
# which have later been changed to m4_define as they aren't part of the
|
||||||
# exported API, or moved to Autoconf or Automake where they belong.
|
# exported API, or moved to Autoconf or Automake where they belong.
|
||||||
#
|
#
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
scriptversion=2013-10-28.13; # UTC
|
scriptversion=2013-10-28.13; # UTC
|
||||||
|
|
||||||
# Copyright (C) 1996-2013 Free Software Foundation, Inc.
|
# Copyright (C) 1996-2014 Free Software Foundation, Inc.
|
||||||
# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
|
# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
|
||||||
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -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 36
|
#define PCRE_MINOR 37
|
||||||
#define PCRE_PRERELEASE
|
#define PCRE_PRERELEASE
|
||||||
#define PCRE_DATE 2014-09-26
|
#define PCRE_DATE 2015-04-28
|
||||||
|
|
||||||
/* 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
|
||||||
|
@ -1704,6 +1704,7 @@ Arguments:
|
|||||||
utf TRUE in UTF-8 / UTF-16 / UTF-32 mode
|
utf TRUE in UTF-8 / UTF-16 / UTF-32 mode
|
||||||
atend TRUE if called when the pattern is complete
|
atend TRUE if called when the pattern is complete
|
||||||
cd the "compile data" structure
|
cd the "compile data" structure
|
||||||
|
recurses chain of recurse_check to catch mutual recursion
|
||||||
|
|
||||||
Returns: the fixed length,
|
Returns: the fixed length,
|
||||||
or -1 if there is no fixed length,
|
or -1 if there is no fixed length,
|
||||||
@ -1713,10 +1714,11 @@ Returns: the fixed length,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
static int
|
static int
|
||||||
find_fixedlength(pcre_uchar *code, BOOL utf, BOOL atend, compile_data *cd)
|
find_fixedlength(pcre_uchar *code, BOOL utf, BOOL atend, compile_data *cd,
|
||||||
|
recurse_check *recurses)
|
||||||
{
|
{
|
||||||
int length = -1;
|
int length = -1;
|
||||||
|
recurse_check this_recurse;
|
||||||
register int branchlength = 0;
|
register int branchlength = 0;
|
||||||
register pcre_uchar *cc = code + 1 + LINK_SIZE;
|
register pcre_uchar *cc = code + 1 + LINK_SIZE;
|
||||||
|
|
||||||
@ -1741,7 +1743,8 @@ for (;;)
|
|||||||
case OP_ONCE:
|
case OP_ONCE:
|
||||||
case OP_ONCE_NC:
|
case OP_ONCE_NC:
|
||||||
case OP_COND:
|
case OP_COND:
|
||||||
d = find_fixedlength(cc + ((op == OP_CBRA)? IMM2_SIZE : 0), utf, atend, cd);
|
d = find_fixedlength(cc + ((op == OP_CBRA)? IMM2_SIZE : 0), utf, atend, cd,
|
||||||
|
recurses);
|
||||||
if (d < 0) return d;
|
if (d < 0) return d;
|
||||||
branchlength += d;
|
branchlength += d;
|
||||||
do cc += GET(cc, 1); while (*cc == OP_ALT);
|
do cc += GET(cc, 1); while (*cc == OP_ALT);
|
||||||
@ -1775,7 +1778,15 @@ for (;;)
|
|||||||
cs = ce = (pcre_uchar *)cd->start_code + GET(cc, 1); /* Start subpattern */
|
cs = ce = (pcre_uchar *)cd->start_code + GET(cc, 1); /* Start subpattern */
|
||||||
do ce += GET(ce, 1); while (*ce == OP_ALT); /* End subpattern */
|
do ce += GET(ce, 1); while (*ce == OP_ALT); /* End subpattern */
|
||||||
if (cc > cs && cc < ce) return -1; /* Recursion */
|
if (cc > cs && cc < ce) return -1; /* Recursion */
|
||||||
d = find_fixedlength(cs + IMM2_SIZE, utf, atend, cd);
|
else /* Check for mutual recursion */
|
||||||
|
{
|
||||||
|
recurse_check *r = recurses;
|
||||||
|
for (r = recurses; r != NULL; r = r->prev) if (r->group == cs) break;
|
||||||
|
if (r != NULL) return -1; /* Mutual recursion */
|
||||||
|
}
|
||||||
|
this_recurse.prev = recurses;
|
||||||
|
this_recurse.group = cs;
|
||||||
|
d = find_fixedlength(cs + IMM2_SIZE, utf, atend, cd, &this_recurse);
|
||||||
if (d < 0) return d;
|
if (d < 0) return d;
|
||||||
branchlength += d;
|
branchlength += d;
|
||||||
cc += 1 + LINK_SIZE;
|
cc += 1 + LINK_SIZE;
|
||||||
@ -2129,32 +2140,60 @@ for (;;)
|
|||||||
{
|
{
|
||||||
case OP_CHAR:
|
case OP_CHAR:
|
||||||
case OP_CHARI:
|
case OP_CHARI:
|
||||||
|
case OP_NOT:
|
||||||
|
case OP_NOTI:
|
||||||
case OP_EXACT:
|
case OP_EXACT:
|
||||||
case OP_EXACTI:
|
case OP_EXACTI:
|
||||||
|
case OP_NOTEXACT:
|
||||||
|
case OP_NOTEXACTI:
|
||||||
case OP_UPTO:
|
case OP_UPTO:
|
||||||
case OP_UPTOI:
|
case OP_UPTOI:
|
||||||
|
case OP_NOTUPTO:
|
||||||
|
case OP_NOTUPTOI:
|
||||||
case OP_MINUPTO:
|
case OP_MINUPTO:
|
||||||
case OP_MINUPTOI:
|
case OP_MINUPTOI:
|
||||||
|
case OP_NOTMINUPTO:
|
||||||
|
case OP_NOTMINUPTOI:
|
||||||
case OP_POSUPTO:
|
case OP_POSUPTO:
|
||||||
case OP_POSUPTOI:
|
case OP_POSUPTOI:
|
||||||
|
case OP_NOTPOSUPTO:
|
||||||
|
case OP_NOTPOSUPTOI:
|
||||||
case OP_STAR:
|
case OP_STAR:
|
||||||
case OP_STARI:
|
case OP_STARI:
|
||||||
|
case OP_NOTSTAR:
|
||||||
|
case OP_NOTSTARI:
|
||||||
case OP_MINSTAR:
|
case OP_MINSTAR:
|
||||||
case OP_MINSTARI:
|
case OP_MINSTARI:
|
||||||
|
case OP_NOTMINSTAR:
|
||||||
|
case OP_NOTMINSTARI:
|
||||||
case OP_POSSTAR:
|
case OP_POSSTAR:
|
||||||
case OP_POSSTARI:
|
case OP_POSSTARI:
|
||||||
|
case OP_NOTPOSSTAR:
|
||||||
|
case OP_NOTPOSSTARI:
|
||||||
case OP_PLUS:
|
case OP_PLUS:
|
||||||
case OP_PLUSI:
|
case OP_PLUSI:
|
||||||
|
case OP_NOTPLUS:
|
||||||
|
case OP_NOTPLUSI:
|
||||||
case OP_MINPLUS:
|
case OP_MINPLUS:
|
||||||
case OP_MINPLUSI:
|
case OP_MINPLUSI:
|
||||||
|
case OP_NOTMINPLUS:
|
||||||
|
case OP_NOTMINPLUSI:
|
||||||
case OP_POSPLUS:
|
case OP_POSPLUS:
|
||||||
case OP_POSPLUSI:
|
case OP_POSPLUSI:
|
||||||
|
case OP_NOTPOSPLUS:
|
||||||
|
case OP_NOTPOSPLUSI:
|
||||||
case OP_QUERY:
|
case OP_QUERY:
|
||||||
case OP_QUERYI:
|
case OP_QUERYI:
|
||||||
|
case OP_NOTQUERY:
|
||||||
|
case OP_NOTQUERYI:
|
||||||
case OP_MINQUERY:
|
case OP_MINQUERY:
|
||||||
case OP_MINQUERYI:
|
case OP_MINQUERYI:
|
||||||
|
case OP_NOTMINQUERY:
|
||||||
|
case OP_NOTMINQUERYI:
|
||||||
case OP_POSQUERY:
|
case OP_POSQUERY:
|
||||||
case OP_POSQUERYI:
|
case OP_POSQUERYI:
|
||||||
|
case OP_NOTPOSQUERY:
|
||||||
|
case OP_NOTPOSQUERYI:
|
||||||
if (HAS_EXTRALEN(code[-1])) code += GET_EXTRALEN(code[-1]);
|
if (HAS_EXTRALEN(code[-1])) code += GET_EXTRALEN(code[-1]);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -2334,11 +2373,6 @@ Arguments:
|
|||||||
Returns: TRUE if what is matched could be empty
|
Returns: TRUE if what is matched could be empty
|
||||||
*/
|
*/
|
||||||
|
|
||||||
typedef struct recurse_check {
|
|
||||||
struct recurse_check *prev;
|
|
||||||
const pcre_uchar *group;
|
|
||||||
} recurse_check;
|
|
||||||
|
|
||||||
static BOOL
|
static BOOL
|
||||||
could_be_empty_branch(const pcre_uchar *code, const pcre_uchar *endcode,
|
could_be_empty_branch(const pcre_uchar *code, const pcre_uchar *endcode,
|
||||||
BOOL utf, compile_data *cd, recurse_check *recurses)
|
BOOL utf, compile_data *cd, recurse_check *recurses)
|
||||||
@ -2469,8 +2503,8 @@ for (code = first_significant_code(code + PRIV(OP_lengths)[*code], TRUE);
|
|||||||
empty_branch = FALSE;
|
empty_branch = FALSE;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
if (!empty_branch && could_be_empty_branch(code, endcode, utf, cd, NULL))
|
if (!empty_branch && could_be_empty_branch(code, endcode, utf, cd,
|
||||||
empty_branch = TRUE;
|
recurses)) empty_branch = TRUE;
|
||||||
code += GET(code, 1);
|
code += GET(code, 1);
|
||||||
}
|
}
|
||||||
while (*code == OP_ALT);
|
while (*code == OP_ALT);
|
||||||
@ -3065,7 +3099,7 @@ Returns: TRUE if the auto-possessification is possible
|
|||||||
|
|
||||||
static BOOL
|
static BOOL
|
||||||
compare_opcodes(const pcre_uchar *code, BOOL utf, const compile_data *cd,
|
compare_opcodes(const pcre_uchar *code, BOOL utf, const compile_data *cd,
|
||||||
const pcre_uint32 *base_list, const pcre_uchar *base_end)
|
const pcre_uint32 *base_list, const pcre_uchar *base_end, int *rec_limit)
|
||||||
{
|
{
|
||||||
pcre_uchar c;
|
pcre_uchar c;
|
||||||
pcre_uint32 list[8];
|
pcre_uint32 list[8];
|
||||||
@ -3082,6 +3116,9 @@ pcre_uint32 chr;
|
|||||||
BOOL accepted, invert_bits;
|
BOOL accepted, invert_bits;
|
||||||
BOOL entered_a_group = FALSE;
|
BOOL entered_a_group = FALSE;
|
||||||
|
|
||||||
|
if (*rec_limit == 0) return FALSE;
|
||||||
|
--(*rec_limit);
|
||||||
|
|
||||||
/* Note: the base_list[1] contains whether the current opcode has greedy
|
/* Note: the base_list[1] contains whether the current opcode has greedy
|
||||||
(represented by a non-zero value) quantifier. This is a different from
|
(represented by a non-zero value) quantifier. This is a different from
|
||||||
other character type lists, which stores here that the character iterator
|
other character type lists, which stores here that the character iterator
|
||||||
@ -3152,7 +3189,8 @@ for(;;)
|
|||||||
|
|
||||||
while (*next_code == OP_ALT)
|
while (*next_code == OP_ALT)
|
||||||
{
|
{
|
||||||
if (!compare_opcodes(code, utf, cd, base_list, base_end)) return FALSE;
|
if (!compare_opcodes(code, utf, cd, base_list, base_end, rec_limit))
|
||||||
|
return FALSE;
|
||||||
code = next_code + 1 + LINK_SIZE;
|
code = next_code + 1 + LINK_SIZE;
|
||||||
next_code += GET(next_code, 1);
|
next_code += GET(next_code, 1);
|
||||||
}
|
}
|
||||||
@ -3172,7 +3210,7 @@ for(;;)
|
|||||||
/* The bracket content will be checked by the
|
/* The bracket content will be checked by the
|
||||||
OP_BRA/OP_CBRA case above. */
|
OP_BRA/OP_CBRA case above. */
|
||||||
next_code += 1 + LINK_SIZE;
|
next_code += 1 + LINK_SIZE;
|
||||||
if (!compare_opcodes(next_code, utf, cd, base_list, base_end))
|
if (!compare_opcodes(next_code, utf, cd, base_list, base_end, rec_limit))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
code += PRIV(OP_lengths)[c];
|
code += PRIV(OP_lengths)[c];
|
||||||
@ -3605,11 +3643,20 @@ register pcre_uchar c;
|
|||||||
const pcre_uchar *end;
|
const pcre_uchar *end;
|
||||||
pcre_uchar *repeat_opcode;
|
pcre_uchar *repeat_opcode;
|
||||||
pcre_uint32 list[8];
|
pcre_uint32 list[8];
|
||||||
|
int rec_limit;
|
||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
c = *code;
|
c = *code;
|
||||||
|
|
||||||
|
/* When a pattern with bad UTF-8 encoding is compiled with NO_UTF_CHECK,
|
||||||
|
it may compile without complaining, but may get into a loop here if the code
|
||||||
|
pointer points to a bad value. This is, of course a documentated possibility,
|
||||||
|
when NO_UTF_CHECK is set, so it isn't a bug, but we can detect this case and
|
||||||
|
just give up on this optimization. */
|
||||||
|
|
||||||
|
if (c >= OP_TABLE_LENGTH) return;
|
||||||
|
|
||||||
if (c >= OP_STAR && c <= OP_TYPEPOSUPTO)
|
if (c >= OP_STAR && c <= OP_TYPEPOSUPTO)
|
||||||
{
|
{
|
||||||
c -= get_repeat_base(c) - OP_STAR;
|
c -= get_repeat_base(c) - OP_STAR;
|
||||||
@ -3617,7 +3664,8 @@ for (;;)
|
|||||||
get_chr_property_list(code, utf, cd->fcc, list) : NULL;
|
get_chr_property_list(code, utf, cd->fcc, list) : NULL;
|
||||||
list[1] = c == OP_STAR || c == OP_PLUS || c == OP_QUERY || c == OP_UPTO;
|
list[1] = c == OP_STAR || c == OP_PLUS || c == OP_QUERY || c == OP_UPTO;
|
||||||
|
|
||||||
if (end != NULL && compare_opcodes(end, utf, cd, list, end))
|
rec_limit = 1000;
|
||||||
|
if (end != NULL && compare_opcodes(end, utf, cd, list, end, &rec_limit))
|
||||||
{
|
{
|
||||||
switch(c)
|
switch(c)
|
||||||
{
|
{
|
||||||
@ -3673,7 +3721,8 @@ for (;;)
|
|||||||
|
|
||||||
list[1] = (c & 1) == 0;
|
list[1] = (c & 1) == 0;
|
||||||
|
|
||||||
if (compare_opcodes(end, utf, cd, list, end))
|
rec_limit = 1000;
|
||||||
|
if (compare_opcodes(end, utf, cd, list, end, &rec_limit))
|
||||||
{
|
{
|
||||||
switch (c)
|
switch (c)
|
||||||
{
|
{
|
||||||
@ -3947,14 +3996,14 @@ Arguments:
|
|||||||
adjust the amount by which the group is to be moved
|
adjust the amount by which the group is to be moved
|
||||||
utf TRUE in UTF-8 / UTF-16 / UTF-32 mode
|
utf TRUE in UTF-8 / UTF-16 / UTF-32 mode
|
||||||
cd contains pointers to tables etc.
|
cd contains pointers to tables etc.
|
||||||
save_hwm the hwm forward reference pointer at the start of the group
|
save_hwm_offset the hwm forward reference offset at the start of the group
|
||||||
|
|
||||||
Returns: nothing
|
Returns: nothing
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
adjust_recurse(pcre_uchar *group, int adjust, BOOL utf, compile_data *cd,
|
adjust_recurse(pcre_uchar *group, int adjust, BOOL utf, compile_data *cd,
|
||||||
pcre_uchar *save_hwm)
|
size_t save_hwm_offset)
|
||||||
{
|
{
|
||||||
pcre_uchar *ptr = group;
|
pcre_uchar *ptr = group;
|
||||||
|
|
||||||
@ -3966,7 +4015,8 @@ while ((ptr = (pcre_uchar *)find_recurse(ptr, utf)) != NULL)
|
|||||||
/* See if this recursion is on the forward reference list. If so, adjust the
|
/* See if this recursion is on the forward reference list. If so, adjust the
|
||||||
reference. */
|
reference. */
|
||||||
|
|
||||||
for (hc = save_hwm; hc < cd->hwm; hc += LINK_SIZE)
|
for (hc = (pcre_uchar *)cd->start_workspace + save_hwm_offset; hc < cd->hwm;
|
||||||
|
hc += LINK_SIZE)
|
||||||
{
|
{
|
||||||
offset = (int)GET(hc, 0);
|
offset = (int)GET(hc, 0);
|
||||||
if (cd->start_code + offset == ptr + 1)
|
if (cd->start_code + offset == ptr + 1)
|
||||||
@ -4171,7 +4221,11 @@ if ((options & PCRE_CASELESS) != 0)
|
|||||||
range. Otherwise, use a recursive call to add the additional range. */
|
range. Otherwise, use a recursive call to add the additional range. */
|
||||||
|
|
||||||
else if (oc < start && od >= start - 1) start = oc; /* Extend downwards */
|
else if (oc < start && od >= start - 1) start = oc; /* Extend downwards */
|
||||||
else if (od > end && oc <= end + 1) end = od; /* Extend upwards */
|
else if (od > end && oc <= end + 1)
|
||||||
|
{
|
||||||
|
end = od; /* Extend upwards */
|
||||||
|
if (end > classbits_end) classbits_end = (end <= 0xff ? end : 0xff);
|
||||||
|
}
|
||||||
else n8 += add_to_class(classbits, uchardptr, options, cd, oc, od);
|
else n8 += add_to_class(classbits, uchardptr, options, cd, oc, od);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -4411,7 +4465,7 @@ const pcre_uchar *tempptr;
|
|||||||
const pcre_uchar *nestptr = NULL;
|
const pcre_uchar *nestptr = NULL;
|
||||||
pcre_uchar *previous = NULL;
|
pcre_uchar *previous = NULL;
|
||||||
pcre_uchar *previous_callout = NULL;
|
pcre_uchar *previous_callout = NULL;
|
||||||
pcre_uchar *save_hwm = NULL;
|
size_t save_hwm_offset = 0;
|
||||||
pcre_uint8 classbits[32];
|
pcre_uint8 classbits[32];
|
||||||
|
|
||||||
/* We can fish out the UTF-8 setting once and for all into a BOOL, but we
|
/* We can fish out the UTF-8 setting once and for all into a BOOL, but we
|
||||||
@ -5470,6 +5524,12 @@ for (;; ptr++)
|
|||||||
PUT(previous, 1, (int)(code - previous));
|
PUT(previous, 1, (int)(code - previous));
|
||||||
break; /* End of class handling */
|
break; /* End of class handling */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Even though any XCLASS list is now discarded, we must allow for
|
||||||
|
its memory. */
|
||||||
|
|
||||||
|
if (lengthptr != NULL)
|
||||||
|
*lengthptr += (int)(class_uchardata - class_uchardata_base);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* If there are no characters > 255, or they are all to be included or
|
/* If there are no characters > 255, or they are all to be included or
|
||||||
@ -5870,6 +5930,7 @@ for (;; ptr++)
|
|||||||
{
|
{
|
||||||
register int i;
|
register int i;
|
||||||
int len = (int)(code - previous);
|
int len = (int)(code - previous);
|
||||||
|
size_t base_hwm_offset = save_hwm_offset;
|
||||||
pcre_uchar *bralink = NULL;
|
pcre_uchar *bralink = NULL;
|
||||||
pcre_uchar *brazeroptr = NULL;
|
pcre_uchar *brazeroptr = NULL;
|
||||||
|
|
||||||
@ -5924,7 +5985,7 @@ for (;; ptr++)
|
|||||||
if (repeat_max <= 1) /* Covers 0, 1, and unlimited */
|
if (repeat_max <= 1) /* Covers 0, 1, and unlimited */
|
||||||
{
|
{
|
||||||
*code = OP_END;
|
*code = OP_END;
|
||||||
adjust_recurse(previous, 1, utf, cd, save_hwm);
|
adjust_recurse(previous, 1, utf, cd, save_hwm_offset);
|
||||||
memmove(previous + 1, previous, IN_UCHARS(len));
|
memmove(previous + 1, previous, IN_UCHARS(len));
|
||||||
code++;
|
code++;
|
||||||
if (repeat_max == 0)
|
if (repeat_max == 0)
|
||||||
@ -5948,7 +6009,7 @@ for (;; ptr++)
|
|||||||
{
|
{
|
||||||
int offset;
|
int offset;
|
||||||
*code = OP_END;
|
*code = OP_END;
|
||||||
adjust_recurse(previous, 2 + LINK_SIZE, utf, cd, save_hwm);
|
adjust_recurse(previous, 2 + LINK_SIZE, utf, cd, save_hwm_offset);
|
||||||
memmove(previous + 2 + LINK_SIZE, previous, IN_UCHARS(len));
|
memmove(previous + 2 + LINK_SIZE, previous, IN_UCHARS(len));
|
||||||
code += 2 + LINK_SIZE;
|
code += 2 + LINK_SIZE;
|
||||||
*previous++ = OP_BRAZERO + repeat_type;
|
*previous++ = OP_BRAZERO + repeat_type;
|
||||||
@ -6011,26 +6072,25 @@ for (;; ptr++)
|
|||||||
for (i = 1; i < repeat_min; i++)
|
for (i = 1; i < repeat_min; i++)
|
||||||
{
|
{
|
||||||
pcre_uchar *hc;
|
pcre_uchar *hc;
|
||||||
pcre_uchar *this_hwm = cd->hwm;
|
size_t this_hwm_offset = cd->hwm - cd->start_workspace;
|
||||||
memcpy(code, previous, IN_UCHARS(len));
|
memcpy(code, previous, IN_UCHARS(len));
|
||||||
|
|
||||||
while (cd->hwm > cd->start_workspace + cd->workspace_size -
|
while (cd->hwm > cd->start_workspace + cd->workspace_size -
|
||||||
WORK_SIZE_SAFETY_MARGIN - (this_hwm - save_hwm))
|
WORK_SIZE_SAFETY_MARGIN -
|
||||||
|
(this_hwm_offset - base_hwm_offset))
|
||||||
{
|
{
|
||||||
size_t save_offset = save_hwm - cd->start_workspace;
|
|
||||||
size_t this_offset = this_hwm - cd->start_workspace;
|
|
||||||
*errorcodeptr = expand_workspace(cd);
|
*errorcodeptr = expand_workspace(cd);
|
||||||
if (*errorcodeptr != 0) goto FAILED;
|
if (*errorcodeptr != 0) goto FAILED;
|
||||||
save_hwm = (pcre_uchar *)cd->start_workspace + save_offset;
|
|
||||||
this_hwm = (pcre_uchar *)cd->start_workspace + this_offset;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (hc = save_hwm; hc < this_hwm; hc += LINK_SIZE)
|
for (hc = (pcre_uchar *)cd->start_workspace + base_hwm_offset;
|
||||||
|
hc < (pcre_uchar *)cd->start_workspace + this_hwm_offset;
|
||||||
|
hc += LINK_SIZE)
|
||||||
{
|
{
|
||||||
PUT(cd->hwm, 0, GET(hc, 0) + len);
|
PUT(cd->hwm, 0, GET(hc, 0) + len);
|
||||||
cd->hwm += LINK_SIZE;
|
cd->hwm += LINK_SIZE;
|
||||||
}
|
}
|
||||||
save_hwm = this_hwm;
|
base_hwm_offset = this_hwm_offset;
|
||||||
code += len;
|
code += len;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -6075,7 +6135,7 @@ for (;; ptr++)
|
|||||||
else for (i = repeat_max - 1; i >= 0; i--)
|
else for (i = repeat_max - 1; i >= 0; i--)
|
||||||
{
|
{
|
||||||
pcre_uchar *hc;
|
pcre_uchar *hc;
|
||||||
pcre_uchar *this_hwm = cd->hwm;
|
size_t this_hwm_offset = cd->hwm - cd->start_workspace;
|
||||||
|
|
||||||
*code++ = OP_BRAZERO + repeat_type;
|
*code++ = OP_BRAZERO + repeat_type;
|
||||||
|
|
||||||
@ -6097,22 +6157,21 @@ for (;; ptr++)
|
|||||||
copying them. */
|
copying them. */
|
||||||
|
|
||||||
while (cd->hwm > cd->start_workspace + cd->workspace_size -
|
while (cd->hwm > cd->start_workspace + cd->workspace_size -
|
||||||
WORK_SIZE_SAFETY_MARGIN - (this_hwm - save_hwm))
|
WORK_SIZE_SAFETY_MARGIN -
|
||||||
|
(this_hwm_offset - base_hwm_offset))
|
||||||
{
|
{
|
||||||
size_t save_offset = save_hwm - cd->start_workspace;
|
|
||||||
size_t this_offset = this_hwm - cd->start_workspace;
|
|
||||||
*errorcodeptr = expand_workspace(cd);
|
*errorcodeptr = expand_workspace(cd);
|
||||||
if (*errorcodeptr != 0) goto FAILED;
|
if (*errorcodeptr != 0) goto FAILED;
|
||||||
save_hwm = (pcre_uchar *)cd->start_workspace + save_offset;
|
|
||||||
this_hwm = (pcre_uchar *)cd->start_workspace + this_offset;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (hc = save_hwm; hc < this_hwm; hc += LINK_SIZE)
|
for (hc = (pcre_uchar *)cd->start_workspace + base_hwm_offset;
|
||||||
|
hc < (pcre_uchar *)cd->start_workspace + this_hwm_offset;
|
||||||
|
hc += LINK_SIZE)
|
||||||
{
|
{
|
||||||
PUT(cd->hwm, 0, GET(hc, 0) + len + ((i != 0)? 2+LINK_SIZE : 1));
|
PUT(cd->hwm, 0, GET(hc, 0) + len + ((i != 0)? 2+LINK_SIZE : 1));
|
||||||
cd->hwm += LINK_SIZE;
|
cd->hwm += LINK_SIZE;
|
||||||
}
|
}
|
||||||
save_hwm = this_hwm;
|
base_hwm_offset = this_hwm_offset;
|
||||||
code += len;
|
code += len;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6208,7 +6267,7 @@ for (;; ptr++)
|
|||||||
{
|
{
|
||||||
int nlen = (int)(code - bracode);
|
int nlen = (int)(code - bracode);
|
||||||
*code = OP_END;
|
*code = OP_END;
|
||||||
adjust_recurse(bracode, 1 + LINK_SIZE, utf, cd, save_hwm);
|
adjust_recurse(bracode, 1 + LINK_SIZE, utf, cd, save_hwm_offset);
|
||||||
memmove(bracode + 1 + LINK_SIZE, bracode, IN_UCHARS(nlen));
|
memmove(bracode + 1 + LINK_SIZE, bracode, IN_UCHARS(nlen));
|
||||||
code += 1 + LINK_SIZE;
|
code += 1 + LINK_SIZE;
|
||||||
nlen += 1 + LINK_SIZE;
|
nlen += 1 + LINK_SIZE;
|
||||||
@ -6342,7 +6401,7 @@ for (;; ptr++)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
*code = OP_END;
|
*code = OP_END;
|
||||||
adjust_recurse(tempcode, 1 + LINK_SIZE, utf, cd, save_hwm);
|
adjust_recurse(tempcode, 1 + LINK_SIZE, utf, cd, save_hwm_offset);
|
||||||
memmove(tempcode + 1 + LINK_SIZE, tempcode, IN_UCHARS(len));
|
memmove(tempcode + 1 + LINK_SIZE, tempcode, IN_UCHARS(len));
|
||||||
code += 1 + LINK_SIZE;
|
code += 1 + LINK_SIZE;
|
||||||
len += 1 + LINK_SIZE;
|
len += 1 + LINK_SIZE;
|
||||||
@ -6391,7 +6450,7 @@ for (;; ptr++)
|
|||||||
|
|
||||||
default:
|
default:
|
||||||
*code = OP_END;
|
*code = OP_END;
|
||||||
adjust_recurse(tempcode, 1 + LINK_SIZE, utf, cd, save_hwm);
|
adjust_recurse(tempcode, 1 + LINK_SIZE, utf, cd, save_hwm_offset);
|
||||||
memmove(tempcode + 1 + LINK_SIZE, tempcode, IN_UCHARS(len));
|
memmove(tempcode + 1 + LINK_SIZE, tempcode, IN_UCHARS(len));
|
||||||
code += 1 + LINK_SIZE;
|
code += 1 + LINK_SIZE;
|
||||||
len += 1 + LINK_SIZE;
|
len += 1 + LINK_SIZE;
|
||||||
@ -6420,15 +6479,25 @@ for (;; ptr++)
|
|||||||
parenthesis forms. */
|
parenthesis forms. */
|
||||||
|
|
||||||
case CHAR_LEFT_PARENTHESIS:
|
case CHAR_LEFT_PARENTHESIS:
|
||||||
newoptions = options;
|
|
||||||
skipbytes = 0;
|
|
||||||
bravalue = OP_CBRA;
|
|
||||||
save_hwm = cd->hwm;
|
|
||||||
reset_bracount = FALSE;
|
|
||||||
|
|
||||||
/* First deal with various "verbs" that can be introduced by '*'. */
|
|
||||||
|
|
||||||
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 '*'. */
|
||||||
|
|
||||||
if (ptr[0] == CHAR_ASTERISK && (ptr[1] == ':'
|
if (ptr[0] == CHAR_ASTERISK && (ptr[1] == ':'
|
||||||
|| (MAX_255(ptr[1]) && ((cd->ctypes[ptr[1]] & ctype_letter) != 0))))
|
|| (MAX_255(ptr[1]) && ((cd->ctypes[ptr[1]] & ctype_letter) != 0))))
|
||||||
{
|
{
|
||||||
@ -6549,10 +6618,18 @@ for (;; ptr++)
|
|||||||
goto FAILED;
|
goto FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Initialize for "real" parentheses */
|
||||||
|
|
||||||
|
newoptions = options;
|
||||||
|
skipbytes = 0;
|
||||||
|
bravalue = OP_CBRA;
|
||||||
|
save_hwm_offset = cd->hwm - cd->start_workspace;
|
||||||
|
reset_bracount = FALSE;
|
||||||
|
|
||||||
/* Deal with the extended parentheses; all are introduced by '?', and the
|
/* Deal with the extended parentheses; all are introduced by '?', and the
|
||||||
appearance of any of them means that this is not a capturing group. */
|
appearance of any of them means that this is not a capturing group. */
|
||||||
|
|
||||||
else if (*ptr == CHAR_QUESTION_MARK)
|
if (*ptr == CHAR_QUESTION_MARK)
|
||||||
{
|
{
|
||||||
int i, set, unset, namelen;
|
int i, set, unset, namelen;
|
||||||
int *optset;
|
int *optset;
|
||||||
@ -6561,17 +6638,6 @@ for (;; ptr++)
|
|||||||
|
|
||||||
switch (*(++ptr))
|
switch (*(++ptr))
|
||||||
{
|
{
|
||||||
case CHAR_NUMBER_SIGN: /* Comment; skip to ket */
|
|
||||||
ptr++;
|
|
||||||
while (*ptr != CHAR_NULL && *ptr != CHAR_RIGHT_PARENTHESIS) ptr++;
|
|
||||||
if (*ptr == CHAR_NULL)
|
|
||||||
{
|
|
||||||
*errorcodeptr = ERR18;
|
|
||||||
goto FAILED;
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------ */
|
/* ------------------------------------------------------------ */
|
||||||
case CHAR_VERTICAL_LINE: /* Reset capture count for each branch */
|
case CHAR_VERTICAL_LINE: /* Reset capture count for each branch */
|
||||||
reset_bracount = TRUE;
|
reset_bracount = TRUE;
|
||||||
@ -6620,8 +6686,13 @@ for (;; ptr++)
|
|||||||
if (tempptr[1] == CHAR_QUESTION_MARK &&
|
if (tempptr[1] == CHAR_QUESTION_MARK &&
|
||||||
(tempptr[2] == CHAR_EQUALS_SIGN ||
|
(tempptr[2] == CHAR_EQUALS_SIGN ||
|
||||||
tempptr[2] == CHAR_EXCLAMATION_MARK ||
|
tempptr[2] == CHAR_EXCLAMATION_MARK ||
|
||||||
tempptr[2] == CHAR_LESS_THAN_SIGN))
|
(tempptr[2] == CHAR_LESS_THAN_SIGN &&
|
||||||
|
(tempptr[3] == CHAR_EQUALS_SIGN ||
|
||||||
|
tempptr[3] == CHAR_EXCLAMATION_MARK))))
|
||||||
|
{
|
||||||
|
cd->iscondassert = TRUE;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
/* Other conditions use OP_CREF/OP_DNCREF/OP_RREF/OP_DNRREF, and all
|
/* Other conditions use OP_CREF/OP_DNCREF/OP_RREF/OP_DNRREF, and all
|
||||||
need to skip at least 1+IMM2_SIZE bytes at the start of the group. */
|
need to skip at least 1+IMM2_SIZE bytes at the start of the group. */
|
||||||
@ -6698,8 +6769,7 @@ for (;; ptr++)
|
|||||||
ptr++;
|
ptr++;
|
||||||
}
|
}
|
||||||
namelen = (int)(ptr - name);
|
namelen = (int)(ptr - name);
|
||||||
if (lengthptr != NULL && (options & PCRE_DUPNAMES) != 0)
|
if (lengthptr != NULL) *lengthptr += IMM2_SIZE;
|
||||||
*lengthptr += IMM2_SIZE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check the terminator */
|
/* Check the terminator */
|
||||||
@ -6735,6 +6805,7 @@ for (;; ptr++)
|
|||||||
goto FAILED;
|
goto FAILED;
|
||||||
}
|
}
|
||||||
PUT2(code, 2+LINK_SIZE, recno);
|
PUT2(code, 2+LINK_SIZE, recno);
|
||||||
|
if (recno > cd->top_backref) cd->top_backref = recno;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6757,6 +6828,7 @@ for (;; ptr++)
|
|||||||
int offset = i++;
|
int offset = i++;
|
||||||
int count = 1;
|
int count = 1;
|
||||||
recno = GET2(slot, 0); /* Number from first found */
|
recno = GET2(slot, 0); /* Number from first found */
|
||||||
|
if (recno > cd->top_backref) cd->top_backref = recno;
|
||||||
for (; i < cd->names_found; i++)
|
for (; i < cd->names_found; i++)
|
||||||
{
|
{
|
||||||
slot += cd->name_entry_size;
|
slot += cd->name_entry_size;
|
||||||
@ -7114,11 +7186,11 @@ for (;; ptr++)
|
|||||||
|
|
||||||
if (!is_recurse) cd->namedrefcount++;
|
if (!is_recurse) cd->namedrefcount++;
|
||||||
|
|
||||||
/* If duplicate names are permitted, we have to allow for a named
|
/* We have to allow for a named reference to a duplicated name (this
|
||||||
reference to a duplicated name (this cannot be determined until the
|
cannot be determined until the second pass). This needs an extra
|
||||||
second pass). This needs an extra 16-bit data item. */
|
16-bit data item. */
|
||||||
|
|
||||||
if ((options & PCRE_DUPNAMES) != 0) *lengthptr += IMM2_SIZE;
|
*lengthptr += IMM2_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* In the real compile, search the name table. We check the name
|
/* In the real compile, search the name table. We check the name
|
||||||
@ -7475,12 +7547,22 @@ for (;; ptr++)
|
|||||||
goto FAILED;
|
goto FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Assertions used not to be repeatable, but this was changed for Perl
|
/* All assertions used not to be repeatable, but this was changed for Perl
|
||||||
compatibility, so all kinds can now be repeated. We copy code into a
|
compatibility. All kinds can now be repeated except for assertions that are
|
||||||
|
conditions (Perl also forbids these to be repeated). We copy code into a
|
||||||
non-register variable (tempcode) in order to be able to pass its address
|
non-register variable (tempcode) in order to be able to pass its address
|
||||||
because some compilers complain otherwise. */
|
because some compilers complain otherwise. At the start of a conditional
|
||||||
|
group whose condition is an assertion, cd->iscondassert is set. We unset it
|
||||||
|
here so as to allow assertions later in the group to be quantified. */
|
||||||
|
|
||||||
|
if (bravalue >= OP_ASSERT && bravalue <= OP_ASSERTBACK_NOT &&
|
||||||
|
cd->iscondassert)
|
||||||
|
{
|
||||||
|
previous = NULL;
|
||||||
|
cd->iscondassert = FALSE;
|
||||||
|
}
|
||||||
|
else previous = code;
|
||||||
|
|
||||||
previous = code; /* For handling repetition */
|
|
||||||
*code = bravalue;
|
*code = bravalue;
|
||||||
tempcode = code;
|
tempcode = code;
|
||||||
tempreqvary = cd->req_varyopt; /* Save value before bracket */
|
tempreqvary = cd->req_varyopt; /* Save value before bracket */
|
||||||
@ -7727,7 +7809,7 @@ for (;; ptr++)
|
|||||||
const pcre_uchar *p;
|
const pcre_uchar *p;
|
||||||
pcre_uint32 cf;
|
pcre_uint32 cf;
|
||||||
|
|
||||||
save_hwm = cd->hwm; /* Normally this is set when '(' is read */
|
save_hwm_offset = cd->hwm - cd->start_workspace; /* Normally this is set when '(' is read */
|
||||||
terminator = (*(++ptr) == CHAR_LESS_THAN_SIGN)?
|
terminator = (*(++ptr) == CHAR_LESS_THAN_SIGN)?
|
||||||
CHAR_GREATER_THAN_SIGN : CHAR_APOSTROPHE;
|
CHAR_GREATER_THAN_SIGN : CHAR_APOSTROPHE;
|
||||||
|
|
||||||
@ -8054,6 +8136,7 @@ int length;
|
|||||||
unsigned int orig_bracount;
|
unsigned int orig_bracount;
|
||||||
unsigned int max_bracount;
|
unsigned int max_bracount;
|
||||||
branch_chain bc;
|
branch_chain bc;
|
||||||
|
size_t save_hwm_offset;
|
||||||
|
|
||||||
/* If set, call the external function that checks for stack availability. */
|
/* If set, call the external function that checks for stack availability. */
|
||||||
|
|
||||||
@ -8071,6 +8154,8 @@ bc.current_branch = code;
|
|||||||
firstchar = reqchar = 0;
|
firstchar = reqchar = 0;
|
||||||
firstcharflags = reqcharflags = REQ_UNSET;
|
firstcharflags = reqcharflags = REQ_UNSET;
|
||||||
|
|
||||||
|
save_hwm_offset = cd->hwm - cd->start_workspace;
|
||||||
|
|
||||||
/* Accumulate the length for use in the pre-compile phase. Start with the
|
/* Accumulate the length for use in the pre-compile phase. Start with the
|
||||||
length of the BRA and KET and any extra bytes that are required at the
|
length of the BRA and KET and any extra bytes that are required at the
|
||||||
beginning. We accumulate in a local variable to save frequent testing of
|
beginning. We accumulate in a local variable to save frequent testing of
|
||||||
@ -8212,7 +8297,7 @@ for (;;)
|
|||||||
int fixed_length;
|
int fixed_length;
|
||||||
*code = OP_END;
|
*code = OP_END;
|
||||||
fixed_length = find_fixedlength(last_branch, (options & PCRE_UTF8) != 0,
|
fixed_length = find_fixedlength(last_branch, (options & PCRE_UTF8) != 0,
|
||||||
FALSE, cd);
|
FALSE, cd, NULL);
|
||||||
DPRINTF(("fixed length = %d\n", fixed_length));
|
DPRINTF(("fixed length = %d\n", fixed_length));
|
||||||
if (fixed_length == -3)
|
if (fixed_length == -3)
|
||||||
{
|
{
|
||||||
@ -8273,7 +8358,7 @@ for (;;)
|
|||||||
{
|
{
|
||||||
*code = OP_END;
|
*code = OP_END;
|
||||||
adjust_recurse(start_bracket, 1 + LINK_SIZE,
|
adjust_recurse(start_bracket, 1 + LINK_SIZE,
|
||||||
(options & PCRE_UTF8) != 0, cd, cd->hwm);
|
(options & PCRE_UTF8) != 0, cd, save_hwm_offset);
|
||||||
memmove(start_bracket + 1 + LINK_SIZE, start_bracket,
|
memmove(start_bracket + 1 + LINK_SIZE, start_bracket,
|
||||||
IN_UCHARS(code - start_bracket));
|
IN_UCHARS(code - start_bracket));
|
||||||
*start_bracket = OP_ONCE;
|
*start_bracket = OP_ONCE;
|
||||||
@ -8497,6 +8582,7 @@ do {
|
|||||||
case OP_RREF:
|
case OP_RREF:
|
||||||
case OP_DNRREF:
|
case OP_DNRREF:
|
||||||
case OP_DEF:
|
case OP_DEF:
|
||||||
|
case OP_FAIL:
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
default: /* Assertion */
|
default: /* Assertion */
|
||||||
@ -9081,6 +9167,7 @@ cd->dupnames = FALSE;
|
|||||||
cd->namedrefcount = 0;
|
cd->namedrefcount = 0;
|
||||||
cd->start_code = cworkspace;
|
cd->start_code = cworkspace;
|
||||||
cd->hwm = cworkspace;
|
cd->hwm = cworkspace;
|
||||||
|
cd->iscondassert = FALSE;
|
||||||
cd->start_workspace = cworkspace;
|
cd->start_workspace = cworkspace;
|
||||||
cd->workspace_size = COMPILE_WORK_SIZE;
|
cd->workspace_size = COMPILE_WORK_SIZE;
|
||||||
cd->named_groups = named_groups;
|
cd->named_groups = named_groups;
|
||||||
@ -9118,13 +9205,6 @@ if (length > MAX_PATTERN_SIZE)
|
|||||||
goto PCRE_EARLY_ERROR_RETURN;
|
goto PCRE_EARLY_ERROR_RETURN;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If there are groups with duplicate names and there are also references by
|
|
||||||
name, we must allow for the possibility of named references to duplicated
|
|
||||||
groups. These require an extra data item each. */
|
|
||||||
|
|
||||||
if (cd->dupnames && cd->namedrefcount > 0)
|
|
||||||
length += cd->namedrefcount * IMM2_SIZE * sizeof(pcre_uchar);
|
|
||||||
|
|
||||||
/* Compute the size of the data block for storing the compiled pattern. Integer
|
/* Compute the size of the data block for storing the compiled pattern. Integer
|
||||||
overflow should no longer be possible because nowadays we limit the maximum
|
overflow should no longer be possible because nowadays we limit the maximum
|
||||||
value of cd->names_found and cd->name_entry_size. */
|
value of cd->names_found and cd->name_entry_size. */
|
||||||
@ -9183,6 +9263,7 @@ cd->name_table = (pcre_uchar *)re + re->name_table_offset;
|
|||||||
codestart = cd->name_table + re->name_entry_size * re->name_count;
|
codestart = cd->name_table + re->name_entry_size * re->name_count;
|
||||||
cd->start_code = codestart;
|
cd->start_code = codestart;
|
||||||
cd->hwm = (pcre_uchar *)(cd->start_workspace);
|
cd->hwm = (pcre_uchar *)(cd->start_workspace);
|
||||||
|
cd->iscondassert = FALSE;
|
||||||
cd->req_varyopt = 0;
|
cd->req_varyopt = 0;
|
||||||
cd->had_accept = FALSE;
|
cd->had_accept = FALSE;
|
||||||
cd->had_pruneorskip = FALSE;
|
cd->had_pruneorskip = FALSE;
|
||||||
@ -9319,7 +9400,7 @@ if (cd->check_lookbehind)
|
|||||||
int end_op = *be;
|
int end_op = *be;
|
||||||
*be = OP_END;
|
*be = OP_END;
|
||||||
fixed_length = find_fixedlength(cc, (re->options & PCRE_UTF8) != 0, TRUE,
|
fixed_length = find_fixedlength(cc, (re->options & PCRE_UTF8) != 0, TRUE,
|
||||||
cd);
|
cd, NULL);
|
||||||
*be = end_op;
|
*be = end_op;
|
||||||
DPRINTF(("fixed length = %d\n", fixed_length));
|
DPRINTF(("fixed length = %d\n", fixed_length));
|
||||||
if (fixed_length < 0)
|
if (fixed_length < 0)
|
||||||
|
@ -2736,9 +2736,10 @@ for (;;)
|
|||||||
condcode == OP_DNRREF)
|
condcode == OP_DNRREF)
|
||||||
return PCRE_ERROR_DFA_UCOND;
|
return PCRE_ERROR_DFA_UCOND;
|
||||||
|
|
||||||
/* The DEFINE condition is always false */
|
/* The DEFINE condition is always false, and the assertion (?!) is
|
||||||
|
converted to OP_FAIL. */
|
||||||
|
|
||||||
if (condcode == OP_DEF)
|
if (condcode == OP_DEF || condcode == OP_FAIL)
|
||||||
{ ADD_ACTIVE(state_offset + codelink + LINK_SIZE + 1, 0); }
|
{ ADD_ACTIVE(state_offset + codelink + LINK_SIZE + 1, 0); }
|
||||||
|
|
||||||
/* The only supported version of OP_RREF is for the value RREF_ANY,
|
/* The only supported version of OP_RREF is for the value RREF_ANY,
|
||||||
|
@ -1136,8 +1136,8 @@ for (;;)
|
|||||||
printf("\n");
|
printf("\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (offset < md->offset_max)
|
if (offset >= md->offset_max) goto POSSESSIVE_NON_CAPTURE;
|
||||||
{
|
|
||||||
matched_once = FALSE;
|
matched_once = FALSE;
|
||||||
code_offset = (int)(ecode - md->start_code);
|
code_offset = (int)(ecode - md->start_code);
|
||||||
|
|
||||||
@ -1211,18 +1211,6 @@ for (;;)
|
|||||||
}
|
}
|
||||||
|
|
||||||
RRETURN(MATCH_NOMATCH);
|
RRETURN(MATCH_NOMATCH);
|
||||||
}
|
|
||||||
|
|
||||||
/* FALL THROUGH ... Insufficient room for saving captured contents. Treat
|
|
||||||
as a non-capturing bracket. */
|
|
||||||
|
|
||||||
/* VVVVVVVVVVVVVVVVVVVVVVVVV */
|
|
||||||
/* VVVVVVVVVVVVVVVVVVVVVVVVV */
|
|
||||||
|
|
||||||
DPRINTF(("insufficient capture room: treat as non-capturing\n"));
|
|
||||||
|
|
||||||
/* VVVVVVVVVVVVVVVVVVVVVVVVV */
|
|
||||||
/* VVVVVVVVVVVVVVVVVVVVVVVVV */
|
|
||||||
|
|
||||||
/* Non-capturing possessive bracket with unlimited repeat. We come here
|
/* Non-capturing possessive bracket with unlimited repeat. We come here
|
||||||
from BRAZERO with allow_zero = TRUE. The code is similar to the above,
|
from BRAZERO with allow_zero = TRUE. The code is similar to the above,
|
||||||
@ -1388,6 +1376,7 @@ for (;;)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case OP_DEF: /* DEFINE - always false */
|
case OP_DEF: /* DEFINE - always false */
|
||||||
|
case OP_FAIL: /* From optimized (?!) condition */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* The condition is an assertion. Call match() to evaluate it - setting
|
/* The condition is an assertion. Call match() to evaluate it - setting
|
||||||
@ -1404,8 +1393,11 @@ for (;;)
|
|||||||
condition = TRUE;
|
condition = TRUE;
|
||||||
|
|
||||||
/* Advance ecode past the assertion to the start of the first branch,
|
/* Advance ecode past the assertion to the start of the first branch,
|
||||||
but adjust it so that the general choosing code below works. */
|
but adjust it so that the general choosing code below works. If the
|
||||||
|
assertion has a quantifier that allows zero repeats we must skip over
|
||||||
|
the BRAZERO. This is a lunatic thing to do, but somebody did! */
|
||||||
|
|
||||||
|
if (*ecode == OP_BRAZERO) ecode++;
|
||||||
ecode += GET(ecode, 1);
|
ecode += GET(ecode, 1);
|
||||||
while (*ecode == OP_ALT) ecode += GET(ecode, 1);
|
while (*ecode == OP_ALT) ecode += GET(ecode, 1);
|
||||||
ecode += 1 + LINK_SIZE - PRIV(OP_lengths)[condcode];
|
ecode += 1 + LINK_SIZE - PRIV(OP_lengths)[condcode];
|
||||||
@ -1474,7 +1466,18 @@ for (;;)
|
|||||||
md->offset_vector[offset] =
|
md->offset_vector[offset] =
|
||||||
md->offset_vector[md->offset_end - number];
|
md->offset_vector[md->offset_end - number];
|
||||||
md->offset_vector[offset+1] = (int)(eptr - md->start_subject);
|
md->offset_vector[offset+1] = (int)(eptr - md->start_subject);
|
||||||
if (offset_top <= offset) offset_top = offset + 2;
|
|
||||||
|
/* If this group is at or above the current highwater mark, ensure that
|
||||||
|
any groups between the current high water mark and this group are marked
|
||||||
|
unset and then update the high water mark. */
|
||||||
|
|
||||||
|
if (offset >= offset_top)
|
||||||
|
{
|
||||||
|
register int *iptr = md->offset_vector + offset_top;
|
||||||
|
register int *iend = md->offset_vector + offset;
|
||||||
|
while (iptr < iend) *iptr++ = -1;
|
||||||
|
offset_top = offset + 2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ecode += 1 + IMM2_SIZE;
|
ecode += 1 + IMM2_SIZE;
|
||||||
break;
|
break;
|
||||||
@ -1826,7 +1829,11 @@ for (;;)
|
|||||||
are defined in a range that can be tested for. */
|
are defined in a range that can be tested for. */
|
||||||
|
|
||||||
if (rrc >= MATCH_BACKTRACK_MIN && rrc <= MATCH_BACKTRACK_MAX)
|
if (rrc >= MATCH_BACKTRACK_MIN && rrc <= MATCH_BACKTRACK_MAX)
|
||||||
|
{
|
||||||
|
if (new_recursive.offset_save != stacksave)
|
||||||
|
(PUBL(free))(new_recursive.offset_save);
|
||||||
RRETURN(MATCH_NOMATCH);
|
RRETURN(MATCH_NOMATCH);
|
||||||
|
}
|
||||||
|
|
||||||
/* Any return code other than NOMATCH is an error. */
|
/* Any return code other than NOMATCH is an error. */
|
||||||
|
|
||||||
@ -3476,7 +3483,7 @@ for (;;)
|
|||||||
if (possessive) continue; /* No backtracking */
|
if (possessive) continue; /* No backtracking */
|
||||||
for(;;)
|
for(;;)
|
||||||
{
|
{
|
||||||
if (eptr == pp) goto TAIL_RECURSE;
|
if (eptr <= pp) goto TAIL_RECURSE;
|
||||||
RMATCH(eptr, ecode, offset_top, md, eptrb, RM23);
|
RMATCH(eptr, ecode, offset_top, md, eptrb, RM23);
|
||||||
if (rrc != MATCH_NOMATCH) RRETURN(rrc);
|
if (rrc != MATCH_NOMATCH) RRETURN(rrc);
|
||||||
#ifdef SUPPORT_UCP
|
#ifdef SUPPORT_UCP
|
||||||
@ -3897,7 +3904,7 @@ for (;;)
|
|||||||
if (possessive) continue; /* No backtracking */
|
if (possessive) continue; /* No backtracking */
|
||||||
for(;;)
|
for(;;)
|
||||||
{
|
{
|
||||||
if (eptr == pp) goto TAIL_RECURSE;
|
if (eptr <= pp) goto TAIL_RECURSE;
|
||||||
RMATCH(eptr, ecode, offset_top, md, eptrb, RM30);
|
RMATCH(eptr, ecode, offset_top, md, eptrb, RM30);
|
||||||
if (rrc != MATCH_NOMATCH) RRETURN(rrc);
|
if (rrc != MATCH_NOMATCH) RRETURN(rrc);
|
||||||
eptr--;
|
eptr--;
|
||||||
@ -4032,7 +4039,7 @@ for (;;)
|
|||||||
if (possessive) continue; /* No backtracking */
|
if (possessive) continue; /* No backtracking */
|
||||||
for(;;)
|
for(;;)
|
||||||
{
|
{
|
||||||
if (eptr == pp) goto TAIL_RECURSE;
|
if (eptr <= pp) goto TAIL_RECURSE;
|
||||||
RMATCH(eptr, ecode, offset_top, md, eptrb, RM34);
|
RMATCH(eptr, ecode, offset_top, md, eptrb, RM34);
|
||||||
if (rrc != MATCH_NOMATCH) RRETURN(rrc);
|
if (rrc != MATCH_NOMATCH) RRETURN(rrc);
|
||||||
eptr--;
|
eptr--;
|
||||||
@ -5603,7 +5610,7 @@ for (;;)
|
|||||||
if (possessive) continue; /* No backtracking */
|
if (possessive) continue; /* No backtracking */
|
||||||
for(;;)
|
for(;;)
|
||||||
{
|
{
|
||||||
if (eptr == pp) goto TAIL_RECURSE;
|
if (eptr <= pp) goto TAIL_RECURSE;
|
||||||
RMATCH(eptr, ecode, offset_top, md, eptrb, RM44);
|
RMATCH(eptr, ecode, offset_top, md, eptrb, RM44);
|
||||||
if (rrc != MATCH_NOMATCH) RRETURN(rrc);
|
if (rrc != MATCH_NOMATCH) RRETURN(rrc);
|
||||||
eptr--;
|
eptr--;
|
||||||
@ -5645,12 +5652,17 @@ for (;;)
|
|||||||
|
|
||||||
if (possessive) continue; /* No backtracking */
|
if (possessive) continue; /* No backtracking */
|
||||||
|
|
||||||
|
/* We use <= pp rather than == pp to detect the start of the run while
|
||||||
|
backtracking because the use of \C in UTF mode can cause BACKCHAR to
|
||||||
|
move back past pp. This is just palliative; the use of \C in UTF mode
|
||||||
|
is fraught with danger. */
|
||||||
|
|
||||||
for(;;)
|
for(;;)
|
||||||
{
|
{
|
||||||
int lgb, rgb;
|
int lgb, rgb;
|
||||||
PCRE_PUCHAR fptr;
|
PCRE_PUCHAR fptr;
|
||||||
|
|
||||||
if (eptr == pp) goto TAIL_RECURSE; /* At start of char run */
|
if (eptr <= pp) goto TAIL_RECURSE; /* At start of char run */
|
||||||
RMATCH(eptr, ecode, offset_top, md, eptrb, RM45);
|
RMATCH(eptr, ecode, offset_top, md, eptrb, RM45);
|
||||||
if (rrc != MATCH_NOMATCH) RRETURN(rrc);
|
if (rrc != MATCH_NOMATCH) RRETURN(rrc);
|
||||||
|
|
||||||
@ -5668,7 +5680,7 @@ for (;;)
|
|||||||
|
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
if (eptr == pp) goto TAIL_RECURSE; /* At start of char run */
|
if (eptr <= pp) goto TAIL_RECURSE; /* At start of char run */
|
||||||
fptr = eptr - 1;
|
fptr = eptr - 1;
|
||||||
if (!utf) c = *fptr; else
|
if (!utf) c = *fptr; else
|
||||||
{
|
{
|
||||||
@ -5918,7 +5930,7 @@ for (;;)
|
|||||||
if (possessive) continue; /* No backtracking */
|
if (possessive) continue; /* No backtracking */
|
||||||
for(;;)
|
for(;;)
|
||||||
{
|
{
|
||||||
if (eptr == pp) goto TAIL_RECURSE;
|
if (eptr <= pp) goto TAIL_RECURSE;
|
||||||
RMATCH(eptr, ecode, offset_top, md, eptrb, RM46);
|
RMATCH(eptr, ecode, offset_top, md, eptrb, RM46);
|
||||||
if (rrc != MATCH_NOMATCH) RRETURN(rrc);
|
if (rrc != MATCH_NOMATCH) RRETURN(rrc);
|
||||||
eptr--;
|
eptr--;
|
||||||
|
@ -2446,6 +2446,7 @@ typedef struct compile_data {
|
|||||||
BOOL had_pruneorskip; /* (*PRUNE) or (*SKIP) encountered */
|
BOOL had_pruneorskip; /* (*PRUNE) or (*SKIP) encountered */
|
||||||
BOOL check_lookbehind; /* Lookbehinds need later checking */
|
BOOL check_lookbehind; /* Lookbehinds need later checking */
|
||||||
BOOL dupnames; /* Duplicate names exist */
|
BOOL dupnames; /* Duplicate names exist */
|
||||||
|
BOOL iscondassert; /* Next assert is a condition */
|
||||||
int nltype; /* Newline type */
|
int nltype; /* Newline type */
|
||||||
int nllen; /* Newline string length */
|
int nllen; /* Newline string length */
|
||||||
pcre_uchar nl[4]; /* Newline string when fixed length */
|
pcre_uchar nl[4]; /* Newline string when fixed length */
|
||||||
@ -2459,6 +2460,13 @@ typedef struct branch_chain {
|
|||||||
pcre_uchar *current_branch;
|
pcre_uchar *current_branch;
|
||||||
} branch_chain;
|
} branch_chain;
|
||||||
|
|
||||||
|
/* Structure for mutual recursion detection. */
|
||||||
|
|
||||||
|
typedef struct recurse_check {
|
||||||
|
struct recurse_check *prev;
|
||||||
|
const pcre_uchar *group;
|
||||||
|
} recurse_check;
|
||||||
|
|
||||||
/* Structure for items in a linked list that represents an explicit recursive
|
/* Structure for items in a linked list that represents an explicit recursive
|
||||||
call within the pattern; used by pcre_exec(). */
|
call within the pattern; used by pcre_exec(). */
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -51,8 +51,6 @@ POSSIBILITY OF SUCH DAMAGE.
|
|||||||
|
|
||||||
#include "pcre_internal.h"
|
#include "pcre_internal.h"
|
||||||
|
|
||||||
#define PCRE_BUG 0x80000000
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Letter characters:
|
Letter characters:
|
||||||
\xe6\x92\xad = 0x64ad = 25773 (kanji)
|
\xe6\x92\xad = 0x64ad = 25773 (kanji)
|
||||||
@ -69,6 +67,9 @@ POSSIBILITY OF SUCH DAMAGE.
|
|||||||
\xc3\x89 = 0xc9 = 201 (E')
|
\xc3\x89 = 0xc9 = 201 (E')
|
||||||
\xc3\xa1 = 0xe1 = 225 (a')
|
\xc3\xa1 = 0xe1 = 225 (a')
|
||||||
\xc3\x81 = 0xc1 = 193 (A')
|
\xc3\x81 = 0xc1 = 193 (A')
|
||||||
|
\x53 = 0x53 = S
|
||||||
|
\x73 = 0x73 = s
|
||||||
|
\xc5\xbf = 0x17f = 383 (long S)
|
||||||
\xc8\xba = 0x23a = 570
|
\xc8\xba = 0x23a = 570
|
||||||
\xe2\xb1\xa5 = 0x2c65 = 11365
|
\xe2\xb1\xa5 = 0x2c65 = 11365
|
||||||
\xe1\xbd\xb8 = 0x1f78 = 8056
|
\xe1\xbd\xb8 = 0x1f78 = 8056
|
||||||
@ -78,6 +79,10 @@ POSSIBILITY OF SUCH DAMAGE.
|
|||||||
\xc7\x84 = 0x1c4 = 452
|
\xc7\x84 = 0x1c4 = 452
|
||||||
\xc7\x85 = 0x1c5 = 453
|
\xc7\x85 = 0x1c5 = 453
|
||||||
\xc7\x86 = 0x1c6 = 454
|
\xc7\x86 = 0x1c6 = 454
|
||||||
|
Caseless sets:
|
||||||
|
ucp_Armenian - \x{531}-\x{556} -> \x{561}-\x{586}
|
||||||
|
ucp_Coptic - \x{2c80}-\x{2ce3} -> caseless: XOR 0x1
|
||||||
|
ucp_Latin - \x{ff21}-\x{ff3a} -> \x{ff41]-\x{ff5a}
|
||||||
|
|
||||||
Mark property:
|
Mark property:
|
||||||
\xcc\x8d = 0x30d = 781
|
\xcc\x8d = 0x30d = 781
|
||||||
@ -626,6 +631,9 @@ static struct regression_test_case regression_test_cases[] = {
|
|||||||
{ MUA, 0, "(?P<Name>a)?(?P<Name2>b)?(?(Name)c|d)+?dd", "bcabcacdb bdddd" },
|
{ MUA, 0, "(?P<Name>a)?(?P<Name2>b)?(?(Name)c|d)+?dd", "bcabcacdb bdddd" },
|
||||||
{ MUA, 0, "(?P<Name>a)?(?P<Name2>b)?(?(Name)c|d)+l", "ababccddabdbccd abcccl" },
|
{ MUA, 0, "(?P<Name>a)?(?P<Name2>b)?(?(Name)c|d)+l", "ababccddabdbccd abcccl" },
|
||||||
{ MUA, 0, "((?:a|aa)(?(1)aaa))x", "aax" },
|
{ MUA, 0, "((?:a|aa)(?(1)aaa))x", "aax" },
|
||||||
|
{ MUA, 0, "(?(?!)a|b)", "ab" },
|
||||||
|
{ MUA, 0, "(?(?!)a)", "ab" },
|
||||||
|
{ MUA, 0 | F_NOMATCH, "(?(?!)a|b)", "ac" },
|
||||||
|
|
||||||
/* Set start of match. */
|
/* Set start of match. */
|
||||||
{ MUA, 0, "(?:\\Ka)*aaaab", "aaaaaaaa aaaaaaabb" },
|
{ MUA, 0, "(?:\\Ka)*aaaab", "aaaaaaaa aaaaaaabb" },
|
||||||
@ -944,7 +952,7 @@ static void setstack16(pcre16_extra *extra)
|
|||||||
|
|
||||||
pcre16_assign_jit_stack(extra, callback16, getstack16());
|
pcre16_assign_jit_stack(extra, callback16, getstack16());
|
||||||
}
|
}
|
||||||
#endif /* SUPPORT_PCRE8 */
|
#endif /* SUPPORT_PCRE16 */
|
||||||
|
|
||||||
#ifdef SUPPORT_PCRE32
|
#ifdef SUPPORT_PCRE32
|
||||||
static pcre32_jit_stack *stack32;
|
static pcre32_jit_stack *stack32;
|
||||||
@ -967,7 +975,7 @@ static void setstack32(pcre32_extra *extra)
|
|||||||
|
|
||||||
pcre32_assign_jit_stack(extra, callback32, getstack32());
|
pcre32_assign_jit_stack(extra, callback32, getstack32());
|
||||||
}
|
}
|
||||||
#endif /* SUPPORT_PCRE8 */
|
#endif /* SUPPORT_PCRE32 */
|
||||||
|
|
||||||
#ifdef SUPPORT_PCRE16
|
#ifdef SUPPORT_PCRE16
|
||||||
|
|
||||||
@ -1177,7 +1185,7 @@ static int regression_tests(void)
|
|||||||
#elif defined SUPPORT_PCRE16
|
#elif defined SUPPORT_PCRE16
|
||||||
pcre16_config(PCRE_CONFIG_UTF16, &utf);
|
pcre16_config(PCRE_CONFIG_UTF16, &utf);
|
||||||
pcre16_config(PCRE_CONFIG_UNICODE_PROPERTIES, &ucp);
|
pcre16_config(PCRE_CONFIG_UNICODE_PROPERTIES, &ucp);
|
||||||
#elif defined SUPPORT_PCRE16
|
#elif defined SUPPORT_PCRE32
|
||||||
pcre32_config(PCRE_CONFIG_UTF32, &utf);
|
pcre32_config(PCRE_CONFIG_UTF32, &utf);
|
||||||
pcre32_config(PCRE_CONFIG_UNICODE_PROPERTIES, &ucp);
|
pcre32_config(PCRE_CONFIG_UNICODE_PROPERTIES, &ucp);
|
||||||
#endif
|
#endif
|
||||||
|
@ -70,7 +70,7 @@ Arguments:
|
|||||||
code pointer to start of group (the bracket)
|
code pointer to start of group (the bracket)
|
||||||
startcode pointer to start of the whole pattern's code
|
startcode pointer to start of the whole pattern's code
|
||||||
options the compiling options
|
options the compiling options
|
||||||
int RECURSE depth
|
recurses chain of recurse_check to catch mutual recursion
|
||||||
|
|
||||||
Returns: the minimum length
|
Returns: the minimum length
|
||||||
-1 if \C in UTF-8 mode or (*ACCEPT) was encountered
|
-1 if \C in UTF-8 mode or (*ACCEPT) was encountered
|
||||||
@ -80,12 +80,13 @@ Returns: the minimum length
|
|||||||
|
|
||||||
static int
|
static int
|
||||||
find_minlength(const REAL_PCRE *re, const pcre_uchar *code,
|
find_minlength(const REAL_PCRE *re, const pcre_uchar *code,
|
||||||
const pcre_uchar *startcode, int options, int recurse_depth)
|
const pcre_uchar *startcode, int options, recurse_check *recurses)
|
||||||
{
|
{
|
||||||
int length = -1;
|
int length = -1;
|
||||||
/* PCRE_UTF16 has the same value as PCRE_UTF8. */
|
/* PCRE_UTF16 has the same value as PCRE_UTF8. */
|
||||||
BOOL utf = (options & PCRE_UTF8) != 0;
|
BOOL utf = (options & PCRE_UTF8) != 0;
|
||||||
BOOL had_recurse = FALSE;
|
BOOL had_recurse = FALSE;
|
||||||
|
recurse_check this_recurse;
|
||||||
register int branchlength = 0;
|
register int branchlength = 0;
|
||||||
register pcre_uchar *cc = (pcre_uchar *)code + 1 + LINK_SIZE;
|
register pcre_uchar *cc = (pcre_uchar *)code + 1 + LINK_SIZE;
|
||||||
|
|
||||||
@ -130,7 +131,7 @@ for (;;)
|
|||||||
case OP_SBRAPOS:
|
case OP_SBRAPOS:
|
||||||
case OP_ONCE:
|
case OP_ONCE:
|
||||||
case OP_ONCE_NC:
|
case OP_ONCE_NC:
|
||||||
d = find_minlength(re, cc, startcode, options, recurse_depth);
|
d = find_minlength(re, cc, startcode, options, recurses);
|
||||||
if (d < 0) return d;
|
if (d < 0) return d;
|
||||||
branchlength += d;
|
branchlength += d;
|
||||||
do cc += GET(cc, 1); while (*cc == OP_ALT);
|
do cc += GET(cc, 1); while (*cc == OP_ALT);
|
||||||
@ -393,7 +394,7 @@ for (;;)
|
|||||||
ce = cs = (pcre_uchar *)PRIV(find_bracket)(startcode, utf, GET2(slot, 0));
|
ce = cs = (pcre_uchar *)PRIV(find_bracket)(startcode, utf, GET2(slot, 0));
|
||||||
if (cs == NULL) return -2;
|
if (cs == NULL) return -2;
|
||||||
do ce += GET(ce, 1); while (*ce == OP_ALT);
|
do ce += GET(ce, 1); while (*ce == OP_ALT);
|
||||||
if (cc > cs && cc < ce)
|
if (cc > cs && cc < ce) /* Simple recursion */
|
||||||
{
|
{
|
||||||
d = 0;
|
d = 0;
|
||||||
had_recurse = TRUE;
|
had_recurse = TRUE;
|
||||||
@ -401,9 +402,23 @@ for (;;)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int dd = find_minlength(re, cs, startcode, options, recurse_depth);
|
recurse_check *r = recurses;
|
||||||
|
for (r = recurses; r != NULL; r = r->prev) if (r->group == cs) break;
|
||||||
|
if (r != NULL) /* Mutual recursion */
|
||||||
|
{
|
||||||
|
d = 0;
|
||||||
|
had_recurse = TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int dd;
|
||||||
|
this_recurse.prev = recurses;
|
||||||
|
this_recurse.group = cs;
|
||||||
|
dd = find_minlength(re, cs, startcode, options, &this_recurse);
|
||||||
if (dd < d) d = dd;
|
if (dd < d) d = dd;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
slot += re->name_entry_size;
|
slot += re->name_entry_size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -418,14 +433,26 @@ for (;;)
|
|||||||
ce = cs = (pcre_uchar *)PRIV(find_bracket)(startcode, utf, GET2(cc, 1));
|
ce = cs = (pcre_uchar *)PRIV(find_bracket)(startcode, utf, GET2(cc, 1));
|
||||||
if (cs == NULL) return -2;
|
if (cs == NULL) return -2;
|
||||||
do ce += GET(ce, 1); while (*ce == OP_ALT);
|
do ce += GET(ce, 1); while (*ce == OP_ALT);
|
||||||
if (cc > cs && cc < ce)
|
if (cc > cs && cc < ce) /* Simple recursion */
|
||||||
{
|
{
|
||||||
d = 0;
|
d = 0;
|
||||||
had_recurse = TRUE;
|
had_recurse = TRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
d = find_minlength(re, cs, startcode, options, recurse_depth);
|
recurse_check *r = recurses;
|
||||||
|
for (r = recurses; r != NULL; r = r->prev) if (r->group == cs) break;
|
||||||
|
if (r != NULL) /* Mutual recursion */
|
||||||
|
{
|
||||||
|
d = 0;
|
||||||
|
had_recurse = TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this_recurse.prev = recurses;
|
||||||
|
this_recurse.group = cs;
|
||||||
|
d = find_minlength(re, cs, startcode, options, &this_recurse);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else d = 0;
|
else d = 0;
|
||||||
@ -474,12 +501,21 @@ for (;;)
|
|||||||
case OP_RECURSE:
|
case OP_RECURSE:
|
||||||
cs = ce = (pcre_uchar *)startcode + GET(cc, 1);
|
cs = ce = (pcre_uchar *)startcode + GET(cc, 1);
|
||||||
do ce += GET(ce, 1); while (*ce == OP_ALT);
|
do ce += GET(ce, 1); while (*ce == OP_ALT);
|
||||||
if ((cc > cs && cc < ce) || recurse_depth > 10)
|
if (cc > cs && cc < ce) /* Simple recursion */
|
||||||
had_recurse = TRUE;
|
had_recurse = TRUE;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
recurse_check *r = recurses;
|
||||||
|
for (r = recurses; r != NULL; r = r->prev) if (r->group == cs) break;
|
||||||
|
if (r != NULL) /* Mutual recursion */
|
||||||
|
had_recurse = TRUE;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this_recurse.prev = recurses;
|
||||||
|
this_recurse.group = cs;
|
||||||
branchlength += find_minlength(re, cs, startcode, options,
|
branchlength += find_minlength(re, cs, startcode, options,
|
||||||
recurse_depth + 1);
|
&this_recurse);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
cc += 1 + LINK_SIZE;
|
cc += 1 + LINK_SIZE;
|
||||||
break;
|
break;
|
||||||
@ -1503,7 +1539,7 @@ if ((re->options & PCRE_ANCHORED) == 0 &&
|
|||||||
|
|
||||||
/* Find the minimum length of subject string. */
|
/* Find the minimum length of subject string. */
|
||||||
|
|
||||||
switch(min = find_minlength(re, code, code, re->options, 0))
|
switch(min = find_minlength(re, code, code, re->options, NULL))
|
||||||
{
|
{
|
||||||
case -2: *errorptr = "internal error: missing capturing bracket"; return NULL;
|
case -2: *errorptr = "internal error: missing capturing bracket"; return NULL;
|
||||||
case -3: *errorptr = "internal error: opcode not recognized"; return NULL;
|
case -3: *errorptr = "internal error: opcode not recognized"; return NULL;
|
||||||
|
@ -1582,12 +1582,15 @@ while (ptr < endptr)
|
|||||||
int endlinelength;
|
int endlinelength;
|
||||||
int mrc = 0;
|
int mrc = 0;
|
||||||
int startoffset = 0;
|
int startoffset = 0;
|
||||||
|
int prevoffsets[2];
|
||||||
unsigned int options = 0;
|
unsigned int options = 0;
|
||||||
BOOL match;
|
BOOL match;
|
||||||
char *matchptr = ptr;
|
char *matchptr = ptr;
|
||||||
char *t = ptr;
|
char *t = ptr;
|
||||||
size_t length, linelength;
|
size_t length, linelength;
|
||||||
|
|
||||||
|
prevoffsets[0] = prevoffsets[1] = -1;
|
||||||
|
|
||||||
/* At this point, ptr is at the start of a line. We need to find the length
|
/* At this point, ptr is at the start of a line. We need to find the length
|
||||||
of the subject string to pass to pcre_exec(). In multiline mode, it is the
|
of the subject string to pass to pcre_exec(). In multiline mode, it is the
|
||||||
length remainder of the data in the buffer. Otherwise, it is the length of
|
length remainder of the data in the buffer. Otherwise, it is the length of
|
||||||
@ -1729,6 +1732,20 @@ while (ptr < endptr)
|
|||||||
{
|
{
|
||||||
if (!invert)
|
if (!invert)
|
||||||
{
|
{
|
||||||
|
int oldstartoffset = startoffset;
|
||||||
|
|
||||||
|
/* It is possible, when a lookbehind assertion contains \K, for the
|
||||||
|
same string to be found again. The code below advances startoffset, but
|
||||||
|
until it is past the "bumpalong" offset that gave the match, the same
|
||||||
|
substring will be returned. The PCRE1 library does not return the
|
||||||
|
bumpalong offset, so all we can do is ignore repeated strings. (PCRE2
|
||||||
|
does this better.) */
|
||||||
|
|
||||||
|
if (prevoffsets[0] != offsets[0] || prevoffsets[1] != offsets[1])
|
||||||
|
{
|
||||||
|
prevoffsets[0] = offsets[0];
|
||||||
|
prevoffsets[1] = offsets[1];
|
||||||
|
|
||||||
if (printname != NULL) fprintf(stdout, "%s:", printname);
|
if (printname != NULL) fprintf(stdout, "%s:", printname);
|
||||||
if (number) fprintf(stdout, "%d:", linenumber);
|
if (number) fprintf(stdout, "%d:", linenumber);
|
||||||
|
|
||||||
@ -1771,13 +1788,30 @@ while (ptr < endptr)
|
|||||||
|
|
||||||
if (printed || printname != NULL || number) fprintf(stdout, "\n");
|
if (printed || printname != NULL || number) fprintf(stdout, "\n");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Prepare to repeat to find the next match */
|
/* Prepare to repeat to find the next match. If the patterned contained
|
||||||
|
a lookbehind tht included \K, it is possible that the end of the match
|
||||||
|
might be at or before the actual strting offset we have just used. We
|
||||||
|
need to start one character further on. Unfortunately, for unanchored
|
||||||
|
patterns, the actual start offset can be greater that the one that was
|
||||||
|
set as a result of "bumpalong". PCRE1 does not return the actual start
|
||||||
|
offset, so we have to check against the original start offset. This may
|
||||||
|
lead to duplicates - we we need the fudge above to avoid printing them.
|
||||||
|
(PCRE2 does this better.) */
|
||||||
|
|
||||||
match = FALSE;
|
match = FALSE;
|
||||||
if (line_buffered) fflush(stdout);
|
if (line_buffered) fflush(stdout);
|
||||||
rc = 0; /* Had some success */
|
rc = 0; /* Had some success */
|
||||||
startoffset = offsets[1]; /* Restart after the match */
|
startoffset = offsets[1]; /* Restart after the match */
|
||||||
|
if (startoffset <= oldstartoffset)
|
||||||
|
{
|
||||||
|
if ((size_t)startoffset >= length)
|
||||||
|
goto END_ONE_MATCH; /* We were at the end */
|
||||||
|
startoffset = oldstartoffset + 1;
|
||||||
|
if (utf8)
|
||||||
|
while ((matchptr[startoffset] & 0xc0) == 0x80) startoffset++;
|
||||||
|
}
|
||||||
goto ONLY_MATCHING_RESTART;
|
goto ONLY_MATCHING_RESTART;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1974,6 +2008,7 @@ while (ptr < endptr)
|
|||||||
/* Advance to after the newline and increment the line number. The file
|
/* Advance to after the newline and increment the line number. The file
|
||||||
offset to the current line is maintained in filepos. */
|
offset to the current line is maintained in filepos. */
|
||||||
|
|
||||||
|
END_ONE_MATCH:
|
||||||
ptr += linelength + endlinelength;
|
ptr += linelength + endlinelength;
|
||||||
filepos += (int)(linelength + endlinelength);
|
filepos += (int)(linelength + endlinelength);
|
||||||
linenumber++;
|
linenumber++;
|
||||||
|
@ -2257,6 +2257,8 @@ if (callout_extra)
|
|||||||
fprintf(f, "Callout %d: last capture = %d\n",
|
fprintf(f, "Callout %d: last capture = %d\n",
|
||||||
cb->callout_number, cb->capture_last);
|
cb->callout_number, cb->capture_last);
|
||||||
|
|
||||||
|
if (cb->offset_vector != NULL)
|
||||||
|
{
|
||||||
for (i = 0; i < cb->capture_top * 2; i += 2)
|
for (i = 0; i < cb->capture_top * 2; i += 2)
|
||||||
{
|
{
|
||||||
if (cb->offset_vector[i] < 0)
|
if (cb->offset_vector[i] < 0)
|
||||||
@ -2270,6 +2272,7 @@ if (callout_extra)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Re-print the subject in canonical form, the first time or if giving full
|
/* Re-print the subject in canonical form, the first time or if giving full
|
||||||
datails. On subsequent calls in the same match, we use pchars just to find the
|
datails. On subsequent calls in the same match, we use pchars just to find the
|
||||||
@ -2519,7 +2522,7 @@ re->name_entry_size = swap_uint16(re->name_entry_size);
|
|||||||
re->name_count = swap_uint16(re->name_count);
|
re->name_count = swap_uint16(re->name_count);
|
||||||
re->ref_count = swap_uint16(re->ref_count);
|
re->ref_count = swap_uint16(re->ref_count);
|
||||||
|
|
||||||
if (extra != NULL)
|
if (extra != NULL && (extra->flags & PCRE_EXTRA_STUDY_DATA) != 0)
|
||||||
{
|
{
|
||||||
pcre_study_data *rsd = (pcre_study_data *)(extra->study_data);
|
pcre_study_data *rsd = (pcre_study_data *)(extra->study_data);
|
||||||
rsd->size = swap_uint32(rsd->size);
|
rsd->size = swap_uint32(rsd->size);
|
||||||
@ -2700,7 +2703,7 @@ re->name_entry_size = swap_uint16(re->name_entry_size);
|
|||||||
re->name_count = swap_uint16(re->name_count);
|
re->name_count = swap_uint16(re->name_count);
|
||||||
re->ref_count = swap_uint16(re->ref_count);
|
re->ref_count = swap_uint16(re->ref_count);
|
||||||
|
|
||||||
if (extra != NULL)
|
if (extra != NULL && (extra->flags & PCRE_EXTRA_STUDY_DATA) != 0)
|
||||||
{
|
{
|
||||||
pcre_study_data *rsd = (pcre_study_data *)(extra->study_data);
|
pcre_study_data *rsd = (pcre_study_data *)(extra->study_data);
|
||||||
rsd->size = swap_uint32(rsd->size);
|
rsd->size = swap_uint32(rsd->size);
|
||||||
@ -3453,7 +3456,7 @@ while (!done)
|
|||||||
pcre_extra *extra = NULL;
|
pcre_extra *extra = NULL;
|
||||||
|
|
||||||
#if !defined NOPOSIX /* There are still compilers that require no indent */
|
#if !defined NOPOSIX /* There are still compilers that require no indent */
|
||||||
regex_t preg;
|
regex_t preg = { NULL, 0, 0} ;
|
||||||
int do_posix = 0;
|
int do_posix = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -5603,6 +5606,12 @@ while (!done)
|
|||||||
|
|
||||||
if (!do_g && !do_G) break;
|
if (!do_g && !do_G) break;
|
||||||
|
|
||||||
|
if (use_offsets == NULL)
|
||||||
|
{
|
||||||
|
fprintf(outfile, "Cannot do global matching without an ovector\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
|
||||||
@ -5618,9 +5627,33 @@ while (!done)
|
|||||||
g_notempty = PCRE_NOTEMPTY_ATSTART | PCRE_ANCHORED;
|
g_notempty = PCRE_NOTEMPTY_ATSTART | PCRE_ANCHORED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* For /g, update the start offset, leaving the rest alone */
|
/* For /g, update the start offset, leaving the rest alone. There is a
|
||||||
|
tricky case when \K is used in a positive lookbehind assertion. This can
|
||||||
|
cause the end of the match to be less than or equal to the start offset.
|
||||||
|
In this case we restart at one past the start offset. This may return the
|
||||||
|
same match if the original start offset was bumped along during the
|
||||||
|
match, but eventually the new start offset will hit the actual start
|
||||||
|
offset. (In PCRE2 the true start offset is available, and this can be
|
||||||
|
done better. It is not worth doing more than making sure we do not loop
|
||||||
|
at this stage in the life of PCRE1.) */
|
||||||
|
|
||||||
if (do_g) start_offset = use_offsets[1];
|
if (do_g)
|
||||||
|
{
|
||||||
|
if (g_notempty == 0 && use_offsets[1] <= start_offset)
|
||||||
|
{
|
||||||
|
if (start_offset >= len) break; /* End of subject */
|
||||||
|
start_offset++;
|
||||||
|
if (use_utf)
|
||||||
|
{
|
||||||
|
while (start_offset < len)
|
||||||
|
{
|
||||||
|
if ((bptr[start_offset] & 0xc0) != 0x80) break;
|
||||||
|
start_offset++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else start_offset = use_offsets[1];
|
||||||
|
}
|
||||||
|
|
||||||
/* For /G, update the pointer and length */
|
/* For /G, update the pointer and length */
|
||||||
|
|
||||||
@ -5637,7 +5670,7 @@ while (!done)
|
|||||||
CONTINUE:
|
CONTINUE:
|
||||||
|
|
||||||
#if !defined NOPOSIX
|
#if !defined NOPOSIX
|
||||||
if (posix || do_posix) regfree(&preg);
|
if ((posix || do_posix) && preg.re_pcre != 0) regfree(&preg);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (re != NULL) new_free(re);
|
if (re != NULL) new_free(re);
|
||||||
|
@ -96,13 +96,19 @@
|
|||||||
#define SLJIT_EXECUTABLE_ALLOCATOR 1
|
#define SLJIT_EXECUTABLE_ALLOCATOR 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Return with error when an invalid argument is passed. */
|
||||||
|
#ifndef SLJIT_ARGUMENT_CHECKS
|
||||||
|
/* Disabled by default */
|
||||||
|
#define SLJIT_ARGUMENT_CHECKS 0
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Debug checks (assertions, etc.). */
|
/* Debug checks (assertions, etc.). */
|
||||||
#ifndef SLJIT_DEBUG
|
#ifndef SLJIT_DEBUG
|
||||||
/* Enabled by default */
|
/* Enabled by default */
|
||||||
#define SLJIT_DEBUG 1
|
#define SLJIT_DEBUG 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Verbose operations */
|
/* Verbose operations. */
|
||||||
#ifndef SLJIT_VERBOSE
|
#ifndef SLJIT_VERBOSE
|
||||||
/* Enabled by default */
|
/* Enabled by default */
|
||||||
#define SLJIT_VERBOSE 1
|
#define SLJIT_VERBOSE 1
|
||||||
|
@ -60,6 +60,7 @@
|
|||||||
a double precision floating point array by index
|
a double precision floating point array by index
|
||||||
SLJIT_SINGLE_SHIFT : the shift required to apply when accessing
|
SLJIT_SINGLE_SHIFT : the shift required to apply when accessing
|
||||||
a single precision floating point array by index
|
a single precision floating point array by index
|
||||||
|
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
|
||||||
|
|
||||||
Other macros:
|
Other macros:
|
||||||
@ -67,6 +68,10 @@
|
|||||||
SLJIT_W(number) : defining 64 bit constants on 64 bit architectures (compiler independent helper)
|
SLJIT_W(number) : defining 64 bit constants on 64 bit architectures (compiler independent helper)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*****************/
|
||||||
|
/* Sanity check. */
|
||||||
|
/*****************/
|
||||||
|
|
||||||
#if !((defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \
|
#if !((defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \
|
||||||
|| (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \
|
|| (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \
|
||||||
|| (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) \
|
|| (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) \
|
||||||
@ -84,7 +89,6 @@
|
|||||||
#error "An architecture must be selected"
|
#error "An architecture must be selected"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Sanity check. */
|
|
||||||
#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \
|
#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \
|
||||||
+ (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \
|
+ (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) \
|
||||||
+ (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) \
|
+ (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) \
|
||||||
@ -102,7 +106,10 @@
|
|||||||
#error "Multiple architectures are selected"
|
#error "Multiple architectures are selected"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Auto select option (requires compiler support) */
|
/********************************************************/
|
||||||
|
/* Automatic CPU detection (requires compiler support). */
|
||||||
|
/********************************************************/
|
||||||
|
|
||||||
#if (defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO)
|
#if (defined SLJIT_CONFIG_AUTO && SLJIT_CONFIG_AUTO)
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
@ -155,6 +162,10 @@
|
|||||||
#undef SLJIT_EXECUTABLE_ALLOCATOR
|
#undef SLJIT_EXECUTABLE_ALLOCATOR
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/******************************/
|
||||||
|
/* CPU family type detection. */
|
||||||
|
/******************************/
|
||||||
|
|
||||||
#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) \
|
||||||
|| (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
|
|| (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
|
||||||
#define SLJIT_CONFIG_ARM_32 1
|
#define SLJIT_CONFIG_ARM_32 1
|
||||||
@ -172,52 +183,9 @@
|
|||||||
#define SLJIT_CONFIG_SPARC 1
|
#define SLJIT_CONFIG_SPARC 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
|
/**********************************/
|
||||||
#define SLJIT_NUMBER_OF_REGISTERS 10
|
/* External function definitions. */
|
||||||
#define SLJIT_NUMBER_OF_SAVED_REGISTERS 7
|
/**********************************/
|
||||||
#elif (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
|
|
||||||
#ifndef _WIN64
|
|
||||||
#define SLJIT_NUMBER_OF_REGISTERS 12
|
|
||||||
#define SLJIT_NUMBER_OF_SAVED_REGISTERS 6
|
|
||||||
#else
|
|
||||||
#define SLJIT_NUMBER_OF_REGISTERS 12
|
|
||||||
#define SLJIT_NUMBER_OF_SAVED_REGISTERS 8
|
|
||||||
#endif /* _WIN64 */
|
|
||||||
#elif (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
|
|
||||||
#define SLJIT_NUMBER_OF_REGISTERS 11
|
|
||||||
#define SLJIT_NUMBER_OF_SAVED_REGISTERS 8
|
|
||||||
#elif (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
|
|
||||||
#define SLJIT_NUMBER_OF_REGISTERS 11
|
|
||||||
#define SLJIT_NUMBER_OF_SAVED_REGISTERS 7
|
|
||||||
#elif (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)
|
|
||||||
#define SLJIT_NUMBER_OF_REGISTERS 23
|
|
||||||
#define SLJIT_NUMBER_OF_SAVED_REGISTERS 10
|
|
||||||
#elif (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)
|
|
||||||
#define SLJIT_NUMBER_OF_REGISTERS 22
|
|
||||||
#define SLJIT_NUMBER_OF_SAVED_REGISTERS 17
|
|
||||||
#elif (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS)
|
|
||||||
#define SLJIT_NUMBER_OF_REGISTERS 17
|
|
||||||
#define SLJIT_NUMBER_OF_SAVED_REGISTERS 8
|
|
||||||
#elif (defined SLJIT_CONFIG_SPARC && SLJIT_CONFIG_SPARC)
|
|
||||||
#define SLJIT_NUMBER_OF_REGISTERS 18
|
|
||||||
#define SLJIT_NUMBER_OF_SAVED_REGISTERS 14
|
|
||||||
#elif (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
|
|
||||||
#define SLJIT_NUMBER_OF_REGISTERS 0
|
|
||||||
#define SLJIT_NUMBER_OF_SAVED_REGISTERS 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SLJIT_NUMBER_OF_SCRATCH_REGISTERS \
|
|
||||||
(SLJIT_NUMBER_OF_REGISTERS - SLJIT_NUMBER_OF_SAVED_REGISTERS)
|
|
||||||
|
|
||||||
#define SLJIT_NUMBER_OF_FLOAT_REGISTERS 6
|
|
||||||
#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) && (defined _WIN64)
|
|
||||||
#define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 1
|
|
||||||
#else
|
|
||||||
#define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS \
|
|
||||||
(SLJIT_NUMBER_OF_FLOAT_REGISTERS - SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS)
|
|
||||||
|
|
||||||
#if !(defined SLJIT_STD_MACROS_DEFINED && SLJIT_STD_MACROS_DEFINED)
|
#if !(defined SLJIT_STD_MACROS_DEFINED && SLJIT_STD_MACROS_DEFINED)
|
||||||
|
|
||||||
@ -225,20 +193,21 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#endif /* STD_MACROS_DEFINED */
|
#endif /* SLJIT_STD_MACROS_DEFINED */
|
||||||
|
|
||||||
/* General macros:
|
/* General macros:
|
||||||
Note: SLJIT is designed to be independent from them as possible.
|
Note: SLJIT is designed to be independent from them as possible.
|
||||||
|
|
||||||
In release mode (SLJIT_DEBUG is not defined) only the following macros are needed:
|
In release mode (SLJIT_DEBUG is not defined) only the following
|
||||||
|
external functions are needed:
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef SLJIT_MALLOC
|
#ifndef SLJIT_MALLOC
|
||||||
#define SLJIT_MALLOC(size) malloc(size)
|
#define SLJIT_MALLOC(size, allocator_data) malloc(size)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef SLJIT_FREE
|
#ifndef SLJIT_FREE
|
||||||
#define SLJIT_FREE(ptr) free(ptr)
|
#define SLJIT_FREE(ptr, allocator_data) free(ptr)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef SLJIT_MEMMOVE
|
#ifndef SLJIT_MEMMOVE
|
||||||
@ -249,6 +218,10 @@
|
|||||||
#define SLJIT_ZEROMEM(dest, len) memset(dest, 0, len)
|
#define SLJIT_ZEROMEM(dest, len) memset(dest, 0, len)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/***************************/
|
||||||
|
/* Compiler helper macros. */
|
||||||
|
/***************************/
|
||||||
|
|
||||||
#if !defined(SLJIT_LIKELY) && !defined(SLJIT_UNLIKELY)
|
#if !defined(SLJIT_LIKELY) && !defined(SLJIT_UNLIKELY)
|
||||||
|
|
||||||
#if defined(__GNUC__) && (__GNUC__ >= 3)
|
#if defined(__GNUC__) && (__GNUC__ >= 3)
|
||||||
@ -270,6 +243,15 @@
|
|||||||
#endif
|
#endif
|
||||||
#endif /* !SLJIT_INLINE */
|
#endif /* !SLJIT_INLINE */
|
||||||
|
|
||||||
|
#ifndef SLJIT_NOINLINE
|
||||||
|
/* Not inline functions. */
|
||||||
|
#if defined(__GNUC__)
|
||||||
|
#define SLJIT_NOINLINE __attribute__ ((noinline))
|
||||||
|
#else
|
||||||
|
#define SLJIT_NOINLINE
|
||||||
|
#endif
|
||||||
|
#endif /* !SLJIT_INLINE */
|
||||||
|
|
||||||
#ifndef SLJIT_CONST
|
#ifndef SLJIT_CONST
|
||||||
/* Const variables. */
|
/* Const variables. */
|
||||||
#define SLJIT_CONST const
|
#define SLJIT_CONST const
|
||||||
@ -280,6 +262,10 @@
|
|||||||
#define SLJIT_UNUSED_ARG(arg) (void)arg
|
#define SLJIT_UNUSED_ARG(arg) (void)arg
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*********************************/
|
||||||
|
/* Type of public API functions. */
|
||||||
|
/*********************************/
|
||||||
|
|
||||||
#if (defined SLJIT_CONFIG_STATIC && SLJIT_CONFIG_STATIC)
|
#if (defined SLJIT_CONFIG_STATIC && SLJIT_CONFIG_STATIC)
|
||||||
/* Static ABI functions. For all-in-one programs. */
|
/* Static ABI functions. For all-in-one programs. */
|
||||||
|
|
||||||
@ -294,6 +280,10 @@
|
|||||||
#define SLJIT_API_FUNC_ATTRIBUTE
|
#define SLJIT_API_FUNC_ATTRIBUTE
|
||||||
#endif /* (defined SLJIT_CONFIG_STATIC && SLJIT_CONFIG_STATIC) */
|
#endif /* (defined SLJIT_CONFIG_STATIC && SLJIT_CONFIG_STATIC) */
|
||||||
|
|
||||||
|
/****************************/
|
||||||
|
/* Instruction cache flush. */
|
||||||
|
/****************************/
|
||||||
|
|
||||||
#ifndef SLJIT_CACHE_FLUSH
|
#ifndef SLJIT_CACHE_FLUSH
|
||||||
|
|
||||||
#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
|
#if (defined SLJIT_CONFIG_X86 && SLJIT_CONFIG_X86)
|
||||||
@ -339,6 +329,10 @@
|
|||||||
|
|
||||||
#endif /* !SLJIT_CACHE_FLUSH */
|
#endif /* !SLJIT_CACHE_FLUSH */
|
||||||
|
|
||||||
|
/******************************************************/
|
||||||
|
/* Byte/half/int/word/single/double type definitions. */
|
||||||
|
/******************************************************/
|
||||||
|
|
||||||
/* 8 bit byte type. */
|
/* 8 bit byte type. */
|
||||||
typedef unsigned char sljit_ub;
|
typedef unsigned char sljit_ub;
|
||||||
typedef signed char sljit_sb;
|
typedef signed char sljit_sb;
|
||||||
@ -351,7 +345,7 @@ typedef signed short int sljit_sh;
|
|||||||
typedef unsigned int sljit_ui;
|
typedef unsigned int sljit_ui;
|
||||||
typedef signed int sljit_si;
|
typedef signed int sljit_si;
|
||||||
|
|
||||||
/* Machine word type. Can encapsulate a pointer.
|
/* Machine word type. Enough for storing a pointer.
|
||||||
32 bit for 32 bit machines.
|
32 bit for 32 bit machines.
|
||||||
64 bit for 64 bit machines. */
|
64 bit for 64 bit machines. */
|
||||||
#if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
|
#if (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
|
||||||
@ -404,44 +398,13 @@ typedef double sljit_d;
|
|||||||
|
|
||||||
#endif /* !SLJIT_W */
|
#endif /* !SLJIT_W */
|
||||||
|
|
||||||
#ifndef SLJIT_CALL
|
/*************************/
|
||||||
|
/* Endianness detection. */
|
||||||
/* ABI (Application Binary Interface) types. */
|
/*************************/
|
||||||
#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
|
|
||||||
|
|
||||||
#if defined(__GNUC__) && !defined(__APPLE__)
|
|
||||||
|
|
||||||
#define SLJIT_CALL __attribute__ ((fastcall))
|
|
||||||
#define SLJIT_X86_32_FASTCALL 1
|
|
||||||
|
|
||||||
#elif defined(_MSC_VER)
|
|
||||||
|
|
||||||
#define SLJIT_CALL __fastcall
|
|
||||||
#define SLJIT_X86_32_FASTCALL 1
|
|
||||||
|
|
||||||
#elif defined(__BORLANDC__)
|
|
||||||
|
|
||||||
#define SLJIT_CALL __msfastcall
|
|
||||||
#define SLJIT_X86_32_FASTCALL 1
|
|
||||||
|
|
||||||
#else /* Unknown compiler. */
|
|
||||||
|
|
||||||
/* The cdecl attribute is the default. */
|
|
||||||
#define SLJIT_CALL
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#else /* Non x86-32 architectures. */
|
|
||||||
|
|
||||||
#define SLJIT_CALL
|
|
||||||
|
|
||||||
#endif /* SLJIT_CONFIG_X86_32 */
|
|
||||||
|
|
||||||
#endif /* !SLJIT_CALL */
|
|
||||||
|
|
||||||
#if !defined(SLJIT_BIG_ENDIAN) && !defined(SLJIT_LITTLE_ENDIAN)
|
#if !defined(SLJIT_BIG_ENDIAN) && !defined(SLJIT_LITTLE_ENDIAN)
|
||||||
|
|
||||||
/* These macros are useful for the applications. */
|
/* These macros are mostly useful for the applications. */
|
||||||
#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \
|
#if (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) \
|
||||||
|| (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
|
|| (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)
|
||||||
|
|
||||||
@ -479,29 +442,6 @@ typedef double sljit_d;
|
|||||||
#error "Exactly one endianness must be selected"
|
#error "Exactly one endianness must be selected"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef SLJIT_INDIRECT_CALL
|
|
||||||
#if ((defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) && (defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN)) \
|
|
||||||
|| ((defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) && defined _AIX)
|
|
||||||
/* It seems certain ppc compilers use an indirect addressing for functions
|
|
||||||
which makes things complicated. */
|
|
||||||
#define SLJIT_INDIRECT_CALL 1
|
|
||||||
#endif
|
|
||||||
#endif /* SLJIT_INDIRECT_CALL */
|
|
||||||
|
|
||||||
#ifndef SLJIT_RETURN_ADDRESS_OFFSET
|
|
||||||
#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
|
|
||||||
#define SLJIT_RETURN_ADDRESS_OFFSET 8
|
|
||||||
#else
|
|
||||||
#define SLJIT_RETURN_ADDRESS_OFFSET 0
|
|
||||||
#endif
|
|
||||||
#endif /* SLJIT_RETURN_ADDRESS_OFFSET */
|
|
||||||
|
|
||||||
#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
|
|
||||||
/* Auto detect SSE2 support using CPUID.
|
|
||||||
On 64 bit x86 cpus, sse2 must be present. */
|
|
||||||
#define SLJIT_DETECT_SSE2 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef SLJIT_UNALIGNED
|
#ifndef SLJIT_UNALIGNED
|
||||||
|
|
||||||
#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \
|
#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) \
|
||||||
@ -516,6 +456,73 @@ typedef double sljit_d;
|
|||||||
|
|
||||||
#endif /* !SLJIT_UNALIGNED */
|
#endif /* !SLJIT_UNALIGNED */
|
||||||
|
|
||||||
|
#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
|
||||||
|
/* Auto detect SSE2 support using CPUID.
|
||||||
|
On 64 bit x86 cpus, sse2 must be present. */
|
||||||
|
#define SLJIT_DETECT_SSE2 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*****************************************************************************************/
|
||||||
|
/* Calling convention of functions generated by SLJIT or called from the generated code. */
|
||||||
|
/*****************************************************************************************/
|
||||||
|
|
||||||
|
#ifndef SLJIT_CALL
|
||||||
|
|
||||||
|
#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
|
||||||
|
|
||||||
|
#if defined(__GNUC__) && !defined(__APPLE__)
|
||||||
|
|
||||||
|
#define SLJIT_CALL __attribute__ ((fastcall))
|
||||||
|
#define SLJIT_X86_32_FASTCALL 1
|
||||||
|
|
||||||
|
#elif defined(_MSC_VER)
|
||||||
|
|
||||||
|
#define SLJIT_CALL __fastcall
|
||||||
|
#define SLJIT_X86_32_FASTCALL 1
|
||||||
|
|
||||||
|
#elif defined(__BORLANDC__)
|
||||||
|
|
||||||
|
#define SLJIT_CALL __msfastcall
|
||||||
|
#define SLJIT_X86_32_FASTCALL 1
|
||||||
|
|
||||||
|
#else /* Unknown compiler. */
|
||||||
|
|
||||||
|
/* The cdecl attribute is the default. */
|
||||||
|
#define SLJIT_CALL
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#else /* Non x86-32 architectures. */
|
||||||
|
|
||||||
|
#define SLJIT_CALL
|
||||||
|
|
||||||
|
#endif /* SLJIT_CONFIG_X86_32 */
|
||||||
|
|
||||||
|
#endif /* !SLJIT_CALL */
|
||||||
|
|
||||||
|
#ifndef SLJIT_INDIRECT_CALL
|
||||||
|
#if ((defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) && (defined SLJIT_BIG_ENDIAN && SLJIT_BIG_ENDIAN)) \
|
||||||
|
|| ((defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32) && defined _AIX)
|
||||||
|
/* It seems certain ppc compilers use an indirect addressing for functions
|
||||||
|
which makes things complicated. */
|
||||||
|
#define SLJIT_INDIRECT_CALL 1
|
||||||
|
#endif
|
||||||
|
#endif /* SLJIT_INDIRECT_CALL */
|
||||||
|
|
||||||
|
/* The offset which needs to be substracted from the return address to
|
||||||
|
determine the next executed instruction after return. */
|
||||||
|
#ifndef SLJIT_RETURN_ADDRESS_OFFSET
|
||||||
|
#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
|
||||||
|
#define SLJIT_RETURN_ADDRESS_OFFSET 8
|
||||||
|
#else
|
||||||
|
#define SLJIT_RETURN_ADDRESS_OFFSET 0
|
||||||
|
#endif
|
||||||
|
#endif /* SLJIT_RETURN_ADDRESS_OFFSET */
|
||||||
|
|
||||||
|
/***************************************************/
|
||||||
|
/* Functions of the built-in executable allocator. */
|
||||||
|
/***************************************************/
|
||||||
|
|
||||||
#if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR)
|
#if (defined SLJIT_EXECUTABLE_ALLOCATOR && SLJIT_EXECUTABLE_ALLOCATOR)
|
||||||
SLJIT_API_FUNC_ATTRIBUTE void* sljit_malloc_exec(sljit_uw size);
|
SLJIT_API_FUNC_ATTRIBUTE void* sljit_malloc_exec(sljit_uw size);
|
||||||
SLJIT_API_FUNC_ATTRIBUTE void sljit_free_exec(void* ptr);
|
SLJIT_API_FUNC_ATTRIBUTE void sljit_free_exec(void* ptr);
|
||||||
@ -524,6 +531,110 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_free_unused_memory_exec(void);
|
|||||||
#define SLJIT_FREE_EXEC(ptr) sljit_free_exec(ptr)
|
#define SLJIT_FREE_EXEC(ptr) sljit_free_exec(ptr)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/**********************************************/
|
||||||
|
/* Registers and locals offset determination. */
|
||||||
|
/**********************************************/
|
||||||
|
|
||||||
|
#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
|
||||||
|
|
||||||
|
#define SLJIT_NUMBER_OF_REGISTERS 10
|
||||||
|
#define SLJIT_NUMBER_OF_SAVED_REGISTERS 7
|
||||||
|
#if (defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL)
|
||||||
|
#define SLJIT_LOCALS_OFFSET_BASE ((2 + 4) * sizeof(sljit_sw))
|
||||||
|
#else
|
||||||
|
/* Maximum 3 arguments are passed on the stack, +1 for double alignment. */
|
||||||
|
#define SLJIT_LOCALS_OFFSET_BASE ((3 + 1 + 4) * sizeof(sljit_sw))
|
||||||
|
#endif /* SLJIT_X86_32_FASTCALL */
|
||||||
|
|
||||||
|
#elif (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
|
||||||
|
|
||||||
|
#ifndef _WIN64
|
||||||
|
#define SLJIT_NUMBER_OF_REGISTERS 12
|
||||||
|
#define SLJIT_NUMBER_OF_SAVED_REGISTERS 6
|
||||||
|
#define SLJIT_LOCALS_OFFSET_BASE (sizeof(sljit_sw))
|
||||||
|
#else
|
||||||
|
#define SLJIT_NUMBER_OF_REGISTERS 12
|
||||||
|
#define SLJIT_NUMBER_OF_SAVED_REGISTERS 8
|
||||||
|
#define SLJIT_LOCALS_OFFSET_BASE ((4 + 2) * sizeof(sljit_sw))
|
||||||
|
#endif /* _WIN64 */
|
||||||
|
|
||||||
|
#elif (defined SLJIT_CONFIG_ARM_V5 && SLJIT_CONFIG_ARM_V5) || (defined SLJIT_CONFIG_ARM_V7 && SLJIT_CONFIG_ARM_V7)
|
||||||
|
|
||||||
|
#define SLJIT_NUMBER_OF_REGISTERS 11
|
||||||
|
#define SLJIT_NUMBER_OF_SAVED_REGISTERS 8
|
||||||
|
#define SLJIT_LOCALS_OFFSET_BASE 0
|
||||||
|
|
||||||
|
#elif (defined SLJIT_CONFIG_ARM_THUMB2 && SLJIT_CONFIG_ARM_THUMB2)
|
||||||
|
|
||||||
|
#define SLJIT_NUMBER_OF_REGISTERS 11
|
||||||
|
#define SLJIT_NUMBER_OF_SAVED_REGISTERS 7
|
||||||
|
#define SLJIT_LOCALS_OFFSET_BASE 0
|
||||||
|
|
||||||
|
#elif (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)
|
||||||
|
|
||||||
|
#define SLJIT_NUMBER_OF_REGISTERS 25
|
||||||
|
#define SLJIT_NUMBER_OF_SAVED_REGISTERS 10
|
||||||
|
#define SLJIT_LOCALS_OFFSET_BASE (2 * sizeof(sljit_sw))
|
||||||
|
|
||||||
|
#elif (defined SLJIT_CONFIG_PPC && SLJIT_CONFIG_PPC)
|
||||||
|
|
||||||
|
#define SLJIT_NUMBER_OF_REGISTERS 22
|
||||||
|
#define SLJIT_NUMBER_OF_SAVED_REGISTERS 17
|
||||||
|
#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64) || (defined _AIX)
|
||||||
|
#define SLJIT_LOCALS_OFFSET_BASE ((6 + 8) * sizeof(sljit_sw))
|
||||||
|
#elif (defined SLJIT_CONFIG_PPC_32 && SLJIT_CONFIG_PPC_32)
|
||||||
|
/* Add +1 for double alignment. */
|
||||||
|
#define SLJIT_LOCALS_OFFSET_BASE ((3 + 1) * sizeof(sljit_sw))
|
||||||
|
#else
|
||||||
|
#define SLJIT_LOCALS_OFFSET_BASE (3 * sizeof(sljit_sw))
|
||||||
|
#endif /* SLJIT_CONFIG_PPC_64 || _AIX */
|
||||||
|
|
||||||
|
#elif (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS)
|
||||||
|
|
||||||
|
#define SLJIT_NUMBER_OF_REGISTERS 17
|
||||||
|
#define SLJIT_NUMBER_OF_SAVED_REGISTERS 8
|
||||||
|
#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
|
||||||
|
#define SLJIT_LOCALS_OFFSET_BASE (4 * sizeof(sljit_sw))
|
||||||
|
#else
|
||||||
|
#define SLJIT_LOCALS_OFFSET_BASE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif (defined SLJIT_CONFIG_SPARC && SLJIT_CONFIG_SPARC)
|
||||||
|
|
||||||
|
#define SLJIT_NUMBER_OF_REGISTERS 18
|
||||||
|
#define SLJIT_NUMBER_OF_SAVED_REGISTERS 14
|
||||||
|
#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
|
||||||
|
/* Add +1 for double alignment. */
|
||||||
|
#define SLJIT_LOCALS_OFFSET_BASE ((23 + 1) * sizeof(sljit_sw))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#elif (defined SLJIT_CONFIG_UNSUPPORTED && SLJIT_CONFIG_UNSUPPORTED)
|
||||||
|
|
||||||
|
#define SLJIT_NUMBER_OF_REGISTERS 0
|
||||||
|
#define SLJIT_NUMBER_OF_SAVED_REGISTERS 0
|
||||||
|
#define SLJIT_LOCALS_OFFSET_BASE 0
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define SLJIT_LOCALS_OFFSET (SLJIT_LOCALS_OFFSET_BASE)
|
||||||
|
|
||||||
|
#define SLJIT_NUMBER_OF_SCRATCH_REGISTERS \
|
||||||
|
(SLJIT_NUMBER_OF_REGISTERS - SLJIT_NUMBER_OF_SAVED_REGISTERS)
|
||||||
|
|
||||||
|
#define SLJIT_NUMBER_OF_FLOAT_REGISTERS 6
|
||||||
|
#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64) && (defined _WIN64)
|
||||||
|
#define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 1
|
||||||
|
#else
|
||||||
|
#define SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS \
|
||||||
|
(SLJIT_NUMBER_OF_FLOAT_REGISTERS - SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS)
|
||||||
|
|
||||||
|
/*************************************/
|
||||||
|
/* Debug and verbose related macros. */
|
||||||
|
/*************************************/
|
||||||
|
|
||||||
#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
|
#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#endif
|
#endif
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -95,8 +95,10 @@ of sljitConfigInternal.h */
|
|||||||
/* Cannot allocate executable memory.
|
/* Cannot allocate executable memory.
|
||||||
Only for sljit_generate_code() */
|
Only for sljit_generate_code() */
|
||||||
#define SLJIT_ERR_EX_ALLOC_FAILED 3
|
#define SLJIT_ERR_EX_ALLOC_FAILED 3
|
||||||
/* return value for SLJIT_CONFIG_UNSUPPORTED empty architecture. */
|
/* Return value for SLJIT_CONFIG_UNSUPPORTED placeholder architecture. */
|
||||||
#define SLJIT_ERR_UNSUPPORTED 4
|
#define SLJIT_ERR_UNSUPPORTED 4
|
||||||
|
/* An ivalid argument is passed to any SLJIT function. */
|
||||||
|
#define SLJIT_ERR_BAD_ARGUMENT 5
|
||||||
|
|
||||||
/* --------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------- */
|
||||||
/* Registers */
|
/* Registers */
|
||||||
@ -305,6 +307,7 @@ struct sljit_compiler {
|
|||||||
struct sljit_jump *last_jump;
|
struct sljit_jump *last_jump;
|
||||||
struct sljit_const *last_const;
|
struct sljit_const *last_const;
|
||||||
|
|
||||||
|
void *allocator_data;
|
||||||
struct sljit_memory_fragment *buf;
|
struct sljit_memory_fragment *buf;
|
||||||
struct sljit_memory_fragment *abuf;
|
struct sljit_memory_fragment *abuf;
|
||||||
|
|
||||||
@ -359,7 +362,6 @@ struct sljit_compiler {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)
|
#if (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64)
|
||||||
sljit_si locals_offset;
|
|
||||||
sljit_si cache_arg;
|
sljit_si cache_arg;
|
||||||
sljit_sw cache_argw;
|
sljit_sw cache_argw;
|
||||||
#endif
|
#endif
|
||||||
@ -391,12 +393,15 @@ struct sljit_compiler {
|
|||||||
FILE* verbose;
|
FILE* verbose;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (defined SLJIT_DEBUG && SLJIT_DEBUG)
|
#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) \
|
||||||
|
|| (defined SLJIT_DEBUG && SLJIT_DEBUG)
|
||||||
/* Local size passed to the functions. */
|
/* Local size passed to the functions. */
|
||||||
sljit_si logical_local_size;
|
sljit_si logical_local_size;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) || (defined SLJIT_DEBUG && SLJIT_DEBUG)
|
#if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS) \
|
||||||
|
|| (defined SLJIT_DEBUG && SLJIT_DEBUG) \
|
||||||
|
|| (defined SLJIT_VERBOSE && SLJIT_VERBOSE)
|
||||||
sljit_si skip_checks;
|
sljit_si skip_checks;
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
@ -405,11 +410,16 @@ struct sljit_compiler {
|
|||||||
/* Main functions */
|
/* Main functions */
|
||||||
/* --------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------- */
|
||||||
|
|
||||||
/* Creates an sljit compiler.
|
/* Creates an sljit compiler. The allocator_data is required by some
|
||||||
Returns NULL if failed. */
|
custom memory managers. This pointer is passed to SLJIT_MALLOC
|
||||||
SLJIT_API_FUNC_ATTRIBUTE struct sljit_compiler* sljit_create_compiler(void);
|
and SLJIT_FREE macros. Most allocators (including the default
|
||||||
|
one) ignores this value, and it is recommended to pass NULL
|
||||||
|
as a dummy value for allocator_data.
|
||||||
|
|
||||||
/* Free everything except the compiled machine code. */
|
Returns NULL if failed. */
|
||||||
|
SLJIT_API_FUNC_ATTRIBUTE struct sljit_compiler* sljit_create_compiler(void *allocator_data);
|
||||||
|
|
||||||
|
/* Frees everything except the compiled machine code. */
|
||||||
SLJIT_API_FUNC_ATTRIBUTE void sljit_free_compiler(struct sljit_compiler *compiler);
|
SLJIT_API_FUNC_ATTRIBUTE void sljit_free_compiler(struct sljit_compiler *compiler);
|
||||||
|
|
||||||
/* Returns the current error code. If an error is occurred, future sljit
|
/* Returns the current error code. If an error is occurred, future sljit
|
||||||
@ -419,6 +429,14 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_free_compiler(struct sljit_compiler *compile
|
|||||||
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_si sljit_get_compiler_error(struct sljit_compiler *compiler) { return compiler->error; }
|
||||||
|
|
||||||
|
/* Sets the compiler error code to SLJIT_ERR_ALLOC_FAILED except
|
||||||
|
if an error was detected before. After the error code is set
|
||||||
|
the compiler behaves as if the allocation failure happened
|
||||||
|
during an sljit function call. This can greatly simplify error
|
||||||
|
checking, since only the compiler status needs to be checked
|
||||||
|
after the compilation. */
|
||||||
|
SLJIT_API_FUNC_ATTRIBUTE void sljit_set_compiler_memory_error(struct sljit_compiler *compiler);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Allocate a small amount of memory. The size must be <= 64 bytes on 32 bit,
|
Allocate a small amount of memory. The size must be <= 64 bytes on 32 bit,
|
||||||
and <= 128 bytes on 64 bit architectures. The memory area is owned by the
|
and <= 128 bytes on 64 bit architectures. The memory area is owned by the
|
||||||
@ -461,8 +479,8 @@ static SLJIT_INLINE sljit_uw sljit_get_generated_code_size(struct sljit_compiler
|
|||||||
sljit_emit_enter function emits the necessary instructions for
|
sljit_emit_enter function emits the necessary instructions for
|
||||||
setting up a new context for the executable code and moves function
|
setting up a new context for the executable code and moves function
|
||||||
arguments to the saved registers. Furthermore the options argument
|
arguments to the saved registers. Furthermore the options argument
|
||||||
can be used to pass configuration options to the compiler. Currently
|
can be used to pass configuration options to the compiler. The
|
||||||
there are no options, so it must be set to 0.
|
available options are listed before sljit_emit_enter.
|
||||||
|
|
||||||
The number of sljit_sw arguments passed to the generated function
|
The number of sljit_sw arguments passed to the generated function
|
||||||
are specified in the "args" parameter. The number of arguments must
|
are specified in the "args" parameter. The number of arguments must
|
||||||
@ -493,6 +511,11 @@ static SLJIT_INLINE sljit_uw sljit_get_generated_code_size(struct sljit_compiler
|
|||||||
overwrites the previous context.
|
overwrites the previous context.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* The absolute address returned by sljit_get_local_base with
|
||||||
|
offset 0 is aligned to sljit_d. Otherwise it is aligned to sljit_uw. */
|
||||||
|
#define SLJIT_DOUBLE_ALIGNMENT 0x00000001
|
||||||
|
|
||||||
|
/* 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_si sljit_emit_enter(struct sljit_compiler *compiler,
|
||||||
@ -509,7 +532,7 @@ 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 void sljit_set_context(struct sljit_compiler *compiler,
|
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_set_context(struct sljit_compiler *compiler,
|
||||||
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds,
|
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds,
|
||||||
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size);
|
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size);
|
||||||
|
|
||||||
@ -674,23 +697,23 @@ 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 goes to SLJIT_R1:SLJIT_R0 (high:low) word */
|
Result goes to SLJIT_R1:SLJIT_R0 (high:low) word */
|
||||||
#define SLJIT_UMUL (SLJIT_OP0_BASE + 2)
|
#define SLJIT_LUMUL (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 goes to SLJIT_R1:SLJIT_R0 (high:low) word */
|
Result goes to SLJIT_R1:SLJIT_R0 (high:low) word */
|
||||||
#define SLJIT_SMUL (SLJIT_OP0_BASE + 3)
|
#define SLJIT_LSMUL (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 in SLJIT_R0 and the remainder goes to SLJIT_R1.
|
The result is placed in SLJIT_R0 and the remainder goes to SLJIT_R1.
|
||||||
Note: if SLJIT_R1 contains 0, the behaviour is undefined. */
|
Note: if SLJIT_R1 contains 0, the behaviour is undefined. */
|
||||||
#define SLJIT_UDIV (SLJIT_OP0_BASE + 4)
|
#define SLJIT_LUDIV (SLJIT_OP0_BASE + 4)
|
||||||
#define SLJIT_IUDIV (SLJIT_UDIV | SLJIT_INT_OP)
|
#define SLJIT_ILUDIV (SLJIT_LUDIV | 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 in SLJIT_R0 and the remainder goes to SLJIT_R1.
|
The result is placed in SLJIT_R0 and the remainder goes to SLJIT_R1.
|
||||||
Note: if SLJIT_R1 contains 0, the behaviour is undefined. */
|
Note: if SLJIT_R1 contains 0, the behaviour is undefined. */
|
||||||
#define SLJIT_SDIV (SLJIT_OP0_BASE + 5)
|
#define SLJIT_LSDIV (SLJIT_OP0_BASE + 5)
|
||||||
#define SLJIT_ISDIV (SLJIT_SDIV | SLJIT_INT_OP)
|
#define SLJIT_ILSDIV (SLJIT_LSDIV | SLJIT_INT_OP)
|
||||||
|
|
||||||
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler, sljit_si op);
|
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler, sljit_si op);
|
||||||
|
|
||||||
@ -864,8 +887,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_is_fpu_available(void);
|
|||||||
#define SLJIT_FOP1_BASE 128
|
#define SLJIT_FOP1_BASE 128
|
||||||
|
|
||||||
/* Flags: SP - (never set any flags) */
|
/* Flags: SP - (never set any flags) */
|
||||||
#define SLJIT_MOVD (SLJIT_FOP1_BASE + 0)
|
#define SLJIT_DMOV (SLJIT_FOP1_BASE + 0)
|
||||||
#define SLJIT_MOVS (SLJIT_MOVD | SLJIT_SINGLE_OP)
|
#define SLJIT_SMOV (SLJIT_DMOV | SLJIT_SINGLE_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. */
|
||||||
@ -888,14 +911,14 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_is_fpu_available(void);
|
|||||||
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_CMPD (SLJIT_FOP1_BASE + 6)
|
#define SLJIT_DCMP (SLJIT_FOP1_BASE + 6)
|
||||||
#define SLJIT_CMPS (SLJIT_CMPD | SLJIT_SINGLE_OP)
|
#define SLJIT_SCMP (SLJIT_DCMP | SLJIT_SINGLE_OP)
|
||||||
/* Flags: SP - (never set any flags) */
|
/* Flags: SP - (never set any flags) */
|
||||||
#define SLJIT_NEGD (SLJIT_FOP1_BASE + 7)
|
#define SLJIT_DNEG (SLJIT_FOP1_BASE + 7)
|
||||||
#define SLJIT_NEGS (SLJIT_NEGD | SLJIT_SINGLE_OP)
|
#define SLJIT_SNEG (SLJIT_DNEG | SLJIT_SINGLE_OP)
|
||||||
/* Flags: SP - (never set any flags) */
|
/* Flags: SP - (never set any flags) */
|
||||||
#define SLJIT_ABSD (SLJIT_FOP1_BASE + 8)
|
#define SLJIT_DABS (SLJIT_FOP1_BASE + 8)
|
||||||
#define SLJIT_ABSS (SLJIT_ABSD | SLJIT_SINGLE_OP)
|
#define SLJIT_SABS (SLJIT_DABS | SLJIT_SINGLE_OP)
|
||||||
|
|
||||||
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop1(struct sljit_compiler *compiler, sljit_si op,
|
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop1(struct sljit_compiler *compiler, sljit_si op,
|
||||||
sljit_si dst, sljit_sw dstw,
|
sljit_si dst, sljit_sw dstw,
|
||||||
@ -905,17 +928,17 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop1(struct sljit_compiler *compile
|
|||||||
#define SLJIT_FOP2_BASE 160
|
#define SLJIT_FOP2_BASE 160
|
||||||
|
|
||||||
/* Flags: SP - (never set any flags) */
|
/* Flags: SP - (never set any flags) */
|
||||||
#define SLJIT_ADDD (SLJIT_FOP2_BASE + 0)
|
#define SLJIT_DADD (SLJIT_FOP2_BASE + 0)
|
||||||
#define SLJIT_ADDS (SLJIT_ADDD | SLJIT_SINGLE_OP)
|
#define SLJIT_SADD (SLJIT_DADD | SLJIT_SINGLE_OP)
|
||||||
/* Flags: SP - (never set any flags) */
|
/* Flags: SP - (never set any flags) */
|
||||||
#define SLJIT_SUBD (SLJIT_FOP2_BASE + 1)
|
#define SLJIT_DSUB (SLJIT_FOP2_BASE + 1)
|
||||||
#define SLJIT_SUBS (SLJIT_SUBD | SLJIT_SINGLE_OP)
|
#define SLJIT_SSUB (SLJIT_DSUB | SLJIT_SINGLE_OP)
|
||||||
/* Flags: SP - (never set any flags) */
|
/* Flags: SP - (never set any flags) */
|
||||||
#define SLJIT_MULD (SLJIT_FOP2_BASE + 2)
|
#define SLJIT_DMUL (SLJIT_FOP2_BASE + 2)
|
||||||
#define SLJIT_MULS (SLJIT_MULD | SLJIT_SINGLE_OP)
|
#define SLJIT_SMUL (SLJIT_DMUL | SLJIT_SINGLE_OP)
|
||||||
/* Flags: SP - (never set any flags) */
|
/* Flags: SP - (never set any flags) */
|
||||||
#define SLJIT_DIVD (SLJIT_FOP2_BASE + 3)
|
#define SLJIT_DDIV (SLJIT_FOP2_BASE + 3)
|
||||||
#define SLJIT_DIVS (SLJIT_DIVD | SLJIT_SINGLE_OP)
|
#define SLJIT_SDIV (SLJIT_DDIV | SLJIT_SINGLE_OP)
|
||||||
|
|
||||||
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compiler, sljit_si op,
|
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compiler, sljit_si op,
|
||||||
sljit_si dst, sljit_sw dstw,
|
sljit_si dst, sljit_sw dstw,
|
||||||
@ -926,36 +949,64 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compile
|
|||||||
|
|
||||||
SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compiler *compiler);
|
SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compiler *compiler);
|
||||||
|
|
||||||
/* Invert conditional instruction: xor (^) with 0x1 */
|
/* Invert (negate) conditional type: xor (^) with 0x1 */
|
||||||
#define SLJIT_C_EQUAL 0
|
|
||||||
#define SLJIT_C_ZERO 0
|
|
||||||
#define SLJIT_C_NOT_EQUAL 1
|
|
||||||
#define SLJIT_C_NOT_ZERO 1
|
|
||||||
|
|
||||||
#define SLJIT_C_LESS 2
|
/* Integer comparison types. */
|
||||||
#define SLJIT_C_GREATER_EQUAL 3
|
#define SLJIT_EQUAL 0
|
||||||
#define SLJIT_C_GREATER 4
|
#define SLJIT_I_EQUAL (SLJIT_EQUAL | SLJIT_INT_OP)
|
||||||
#define SLJIT_C_LESS_EQUAL 5
|
#define SLJIT_ZERO 0
|
||||||
#define SLJIT_C_SIG_LESS 6
|
#define SLJIT_I_ZERO (SLJIT_ZERO | SLJIT_INT_OP)
|
||||||
#define SLJIT_C_SIG_GREATER_EQUAL 7
|
#define SLJIT_NOT_EQUAL 1
|
||||||
#define SLJIT_C_SIG_GREATER 8
|
#define SLJIT_I_NOT_EQUAL (SLJIT_NOT_EQUAL | SLJIT_INT_OP)
|
||||||
#define SLJIT_C_SIG_LESS_EQUAL 9
|
#define SLJIT_NOT_ZERO 1
|
||||||
|
#define SLJIT_I_NOT_ZERO (SLJIT_NOT_ZERO | SLJIT_INT_OP)
|
||||||
|
|
||||||
#define SLJIT_C_OVERFLOW 10
|
#define SLJIT_LESS 2
|
||||||
#define SLJIT_C_NOT_OVERFLOW 11
|
#define SLJIT_I_LESS (SLJIT_LESS | SLJIT_INT_OP)
|
||||||
|
#define SLJIT_GREATER_EQUAL 3
|
||||||
|
#define SLJIT_I_GREATER_EQUAL (SLJIT_GREATER_EQUAL | SLJIT_INT_OP)
|
||||||
|
#define SLJIT_GREATER 4
|
||||||
|
#define SLJIT_I_GREATER (SLJIT_GREATER | SLJIT_INT_OP)
|
||||||
|
#define SLJIT_LESS_EQUAL 5
|
||||||
|
#define SLJIT_I_LESS_EQUAL (SLJIT_LESS_EQUAL | SLJIT_INT_OP)
|
||||||
|
#define SLJIT_SIG_LESS 6
|
||||||
|
#define SLJIT_I_SIG_LESS (SLJIT_SIG_LESS | SLJIT_INT_OP)
|
||||||
|
#define SLJIT_SIG_GREATER_EQUAL 7
|
||||||
|
#define SLJIT_I_SIG_GREATER_EQUAL (SLJIT_SIG_GREATER_EQUAL | SLJIT_INT_OP)
|
||||||
|
#define SLJIT_SIG_GREATER 8
|
||||||
|
#define SLJIT_I_SIG_GREATER (SLJIT_SIG_GREATER | SLJIT_INT_OP)
|
||||||
|
#define SLJIT_SIG_LESS_EQUAL 9
|
||||||
|
#define SLJIT_I_SIG_LESS_EQUAL (SLJIT_SIG_LESS_EQUAL | SLJIT_INT_OP)
|
||||||
|
|
||||||
#define SLJIT_C_MUL_OVERFLOW 12
|
#define SLJIT_OVERFLOW 10
|
||||||
#define SLJIT_C_MUL_NOT_OVERFLOW 13
|
#define SLJIT_I_OVERFLOW (SLJIT_OVERFLOW | SLJIT_INT_OP)
|
||||||
|
#define SLJIT_NOT_OVERFLOW 11
|
||||||
|
#define SLJIT_I_NOT_OVERFLOW (SLJIT_NOT_OVERFLOW | SLJIT_INT_OP)
|
||||||
|
|
||||||
#define SLJIT_C_FLOAT_EQUAL 14
|
#define SLJIT_MUL_OVERFLOW 12
|
||||||
#define SLJIT_C_FLOAT_NOT_EQUAL 15
|
#define SLJIT_I_MUL_OVERFLOW (SLJIT_MUL_OVERFLOW | SLJIT_INT_OP)
|
||||||
#define SLJIT_C_FLOAT_LESS 16
|
#define SLJIT_MUL_NOT_OVERFLOW 13
|
||||||
#define SLJIT_C_FLOAT_GREATER_EQUAL 17
|
#define SLJIT_I_MUL_NOT_OVERFLOW (SLJIT_MUL_NOT_OVERFLOW | SLJIT_INT_OP)
|
||||||
#define SLJIT_C_FLOAT_GREATER 18
|
|
||||||
#define SLJIT_C_FLOAT_LESS_EQUAL 19
|
|
||||||
#define SLJIT_C_FLOAT_UNORDERED 20
|
|
||||||
#define SLJIT_C_FLOAT_ORDERED 21
|
|
||||||
|
|
||||||
|
/* Floating point comparison types. */
|
||||||
|
#define SLJIT_D_EQUAL 14
|
||||||
|
#define SLJIT_S_EQUAL (SLJIT_D_EQUAL | SLJIT_SINGLE_OP)
|
||||||
|
#define SLJIT_D_NOT_EQUAL 15
|
||||||
|
#define SLJIT_S_NOT_EQUAL (SLJIT_D_NOT_EQUAL | SLJIT_SINGLE_OP)
|
||||||
|
#define SLJIT_D_LESS 16
|
||||||
|
#define SLJIT_S_LESS (SLJIT_D_LESS | SLJIT_SINGLE_OP)
|
||||||
|
#define SLJIT_D_GREATER_EQUAL 17
|
||||||
|
#define SLJIT_S_GREATER_EQUAL (SLJIT_D_GREATER_EQUAL | SLJIT_SINGLE_OP)
|
||||||
|
#define SLJIT_D_GREATER 18
|
||||||
|
#define SLJIT_S_GREATER (SLJIT_D_GREATER | SLJIT_SINGLE_OP)
|
||||||
|
#define SLJIT_D_LESS_EQUAL 19
|
||||||
|
#define SLJIT_S_LESS_EQUAL (SLJIT_D_LESS_EQUAL | SLJIT_SINGLE_OP)
|
||||||
|
#define SLJIT_D_UNORDERED 20
|
||||||
|
#define SLJIT_S_UNORDERED (SLJIT_D_UNORDERED | SLJIT_SINGLE_OP)
|
||||||
|
#define SLJIT_D_ORDERED 21
|
||||||
|
#define SLJIT_S_ORDERED (SLJIT_D_ORDERED | SLJIT_SINGLE_OP)
|
||||||
|
|
||||||
|
/* Unconditional jump types. */
|
||||||
#define SLJIT_JUMP 22
|
#define SLJIT_JUMP 22
|
||||||
#define SLJIT_FAST_CALL 23
|
#define SLJIT_FAST_CALL 23
|
||||||
#define SLJIT_CALL0 24
|
#define SLJIT_CALL0 24
|
||||||
@ -969,7 +1020,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compi
|
|||||||
#define SLJIT_REWRITABLE_JUMP 0x1000
|
#define SLJIT_REWRITABLE_JUMP 0x1000
|
||||||
|
|
||||||
/* Emit a jump instruction. The destination is not set, only the type of the jump.
|
/* Emit a jump instruction. The destination is not set, only the type of the jump.
|
||||||
type must be between SLJIT_C_EQUAL and SLJIT_CALL3
|
type must be between SLJIT_EQUAL and SLJIT_CALL3
|
||||||
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. */
|
||||||
@ -978,10 +1029,10 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile
|
|||||||
/* 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
|
||||||
appropriate flags) followed by a sljit_emit_jump. However some
|
appropriate flags) followed by a sljit_emit_jump. However some
|
||||||
architectures (i.e: MIPS) may employ special optimizations here. It is
|
architectures (i.e: ARM64 or MIPS) may employ special optimizations here.
|
||||||
suggested to use this comparison form when appropriate.
|
It is suggested to use this comparison form when appropriate.
|
||||||
type must be between SLJIT_C_EQUAL and SLJIT_C_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 or SLJIT_INT_OP
|
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_si type,
|
||||||
sljit_si src1, sljit_sw src1w,
|
sljit_si src1, sljit_sw src1w,
|
||||||
@ -992,11 +1043,11 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler
|
|||||||
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_C_FLOAT_EQUAL and SLJIT_C_FLOAT_ORDERED
|
type must be between SLJIT_D_EQUAL and SLJIT_S_ORDERED
|
||||||
type can be combined (or'ed) with SLJIT_REWRITABLE_JUMP and SLJIT_SINGLE_OP
|
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
|
||||||
type <= SLJIT_C_FLOAT_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_si type,
|
||||||
sljit_si src1, sljit_sw src1w,
|
sljit_si src1, sljit_sw src1w,
|
||||||
sljit_si src2, sljit_sw src2w);
|
sljit_si src2, sljit_sw src2w);
|
||||||
@ -1015,8 +1066,8 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_target(struct sljit_jump *jump, sljit_uw
|
|||||||
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_si sljit_emit_ijump(struct sljit_compiler *compiler, sljit_si type, sljit_si 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_C_EQUAL and SLJIT_C_FLOAT_ORDERED. The
|
Type must always be between SLJIT_EQUAL and SLJIT_S_ORDERED. The value
|
||||||
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_SI, SLJIT_MOV_UI:
|
||||||
@ -1058,7 +1109,7 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_consta
|
|||||||
/* --------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------- */
|
||||||
|
|
||||||
#define SLJIT_MAJOR_VERSION 0
|
#define SLJIT_MAJOR_VERSION 0
|
||||||
#define SLJIT_MINOR_VERSION 92
|
#define SLJIT_MINOR_VERSION 93
|
||||||
|
|
||||||
/* 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
|
||||||
@ -1104,10 +1155,11 @@ struct sljit_stack {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* Returns NULL if unsuccessful.
|
/* Returns NULL if unsuccessful.
|
||||||
Note: limit and max_limit contains the size for stack allocation
|
Note: limit and max_limit contains the size for stack allocation.
|
||||||
Note: the top field is initialized to base. */
|
Note: the top field is initialized to base.
|
||||||
SLJIT_API_FUNC_ATTRIBUTE struct sljit_stack* SLJIT_CALL sljit_allocate_stack(sljit_uw limit, sljit_uw max_limit);
|
Note: see sljit_create_compiler for the explanation of allocator_data. */
|
||||||
SLJIT_API_FUNC_ATTRIBUTE void SLJIT_CALL sljit_free_stack(struct sljit_stack* stack);
|
SLJIT_API_FUNC_ATTRIBUTE struct sljit_stack* SLJIT_CALL sljit_allocate_stack(sljit_uw limit, sljit_uw max_limit, void *allocator_data);
|
||||||
|
SLJIT_API_FUNC_ATTRIBUTE void SLJIT_CALL sljit_free_stack(struct sljit_stack *stack, void *allocator_data);
|
||||||
|
|
||||||
/* Can be used to increase (allocate) or decrease (free) the memory area.
|
/* Can be used to increase (allocate) or decrease (free) the memory area.
|
||||||
Returns with a non-zero value if unsuccessful. If new_limit is greater than
|
Returns with a non-zero value if unsuccessful. If new_limit is greater than
|
||||||
@ -1115,7 +1167,7 @@ SLJIT_API_FUNC_ATTRIBUTE void SLJIT_CALL sljit_free_stack(struct sljit_stack* st
|
|||||||
since the growth ratio can be added to the current limit, and sljit_stack_resize
|
since the growth ratio can be added to the current limit, and sljit_stack_resize
|
||||||
will do all the necessary checks. The fields of the stack are not changed if
|
will do all the necessary checks. The fields of the stack are not changed if
|
||||||
sljit_stack_resize fails. */
|
sljit_stack_resize fails. */
|
||||||
SLJIT_API_FUNC_ATTRIBUTE sljit_sw SLJIT_CALL sljit_stack_resize(struct sljit_stack* stack, sljit_uw new_limit);
|
SLJIT_API_FUNC_ATTRIBUTE sljit_sw SLJIT_CALL sljit_stack_resize(struct sljit_stack *stack, sljit_uw new_limit);
|
||||||
|
|
||||||
#endif /* (defined SLJIT_UTIL_STACK && SLJIT_UTIL_STACK) */
|
#endif /* (defined SLJIT_UTIL_STACK && SLJIT_UTIL_STACK) */
|
||||||
|
|
||||||
|
@ -315,11 +315,13 @@ struct future_patch {
|
|||||||
sljit_si value;
|
sljit_si value;
|
||||||
};
|
};
|
||||||
|
|
||||||
static SLJIT_INLINE sljit_si resolve_const_pool_index(struct future_patch **first_patch, sljit_uw cpool_current_index, sljit_uw *cpool_start_address, sljit_uw *buf_ptr)
|
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)
|
||||||
{
|
{
|
||||||
sljit_si value;
|
sljit_si value;
|
||||||
struct future_patch *curr_patch, *prev_patch;
|
struct future_patch *curr_patch, *prev_patch;
|
||||||
|
|
||||||
|
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_si)cpool_start_address[cpool_current_index];
|
||||||
@ -337,7 +339,7 @@ static SLJIT_INLINE sljit_si resolve_const_pool_index(struct future_patch **firs
|
|||||||
prev_patch->next = curr_patch->next;
|
prev_patch->next = curr_patch->next;
|
||||||
else
|
else
|
||||||
*first_patch = curr_patch->next;
|
*first_patch = curr_patch->next;
|
||||||
SLJIT_FREE(curr_patch);
|
SLJIT_FREE(curr_patch, compiler->allocator_data);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
prev_patch = curr_patch;
|
prev_patch = curr_patch;
|
||||||
@ -347,12 +349,12 @@ static SLJIT_INLINE sljit_si resolve_const_pool_index(struct future_patch **firs
|
|||||||
|
|
||||||
if (value >= 0) {
|
if (value >= 0) {
|
||||||
if ((sljit_uw)value > cpool_current_index) {
|
if ((sljit_uw)value > cpool_current_index) {
|
||||||
curr_patch = (struct future_patch*)SLJIT_MALLOC(sizeof(struct future_patch));
|
curr_patch = (struct future_patch*)SLJIT_MALLOC(sizeof(struct future_patch), compiler->allocator_data);
|
||||||
if (!curr_patch) {
|
if (!curr_patch) {
|
||||||
while (*first_patch) {
|
while (*first_patch) {
|
||||||
curr_patch = *first_patch;
|
curr_patch = *first_patch;
|
||||||
*first_patch = (*first_patch)->next;
|
*first_patch = (*first_patch)->next;
|
||||||
SLJIT_FREE(curr_patch);
|
SLJIT_FREE(curr_patch, compiler->allocator_data);
|
||||||
}
|
}
|
||||||
return SLJIT_ERR_ALLOC_FAILED;
|
return SLJIT_ERR_ALLOC_FAILED;
|
||||||
}
|
}
|
||||||
@ -574,7 +576,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
|
|||||||
struct sljit_const *const_;
|
struct sljit_const *const_;
|
||||||
|
|
||||||
CHECK_ERROR_PTR();
|
CHECK_ERROR_PTR();
|
||||||
check_sljit_generate_code(compiler);
|
CHECK_PTR(check_sljit_generate_code(compiler));
|
||||||
reverse_buf(compiler);
|
reverse_buf(compiler);
|
||||||
|
|
||||||
/* Second code generation pass. */
|
/* Second code generation pass. */
|
||||||
@ -623,7 +625,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
|
|||||||
cpool_skip_alignment--;
|
cpool_skip_alignment--;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (SLJIT_UNLIKELY(resolve_const_pool_index(&first_patch, cpool_current_index, cpool_start_address, buf_ptr))) {
|
if (SLJIT_UNLIKELY(resolve_const_pool_index(compiler, &first_patch, cpool_current_index, cpool_start_address, buf_ptr))) {
|
||||||
SLJIT_FREE_EXEC(code);
|
SLJIT_FREE_EXEC(code);
|
||||||
compiler->error = SLJIT_ERR_ALLOC_FAILED;
|
compiler->error = SLJIT_ERR_ALLOC_FAILED;
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -713,7 +715,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
|
|||||||
buf_end = buf_ptr + compiler->cpool_fill;
|
buf_end = buf_ptr + compiler->cpool_fill;
|
||||||
cpool_current_index = 0;
|
cpool_current_index = 0;
|
||||||
while (buf_ptr < buf_end) {
|
while (buf_ptr < buf_end) {
|
||||||
if (SLJIT_UNLIKELY(resolve_const_pool_index(&first_patch, cpool_current_index, cpool_start_address, buf_ptr))) {
|
if (SLJIT_UNLIKELY(resolve_const_pool_index(compiler, &first_patch, cpool_current_index, cpool_start_address, buf_ptr))) {
|
||||||
SLJIT_FREE_EXEC(code);
|
SLJIT_FREE_EXEC(code);
|
||||||
compiler->error = SLJIT_ERR_ALLOC_FAILED;
|
compiler->error = SLJIT_ERR_ALLOC_FAILED;
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -831,16 +833,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
|
|||||||
sljit_uw push;
|
sljit_uw push;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
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);
|
||||||
compiler->options = options;
|
|
||||||
compiler->scratches = scratches;
|
|
||||||
compiler->saveds = saveds;
|
|
||||||
compiler->fscratches = fscratches;
|
|
||||||
compiler->fsaveds = fsaveds;
|
|
||||||
#if (defined SLJIT_DEBUG && SLJIT_DEBUG)
|
|
||||||
compiler->logical_local_size = local_size;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Push saved registers, temporary registers
|
/* Push saved registers, temporary registers
|
||||||
stmdb sp!, {..., lr} */
|
stmdb sp!, {..., lr} */
|
||||||
@ -872,26 +866,19 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
|
|||||||
return SLJIT_SUCCESS;
|
return SLJIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
SLJIT_API_FUNC_ATTRIBUTE void sljit_set_context(struct sljit_compiler *compiler,
|
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_set_context(struct sljit_compiler *compiler,
|
||||||
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds,
|
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds,
|
||||||
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size)
|
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size)
|
||||||
{
|
{
|
||||||
sljit_si size;
|
sljit_si size;
|
||||||
|
|
||||||
CHECK_ERROR_VOID();
|
CHECK_ERROR();
|
||||||
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));
|
||||||
|
set_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size);
|
||||||
compiler->options = options;
|
|
||||||
compiler->scratches = scratches;
|
|
||||||
compiler->saveds = saveds;
|
|
||||||
compiler->fscratches = fscratches;
|
|
||||||
compiler->fsaveds = fsaveds;
|
|
||||||
#if (defined SLJIT_DEBUG && SLJIT_DEBUG)
|
|
||||||
compiler->logical_local_size = local_size;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
size = GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1);
|
size = GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1);
|
||||||
compiler->local_size = ((size + local_size + 7) & ~7) - size;
|
compiler->local_size = ((size + local_size + 7) & ~7) - size;
|
||||||
|
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_si sljit_emit_return(struct sljit_compiler *compiler, sljit_si op, sljit_si src, sljit_sw srcw)
|
||||||
@ -900,7 +887,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compi
|
|||||||
sljit_uw pop;
|
sljit_uw pop;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_return(compiler, op, src, srcw);
|
CHECK(check_sljit_emit_return(compiler, op, src, srcw));
|
||||||
|
|
||||||
FAIL_IF(emit_mov_before_return(compiler, op, src, srcw));
|
FAIL_IF(emit_mov_before_return(compiler, op, src, srcw));
|
||||||
|
|
||||||
@ -1820,7 +1807,7 @@ extern int __aeabi_idivmod(int numerator, int denominator);
|
|||||||
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler, sljit_si op)
|
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler, sljit_si op)
|
||||||
{
|
{
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_op0(compiler, op);
|
CHECK(check_sljit_emit_op0(compiler, op));
|
||||||
|
|
||||||
op = GET_OPCODE(op);
|
op = GET_OPCODE(op);
|
||||||
switch (op) {
|
switch (op) {
|
||||||
@ -1830,29 +1817,29 @@ 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_UMUL:
|
case SLJIT_LUMUL:
|
||||||
case SLJIT_SMUL:
|
case SLJIT_LSMUL:
|
||||||
#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_UMUL ? UMULL : SMULL)
|
return push_inst(compiler, (op == SLJIT_LUMUL ? 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_UMUL ? UMULL : SMULL)
|
return push_inst(compiler, (op == SLJIT_LUMUL ? 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_UDIV:
|
case SLJIT_LUDIV:
|
||||||
case SLJIT_SDIV:
|
case SLJIT_LSDIV:
|
||||||
if (compiler->scratches >= 3)
|
if (compiler->scratches >= 3)
|
||||||
FAIL_IF(push_inst(compiler, 0xe52d2008 /* str r2, [sp, #-8]! */));
|
FAIL_IF(push_inst(compiler, 0xe52d2008 /* str 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 == SLJIT_UDIV ? SLJIT_FUNC_OFFSET(__aeabi_uidivmod) : SLJIT_FUNC_OFFSET(__aeabi_idivmod))));
|
(op == SLJIT_LUDIV ? 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
|
||||||
@ -1869,7 +1856,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler
|
|||||||
sljit_si src, sljit_sw srcw)
|
sljit_si src, sljit_sw srcw)
|
||||||
{
|
{
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw);
|
CHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
ADJUST_LOCAL_OFFSET(src, srcw);
|
ADJUST_LOCAL_OFFSET(src, srcw);
|
||||||
|
|
||||||
@ -1914,7 +1901,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler
|
|||||||
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);
|
||||||
|
|
||||||
case SLJIT_NEG:
|
case SLJIT_NEG:
|
||||||
#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) || (defined SLJIT_DEBUG && SLJIT_DEBUG)
|
#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \
|
||||||
|
|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
|
||||||
compiler->skip_checks = 1;
|
compiler->skip_checks = 1;
|
||||||
#endif
|
#endif
|
||||||
return sljit_emit_op2(compiler, SLJIT_SUB | GET_ALL_FLAGS(op), dst, dstw, SLJIT_IMM, 0, src, srcw);
|
return sljit_emit_op2(compiler, SLJIT_SUB | GET_ALL_FLAGS(op), dst, dstw, SLJIT_IMM, 0, src, srcw);
|
||||||
@ -1932,7 +1920,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler
|
|||||||
sljit_si src2, sljit_sw src2w)
|
sljit_si src2, sljit_sw src2w)
|
||||||
{
|
{
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
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));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
ADJUST_LOCAL_OFFSET(src1, src1w);
|
ADJUST_LOCAL_OFFSET(src1, src1w);
|
||||||
ADJUST_LOCAL_OFFSET(src2, src2w);
|
ADJUST_LOCAL_OFFSET(src2, src2w);
|
||||||
@ -1970,13 +1958,13 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler
|
|||||||
|
|
||||||
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_register_index(sljit_si reg)
|
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_register_index(sljit_si reg)
|
||||||
{
|
{
|
||||||
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_si sljit_get_float_register_index(sljit_si reg)
|
||||||
{
|
{
|
||||||
check_sljit_get_float_register_index(reg);
|
CHECK_REG_INDEX(check_sljit_get_float_register_index(reg));
|
||||||
return reg << 1;
|
return reg << 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1984,8 +1972,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_custom(struct sljit_compiler *co
|
|||||||
void *instruction, sljit_si size)
|
void *instruction, sljit_si size)
|
||||||
{
|
{
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_op_custom(compiler, instruction, size);
|
CHECK(check_sljit_emit_op_custom(compiler, instruction, size));
|
||||||
SLJIT_ASSERT(size == 4);
|
|
||||||
|
|
||||||
return push_inst(compiler, *(sljit_uw*)instruction);
|
return push_inst(compiler, *(sljit_uw*)instruction);
|
||||||
}
|
}
|
||||||
@ -2188,7 +2175,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop1(struct sljit_compiler *compile
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch (GET_OPCODE(op)) {
|
switch (GET_OPCODE(op)) {
|
||||||
case SLJIT_MOVD:
|
case SLJIT_DMOV:
|
||||||
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_SINGLE_OP, dst_r, src, 0)));
|
||||||
@ -2196,10 +2183,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop1(struct sljit_compiler *compile
|
|||||||
dst_r = src;
|
dst_r = src;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SLJIT_NEGD:
|
case SLJIT_DNEG:
|
||||||
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_SINGLE_OP, dst_r, src, 0)));
|
||||||
break;
|
break;
|
||||||
case SLJIT_ABSD:
|
case SLJIT_DABS:
|
||||||
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_SINGLE_OP, dst_r, src, 0)));
|
||||||
break;
|
break;
|
||||||
case SLJIT_CONVD_FROMS:
|
case SLJIT_CONVD_FROMS:
|
||||||
@ -2221,7 +2208,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compile
|
|||||||
sljit_si dst_r;
|
sljit_si dst_r;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
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));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
ADJUST_LOCAL_OFFSET(src1, src1w);
|
ADJUST_LOCAL_OFFSET(src1, src1w);
|
||||||
ADJUST_LOCAL_OFFSET(src2, src2w);
|
ADJUST_LOCAL_OFFSET(src2, src2w);
|
||||||
@ -2243,19 +2230,19 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compile
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch (GET_OPCODE(op)) {
|
switch (GET_OPCODE(op)) {
|
||||||
case SLJIT_ADDD:
|
case SLJIT_DADD:
|
||||||
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_SINGLE_OP, dst_r, src2, src1)));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SLJIT_SUBD:
|
case SLJIT_DSUB:
|
||||||
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_SINGLE_OP, dst_r, src2, src1)));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SLJIT_MULD:
|
case SLJIT_DMUL:
|
||||||
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_SINGLE_OP, dst_r, src2, src1)));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SLJIT_DIVD:
|
case SLJIT_DDIV:
|
||||||
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_SINGLE_OP, dst_r, src2, src1)));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -2277,7 +2264,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compile
|
|||||||
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_si sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_si dst, sljit_sw dstw)
|
||||||
{
|
{
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_fast_enter(compiler, dst, dstw);
|
CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
|
|
||||||
/* For UNUSED dst. Uncommon, but possible. */
|
/* For UNUSED dst. Uncommon, but possible. */
|
||||||
@ -2300,7 +2287,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_enter(struct sljit_compiler *c
|
|||||||
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_si sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_si src, sljit_sw srcw)
|
||||||
{
|
{
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_fast_return(compiler, src, srcw);
|
CHECK(check_sljit_emit_fast_return(compiler, src, srcw));
|
||||||
ADJUST_LOCAL_OFFSET(src, srcw);
|
ADJUST_LOCAL_OFFSET(src, srcw);
|
||||||
|
|
||||||
if (FAST_IS_REG(src))
|
if (FAST_IS_REG(src))
|
||||||
@ -2327,53 +2314,54 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_return(struct sljit_compiler *
|
|||||||
static sljit_uw get_cc(sljit_si type)
|
static sljit_uw get_cc(sljit_si type)
|
||||||
{
|
{
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case SLJIT_C_EQUAL:
|
case SLJIT_EQUAL:
|
||||||
case SLJIT_C_MUL_NOT_OVERFLOW:
|
case SLJIT_MUL_NOT_OVERFLOW:
|
||||||
case SLJIT_C_FLOAT_EQUAL:
|
case SLJIT_D_EQUAL:
|
||||||
return 0x00000000;
|
return 0x00000000;
|
||||||
|
|
||||||
case SLJIT_C_NOT_EQUAL:
|
case SLJIT_NOT_EQUAL:
|
||||||
case SLJIT_C_MUL_OVERFLOW:
|
case SLJIT_MUL_OVERFLOW:
|
||||||
case SLJIT_C_FLOAT_NOT_EQUAL:
|
case SLJIT_D_NOT_EQUAL:
|
||||||
return 0x10000000;
|
return 0x10000000;
|
||||||
|
|
||||||
case SLJIT_C_LESS:
|
case SLJIT_LESS:
|
||||||
case SLJIT_C_FLOAT_LESS:
|
case SLJIT_D_LESS:
|
||||||
return 0x30000000;
|
return 0x30000000;
|
||||||
|
|
||||||
case SLJIT_C_GREATER_EQUAL:
|
case SLJIT_GREATER_EQUAL:
|
||||||
case SLJIT_C_FLOAT_GREATER_EQUAL:
|
case SLJIT_D_GREATER_EQUAL:
|
||||||
return 0x20000000;
|
return 0x20000000;
|
||||||
|
|
||||||
case SLJIT_C_GREATER:
|
case SLJIT_GREATER:
|
||||||
case SLJIT_C_FLOAT_GREATER:
|
case SLJIT_D_GREATER:
|
||||||
return 0x80000000;
|
return 0x80000000;
|
||||||
|
|
||||||
case SLJIT_C_LESS_EQUAL:
|
case SLJIT_LESS_EQUAL:
|
||||||
case SLJIT_C_FLOAT_LESS_EQUAL:
|
case SLJIT_D_LESS_EQUAL:
|
||||||
return 0x90000000;
|
return 0x90000000;
|
||||||
|
|
||||||
case SLJIT_C_SIG_LESS:
|
case SLJIT_SIG_LESS:
|
||||||
return 0xb0000000;
|
return 0xb0000000;
|
||||||
|
|
||||||
case SLJIT_C_SIG_GREATER_EQUAL:
|
case SLJIT_SIG_GREATER_EQUAL:
|
||||||
return 0xa0000000;
|
return 0xa0000000;
|
||||||
|
|
||||||
case SLJIT_C_SIG_GREATER:
|
case SLJIT_SIG_GREATER:
|
||||||
return 0xc0000000;
|
return 0xc0000000;
|
||||||
|
|
||||||
case SLJIT_C_SIG_LESS_EQUAL:
|
case SLJIT_SIG_LESS_EQUAL:
|
||||||
return 0xd0000000;
|
return 0xd0000000;
|
||||||
|
|
||||||
case SLJIT_C_OVERFLOW:
|
case SLJIT_OVERFLOW:
|
||||||
case SLJIT_C_FLOAT_UNORDERED:
|
case SLJIT_D_UNORDERED:
|
||||||
return 0x60000000;
|
return 0x60000000;
|
||||||
|
|
||||||
case SLJIT_C_NOT_OVERFLOW:
|
case SLJIT_NOT_OVERFLOW:
|
||||||
case SLJIT_C_FLOAT_ORDERED:
|
case SLJIT_D_ORDERED:
|
||||||
return 0x70000000;
|
return 0x70000000;
|
||||||
|
|
||||||
default: /* SLJIT_JUMP */
|
default:
|
||||||
|
SLJIT_ASSERT(type >= SLJIT_JUMP && type <= SLJIT_CALL3);
|
||||||
return 0xe0000000;
|
return 0xe0000000;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2383,7 +2371,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compi
|
|||||||
struct sljit_label *label;
|
struct sljit_label *label;
|
||||||
|
|
||||||
CHECK_ERROR_PTR();
|
CHECK_ERROR_PTR();
|
||||||
check_sljit_emit_label(compiler);
|
CHECK_PTR(check_sljit_emit_label(compiler));
|
||||||
|
|
||||||
if (compiler->last_label && compiler->last_label->size == compiler->size)
|
if (compiler->last_label && compiler->last_label->size == compiler->size)
|
||||||
return compiler->last_label;
|
return compiler->last_label;
|
||||||
@ -2399,7 +2387,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile
|
|||||||
struct sljit_jump *jump;
|
struct sljit_jump *jump;
|
||||||
|
|
||||||
CHECK_ERROR_PTR();
|
CHECK_ERROR_PTR();
|
||||||
check_sljit_emit_jump(compiler, type);
|
CHECK_PTR(check_sljit_emit_jump(compiler, type));
|
||||||
|
|
||||||
jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
|
jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
|
||||||
PTR_FAIL_IF(!jump);
|
PTR_FAIL_IF(!jump);
|
||||||
@ -2440,7 +2428,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_ijump(struct sljit_compiler *compil
|
|||||||
struct sljit_jump *jump;
|
struct sljit_jump *jump;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_ijump(compiler, type, src, srcw);
|
CHECK(check_sljit_emit_ijump(compiler, type, src, srcw));
|
||||||
ADJUST_LOCAL_OFFSET(src, srcw);
|
ADJUST_LOCAL_OFFSET(src, srcw);
|
||||||
|
|
||||||
/* In ARM, we don't need to touch the arguments. */
|
/* In ARM, we don't need to touch the arguments. */
|
||||||
@ -2481,7 +2469,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *com
|
|||||||
sljit_uw cc, ins;
|
sljit_uw cc, ins;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
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));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
ADJUST_LOCAL_OFFSET(src, srcw);
|
ADJUST_LOCAL_OFFSET(src, srcw);
|
||||||
|
|
||||||
@ -2489,7 +2477,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);
|
||||||
cc = get_cc(type);
|
cc = get_cc(type & 0xff);
|
||||||
dst_r = FAST_IS_REG(dst) ? dst : TMP_REG2;
|
dst_r = FAST_IS_REG(dst) ? dst : TMP_REG2;
|
||||||
|
|
||||||
if (op < SLJIT_ADD) {
|
if (op < SLJIT_ADD) {
|
||||||
@ -2531,7 +2519,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi
|
|||||||
sljit_si reg;
|
sljit_si reg;
|
||||||
|
|
||||||
CHECK_ERROR_PTR();
|
CHECK_ERROR_PTR();
|
||||||
check_sljit_emit_const(compiler, dst, dstw, init_value);
|
CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
|
|
||||||
const_ = (struct sljit_const*)ensure_abuf(compiler, sizeof(struct sljit_const));
|
const_ = (struct sljit_const*)ensure_abuf(compiler, sizeof(struct sljit_const));
|
||||||
|
@ -32,20 +32,19 @@ SLJIT_API_FUNC_ATTRIBUTE SLJIT_CONST char* sljit_get_platform_name(void)
|
|||||||
/* Length of an instruction word */
|
/* Length of an instruction word */
|
||||||
typedef sljit_ui sljit_ins;
|
typedef sljit_ui sljit_ins;
|
||||||
|
|
||||||
#define TMP_ZERO 0
|
#define TMP_ZERO (0)
|
||||||
|
|
||||||
#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)
|
||||||
#define TMP_REG4 (SLJIT_NUMBER_OF_REGISTERS + 5)
|
#define TMP_LR (SLJIT_NUMBER_OF_REGISTERS + 5)
|
||||||
#define TMP_LR (SLJIT_NUMBER_OF_REGISTERS + 6)
|
#define TMP_SP (SLJIT_NUMBER_OF_REGISTERS + 6)
|
||||||
#define TMP_SP (SLJIT_NUMBER_OF_REGISTERS + 7)
|
|
||||||
|
|
||||||
#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 SLJIT_CONST sljit_ub reg_map[SLJIT_NUMBER_OF_REGISTERS + 8] = {
|
||||||
31, 0, 1, 2, 3, 4, 5, 6, 7, 13, 14, 15, 16, 17, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 29, 9, 10, 11, 12, 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
|
||||||
};
|
};
|
||||||
|
|
||||||
#define W_OP (1 << 31)
|
#define W_OP (1 << 31)
|
||||||
@ -220,7 +219,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
|
|||||||
struct sljit_const *const_;
|
struct sljit_const *const_;
|
||||||
|
|
||||||
CHECK_ERROR_PTR();
|
CHECK_ERROR_PTR();
|
||||||
check_sljit_generate_code(compiler);
|
CHECK_PTR(check_sljit_generate_code(compiler));
|
||||||
reverse_buf(compiler);
|
reverse_buf(compiler);
|
||||||
|
|
||||||
code = (sljit_ins*)SLJIT_MALLOC_EXEC(compiler->size * sizeof(sljit_ins));
|
code = (sljit_ins*)SLJIT_MALLOC_EXEC(compiler->size * sizeof(sljit_ins));
|
||||||
@ -730,12 +729,12 @@ static sljit_si emit_op_imm(struct sljit_compiler *compiler, sljit_si flags, slj
|
|||||||
return push_inst(compiler, (MADD ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2) | RT2(TMP_ZERO));
|
return push_inst(compiler, (MADD ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2) | RT2(TMP_ZERO));
|
||||||
if (flags & INT_OP) {
|
if (flags & INT_OP) {
|
||||||
FAIL_IF(push_inst(compiler, SMADDL | RD(dst) | RN(arg1) | RM(arg2) | (31 << 10)));
|
FAIL_IF(push_inst(compiler, SMADDL | RD(dst) | RN(arg1) | RM(arg2) | (31 << 10)));
|
||||||
FAIL_IF(push_inst(compiler, ADD | RD(TMP_REG4) | RN(TMP_ZERO) | RM(dst) | (2 << 22) | (31 << 10)));
|
FAIL_IF(push_inst(compiler, ADD | RD(TMP_LR) | RN(TMP_ZERO) | RM(dst) | (2 << 22) | (31 << 10)));
|
||||||
return push_inst(compiler, SUBS | RD(TMP_ZERO) | RN(TMP_REG4) | RM(dst) | (2 << 22) | (63 << 10));
|
return push_inst(compiler, SUBS | RD(TMP_ZERO) | RN(TMP_LR) | RM(dst) | (2 << 22) | (63 << 10));
|
||||||
}
|
}
|
||||||
FAIL_IF(push_inst(compiler, SMULH | RD(TMP_REG4) | RN(arg1) | RM(arg2)));
|
FAIL_IF(push_inst(compiler, SMULH | RD(TMP_LR) | RN(arg1) | RM(arg2)));
|
||||||
FAIL_IF(push_inst(compiler, MADD | RD(dst) | RN(arg1) | RM(arg2) | RT2(TMP_ZERO)));
|
FAIL_IF(push_inst(compiler, MADD | RD(dst) | RN(arg1) | RM(arg2) | RT2(TMP_ZERO)));
|
||||||
return push_inst(compiler, SUBS | RD(TMP_ZERO) | RN(TMP_REG4) | RM(dst) | (2 << 22) | (63 << 10));
|
return push_inst(compiler, SUBS | RD(TMP_ZERO) | RN(TMP_LR) | RM(dst) | (2 << 22) | (63 << 10));
|
||||||
case SLJIT_AND:
|
case SLJIT_AND:
|
||||||
CHECK_FLAGS(3 << 29);
|
CHECK_FLAGS(3 << 29);
|
||||||
return push_inst(compiler, (AND ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2));
|
return push_inst(compiler, (AND ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2));
|
||||||
@ -976,9 +975,9 @@ static sljit_si getput_arg(struct sljit_compiler *compiler, sljit_si flags, slji
|
|||||||
FAIL_IF(push_inst(compiler, ADD | RD(arg) | RN(arg) | RM(other_r) | (argw << 10)));
|
FAIL_IF(push_inst(compiler, ADD | RD(arg) | RN(arg) | RM(other_r) | (argw << 10)));
|
||||||
return push_inst(compiler, sljit_mem_imm[flags & 0x3] | (shift << 30) | RT(reg) | RN(arg));
|
return push_inst(compiler, sljit_mem_imm[flags & 0x3] | (shift << 30) | RT(reg) | RN(arg));
|
||||||
}
|
}
|
||||||
FAIL_IF(push_inst(compiler, ADD | RD(TMP_REG4) | RN(arg) | RM(other_r) | (argw << 10)));
|
FAIL_IF(push_inst(compiler, ADD | RD(TMP_LR) | RN(arg) | RM(other_r) | (argw << 10)));
|
||||||
FAIL_IF(push_inst(compiler, sljit_mem_imm[flags & 0x3] | (shift << 30) | RT(reg) | RN(TMP_REG4)));
|
FAIL_IF(push_inst(compiler, sljit_mem_imm[flags & 0x3] | (shift << 30) | RT(reg) | RN(TMP_LR)));
|
||||||
return push_inst(compiler, ORR | RD(arg) | RN(TMP_ZERO) | RM(TMP_REG4));
|
return push_inst(compiler, ORR | RD(arg) | RN(TMP_ZERO) | RM(TMP_LR));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (arg & OFFS_REG_MASK) {
|
if (arg & OFFS_REG_MASK) {
|
||||||
@ -1065,41 +1064,33 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
|
|||||||
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds,
|
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds,
|
||||||
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size)
|
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size)
|
||||||
{
|
{
|
||||||
sljit_si i, tmp, offs, prev;
|
sljit_si i, tmp, offs, prev, saved_regs_size;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
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);
|
||||||
|
|
||||||
compiler->options = options;
|
saved_regs_size = GET_SAVED_REGISTERS_SIZE(scratches, saveds, 0);
|
||||||
compiler->scratches = scratches;
|
local_size += saved_regs_size + SLJIT_LOCALS_OFFSET;
|
||||||
compiler->saveds = saveds;
|
local_size = (local_size + 15) & ~0xf;
|
||||||
compiler->fscratches = fscratches;
|
|
||||||
compiler->fsaveds = fsaveds;
|
|
||||||
#if (defined SLJIT_DEBUG && SLJIT_DEBUG)
|
|
||||||
compiler->logical_local_size = local_size;
|
|
||||||
#endif
|
|
||||||
compiler->locals_offset = GET_SAVED_REGISTERS_SIZE(scratches, saveds, 2);
|
|
||||||
local_size = (compiler->locals_offset + local_size + 15) & ~15;
|
|
||||||
compiler->local_size = local_size;
|
compiler->local_size = local_size;
|
||||||
|
|
||||||
if (local_size <= (64 << 3))
|
if (local_size <= (63 * sizeof(sljit_sw))) {
|
||||||
FAIL_IF(push_inst(compiler, STP_PRE | 29 | RT2(TMP_LR)
|
FAIL_IF(push_inst(compiler, STP_PRE | 29 | RT2(TMP_LR)
|
||||||
| RN(TMP_SP) | ((-(local_size >> 3) & 0x7f) << 15)));
|
| RN(TMP_SP) | ((-(local_size >> 3) & 0x7f) << 15)));
|
||||||
else {
|
FAIL_IF(push_inst(compiler, ADDI | RD(SLJIT_SP) | RN(TMP_SP) | (0 << 10)));
|
||||||
local_size -= (64 << 3);
|
offs = (local_size - saved_regs_size) << (15 - 3);
|
||||||
if (local_size > 0xfff) {
|
} else {
|
||||||
FAIL_IF(push_inst(compiler, SUBI | RD(TMP_SP) | RN(TMP_SP) | ((local_size >> 12) << 10) | (1 << 22)));
|
offs = 0 << 15;
|
||||||
local_size &= 0xfff;
|
if (saved_regs_size & 0x8) {
|
||||||
|
offs = 1 << 15;
|
||||||
|
saved_regs_size += sizeof(sljit_sw);
|
||||||
}
|
}
|
||||||
if (local_size)
|
local_size -= saved_regs_size + SLJIT_LOCALS_OFFSET;
|
||||||
FAIL_IF(push_inst(compiler, SUBI | RD(TMP_SP) | RN(TMP_SP) | (local_size << 10)));
|
FAIL_IF(push_inst(compiler, SUBI | RD(TMP_SP) | RN(TMP_SP) | (saved_regs_size << 10)));
|
||||||
FAIL_IF(push_inst(compiler, STP_PRE | 29 | RT2(TMP_LR) | RN(TMP_SP) | (0x40 << 15)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FAIL_IF(push_inst(compiler, ADDI | RD(SLJIT_SP) | RN(TMP_SP)));
|
|
||||||
|
|
||||||
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;
|
||||||
offs = 2 << 15;
|
|
||||||
prev = -1;
|
prev = -1;
|
||||||
for (i = SLJIT_S0; i >= tmp; i--) {
|
for (i = SLJIT_S0; i >= tmp; i--) {
|
||||||
if (prev == -1) {
|
if (prev == -1) {
|
||||||
@ -1124,6 +1115,19 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
|
|||||||
if (prev != -1)
|
if (prev != -1)
|
||||||
FAIL_IF(push_inst(compiler, STRI | RT(prev) | RN(TMP_SP) | (offs >> 5)));
|
FAIL_IF(push_inst(compiler, STRI | RT(prev) | RN(TMP_SP) | (offs >> 5)));
|
||||||
|
|
||||||
|
if (compiler->local_size > (63 * sizeof(sljit_sw))) {
|
||||||
|
/* The local_size is already adjusted by the saved registers. */
|
||||||
|
if (local_size > 0xfff) {
|
||||||
|
FAIL_IF(push_inst(compiler, SUBI | RD(TMP_SP) | RN(TMP_SP) | ((local_size >> 12) << 10) | (1 << 22)));
|
||||||
|
local_size &= 0xfff;
|
||||||
|
}
|
||||||
|
if (local_size)
|
||||||
|
FAIL_IF(push_inst(compiler, SUBI | RD(TMP_SP) | RN(TMP_SP) | (local_size << 10)));
|
||||||
|
FAIL_IF(push_inst(compiler, STP_PRE | 29 | RT2(TMP_LR)
|
||||||
|
| RN(TMP_SP) | ((-(16 >> 3) & 0x7f) << 15)));
|
||||||
|
FAIL_IF(push_inst(compiler, ADDI | RD(SLJIT_SP) | RN(TMP_SP) | (0 << 10)));
|
||||||
|
}
|
||||||
|
|
||||||
if (args >= 1)
|
if (args >= 1)
|
||||||
FAIL_IF(push_inst(compiler, ORR | RD(SLJIT_S0) | RN(TMP_ZERO) | RM(SLJIT_R0)));
|
FAIL_IF(push_inst(compiler, ORR | RD(SLJIT_S0) | RN(TMP_ZERO) | RM(SLJIT_R0)));
|
||||||
if (args >= 2)
|
if (args >= 2)
|
||||||
@ -1134,37 +1138,53 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
|
|||||||
return SLJIT_SUCCESS;
|
return SLJIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
SLJIT_API_FUNC_ATTRIBUTE void sljit_set_context(struct sljit_compiler *compiler,
|
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_set_context(struct sljit_compiler *compiler,
|
||||||
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds,
|
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds,
|
||||||
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size)
|
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size)
|
||||||
{
|
{
|
||||||
CHECK_ERROR_VOID();
|
CHECK_ERROR();
|
||||||
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));
|
||||||
|
set_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size);
|
||||||
|
|
||||||
compiler->options = options;
|
local_size += GET_SAVED_REGISTERS_SIZE(scratches, saveds, 0) + SLJIT_LOCALS_OFFSET;
|
||||||
compiler->scratches = scratches;
|
local_size = (local_size + 15) & ~0xf;
|
||||||
compiler->saveds = saveds;
|
compiler->local_size = local_size;
|
||||||
compiler->fscratches = fscratches;
|
return SLJIT_SUCCESS;
|
||||||
compiler->fsaveds = fsaveds;
|
|
||||||
#if (defined SLJIT_DEBUG && SLJIT_DEBUG)
|
|
||||||
compiler->logical_local_size = local_size;
|
|
||||||
#endif
|
|
||||||
compiler->locals_offset = GET_SAVED_REGISTERS_SIZE(scratches, saveds, 2);
|
|
||||||
compiler->local_size = (compiler->locals_offset + local_size + 15) & ~15;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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_si sljit_emit_return(struct sljit_compiler *compiler, sljit_si op, sljit_si src, sljit_sw srcw)
|
||||||
{
|
{
|
||||||
sljit_si local_size;
|
sljit_si local_size;
|
||||||
sljit_si i, tmp, offs, prev;
|
sljit_si i, tmp, offs, prev, saved_regs_size;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_return(compiler, op, src, srcw);
|
CHECK(check_sljit_emit_return(compiler, op, src, srcw));
|
||||||
|
|
||||||
FAIL_IF(emit_mov_before_return(compiler, op, src, srcw));
|
FAIL_IF(emit_mov_before_return(compiler, op, src, srcw));
|
||||||
|
|
||||||
|
local_size = compiler->local_size;
|
||||||
|
|
||||||
|
saved_regs_size = GET_SAVED_REGISTERS_SIZE(compiler->scratches, compiler->saveds, 0);
|
||||||
|
if (local_size <= (63 * sizeof(sljit_sw)))
|
||||||
|
offs = (local_size - saved_regs_size) << (15 - 3);
|
||||||
|
else {
|
||||||
|
FAIL_IF(push_inst(compiler, LDP_PST | 29 | RT2(TMP_LR)
|
||||||
|
| RN(TMP_SP) | (((16 >> 3) & 0x7f) << 15)));
|
||||||
|
offs = 0 << 15;
|
||||||
|
if (saved_regs_size & 0x8) {
|
||||||
|
offs = 1 << 15;
|
||||||
|
saved_regs_size += sizeof(sljit_sw);
|
||||||
|
}
|
||||||
|
local_size -= saved_regs_size + SLJIT_LOCALS_OFFSET;
|
||||||
|
if (local_size > 0xfff) {
|
||||||
|
FAIL_IF(push_inst(compiler, ADDI | RD(TMP_SP) | RN(TMP_SP) | ((local_size >> 12) << 10) | (1 << 22)));
|
||||||
|
local_size &= 0xfff;
|
||||||
|
}
|
||||||
|
if (local_size)
|
||||||
|
FAIL_IF(push_inst(compiler, ADDI | RD(TMP_SP) | RN(TMP_SP) | (local_size << 10)));
|
||||||
|
}
|
||||||
|
|
||||||
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;
|
||||||
offs = 2 << 15;
|
|
||||||
prev = -1;
|
prev = -1;
|
||||||
for (i = SLJIT_S0; i >= tmp; i--) {
|
for (i = SLJIT_S0; i >= tmp; i--) {
|
||||||
if (prev == -1) {
|
if (prev == -1) {
|
||||||
@ -1189,20 +1209,11 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compi
|
|||||||
if (prev != -1)
|
if (prev != -1)
|
||||||
FAIL_IF(push_inst(compiler, LDRI | RT(prev) | RN(TMP_SP) | (offs >> 5)));
|
FAIL_IF(push_inst(compiler, LDRI | RT(prev) | RN(TMP_SP) | (offs >> 5)));
|
||||||
|
|
||||||
local_size = compiler->local_size;
|
if (compiler->local_size <= (63 * sizeof(sljit_sw))) {
|
||||||
|
|
||||||
if (local_size <= (62 << 3))
|
|
||||||
FAIL_IF(push_inst(compiler, LDP_PST | 29 | RT2(TMP_LR)
|
FAIL_IF(push_inst(compiler, LDP_PST | 29 | RT2(TMP_LR)
|
||||||
| RN(TMP_SP) | (((local_size >> 3) & 0x7f) << 15)));
|
| RN(TMP_SP) | (((local_size >> 3) & 0x7f) << 15)));
|
||||||
else {
|
} else {
|
||||||
FAIL_IF(push_inst(compiler, LDP_PST | 29 | RT2(TMP_LR) | RN(TMP_SP) | (0x3e << 15)));
|
FAIL_IF(push_inst(compiler, ADDI | RD(TMP_SP) | RN(TMP_SP) | (saved_regs_size << 10)));
|
||||||
local_size -= (62 << 3);
|
|
||||||
if (local_size > 0xfff) {
|
|
||||||
FAIL_IF(push_inst(compiler, ADDI | RD(TMP_SP) | RN(TMP_SP) | ((local_size >> 12) << 10) | (1 << 22)));
|
|
||||||
local_size &= 0xfff;
|
|
||||||
}
|
|
||||||
if (local_size)
|
|
||||||
FAIL_IF(push_inst(compiler, ADDI | RD(TMP_SP) | RN(TMP_SP) | (local_size << 10)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FAIL_IF(push_inst(compiler, RET | RN(TMP_LR)));
|
FAIL_IF(push_inst(compiler, RET | RN(TMP_LR)));
|
||||||
@ -1218,7 +1229,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler
|
|||||||
sljit_ins inv_bits = (op & SLJIT_INT_OP) ? (1 << 31) : 0;
|
sljit_ins inv_bits = (op & SLJIT_INT_OP) ? (1 << 31) : 0;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_op0(compiler, op);
|
CHECK(check_sljit_emit_op0(compiler, op));
|
||||||
|
|
||||||
op = GET_OPCODE(op);
|
op = GET_OPCODE(op);
|
||||||
switch (op) {
|
switch (op) {
|
||||||
@ -1226,15 +1237,15 @@ 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_UMUL:
|
case SLJIT_LUMUL:
|
||||||
case SLJIT_SMUL:
|
case SLJIT_LSMUL:
|
||||||
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_SMUL ? SMULH : UMULH) | RD(SLJIT_R1) | RN(TMP_REG1) | RM(SLJIT_R1));
|
return push_inst(compiler, (op == SLJIT_LUMUL ? UMULH : SMULH) | RD(SLJIT_R1) | RN(TMP_REG1) | RM(SLJIT_R1));
|
||||||
case SLJIT_UDIV:
|
case SLJIT_LUDIV:
|
||||||
case SLJIT_SDIV:
|
case SLJIT_LSDIV:
|
||||||
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_SDIV ? SDIV : UDIV) ^ inv_bits) | RD(SLJIT_R0) | RN(SLJIT_R0) | RM(SLJIT_R1)));
|
FAIL_IF(push_inst(compiler, ((op == SLJIT_LUDIV ? 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));
|
||||||
}
|
}
|
||||||
@ -1250,7 +1261,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler
|
|||||||
sljit_si op_flags = GET_ALL_FLAGS(op);
|
sljit_si op_flags = GET_ALL_FLAGS(op);
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw);
|
CHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
ADJUST_LOCAL_OFFSET(src, srcw);
|
ADJUST_LOCAL_OFFSET(src, srcw);
|
||||||
|
|
||||||
@ -1402,7 +1413,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler
|
|||||||
sljit_si dst_r, flags, mem_flags;
|
sljit_si dst_r, flags, mem_flags;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
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));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
ADJUST_LOCAL_OFFSET(src1, src1w);
|
ADJUST_LOCAL_OFFSET(src1, src1w);
|
||||||
ADJUST_LOCAL_OFFSET(src2, src2w);
|
ADJUST_LOCAL_OFFSET(src2, src2w);
|
||||||
@ -1481,13 +1492,13 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler
|
|||||||
|
|
||||||
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_register_index(sljit_si reg)
|
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_register_index(sljit_si reg)
|
||||||
{
|
{
|
||||||
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_si sljit_get_float_register_index(sljit_si reg)
|
||||||
{
|
{
|
||||||
check_sljit_get_float_register_index(reg);
|
CHECK_REG_INDEX(check_sljit_get_float_register_index(reg));
|
||||||
return reg;
|
return reg;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1495,8 +1506,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_custom(struct sljit_compiler *co
|
|||||||
void *instruction, sljit_si size)
|
void *instruction, sljit_si size)
|
||||||
{
|
{
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_op_custom(compiler, instruction, size);
|
CHECK(check_sljit_emit_op_custom(compiler, instruction, size));
|
||||||
SLJIT_ASSERT(size == 4);
|
|
||||||
|
|
||||||
return push_inst(compiler, *(sljit_ins*)instruction);
|
return push_inst(compiler, *(sljit_ins*)instruction);
|
||||||
}
|
}
|
||||||
@ -1662,7 +1672,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop1(struct sljit_compiler *compile
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch (GET_OPCODE(op)) {
|
switch (GET_OPCODE(op)) {
|
||||||
case SLJIT_MOVD:
|
case SLJIT_DMOV:
|
||||||
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)));
|
||||||
@ -1670,10 +1680,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop1(struct sljit_compiler *compile
|
|||||||
dst_r = src;
|
dst_r = src;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SLJIT_NEGD:
|
case SLJIT_DNEG:
|
||||||
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_ABSD:
|
case SLJIT_DABS:
|
||||||
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_CONVD_FROMS:
|
||||||
@ -1695,7 +1705,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compile
|
|||||||
sljit_ins inv_bits = (op & SLJIT_SINGLE_OP) ? (1 << 22) : 0;
|
sljit_ins inv_bits = (op & SLJIT_SINGLE_OP) ? (1 << 22) : 0;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
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));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
ADJUST_LOCAL_OFFSET(src1, src1w);
|
ADJUST_LOCAL_OFFSET(src1, src1w);
|
||||||
ADJUST_LOCAL_OFFSET(src2, src2w);
|
ADJUST_LOCAL_OFFSET(src2, src2w);
|
||||||
@ -1714,16 +1724,16 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compile
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch (GET_OPCODE(op)) {
|
switch (GET_OPCODE(op)) {
|
||||||
case SLJIT_ADDD:
|
case SLJIT_DADD:
|
||||||
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_SUBD:
|
case SLJIT_DSUB:
|
||||||
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_MULD:
|
case SLJIT_DMUL:
|
||||||
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_DIVD:
|
case SLJIT_DDIV:
|
||||||
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;
|
||||||
}
|
}
|
||||||
@ -1740,7 +1750,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compile
|
|||||||
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_si sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_si dst, sljit_sw dstw)
|
||||||
{
|
{
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_fast_enter(compiler, dst, dstw);
|
CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
|
|
||||||
/* For UNUSED dst. Uncommon, but possible. */
|
/* For UNUSED dst. Uncommon, but possible. */
|
||||||
@ -1757,7 +1767,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_enter(struct sljit_compiler *c
|
|||||||
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_si sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_si src, sljit_sw srcw)
|
||||||
{
|
{
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_fast_return(compiler, src, srcw);
|
CHECK(check_sljit_emit_fast_return(compiler, src, srcw));
|
||||||
ADJUST_LOCAL_OFFSET(src, srcw);
|
ADJUST_LOCAL_OFFSET(src, srcw);
|
||||||
|
|
||||||
if (FAST_IS_REG(src))
|
if (FAST_IS_REG(src))
|
||||||
@ -1777,50 +1787,50 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_return(struct sljit_compiler *
|
|||||||
static sljit_uw get_cc(sljit_si type)
|
static sljit_uw get_cc(sljit_si type)
|
||||||
{
|
{
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case SLJIT_C_EQUAL:
|
case SLJIT_EQUAL:
|
||||||
case SLJIT_C_MUL_NOT_OVERFLOW:
|
case SLJIT_MUL_NOT_OVERFLOW:
|
||||||
case SLJIT_C_FLOAT_EQUAL:
|
case SLJIT_D_EQUAL:
|
||||||
return 0x1;
|
return 0x1;
|
||||||
|
|
||||||
case SLJIT_C_NOT_EQUAL:
|
case SLJIT_NOT_EQUAL:
|
||||||
case SLJIT_C_MUL_OVERFLOW:
|
case SLJIT_MUL_OVERFLOW:
|
||||||
case SLJIT_C_FLOAT_NOT_EQUAL:
|
case SLJIT_D_NOT_EQUAL:
|
||||||
return 0x0;
|
return 0x0;
|
||||||
|
|
||||||
case SLJIT_C_LESS:
|
case SLJIT_LESS:
|
||||||
case SLJIT_C_FLOAT_LESS:
|
case SLJIT_D_LESS:
|
||||||
return 0x2;
|
return 0x2;
|
||||||
|
|
||||||
case SLJIT_C_GREATER_EQUAL:
|
case SLJIT_GREATER_EQUAL:
|
||||||
case SLJIT_C_FLOAT_GREATER_EQUAL:
|
case SLJIT_D_GREATER_EQUAL:
|
||||||
return 0x3;
|
return 0x3;
|
||||||
|
|
||||||
case SLJIT_C_GREATER:
|
case SLJIT_GREATER:
|
||||||
case SLJIT_C_FLOAT_GREATER:
|
case SLJIT_D_GREATER:
|
||||||
return 0x9;
|
return 0x9;
|
||||||
|
|
||||||
case SLJIT_C_LESS_EQUAL:
|
case SLJIT_LESS_EQUAL:
|
||||||
case SLJIT_C_FLOAT_LESS_EQUAL:
|
case SLJIT_D_LESS_EQUAL:
|
||||||
return 0x8;
|
return 0x8;
|
||||||
|
|
||||||
case SLJIT_C_SIG_LESS:
|
case SLJIT_SIG_LESS:
|
||||||
return 0xa;
|
return 0xa;
|
||||||
|
|
||||||
case SLJIT_C_SIG_GREATER_EQUAL:
|
case SLJIT_SIG_GREATER_EQUAL:
|
||||||
return 0xb;
|
return 0xb;
|
||||||
|
|
||||||
case SLJIT_C_SIG_GREATER:
|
case SLJIT_SIG_GREATER:
|
||||||
return 0xd;
|
return 0xd;
|
||||||
|
|
||||||
case SLJIT_C_SIG_LESS_EQUAL:
|
case SLJIT_SIG_LESS_EQUAL:
|
||||||
return 0xc;
|
return 0xc;
|
||||||
|
|
||||||
case SLJIT_C_OVERFLOW:
|
case SLJIT_OVERFLOW:
|
||||||
case SLJIT_C_FLOAT_UNORDERED:
|
case SLJIT_D_UNORDERED:
|
||||||
return 0x7;
|
return 0x7;
|
||||||
|
|
||||||
case SLJIT_C_NOT_OVERFLOW:
|
case SLJIT_NOT_OVERFLOW:
|
||||||
case SLJIT_C_FLOAT_ORDERED:
|
case SLJIT_D_ORDERED:
|
||||||
return 0x6;
|
return 0x6;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -1834,7 +1844,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compi
|
|||||||
struct sljit_label *label;
|
struct sljit_label *label;
|
||||||
|
|
||||||
CHECK_ERROR_PTR();
|
CHECK_ERROR_PTR();
|
||||||
check_sljit_emit_label(compiler);
|
CHECK_PTR(check_sljit_emit_label(compiler));
|
||||||
|
|
||||||
if (compiler->last_label && compiler->last_label->size == compiler->size)
|
if (compiler->last_label && compiler->last_label->size == compiler->size)
|
||||||
return compiler->last_label;
|
return compiler->last_label;
|
||||||
@ -1850,7 +1860,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile
|
|||||||
struct sljit_jump *jump;
|
struct sljit_jump *jump;
|
||||||
|
|
||||||
CHECK_ERROR_PTR();
|
CHECK_ERROR_PTR();
|
||||||
check_sljit_emit_jump(compiler, type);
|
CHECK_PTR(check_sljit_emit_jump(compiler, type));
|
||||||
|
|
||||||
jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
|
jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
|
||||||
PTR_FAIL_IF(!jump);
|
PTR_FAIL_IF(!jump);
|
||||||
@ -1877,7 +1887,7 @@ static SLJIT_INLINE struct sljit_jump* emit_cmp_to0(struct sljit_compiler *compi
|
|||||||
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_INT_OP) ? (1 << 31) : 0;
|
||||||
|
|
||||||
SLJIT_ASSERT((type & 0xff) == SLJIT_C_EQUAL || (type & 0xff) == SLJIT_C_NOT_EQUAL);
|
SLJIT_ASSERT((type & 0xff) == SLJIT_EQUAL || (type & 0xff) == SLJIT_NOT_EQUAL);
|
||||||
ADJUST_LOCAL_OFFSET(src, srcw);
|
ADJUST_LOCAL_OFFSET(src, srcw);
|
||||||
|
|
||||||
jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
|
jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
|
||||||
@ -1895,7 +1905,7 @@ static SLJIT_INLINE struct sljit_jump* emit_cmp_to0(struct sljit_compiler *compi
|
|||||||
}
|
}
|
||||||
SLJIT_ASSERT(FAST_IS_REG(src));
|
SLJIT_ASSERT(FAST_IS_REG(src));
|
||||||
|
|
||||||
if ((type & 0xff) == SLJIT_C_EQUAL)
|
if ((type & 0xff) == SLJIT_EQUAL)
|
||||||
inv_bits |= 1 << 24;
|
inv_bits |= 1 << 24;
|
||||||
|
|
||||||
PTR_FAIL_IF(push_inst(compiler, (CBZ ^ inv_bits) | (6 << 5) | RT(src)));
|
PTR_FAIL_IF(push_inst(compiler, (CBZ ^ inv_bits) | (6 << 5) | RT(src)));
|
||||||
@ -1910,7 +1920,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_ijump(struct sljit_compiler *compil
|
|||||||
struct sljit_jump *jump;
|
struct sljit_jump *jump;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_ijump(compiler, type, src, srcw);
|
CHECK(check_sljit_emit_ijump(compiler, type, src, srcw));
|
||||||
ADJUST_LOCAL_OFFSET(src, srcw);
|
ADJUST_LOCAL_OFFSET(src, srcw);
|
||||||
|
|
||||||
/* In ARM, we don't need to touch the arguments. */
|
/* In ARM, we don't need to touch the arguments. */
|
||||||
@ -1941,14 +1951,14 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *com
|
|||||||
sljit_ins cc;
|
sljit_ins cc;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
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));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
ADJUST_LOCAL_OFFSET(src, srcw);
|
ADJUST_LOCAL_OFFSET(src, srcw);
|
||||||
|
|
||||||
if (dst == SLJIT_UNUSED)
|
if (dst == SLJIT_UNUSED)
|
||||||
return SLJIT_SUCCESS;
|
return SLJIT_SUCCESS;
|
||||||
|
|
||||||
cc = get_cc(type);
|
cc = get_cc(type & 0xff);
|
||||||
dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1;
|
dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1;
|
||||||
|
|
||||||
if (GET_OPCODE(op) < SLJIT_ADD) {
|
if (GET_OPCODE(op) < SLJIT_ADD) {
|
||||||
@ -1988,7 +1998,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi
|
|||||||
sljit_si dst_r;
|
sljit_si dst_r;
|
||||||
|
|
||||||
CHECK_ERROR_PTR();
|
CHECK_ERROR_PTR();
|
||||||
check_sljit_emit_const(compiler, dst, dstw, init_value);
|
CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
|
|
||||||
const_ = (struct sljit_const*)ensure_abuf(compiler, sizeof(struct sljit_const));
|
const_ = (struct sljit_const*)ensure_abuf(compiler, sizeof(struct sljit_const));
|
||||||
|
@ -353,7 +353,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
|
|||||||
struct sljit_const *const_;
|
struct sljit_const *const_;
|
||||||
|
|
||||||
CHECK_ERROR_PTR();
|
CHECK_ERROR_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_uh*)SLJIT_MALLOC_EXEC(compiler->size * sizeof(sljit_uh));
|
||||||
@ -1135,16 +1135,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
|
|||||||
sljit_ins push;
|
sljit_ins push;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
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);
|
||||||
compiler->options = options;
|
|
||||||
compiler->scratches = scratches;
|
|
||||||
compiler->saveds = saveds;
|
|
||||||
compiler->fscratches = fscratches;
|
|
||||||
compiler->fsaveds = fsaveds;
|
|
||||||
#if (defined SLJIT_DEBUG && SLJIT_DEBUG)
|
|
||||||
compiler->logical_local_size = local_size;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
push = (1 << 4);
|
push = (1 << 4);
|
||||||
|
|
||||||
@ -1180,26 +1172,19 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
|
|||||||
return SLJIT_SUCCESS;
|
return SLJIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
SLJIT_API_FUNC_ATTRIBUTE void sljit_set_context(struct sljit_compiler *compiler,
|
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_set_context(struct sljit_compiler *compiler,
|
||||||
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds,
|
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds,
|
||||||
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size)
|
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size)
|
||||||
{
|
{
|
||||||
sljit_si size;
|
sljit_si size;
|
||||||
|
|
||||||
CHECK_ERROR_VOID();
|
CHECK_ERROR();
|
||||||
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));
|
||||||
|
set_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size);
|
||||||
compiler->options = options;
|
|
||||||
compiler->scratches = scratches;
|
|
||||||
compiler->saveds = saveds;
|
|
||||||
compiler->fscratches = fscratches;
|
|
||||||
compiler->fsaveds = fsaveds;
|
|
||||||
#if (defined SLJIT_DEBUG && SLJIT_DEBUG)
|
|
||||||
compiler->logical_local_size = local_size;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
size = GET_SAVED_REGISTERS_SIZE(scratches, saveds, 2);
|
size = GET_SAVED_REGISTERS_SIZE(scratches, saveds, 2);
|
||||||
compiler->local_size = ((size + local_size + 7) & ~7) - size;
|
compiler->local_size = ((size + local_size + 7) & ~7) - size;
|
||||||
|
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_si sljit_emit_return(struct sljit_compiler *compiler, sljit_si op, sljit_si src, sljit_sw srcw)
|
||||||
@ -1208,7 +1193,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compi
|
|||||||
sljit_ins pop;
|
sljit_ins pop;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_return(compiler, op, src, srcw);
|
CHECK(check_sljit_emit_return(compiler, op, src, srcw));
|
||||||
|
|
||||||
FAIL_IF(emit_mov_before_return(compiler, op, src, srcw));
|
FAIL_IF(emit_mov_before_return(compiler, op, src, srcw));
|
||||||
|
|
||||||
@ -1255,7 +1240,7 @@ extern int __aeabi_idivmod(int numerator, int denominator);
|
|||||||
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler, sljit_si op)
|
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler, sljit_si op)
|
||||||
{
|
{
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_op0(compiler, op);
|
CHECK(check_sljit_emit_op0(compiler, op));
|
||||||
|
|
||||||
op = GET_OPCODE(op);
|
op = GET_OPCODE(op);
|
||||||
switch (op) {
|
switch (op) {
|
||||||
@ -1263,15 +1248,15 @@ 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_UMUL:
|
case SLJIT_LUMUL:
|
||||||
case SLJIT_SMUL:
|
case SLJIT_LSMUL:
|
||||||
return push_inst32(compiler, (op == SLJIT_UMUL ? UMULL : SMULL)
|
return push_inst32(compiler, (op == SLJIT_LUMUL ? 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_UDIV:
|
case SLJIT_LUDIV:
|
||||||
case SLJIT_SDIV:
|
case SLJIT_LSDIV:
|
||||||
if (compiler->scratches >= 4) {
|
if (compiler->scratches >= 4) {
|
||||||
FAIL_IF(push_inst32(compiler, 0xf84d2d04 /* str r2, [sp, #-4]! */));
|
FAIL_IF(push_inst32(compiler, 0xf84d2d04 /* str r2, [sp, #-4]! */));
|
||||||
FAIL_IF(push_inst32(compiler, 0xf84dcd04 /* str ip, [sp, #-4]! */));
|
FAIL_IF(push_inst32(compiler, 0xf84dcd04 /* str ip, [sp, #-4]! */));
|
||||||
@ -1279,7 +1264,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler
|
|||||||
FAIL_IF(push_inst32(compiler, 0xf84d2d08 /* str r2, [sp, #-8]! */));
|
FAIL_IF(push_inst32(compiler, 0xf84d2d08 /* str 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 == SLJIT_UDIV ? SLJIT_FUNC_OFFSET(__aeabi_uidivmod) : SLJIT_FUNC_OFFSET(__aeabi_idivmod))));
|
(op == SLJIT_LUDIV ? 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
|
||||||
@ -1302,7 +1287,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler
|
|||||||
sljit_si op_flags = GET_ALL_FLAGS(op);
|
sljit_si op_flags = GET_ALL_FLAGS(op);
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw);
|
CHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
ADJUST_LOCAL_OFFSET(src, srcw);
|
ADJUST_LOCAL_OFFSET(src, srcw);
|
||||||
|
|
||||||
@ -1395,7 +1380,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (op == SLJIT_NEG) {
|
if (op == SLJIT_NEG) {
|
||||||
#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) || (defined SLJIT_DEBUG && SLJIT_DEBUG)
|
#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \
|
||||||
|
|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
|
||||||
compiler->skip_checks = 1;
|
compiler->skip_checks = 1;
|
||||||
#endif
|
#endif
|
||||||
return sljit_emit_op2(compiler, SLJIT_SUB | op_flags, dst, dstw, SLJIT_IMM, 0, src, srcw);
|
return sljit_emit_op2(compiler, SLJIT_SUB | op_flags, dst, dstw, SLJIT_IMM, 0, src, srcw);
|
||||||
@ -1434,7 +1420,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler
|
|||||||
sljit_si dst_r, flags;
|
sljit_si dst_r, flags;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
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));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
ADJUST_LOCAL_OFFSET(src1, src1w);
|
ADJUST_LOCAL_OFFSET(src1, src1w);
|
||||||
ADJUST_LOCAL_OFFSET(src2, src2w);
|
ADJUST_LOCAL_OFFSET(src2, src2w);
|
||||||
@ -1507,13 +1493,13 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler
|
|||||||
|
|
||||||
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_register_index(sljit_si reg)
|
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_register_index(sljit_si reg)
|
||||||
{
|
{
|
||||||
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_si sljit_get_float_register_index(sljit_si reg)
|
||||||
{
|
{
|
||||||
check_sljit_get_float_register_index(reg);
|
CHECK_REG_INDEX(check_sljit_get_float_register_index(reg));
|
||||||
return reg << 1;
|
return reg << 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1521,8 +1507,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_custom(struct sljit_compiler *co
|
|||||||
void *instruction, sljit_si size)
|
void *instruction, sljit_si size)
|
||||||
{
|
{
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_op_custom(compiler, instruction, size);
|
CHECK(check_sljit_emit_op_custom(compiler, instruction, size));
|
||||||
SLJIT_ASSERT(size == 2 || size == 4);
|
|
||||||
|
|
||||||
if (size == 2)
|
if (size == 2)
|
||||||
return push_inst16(compiler, *(sljit_uh*)instruction);
|
return push_inst16(compiler, *(sljit_uh*)instruction);
|
||||||
@ -1695,7 +1680,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop1(struct sljit_compiler *compile
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch (GET_OPCODE(op)) {
|
switch (GET_OPCODE(op)) {
|
||||||
case SLJIT_MOVD:
|
case SLJIT_DMOV:
|
||||||
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_SINGLE_OP) | DD4(dst_r) | DM4(src)));
|
||||||
@ -1703,10 +1688,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop1(struct sljit_compiler *compile
|
|||||||
dst_r = src;
|
dst_r = src;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SLJIT_NEGD:
|
case SLJIT_DNEG:
|
||||||
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_SINGLE_OP) | DD4(dst_r) | DM4(src)));
|
||||||
break;
|
break;
|
||||||
case SLJIT_ABSD:
|
case SLJIT_DABS:
|
||||||
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_SINGLE_OP) | DD4(dst_r) | DM4(src)));
|
||||||
break;
|
break;
|
||||||
case SLJIT_CONVD_FROMS:
|
case SLJIT_CONVD_FROMS:
|
||||||
@ -1728,7 +1713,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compile
|
|||||||
sljit_si dst_r;
|
sljit_si dst_r;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
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));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
ADJUST_LOCAL_OFFSET(src1, src1w);
|
ADJUST_LOCAL_OFFSET(src1, src1w);
|
||||||
ADJUST_LOCAL_OFFSET(src2, src2w);
|
ADJUST_LOCAL_OFFSET(src2, src2w);
|
||||||
@ -1748,16 +1733,16 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compile
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch (GET_OPCODE(op)) {
|
switch (GET_OPCODE(op)) {
|
||||||
case SLJIT_ADDD:
|
case SLJIT_DADD:
|
||||||
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_SINGLE_OP) | DD4(dst_r) | DN4(src1) | DM4(src2)));
|
||||||
break;
|
break;
|
||||||
case SLJIT_SUBD:
|
case SLJIT_DSUB:
|
||||||
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_SINGLE_OP) | DD4(dst_r) | DN4(src1) | DM4(src2)));
|
||||||
break;
|
break;
|
||||||
case SLJIT_MULD:
|
case SLJIT_DMUL:
|
||||||
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_SINGLE_OP) | DD4(dst_r) | DN4(src1) | DM4(src2)));
|
||||||
break;
|
break;
|
||||||
case SLJIT_DIVD:
|
case SLJIT_DDIV:
|
||||||
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_SINGLE_OP) | DD4(dst_r) | DN4(src1) | DM4(src2)));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1776,7 +1761,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compile
|
|||||||
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_si sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_si dst, sljit_sw dstw)
|
||||||
{
|
{
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_fast_enter(compiler, dst, dstw);
|
CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
|
|
||||||
/* For UNUSED dst. Uncommon, but possible. */
|
/* For UNUSED dst. Uncommon, but possible. */
|
||||||
@ -1799,7 +1784,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_enter(struct sljit_compiler *c
|
|||||||
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_si sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_si src, sljit_sw srcw)
|
||||||
{
|
{
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_fast_return(compiler, src, srcw);
|
CHECK(check_sljit_emit_fast_return(compiler, src, srcw));
|
||||||
ADJUST_LOCAL_OFFSET(src, srcw);
|
ADJUST_LOCAL_OFFSET(src, srcw);
|
||||||
|
|
||||||
if (FAST_IS_REG(src))
|
if (FAST_IS_REG(src))
|
||||||
@ -1826,53 +1811,54 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_return(struct sljit_compiler *
|
|||||||
static sljit_uw get_cc(sljit_si type)
|
static sljit_uw get_cc(sljit_si type)
|
||||||
{
|
{
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case SLJIT_C_EQUAL:
|
case SLJIT_EQUAL:
|
||||||
case SLJIT_C_MUL_NOT_OVERFLOW:
|
case SLJIT_MUL_NOT_OVERFLOW:
|
||||||
case SLJIT_C_FLOAT_EQUAL:
|
case SLJIT_D_EQUAL:
|
||||||
return 0x0;
|
return 0x0;
|
||||||
|
|
||||||
case SLJIT_C_NOT_EQUAL:
|
case SLJIT_NOT_EQUAL:
|
||||||
case SLJIT_C_MUL_OVERFLOW:
|
case SLJIT_MUL_OVERFLOW:
|
||||||
case SLJIT_C_FLOAT_NOT_EQUAL:
|
case SLJIT_D_NOT_EQUAL:
|
||||||
return 0x1;
|
return 0x1;
|
||||||
|
|
||||||
case SLJIT_C_LESS:
|
case SLJIT_LESS:
|
||||||
case SLJIT_C_FLOAT_LESS:
|
case SLJIT_D_LESS:
|
||||||
return 0x3;
|
return 0x3;
|
||||||
|
|
||||||
case SLJIT_C_GREATER_EQUAL:
|
case SLJIT_GREATER_EQUAL:
|
||||||
case SLJIT_C_FLOAT_GREATER_EQUAL:
|
case SLJIT_D_GREATER_EQUAL:
|
||||||
return 0x2;
|
return 0x2;
|
||||||
|
|
||||||
case SLJIT_C_GREATER:
|
case SLJIT_GREATER:
|
||||||
case SLJIT_C_FLOAT_GREATER:
|
case SLJIT_D_GREATER:
|
||||||
return 0x8;
|
return 0x8;
|
||||||
|
|
||||||
case SLJIT_C_LESS_EQUAL:
|
case SLJIT_LESS_EQUAL:
|
||||||
case SLJIT_C_FLOAT_LESS_EQUAL:
|
case SLJIT_D_LESS_EQUAL:
|
||||||
return 0x9;
|
return 0x9;
|
||||||
|
|
||||||
case SLJIT_C_SIG_LESS:
|
case SLJIT_SIG_LESS:
|
||||||
return 0xb;
|
return 0xb;
|
||||||
|
|
||||||
case SLJIT_C_SIG_GREATER_EQUAL:
|
case SLJIT_SIG_GREATER_EQUAL:
|
||||||
return 0xa;
|
return 0xa;
|
||||||
|
|
||||||
case SLJIT_C_SIG_GREATER:
|
case SLJIT_SIG_GREATER:
|
||||||
return 0xc;
|
return 0xc;
|
||||||
|
|
||||||
case SLJIT_C_SIG_LESS_EQUAL:
|
case SLJIT_SIG_LESS_EQUAL:
|
||||||
return 0xd;
|
return 0xd;
|
||||||
|
|
||||||
case SLJIT_C_OVERFLOW:
|
case SLJIT_OVERFLOW:
|
||||||
case SLJIT_C_FLOAT_UNORDERED:
|
case SLJIT_D_UNORDERED:
|
||||||
return 0x6;
|
return 0x6;
|
||||||
|
|
||||||
case SLJIT_C_NOT_OVERFLOW:
|
case SLJIT_NOT_OVERFLOW:
|
||||||
case SLJIT_C_FLOAT_ORDERED:
|
case SLJIT_D_ORDERED:
|
||||||
return 0x7;
|
return 0x7;
|
||||||
|
|
||||||
default: /* SLJIT_JUMP */
|
default: /* SLJIT_JUMP */
|
||||||
|
SLJIT_ASSERT_STOP();
|
||||||
return 0xe;
|
return 0xe;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1882,7 +1868,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compi
|
|||||||
struct sljit_label *label;
|
struct sljit_label *label;
|
||||||
|
|
||||||
CHECK_ERROR_PTR();
|
CHECK_ERROR_PTR();
|
||||||
check_sljit_emit_label(compiler);
|
CHECK_PTR(check_sljit_emit_label(compiler));
|
||||||
|
|
||||||
if (compiler->last_label && compiler->last_label->size == compiler->size)
|
if (compiler->last_label && compiler->last_label->size == compiler->size)
|
||||||
return compiler->last_label;
|
return compiler->last_label;
|
||||||
@ -1899,7 +1885,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile
|
|||||||
sljit_ins cc;
|
sljit_ins cc;
|
||||||
|
|
||||||
CHECK_ERROR_PTR();
|
CHECK_ERROR_PTR();
|
||||||
check_sljit_emit_jump(compiler, type);
|
CHECK_PTR(check_sljit_emit_jump(compiler, type));
|
||||||
|
|
||||||
jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
|
jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
|
||||||
PTR_FAIL_IF(!jump);
|
PTR_FAIL_IF(!jump);
|
||||||
@ -1931,7 +1917,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_ijump(struct sljit_compiler *compil
|
|||||||
struct sljit_jump *jump;
|
struct sljit_jump *jump;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_ijump(compiler, type, src, srcw);
|
CHECK(check_sljit_emit_ijump(compiler, type, src, srcw));
|
||||||
ADJUST_LOCAL_OFFSET(src, srcw);
|
ADJUST_LOCAL_OFFSET(src, srcw);
|
||||||
|
|
||||||
/* In ARM, we don't need to touch the arguments. */
|
/* In ARM, we don't need to touch the arguments. */
|
||||||
@ -1963,7 +1949,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *com
|
|||||||
sljit_ins cc, ins;
|
sljit_ins cc, ins;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
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));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
ADJUST_LOCAL_OFFSET(src, srcw);
|
ADJUST_LOCAL_OFFSET(src, srcw);
|
||||||
|
|
||||||
@ -1971,7 +1957,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);
|
||||||
cc = get_cc(type);
|
cc = get_cc(type & 0xff);
|
||||||
dst_r = FAST_IS_REG(dst) ? dst : TMP_REG2;
|
dst_r = FAST_IS_REG(dst) ? dst : TMP_REG2;
|
||||||
|
|
||||||
if (op < SLJIT_ADD) {
|
if (op < SLJIT_ADD) {
|
||||||
@ -2042,7 +2028,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi
|
|||||||
sljit_si dst_r;
|
sljit_si dst_r;
|
||||||
|
|
||||||
CHECK_ERROR_PTR();
|
CHECK_ERROR_PTR();
|
||||||
check_sljit_emit_const(compiler, dst, dstw, init_value);
|
CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
|
|
||||||
const_ = (struct sljit_const*)ensure_abuf(compiler, sizeof(struct sljit_const));
|
const_ = (struct sljit_const*)ensure_abuf(compiler, sizeof(struct sljit_const));
|
||||||
|
@ -371,7 +371,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
|
|||||||
struct sljit_const *const_;
|
struct sljit_const *const_;
|
||||||
|
|
||||||
CHECK_ERROR_PTR();
|
CHECK_ERROR_PTR();
|
||||||
check_sljit_generate_code(compiler);
|
CHECK_PTR(check_sljit_generate_code(compiler));
|
||||||
reverse_buf(compiler);
|
reverse_buf(compiler);
|
||||||
|
|
||||||
code = (sljit_ins*)SLJIT_MALLOC_EXEC(compiler->size * sizeof(sljit_ins));
|
code = (sljit_ins*)SLJIT_MALLOC_EXEC(compiler->size * sizeof(sljit_ins));
|
||||||
@ -546,18 +546,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
|
|||||||
sljit_si i, tmp, offs;
|
sljit_si i, tmp, offs;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
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);
|
||||||
|
|
||||||
compiler->options = options;
|
local_size += GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1) + SLJIT_LOCALS_OFFSET;
|
||||||
compiler->scratches = scratches;
|
|
||||||
compiler->saveds = saveds;
|
|
||||||
compiler->fscratches = fscratches;
|
|
||||||
compiler->fsaveds = fsaveds;
|
|
||||||
#if (defined SLJIT_DEBUG && SLJIT_DEBUG)
|
|
||||||
compiler->logical_local_size = local_size;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
local_size += GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1) + FIXED_LOCALS_OFFSET;
|
|
||||||
#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
|
#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
|
||||||
local_size = (local_size + 15) & ~0xf;
|
local_size = (local_size + 15) & ~0xf;
|
||||||
#else
|
#else
|
||||||
@ -602,28 +594,21 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
|
|||||||
return SLJIT_SUCCESS;
|
return SLJIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
SLJIT_API_FUNC_ATTRIBUTE void sljit_set_context(struct sljit_compiler *compiler,
|
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_set_context(struct sljit_compiler *compiler,
|
||||||
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds,
|
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds,
|
||||||
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size)
|
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size)
|
||||||
{
|
{
|
||||||
CHECK_ERROR_VOID();
|
CHECK_ERROR();
|
||||||
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));
|
||||||
|
set_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size);
|
||||||
|
|
||||||
compiler->options = options;
|
local_size += GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1) + SLJIT_LOCALS_OFFSET;
|
||||||
compiler->scratches = scratches;
|
|
||||||
compiler->saveds = saveds;
|
|
||||||
compiler->fscratches = fscratches;
|
|
||||||
compiler->fsaveds = fsaveds;
|
|
||||||
#if (defined SLJIT_DEBUG && SLJIT_DEBUG)
|
|
||||||
compiler->logical_local_size = local_size;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
local_size += GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1) + FIXED_LOCALS_OFFSET;
|
|
||||||
#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
|
#if (defined SLJIT_CONFIG_MIPS_32 && SLJIT_CONFIG_MIPS_32)
|
||||||
compiler->local_size = (local_size + 15) & ~0xf;
|
compiler->local_size = (local_size + 15) & ~0xf;
|
||||||
#else
|
#else
|
||||||
compiler->local_size = (local_size + 31) & ~0x1f;
|
compiler->local_size = (local_size + 31) & ~0x1f;
|
||||||
#endif
|
#endif
|
||||||
|
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_si sljit_emit_return(struct sljit_compiler *compiler, sljit_si op, sljit_si src, sljit_sw srcw)
|
||||||
@ -632,7 +617,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compi
|
|||||||
sljit_ins base;
|
sljit_ins base;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_return(compiler, op, src, srcw);
|
CHECK(check_sljit_emit_return(compiler, op, src, srcw));
|
||||||
|
|
||||||
FAIL_IF(emit_mov_before_return(compiler, op, src, srcw));
|
FAIL_IF(emit_mov_before_return(compiler, op, src, srcw));
|
||||||
|
|
||||||
@ -1051,7 +1036,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_op0(compiler, op);
|
CHECK(check_sljit_emit_op0(compiler, op));
|
||||||
|
|
||||||
op = GET_OPCODE(op);
|
op = GET_OPCODE(op);
|
||||||
switch (op) {
|
switch (op) {
|
||||||
@ -1059,17 +1044,17 @@ 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_UMUL:
|
case SLJIT_LUMUL:
|
||||||
case SLJIT_SMUL:
|
case SLJIT_LSMUL:
|
||||||
#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_UMUL ? DMULTU : DMULT) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS));
|
FAIL_IF(push_inst(compiler, (op == SLJIT_LUMUL ? DMULTU : DMULT) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS));
|
||||||
#else
|
#else
|
||||||
FAIL_IF(push_inst(compiler, (op == SLJIT_UMUL ? MULTU : MULT) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS));
|
FAIL_IF(push_inst(compiler, (op == SLJIT_LUMUL ? 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_UDIV:
|
case SLJIT_LUDIV:
|
||||||
case SLJIT_SDIV:
|
case SLJIT_LSDIV:
|
||||||
#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));
|
||||||
@ -1077,11 +1062,11 @@ 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 == SLJIT_UDIV ? DIVU : DIV) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS));
|
FAIL_IF(push_inst(compiler, (op == SLJIT_LUDIV ? DIVU : DIV) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS));
|
||||||
else
|
else
|
||||||
FAIL_IF(push_inst(compiler, (op == SLJIT_UDIV ? DDIVU : DDIV) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS));
|
FAIL_IF(push_inst(compiler, (op == SLJIT_LUDIV ? DDIVU : DDIV) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS));
|
||||||
#else
|
#else
|
||||||
FAIL_IF(push_inst(compiler, (op == SLJIT_UDIV ? DIVU : DIV) | S(SLJIT_R0) | T(SLJIT_R1), MOVABLE_INS));
|
FAIL_IF(push_inst(compiler, (op == SLJIT_LUDIV ? 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)));
|
||||||
@ -1102,7 +1087,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw);
|
CHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
ADJUST_LOCAL_OFFSET(src, srcw);
|
ADJUST_LOCAL_OFFSET(src, srcw);
|
||||||
|
|
||||||
@ -1204,7 +1189,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
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));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
ADJUST_LOCAL_OFFSET(src1, src1w);
|
ADJUST_LOCAL_OFFSET(src1, src1w);
|
||||||
ADJUST_LOCAL_OFFSET(src2, src2w);
|
ADJUST_LOCAL_OFFSET(src2, src2w);
|
||||||
@ -1262,13 +1247,13 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler
|
|||||||
|
|
||||||
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_register_index(sljit_si reg)
|
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_register_index(sljit_si reg)
|
||||||
{
|
{
|
||||||
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_si sljit_get_float_register_index(sljit_si reg)
|
||||||
{
|
{
|
||||||
check_sljit_get_float_register_index(reg);
|
CHECK_REG_INDEX(check_sljit_get_float_register_index(reg));
|
||||||
return reg << 1;
|
return reg << 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1276,8 +1261,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_custom(struct sljit_compiler *co
|
|||||||
void *instruction, sljit_si size)
|
void *instruction, sljit_si size)
|
||||||
{
|
{
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_op_custom(compiler, instruction, size);
|
CHECK(check_sljit_emit_op_custom(compiler, instruction, size));
|
||||||
SLJIT_ASSERT(size == 4);
|
|
||||||
|
|
||||||
return push_inst(compiler, *(sljit_ins*)instruction, UNMOVABLE_INS);
|
return push_inst(compiler, *(sljit_ins*)instruction, UNMOVABLE_INS);
|
||||||
}
|
}
|
||||||
@ -1438,7 +1422,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_MOVD:
|
case SLJIT_DMOV:
|
||||||
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));
|
||||||
@ -1446,10 +1430,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop1(struct sljit_compiler *compile
|
|||||||
dst_r = src;
|
dst_r = src;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SLJIT_NEGD:
|
case SLJIT_DNEG:
|
||||||
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_ABSD:
|
case SLJIT_DABS:
|
||||||
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_CONVD_FROMS:
|
||||||
@ -1471,7 +1455,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compile
|
|||||||
sljit_si dst_r, flags = 0;
|
sljit_si dst_r, flags = 0;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
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));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
ADJUST_LOCAL_OFFSET(src1, src1w);
|
ADJUST_LOCAL_OFFSET(src1, src1w);
|
||||||
ADJUST_LOCAL_OFFSET(src2, src2w);
|
ADJUST_LOCAL_OFFSET(src2, src2w);
|
||||||
@ -1522,19 +1506,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_ADDD:
|
case SLJIT_DADD:
|
||||||
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_SUBD:
|
case SLJIT_DSUB:
|
||||||
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_MULD:
|
case SLJIT_DMUL:
|
||||||
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_DIVD:
|
case SLJIT_DDIV:
|
||||||
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;
|
||||||
}
|
}
|
||||||
@ -1552,7 +1536,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compile
|
|||||||
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_si sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_si dst, sljit_sw dstw)
|
||||||
{
|
{
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_fast_enter(compiler, dst, dstw);
|
CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
|
|
||||||
/* For UNUSED dst. Uncommon, but possible. */
|
/* For UNUSED dst. Uncommon, but possible. */
|
||||||
@ -1569,7 +1553,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_enter(struct sljit_compiler *c
|
|||||||
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_si sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_si src, sljit_sw srcw)
|
||||||
{
|
{
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_fast_return(compiler, src, srcw);
|
CHECK(check_sljit_emit_fast_return(compiler, src, srcw));
|
||||||
ADJUST_LOCAL_OFFSET(src, srcw);
|
ADJUST_LOCAL_OFFSET(src, srcw);
|
||||||
|
|
||||||
if (FAST_IS_REG(src))
|
if (FAST_IS_REG(src))
|
||||||
@ -1592,7 +1576,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compi
|
|||||||
struct sljit_label *label;
|
struct sljit_label *label;
|
||||||
|
|
||||||
CHECK_ERROR_PTR();
|
CHECK_ERROR_PTR();
|
||||||
check_sljit_emit_label(compiler);
|
CHECK_PTR(check_sljit_emit_label(compiler));
|
||||||
|
|
||||||
if (compiler->last_label && compiler->last_label->size == compiler->size)
|
if (compiler->last_label && compiler->last_label->size == compiler->size)
|
||||||
return compiler->last_label;
|
return compiler->last_label;
|
||||||
@ -1638,7 +1622,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile
|
|||||||
sljit_si delay_check = UNMOVABLE_INS;
|
sljit_si delay_check = UNMOVABLE_INS;
|
||||||
|
|
||||||
CHECK_ERROR_PTR();
|
CHECK_ERROR_PTR();
|
||||||
check_sljit_emit_jump(compiler, type);
|
CHECK_PTR(check_sljit_emit_jump(compiler, type));
|
||||||
|
|
||||||
jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
|
jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
|
||||||
PTR_FAIL_IF(!jump);
|
PTR_FAIL_IF(!jump);
|
||||||
@ -1646,54 +1630,54 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile
|
|||||||
type &= 0xff;
|
type &= 0xff;
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case SLJIT_C_EQUAL:
|
case SLJIT_EQUAL:
|
||||||
case SLJIT_C_FLOAT_NOT_EQUAL:
|
case SLJIT_D_NOT_EQUAL:
|
||||||
BR_NZ(EQUAL_FLAG);
|
BR_NZ(EQUAL_FLAG);
|
||||||
break;
|
break;
|
||||||
case SLJIT_C_NOT_EQUAL:
|
case SLJIT_NOT_EQUAL:
|
||||||
case SLJIT_C_FLOAT_EQUAL:
|
case SLJIT_D_EQUAL:
|
||||||
BR_Z(EQUAL_FLAG);
|
BR_Z(EQUAL_FLAG);
|
||||||
break;
|
break;
|
||||||
case SLJIT_C_LESS:
|
case SLJIT_LESS:
|
||||||
case SLJIT_C_FLOAT_LESS:
|
case SLJIT_D_LESS:
|
||||||
BR_Z(ULESS_FLAG);
|
BR_Z(ULESS_FLAG);
|
||||||
break;
|
break;
|
||||||
case SLJIT_C_GREATER_EQUAL:
|
case SLJIT_GREATER_EQUAL:
|
||||||
case SLJIT_C_FLOAT_GREATER_EQUAL:
|
case SLJIT_D_GREATER_EQUAL:
|
||||||
BR_NZ(ULESS_FLAG);
|
BR_NZ(ULESS_FLAG);
|
||||||
break;
|
break;
|
||||||
case SLJIT_C_GREATER:
|
case SLJIT_GREATER:
|
||||||
case SLJIT_C_FLOAT_GREATER:
|
case SLJIT_D_GREATER:
|
||||||
BR_Z(UGREATER_FLAG);
|
BR_Z(UGREATER_FLAG);
|
||||||
break;
|
break;
|
||||||
case SLJIT_C_LESS_EQUAL:
|
case SLJIT_LESS_EQUAL:
|
||||||
case SLJIT_C_FLOAT_LESS_EQUAL:
|
case SLJIT_D_LESS_EQUAL:
|
||||||
BR_NZ(UGREATER_FLAG);
|
BR_NZ(UGREATER_FLAG);
|
||||||
break;
|
break;
|
||||||
case SLJIT_C_SIG_LESS:
|
case SLJIT_SIG_LESS:
|
||||||
BR_Z(LESS_FLAG);
|
BR_Z(LESS_FLAG);
|
||||||
break;
|
break;
|
||||||
case SLJIT_C_SIG_GREATER_EQUAL:
|
case SLJIT_SIG_GREATER_EQUAL:
|
||||||
BR_NZ(LESS_FLAG);
|
BR_NZ(LESS_FLAG);
|
||||||
break;
|
break;
|
||||||
case SLJIT_C_SIG_GREATER:
|
case SLJIT_SIG_GREATER:
|
||||||
BR_Z(GREATER_FLAG);
|
BR_Z(GREATER_FLAG);
|
||||||
break;
|
break;
|
||||||
case SLJIT_C_SIG_LESS_EQUAL:
|
case SLJIT_SIG_LESS_EQUAL:
|
||||||
BR_NZ(GREATER_FLAG);
|
BR_NZ(GREATER_FLAG);
|
||||||
break;
|
break;
|
||||||
case SLJIT_C_OVERFLOW:
|
case SLJIT_OVERFLOW:
|
||||||
case SLJIT_C_MUL_OVERFLOW:
|
case SLJIT_MUL_OVERFLOW:
|
||||||
BR_Z(OVERFLOW_FLAG);
|
BR_Z(OVERFLOW_FLAG);
|
||||||
break;
|
break;
|
||||||
case SLJIT_C_NOT_OVERFLOW:
|
case SLJIT_NOT_OVERFLOW:
|
||||||
case SLJIT_C_MUL_NOT_OVERFLOW:
|
case SLJIT_MUL_NOT_OVERFLOW:
|
||||||
BR_NZ(OVERFLOW_FLAG);
|
BR_NZ(OVERFLOW_FLAG);
|
||||||
break;
|
break;
|
||||||
case SLJIT_C_FLOAT_UNORDERED:
|
case SLJIT_D_UNORDERED:
|
||||||
BR_F();
|
BR_F();
|
||||||
break;
|
break;
|
||||||
case SLJIT_C_FLOAT_ORDERED:
|
case SLJIT_D_ORDERED:
|
||||||
BR_T();
|
BR_T();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -1755,7 +1739,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler
|
|||||||
sljit_ins inst;
|
sljit_ins inst;
|
||||||
|
|
||||||
CHECK_ERROR_PTR();
|
CHECK_ERROR_PTR();
|
||||||
check_sljit_emit_cmp(compiler, type, src1, src1w, src2, src2w);
|
CHECK_PTR(check_sljit_emit_cmp(compiler, type, src1, src1w, src2, src2w));
|
||||||
ADJUST_LOCAL_OFFSET(src1, src1w);
|
ADJUST_LOCAL_OFFSET(src1, src1w);
|
||||||
ADJUST_LOCAL_OFFSET(src2, src2w);
|
ADJUST_LOCAL_OFFSET(src2, src2w);
|
||||||
|
|
||||||
@ -1776,32 +1760,32 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler
|
|||||||
set_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP);
|
set_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP);
|
||||||
type &= 0xff;
|
type &= 0xff;
|
||||||
|
|
||||||
if (type <= SLJIT_C_NOT_EQUAL) {
|
if (type <= SLJIT_NOT_EQUAL) {
|
||||||
RESOLVE_IMM1();
|
RESOLVE_IMM1();
|
||||||
RESOLVE_IMM2();
|
RESOLVE_IMM2();
|
||||||
jump->flags |= IS_BIT26_COND;
|
jump->flags |= IS_BIT26_COND;
|
||||||
if (compiler->delay_slot == MOVABLE_INS || (compiler->delay_slot != UNMOVABLE_INS && compiler->delay_slot != DR(src1) && compiler->delay_slot != DR(src2)))
|
if (compiler->delay_slot == MOVABLE_INS || (compiler->delay_slot != UNMOVABLE_INS && compiler->delay_slot != DR(src1) && compiler->delay_slot != DR(src2)))
|
||||||
jump->flags |= IS_MOVABLE;
|
jump->flags |= IS_MOVABLE;
|
||||||
PTR_FAIL_IF(push_inst(compiler, (type == SLJIT_C_EQUAL ? BNE : BEQ) | S(src1) | T(src2) | JUMP_LENGTH, UNMOVABLE_INS));
|
PTR_FAIL_IF(push_inst(compiler, (type == SLJIT_EQUAL ? BNE : BEQ) | S(src1) | T(src2) | JUMP_LENGTH, UNMOVABLE_INS));
|
||||||
}
|
}
|
||||||
else if (type >= SLJIT_C_SIG_LESS && (((src1 & SLJIT_IMM) && (src1w == 0)) || ((src2 & SLJIT_IMM) && (src2w == 0)))) {
|
else if (type >= SLJIT_SIG_LESS && (((src1 & SLJIT_IMM) && (src1w == 0)) || ((src2 & SLJIT_IMM) && (src2w == 0)))) {
|
||||||
inst = NOP;
|
inst = NOP;
|
||||||
if ((src1 & SLJIT_IMM) && (src1w == 0)) {
|
if ((src1 & SLJIT_IMM) && (src1w == 0)) {
|
||||||
RESOLVE_IMM2();
|
RESOLVE_IMM2();
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case SLJIT_C_SIG_LESS:
|
case SLJIT_SIG_LESS:
|
||||||
inst = BLEZ;
|
inst = BLEZ;
|
||||||
jump->flags |= IS_BIT26_COND;
|
jump->flags |= IS_BIT26_COND;
|
||||||
break;
|
break;
|
||||||
case SLJIT_C_SIG_GREATER_EQUAL:
|
case SLJIT_SIG_GREATER_EQUAL:
|
||||||
inst = BGTZ;
|
inst = BGTZ;
|
||||||
jump->flags |= IS_BIT26_COND;
|
jump->flags |= IS_BIT26_COND;
|
||||||
break;
|
break;
|
||||||
case SLJIT_C_SIG_GREATER:
|
case SLJIT_SIG_GREATER:
|
||||||
inst = BGEZ;
|
inst = BGEZ;
|
||||||
jump->flags |= IS_BIT16_COND;
|
jump->flags |= IS_BIT16_COND;
|
||||||
break;
|
break;
|
||||||
case SLJIT_C_SIG_LESS_EQUAL:
|
case SLJIT_SIG_LESS_EQUAL:
|
||||||
inst = BLTZ;
|
inst = BLTZ;
|
||||||
jump->flags |= IS_BIT16_COND;
|
jump->flags |= IS_BIT16_COND;
|
||||||
break;
|
break;
|
||||||
@ -1811,19 +1795,19 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler
|
|||||||
else {
|
else {
|
||||||
RESOLVE_IMM1();
|
RESOLVE_IMM1();
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case SLJIT_C_SIG_LESS:
|
case SLJIT_SIG_LESS:
|
||||||
inst = BGEZ;
|
inst = BGEZ;
|
||||||
jump->flags |= IS_BIT16_COND;
|
jump->flags |= IS_BIT16_COND;
|
||||||
break;
|
break;
|
||||||
case SLJIT_C_SIG_GREATER_EQUAL:
|
case SLJIT_SIG_GREATER_EQUAL:
|
||||||
inst = BLTZ;
|
inst = BLTZ;
|
||||||
jump->flags |= IS_BIT16_COND;
|
jump->flags |= IS_BIT16_COND;
|
||||||
break;
|
break;
|
||||||
case SLJIT_C_SIG_GREATER:
|
case SLJIT_SIG_GREATER:
|
||||||
inst = BLEZ;
|
inst = BLEZ;
|
||||||
jump->flags |= IS_BIT26_COND;
|
jump->flags |= IS_BIT26_COND;
|
||||||
break;
|
break;
|
||||||
case SLJIT_C_SIG_LESS_EQUAL:
|
case SLJIT_SIG_LESS_EQUAL:
|
||||||
inst = BGTZ;
|
inst = BGTZ;
|
||||||
jump->flags |= IS_BIT26_COND;
|
jump->flags |= IS_BIT26_COND;
|
||||||
break;
|
break;
|
||||||
@ -1832,29 +1816,29 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_cmp(struct sljit_compiler
|
|||||||
PTR_FAIL_IF(push_inst(compiler, inst | S(src1) | JUMP_LENGTH, UNMOVABLE_INS));
|
PTR_FAIL_IF(push_inst(compiler, inst | S(src1) | JUMP_LENGTH, UNMOVABLE_INS));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (type == SLJIT_C_LESS || type == SLJIT_C_GREATER_EQUAL || type == SLJIT_C_SIG_LESS || type == SLJIT_C_SIG_GREATER_EQUAL) {
|
if (type == SLJIT_LESS || type == SLJIT_GREATER_EQUAL || type == SLJIT_SIG_LESS || type == SLJIT_SIG_GREATER_EQUAL) {
|
||||||
RESOLVE_IMM1();
|
RESOLVE_IMM1();
|
||||||
if ((src2 & SLJIT_IMM) && src2w <= SIMM_MAX && src2w >= SIMM_MIN)
|
if ((src2 & SLJIT_IMM) && src2w <= SIMM_MAX && src2w >= SIMM_MIN)
|
||||||
PTR_FAIL_IF(push_inst(compiler, (type <= SLJIT_C_LESS_EQUAL ? SLTIU : SLTI) | S(src1) | T(TMP_REG1) | IMM(src2w), DR(TMP_REG1)));
|
PTR_FAIL_IF(push_inst(compiler, (type <= SLJIT_LESS_EQUAL ? SLTIU : SLTI) | S(src1) | T(TMP_REG1) | IMM(src2w), DR(TMP_REG1)));
|
||||||
else {
|
else {
|
||||||
RESOLVE_IMM2();
|
RESOLVE_IMM2();
|
||||||
PTR_FAIL_IF(push_inst(compiler, (type <= SLJIT_C_LESS_EQUAL ? SLTU : SLT) | S(src1) | T(src2) | D(TMP_REG1), DR(TMP_REG1)));
|
PTR_FAIL_IF(push_inst(compiler, (type <= SLJIT_LESS_EQUAL ? SLTU : SLT) | S(src1) | T(src2) | D(TMP_REG1), DR(TMP_REG1)));
|
||||||
}
|
}
|
||||||
type = (type == SLJIT_C_LESS || type == SLJIT_C_SIG_LESS) ? SLJIT_C_NOT_EQUAL : SLJIT_C_EQUAL;
|
type = (type == SLJIT_LESS || type == SLJIT_SIG_LESS) ? SLJIT_NOT_EQUAL : SLJIT_EQUAL;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
RESOLVE_IMM2();
|
RESOLVE_IMM2();
|
||||||
if ((src1 & SLJIT_IMM) && src1w <= SIMM_MAX && src1w >= SIMM_MIN)
|
if ((src1 & SLJIT_IMM) && src1w <= SIMM_MAX && src1w >= SIMM_MIN)
|
||||||
PTR_FAIL_IF(push_inst(compiler, (type <= SLJIT_C_LESS_EQUAL ? SLTIU : SLTI) | S(src2) | T(TMP_REG1) | IMM(src1w), DR(TMP_REG1)));
|
PTR_FAIL_IF(push_inst(compiler, (type <= SLJIT_LESS_EQUAL ? SLTIU : SLTI) | S(src2) | T(TMP_REG1) | IMM(src1w), DR(TMP_REG1)));
|
||||||
else {
|
else {
|
||||||
RESOLVE_IMM1();
|
RESOLVE_IMM1();
|
||||||
PTR_FAIL_IF(push_inst(compiler, (type <= SLJIT_C_LESS_EQUAL ? SLTU : SLT) | S(src2) | T(src1) | D(TMP_REG1), DR(TMP_REG1)));
|
PTR_FAIL_IF(push_inst(compiler, (type <= SLJIT_LESS_EQUAL ? SLTU : SLT) | S(src2) | T(src1) | D(TMP_REG1), DR(TMP_REG1)));
|
||||||
}
|
}
|
||||||
type = (type == SLJIT_C_GREATER || type == SLJIT_C_SIG_GREATER) ? SLJIT_C_NOT_EQUAL : SLJIT_C_EQUAL;
|
type = (type == SLJIT_GREATER || type == SLJIT_SIG_GREATER) ? SLJIT_NOT_EQUAL : SLJIT_EQUAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
jump->flags |= IS_BIT26_COND;
|
jump->flags |= IS_BIT26_COND;
|
||||||
PTR_FAIL_IF(push_inst(compiler, (type == SLJIT_C_EQUAL ? BNE : BEQ) | S(TMP_REG1) | TA(0) | JUMP_LENGTH, UNMOVABLE_INS));
|
PTR_FAIL_IF(push_inst(compiler, (type == SLJIT_EQUAL ? BNE : BEQ) | S(TMP_REG1) | TA(0) | JUMP_LENGTH, UNMOVABLE_INS));
|
||||||
}
|
}
|
||||||
|
|
||||||
PTR_FAIL_IF(emit_const(compiler, TMP_REG2, 0));
|
PTR_FAIL_IF(emit_const(compiler, TMP_REG2, 0));
|
||||||
@ -1876,7 +1860,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_fcmp(struct sljit_compile
|
|||||||
sljit_si if_true;
|
sljit_si if_true;
|
||||||
|
|
||||||
CHECK_ERROR_PTR();
|
CHECK_ERROR_PTR();
|
||||||
check_sljit_emit_fcmp(compiler, type, src1, src1w, src2, src2w);
|
CHECK_PTR(check_sljit_emit_fcmp(compiler, type, src1, src1w, src2, src2w));
|
||||||
|
|
||||||
compiler->cache_arg = 0;
|
compiler->cache_arg = 0;
|
||||||
compiler->cache_argw = 0;
|
compiler->cache_argw = 0;
|
||||||
@ -1901,36 +1885,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_C_FLOAT_EQUAL:
|
case SLJIT_D_EQUAL:
|
||||||
inst = C_UEQ_S;
|
inst = C_UEQ_S;
|
||||||
if_true = 1;
|
if_true = 1;
|
||||||
break;
|
break;
|
||||||
case SLJIT_C_FLOAT_NOT_EQUAL:
|
case SLJIT_D_NOT_EQUAL:
|
||||||
inst = C_UEQ_S;
|
inst = C_UEQ_S;
|
||||||
if_true = 0;
|
if_true = 0;
|
||||||
break;
|
break;
|
||||||
case SLJIT_C_FLOAT_LESS:
|
case SLJIT_D_LESS:
|
||||||
inst = C_ULT_S;
|
inst = C_ULT_S;
|
||||||
if_true = 1;
|
if_true = 1;
|
||||||
break;
|
break;
|
||||||
case SLJIT_C_FLOAT_GREATER_EQUAL:
|
case SLJIT_D_GREATER_EQUAL:
|
||||||
inst = C_ULT_S;
|
inst = C_ULT_S;
|
||||||
if_true = 0;
|
if_true = 0;
|
||||||
break;
|
break;
|
||||||
case SLJIT_C_FLOAT_GREATER:
|
case SLJIT_D_GREATER:
|
||||||
inst = C_ULE_S;
|
inst = C_ULE_S;
|
||||||
if_true = 0;
|
if_true = 0;
|
||||||
break;
|
break;
|
||||||
case SLJIT_C_FLOAT_LESS_EQUAL:
|
case SLJIT_D_LESS_EQUAL:
|
||||||
inst = C_ULE_S;
|
inst = C_ULE_S;
|
||||||
if_true = 1;
|
if_true = 1;
|
||||||
break;
|
break;
|
||||||
case SLJIT_C_FLOAT_UNORDERED:
|
case SLJIT_D_UNORDERED:
|
||||||
inst = C_UN_S;
|
inst = C_UN_S;
|
||||||
if_true = 1;
|
if_true = 1;
|
||||||
break;
|
break;
|
||||||
case SLJIT_C_FLOAT_ORDERED:
|
|
||||||
default: /* Make compilers happy. */
|
default: /* Make compilers happy. */
|
||||||
|
SLJIT_ASSERT_STOP();
|
||||||
|
case SLJIT_D_ORDERED:
|
||||||
inst = C_UN_S;
|
inst = C_UN_S;
|
||||||
if_true = 0;
|
if_true = 0;
|
||||||
break;
|
break;
|
||||||
@ -1961,7 +1946,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_ijump(struct sljit_compiler *compil
|
|||||||
struct sljit_jump *jump = NULL;
|
struct sljit_jump *jump = NULL;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_ijump(compiler, type, src, srcw);
|
CHECK(check_sljit_emit_ijump(compiler, type, src, srcw));
|
||||||
ADJUST_LOCAL_OFFSET(src, srcw);
|
ADJUST_LOCAL_OFFSET(src, srcw);
|
||||||
|
|
||||||
if (FAST_IS_REG(src)) {
|
if (FAST_IS_REG(src)) {
|
||||||
@ -2027,7 +2012,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *com
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
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));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
|
|
||||||
if (dst == SLJIT_UNUSED)
|
if (dst == SLJIT_UNUSED)
|
||||||
@ -2049,49 +2034,49 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *com
|
|||||||
srcw = 0;
|
srcw = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (type) {
|
switch (type & 0xff) {
|
||||||
case SLJIT_C_EQUAL:
|
case SLJIT_EQUAL:
|
||||||
case SLJIT_C_NOT_EQUAL:
|
case SLJIT_NOT_EQUAL:
|
||||||
FAIL_IF(push_inst(compiler, SLTIU | SA(EQUAL_FLAG) | TA(sugg_dst_ar) | IMM(1), sugg_dst_ar));
|
FAIL_IF(push_inst(compiler, SLTIU | SA(EQUAL_FLAG) | TA(sugg_dst_ar) | IMM(1), sugg_dst_ar));
|
||||||
dst_ar = sugg_dst_ar;
|
dst_ar = sugg_dst_ar;
|
||||||
break;
|
break;
|
||||||
case SLJIT_C_LESS:
|
case SLJIT_LESS:
|
||||||
case SLJIT_C_GREATER_EQUAL:
|
case SLJIT_GREATER_EQUAL:
|
||||||
case SLJIT_C_FLOAT_LESS:
|
case SLJIT_D_LESS:
|
||||||
case SLJIT_C_FLOAT_GREATER_EQUAL:
|
case SLJIT_D_GREATER_EQUAL:
|
||||||
dst_ar = ULESS_FLAG;
|
dst_ar = ULESS_FLAG;
|
||||||
break;
|
break;
|
||||||
case SLJIT_C_GREATER:
|
case SLJIT_GREATER:
|
||||||
case SLJIT_C_LESS_EQUAL:
|
case SLJIT_LESS_EQUAL:
|
||||||
case SLJIT_C_FLOAT_GREATER:
|
case SLJIT_D_GREATER:
|
||||||
case SLJIT_C_FLOAT_LESS_EQUAL:
|
case SLJIT_D_LESS_EQUAL:
|
||||||
dst_ar = UGREATER_FLAG;
|
dst_ar = UGREATER_FLAG;
|
||||||
break;
|
break;
|
||||||
case SLJIT_C_SIG_LESS:
|
case SLJIT_SIG_LESS:
|
||||||
case SLJIT_C_SIG_GREATER_EQUAL:
|
case SLJIT_SIG_GREATER_EQUAL:
|
||||||
dst_ar = LESS_FLAG;
|
dst_ar = LESS_FLAG;
|
||||||
break;
|
break;
|
||||||
case SLJIT_C_SIG_GREATER:
|
case SLJIT_SIG_GREATER:
|
||||||
case SLJIT_C_SIG_LESS_EQUAL:
|
case SLJIT_SIG_LESS_EQUAL:
|
||||||
dst_ar = GREATER_FLAG;
|
dst_ar = GREATER_FLAG;
|
||||||
break;
|
break;
|
||||||
case SLJIT_C_OVERFLOW:
|
case SLJIT_OVERFLOW:
|
||||||
case SLJIT_C_NOT_OVERFLOW:
|
case SLJIT_NOT_OVERFLOW:
|
||||||
dst_ar = OVERFLOW_FLAG;
|
dst_ar = OVERFLOW_FLAG;
|
||||||
break;
|
break;
|
||||||
case SLJIT_C_MUL_OVERFLOW:
|
case SLJIT_MUL_OVERFLOW:
|
||||||
case SLJIT_C_MUL_NOT_OVERFLOW:
|
case SLJIT_MUL_NOT_OVERFLOW:
|
||||||
FAIL_IF(push_inst(compiler, SLTIU | SA(OVERFLOW_FLAG) | TA(sugg_dst_ar) | IMM(1), sugg_dst_ar));
|
FAIL_IF(push_inst(compiler, SLTIU | SA(OVERFLOW_FLAG) | TA(sugg_dst_ar) | IMM(1), sugg_dst_ar));
|
||||||
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_C_FLOAT_EQUAL:
|
case SLJIT_D_EQUAL:
|
||||||
case SLJIT_C_FLOAT_NOT_EQUAL:
|
case SLJIT_D_NOT_EQUAL:
|
||||||
dst_ar = EQUAL_FLAG;
|
dst_ar = EQUAL_FLAG;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SLJIT_C_FLOAT_UNORDERED:
|
case SLJIT_D_UNORDERED:
|
||||||
case SLJIT_C_FLOAT_ORDERED:
|
case SLJIT_D_ORDERED:
|
||||||
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));
|
||||||
@ -2133,7 +2118,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi
|
|||||||
sljit_si reg;
|
sljit_si reg;
|
||||||
|
|
||||||
CHECK_ERROR_PTR();
|
CHECK_ERROR_PTR();
|
||||||
check_sljit_emit_const(compiler, dst, dstw, init_value);
|
CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
|
|
||||||
const_ = (struct sljit_const*)ensure_abuf(compiler, sizeof(struct sljit_const));
|
const_ = (struct sljit_const*)ensure_abuf(compiler, sizeof(struct sljit_const));
|
||||||
|
@ -329,7 +329,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
|
|||||||
struct sljit_const *const_;
|
struct sljit_const *const_;
|
||||||
|
|
||||||
CHECK_ERROR_PTR();
|
CHECK_ERROR_PTR();
|
||||||
check_sljit_generate_code(compiler);
|
CHECK_PTR(check_sljit_generate_code(compiler));
|
||||||
reverse_buf(compiler);
|
reverse_buf(compiler);
|
||||||
|
|
||||||
#if (defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL)
|
#if (defined SLJIT_INDIRECT_CALL && SLJIT_INDIRECT_CALL)
|
||||||
@ -578,16 +578,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
|
|||||||
sljit_si i, tmp, offs;
|
sljit_si i, tmp, offs;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
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);
|
||||||
compiler->options = options;
|
|
||||||
compiler->scratches = scratches;
|
|
||||||
compiler->saveds = saveds;
|
|
||||||
compiler->fscratches = fscratches;
|
|
||||||
compiler->fsaveds = fsaveds;
|
|
||||||
#if (defined SLJIT_DEBUG && SLJIT_DEBUG)
|
|
||||||
compiler->logical_local_size = local_size;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
FAIL_IF(push_inst(compiler, MFLR | D(0)));
|
FAIL_IF(push_inst(compiler, MFLR | D(0)));
|
||||||
offs = -(sljit_si)(sizeof(sljit_sw));
|
offs = -(sljit_si)(sizeof(sljit_sw));
|
||||||
@ -620,7 +612,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
|
|||||||
if (args >= 3)
|
if (args >= 3)
|
||||||
FAIL_IF(push_inst(compiler, OR | S(SLJIT_R2) | A(SLJIT_S2) | B(SLJIT_R2)));
|
FAIL_IF(push_inst(compiler, OR | S(SLJIT_R2) | A(SLJIT_S2) | B(SLJIT_R2)));
|
||||||
|
|
||||||
local_size += GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1) + FIXED_LOCALS_OFFSET;
|
local_size += GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1) + SLJIT_LOCALS_OFFSET;
|
||||||
local_size = (local_size + 15) & ~0xf;
|
local_size = (local_size + 15) & ~0xf;
|
||||||
compiler->local_size = local_size;
|
compiler->local_size = local_size;
|
||||||
|
|
||||||
@ -643,24 +635,17 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
|
|||||||
return SLJIT_SUCCESS;
|
return SLJIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
SLJIT_API_FUNC_ATTRIBUTE void sljit_set_context(struct sljit_compiler *compiler,
|
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_set_context(struct sljit_compiler *compiler,
|
||||||
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds,
|
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds,
|
||||||
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size)
|
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size)
|
||||||
{
|
{
|
||||||
CHECK_ERROR_VOID();
|
CHECK_ERROR();
|
||||||
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));
|
||||||
|
set_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size);
|
||||||
|
|
||||||
compiler->options = options;
|
local_size += GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1) + SLJIT_LOCALS_OFFSET;
|
||||||
compiler->scratches = scratches;
|
|
||||||
compiler->saveds = saveds;
|
|
||||||
compiler->fscratches = fscratches;
|
|
||||||
compiler->fsaveds = fsaveds;
|
|
||||||
#if (defined SLJIT_DEBUG && SLJIT_DEBUG)
|
|
||||||
compiler->logical_local_size = local_size;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
local_size += GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1) + FIXED_LOCALS_OFFSET;
|
|
||||||
compiler->local_size = (local_size + 15) & ~0xf;
|
compiler->local_size = (local_size + 15) & ~0xf;
|
||||||
|
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_si sljit_emit_return(struct sljit_compiler *compiler, sljit_si op, sljit_si src, sljit_sw srcw)
|
||||||
@ -668,7 +653,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compi
|
|||||||
sljit_si i, tmp, offs;
|
sljit_si i, tmp, offs;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_return(compiler, op, src, srcw);
|
CHECK(check_sljit_emit_return(compiler, op, src, srcw));
|
||||||
|
|
||||||
FAIL_IF(emit_mov_before_return(compiler, op, src, srcw));
|
FAIL_IF(emit_mov_before_return(compiler, op, src, srcw));
|
||||||
|
|
||||||
@ -1265,37 +1250,37 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_op0(compiler, op);
|
CHECK(check_sljit_emit_op0(compiler, op));
|
||||||
|
|
||||||
op = GET_OPCODE(op);
|
op = GET_OPCODE(op);
|
||||||
switch (op) {
|
switch (op) {
|
||||||
case SLJIT_BREAKPOINT:
|
case SLJIT_BREAKPOINT:
|
||||||
case SLJIT_NOP:
|
case SLJIT_NOP:
|
||||||
return push_inst(compiler, NOP);
|
return push_inst(compiler, NOP);
|
||||||
case SLJIT_UMUL:
|
case SLJIT_LUMUL:
|
||||||
case SLJIT_SMUL:
|
case SLJIT_LSMUL:
|
||||||
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_UMUL ? MULHDU : MULHD) | D(SLJIT_R1) | A(TMP_REG1) | B(SLJIT_R1));
|
return push_inst(compiler, (op == SLJIT_LUMUL ? 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_UMUL ? MULHWU : MULHW) | D(SLJIT_R1) | A(TMP_REG1) | B(SLJIT_R1));
|
return push_inst(compiler, (op == SLJIT_LUMUL ? MULHWU : MULHW) | D(SLJIT_R1) | A(TMP_REG1) | B(SLJIT_R1));
|
||||||
#endif
|
#endif
|
||||||
case SLJIT_UDIV:
|
case SLJIT_LUDIV:
|
||||||
case SLJIT_SDIV:
|
case SLJIT_LSDIV:
|
||||||
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)
|
||||||
if (int_op) {
|
if (int_op) {
|
||||||
FAIL_IF(push_inst(compiler, (op == SLJIT_UDIV ? DIVWU : DIVW) | D(SLJIT_R0) | A(TMP_REG1) | B(SLJIT_R1)));
|
FAIL_IF(push_inst(compiler, (op == SLJIT_LUDIV ? DIVWU : DIVW) | D(SLJIT_R0) | A(TMP_REG1) | 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)));
|
||||||
} else {
|
} else {
|
||||||
FAIL_IF(push_inst(compiler, (op == SLJIT_UDIV ? DIVDU : DIVD) | D(SLJIT_R0) | A(TMP_REG1) | B(SLJIT_R1)));
|
FAIL_IF(push_inst(compiler, (op == SLJIT_LUDIV ? DIVDU : DIVD) | D(SLJIT_R0) | A(TMP_REG1) | B(SLJIT_R1)));
|
||||||
FAIL_IF(push_inst(compiler, MULLD | D(SLJIT_R1) | A(SLJIT_R0) | B(SLJIT_R1)));
|
FAIL_IF(push_inst(compiler, MULLD | D(SLJIT_R1) | A(SLJIT_R0) | B(SLJIT_R1)));
|
||||||
}
|
}
|
||||||
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));
|
||||||
#else
|
#else
|
||||||
FAIL_IF(push_inst(compiler, (op == SLJIT_UDIV ? DIVWU : DIVW) | D(SLJIT_R0) | A(TMP_REG1) | B(SLJIT_R1)));
|
FAIL_IF(push_inst(compiler, (op == SLJIT_LUDIV ? DIVWU : DIVW) | D(SLJIT_R0) | A(TMP_REG1) | 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)));
|
||||||
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));
|
||||||
#endif
|
#endif
|
||||||
@ -1315,7 +1300,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler
|
|||||||
sljit_si op_flags = GET_ALL_FLAGS(op);
|
sljit_si op_flags = GET_ALL_FLAGS(op);
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw);
|
CHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
ADJUST_LOCAL_OFFSET(src, srcw);
|
ADJUST_LOCAL_OFFSET(src, srcw);
|
||||||
|
|
||||||
@ -1470,7 +1455,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler
|
|||||||
sljit_si flags = GET_FLAGS(op) ? ALT_SET_FLAGS : 0;
|
sljit_si flags = GET_FLAGS(op) ? ALT_SET_FLAGS : 0;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
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));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
ADJUST_LOCAL_OFFSET(src1, src1w);
|
ADJUST_LOCAL_OFFSET(src1, src1w);
|
||||||
ADJUST_LOCAL_OFFSET(src2, src2w);
|
ADJUST_LOCAL_OFFSET(src2, src2w);
|
||||||
@ -1672,13 +1657,13 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler
|
|||||||
|
|
||||||
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_register_index(sljit_si reg)
|
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_register_index(sljit_si reg)
|
||||||
{
|
{
|
||||||
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_si sljit_get_float_register_index(sljit_si reg)
|
||||||
{
|
{
|
||||||
check_sljit_get_float_register_index(reg);
|
CHECK_REG_INDEX(check_sljit_get_float_register_index(reg));
|
||||||
return reg;
|
return reg;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1686,8 +1671,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_custom(struct sljit_compiler *co
|
|||||||
void *instruction, sljit_si size)
|
void *instruction, sljit_si size)
|
||||||
{
|
{
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_op_custom(compiler, instruction, size);
|
CHECK(check_sljit_emit_op_custom(compiler, instruction, size));
|
||||||
SLJIT_ASSERT(size == 4);
|
|
||||||
|
|
||||||
return push_inst(compiler, *(sljit_ins*)instruction);
|
return push_inst(compiler, *(sljit_ins*)instruction);
|
||||||
}
|
}
|
||||||
@ -1918,7 +1902,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop1(struct sljit_compiler *compile
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* Fall through. */
|
/* Fall through. */
|
||||||
case SLJIT_MOVD:
|
case SLJIT_DMOV:
|
||||||
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)));
|
||||||
@ -1926,10 +1910,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop1(struct sljit_compiler *compile
|
|||||||
dst_r = src;
|
dst_r = src;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SLJIT_NEGD:
|
case SLJIT_DNEG:
|
||||||
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_ABSD:
|
case SLJIT_DABS:
|
||||||
FAIL_IF(push_inst(compiler, FABS | FD(dst_r) | FB(src)));
|
FAIL_IF(push_inst(compiler, FABS | FD(dst_r) | FB(src)));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1947,7 +1931,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compile
|
|||||||
sljit_si dst_r, flags = 0;
|
sljit_si dst_r, flags = 0;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
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));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
ADJUST_LOCAL_OFFSET(src1, src1w);
|
ADJUST_LOCAL_OFFSET(src1, src1w);
|
||||||
ADJUST_LOCAL_OFFSET(src2, src2w);
|
ADJUST_LOCAL_OFFSET(src2, src2w);
|
||||||
@ -1994,19 +1978,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_ADDD:
|
case SLJIT_DADD:
|
||||||
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_SUBD:
|
case SLJIT_DSUB:
|
||||||
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_MULD:
|
case SLJIT_DMUL:
|
||||||
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_DIVD:
|
case SLJIT_DDIV:
|
||||||
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;
|
||||||
}
|
}
|
||||||
@ -2027,7 +2011,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compile
|
|||||||
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_si sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_si dst, sljit_sw dstw)
|
||||||
{
|
{
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_fast_enter(compiler, dst, dstw);
|
CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
|
|
||||||
/* For UNUSED dst. Uncommon, but possible. */
|
/* For UNUSED dst. Uncommon, but possible. */
|
||||||
@ -2045,7 +2029,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_enter(struct sljit_compiler *c
|
|||||||
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_si sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_si src, sljit_sw srcw)
|
||||||
{
|
{
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_fast_return(compiler, src, srcw);
|
CHECK(check_sljit_emit_fast_return(compiler, src, srcw));
|
||||||
ADJUST_LOCAL_OFFSET(src, srcw);
|
ADJUST_LOCAL_OFFSET(src, srcw);
|
||||||
|
|
||||||
if (FAST_IS_REG(src))
|
if (FAST_IS_REG(src))
|
||||||
@ -2069,7 +2053,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compi
|
|||||||
struct sljit_label *label;
|
struct sljit_label *label;
|
||||||
|
|
||||||
CHECK_ERROR_PTR();
|
CHECK_ERROR_PTR();
|
||||||
check_sljit_emit_label(compiler);
|
CHECK_PTR(check_sljit_emit_label(compiler));
|
||||||
|
|
||||||
if (compiler->last_label && compiler->last_label->size == compiler->size)
|
if (compiler->last_label && compiler->last_label->size == compiler->size)
|
||||||
return compiler->last_label;
|
return compiler->last_label;
|
||||||
@ -2083,58 +2067,58 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compi
|
|||||||
static sljit_ins get_bo_bi_flags(sljit_si type)
|
static sljit_ins get_bo_bi_flags(sljit_si type)
|
||||||
{
|
{
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case SLJIT_C_EQUAL:
|
case SLJIT_EQUAL:
|
||||||
return (12 << 21) | (2 << 16);
|
return (12 << 21) | (2 << 16);
|
||||||
|
|
||||||
case SLJIT_C_NOT_EQUAL:
|
case SLJIT_NOT_EQUAL:
|
||||||
return (4 << 21) | (2 << 16);
|
return (4 << 21) | (2 << 16);
|
||||||
|
|
||||||
case SLJIT_C_LESS:
|
case SLJIT_LESS:
|
||||||
case SLJIT_C_FLOAT_LESS:
|
case SLJIT_D_LESS:
|
||||||
return (12 << 21) | ((4 + 0) << 16);
|
return (12 << 21) | ((4 + 0) << 16);
|
||||||
|
|
||||||
case SLJIT_C_GREATER_EQUAL:
|
case SLJIT_GREATER_EQUAL:
|
||||||
case SLJIT_C_FLOAT_GREATER_EQUAL:
|
case SLJIT_D_GREATER_EQUAL:
|
||||||
return (4 << 21) | ((4 + 0) << 16);
|
return (4 << 21) | ((4 + 0) << 16);
|
||||||
|
|
||||||
case SLJIT_C_GREATER:
|
case SLJIT_GREATER:
|
||||||
case SLJIT_C_FLOAT_GREATER:
|
case SLJIT_D_GREATER:
|
||||||
return (12 << 21) | ((4 + 1) << 16);
|
return (12 << 21) | ((4 + 1) << 16);
|
||||||
|
|
||||||
case SLJIT_C_LESS_EQUAL:
|
case SLJIT_LESS_EQUAL:
|
||||||
case SLJIT_C_FLOAT_LESS_EQUAL:
|
case SLJIT_D_LESS_EQUAL:
|
||||||
return (4 << 21) | ((4 + 1) << 16);
|
return (4 << 21) | ((4 + 1) << 16);
|
||||||
|
|
||||||
case SLJIT_C_SIG_LESS:
|
case SLJIT_SIG_LESS:
|
||||||
return (12 << 21) | (0 << 16);
|
return (12 << 21) | (0 << 16);
|
||||||
|
|
||||||
case SLJIT_C_SIG_GREATER_EQUAL:
|
case SLJIT_SIG_GREATER_EQUAL:
|
||||||
return (4 << 21) | (0 << 16);
|
return (4 << 21) | (0 << 16);
|
||||||
|
|
||||||
case SLJIT_C_SIG_GREATER:
|
case SLJIT_SIG_GREATER:
|
||||||
return (12 << 21) | (1 << 16);
|
return (12 << 21) | (1 << 16);
|
||||||
|
|
||||||
case SLJIT_C_SIG_LESS_EQUAL:
|
case SLJIT_SIG_LESS_EQUAL:
|
||||||
return (4 << 21) | (1 << 16);
|
return (4 << 21) | (1 << 16);
|
||||||
|
|
||||||
case SLJIT_C_OVERFLOW:
|
case SLJIT_OVERFLOW:
|
||||||
case SLJIT_C_MUL_OVERFLOW:
|
case SLJIT_MUL_OVERFLOW:
|
||||||
return (12 << 21) | (3 << 16);
|
return (12 << 21) | (3 << 16);
|
||||||
|
|
||||||
case SLJIT_C_NOT_OVERFLOW:
|
case SLJIT_NOT_OVERFLOW:
|
||||||
case SLJIT_C_MUL_NOT_OVERFLOW:
|
case SLJIT_MUL_NOT_OVERFLOW:
|
||||||
return (4 << 21) | (3 << 16);
|
return (4 << 21) | (3 << 16);
|
||||||
|
|
||||||
case SLJIT_C_FLOAT_EQUAL:
|
case SLJIT_D_EQUAL:
|
||||||
return (12 << 21) | ((4 + 2) << 16);
|
return (12 << 21) | ((4 + 2) << 16);
|
||||||
|
|
||||||
case SLJIT_C_FLOAT_NOT_EQUAL:
|
case SLJIT_D_NOT_EQUAL:
|
||||||
return (4 << 21) | ((4 + 2) << 16);
|
return (4 << 21) | ((4 + 2) << 16);
|
||||||
|
|
||||||
case SLJIT_C_FLOAT_UNORDERED:
|
case SLJIT_D_UNORDERED:
|
||||||
return (12 << 21) | ((4 + 3) << 16);
|
return (12 << 21) | ((4 + 3) << 16);
|
||||||
|
|
||||||
case SLJIT_C_FLOAT_ORDERED:
|
case SLJIT_D_ORDERED:
|
||||||
return (4 << 21) | ((4 + 3) << 16);
|
return (4 << 21) | ((4 + 3) << 16);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -2149,7 +2133,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile
|
|||||||
sljit_ins bo_bi_flags;
|
sljit_ins bo_bi_flags;
|
||||||
|
|
||||||
CHECK_ERROR_PTR();
|
CHECK_ERROR_PTR();
|
||||||
check_sljit_emit_jump(compiler, type);
|
CHECK_PTR(check_sljit_emit_jump(compiler, type));
|
||||||
|
|
||||||
bo_bi_flags = get_bo_bi_flags(type & 0xff);
|
bo_bi_flags = get_bo_bi_flags(type & 0xff);
|
||||||
if (!bo_bi_flags)
|
if (!bo_bi_flags)
|
||||||
@ -2181,7 +2165,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_ijump(struct sljit_compiler *compil
|
|||||||
sljit_si src_r;
|
sljit_si src_r;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_ijump(compiler, type, src, srcw);
|
CHECK(check_sljit_emit_ijump(compiler, type, src, srcw));
|
||||||
ADJUST_LOCAL_OFFSET(src, srcw);
|
ADJUST_LOCAL_OFFSET(src, srcw);
|
||||||
|
|
||||||
if (FAST_IS_REG(src)) {
|
if (FAST_IS_REG(src)) {
|
||||||
@ -2236,7 +2220,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *com
|
|||||||
sljit_sw original_dstw = dstw;
|
sljit_sw original_dstw = dstw;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
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));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
|
|
||||||
if (dst == SLJIT_UNUSED)
|
if (dst == SLJIT_UNUSED)
|
||||||
@ -2259,81 +2243,81 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *com
|
|||||||
srcw = 0;
|
srcw = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (type) {
|
switch (type & 0xff) {
|
||||||
case SLJIT_C_EQUAL:
|
case SLJIT_EQUAL:
|
||||||
GET_CR_BIT(2, reg);
|
GET_CR_BIT(2, reg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SLJIT_C_NOT_EQUAL:
|
case SLJIT_NOT_EQUAL:
|
||||||
GET_CR_BIT(2, reg);
|
GET_CR_BIT(2, reg);
|
||||||
INVERT_BIT(reg);
|
INVERT_BIT(reg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SLJIT_C_LESS:
|
case SLJIT_LESS:
|
||||||
case SLJIT_C_FLOAT_LESS:
|
case SLJIT_D_LESS:
|
||||||
GET_CR_BIT(4 + 0, reg);
|
GET_CR_BIT(4 + 0, reg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SLJIT_C_GREATER_EQUAL:
|
case SLJIT_GREATER_EQUAL:
|
||||||
case SLJIT_C_FLOAT_GREATER_EQUAL:
|
case SLJIT_D_GREATER_EQUAL:
|
||||||
GET_CR_BIT(4 + 0, reg);
|
GET_CR_BIT(4 + 0, reg);
|
||||||
INVERT_BIT(reg);
|
INVERT_BIT(reg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SLJIT_C_GREATER:
|
case SLJIT_GREATER:
|
||||||
case SLJIT_C_FLOAT_GREATER:
|
case SLJIT_D_GREATER:
|
||||||
GET_CR_BIT(4 + 1, reg);
|
GET_CR_BIT(4 + 1, reg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SLJIT_C_LESS_EQUAL:
|
case SLJIT_LESS_EQUAL:
|
||||||
case SLJIT_C_FLOAT_LESS_EQUAL:
|
case SLJIT_D_LESS_EQUAL:
|
||||||
GET_CR_BIT(4 + 1, reg);
|
GET_CR_BIT(4 + 1, reg);
|
||||||
INVERT_BIT(reg);
|
INVERT_BIT(reg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SLJIT_C_SIG_LESS:
|
case SLJIT_SIG_LESS:
|
||||||
GET_CR_BIT(0, reg);
|
GET_CR_BIT(0, reg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SLJIT_C_SIG_GREATER_EQUAL:
|
case SLJIT_SIG_GREATER_EQUAL:
|
||||||
GET_CR_BIT(0, reg);
|
GET_CR_BIT(0, reg);
|
||||||
INVERT_BIT(reg);
|
INVERT_BIT(reg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SLJIT_C_SIG_GREATER:
|
case SLJIT_SIG_GREATER:
|
||||||
GET_CR_BIT(1, reg);
|
GET_CR_BIT(1, reg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SLJIT_C_SIG_LESS_EQUAL:
|
case SLJIT_SIG_LESS_EQUAL:
|
||||||
GET_CR_BIT(1, reg);
|
GET_CR_BIT(1, reg);
|
||||||
INVERT_BIT(reg);
|
INVERT_BIT(reg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SLJIT_C_OVERFLOW:
|
case SLJIT_OVERFLOW:
|
||||||
case SLJIT_C_MUL_OVERFLOW:
|
case SLJIT_MUL_OVERFLOW:
|
||||||
GET_CR_BIT(3, reg);
|
GET_CR_BIT(3, reg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SLJIT_C_NOT_OVERFLOW:
|
case SLJIT_NOT_OVERFLOW:
|
||||||
case SLJIT_C_MUL_NOT_OVERFLOW:
|
case SLJIT_MUL_NOT_OVERFLOW:
|
||||||
GET_CR_BIT(3, reg);
|
GET_CR_BIT(3, reg);
|
||||||
INVERT_BIT(reg);
|
INVERT_BIT(reg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SLJIT_C_FLOAT_EQUAL:
|
case SLJIT_D_EQUAL:
|
||||||
GET_CR_BIT(4 + 2, reg);
|
GET_CR_BIT(4 + 2, reg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SLJIT_C_FLOAT_NOT_EQUAL:
|
case SLJIT_D_NOT_EQUAL:
|
||||||
GET_CR_BIT(4 + 2, reg);
|
GET_CR_BIT(4 + 2, reg);
|
||||||
INVERT_BIT(reg);
|
INVERT_BIT(reg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SLJIT_C_FLOAT_UNORDERED:
|
case SLJIT_D_UNORDERED:
|
||||||
GET_CR_BIT(4 + 3, reg);
|
GET_CR_BIT(4 + 3, reg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SLJIT_C_FLOAT_ORDERED:
|
case SLJIT_D_ORDERED:
|
||||||
GET_CR_BIT(4 + 3, reg);
|
GET_CR_BIT(4 + 3, reg);
|
||||||
INVERT_BIT(reg);
|
INVERT_BIT(reg);
|
||||||
break;
|
break;
|
||||||
@ -2360,7 +2344,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *com
|
|||||||
return emit_op(compiler, op, input_flags, dst, dstw, TMP_REG1, 0, TMP_REG2, 0);
|
return emit_op(compiler, op, input_flags, dst, dstw, TMP_REG1, 0, TMP_REG2, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) || (defined SLJIT_DEBUG && SLJIT_DEBUG)
|
#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \
|
||||||
|
|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
|
||||||
compiler->skip_checks = 1;
|
compiler->skip_checks = 1;
|
||||||
#endif
|
#endif
|
||||||
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);
|
||||||
@ -2372,7 +2357,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi
|
|||||||
sljit_si reg;
|
sljit_si reg;
|
||||||
|
|
||||||
CHECK_ERROR_PTR();
|
CHECK_ERROR_PTR();
|
||||||
check_sljit_emit_const(compiler, dst, dstw, init_value);
|
CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
|
|
||||||
const_ = (struct sljit_const*)ensure_abuf(compiler, sizeof(struct sljit_const));
|
const_ = (struct sljit_const*)ensure_abuf(compiler, sizeof(struct sljit_const));
|
||||||
|
@ -283,7 +283,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
|
|||||||
struct sljit_const *const_;
|
struct sljit_const *const_;
|
||||||
|
|
||||||
CHECK_ERROR_PTR();
|
CHECK_ERROR_PTR();
|
||||||
check_sljit_generate_code(compiler);
|
CHECK_PTR(check_sljit_generate_code(compiler));
|
||||||
reverse_buf(compiler);
|
reverse_buf(compiler);
|
||||||
|
|
||||||
code = (sljit_ins*)SLJIT_MALLOC_EXEC(compiler->size * sizeof(sljit_ins));
|
code = (sljit_ins*)SLJIT_MALLOC_EXEC(compiler->size * sizeof(sljit_ins));
|
||||||
@ -423,18 +423,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
|
|||||||
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size)
|
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size)
|
||||||
{
|
{
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
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);
|
||||||
|
|
||||||
compiler->options = options;
|
local_size = (local_size + SLJIT_LOCALS_OFFSET + 7) & ~0x7;
|
||||||
compiler->scratches = scratches;
|
|
||||||
compiler->saveds = saveds;
|
|
||||||
compiler->fscratches = fscratches;
|
|
||||||
compiler->fsaveds = fsaveds;
|
|
||||||
#if (defined SLJIT_DEBUG && SLJIT_DEBUG)
|
|
||||||
compiler->logical_local_size = local_size;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
local_size = (local_size + FIXED_LOCALS_OFFSET + 7) & ~0x7;
|
|
||||||
compiler->local_size = local_size;
|
compiler->local_size = local_size;
|
||||||
|
|
||||||
if (local_size <= SIMM_MAX) {
|
if (local_size <= SIMM_MAX) {
|
||||||
@ -450,29 +442,22 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
|
|||||||
return SLJIT_SUCCESS;
|
return SLJIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
SLJIT_API_FUNC_ATTRIBUTE void sljit_set_context(struct sljit_compiler *compiler,
|
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_set_context(struct sljit_compiler *compiler,
|
||||||
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds,
|
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds,
|
||||||
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size)
|
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size)
|
||||||
{
|
{
|
||||||
CHECK_ERROR_VOID();
|
CHECK_ERROR();
|
||||||
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));
|
||||||
|
set_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size);
|
||||||
|
|
||||||
compiler->options = options;
|
compiler->local_size = (local_size + SLJIT_LOCALS_OFFSET + 7) & ~0x7;
|
||||||
compiler->scratches = scratches;
|
return SLJIT_SUCCESS;
|
||||||
compiler->saveds = saveds;
|
|
||||||
compiler->fscratches = fscratches;
|
|
||||||
compiler->fsaveds = fsaveds;
|
|
||||||
#if (defined SLJIT_DEBUG && SLJIT_DEBUG)
|
|
||||||
compiler->logical_local_size = local_size;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
compiler->local_size = (local_size + FIXED_LOCALS_OFFSET + 7) & ~0x7;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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_si sljit_emit_return(struct sljit_compiler *compiler, sljit_si op, sljit_si src, sljit_sw srcw)
|
||||||
{
|
{
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_return(compiler, op, src, srcw);
|
CHECK(check_sljit_emit_return(compiler, op, src, srcw));
|
||||||
|
|
||||||
if (op != SLJIT_MOV || !FAST_IS_REG(src)) {
|
if (op != SLJIT_MOV || !FAST_IS_REG(src)) {
|
||||||
FAIL_IF(emit_mov_before_return(compiler, op, src, srcw));
|
FAIL_IF(emit_mov_before_return(compiler, op, src, srcw));
|
||||||
@ -776,7 +761,7 @@ static sljit_si emit_op(struct sljit_compiler *compiler, sljit_si op, sljit_si f
|
|||||||
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler, sljit_si op)
|
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler, sljit_si op)
|
||||||
{
|
{
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_op0(compiler, op);
|
CHECK(check_sljit_emit_op0(compiler, op));
|
||||||
|
|
||||||
op = GET_OPCODE(op);
|
op = GET_OPCODE(op);
|
||||||
switch (op) {
|
switch (op) {
|
||||||
@ -784,25 +769,25 @@ 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_UMUL:
|
case SLJIT_LUMUL:
|
||||||
case SLJIT_SMUL:
|
case SLJIT_LSMUL:
|
||||||
#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_UMUL ? UMUL : SMUL) | D(SLJIT_R0) | S1(SLJIT_R0) | S2(SLJIT_R1), DR(SLJIT_R0)));
|
FAIL_IF(push_inst(compiler, (op == SLJIT_LUMUL ? 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_UDIV:
|
case SLJIT_LUDIV:
|
||||||
case SLJIT_SDIV:
|
case SLJIT_LSDIV:
|
||||||
#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
|
#if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)
|
||||||
if (op == SLJIT_UDIV)
|
if (op == SLJIT_LUDIV)
|
||||||
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));
|
||||||
}
|
}
|
||||||
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 == SLJIT_UDIV ? UDIV : SDIV) | D(SLJIT_R0) | S1(SLJIT_R0) | S2(SLJIT_R1), DR(SLJIT_R0)));
|
FAIL_IF(push_inst(compiler, (op == SLJIT_LUDIV ? UDIV : SDIV) | D(SLJIT_R0) | S1(SLJIT_R0) | S2(SLJIT_R1), DR(SLJIT_R0)));
|
||||||
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)));
|
||||||
FAIL_IF(push_inst(compiler, SUB | D(SLJIT_R1) | S1(TMP_REG2) | S2(SLJIT_R1), DR(SLJIT_R1)));
|
FAIL_IF(push_inst(compiler, SUB | D(SLJIT_R1) | S1(TMP_REG2) | S2(SLJIT_R1), DR(SLJIT_R1)));
|
||||||
return SLJIT_SUCCESS;
|
return SLJIT_SUCCESS;
|
||||||
@ -821,7 +806,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler
|
|||||||
sljit_si flags = GET_FLAGS(op) ? SET_FLAGS : 0;
|
sljit_si flags = GET_FLAGS(op) ? SET_FLAGS : 0;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw);
|
CHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
ADJUST_LOCAL_OFFSET(src, srcw);
|
ADJUST_LOCAL_OFFSET(src, srcw);
|
||||||
|
|
||||||
@ -890,7 +875,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler
|
|||||||
sljit_si flags = GET_FLAGS(op) ? SET_FLAGS : 0;
|
sljit_si flags = GET_FLAGS(op) ? SET_FLAGS : 0;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
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));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
ADJUST_LOCAL_OFFSET(src1, src1w);
|
ADJUST_LOCAL_OFFSET(src1, src1w);
|
||||||
ADJUST_LOCAL_OFFSET(src2, src2w);
|
ADJUST_LOCAL_OFFSET(src2, src2w);
|
||||||
@ -926,13 +911,13 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler
|
|||||||
|
|
||||||
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_register_index(sljit_si reg)
|
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_register_index(sljit_si reg)
|
||||||
{
|
{
|
||||||
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_si sljit_get_float_register_index(sljit_si reg)
|
||||||
{
|
{
|
||||||
check_sljit_get_float_register_index(reg);
|
CHECK_REG_INDEX(check_sljit_get_float_register_index(reg));
|
||||||
return reg << 1;
|
return reg << 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -940,8 +925,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_custom(struct sljit_compiler *co
|
|||||||
void *instruction, sljit_si size)
|
void *instruction, sljit_si size)
|
||||||
{
|
{
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_op_custom(compiler, instruction, size);
|
CHECK(check_sljit_emit_op_custom(compiler, instruction, size));
|
||||||
SLJIT_ASSERT(size == 4);
|
|
||||||
|
|
||||||
return push_inst(compiler, *(sljit_ins*)instruction, UNMOVABLE_INS);
|
return push_inst(compiler, *(sljit_ins*)instruction, UNMOVABLE_INS);
|
||||||
}
|
}
|
||||||
@ -1066,7 +1050,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_MOVD:
|
case SLJIT_DMOV:
|
||||||
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));
|
||||||
@ -1077,12 +1061,12 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop1(struct sljit_compiler *compile
|
|||||||
dst_r = src;
|
dst_r = src;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SLJIT_NEGD:
|
case SLJIT_DNEG:
|
||||||
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_SINGLE_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_ABSD:
|
case SLJIT_DABS:
|
||||||
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_SINGLE_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));
|
||||||
@ -1106,7 +1090,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compile
|
|||||||
sljit_si dst_r, flags = 0;
|
sljit_si dst_r, flags = 0;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
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));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
ADJUST_LOCAL_OFFSET(src1, src1w);
|
ADJUST_LOCAL_OFFSET(src1, src1w);
|
||||||
ADJUST_LOCAL_OFFSET(src2, src2w);
|
ADJUST_LOCAL_OFFSET(src2, src2w);
|
||||||
@ -1157,19 +1141,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_ADDD:
|
case SLJIT_DADD:
|
||||||
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_SUBD:
|
case SLJIT_DSUB:
|
||||||
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_MULD:
|
case SLJIT_DMUL:
|
||||||
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_DIVD:
|
case SLJIT_DDIV:
|
||||||
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;
|
||||||
}
|
}
|
||||||
@ -1190,7 +1174,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compile
|
|||||||
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_si sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_si dst, sljit_sw dstw)
|
||||||
{
|
{
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_fast_enter(compiler, dst, dstw);
|
CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
|
|
||||||
/* For UNUSED dst. Uncommon, but possible. */
|
/* For UNUSED dst. Uncommon, but possible. */
|
||||||
@ -1207,7 +1191,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_enter(struct sljit_compiler *c
|
|||||||
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_si sljit_emit_fast_return(struct sljit_compiler *compiler, sljit_si src, sljit_sw srcw)
|
||||||
{
|
{
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_fast_return(compiler, src, srcw);
|
CHECK(check_sljit_emit_fast_return(compiler, src, srcw));
|
||||||
ADJUST_LOCAL_OFFSET(src, srcw);
|
ADJUST_LOCAL_OFFSET(src, srcw);
|
||||||
|
|
||||||
if (FAST_IS_REG(src))
|
if (FAST_IS_REG(src))
|
||||||
@ -1230,7 +1214,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compi
|
|||||||
struct sljit_label *label;
|
struct sljit_label *label;
|
||||||
|
|
||||||
CHECK_ERROR_PTR();
|
CHECK_ERROR_PTR();
|
||||||
check_sljit_emit_label(compiler);
|
CHECK_PTR(check_sljit_emit_label(compiler));
|
||||||
|
|
||||||
if (compiler->last_label && compiler->last_label->size == compiler->size)
|
if (compiler->last_label && compiler->last_label->size == compiler->size)
|
||||||
return compiler->last_label;
|
return compiler->last_label;
|
||||||
@ -1245,66 +1229,50 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compi
|
|||||||
static sljit_ins get_cc(sljit_si type)
|
static sljit_ins get_cc(sljit_si type)
|
||||||
{
|
{
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case SLJIT_C_EQUAL:
|
case SLJIT_EQUAL:
|
||||||
case SLJIT_C_MUL_NOT_OVERFLOW:
|
case SLJIT_MUL_NOT_OVERFLOW:
|
||||||
|
case SLJIT_D_NOT_EQUAL: /* Unordered. */
|
||||||
return DA(0x1);
|
return DA(0x1);
|
||||||
|
|
||||||
case SLJIT_C_NOT_EQUAL:
|
case SLJIT_NOT_EQUAL:
|
||||||
case SLJIT_C_MUL_OVERFLOW:
|
case SLJIT_MUL_OVERFLOW:
|
||||||
|
case SLJIT_D_EQUAL:
|
||||||
return DA(0x9);
|
return DA(0x9);
|
||||||
|
|
||||||
case SLJIT_C_LESS:
|
case SLJIT_LESS:
|
||||||
|
case SLJIT_D_GREATER: /* Unordered. */
|
||||||
return DA(0x5);
|
return DA(0x5);
|
||||||
|
|
||||||
case SLJIT_C_GREATER_EQUAL:
|
case SLJIT_GREATER_EQUAL:
|
||||||
|
case SLJIT_D_LESS_EQUAL:
|
||||||
return DA(0xd);
|
return DA(0xd);
|
||||||
|
|
||||||
case SLJIT_C_GREATER:
|
case SLJIT_GREATER:
|
||||||
|
case SLJIT_D_GREATER_EQUAL: /* Unordered. */
|
||||||
return DA(0xc);
|
return DA(0xc);
|
||||||
|
|
||||||
case SLJIT_C_LESS_EQUAL:
|
case SLJIT_LESS_EQUAL:
|
||||||
|
case SLJIT_D_LESS:
|
||||||
return DA(0x4);
|
return DA(0x4);
|
||||||
|
|
||||||
case SLJIT_C_SIG_LESS:
|
case SLJIT_SIG_LESS:
|
||||||
return DA(0x3);
|
return DA(0x3);
|
||||||
|
|
||||||
case SLJIT_C_SIG_GREATER_EQUAL:
|
case SLJIT_SIG_GREATER_EQUAL:
|
||||||
return DA(0xb);
|
return DA(0xb);
|
||||||
|
|
||||||
case SLJIT_C_SIG_GREATER:
|
case SLJIT_SIG_GREATER:
|
||||||
return DA(0xa);
|
return DA(0xa);
|
||||||
|
|
||||||
case SLJIT_C_SIG_LESS_EQUAL:
|
case SLJIT_SIG_LESS_EQUAL:
|
||||||
return DA(0x2);
|
return DA(0x2);
|
||||||
|
|
||||||
case SLJIT_C_OVERFLOW:
|
case SLJIT_OVERFLOW:
|
||||||
|
case SLJIT_D_UNORDERED:
|
||||||
return DA(0x7);
|
return DA(0x7);
|
||||||
|
|
||||||
case SLJIT_C_NOT_OVERFLOW:
|
case SLJIT_NOT_OVERFLOW:
|
||||||
return DA(0xf);
|
case SLJIT_D_ORDERED:
|
||||||
|
|
||||||
case SLJIT_C_FLOAT_EQUAL:
|
|
||||||
return DA(0x9);
|
|
||||||
|
|
||||||
case SLJIT_C_FLOAT_NOT_EQUAL: /* Unordered. */
|
|
||||||
return DA(0x1);
|
|
||||||
|
|
||||||
case SLJIT_C_FLOAT_LESS:
|
|
||||||
return DA(0x4);
|
|
||||||
|
|
||||||
case SLJIT_C_FLOAT_GREATER_EQUAL: /* Unordered. */
|
|
||||||
return DA(0xc);
|
|
||||||
|
|
||||||
case SLJIT_C_FLOAT_LESS_EQUAL:
|
|
||||||
return DA(0xd);
|
|
||||||
|
|
||||||
case SLJIT_C_FLOAT_GREATER: /* Unordered. */
|
|
||||||
return DA(0x5);
|
|
||||||
|
|
||||||
case SLJIT_C_FLOAT_UNORDERED:
|
|
||||||
return DA(0x7);
|
|
||||||
|
|
||||||
case SLJIT_C_FLOAT_ORDERED:
|
|
||||||
return DA(0xf);
|
return DA(0xf);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@ -1318,14 +1286,14 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile
|
|||||||
struct sljit_jump *jump;
|
struct sljit_jump *jump;
|
||||||
|
|
||||||
CHECK_ERROR_PTR();
|
CHECK_ERROR_PTR();
|
||||||
check_sljit_emit_jump(compiler, type);
|
CHECK_PTR(check_sljit_emit_jump(compiler, type));
|
||||||
|
|
||||||
jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
|
jump = (struct sljit_jump*)ensure_abuf(compiler, sizeof(struct sljit_jump));
|
||||||
PTR_FAIL_IF(!jump);
|
PTR_FAIL_IF(!jump);
|
||||||
set_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP);
|
set_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP);
|
||||||
type &= 0xff;
|
type &= 0xff;
|
||||||
|
|
||||||
if (type < SLJIT_C_FLOAT_EQUAL) {
|
if (type < SLJIT_D_EQUAL) {
|
||||||
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;
|
||||||
@ -1365,7 +1333,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_ijump(struct sljit_compiler *compil
|
|||||||
sljit_si src_r;
|
sljit_si src_r;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_ijump(compiler, type, src, srcw);
|
CHECK(check_sljit_emit_ijump(compiler, type, src, srcw));
|
||||||
ADJUST_LOCAL_OFFSET(src, srcw);
|
ADJUST_LOCAL_OFFSET(src, srcw);
|
||||||
|
|
||||||
if (FAST_IS_REG(src))
|
if (FAST_IS_REG(src))
|
||||||
@ -1402,7 +1370,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *com
|
|||||||
sljit_si reg, flags = (GET_FLAGS(op) ? SET_FLAGS : 0);
|
sljit_si reg, flags = (GET_FLAGS(op) ? SET_FLAGS : 0);
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
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));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
|
|
||||||
if (dst == SLJIT_UNUSED)
|
if (dst == SLJIT_UNUSED)
|
||||||
@ -1421,7 +1389,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *com
|
|||||||
srcw = 0;
|
srcw = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type < SLJIT_C_FLOAT_EQUAL)
|
type &= 0xff;
|
||||||
|
if (type < SLJIT_D_EQUAL)
|
||||||
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));
|
||||||
@ -1444,7 +1413,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi
|
|||||||
struct sljit_const *const_;
|
struct sljit_const *const_;
|
||||||
|
|
||||||
CHECK_ERROR_PTR();
|
CHECK_ERROR_PTR();
|
||||||
check_sljit_emit_const(compiler, dst, dstw, init_value);
|
CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
|
|
||||||
const_ = (struct sljit_const*)ensure_abuf(compiler, sizeof(struct sljit_const));
|
const_ = (struct sljit_const*)ensure_abuf(compiler, sizeof(struct sljit_const));
|
||||||
|
@ -1182,15 +1182,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
|
|||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_enter(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size);
|
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);
|
||||||
compiler->options = options;
|
|
||||||
compiler->scratches = scratches;
|
|
||||||
compiler->saveds = saveds;
|
|
||||||
compiler->fscratches = fscratches;
|
|
||||||
compiler->fsaveds = fsaveds;
|
|
||||||
#if (defined SLJIT_DEBUG && SLJIT_DEBUG)
|
|
||||||
compiler->logical_local_size = local_size;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
local_size += (saveds + 1) * sizeof(sljit_sw);
|
local_size += (saveds + 1) * sizeof(sljit_sw);
|
||||||
local_size = (local_size + 7) & ~7;
|
local_size = (local_size + 7) & ~7;
|
||||||
@ -1244,15 +1236,7 @@ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_context(struct sljit_compiler *compiler,
|
|||||||
{
|
{
|
||||||
CHECK_ERROR_VOID();
|
CHECK_ERROR_VOID();
|
||||||
check_sljit_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size);
|
check_sljit_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size);
|
||||||
|
set_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size);
|
||||||
compiler->options = options;
|
|
||||||
compiler->scratches = scratches;
|
|
||||||
compiler->saveds = saveds;
|
|
||||||
compiler->fscratches = fscratches;
|
|
||||||
compiler->fsaveds = fsaveds;
|
|
||||||
#if (defined SLJIT_DEBUG && SLJIT_DEBUG)
|
|
||||||
compiler->logical_local_size = local_size;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
local_size += (saveds + 1) * sizeof(sljit_sw);
|
local_size += (saveds + 1) * sizeof(sljit_sw);
|
||||||
compiler->local_size = (local_size + 7) & ~7;
|
compiler->local_size = (local_size + 7) & ~7;
|
||||||
|
@ -71,18 +71,11 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
|
|||||||
sljit_ub *inst;
|
sljit_ub *inst;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
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);
|
||||||
|
|
||||||
compiler->options = options;
|
|
||||||
compiler->scratches = scratches;
|
|
||||||
compiler->saveds = saveds;
|
|
||||||
compiler->fscratches = fscratches;
|
|
||||||
compiler->fsaveds = fsaveds;
|
|
||||||
compiler->args = args;
|
compiler->args = args;
|
||||||
compiler->flags_saved = 0;
|
compiler->flags_saved = 0;
|
||||||
#if (defined SLJIT_DEBUG && SLJIT_DEBUG)
|
|
||||||
compiler->logical_local_size = local_size;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
size = 1 + (scratches > 7 ? (scratches - 7) : 0) + (saveds <= 3 ? saveds : 3);
|
size = 1 + (scratches > 7 ? (scratches - 7) : 0) + (saveds <= 3 ? saveds : 3);
|
||||||
#if (defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL)
|
#if (defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL)
|
||||||
@ -141,14 +134,33 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
SLJIT_COMPILE_ASSERT(FIXED_LOCALS_OFFSET >= (2 + 4) * sizeof(sljit_uw), require_at_least_two_words);
|
SLJIT_COMPILE_ASSERT(SLJIT_LOCALS_OFFSET >= (2 + 4) * sizeof(sljit_uw), require_at_least_two_words);
|
||||||
#if defined(__APPLE__)
|
#if defined(__APPLE__)
|
||||||
/* Ignore pushed registers and FIXED_LOCALS_OFFSET when
|
/* Ignore pushed registers and SLJIT_LOCALS_OFFSET when computing the aligned local size. */
|
||||||
computing the aligned local size. */
|
|
||||||
saveds = (2 + (scratches > 7 ? (scratches - 7) : 0) + (saveds <= 3 ? saveds : 3)) * sizeof(sljit_uw);
|
saveds = (2 + (scratches > 7 ? (scratches - 7) : 0) + (saveds <= 3 ? saveds : 3)) * sizeof(sljit_uw);
|
||||||
local_size = ((FIXED_LOCALS_OFFSET + saveds + local_size + 15) & ~15) - saveds;
|
local_size = ((SLJIT_LOCALS_OFFSET + saveds + local_size + 15) & ~15) - saveds;
|
||||||
#else
|
#else
|
||||||
local_size = FIXED_LOCALS_OFFSET + ((local_size + sizeof(sljit_uw) - 1) & ~(sizeof(sljit_uw) - 1));
|
if (options & SLJIT_DOUBLE_ALIGNMENT) {
|
||||||
|
local_size = SLJIT_LOCALS_OFFSET + ((local_size + 7) & ~7);
|
||||||
|
|
||||||
|
inst = (sljit_ub*)ensure_buf(compiler, 1 + 17);
|
||||||
|
FAIL_IF(!inst);
|
||||||
|
|
||||||
|
INC_SIZE(17);
|
||||||
|
inst[0] = MOV_r_rm;
|
||||||
|
inst[1] = MOD_REG | (reg_map[TMP_REG1] << 3) | reg_map[SLJIT_SP];
|
||||||
|
inst[2] = GROUP_F7;
|
||||||
|
inst[3] = MOD_REG | (0 << 3) | reg_map[SLJIT_SP];
|
||||||
|
*(sljit_sw*)(inst + 4) = 0x4;
|
||||||
|
inst[8] = JNE_i8;
|
||||||
|
inst[9] = 6;
|
||||||
|
inst[10] = GROUP_BINARY_81;
|
||||||
|
inst[11] = MOD_REG | (5 << 3) | reg_map[SLJIT_SP];
|
||||||
|
*(sljit_sw*)(inst + 12) = 0x4;
|
||||||
|
inst[16] = PUSH_r + reg_map[TMP_REG1];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
local_size = SLJIT_LOCALS_OFFSET + ((local_size + 3) & ~3);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
compiler->local_size = local_size;
|
compiler->local_size = local_size;
|
||||||
@ -157,10 +169,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
|
|||||||
#if (defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL)
|
#if (defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL)
|
||||||
FAIL_IF(emit_do_imm(compiler, MOV_r_i32 + reg_map[SLJIT_R0], local_size));
|
FAIL_IF(emit_do_imm(compiler, MOV_r_i32 + reg_map[SLJIT_R0], local_size));
|
||||||
#else
|
#else
|
||||||
local_size -= FIXED_LOCALS_OFFSET;
|
local_size -= SLJIT_LOCALS_OFFSET;
|
||||||
FAIL_IF(emit_do_imm(compiler, MOV_r_i32 + reg_map[SLJIT_R0], local_size));
|
FAIL_IF(emit_do_imm(compiler, MOV_r_i32 + reg_map[SLJIT_R0], local_size));
|
||||||
FAIL_IF(emit_non_cum_binary(compiler, SUB_r_rm, SUB_rm_r, SUB, SUB_EAX_i32,
|
FAIL_IF(emit_non_cum_binary(compiler, SUB_r_rm, SUB_rm_r, SUB, SUB_EAX_i32,
|
||||||
SLJIT_SP, 0, SLJIT_SP, 0, SLJIT_IMM, FIXED_LOCALS_OFFSET));
|
SLJIT_SP, 0, SLJIT_SP, 0, SLJIT_IMM, SLJIT_LOCALS_OFFSET));
|
||||||
#endif
|
#endif
|
||||||
FAIL_IF(sljit_emit_ijump(compiler, SLJIT_CALL1, SLJIT_IMM, SLJIT_FUNC_OFFSET(sljit_grow_stack)));
|
FAIL_IF(sljit_emit_ijump(compiler, SLJIT_CALL1, SLJIT_IMM, SLJIT_FUNC_OFFSET(sljit_grow_stack)));
|
||||||
}
|
}
|
||||||
@ -171,29 +183,26 @@ 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 void sljit_set_context(struct sljit_compiler *compiler,
|
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_set_context(struct sljit_compiler *compiler,
|
||||||
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds,
|
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds,
|
||||||
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size)
|
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size)
|
||||||
{
|
{
|
||||||
CHECK_ERROR_VOID();
|
CHECK_ERROR();
|
||||||
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));
|
||||||
|
set_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size);
|
||||||
|
|
||||||
compiler->options = options;
|
|
||||||
compiler->scratches = scratches;
|
|
||||||
compiler->saveds = saveds;
|
|
||||||
compiler->fscratches = fscratches;
|
|
||||||
compiler->fsaveds = fsaveds;
|
|
||||||
compiler->args = args;
|
compiler->args = args;
|
||||||
#if (defined SLJIT_DEBUG && SLJIT_DEBUG)
|
|
||||||
compiler->logical_local_size = local_size;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__APPLE__)
|
#if defined(__APPLE__)
|
||||||
saveds = (2 + (scratches > 7 ? (scratches - 7) : 0) + (saveds <= 3 ? saveds : 3)) * sizeof(sljit_uw);
|
saveds = (2 + (scratches > 7 ? (scratches - 7) : 0) + (saveds <= 3 ? saveds : 3)) * sizeof(sljit_uw);
|
||||||
compiler->local_size = ((FIXED_LOCALS_OFFSET + saveds + local_size + 15) & ~15) - saveds;
|
compiler->local_size = ((SLJIT_LOCALS_OFFSET + saveds + local_size + 15) & ~15) - saveds;
|
||||||
#else
|
#else
|
||||||
compiler->local_size = FIXED_LOCALS_OFFSET + ((local_size + sizeof(sljit_uw) - 1) & ~(sizeof(sljit_uw) - 1));
|
if (options & SLJIT_DOUBLE_ALIGNMENT)
|
||||||
|
compiler->local_size = SLJIT_LOCALS_OFFSET + ((local_size + 7) & ~7);
|
||||||
|
else
|
||||||
|
compiler->local_size = SLJIT_LOCALS_OFFSET + ((local_size + 3) & ~3);
|
||||||
#endif
|
#endif
|
||||||
|
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_si sljit_emit_return(struct sljit_compiler *compiler, sljit_si op, sljit_si src, sljit_sw srcw)
|
||||||
@ -202,7 +211,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compi
|
|||||||
sljit_ub *inst;
|
sljit_ub *inst;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_return(compiler, op, src, srcw);
|
CHECK(check_sljit_emit_return(compiler, op, src, srcw));
|
||||||
SLJIT_ASSERT(compiler->args >= 0);
|
SLJIT_ASSERT(compiler->args >= 0);
|
||||||
|
|
||||||
compiler->flags_saved = 0;
|
compiler->flags_saved = 0;
|
||||||
@ -212,6 +221,18 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compi
|
|||||||
FAIL_IF(emit_cum_binary(compiler, ADD_r_rm, ADD_rm_r, ADD, ADD_EAX_i32,
|
FAIL_IF(emit_cum_binary(compiler, ADD_r_rm, ADD_rm_r, ADD, ADD_EAX_i32,
|
||||||
SLJIT_SP, 0, SLJIT_SP, 0, SLJIT_IMM, compiler->local_size));
|
SLJIT_SP, 0, SLJIT_SP, 0, SLJIT_IMM, compiler->local_size));
|
||||||
|
|
||||||
|
#if !defined(__APPLE__)
|
||||||
|
if (compiler->options & SLJIT_DOUBLE_ALIGNMENT) {
|
||||||
|
inst = (sljit_ub*)ensure_buf(compiler, 1 + 3);
|
||||||
|
FAIL_IF(!inst);
|
||||||
|
|
||||||
|
INC_SIZE(3);
|
||||||
|
inst[0] = MOV_r_rm;
|
||||||
|
inst[1] = (reg_map[SLJIT_SP] << 3) | 0x4 /* SIB */;
|
||||||
|
inst[2] = (4 << 3) | reg_map[SLJIT_SP];
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
size = 2 + (compiler->scratches > 7 ? (compiler->scratches - 7) : 0) +
|
size = 2 + (compiler->scratches > 7 ? (compiler->scratches - 7) : 0) +
|
||||||
(compiler->saveds <= 3 ? compiler->saveds : 3);
|
(compiler->saveds <= 3 ? compiler->saveds : 3);
|
||||||
#if (defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL)
|
#if (defined SLJIT_X86_32_FASTCALL && SLJIT_X86_32_FASTCALL)
|
||||||
@ -460,7 +481,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_enter(struct sljit_compiler *c
|
|||||||
sljit_ub *inst;
|
sljit_ub *inst;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_fast_enter(compiler, dst, dstw);
|
CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
|
|
||||||
CHECK_EXTRA_REGS(dst, dstw, (void)0);
|
CHECK_EXTRA_REGS(dst, dstw, (void)0);
|
||||||
@ -491,7 +512,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_return(struct sljit_compiler *
|
|||||||
sljit_ub *inst;
|
sljit_ub *inst;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_fast_return(compiler, src, srcw);
|
CHECK(check_sljit_emit_fast_return(compiler, src, srcw));
|
||||||
ADJUST_LOCAL_OFFSET(src, srcw);
|
ADJUST_LOCAL_OFFSET(src, srcw);
|
||||||
|
|
||||||
CHECK_EXTRA_REGS(src, srcw, (void)0);
|
CHECK_EXTRA_REGS(src, srcw, (void)0);
|
||||||
|
@ -95,17 +95,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
|
|||||||
sljit_ub *inst;
|
sljit_ub *inst;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
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);
|
||||||
|
|
||||||
compiler->options = options;
|
|
||||||
compiler->scratches = scratches;
|
|
||||||
compiler->saveds = saveds;
|
|
||||||
compiler->fscratches = fscratches;
|
|
||||||
compiler->fsaveds = fsaveds;
|
|
||||||
compiler->flags_saved = 0;
|
compiler->flags_saved = 0;
|
||||||
#if (defined SLJIT_DEBUG && SLJIT_DEBUG)
|
|
||||||
compiler->logical_local_size = local_size;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Including the return address saved by the call instruction. */
|
/* Including the return address saved by the call instruction. */
|
||||||
saved_register_size = GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1);
|
saved_register_size = GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1);
|
||||||
@ -173,7 +166,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
local_size = ((local_size + FIXED_LOCALS_OFFSET + saved_register_size + 16 - 1) & ~(16 - 1)) - saved_register_size;
|
local_size = ((local_size + SLJIT_LOCALS_OFFSET + saved_register_size + 15) & ~15) - saved_register_size;
|
||||||
compiler->local_size = local_size;
|
compiler->local_size = local_size;
|
||||||
|
|
||||||
#ifdef _WIN64
|
#ifdef _WIN64
|
||||||
@ -201,7 +194,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
|
|||||||
*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_si*)inst = local_size;
|
||||||
#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) || (defined SLJIT_DEBUG && SLJIT_DEBUG)
|
#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \
|
||||||
|
|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
|
||||||
compiler->skip_checks = 1;
|
compiler->skip_checks = 1;
|
||||||
#endif
|
#endif
|
||||||
FAIL_IF(sljit_emit_ijump(compiler, SLJIT_CALL1, SLJIT_IMM, SLJIT_FUNC_OFFSET(sljit_grow_stack)));
|
FAIL_IF(sljit_emit_ijump(compiler, SLJIT_CALL1, SLJIT_IMM, SLJIT_FUNC_OFFSET(sljit_grow_stack)));
|
||||||
@ -243,27 +237,20 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_enter(struct sljit_compiler *compil
|
|||||||
return SLJIT_SUCCESS;
|
return SLJIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
SLJIT_API_FUNC_ATTRIBUTE void sljit_set_context(struct sljit_compiler *compiler,
|
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_set_context(struct sljit_compiler *compiler,
|
||||||
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds,
|
sljit_si options, sljit_si args, sljit_si scratches, sljit_si saveds,
|
||||||
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size)
|
sljit_si fscratches, sljit_si fsaveds, sljit_si local_size)
|
||||||
{
|
{
|
||||||
sljit_si saved_register_size;
|
sljit_si saved_register_size;
|
||||||
|
|
||||||
CHECK_ERROR_VOID();
|
CHECK_ERROR();
|
||||||
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));
|
||||||
|
set_set_context(compiler, options, args, scratches, saveds, fscratches, fsaveds, local_size);
|
||||||
compiler->options = options;
|
|
||||||
compiler->scratches = scratches;
|
|
||||||
compiler->saveds = saveds;
|
|
||||||
compiler->fscratches = fscratches;
|
|
||||||
compiler->fsaveds = fsaveds;
|
|
||||||
#if (defined SLJIT_DEBUG && SLJIT_DEBUG)
|
|
||||||
compiler->logical_local_size = local_size;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Including the return address saved by the call instruction. */
|
/* Including the return address saved by the call instruction. */
|
||||||
saved_register_size = GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1);
|
saved_register_size = GET_SAVED_REGISTERS_SIZE(scratches, saveds, 1);
|
||||||
compiler->local_size = ((local_size + FIXED_LOCALS_OFFSET + saved_register_size + 16 - 1) & ~(16 - 1)) - saved_register_size;
|
compiler->local_size = ((local_size + SLJIT_LOCALS_OFFSET + saved_register_size + 15) & ~15) - saved_register_size;
|
||||||
|
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_si sljit_emit_return(struct sljit_compiler *compiler, sljit_si op, sljit_si src, sljit_sw srcw)
|
||||||
@ -272,7 +259,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_return(struct sljit_compiler *compi
|
|||||||
sljit_ub *inst;
|
sljit_ub *inst;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_return(compiler, op, src, srcw);
|
CHECK(check_sljit_emit_return(compiler, op, src, srcw));
|
||||||
|
|
||||||
compiler->flags_saved = 0;
|
compiler->flags_saved = 0;
|
||||||
FAIL_IF(emit_mov_before_return(compiler, op, src, srcw));
|
FAIL_IF(emit_mov_before_return(compiler, op, src, srcw));
|
||||||
@ -607,7 +594,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_enter(struct sljit_compiler *c
|
|||||||
sljit_ub *inst;
|
sljit_ub *inst;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_fast_enter(compiler, dst, dstw);
|
CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
|
|
||||||
/* For UNUSED dst. Uncommon, but possible. */
|
/* For UNUSED dst. Uncommon, but possible. */
|
||||||
@ -644,7 +631,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fast_return(struct sljit_compiler *
|
|||||||
sljit_ub *inst;
|
sljit_ub *inst;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_fast_return(compiler, src, srcw);
|
CHECK(check_sljit_emit_fast_return(compiler, src, srcw));
|
||||||
ADJUST_LOCAL_OFFSET(src, srcw);
|
ADJUST_LOCAL_OFFSET(src, srcw);
|
||||||
|
|
||||||
if ((src & SLJIT_IMM) && NOT_HALFWORD(srcw)) {
|
if ((src & SLJIT_IMM) && NOT_HALFWORD(srcw)) {
|
||||||
|
@ -72,7 +72,7 @@ static SLJIT_CONST sljit_ub reg_map[SLJIT_NUMBER_OF_REGISTERS + 3] = {
|
|||||||
|
|
||||||
#define CHECK_EXTRA_REGS(p, w, do) \
|
#define CHECK_EXTRA_REGS(p, w, do) \
|
||||||
if (p >= SLJIT_R3 && p <= SLJIT_R6) { \
|
if (p >= SLJIT_R3 && p <= SLJIT_R6) { \
|
||||||
w = FIXED_LOCALS_OFFSET + ((p) - (SLJIT_R3 + 4)) * sizeof(sljit_sw); \
|
w = SLJIT_LOCALS_OFFSET + ((p) - (SLJIT_R3 + 4)) * sizeof(sljit_sw); \
|
||||||
p = SLJIT_MEM1(SLJIT_SP); \
|
p = SLJIT_MEM1(SLJIT_SP); \
|
||||||
do; \
|
do; \
|
||||||
}
|
}
|
||||||
@ -183,6 +183,7 @@ static SLJIT_CONST sljit_ub reg_lmap[SLJIT_NUMBER_OF_REGISTERS + 5] = {
|
|||||||
#define IMUL_r_rm_i8 0x6b
|
#define IMUL_r_rm_i8 0x6b
|
||||||
#define IMUL_r_rm_i32 0x69
|
#define IMUL_r_rm_i32 0x69
|
||||||
#define JE_i8 0x74
|
#define JE_i8 0x74
|
||||||
|
#define JNE_i8 0x75
|
||||||
#define JMP_i8 0xeb
|
#define JMP_i8 0xeb
|
||||||
#define JMP_i32 0xe9
|
#define JMP_i32 0xe9
|
||||||
#define JMP_rm (/* GROUP_FF */ 4 << 3)
|
#define JMP_rm (/* GROUP_FF */ 4 << 3)
|
||||||
@ -330,54 +331,54 @@ static void get_cpu_features(void)
|
|||||||
static sljit_ub get_jump_code(sljit_si type)
|
static sljit_ub get_jump_code(sljit_si type)
|
||||||
{
|
{
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case SLJIT_C_EQUAL:
|
case SLJIT_EQUAL:
|
||||||
case SLJIT_C_FLOAT_EQUAL:
|
case SLJIT_D_EQUAL:
|
||||||
return 0x84 /* je */;
|
return 0x84 /* je */;
|
||||||
|
|
||||||
case SLJIT_C_NOT_EQUAL:
|
case SLJIT_NOT_EQUAL:
|
||||||
case SLJIT_C_FLOAT_NOT_EQUAL:
|
case SLJIT_D_NOT_EQUAL:
|
||||||
return 0x85 /* jne */;
|
return 0x85 /* jne */;
|
||||||
|
|
||||||
case SLJIT_C_LESS:
|
case SLJIT_LESS:
|
||||||
case SLJIT_C_FLOAT_LESS:
|
case SLJIT_D_LESS:
|
||||||
return 0x82 /* jc */;
|
return 0x82 /* jc */;
|
||||||
|
|
||||||
case SLJIT_C_GREATER_EQUAL:
|
case SLJIT_GREATER_EQUAL:
|
||||||
case SLJIT_C_FLOAT_GREATER_EQUAL:
|
case SLJIT_D_GREATER_EQUAL:
|
||||||
return 0x83 /* jae */;
|
return 0x83 /* jae */;
|
||||||
|
|
||||||
case SLJIT_C_GREATER:
|
case SLJIT_GREATER:
|
||||||
case SLJIT_C_FLOAT_GREATER:
|
case SLJIT_D_GREATER:
|
||||||
return 0x87 /* jnbe */;
|
return 0x87 /* jnbe */;
|
||||||
|
|
||||||
case SLJIT_C_LESS_EQUAL:
|
case SLJIT_LESS_EQUAL:
|
||||||
case SLJIT_C_FLOAT_LESS_EQUAL:
|
case SLJIT_D_LESS_EQUAL:
|
||||||
return 0x86 /* jbe */;
|
return 0x86 /* jbe */;
|
||||||
|
|
||||||
case SLJIT_C_SIG_LESS:
|
case SLJIT_SIG_LESS:
|
||||||
return 0x8c /* jl */;
|
return 0x8c /* jl */;
|
||||||
|
|
||||||
case SLJIT_C_SIG_GREATER_EQUAL:
|
case SLJIT_SIG_GREATER_EQUAL:
|
||||||
return 0x8d /* jnl */;
|
return 0x8d /* jnl */;
|
||||||
|
|
||||||
case SLJIT_C_SIG_GREATER:
|
case SLJIT_SIG_GREATER:
|
||||||
return 0x8f /* jnle */;
|
return 0x8f /* jnle */;
|
||||||
|
|
||||||
case SLJIT_C_SIG_LESS_EQUAL:
|
case SLJIT_SIG_LESS_EQUAL:
|
||||||
return 0x8e /* jle */;
|
return 0x8e /* jle */;
|
||||||
|
|
||||||
case SLJIT_C_OVERFLOW:
|
case SLJIT_OVERFLOW:
|
||||||
case SLJIT_C_MUL_OVERFLOW:
|
case SLJIT_MUL_OVERFLOW:
|
||||||
return 0x80 /* jo */;
|
return 0x80 /* jo */;
|
||||||
|
|
||||||
case SLJIT_C_NOT_OVERFLOW:
|
case SLJIT_NOT_OVERFLOW:
|
||||||
case SLJIT_C_MUL_NOT_OVERFLOW:
|
case SLJIT_MUL_NOT_OVERFLOW:
|
||||||
return 0x81 /* jno */;
|
return 0x81 /* jno */;
|
||||||
|
|
||||||
case SLJIT_C_FLOAT_UNORDERED:
|
case SLJIT_D_UNORDERED:
|
||||||
return 0x8a /* jp */;
|
return 0x8a /* jp */;
|
||||||
|
|
||||||
case SLJIT_C_FLOAT_ORDERED:
|
case SLJIT_D_ORDERED:
|
||||||
return 0x8b /* jpo */;
|
return 0x8b /* jpo */;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -456,7 +457,7 @@ SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compil
|
|||||||
struct sljit_const *const_;
|
struct sljit_const *const_;
|
||||||
|
|
||||||
CHECK_ERROR_PTR();
|
CHECK_ERROR_PTR();
|
||||||
check_sljit_generate_code(compiler);
|
CHECK_PTR(check_sljit_generate_code(compiler));
|
||||||
reverse_buf(compiler);
|
reverse_buf(compiler);
|
||||||
|
|
||||||
/* Second code generation pass. */
|
/* Second code generation pass. */
|
||||||
@ -724,7 +725,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_op0(compiler, op);
|
CHECK(check_sljit_emit_op0(compiler, op));
|
||||||
|
|
||||||
switch (GET_OPCODE(op)) {
|
switch (GET_OPCODE(op)) {
|
||||||
case SLJIT_BREAKPOINT:
|
case SLJIT_BREAKPOINT:
|
||||||
@ -739,10 +740,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler
|
|||||||
INC_SIZE(1);
|
INC_SIZE(1);
|
||||||
*inst = NOP;
|
*inst = NOP;
|
||||||
break;
|
break;
|
||||||
case SLJIT_UMUL:
|
case SLJIT_LUMUL:
|
||||||
case SLJIT_SMUL:
|
case SLJIT_LSMUL:
|
||||||
case SLJIT_UDIV:
|
case SLJIT_LUDIV:
|
||||||
case SLJIT_SDIV:
|
case SLJIT_LSDIV:
|
||||||
compiler->flags_saved = 0;
|
compiler->flags_saved = 0;
|
||||||
#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
|
#if (defined SLJIT_CONFIG_X86_64 && SLJIT_CONFIG_X86_64)
|
||||||
#ifdef _WIN64
|
#ifdef _WIN64
|
||||||
@ -762,7 +763,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
op = GET_OPCODE(op);
|
op = GET_OPCODE(op);
|
||||||
if (op == SLJIT_UDIV) {
|
if (op == SLJIT_LUDIV) {
|
||||||
#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) || defined(_WIN64)
|
#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) || defined(_WIN64)
|
||||||
EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_R1, 0);
|
EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_R1, 0);
|
||||||
inst = emit_x86_instruction(compiler, 1, SLJIT_R1, 0, SLJIT_R1, 0);
|
inst = emit_x86_instruction(compiler, 1, SLJIT_R1, 0, SLJIT_R1, 0);
|
||||||
@ -773,7 +774,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler
|
|||||||
*inst = XOR_r_rm;
|
*inst = XOR_r_rm;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (op == SLJIT_SDIV) {
|
if (op == SLJIT_LSDIV) {
|
||||||
#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) || defined(_WIN64)
|
#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) || defined(_WIN64)
|
||||||
EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_R1, 0);
|
EMIT_MOV(compiler, TMP_REG1, 0, SLJIT_R1, 0);
|
||||||
#endif
|
#endif
|
||||||
@ -804,10 +805,10 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler
|
|||||||
FAIL_IF(!inst);
|
FAIL_IF(!inst);
|
||||||
INC_SIZE(2);
|
INC_SIZE(2);
|
||||||
*inst++ = GROUP_F7;
|
*inst++ = GROUP_F7;
|
||||||
*inst = MOD_REG | ((op >= SLJIT_UDIV) ? reg_map[TMP_REG1] : reg_map[SLJIT_R1]);
|
*inst = MOD_REG | ((op >= SLJIT_LUDIV) ? reg_map[TMP_REG1] : reg_map[SLJIT_R1]);
|
||||||
#else
|
#else
|
||||||
#ifdef _WIN64
|
#ifdef _WIN64
|
||||||
size = (!compiler->mode32 || op >= SLJIT_UDIV) ? 3 : 2;
|
size = (!compiler->mode32 || op >= SLJIT_LUDIV) ? 3 : 2;
|
||||||
#else
|
#else
|
||||||
size = (!compiler->mode32) ? 3 : 2;
|
size = (!compiler->mode32) ? 3 : 2;
|
||||||
#endif
|
#endif
|
||||||
@ -816,11 +817,11 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler
|
|||||||
INC_SIZE(size);
|
INC_SIZE(size);
|
||||||
#ifdef _WIN64
|
#ifdef _WIN64
|
||||||
if (!compiler->mode32)
|
if (!compiler->mode32)
|
||||||
*inst++ = REX_W | ((op >= SLJIT_UDIV) ? REX_B : 0);
|
*inst++ = REX_W | ((op >= SLJIT_LUDIV) ? REX_B : 0);
|
||||||
else if (op >= SLJIT_UDIV)
|
else if (op >= SLJIT_LUDIV)
|
||||||
*inst++ = REX_B;
|
*inst++ = REX_B;
|
||||||
*inst++ = GROUP_F7;
|
*inst++ = GROUP_F7;
|
||||||
*inst = MOD_REG | ((op >= SLJIT_UDIV) ? reg_lmap[TMP_REG1] : reg_lmap[SLJIT_R1]);
|
*inst = MOD_REG | ((op >= SLJIT_LUDIV) ? reg_lmap[TMP_REG1] : reg_lmap[SLJIT_R1]);
|
||||||
#else
|
#else
|
||||||
if (!compiler->mode32)
|
if (!compiler->mode32)
|
||||||
*inst++ = REX_W;
|
*inst++ = REX_W;
|
||||||
@ -829,16 +830,16 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op0(struct sljit_compiler *compiler
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
switch (op) {
|
switch (op) {
|
||||||
case SLJIT_UMUL:
|
case SLJIT_LUMUL:
|
||||||
*inst |= MUL;
|
*inst |= MUL;
|
||||||
break;
|
break;
|
||||||
case SLJIT_SMUL:
|
case SLJIT_LSMUL:
|
||||||
*inst |= IMUL;
|
*inst |= IMUL;
|
||||||
break;
|
break;
|
||||||
case SLJIT_UDIV:
|
case SLJIT_LUDIV:
|
||||||
*inst |= DIV;
|
*inst |= DIV;
|
||||||
break;
|
break;
|
||||||
case SLJIT_SDIV:
|
case SLJIT_LSDIV:
|
||||||
*inst |= IDIV;
|
*inst |= IDIV;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1258,7 +1259,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op1(struct sljit_compiler *compiler
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw);
|
CHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
ADJUST_LOCAL_OFFSET(src, srcw);
|
ADJUST_LOCAL_OFFSET(src, srcw);
|
||||||
|
|
||||||
@ -1743,7 +1744,7 @@ static sljit_si emit_mul(struct sljit_compiler *compiler,
|
|||||||
*(sljit_si*)inst = (sljit_si)src2w;
|
*(sljit_si*)inst = (sljit_si)src2w;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
EMIT_MOV(compiler, TMP_REG2, 0, SLJIT_IMM, src1w);
|
EMIT_MOV(compiler, TMP_REG2, 0, SLJIT_IMM, src2w);
|
||||||
if (dst_r != src1)
|
if (dst_r != src1)
|
||||||
EMIT_MOV(compiler, dst_r, 0, src1, src1w);
|
EMIT_MOV(compiler, dst_r, 0, src1, src1w);
|
||||||
inst = emit_x86_instruction(compiler, 2, dst_r, 0, TMP_REG2, 0);
|
inst = emit_x86_instruction(compiler, 2, dst_r, 0, TMP_REG2, 0);
|
||||||
@ -2118,7 +2119,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler
|
|||||||
sljit_si src2, sljit_sw src2w)
|
sljit_si src2, sljit_sw src2w)
|
||||||
{
|
{
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
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));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
ADJUST_LOCAL_OFFSET(src1, src1w);
|
ADJUST_LOCAL_OFFSET(src1, src1w);
|
||||||
ADJUST_LOCAL_OFFSET(src2, src2w);
|
ADJUST_LOCAL_OFFSET(src2, src2w);
|
||||||
@ -2209,7 +2210,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op2(struct sljit_compiler *compiler
|
|||||||
|
|
||||||
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_register_index(sljit_si reg)
|
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_register_index(sljit_si reg)
|
||||||
{
|
{
|
||||||
check_sljit_get_register_index(reg);
|
CHECK_REG_INDEX(check_sljit_get_register_index(reg));
|
||||||
#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
|
#if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32)
|
||||||
if (reg >= SLJIT_R3 && reg <= SLJIT_R6)
|
if (reg >= SLJIT_R3 && reg <= SLJIT_R6)
|
||||||
return -1;
|
return -1;
|
||||||
@ -2219,7 +2220,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_register_index(sljit_si reg)
|
|||||||
|
|
||||||
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_float_register_index(sljit_si reg)
|
SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_get_float_register_index(sljit_si reg)
|
||||||
{
|
{
|
||||||
check_sljit_get_float_register_index(reg);
|
CHECK_REG_INDEX(check_sljit_get_float_register_index(reg));
|
||||||
return reg;
|
return reg;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2229,8 +2230,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_custom(struct sljit_compiler *co
|
|||||||
sljit_ub *inst;
|
sljit_ub *inst;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_op_custom(compiler, instruction, size);
|
CHECK(check_sljit_emit_op_custom(compiler, instruction, size));
|
||||||
SLJIT_ASSERT(size > 0 && size < 16);
|
|
||||||
|
|
||||||
inst = (sljit_ub*)ensure_buf(compiler, 1 + size);
|
inst = (sljit_ub*)ensure_buf(compiler, 1 + size);
|
||||||
FAIL_IF(!inst);
|
FAIL_IF(!inst);
|
||||||
@ -2391,7 +2391,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop1(struct sljit_compiler *compile
|
|||||||
CHECK_ERROR();
|
CHECK_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_MOVD) {
|
if (GET_OPCODE(op) == SLJIT_DMOV) {
|
||||||
if (FAST_IS_REG(dst))
|
if (FAST_IS_REG(dst))
|
||||||
return emit_sse2_load(compiler, op & SLJIT_SINGLE_OP, dst, src, srcw);
|
return emit_sse2_load(compiler, op & SLJIT_SINGLE_OP, dst, src, srcw);
|
||||||
if (FAST_IS_REG(src))
|
if (FAST_IS_REG(src))
|
||||||
@ -2430,11 +2430,11 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop1(struct sljit_compiler *compile
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch (GET_OPCODE(op)) {
|
switch (GET_OPCODE(op)) {
|
||||||
case SLJIT_NEGD:
|
case SLJIT_DNEG:
|
||||||
FAIL_IF(emit_sse2_logic(compiler, XORPD_x_xm, 1, dst_r, SLJIT_MEM0(), (sljit_sw)(op & SLJIT_SINGLE_OP ? sse2_buffer : sse2_buffer + 8)));
|
FAIL_IF(emit_sse2_logic(compiler, XORPD_x_xm, 1, dst_r, SLJIT_MEM0(), (sljit_sw)(op & SLJIT_SINGLE_OP ? sse2_buffer : sse2_buffer + 8)));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SLJIT_ABSD:
|
case SLJIT_DABS:
|
||||||
FAIL_IF(emit_sse2_logic(compiler, ANDPD_x_xm, 1, dst_r, SLJIT_MEM0(), (sljit_sw)(op & SLJIT_SINGLE_OP ? sse2_buffer + 4 : sse2_buffer + 12)));
|
FAIL_IF(emit_sse2_logic(compiler, ANDPD_x_xm, 1, dst_r, SLJIT_MEM0(), (sljit_sw)(op & SLJIT_SINGLE_OP ? sse2_buffer + 4 : sse2_buffer + 12)));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -2452,7 +2452,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compile
|
|||||||
sljit_si dst_r;
|
sljit_si dst_r;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
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));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
ADJUST_LOCAL_OFFSET(src1, src1w);
|
ADJUST_LOCAL_OFFSET(src1, src1w);
|
||||||
ADJUST_LOCAL_OFFSET(src2, src2w);
|
ADJUST_LOCAL_OFFSET(src2, src2w);
|
||||||
@ -2465,7 +2465,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compile
|
|||||||
dst_r = dst;
|
dst_r = dst;
|
||||||
if (dst == src1)
|
if (dst == src1)
|
||||||
; /* Do nothing here. */
|
; /* Do nothing here. */
|
||||||
else if (dst == src2 && (op == SLJIT_ADDD || op == SLJIT_MULD)) {
|
else if (dst == src2 && (op == SLJIT_DADD || op == SLJIT_DMUL)) {
|
||||||
/* Swap arguments. */
|
/* Swap arguments. */
|
||||||
src2 = src1;
|
src2 = src1;
|
||||||
src2w = src1w;
|
src2w = src1w;
|
||||||
@ -2483,19 +2483,19 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_fop2(struct sljit_compiler *compile
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch (GET_OPCODE(op)) {
|
switch (GET_OPCODE(op)) {
|
||||||
case SLJIT_ADDD:
|
case SLJIT_DADD:
|
||||||
FAIL_IF(emit_sse2(compiler, ADDSD_x_xm, op & SLJIT_SINGLE_OP, dst_r, src2, src2w));
|
FAIL_IF(emit_sse2(compiler, ADDSD_x_xm, op & SLJIT_SINGLE_OP, dst_r, src2, src2w));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SLJIT_SUBD:
|
case SLJIT_DSUB:
|
||||||
FAIL_IF(emit_sse2(compiler, SUBSD_x_xm, op & SLJIT_SINGLE_OP, dst_r, src2, src2w));
|
FAIL_IF(emit_sse2(compiler, SUBSD_x_xm, op & SLJIT_SINGLE_OP, dst_r, src2, src2w));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SLJIT_MULD:
|
case SLJIT_DMUL:
|
||||||
FAIL_IF(emit_sse2(compiler, MULSD_x_xm, op & SLJIT_SINGLE_OP, dst_r, src2, src2w));
|
FAIL_IF(emit_sse2(compiler, MULSD_x_xm, op & SLJIT_SINGLE_OP, dst_r, src2, src2w));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SLJIT_DIVD:
|
case SLJIT_DDIV:
|
||||||
FAIL_IF(emit_sse2(compiler, DIVSD_x_xm, op & SLJIT_SINGLE_OP, dst_r, src2, src2w));
|
FAIL_IF(emit_sse2(compiler, DIVSD_x_xm, op & SLJIT_SINGLE_OP, dst_r, src2, src2w));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -2515,7 +2515,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compi
|
|||||||
struct sljit_label *label;
|
struct sljit_label *label;
|
||||||
|
|
||||||
CHECK_ERROR_PTR();
|
CHECK_ERROR_PTR();
|
||||||
check_sljit_emit_label(compiler);
|
CHECK_PTR(check_sljit_emit_label(compiler));
|
||||||
|
|
||||||
/* We should restore the flags before the label,
|
/* We should restore the flags before the label,
|
||||||
since other taken jumps has their own flags as well. */
|
since other taken jumps has their own flags as well. */
|
||||||
@ -2544,7 +2544,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compile
|
|||||||
struct sljit_jump *jump;
|
struct sljit_jump *jump;
|
||||||
|
|
||||||
CHECK_ERROR_PTR();
|
CHECK_ERROR_PTR();
|
||||||
check_sljit_emit_jump(compiler, type);
|
CHECK_PTR(check_sljit_emit_jump(compiler, type));
|
||||||
|
|
||||||
if (SLJIT_UNLIKELY(compiler->flags_saved)) {
|
if (SLJIT_UNLIKELY(compiler->flags_saved)) {
|
||||||
if ((type & 0xff) <= SLJIT_JUMP)
|
if ((type & 0xff) <= SLJIT_JUMP)
|
||||||
@ -2581,7 +2581,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_ijump(struct sljit_compiler *compil
|
|||||||
struct sljit_jump *jump;
|
struct sljit_jump *jump;
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_emit_ijump(compiler, type, src, srcw);
|
CHECK(check_sljit_emit_ijump(compiler, type, src, srcw));
|
||||||
ADJUST_LOCAL_OFFSET(src, srcw);
|
ADJUST_LOCAL_OFFSET(src, srcw);
|
||||||
|
|
||||||
CHECK_EXTRA_REGS(src, srcw, (void)0);
|
CHECK_EXTRA_REGS(src, srcw, (void)0);
|
||||||
@ -2660,7 +2660,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *com
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
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));
|
||||||
|
SLJIT_UNUSED_ARG(srcw);
|
||||||
|
|
||||||
if (dst == SLJIT_UNUSED)
|
if (dst == SLJIT_UNUSED)
|
||||||
return SLJIT_SUCCESS;
|
return SLJIT_SUCCESS;
|
||||||
@ -2670,6 +2671,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *com
|
|||||||
if (SLJIT_UNLIKELY(compiler->flags_saved))
|
if (SLJIT_UNLIKELY(compiler->flags_saved))
|
||||||
FAIL_IF(emit_restore_flags(compiler, op & SLJIT_KEEP_FLAGS));
|
FAIL_IF(emit_restore_flags(compiler, op & SLJIT_KEEP_FLAGS));
|
||||||
|
|
||||||
|
type &= 0xff;
|
||||||
/* setcc = jcc + 0x10. */
|
/* setcc = jcc + 0x10. */
|
||||||
cond_set = get_jump_code(type) + 0x10;
|
cond_set = get_jump_code(type) + 0x10;
|
||||||
|
|
||||||
@ -2711,7 +2713,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *com
|
|||||||
compiler->mode32 = GET_OPCODE(op) != SLJIT_MOV;
|
compiler->mode32 = GET_OPCODE(op) != SLJIT_MOV;
|
||||||
return emit_mov(compiler, dst, dstw, TMP_REG1, 0);
|
return emit_mov(compiler, dst, dstw, TMP_REG1, 0);
|
||||||
}
|
}
|
||||||
#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) || (defined SLJIT_DEBUG && SLJIT_DEBUG)
|
#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \
|
||||||
|
|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
|
||||||
compiler->skip_checks = 1;
|
compiler->skip_checks = 1;
|
||||||
#endif
|
#endif
|
||||||
return sljit_emit_op2(compiler, op, dst, dstw, dst, dstw, TMP_REG1, 0);
|
return sljit_emit_op2(compiler, op, dst, dstw, dst, dstw, TMP_REG1, 0);
|
||||||
@ -2821,7 +2824,8 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *com
|
|||||||
if (GET_OPCODE(op) < SLJIT_ADD)
|
if (GET_OPCODE(op) < SLJIT_ADD)
|
||||||
return emit_mov(compiler, dst, dstw, TMP_REG1, 0);
|
return emit_mov(compiler, dst, dstw, TMP_REG1, 0);
|
||||||
|
|
||||||
#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) || (defined SLJIT_DEBUG && SLJIT_DEBUG)
|
#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \
|
||||||
|
|| (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)
|
||||||
compiler->skip_checks = 1;
|
compiler->skip_checks = 1;
|
||||||
#endif
|
#endif
|
||||||
return sljit_emit_op2(compiler, op, dst_save, dstw_save, dst_save, dstw_save, TMP_REG1, 0);
|
return sljit_emit_op2(compiler, op, dst_save, dstw_save, dst_save, dstw_save, TMP_REG1, 0);
|
||||||
@ -2831,7 +2835,7 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_si sljit_emit_op_flags(struct sljit_compiler *com
|
|||||||
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_si sljit_get_local_base(struct sljit_compiler *compiler, sljit_si dst, sljit_sw dstw, sljit_sw offset)
|
||||||
{
|
{
|
||||||
CHECK_ERROR();
|
CHECK_ERROR();
|
||||||
check_sljit_get_local_base(compiler, dst, dstw, offset);
|
CHECK(check_sljit_get_local_base(compiler, dst, dstw, offset));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
|
|
||||||
CHECK_EXTRA_REGS(dst, dstw, (void)0);
|
CHECK_EXTRA_REGS(dst, dstw, (void)0);
|
||||||
@ -2868,7 +2872,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compi
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
CHECK_ERROR_PTR();
|
CHECK_ERROR_PTR();
|
||||||
check_sljit_emit_const(compiler, dst, dstw, init_value);
|
CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value));
|
||||||
ADJUST_LOCAL_OFFSET(dst, dstw);
|
ADJUST_LOCAL_OFFSET(dst, dstw);
|
||||||
|
|
||||||
CHECK_EXTRA_REGS(dst, dstw, (void)0);
|
CHECK_EXTRA_REGS(dst, dstw, (void)0);
|
||||||
|
@ -200,7 +200,7 @@ static SLJIT_INLINE sljit_si open_dev_zero(void)
|
|||||||
/* Planning to make it even more clever in the future. */
|
/* Planning to make it even more clever in the future. */
|
||||||
static sljit_sw sljit_page_align = 0;
|
static sljit_sw sljit_page_align = 0;
|
||||||
|
|
||||||
SLJIT_API_FUNC_ATTRIBUTE struct sljit_stack* SLJIT_CALL sljit_allocate_stack(sljit_uw limit, sljit_uw max_limit)
|
SLJIT_API_FUNC_ATTRIBUTE struct sljit_stack* SLJIT_CALL sljit_allocate_stack(sljit_uw limit, sljit_uw max_limit, void *allocator_data)
|
||||||
{
|
{
|
||||||
struct sljit_stack *stack;
|
struct sljit_stack *stack;
|
||||||
union {
|
union {
|
||||||
@ -211,6 +211,7 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_stack* SLJIT_CALL sljit_allocate_stack(slj
|
|||||||
SYSTEM_INFO si;
|
SYSTEM_INFO si;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
SLJIT_UNUSED_ARG(allocator_data);
|
||||||
if (limit > max_limit || limit < 1)
|
if (limit > max_limit || limit < 1)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
@ -232,21 +233,21 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_stack* SLJIT_CALL sljit_allocate_stack(slj
|
|||||||
/* Align limit and max_limit. */
|
/* Align limit and max_limit. */
|
||||||
max_limit = (max_limit + sljit_page_align) & ~sljit_page_align;
|
max_limit = (max_limit + sljit_page_align) & ~sljit_page_align;
|
||||||
|
|
||||||
stack = (struct sljit_stack*)SLJIT_MALLOC(sizeof(struct sljit_stack));
|
stack = (struct sljit_stack*)SLJIT_MALLOC(sizeof(struct sljit_stack), allocator_data);
|
||||||
if (!stack)
|
if (!stack)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
base.ptr = VirtualAlloc(NULL, max_limit, MEM_RESERVE, PAGE_READWRITE);
|
base.ptr = VirtualAlloc(NULL, max_limit, MEM_RESERVE, PAGE_READWRITE);
|
||||||
if (!base.ptr) {
|
if (!base.ptr) {
|
||||||
SLJIT_FREE(stack);
|
SLJIT_FREE(stack, allocator_data);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
stack->base = base.uw;
|
stack->base = base.uw;
|
||||||
stack->limit = stack->base;
|
stack->limit = stack->base;
|
||||||
stack->max_limit = stack->base + max_limit;
|
stack->max_limit = stack->base + max_limit;
|
||||||
if (sljit_stack_resize(stack, stack->base + limit)) {
|
if (sljit_stack_resize(stack, stack->base + limit)) {
|
||||||
sljit_free_stack(stack);
|
sljit_free_stack(stack, allocator_data);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
@ -255,14 +256,14 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_stack* SLJIT_CALL sljit_allocate_stack(slj
|
|||||||
#else
|
#else
|
||||||
if (dev_zero < 0) {
|
if (dev_zero < 0) {
|
||||||
if (open_dev_zero()) {
|
if (open_dev_zero()) {
|
||||||
SLJIT_FREE(stack);
|
SLJIT_FREE(stack, allocator_data);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
base.ptr = mmap(NULL, max_limit, PROT_READ | PROT_WRITE, MAP_PRIVATE, dev_zero, 0);
|
base.ptr = mmap(NULL, max_limit, PROT_READ | PROT_WRITE, MAP_PRIVATE, dev_zero, 0);
|
||||||
#endif
|
#endif
|
||||||
if (base.ptr == MAP_FAILED) {
|
if (base.ptr == MAP_FAILED) {
|
||||||
SLJIT_FREE(stack);
|
SLJIT_FREE(stack, allocator_data);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
stack->base = base.uw;
|
stack->base = base.uw;
|
||||||
@ -275,14 +276,15 @@ SLJIT_API_FUNC_ATTRIBUTE struct sljit_stack* SLJIT_CALL sljit_allocate_stack(slj
|
|||||||
|
|
||||||
#undef PAGE_ALIGN
|
#undef PAGE_ALIGN
|
||||||
|
|
||||||
SLJIT_API_FUNC_ATTRIBUTE void SLJIT_CALL sljit_free_stack(struct sljit_stack* stack)
|
SLJIT_API_FUNC_ATTRIBUTE void SLJIT_CALL sljit_free_stack(struct sljit_stack* stack, void *allocator_data)
|
||||||
{
|
{
|
||||||
|
SLJIT_UNUSED_ARG(allocator_data);
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
VirtualFree((void*)stack->base, 0, MEM_RELEASE);
|
VirtualFree((void*)stack->base, 0, MEM_RELEASE);
|
||||||
#else
|
#else
|
||||||
munmap((void*)stack->base, stack->max_limit - stack->base);
|
munmap((void*)stack->base, stack->max_limit - stack->base);
|
||||||
#endif
|
#endif
|
||||||
SLJIT_FREE(stack);
|
SLJIT_FREE(stack, allocator_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
SLJIT_API_FUNC_ATTRIBUTE sljit_sw SLJIT_CALL sljit_stack_resize(struct sljit_stack* stack, sljit_uw new_limit)
|
SLJIT_API_FUNC_ATTRIBUTE sljit_sw SLJIT_CALL sljit_stack_resize(struct sljit_stack* stack, sljit_uw new_limit)
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
scriptversion=2013-07-13.22; # UTC
|
scriptversion=2013-07-13.22; # UTC
|
||||||
|
|
||||||
# Copyright (C) 2011-2013 Free Software Foundation, Inc.
|
# Copyright (C) 2011-2014 Free Software Foundation, Inc.
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# This program is free software; you can redistribute it and/or modify
|
||||||
# it under the terms of the GNU General Public License as published by
|
# it under the terms of the GNU General Public License as published by
|
||||||
@ -106,11 +106,14 @@ trap "st=143; $do_exit" 15
|
|||||||
# Test script is run here.
|
# Test script is run here.
|
||||||
"$@" >$log_file 2>&1
|
"$@" >$log_file 2>&1
|
||||||
estatus=$?
|
estatus=$?
|
||||||
|
|
||||||
if test $enable_hard_errors = no && test $estatus -eq 99; then
|
if test $enable_hard_errors = no && test $estatus -eq 99; then
|
||||||
estatus=1
|
tweaked_estatus=1
|
||||||
|
else
|
||||||
|
tweaked_estatus=$estatus
|
||||||
fi
|
fi
|
||||||
|
|
||||||
case $estatus:$expect_failure in
|
case $tweaked_estatus:$expect_failure in
|
||||||
0:yes) col=$red res=XPASS recheck=yes gcopy=yes;;
|
0:yes) col=$red res=XPASS recheck=yes gcopy=yes;;
|
||||||
0:*) col=$grn res=PASS recheck=no gcopy=no;;
|
0:*) col=$grn res=PASS recheck=no gcopy=no;;
|
||||||
77:*) col=$blu res=SKIP recheck=no gcopy=yes;;
|
77:*) col=$blu res=SKIP recheck=no gcopy=yes;;
|
||||||
@ -119,6 +122,12 @@ case $estatus:$expect_failure in
|
|||||||
*:*) col=$red res=FAIL recheck=yes gcopy=yes;;
|
*:*) col=$red res=FAIL recheck=yes gcopy=yes;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
# Report the test outcome and exit status in the logs, so that one can
|
||||||
|
# know whether the test passed or failed simply by looking at the '.log'
|
||||||
|
# file, without the need of also peaking into the corresponding '.trs'
|
||||||
|
# file (automake bug#11814).
|
||||||
|
echo "$res $test_name (exit status: $estatus)" >>$log_file
|
||||||
|
|
||||||
# Report outcome to console.
|
# Report outcome to console.
|
||||||
echo "${col}${res}${std}: $test_name"
|
echo "${col}${res}${std}: $test_name"
|
||||||
|
|
||||||
|
8
pcre/testdata/grepoutput
vendored
8
pcre/testdata/grepoutput
vendored
@ -743,3 +743,11 @@ RC=0
|
|||||||
---------------------------- Test 106 -----------------------------
|
---------------------------- Test 106 -----------------------------
|
||||||
a
|
a
|
||||||
RC=0
|
RC=0
|
||||||
|
---------------------------- Test 107 -----------------------------
|
||||||
|
1:0,1
|
||||||
|
2:0,1
|
||||||
|
2:1,1
|
||||||
|
2:2,1
|
||||||
|
2:3,1
|
||||||
|
2:4,1
|
||||||
|
RC=0
|
||||||
|
10
pcre/testdata/testinput1
vendored
10
pcre/testdata/testinput1
vendored
@ -5720,4 +5720,14 @@ AbcdCBefgBhiBqz
|
|||||||
/[\Q]a\E]+/
|
/[\Q]a\E]+/
|
||||||
aa]]
|
aa]]
|
||||||
|
|
||||||
|
/(?:((abcd))|(((?:(?:(?:(?:abc|(?:abcdef))))b)abcdefghi)abc)|((*ACCEPT)))/
|
||||||
|
1234abcd
|
||||||
|
|
||||||
|
/(\2)(\1)/
|
||||||
|
|
||||||
|
"Z*(|d*){216}"
|
||||||
|
|
||||||
|
"(?1)(?#?'){8}(a)"
|
||||||
|
baaaaaaaaac
|
||||||
|
|
||||||
/-- End of testinput1 --/
|
/-- End of testinput1 --/
|
||||||
|
2
pcre/testdata/testinput11
vendored
2
pcre/testdata/testinput11
vendored
@ -134,4 +134,6 @@ is required for these tests. --/
|
|||||||
|
|
||||||
/(((a\2)|(a*)\g<-1>))*a?/B
|
/(((a\2)|(a*)\g<-1>))*a?/B
|
||||||
|
|
||||||
|
/((?+1)(\1))/B
|
||||||
|
|
||||||
/-- End of testinput11 --/
|
/-- End of testinput11 --/
|
||||||
|
8
pcre/testdata/testinput12
vendored
8
pcre/testdata/testinput12
vendored
@ -87,4 +87,12 @@ and a couple of things that are different with JIT. --/
|
|||||||
/^12345678abcd/mS++
|
/^12345678abcd/mS++
|
||||||
12345678abcd
|
12345678abcd
|
||||||
|
|
||||||
|
/-- Test pattern compilation --/
|
||||||
|
|
||||||
|
/(?:a|b|c|d|e)(?R)/S++
|
||||||
|
|
||||||
|
/(?:a|b|c|d|e)(?R)(?R)/S++
|
||||||
|
|
||||||
|
/(a(?:a|b|c|d|e)b){8,16}/S++
|
||||||
|
|
||||||
/-- End of testinput12 --/
|
/-- End of testinput12 --/
|
||||||
|
74
pcre/testdata/testinput2
vendored
74
pcre/testdata/testinput2
vendored
@ -1380,6 +1380,8 @@
|
|||||||
1X
|
1X
|
||||||
123456\P
|
123456\P
|
||||||
|
|
||||||
|
//KF>/dev/null
|
||||||
|
|
||||||
/abc/IS>testsavedregex
|
/abc/IS>testsavedregex
|
||||||
<testsavedregex
|
<testsavedregex
|
||||||
abc
|
abc
|
||||||
@ -4078,4 +4080,76 @@ backtracking verbs. --/
|
|||||||
|
|
||||||
/\x{whatever}/
|
/\x{whatever}/
|
||||||
|
|
||||||
|
"((?=(?(?=(?(?=(?(?=()))))))))"
|
||||||
|
a
|
||||||
|
|
||||||
|
"(?(?=)==)(((((((((?=)))))))))"
|
||||||
|
a
|
||||||
|
|
||||||
|
/^(?:(a)|b)(?(1)A|B)/I
|
||||||
|
aA123\O3
|
||||||
|
aA123\O6
|
||||||
|
|
||||||
|
'^(?:(?<AA>a)|b)(?(<AA>)A|B)'
|
||||||
|
aA123\O3
|
||||||
|
aA123\O6
|
||||||
|
|
||||||
|
'^(?<AA>)(?:(?<AA>a)|b)(?(<AA>)A|B)'J
|
||||||
|
aA123\O3
|
||||||
|
aA123\O6
|
||||||
|
|
||||||
|
'^(?:(?<AA>X)|)(?:(?<AA>a)|b)\k{AA}'J
|
||||||
|
aa123\O3
|
||||||
|
aa123\O6
|
||||||
|
|
||||||
|
/(?<N111>(?J)(?<N111>1(111111)11|)1|1|)(?(<N111>)1)/
|
||||||
|
|
||||||
|
/(?(?=0)?)+/
|
||||||
|
|
||||||
|
/(?(?=0)(?=00)?00765)/
|
||||||
|
00765
|
||||||
|
|
||||||
|
/(?(?=0)(?=00)?00765|(?!3).56)/
|
||||||
|
00765
|
||||||
|
456
|
||||||
|
** Failers
|
||||||
|
356
|
||||||
|
|
||||||
|
'^(a)*+(\w)'
|
||||||
|
g
|
||||||
|
g\O3
|
||||||
|
|
||||||
|
'^(?:a)*+(\w)'
|
||||||
|
g
|
||||||
|
g\O3
|
||||||
|
|
||||||
|
//C
|
||||||
|
\O\C+
|
||||||
|
|
||||||
|
"((?2){0,1999}())?"
|
||||||
|
|
||||||
|
/((?+1)(\1))/BZ
|
||||||
|
|
||||||
|
/(?(?!)a|b)/
|
||||||
|
bbb
|
||||||
|
aaa
|
||||||
|
|
||||||
|
"((?2)+)((?1))"
|
||||||
|
|
||||||
|
"(?(?<E>.*!.*)?)"
|
||||||
|
|
||||||
|
"X((?2)()*+){2}+"BZ
|
||||||
|
|
||||||
|
"X((?2)()*+){2}"BZ
|
||||||
|
|
||||||
|
"(?<=((?2))((?1)))"
|
||||||
|
|
||||||
|
/(?<=\Ka)/g+
|
||||||
|
aaaaa
|
||||||
|
|
||||||
|
/(?<=\Ka)/G+
|
||||||
|
aaaaa
|
||||||
|
|
||||||
|
/((?2){73}(?2))((?1))/
|
||||||
|
|
||||||
/-- End of testinput2 --/
|
/-- End of testinput2 --/
|
||||||
|
5
pcre/testdata/testinput4
vendored
5
pcre/testdata/testinput4
vendored
@ -722,4 +722,9 @@
|
|||||||
/^#[^\x{ffff}]#[^\x{ffff}]#[^\x{ffff}]#/8
|
/^#[^\x{ffff}]#[^\x{ffff}]#[^\x{ffff}]#/8
|
||||||
#\x{10000}#\x{100}#\x{10ffff}#
|
#\x{10000}#\x{100}#\x{10ffff}#
|
||||||
|
|
||||||
|
"[\S\V\H]"8
|
||||||
|
|
||||||
|
/\C(\W?ſ)'?{{/8
|
||||||
|
\\C(\\W?ſ)'?{{
|
||||||
|
|
||||||
/-- End of testinput4 --/
|
/-- End of testinput4 --/
|
||||||
|
8
pcre/testdata/testinput5
vendored
8
pcre/testdata/testinput5
vendored
@ -790,4 +790,12 @@
|
|||||||
|
|
||||||
/[b-d\x{200}-\x{250}]*[ae-h]?#[\x{200}-\x{250}]{0,8}[\x00-\xff]*#[\x{200}-\x{250}]+[a-z]/8BZ
|
/[b-d\x{200}-\x{250}]*[ae-h]?#[\x{200}-\x{250}]{0,8}[\x00-\xff]*#[\x{200}-\x{250}]+[a-z]/8BZ
|
||||||
|
|
||||||
|
/[^\xff]*PRUNE:\x{100}abc(xyz(?1))/8DZ
|
||||||
|
|
||||||
|
/(?<=\K\x{17f})/8g+
|
||||||
|
\x{17f}\x{17f}\x{17f}\x{17f}\x{17f}
|
||||||
|
|
||||||
|
/(?<=\K\x{17f})/8G+
|
||||||
|
\x{17f}\x{17f}\x{17f}\x{17f}\x{17f}
|
||||||
|
|
||||||
/-- End of testinput5 --/
|
/-- End of testinput5 --/
|
||||||
|
6
pcre/testdata/testinput6
vendored
6
pcre/testdata/testinput6
vendored
@ -1496,4 +1496,10 @@
|
|||||||
/^s?c/mi8
|
/^s?c/mi8
|
||||||
scat
|
scat
|
||||||
|
|
||||||
|
/[A-`]/i8
|
||||||
|
abcdefghijklmno
|
||||||
|
|
||||||
|
/\C\X*QT/8
|
||||||
|
Ӆ\x0aT
|
||||||
|
|
||||||
/-- End of testinput6 --/
|
/-- End of testinput6 --/
|
||||||
|
4
pcre/testdata/testinput8
vendored
4
pcre/testdata/testinput8
vendored
@ -4837,4 +4837,8 @@
|
|||||||
'\A(?:[^\"]++|\"(?:[^\"]++|\"\")*+\")++'
|
'\A(?:[^\"]++|\"(?:[^\"]++|\"\")*+\")++'
|
||||||
NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED
|
NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED
|
||||||
|
|
||||||
|
/(?(?!)a|b)/
|
||||||
|
bbb
|
||||||
|
aaa
|
||||||
|
|
||||||
/-- End of testinput8 --/
|
/-- End of testinput8 --/
|
||||||
|
18
pcre/testdata/testoutput1
vendored
18
pcre/testdata/testoutput1
vendored
@ -9411,4 +9411,22 @@ No match
|
|||||||
aa]]
|
aa]]
|
||||||
0: aa]]
|
0: aa]]
|
||||||
|
|
||||||
|
/(?:((abcd))|(((?:(?:(?:(?:abc|(?:abcdef))))b)abcdefghi)abc)|((*ACCEPT)))/
|
||||||
|
1234abcd
|
||||||
|
0:
|
||||||
|
1: <unset>
|
||||||
|
2: <unset>
|
||||||
|
3: <unset>
|
||||||
|
4: <unset>
|
||||||
|
5:
|
||||||
|
|
||||||
|
/(\2)(\1)/
|
||||||
|
|
||||||
|
"Z*(|d*){216}"
|
||||||
|
|
||||||
|
"(?1)(?#?'){8}(a)"
|
||||||
|
baaaaaaaaac
|
||||||
|
0: aaaaaaaaa
|
||||||
|
1: a
|
||||||
|
|
||||||
/-- End of testinput1 --/
|
/-- End of testinput1 --/
|
||||||
|
17
pcre/testdata/testoutput11-16
vendored
17
pcre/testdata/testoutput11-16
vendored
@ -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): 57
|
Memory allocation (code space): 61
|
||||||
------------------------------------------------------------------
|
------------------------------------------------------------------
|
||||||
0 24 Bra
|
0 24 Bra
|
||||||
2 5 CBra 1
|
2 5 CBra 1
|
||||||
@ -733,4 +733,19 @@ Memory allocation (code space): 14
|
|||||||
41 End
|
41 End
|
||||||
------------------------------------------------------------------
|
------------------------------------------------------------------
|
||||||
|
|
||||||
|
/((?+1)(\1))/B
|
||||||
|
------------------------------------------------------------------
|
||||||
|
0 20 Bra
|
||||||
|
2 16 Once
|
||||||
|
4 12 CBra 1
|
||||||
|
7 9 Recurse
|
||||||
|
9 5 CBra 2
|
||||||
|
12 \1
|
||||||
|
14 5 Ket
|
||||||
|
16 12 Ket
|
||||||
|
18 16 Ket
|
||||||
|
20 20 Ket
|
||||||
|
22 End
|
||||||
|
------------------------------------------------------------------
|
||||||
|
|
||||||
/-- End of testinput11 --/
|
/-- End of testinput11 --/
|
||||||
|
17
pcre/testdata/testoutput11-32
vendored
17
pcre/testdata/testoutput11-32
vendored
@ -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): 117
|
Memory allocation (code space): 125
|
||||||
------------------------------------------------------------------
|
------------------------------------------------------------------
|
||||||
0 24 Bra
|
0 24 Bra
|
||||||
2 5 CBra 1
|
2 5 CBra 1
|
||||||
@ -733,4 +733,19 @@ Memory allocation (code space): 28
|
|||||||
41 End
|
41 End
|
||||||
------------------------------------------------------------------
|
------------------------------------------------------------------
|
||||||
|
|
||||||
|
/((?+1)(\1))/B
|
||||||
|
------------------------------------------------------------------
|
||||||
|
0 20 Bra
|
||||||
|
2 16 Once
|
||||||
|
4 12 CBra 1
|
||||||
|
7 9 Recurse
|
||||||
|
9 5 CBra 2
|
||||||
|
12 \1
|
||||||
|
14 5 Ket
|
||||||
|
16 12 Ket
|
||||||
|
18 16 Ket
|
||||||
|
20 20 Ket
|
||||||
|
22 End
|
||||||
|
------------------------------------------------------------------
|
||||||
|
|
||||||
/-- End of testinput11 --/
|
/-- End of testinput11 --/
|
||||||
|
17
pcre/testdata/testoutput11-8
vendored
17
pcre/testdata/testoutput11-8
vendored
@ -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): 34
|
Memory allocation (code space): 38
|
||||||
------------------------------------------------------------------
|
------------------------------------------------------------------
|
||||||
0 30 Bra
|
0 30 Bra
|
||||||
3 7 CBra 1
|
3 7 CBra 1
|
||||||
@ -733,4 +733,19 @@ Memory allocation (code space): 10
|
|||||||
60 End
|
60 End
|
||||||
------------------------------------------------------------------
|
------------------------------------------------------------------
|
||||||
|
|
||||||
|
/((?+1)(\1))/B
|
||||||
|
------------------------------------------------------------------
|
||||||
|
0 31 Bra
|
||||||
|
3 25 Once
|
||||||
|
6 19 CBra 1
|
||||||
|
11 14 Recurse
|
||||||
|
14 8 CBra 2
|
||||||
|
19 \1
|
||||||
|
22 8 Ket
|
||||||
|
25 19 Ket
|
||||||
|
28 25 Ket
|
||||||
|
31 31 Ket
|
||||||
|
34 End
|
||||||
|
------------------------------------------------------------------
|
||||||
|
|
||||||
/-- End of testinput11 --/
|
/-- End of testinput11 --/
|
||||||
|
8
pcre/testdata/testoutput12
vendored
8
pcre/testdata/testoutput12
vendored
@ -176,4 +176,12 @@ No match, mark = m (JIT)
|
|||||||
12345678abcd
|
12345678abcd
|
||||||
0: 12345678abcd (JIT)
|
0: 12345678abcd (JIT)
|
||||||
|
|
||||||
|
/-- Test pattern compilation --/
|
||||||
|
|
||||||
|
/(?:a|b|c|d|e)(?R)/S++
|
||||||
|
|
||||||
|
/(?:a|b|c|d|e)(?R)(?R)/S++
|
||||||
|
|
||||||
|
/(a(?:a|b|c|d|e)b){8,16}/S++
|
||||||
|
|
||||||
/-- End of testinput12 --/
|
/-- End of testinput12 --/
|
||||||
|
219
pcre/testdata/testoutput2
vendored
219
pcre/testdata/testoutput2
vendored
@ -561,7 +561,7 @@ Failed: assertion expected after (?( at offset 3
|
|||||||
Failed: reference to non-existent subpattern at offset 7
|
Failed: reference to non-existent subpattern at offset 7
|
||||||
|
|
||||||
/(?(?<ab))/
|
/(?(?<ab))/
|
||||||
Failed: syntax error in subpattern name (missing terminator) at offset 7
|
Failed: assertion expected after (?( at offset 3
|
||||||
|
|
||||||
/((?s)blah)\s+\1/I
|
/((?s)blah)\s+\1/I
|
||||||
Capturing subpattern count = 1
|
Capturing subpattern count = 1
|
||||||
@ -1566,30 +1566,35 @@ Need char = 'b'
|
|||||||
|
|
||||||
/a(?(1)b)(.)/I
|
/a(?(1)b)(.)/I
|
||||||
Capturing subpattern count = 1
|
Capturing subpattern count = 1
|
||||||
|
Max back reference = 1
|
||||||
No options
|
No options
|
||||||
First char = 'a'
|
First char = 'a'
|
||||||
No need char
|
No need char
|
||||||
|
|
||||||
/a(?(1)bag|big)(.)/I
|
/a(?(1)bag|big)(.)/I
|
||||||
Capturing subpattern count = 1
|
Capturing subpattern count = 1
|
||||||
|
Max back reference = 1
|
||||||
No options
|
No options
|
||||||
First char = 'a'
|
First char = 'a'
|
||||||
Need char = 'g'
|
Need char = 'g'
|
||||||
|
|
||||||
/a(?(1)bag|big)*(.)/I
|
/a(?(1)bag|big)*(.)/I
|
||||||
Capturing subpattern count = 1
|
Capturing subpattern count = 1
|
||||||
|
Max back reference = 1
|
||||||
No options
|
No options
|
||||||
First char = 'a'
|
First char = 'a'
|
||||||
No need char
|
No need char
|
||||||
|
|
||||||
/a(?(1)bag|big)+(.)/I
|
/a(?(1)bag|big)+(.)/I
|
||||||
Capturing subpattern count = 1
|
Capturing subpattern count = 1
|
||||||
|
Max back reference = 1
|
||||||
No options
|
No options
|
||||||
First char = 'a'
|
First char = 'a'
|
||||||
Need char = 'g'
|
Need char = 'g'
|
||||||
|
|
||||||
/a(?(1)b..|b..)(.)/I
|
/a(?(1)b..|b..)(.)/I
|
||||||
Capturing subpattern count = 1
|
Capturing subpattern count = 1
|
||||||
|
Max back reference = 1
|
||||||
No options
|
No options
|
||||||
First char = 'a'
|
First char = 'a'
|
||||||
Need char = 'b'
|
Need char = 'b'
|
||||||
@ -3379,24 +3384,28 @@ Need char = 'a'
|
|||||||
|
|
||||||
/(?(1)ab|ac)(.)/I
|
/(?(1)ab|ac)(.)/I
|
||||||
Capturing subpattern count = 1
|
Capturing subpattern count = 1
|
||||||
|
Max back reference = 1
|
||||||
No options
|
No options
|
||||||
First char = 'a'
|
First char = 'a'
|
||||||
No need char
|
No need char
|
||||||
|
|
||||||
/(?(1)abz|acz)(.)/I
|
/(?(1)abz|acz)(.)/I
|
||||||
Capturing subpattern count = 1
|
Capturing subpattern count = 1
|
||||||
|
Max back reference = 1
|
||||||
No options
|
No options
|
||||||
First char = 'a'
|
First char = 'a'
|
||||||
Need char = 'z'
|
Need char = 'z'
|
||||||
|
|
||||||
/(?(1)abz)(.)/I
|
/(?(1)abz)(.)/I
|
||||||
Capturing subpattern count = 1
|
Capturing subpattern count = 1
|
||||||
|
Max back reference = 1
|
||||||
No options
|
No options
|
||||||
No first char
|
No first char
|
||||||
No need char
|
No need char
|
||||||
|
|
||||||
/(?(1)abz)(1)23/I
|
/(?(1)abz)(1)23/I
|
||||||
Capturing subpattern count = 1
|
Capturing subpattern count = 1
|
||||||
|
Max back reference = 1
|
||||||
No options
|
No options
|
||||||
No first char
|
No first char
|
||||||
Need char = '3'
|
Need char = '3'
|
||||||
@ -5605,6 +5614,10 @@ No match
|
|||||||
123456\P
|
123456\P
|
||||||
No match
|
No match
|
||||||
|
|
||||||
|
//KF>/dev/null
|
||||||
|
Compiled pattern written to /dev/null
|
||||||
|
Study data written to /dev/null
|
||||||
|
|
||||||
/abc/IS>testsavedregex
|
/abc/IS>testsavedregex
|
||||||
Capturing subpattern count = 0
|
Capturing subpattern count = 0
|
||||||
No options
|
No options
|
||||||
@ -6336,6 +6349,7 @@ No need char
|
|||||||
|
|
||||||
/^(?P<A>a)?(?(A)a|b)/I
|
/^(?P<A>a)?(?(A)a|b)/I
|
||||||
Capturing subpattern count = 1
|
Capturing subpattern count = 1
|
||||||
|
Max back reference = 1
|
||||||
Named capturing subpatterns:
|
Named capturing subpatterns:
|
||||||
A 1
|
A 1
|
||||||
Options: anchored
|
Options: anchored
|
||||||
@ -6353,6 +6367,7 @@ No match
|
|||||||
|
|
||||||
/(?:(?(ZZ)a|b)(?P<ZZ>X))+/I
|
/(?:(?(ZZ)a|b)(?P<ZZ>X))+/I
|
||||||
Capturing subpattern count = 1
|
Capturing subpattern count = 1
|
||||||
|
Max back reference = 1
|
||||||
Named capturing subpatterns:
|
Named capturing subpatterns:
|
||||||
ZZ 1
|
ZZ 1
|
||||||
No options
|
No options
|
||||||
@ -6370,6 +6385,7 @@ Failed: reference to non-existent subpattern at offset 9
|
|||||||
|
|
||||||
/(?:(?(ZZ)a|b)(?(ZZ)a|b)(?P<ZZ>X))+/I
|
/(?:(?(ZZ)a|b)(?(ZZ)a|b)(?P<ZZ>X))+/I
|
||||||
Capturing subpattern count = 1
|
Capturing subpattern count = 1
|
||||||
|
Max back reference = 1
|
||||||
Named capturing subpatterns:
|
Named capturing subpatterns:
|
||||||
ZZ 1
|
ZZ 1
|
||||||
No options
|
No options
|
||||||
@ -6381,6 +6397,7 @@ Need char = 'X'
|
|||||||
|
|
||||||
/(?:(?(ZZ)a|\(b\))\\(?P<ZZ>X))+/I
|
/(?:(?(ZZ)a|\(b\))\\(?P<ZZ>X))+/I
|
||||||
Capturing subpattern count = 1
|
Capturing subpattern count = 1
|
||||||
|
Max back reference = 1
|
||||||
Named capturing subpatterns:
|
Named capturing subpatterns:
|
||||||
ZZ 1
|
ZZ 1
|
||||||
No options
|
No options
|
||||||
@ -10226,6 +10243,7 @@ No starting char list
|
|||||||
(?(1)|.) # check that there was an empty component
|
(?(1)|.) # check that there was an empty component
|
||||||
/xiIS
|
/xiIS
|
||||||
Capturing subpattern count = 1
|
Capturing subpattern count = 1
|
||||||
|
Max back reference = 1
|
||||||
Options: anchored caseless extended
|
Options: anchored caseless extended
|
||||||
No first char
|
No first char
|
||||||
Need char = ':'
|
Need char = ':'
|
||||||
@ -10255,6 +10273,7 @@ Failed: different names for subpatterns of the same number are not allowed at of
|
|||||||
b(?<quote> (?<apostrophe>')|(?<realquote>")) )
|
b(?<quote> (?<apostrophe>')|(?<realquote>")) )
|
||||||
(?('quote')[a-z]+|[0-9]+)/JIx
|
(?('quote')[a-z]+|[0-9]+)/JIx
|
||||||
Capturing subpattern count = 6
|
Capturing subpattern count = 6
|
||||||
|
Max back reference = 1
|
||||||
Named capturing subpatterns:
|
Named capturing subpatterns:
|
||||||
apostrophe 2
|
apostrophe 2
|
||||||
apostrophe 5
|
apostrophe 5
|
||||||
@ -10317,6 +10336,7 @@ No match
|
|||||||
End
|
End
|
||||||
------------------------------------------------------------------
|
------------------------------------------------------------------
|
||||||
Capturing subpattern count = 4
|
Capturing subpattern count = 4
|
||||||
|
Max back reference = 4
|
||||||
Named capturing subpatterns:
|
Named capturing subpatterns:
|
||||||
D 4
|
D 4
|
||||||
D 1
|
D 1
|
||||||
@ -10364,6 +10384,7 @@ No match
|
|||||||
End
|
End
|
||||||
------------------------------------------------------------------
|
------------------------------------------------------------------
|
||||||
Capturing subpattern count = 4
|
Capturing subpattern count = 4
|
||||||
|
Max back reference = 1
|
||||||
Named capturing subpatterns:
|
Named capturing subpatterns:
|
||||||
A 1
|
A 1
|
||||||
A 4
|
A 4
|
||||||
@ -10486,6 +10507,7 @@ No starting char list
|
|||||||
|
|
||||||
/()i(?(1)a)/SI
|
/()i(?(1)a)/SI
|
||||||
Capturing subpattern count = 1
|
Capturing subpattern count = 1
|
||||||
|
Max back reference = 1
|
||||||
No options
|
No options
|
||||||
No first char
|
No first char
|
||||||
Need char = 'i'
|
Need char = 'i'
|
||||||
@ -14206,4 +14228,199 @@ Failed: digits missing in \x{} or \o{} at offset 3
|
|||||||
/\x{whatever}/
|
/\x{whatever}/
|
||||||
Failed: non-hex character in \x{} (closing brace missing?) at offset 3
|
Failed: non-hex character in \x{} (closing brace missing?) at offset 3
|
||||||
|
|
||||||
|
"((?=(?(?=(?(?=(?(?=()))))))))"
|
||||||
|
a
|
||||||
|
0:
|
||||||
|
1:
|
||||||
|
2:
|
||||||
|
|
||||||
|
"(?(?=)==)(((((((((?=)))))))))"
|
||||||
|
a
|
||||||
|
No match
|
||||||
|
|
||||||
|
/^(?:(a)|b)(?(1)A|B)/I
|
||||||
|
Capturing subpattern count = 1
|
||||||
|
Max back reference = 1
|
||||||
|
Options: anchored
|
||||||
|
No first char
|
||||||
|
No need char
|
||||||
|
aA123\O3
|
||||||
|
Matched, but too many substrings
|
||||||
|
0: aA
|
||||||
|
aA123\O6
|
||||||
|
0: aA
|
||||||
|
1: a
|
||||||
|
|
||||||
|
'^(?:(?<AA>a)|b)(?(<AA>)A|B)'
|
||||||
|
aA123\O3
|
||||||
|
Matched, but too many substrings
|
||||||
|
0: aA
|
||||||
|
aA123\O6
|
||||||
|
0: aA
|
||||||
|
1: a
|
||||||
|
|
||||||
|
'^(?<AA>)(?:(?<AA>a)|b)(?(<AA>)A|B)'J
|
||||||
|
aA123\O3
|
||||||
|
Matched, but too many substrings
|
||||||
|
0: aA
|
||||||
|
aA123\O6
|
||||||
|
Matched, but too many substrings
|
||||||
|
0: aA
|
||||||
|
1:
|
||||||
|
|
||||||
|
'^(?:(?<AA>X)|)(?:(?<AA>a)|b)\k{AA}'J
|
||||||
|
aa123\O3
|
||||||
|
Matched, but too many substrings
|
||||||
|
0: aa
|
||||||
|
aa123\O6
|
||||||
|
Matched, but too many substrings
|
||||||
|
0: aa
|
||||||
|
1: <unset>
|
||||||
|
|
||||||
|
/(?<N111>(?J)(?<N111>1(111111)11|)1|1|)(?(<N111>)1)/
|
||||||
|
|
||||||
|
/(?(?=0)?)+/
|
||||||
|
Failed: nothing to repeat at offset 7
|
||||||
|
|
||||||
|
/(?(?=0)(?=00)?00765)/
|
||||||
|
00765
|
||||||
|
0: 00765
|
||||||
|
|
||||||
|
/(?(?=0)(?=00)?00765|(?!3).56)/
|
||||||
|
00765
|
||||||
|
0: 00765
|
||||||
|
456
|
||||||
|
0: 456
|
||||||
|
** Failers
|
||||||
|
No match
|
||||||
|
356
|
||||||
|
No match
|
||||||
|
|
||||||
|
'^(a)*+(\w)'
|
||||||
|
g
|
||||||
|
0: g
|
||||||
|
1: <unset>
|
||||||
|
2: g
|
||||||
|
g\O3
|
||||||
|
Matched, but too many substrings
|
||||||
|
0: g
|
||||||
|
|
||||||
|
'^(?:a)*+(\w)'
|
||||||
|
g
|
||||||
|
0: g
|
||||||
|
1: g
|
||||||
|
g\O3
|
||||||
|
Matched, but too many substrings
|
||||||
|
0: g
|
||||||
|
|
||||||
|
//C
|
||||||
|
\O\C+
|
||||||
|
Callout 255: last capture = -1
|
||||||
|
--->
|
||||||
|
+0 ^
|
||||||
|
Matched, but too many substrings
|
||||||
|
|
||||||
|
"((?2){0,1999}())?"
|
||||||
|
|
||||||
|
/((?+1)(\1))/BZ
|
||||||
|
------------------------------------------------------------------
|
||||||
|
Bra
|
||||||
|
Once
|
||||||
|
CBra 1
|
||||||
|
Recurse
|
||||||
|
CBra 2
|
||||||
|
\1
|
||||||
|
Ket
|
||||||
|
Ket
|
||||||
|
Ket
|
||||||
|
Ket
|
||||||
|
End
|
||||||
|
------------------------------------------------------------------
|
||||||
|
|
||||||
|
/(?(?!)a|b)/
|
||||||
|
bbb
|
||||||
|
0: b
|
||||||
|
aaa
|
||||||
|
No match
|
||||||
|
|
||||||
|
"((?2)+)((?1))"
|
||||||
|
|
||||||
|
"(?(?<E>.*!.*)?)"
|
||||||
|
Failed: assertion expected after (?( at offset 3
|
||||||
|
|
||||||
|
"X((?2)()*+){2}+"BZ
|
||||||
|
------------------------------------------------------------------
|
||||||
|
Bra
|
||||||
|
X
|
||||||
|
Once
|
||||||
|
CBra 1
|
||||||
|
Recurse
|
||||||
|
Braposzero
|
||||||
|
SCBraPos 2
|
||||||
|
KetRpos
|
||||||
|
Ket
|
||||||
|
CBra 1
|
||||||
|
Recurse
|
||||||
|
Braposzero
|
||||||
|
SCBraPos 2
|
||||||
|
KetRpos
|
||||||
|
Ket
|
||||||
|
Ket
|
||||||
|
Ket
|
||||||
|
End
|
||||||
|
------------------------------------------------------------------
|
||||||
|
|
||||||
|
"X((?2)()*+){2}"BZ
|
||||||
|
------------------------------------------------------------------
|
||||||
|
Bra
|
||||||
|
X
|
||||||
|
CBra 1
|
||||||
|
Recurse
|
||||||
|
Braposzero
|
||||||
|
SCBraPos 2
|
||||||
|
KetRpos
|
||||||
|
Ket
|
||||||
|
CBra 1
|
||||||
|
Recurse
|
||||||
|
Braposzero
|
||||||
|
SCBraPos 2
|
||||||
|
KetRpos
|
||||||
|
Ket
|
||||||
|
Ket
|
||||||
|
End
|
||||||
|
------------------------------------------------------------------
|
||||||
|
|
||||||
|
"(?<=((?2))((?1)))"
|
||||||
|
Failed: lookbehind assertion is not fixed length at offset 17
|
||||||
|
|
||||||
|
/(?<=\Ka)/g+
|
||||||
|
aaaaa
|
||||||
|
0: a
|
||||||
|
0+ aaaa
|
||||||
|
0: a
|
||||||
|
0+ aaaa
|
||||||
|
0: a
|
||||||
|
0+ aaa
|
||||||
|
0: a
|
||||||
|
0+ aa
|
||||||
|
0: a
|
||||||
|
0+ a
|
||||||
|
0: a
|
||||||
|
0+
|
||||||
|
|
||||||
|
/(?<=\Ka)/G+
|
||||||
|
aaaaa
|
||||||
|
0: a
|
||||||
|
0+ aaaa
|
||||||
|
0: a
|
||||||
|
0+ aaa
|
||||||
|
0: a
|
||||||
|
0+ aa
|
||||||
|
0: a
|
||||||
|
0+ a
|
||||||
|
0: a
|
||||||
|
0+
|
||||||
|
|
||||||
|
/((?2){73}(?2))((?1))/
|
||||||
|
|
||||||
/-- End of testinput2 --/
|
/-- End of testinput2 --/
|
||||||
|
6
pcre/testdata/testoutput4
vendored
6
pcre/testdata/testoutput4
vendored
@ -1271,4 +1271,10 @@ No match
|
|||||||
#\x{10000}#\x{100}#\x{10ffff}#
|
#\x{10000}#\x{100}#\x{10ffff}#
|
||||||
0: #\x{10000}#\x{100}#\x{10ffff}#
|
0: #\x{10000}#\x{100}#\x{10ffff}#
|
||||||
|
|
||||||
|
"[\S\V\H]"8
|
||||||
|
|
||||||
|
/\C(\W?ſ)'?{{/8
|
||||||
|
\\C(\\W?ſ)'?{{
|
||||||
|
No match
|
||||||
|
|
||||||
/-- End of testinput4 --/
|
/-- End of testinput4 --/
|
||||||
|
45
pcre/testdata/testoutput5
vendored
45
pcre/testdata/testoutput5
vendored
@ -1897,4 +1897,49 @@ Failed: disallowed Unicode code point (>= 0xd800 && <= 0xdfff) at offset 5
|
|||||||
End
|
End
|
||||||
------------------------------------------------------------------
|
------------------------------------------------------------------
|
||||||
|
|
||||||
|
/[^\xff]*PRUNE:\x{100}abc(xyz(?1))/8DZ
|
||||||
|
------------------------------------------------------------------
|
||||||
|
Bra
|
||||||
|
[^\x{ff}]*
|
||||||
|
PRUNE:\x{100}abc
|
||||||
|
CBra 1
|
||||||
|
xyz
|
||||||
|
Recurse
|
||||||
|
Ket
|
||||||
|
Ket
|
||||||
|
End
|
||||||
|
------------------------------------------------------------------
|
||||||
|
Capturing subpattern count = 1
|
||||||
|
Options: utf
|
||||||
|
No first char
|
||||||
|
Need char = 'z'
|
||||||
|
|
||||||
|
/(?<=\K\x{17f})/8g+
|
||||||
|
\x{17f}\x{17f}\x{17f}\x{17f}\x{17f}
|
||||||
|
0: \x{17f}
|
||||||
|
0+ \x{17f}\x{17f}\x{17f}\x{17f}
|
||||||
|
0: \x{17f}
|
||||||
|
0+ \x{17f}\x{17f}\x{17f}\x{17f}
|
||||||
|
0: \x{17f}
|
||||||
|
0+ \x{17f}\x{17f}\x{17f}
|
||||||
|
0: \x{17f}
|
||||||
|
0+ \x{17f}\x{17f}
|
||||||
|
0: \x{17f}
|
||||||
|
0+ \x{17f}
|
||||||
|
0: \x{17f}
|
||||||
|
0+
|
||||||
|
|
||||||
|
/(?<=\K\x{17f})/8G+
|
||||||
|
\x{17f}\x{17f}\x{17f}\x{17f}\x{17f}
|
||||||
|
0: \x{17f}
|
||||||
|
0+ \x{17f}\x{17f}\x{17f}\x{17f}
|
||||||
|
0: \x{17f}
|
||||||
|
0+ \x{17f}\x{17f}\x{17f}
|
||||||
|
0: \x{17f}
|
||||||
|
0+ \x{17f}\x{17f}
|
||||||
|
0: \x{17f}
|
||||||
|
0+ \x{17f}
|
||||||
|
0: \x{17f}
|
||||||
|
0+
|
||||||
|
|
||||||
/-- End of testinput5 --/
|
/-- End of testinput5 --/
|
||||||
|
8
pcre/testdata/testoutput6
vendored
8
pcre/testdata/testoutput6
vendored
@ -2461,4 +2461,12 @@ No match
|
|||||||
scat
|
scat
|
||||||
0: sc
|
0: sc
|
||||||
|
|
||||||
|
/[A-`]/i8
|
||||||
|
abcdefghijklmno
|
||||||
|
0: a
|
||||||
|
|
||||||
|
/\C\X*QT/8
|
||||||
|
Ӆ\x0aT
|
||||||
|
No match
|
||||||
|
|
||||||
/-- End of testinput6 --/
|
/-- End of testinput6 --/
|
||||||
|
6
pcre/testdata/testoutput8
vendored
6
pcre/testdata/testoutput8
vendored
@ -7785,4 +7785,10 @@ Matched, but offsets vector is too small to show all matches
|
|||||||
NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED
|
NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED
|
||||||
0: NON QUOTED "QUOT""ED" AFTER
|
0: NON QUOTED "QUOT""ED" AFTER
|
||||||
|
|
||||||
|
/(?(?!)a|b)/
|
||||||
|
bbb
|
||||||
|
0: b
|
||||||
|
aaa
|
||||||
|
No match
|
||||||
|
|
||||||
/-- End of testinput8 --/
|
/-- End of testinput8 --/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user