JIT for ARM
Includes switch from LGPL 2.1 to LGPL 3, since the ARM port of GNU lightining is licensed under LGPL 3.
This commit is contained in:
parent
bc5c89cbf0
commit
d5ede87ae8
2
README
2
README
|
@ -36,4 +36,4 @@ applications, provided you follow the rules stated in the LGPL. You can
|
|||
also modify Racket; if you distribute a modified version, you must
|
||||
distribute it under the terms of the LGPL, which in particular means
|
||||
that you must release the source code for the modified software. See
|
||||
doc/release-notes/COPYING.txt for more information.
|
||||
doc/release-notes/COPYING_LESSER.txt for more information.
|
||||
|
|
|
@ -70,7 +70,7 @@ On some platforms, bytecode is further compiled to native code via a
|
|||
compiler substantially speeds programs that execute tight loops,
|
||||
arithmetic on small integers, and arithmetic on inexact real
|
||||
numbers. Currently, @tech{JIT} compilation is supported for x86,
|
||||
x86_64 (a.k.a. AMD64), and 32-bit PowerPC processors. The @tech{JIT}
|
||||
x86_64 (a.k.a. AMD64), ARM, and 32-bit PowerPC processors. The @tech{JIT}
|
||||
compiler can be disabled via the @racket[eval-jit-enabled] parameter
|
||||
or the @DFlag{no-jit}/@Flag{j} command-line flag for @exec{racket}.
|
||||
|
||||
|
|
|
@ -21,7 +21,7 @@ General Public License (LGPL). This means
|
|||
|
||||
]
|
||||
|
||||
See @filepath{doc/release-notes/COPYING.txt} in your Racket installation
|
||||
See @filepath{doc/release-notes/COPYING_LESSER.txt} in your Racket installation
|
||||
for more information.
|
||||
|
||||
@copyright{
|
||||
|
@ -88,7 +88,7 @@ Racket software includes or extends the following copyrighted material:
|
|||
|
||||
@copyright{
|
||||
GNU lightning
|
||||
Copyright (c) 1994, 1995, 1996, 1999, 2000, 2001, 2002
|
||||
Copyright (c) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2011
|
||||
Free Software Foundation, Inc.
|
||||
}
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,3 +1,6 @@
|
|||
Version 5.3.4.1
|
||||
Changed JIT to support ARM
|
||||
|
||||
Version 5.3.3.9
|
||||
racket/udp: added multicast support: udp-multicast-join-group!,
|
||||
udp-multicast-leave-group!, udp-multicast-interface,
|
||||
|
|
2
src/configure
vendored
2
src/configure
vendored
|
@ -8806,7 +8806,7 @@ fi
|
|||
############## drop optimization flags ################
|
||||
|
||||
if test "${enable_noopt}" = "yes" ; then
|
||||
AWKPRG='BEGIN { FS = "(^| )-O(0|1|2|3|4|5|6|7|8|9|())( |$)" } /.*/ { for (i = 1; i < NF; i++) printf "%s ", $i; print $NF }'
|
||||
AWKPRG='BEGIN { FS = "(^| )-O(0|1|2|3|4|5|6|7|8|9)?( |$)" } /.*/ { for (i = 1; i < NF; i++) printf "%s ", $i; print $NF }'
|
||||
CFLAGS=`echo "$CFLAGS" | awk "$AWKPRG"`
|
||||
fi
|
||||
|
||||
|
|
|
@ -1796,6 +1796,11 @@ static void* SCHEME2C(const char *who,
|
|||
delta += (sizeof(intptr_t)-sizeof(Tsint8));
|
||||
}
|
||||
# endif /* SCHEME_BIG_ENDIAN */
|
||||
# ifdef FFI_CALLBACK_NEED_INT_CLEAR
|
||||
if (sizeof(Tsint8)<sizeof(intptr_t) && ret_loc) {
|
||||
((int*)W_OFFSET(dst,delta))[0] = 0;
|
||||
}
|
||||
# endif /* FFI_CALLBACK_NEED_INT_CLEAR */
|
||||
if (!(get_byte_val(val,&(((Tsint8*)W_OFFSET(dst,delta))[0])))) wrong_value(who, "_int8", val);;
|
||||
return NULL;
|
||||
case FOREIGN_uint8:
|
||||
|
@ -1805,6 +1810,11 @@ static void* SCHEME2C(const char *who,
|
|||
delta += (sizeof(intptr_t)-sizeof(Tuint8));
|
||||
}
|
||||
# endif /* SCHEME_BIG_ENDIAN */
|
||||
# ifdef FFI_CALLBACK_NEED_INT_CLEAR
|
||||
if (sizeof(Tuint8)<sizeof(intptr_t) && ret_loc) {
|
||||
((int*)W_OFFSET(dst,delta))[0] = 0;
|
||||
}
|
||||
# endif /* FFI_CALLBACK_NEED_INT_CLEAR */
|
||||
if (!(get_ubyte_val(val,&(((Tuint8*)W_OFFSET(dst,delta))[0])))) wrong_value(who, "_uint8", val);;
|
||||
return NULL;
|
||||
case FOREIGN_int16:
|
||||
|
@ -1814,6 +1824,11 @@ static void* SCHEME2C(const char *who,
|
|||
delta += (sizeof(intptr_t)-sizeof(Tsint16));
|
||||
}
|
||||
# endif /* SCHEME_BIG_ENDIAN */
|
||||
# ifdef FFI_CALLBACK_NEED_INT_CLEAR
|
||||
if (sizeof(Tsint16)<sizeof(intptr_t) && ret_loc) {
|
||||
((int*)W_OFFSET(dst,delta))[0] = 0;
|
||||
}
|
||||
# endif /* FFI_CALLBACK_NEED_INT_CLEAR */
|
||||
if (!(get_short_val(val,&(((Tsint16*)W_OFFSET(dst,delta))[0])))) wrong_value(who, "_int16", val);;
|
||||
return NULL;
|
||||
case FOREIGN_uint16:
|
||||
|
@ -1823,6 +1838,11 @@ static void* SCHEME2C(const char *who,
|
|||
delta += (sizeof(intptr_t)-sizeof(Tuint16));
|
||||
}
|
||||
# endif /* SCHEME_BIG_ENDIAN */
|
||||
# ifdef FFI_CALLBACK_NEED_INT_CLEAR
|
||||
if (sizeof(Tuint16)<sizeof(intptr_t) && ret_loc) {
|
||||
((int*)W_OFFSET(dst,delta))[0] = 0;
|
||||
}
|
||||
# endif /* FFI_CALLBACK_NEED_INT_CLEAR */
|
||||
if (!(get_ushort_val(val,&(((Tuint16*)W_OFFSET(dst,delta))[0])))) wrong_value(who, "_uint16", val);;
|
||||
return NULL;
|
||||
case FOREIGN_int32:
|
||||
|
@ -1832,6 +1852,11 @@ static void* SCHEME2C(const char *who,
|
|||
delta += (sizeof(intptr_t)-sizeof(Tsint32));
|
||||
}
|
||||
# endif /* SCHEME_BIG_ENDIAN */
|
||||
# ifdef FFI_CALLBACK_NEED_INT_CLEAR
|
||||
if (sizeof(Tsint32)<sizeof(intptr_t) && ret_loc) {
|
||||
((int*)W_OFFSET(dst,delta))[0] = 0;
|
||||
}
|
||||
# endif /* FFI_CALLBACK_NEED_INT_CLEAR */
|
||||
if (!(scheme_get_realint_val(val,&(((Tsint32*)W_OFFSET(dst,delta))[0])))) wrong_value(who, "_int32", val);;
|
||||
return NULL;
|
||||
case FOREIGN_uint32:
|
||||
|
@ -1841,6 +1866,11 @@ static void* SCHEME2C(const char *who,
|
|||
delta += (sizeof(intptr_t)-sizeof(Tuint32));
|
||||
}
|
||||
# endif /* SCHEME_BIG_ENDIAN */
|
||||
# ifdef FFI_CALLBACK_NEED_INT_CLEAR
|
||||
if (sizeof(Tuint32)<sizeof(intptr_t) && ret_loc) {
|
||||
((int*)W_OFFSET(dst,delta))[0] = 0;
|
||||
}
|
||||
# endif /* FFI_CALLBACK_NEED_INT_CLEAR */
|
||||
if (!(scheme_get_unsigned_realint_val(val,&(((Tuint32*)W_OFFSET(dst,delta))[0])))) wrong_value(who, "_uint32", val);;
|
||||
return NULL;
|
||||
case FOREIGN_int64:
|
||||
|
@ -1850,6 +1880,11 @@ static void* SCHEME2C(const char *who,
|
|||
delta += (sizeof(intptr_t)-sizeof(Tsint64));
|
||||
}
|
||||
# endif /* SCHEME_BIG_ENDIAN */
|
||||
# ifdef FFI_CALLBACK_NEED_INT_CLEAR
|
||||
if (sizeof(Tsint64)<sizeof(intptr_t) && ret_loc) {
|
||||
((int*)W_OFFSET(dst,delta))[0] = 0;
|
||||
}
|
||||
# endif /* FFI_CALLBACK_NEED_INT_CLEAR */
|
||||
if (!(scheme_get_long_long_val(val,&(((Tsint64*)W_OFFSET(dst,delta))[0])))) wrong_value(who, "_int64", val);;
|
||||
return NULL;
|
||||
case FOREIGN_uint64:
|
||||
|
@ -1859,6 +1894,11 @@ static void* SCHEME2C(const char *who,
|
|||
delta += (sizeof(intptr_t)-sizeof(Tuint64));
|
||||
}
|
||||
# endif /* SCHEME_BIG_ENDIAN */
|
||||
# ifdef FFI_CALLBACK_NEED_INT_CLEAR
|
||||
if (sizeof(Tuint64)<sizeof(intptr_t) && ret_loc) {
|
||||
((int*)W_OFFSET(dst,delta))[0] = 0;
|
||||
}
|
||||
# endif /* FFI_CALLBACK_NEED_INT_CLEAR */
|
||||
if (!(scheme_get_unsigned_long_long_val(val,&(((Tuint64*)W_OFFSET(dst,delta))[0])))) wrong_value(who, "_uint64", val);;
|
||||
return NULL;
|
||||
case FOREIGN_fixint:
|
||||
|
@ -1868,6 +1908,11 @@ static void* SCHEME2C(const char *who,
|
|||
delta += (sizeof(intptr_t)-sizeof(Tsint32));
|
||||
}
|
||||
# endif /* SCHEME_BIG_ENDIAN */
|
||||
# ifdef FFI_CALLBACK_NEED_INT_CLEAR
|
||||
if (sizeof(Tsint32)<sizeof(intptr_t) && ret_loc) {
|
||||
((int*)W_OFFSET(dst,delta))[0] = 0;
|
||||
}
|
||||
# endif /* FFI_CALLBACK_NEED_INT_CLEAR */
|
||||
if (SCHEME_INTP(val)) {
|
||||
Tsint32 tmp;
|
||||
tmp = MZ_TYPE_CAST(Tsint32, SCHEME_INT_VAL(val));
|
||||
|
@ -1883,6 +1928,11 @@ static void* SCHEME2C(const char *who,
|
|||
delta += (sizeof(intptr_t)-sizeof(Tuint32));
|
||||
}
|
||||
# endif /* SCHEME_BIG_ENDIAN */
|
||||
# ifdef FFI_CALLBACK_NEED_INT_CLEAR
|
||||
if (sizeof(Tuint32)<sizeof(intptr_t) && ret_loc) {
|
||||
((int*)W_OFFSET(dst,delta))[0] = 0;
|
||||
}
|
||||
# endif /* FFI_CALLBACK_NEED_INT_CLEAR */
|
||||
if (SCHEME_INTP(val)) {
|
||||
Tuint32 tmp;
|
||||
tmp = MZ_TYPE_CAST(Tuint32, SCHEME_UINT_VAL(val));
|
||||
|
@ -1898,6 +1948,11 @@ static void* SCHEME2C(const char *who,
|
|||
delta += (sizeof(intptr_t)-sizeof(intptr_t));
|
||||
}
|
||||
# endif /* SCHEME_BIG_ENDIAN */
|
||||
# ifdef FFI_CALLBACK_NEED_INT_CLEAR
|
||||
if (sizeof(intptr_t)<sizeof(intptr_t) && ret_loc) {
|
||||
((int*)W_OFFSET(dst,delta))[0] = 0;
|
||||
}
|
||||
# endif /* FFI_CALLBACK_NEED_INT_CLEAR */
|
||||
if (SCHEME_INTP(val)) {
|
||||
intptr_t tmp;
|
||||
tmp = MZ_TYPE_CAST(intptr_t, SCHEME_INT_VAL(val));
|
||||
|
@ -1913,6 +1968,11 @@ static void* SCHEME2C(const char *who,
|
|||
delta += (sizeof(intptr_t)-sizeof(uintptr_t));
|
||||
}
|
||||
# endif /* SCHEME_BIG_ENDIAN */
|
||||
# ifdef FFI_CALLBACK_NEED_INT_CLEAR
|
||||
if (sizeof(uintptr_t)<sizeof(intptr_t) && ret_loc) {
|
||||
((int*)W_OFFSET(dst,delta))[0] = 0;
|
||||
}
|
||||
# endif /* FFI_CALLBACK_NEED_INT_CLEAR */
|
||||
if (SCHEME_INTP(val)) {
|
||||
uintptr_t tmp;
|
||||
tmp = MZ_TYPE_CAST(uintptr_t, SCHEME_UINT_VAL(val));
|
||||
|
@ -1928,6 +1988,11 @@ static void* SCHEME2C(const char *who,
|
|||
delta += (sizeof(intptr_t)-sizeof(float));
|
||||
}
|
||||
# endif /* SCHEME_BIG_ENDIAN */
|
||||
# ifdef FFI_CALLBACK_NEED_INT_CLEAR
|
||||
if (sizeof(float)<sizeof(intptr_t) && ret_loc) {
|
||||
((int*)W_OFFSET(dst,delta))[0] = 0;
|
||||
}
|
||||
# endif /* FFI_CALLBACK_NEED_INT_CLEAR */
|
||||
if (SCHEME_FLOATP(val)) {
|
||||
float tmp;
|
||||
tmp = MZ_TYPE_CAST(float, SCHEME_FLOAT_VAL(val));
|
||||
|
@ -1943,6 +2008,11 @@ static void* SCHEME2C(const char *who,
|
|||
delta += (sizeof(intptr_t)-sizeof(double));
|
||||
}
|
||||
# endif /* SCHEME_BIG_ENDIAN */
|
||||
# ifdef FFI_CALLBACK_NEED_INT_CLEAR
|
||||
if (sizeof(double)<sizeof(intptr_t) && ret_loc) {
|
||||
((int*)W_OFFSET(dst,delta))[0] = 0;
|
||||
}
|
||||
# endif /* FFI_CALLBACK_NEED_INT_CLEAR */
|
||||
if (SCHEME_FLOATP(val)) {
|
||||
double tmp;
|
||||
tmp = MZ_TYPE_CAST(double, SCHEME_FLOAT_VAL(val));
|
||||
|
@ -1958,6 +2028,11 @@ static void* SCHEME2C(const char *who,
|
|||
delta += (sizeof(intptr_t)-sizeof(mz_long_double));
|
||||
}
|
||||
# endif /* SCHEME_BIG_ENDIAN */
|
||||
# ifdef FFI_CALLBACK_NEED_INT_CLEAR
|
||||
if (sizeof(mz_long_double)<sizeof(intptr_t) && ret_loc) {
|
||||
((int*)W_OFFSET(dst,delta))[0] = 0;
|
||||
}
|
||||
# endif /* FFI_CALLBACK_NEED_INT_CLEAR */
|
||||
if (SCHEME_LONG_DBLP(val)) {
|
||||
mz_long_double tmp;
|
||||
tmp = MZ_NO_TYPE_CAST(mz_long_double, SCHEME_MAYBE_LONG_DBL_VAL(val));
|
||||
|
@ -1973,6 +2048,11 @@ static void* SCHEME2C(const char *who,
|
|||
delta += (sizeof(intptr_t)-sizeof(double));
|
||||
}
|
||||
# endif /* SCHEME_BIG_ENDIAN */
|
||||
# ifdef FFI_CALLBACK_NEED_INT_CLEAR
|
||||
if (sizeof(double)<sizeof(intptr_t) && ret_loc) {
|
||||
((int*)W_OFFSET(dst,delta))[0] = 0;
|
||||
}
|
||||
# endif /* FFI_CALLBACK_NEED_INT_CLEAR */
|
||||
if (SCHEME_REALP(val)) {
|
||||
double tmp;
|
||||
tmp = MZ_TYPE_CAST(double, scheme_real_to_double(val));
|
||||
|
@ -1988,6 +2068,11 @@ static void* SCHEME2C(const char *who,
|
|||
delta += (sizeof(intptr_t)-sizeof(int));
|
||||
}
|
||||
# endif /* SCHEME_BIG_ENDIAN */
|
||||
# ifdef FFI_CALLBACK_NEED_INT_CLEAR
|
||||
if (sizeof(int)<sizeof(intptr_t) && ret_loc) {
|
||||
((int*)W_OFFSET(dst,delta))[0] = 0;
|
||||
}
|
||||
# endif /* FFI_CALLBACK_NEED_INT_CLEAR */
|
||||
if (1) {
|
||||
int tmp;
|
||||
tmp = MZ_TYPE_CAST(int, SCHEME_TRUEP(val));
|
||||
|
@ -2003,6 +2088,11 @@ static void* SCHEME2C(const char *who,
|
|||
delta += (sizeof(intptr_t)-sizeof(mzchar*));
|
||||
}
|
||||
# endif /* SCHEME_BIG_ENDIAN */
|
||||
# ifdef FFI_CALLBACK_NEED_INT_CLEAR
|
||||
if (sizeof(mzchar*)<sizeof(intptr_t) && ret_loc) {
|
||||
((int*)W_OFFSET(dst,delta))[0] = 0;
|
||||
}
|
||||
# endif /* FFI_CALLBACK_NEED_INT_CLEAR */
|
||||
if (SCHEME_FALSEP_OR_CHAR_STRINGP(val)) {
|
||||
mzchar* tmp;
|
||||
tmp = MZ_TYPE_CAST(mzchar*, ucs4_string_or_null_to_ucs4_pointer(val));
|
||||
|
@ -2024,6 +2114,11 @@ static void* SCHEME2C(const char *who,
|
|||
delta += (sizeof(intptr_t)-sizeof(unsigned short*));
|
||||
}
|
||||
# endif /* SCHEME_BIG_ENDIAN */
|
||||
# ifdef FFI_CALLBACK_NEED_INT_CLEAR
|
||||
if (sizeof(unsigned short*)<sizeof(intptr_t) && ret_loc) {
|
||||
((int*)W_OFFSET(dst,delta))[0] = 0;
|
||||
}
|
||||
# endif /* FFI_CALLBACK_NEED_INT_CLEAR */
|
||||
if (SCHEME_FALSEP_OR_CHAR_STRINGP(val)) {
|
||||
unsigned short* tmp;
|
||||
tmp = MZ_TYPE_CAST(unsigned short*, ucs4_string_or_null_to_utf16_pointer(val));
|
||||
|
@ -2045,6 +2140,11 @@ static void* SCHEME2C(const char *who,
|
|||
delta += (sizeof(intptr_t)-sizeof(char*));
|
||||
}
|
||||
# endif /* SCHEME_BIG_ENDIAN */
|
||||
# ifdef FFI_CALLBACK_NEED_INT_CLEAR
|
||||
if (sizeof(char*)<sizeof(intptr_t) && ret_loc) {
|
||||
((int*)W_OFFSET(dst,delta))[0] = 0;
|
||||
}
|
||||
# endif /* FFI_CALLBACK_NEED_INT_CLEAR */
|
||||
if (SCHEME_FALSEP(val)||SCHEME_BYTE_STRINGP(val)) {
|
||||
char* tmp;
|
||||
tmp = MZ_TYPE_CAST(char*, SCHEME_FALSEP(val)?NULL:SCHEME_BYTE_STR_VAL(val));
|
||||
|
@ -2066,6 +2166,11 @@ static void* SCHEME2C(const char *who,
|
|||
delta += (sizeof(intptr_t)-sizeof(char*));
|
||||
}
|
||||
# endif /* SCHEME_BIG_ENDIAN */
|
||||
# ifdef FFI_CALLBACK_NEED_INT_CLEAR
|
||||
if (sizeof(char*)<sizeof(intptr_t) && ret_loc) {
|
||||
((int*)W_OFFSET(dst,delta))[0] = 0;
|
||||
}
|
||||
# endif /* FFI_CALLBACK_NEED_INT_CLEAR */
|
||||
if (SCHEME_FALSEP(val)||SCHEME_PATH_STRINGP(val)) {
|
||||
char* tmp;
|
||||
tmp = MZ_TYPE_CAST(char*, SCHEME_FALSEP(val)?NULL:SCHEME_PATH_VAL(TO_PATH(val)));
|
||||
|
@ -2087,6 +2192,11 @@ static void* SCHEME2C(const char *who,
|
|||
delta += (sizeof(intptr_t)-sizeof(char*));
|
||||
}
|
||||
# endif /* SCHEME_BIG_ENDIAN */
|
||||
# ifdef FFI_CALLBACK_NEED_INT_CLEAR
|
||||
if (sizeof(char*)<sizeof(intptr_t) && ret_loc) {
|
||||
((int*)W_OFFSET(dst,delta))[0] = 0;
|
||||
}
|
||||
# endif /* FFI_CALLBACK_NEED_INT_CLEAR */
|
||||
if (SCHEME_SYMBOLP(val)) {
|
||||
char* tmp;
|
||||
tmp = MZ_TYPE_CAST(char*, SCHEME_SYM_VAL(val));
|
||||
|
@ -2108,6 +2218,11 @@ static void* SCHEME2C(const char *who,
|
|||
delta += (sizeof(intptr_t)-sizeof(void*));
|
||||
}
|
||||
# endif /* SCHEME_BIG_ENDIAN */
|
||||
# ifdef FFI_CALLBACK_NEED_INT_CLEAR
|
||||
if (sizeof(void*)<sizeof(intptr_t) && ret_loc) {
|
||||
((int*)W_OFFSET(dst,delta))[0] = 0;
|
||||
}
|
||||
# endif /* FFI_CALLBACK_NEED_INT_CLEAR */
|
||||
if (SCHEME_FFIANYPTRP(val)) {
|
||||
void* tmp; intptr_t toff;
|
||||
tmp = MZ_TYPE_CAST(void*, SCHEME_FFIANYPTR_VAL(val));
|
||||
|
@ -2133,6 +2248,11 @@ static void* SCHEME2C(const char *who,
|
|||
delta += (sizeof(intptr_t)-sizeof(void*));
|
||||
}
|
||||
# endif /* SCHEME_BIG_ENDIAN */
|
||||
# ifdef FFI_CALLBACK_NEED_INT_CLEAR
|
||||
if (sizeof(void*)<sizeof(intptr_t) && ret_loc) {
|
||||
((int*)W_OFFSET(dst,delta))[0] = 0;
|
||||
}
|
||||
# endif /* FFI_CALLBACK_NEED_INT_CLEAR */
|
||||
if (SCHEME_FFIANYPTRP(val)) {
|
||||
void* tmp; intptr_t toff;
|
||||
tmp = MZ_TYPE_CAST(void*, SCHEME_FFIANYPTR_VAL(val));
|
||||
|
@ -2158,6 +2278,11 @@ static void* SCHEME2C(const char *who,
|
|||
delta += (sizeof(intptr_t)-sizeof(Scheme_Object*));
|
||||
}
|
||||
# endif /* SCHEME_BIG_ENDIAN */
|
||||
# ifdef FFI_CALLBACK_NEED_INT_CLEAR
|
||||
if (sizeof(Scheme_Object*)<sizeof(intptr_t) && ret_loc) {
|
||||
((int*)W_OFFSET(dst,delta))[0] = 0;
|
||||
}
|
||||
# endif /* FFI_CALLBACK_NEED_INT_CLEAR */
|
||||
if (1) {
|
||||
Scheme_Object* tmp;
|
||||
tmp = MZ_TYPE_CAST(Scheme_Object*, val);
|
||||
|
@ -2179,6 +2304,11 @@ static void* SCHEME2C(const char *who,
|
|||
delta += (sizeof(intptr_t)-sizeof(void*));
|
||||
}
|
||||
# endif /* SCHEME_BIG_ENDIAN */
|
||||
# ifdef FFI_CALLBACK_NEED_INT_CLEAR
|
||||
if (sizeof(void*)<sizeof(intptr_t) && ret_loc) {
|
||||
((int*)W_OFFSET(dst,delta))[0] = 0;
|
||||
}
|
||||
# endif /* FFI_CALLBACK_NEED_INT_CLEAR */
|
||||
if (!(ret_loc)) wrong_value(who, "_fpointer", val);;
|
||||
break;
|
||||
case FOREIGN_struct:
|
||||
|
|
|
@ -1553,6 +1553,11 @@ static void* SCHEME2C(const char *who,
|
|||
((int*)W_OFFSET(dst,delta))[0] = 0;
|
||||
delta += (sizeof(intptr_t)-sizeof(@ctype));
|
||||
}}
|
||||
@@IFDEF{FFI_CALLBACK_NEED_INT_CLEAR}{
|
||||
if (sizeof(@ctype)<sizeof(intptr_t) && ret_loc) {
|
||||
((int*)W_OFFSET(dst,delta))[0] = 0;
|
||||
}
|
||||
}
|
||||
if (!(@(if ptr? "ret_loc" (pred "val" x)))) @;
|
||||
@wrong-type["val" stype];
|
||||
@(if ptr? "break" "return NULL");}]
|
||||
|
@ -1563,6 +1568,11 @@ static void* SCHEME2C(const char *who,
|
|||
((int*)W_OFFSET(dst,delta))[0] = 0;
|
||||
delta += (sizeof(intptr_t)-sizeof(@ctype));
|
||||
}}
|
||||
@@IFDEF{FFI_CALLBACK_NEED_INT_CLEAR}{
|
||||
if (sizeof(@ctype)<sizeof(intptr_t) && ret_loc) {
|
||||
((int*)W_OFFSET(dst,delta))[0] = 0;
|
||||
}
|
||||
}
|
||||
if (@f[pred]) {
|
||||
@ctype tmp@";"@and[offset]{ intptr_t toff@";"}
|
||||
tmp = @cast(@ctype, @f[s->c]);
|
||||
|
|
276
src/foreign/libffi/config.sub
vendored
276
src/foreign/libffi/config.sub
vendored
|
@ -1,38 +1,31 @@
|
|||
#! /bin/sh
|
||||
# Configuration validation subroutine script.
|
||||
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
||||
# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
|
||||
# Free Software Foundation, Inc.
|
||||
# Copyright 1992-2013 Free Software Foundation, Inc.
|
||||
|
||||
timestamp='2009-11-07'
|
||||
timestamp='2013-02-12'
|
||||
|
||||
# This file is (in principle) common to ALL GNU software.
|
||||
# The presence of a machine in this file suggests that SOME GNU software
|
||||
# can handle that machine. It does not imply ALL GNU software can.
|
||||
#
|
||||
# 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
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# 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
|
||||
# the Free Software Foundation; either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
# This program is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
|
||||
# 02110-1301, USA.
|
||||
# along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# As a special exception to the GNU General Public License, if you
|
||||
# distribute this file as part of a program that contains a
|
||||
# configuration script generated by Autoconf, you may include it under
|
||||
# the same distribution terms that you use for the rest of that program.
|
||||
# the same distribution terms that you use for the rest of that
|
||||
# program. This Exception is an additional permission under section 7
|
||||
# of the GNU General Public License, version 3 ("GPLv3").
|
||||
|
||||
|
||||
# Please send patches to <config-patches@gnu.org>. Submit a context
|
||||
# diff and a properly formatted GNU ChangeLog entry.
|
||||
# Please send patches with a ChangeLog entry to config-patches@gnu.org.
|
||||
#
|
||||
# Configuration subroutine to validate and canonicalize a configuration type.
|
||||
# Supply the specified configuration type as an argument.
|
||||
|
@ -75,8 +68,7 @@ Report bugs and patches to <config-patches@gnu.org>."
|
|||
version="\
|
||||
GNU config.sub ($timestamp)
|
||||
|
||||
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
|
||||
2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
|
||||
Copyright 1992-2013 Free Software Foundation, Inc.
|
||||
|
||||
This is free software; see the source for copying conditions. There is NO
|
||||
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
|
||||
|
@ -123,13 +115,18 @@ esac
|
|||
# Here we must recognize all the valid KERNEL-OS combinations.
|
||||
maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
|
||||
case $maybe_os in
|
||||
nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
|
||||
uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
|
||||
nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
|
||||
linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
|
||||
knetbsd*-gnu* | netbsd*-gnu* | \
|
||||
kopensolaris*-gnu* | \
|
||||
storm-chaos* | os2-emx* | rtmk-nova*)
|
||||
os=-$maybe_os
|
||||
basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
|
||||
;;
|
||||
android-linux)
|
||||
os=-linux-android
|
||||
basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
|
||||
;;
|
||||
*)
|
||||
basic_machine=`echo $1 | sed 's/-[^-]*$//'`
|
||||
if [ $basic_machine != $1 ]
|
||||
|
@ -152,12 +149,12 @@ case $os in
|
|||
-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
|
||||
-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
|
||||
-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
|
||||
-apple | -axis | -knuth | -cray | -microblaze)
|
||||
-apple | -axis | -knuth | -cray | -microblaze*)
|
||||
os=
|
||||
basic_machine=$1
|
||||
;;
|
||||
-bluegene*)
|
||||
os=-cnk
|
||||
-bluegene*)
|
||||
os=-cnk
|
||||
;;
|
||||
-sim | -cisco | -oki | -wec | -winbond)
|
||||
os=
|
||||
|
@ -173,10 +170,10 @@ case $os in
|
|||
os=-chorusos
|
||||
basic_machine=$1
|
||||
;;
|
||||
-chorusrdb)
|
||||
os=-chorusrdb
|
||||
-chorusrdb)
|
||||
os=-chorusrdb
|
||||
basic_machine=$1
|
||||
;;
|
||||
;;
|
||||
-hiux*)
|
||||
os=-hiuxwe2
|
||||
;;
|
||||
|
@ -221,6 +218,12 @@ case $os in
|
|||
-isc*)
|
||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||
;;
|
||||
-lynx*178)
|
||||
os=-lynxos178
|
||||
;;
|
||||
-lynx*5)
|
||||
os=-lynxos5
|
||||
;;
|
||||
-lynx*)
|
||||
os=-lynxos
|
||||
;;
|
||||
|
@ -245,20 +248,27 @@ case $basic_machine in
|
|||
# Some are omitted here because they have special meanings below.
|
||||
1750a | 580 \
|
||||
| a29k \
|
||||
| aarch64 | aarch64_be \
|
||||
| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
|
||||
| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
|
||||
| am33_2.0 \
|
||||
| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
|
||||
| arc \
|
||||
| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
|
||||
| avr | avr32 \
|
||||
| be32 | be64 \
|
||||
| bfin \
|
||||
| c4x | clipper \
|
||||
| d10v | d30v | dlx | dsp16xx \
|
||||
| epiphany \
|
||||
| fido | fr30 | frv \
|
||||
| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
|
||||
| hexagon \
|
||||
| i370 | i860 | i960 | ia64 \
|
||||
| ip2k | iq2000 \
|
||||
| le32 | le64 \
|
||||
| lm32 \
|
||||
| m32c | m32r | m32rle | m68000 | m68k | m88k \
|
||||
| maxq | mb | microblaze | mcore | mep | metag \
|
||||
| maxq | mb | microblaze | microblazeel | mcore | mep | metag \
|
||||
| mips | mipsbe | mipseb | mipsel | mipsle \
|
||||
| mips16 \
|
||||
| mips64 | mips64el \
|
||||
|
@ -276,34 +286,45 @@ case $basic_machine in
|
|||
| mipsisa64r2 | mipsisa64r2el \
|
||||
| mipsisa64sb1 | mipsisa64sb1el \
|
||||
| mipsisa64sr71k | mipsisa64sr71kel \
|
||||
| mipsr5900 | mipsr5900el \
|
||||
| mipstx39 | mipstx39el \
|
||||
| mn10200 | mn10300 \
|
||||
| moxie \
|
||||
| mt \
|
||||
| msp430 \
|
||||
| nios | nios2 \
|
||||
| nds32 | nds32le | nds32be \
|
||||
| nios | nios2 | nios2eb | nios2el \
|
||||
| ns16k | ns32k \
|
||||
| or32 \
|
||||
| open8 \
|
||||
| or1k | or32 \
|
||||
| pdp10 | pdp11 | pj | pjl \
|
||||
| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
|
||||
| powerpc | powerpc64 | powerpc64le | powerpcle \
|
||||
| pyramid \
|
||||
| rx \
|
||||
| rl78 | rx \
|
||||
| score \
|
||||
| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
|
||||
| sh64 | sh64le \
|
||||
| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
|
||||
| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
|
||||
| spu | strongarm \
|
||||
| tahoe | thumb | tic4x | tic80 | tron \
|
||||
| spu \
|
||||
| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
|
||||
| ubicom32 \
|
||||
| v850 | v850e \
|
||||
| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
|
||||
| we32k \
|
||||
| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
|
||||
| x86 | xc16x | xstormy16 | xtensa \
|
||||
| z8k | z80)
|
||||
basic_machine=$basic_machine-unknown
|
||||
;;
|
||||
m6811 | m68hc11 | m6812 | m68hc12 | picochip)
|
||||
# Motorola 68HC11/12.
|
||||
c54x)
|
||||
basic_machine=tic54x-unknown
|
||||
;;
|
||||
c55x)
|
||||
basic_machine=tic55x-unknown
|
||||
;;
|
||||
c6x)
|
||||
basic_machine=tic6x-unknown
|
||||
;;
|
||||
m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip)
|
||||
basic_machine=$basic_machine-unknown
|
||||
os=-none
|
||||
;;
|
||||
|
@ -313,6 +334,21 @@ case $basic_machine in
|
|||
basic_machine=mt-unknown
|
||||
;;
|
||||
|
||||
strongarm | thumb | xscale)
|
||||
basic_machine=arm-unknown
|
||||
;;
|
||||
xgate)
|
||||
basic_machine=$basic_machine-unknown
|
||||
os=-none
|
||||
;;
|
||||
xscaleeb)
|
||||
basic_machine=armeb-unknown
|
||||
;;
|
||||
|
||||
xscaleel)
|
||||
basic_machine=armel-unknown
|
||||
;;
|
||||
|
||||
# We use `pc' rather than `unknown'
|
||||
# because (1) that's what they normally are, and
|
||||
# (2) the word "unknown" tends to confuse beginning users.
|
||||
|
@ -327,25 +363,30 @@ case $basic_machine in
|
|||
# Recognize the basic CPU types with company name.
|
||||
580-* \
|
||||
| a29k-* \
|
||||
| aarch64-* | aarch64_be-* \
|
||||
| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
|
||||
| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
|
||||
| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
|
||||
| arm-* | armbe-* | armle-* | armeb-* | armv*-* \
|
||||
| avr-* | avr32-* \
|
||||
| be32-* | be64-* \
|
||||
| bfin-* | bs2000-* \
|
||||
| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
|
||||
| c[123]* | c30-* | [cjt]90-* | c4x-* \
|
||||
| clipper-* | craynv-* | cydra-* \
|
||||
| d10v-* | d30v-* | dlx-* \
|
||||
| elxsi-* \
|
||||
| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
|
||||
| h8300-* | h8500-* \
|
||||
| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
|
||||
| hexagon-* \
|
||||
| i*86-* | i860-* | i960-* | ia64-* \
|
||||
| ip2k-* | iq2000-* \
|
||||
| le32-* | le64-* \
|
||||
| lm32-* \
|
||||
| m32c-* | m32r-* | m32rle-* \
|
||||
| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
|
||||
| m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
|
||||
| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
|
||||
| microblaze-* | microblazeel-* \
|
||||
| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
|
||||
| mips16-* \
|
||||
| mips64-* | mips64el-* \
|
||||
|
@ -363,29 +404,34 @@ case $basic_machine in
|
|||
| mipsisa64r2-* | mipsisa64r2el-* \
|
||||
| mipsisa64sb1-* | mipsisa64sb1el-* \
|
||||
| mipsisa64sr71k-* | mipsisa64sr71kel-* \
|
||||
| mipsr5900-* | mipsr5900el-* \
|
||||
| mipstx39-* | mipstx39el-* \
|
||||
| mmix-* \
|
||||
| mt-* \
|
||||
| msp430-* \
|
||||
| nios-* | nios2-* \
|
||||
| nds32-* | nds32le-* | nds32be-* \
|
||||
| nios-* | nios2-* | nios2eb-* | nios2el-* \
|
||||
| none-* | np1-* | ns16k-* | ns32k-* \
|
||||
| open8-* \
|
||||
| orion-* \
|
||||
| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
|
||||
| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
|
||||
| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
|
||||
| pyramid-* \
|
||||
| romp-* | rs6000-* | rx-* \
|
||||
| rl78-* | romp-* | rs6000-* | rx-* \
|
||||
| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
|
||||
| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
|
||||
| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
|
||||
| sparclite-* \
|
||||
| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
|
||||
| tahoe-* | thumb-* \
|
||||
| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \
|
||||
| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
|
||||
| tahoe-* \
|
||||
| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
|
||||
| tile*-* \
|
||||
| tron-* \
|
||||
| ubicom32-* \
|
||||
| v850-* | v850e-* | vax-* \
|
||||
| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
|
||||
| vax-* \
|
||||
| we32k-* \
|
||||
| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
|
||||
| x86-* | x86_64-* | xc16x-* | xps100-* \
|
||||
| xstormy16-* | xtensa*-* \
|
||||
| ymp-* \
|
||||
| z8k-* | z80-*)
|
||||
|
@ -410,7 +456,7 @@ case $basic_machine in
|
|||
basic_machine=a29k-amd
|
||||
os=-udi
|
||||
;;
|
||||
abacus)
|
||||
abacus)
|
||||
basic_machine=abacus-unknown
|
||||
;;
|
||||
adobe68k)
|
||||
|
@ -480,11 +526,20 @@ case $basic_machine in
|
|||
basic_machine=powerpc-ibm
|
||||
os=-cnk
|
||||
;;
|
||||
c54x-*)
|
||||
basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
c55x-*)
|
||||
basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
c6x-*)
|
||||
basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
c90)
|
||||
basic_machine=c90-cray
|
||||
os=-unicos
|
||||
;;
|
||||
cegcc)
|
||||
cegcc)
|
||||
basic_machine=arm-unknown
|
||||
os=-cegcc
|
||||
;;
|
||||
|
@ -516,7 +571,7 @@ case $basic_machine in
|
|||
basic_machine=craynv-cray
|
||||
os=-unicosmp
|
||||
;;
|
||||
cr16)
|
||||
cr16 | cr16-*)
|
||||
basic_machine=cr16-unknown
|
||||
os=-elf
|
||||
;;
|
||||
|
@ -674,7 +729,6 @@ case $basic_machine in
|
|||
i370-ibm* | ibm*)
|
||||
basic_machine=i370-ibm
|
||||
;;
|
||||
# I'm not sure what "Sysv32" means. Should this be sysv3.2?
|
||||
i*86v32)
|
||||
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
|
||||
os=-sysv32
|
||||
|
@ -732,9 +786,13 @@ case $basic_machine in
|
|||
basic_machine=ns32k-utek
|
||||
os=-sysv
|
||||
;;
|
||||
microblaze)
|
||||
microblaze*)
|
||||
basic_machine=microblaze-xilinx
|
||||
;;
|
||||
mingw64)
|
||||
basic_machine=x86_64-pc
|
||||
os=-mingw64
|
||||
;;
|
||||
mingw32)
|
||||
basic_machine=i386-pc
|
||||
os=-mingw32
|
||||
|
@ -771,10 +829,18 @@ case $basic_machine in
|
|||
ms1-*)
|
||||
basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
|
||||
;;
|
||||
msys)
|
||||
basic_machine=i386-pc
|
||||
os=-msys
|
||||
;;
|
||||
mvs)
|
||||
basic_machine=i370-ibm
|
||||
os=-mvs
|
||||
;;
|
||||
nacl)
|
||||
basic_machine=le32-unknown
|
||||
os=-nacl
|
||||
;;
|
||||
ncr3000)
|
||||
basic_machine=i486-ncr
|
||||
os=-sysv4
|
||||
|
@ -839,6 +905,12 @@ case $basic_machine in
|
|||
np1)
|
||||
basic_machine=np1-gould
|
||||
;;
|
||||
neo-tandem)
|
||||
basic_machine=neo-tandem
|
||||
;;
|
||||
nse-tandem)
|
||||
basic_machine=nse-tandem
|
||||
;;
|
||||
nsr-tandem)
|
||||
basic_machine=nsr-tandem
|
||||
;;
|
||||
|
@ -921,9 +993,10 @@ case $basic_machine in
|
|||
;;
|
||||
power) basic_machine=power-ibm
|
||||
;;
|
||||
ppc) basic_machine=powerpc-unknown
|
||||
ppc | ppcbe) basic_machine=powerpc-unknown
|
||||
;;
|
||||
ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
ppc-* | ppcbe-*)
|
||||
basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
ppcle | powerpclittle | ppc-le | powerpc-little)
|
||||
basic_machine=powerpcle-unknown
|
||||
|
@ -948,7 +1021,11 @@ case $basic_machine in
|
|||
basic_machine=i586-unknown
|
||||
os=-pw32
|
||||
;;
|
||||
rdos)
|
||||
rdos | rdos64)
|
||||
basic_machine=x86_64-pc
|
||||
os=-rdos
|
||||
;;
|
||||
rdos32)
|
||||
basic_machine=i386-pc
|
||||
os=-rdos
|
||||
;;
|
||||
|
@ -1017,6 +1094,9 @@ case $basic_machine in
|
|||
basic_machine=i860-stratus
|
||||
os=-sysv4
|
||||
;;
|
||||
strongarm-* | thumb-*)
|
||||
basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
sun2)
|
||||
basic_machine=m68000-sun
|
||||
;;
|
||||
|
@ -1073,20 +1153,8 @@ case $basic_machine in
|
|||
basic_machine=t90-cray
|
||||
os=-unicos
|
||||
;;
|
||||
tic54x | c54x*)
|
||||
basic_machine=tic54x-unknown
|
||||
os=-coff
|
||||
;;
|
||||
tic55x | c55x*)
|
||||
basic_machine=tic55x-unknown
|
||||
os=-coff
|
||||
;;
|
||||
tic6x | c6x*)
|
||||
basic_machine=tic6x-unknown
|
||||
os=-coff
|
||||
;;
|
||||
tile*)
|
||||
basic_machine=tile-unknown
|
||||
basic_machine=$basic_machine-unknown
|
||||
os=-linux-gnu
|
||||
;;
|
||||
tx39)
|
||||
|
@ -1156,6 +1224,9 @@ case $basic_machine in
|
|||
xps | xps100)
|
||||
basic_machine=xps100-honeywell
|
||||
;;
|
||||
xscale-* | xscalee[bl]-*)
|
||||
basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
|
||||
;;
|
||||
ymp)
|
||||
basic_machine=ymp-cray
|
||||
os=-unicos
|
||||
|
@ -1253,9 +1324,12 @@ esac
|
|||
if [ x"$os" != x"" ]
|
||||
then
|
||||
case $os in
|
||||
# First match some system type aliases
|
||||
# that might get confused with valid system types.
|
||||
# First match some system type aliases
|
||||
# that might get confused with valid system types.
|
||||
# -solaris* is a basic system type, with this one exception.
|
||||
-auroraux)
|
||||
os=-auroraux
|
||||
;;
|
||||
-solaris1 | -solaris1.*)
|
||||
os=`echo $os | sed -e 's|solaris1|sunos4|'`
|
||||
;;
|
||||
|
@ -1277,21 +1351,22 @@ case $os in
|
|||
# -sysv* is not here because it comes later, after sysvr4.
|
||||
-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
|
||||
| -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
|
||||
| -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
|
||||
| -kopensolaris* \
|
||||
| -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
|
||||
| -sym* | -kopensolaris* | -plan9* \
|
||||
| -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
|
||||
| -aos* | -aros* \
|
||||
| -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
|
||||
| -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
|
||||
| -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
|
||||
| -openbsd* | -solidbsd* \
|
||||
| -bitrig* | -openbsd* | -solidbsd* \
|
||||
| -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
|
||||
| -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
|
||||
| -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
|
||||
| -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
|
||||
| -chorusos* | -chorusrdb* | -cegcc* \
|
||||
| -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
|
||||
| -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
|
||||
| -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
|
||||
| -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
|
||||
| -linux-newlib* | -linux-musl* | -linux-uclibc* \
|
||||
| -uxpv* | -beos* | -mpeix* | -udk* \
|
||||
| -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
|
||||
| -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
|
||||
|
@ -1338,7 +1413,7 @@ case $os in
|
|||
-opened*)
|
||||
os=-openedition
|
||||
;;
|
||||
-os400*)
|
||||
-os400*)
|
||||
os=-os400
|
||||
;;
|
||||
-wince*)
|
||||
|
@ -1387,7 +1462,7 @@ case $os in
|
|||
-sinix*)
|
||||
os=-sysv4
|
||||
;;
|
||||
-tpf*)
|
||||
-tpf*)
|
||||
os=-tpf
|
||||
;;
|
||||
-triton*)
|
||||
|
@ -1423,15 +1498,14 @@ case $os in
|
|||
-aros*)
|
||||
os=-aros
|
||||
;;
|
||||
-kaos*)
|
||||
os=-kaos
|
||||
;;
|
||||
-zvmoe)
|
||||
os=-zvmoe
|
||||
;;
|
||||
-dicos*)
|
||||
os=-dicos
|
||||
;;
|
||||
-nacl*)
|
||||
;;
|
||||
-none)
|
||||
;;
|
||||
*)
|
||||
|
@ -1454,10 +1528,10 @@ else
|
|||
# system, and we'll never get to this point.
|
||||
|
||||
case $basic_machine in
|
||||
score-*)
|
||||
score-*)
|
||||
os=-elf
|
||||
;;
|
||||
spu-*)
|
||||
spu-*)
|
||||
os=-elf
|
||||
;;
|
||||
*-acorn)
|
||||
|
@ -1469,8 +1543,20 @@ case $basic_machine in
|
|||
arm*-semi)
|
||||
os=-aout
|
||||
;;
|
||||
c4x-* | tic4x-*)
|
||||
os=-coff
|
||||
c4x-* | tic4x-*)
|
||||
os=-coff
|
||||
;;
|
||||
hexagon-*)
|
||||
os=-elf
|
||||
;;
|
||||
tic54x-*)
|
||||
os=-coff
|
||||
;;
|
||||
tic55x-*)
|
||||
os=-coff
|
||||
;;
|
||||
tic6x-*)
|
||||
os=-coff
|
||||
;;
|
||||
# This must come before the *-dec entry.
|
||||
pdp10-*)
|
||||
|
@ -1490,14 +1576,11 @@ case $basic_machine in
|
|||
;;
|
||||
m68000-sun)
|
||||
os=-sunos3
|
||||
# This also exists in the configure program, but was not the
|
||||
# default.
|
||||
# os=-sunos4
|
||||
;;
|
||||
m68*-cisco)
|
||||
os=-aout
|
||||
;;
|
||||
mep-*)
|
||||
mep-*)
|
||||
os=-elf
|
||||
;;
|
||||
mips*-cisco)
|
||||
|
@ -1506,6 +1589,9 @@ case $basic_machine in
|
|||
mips*-*)
|
||||
os=-elf
|
||||
;;
|
||||
or1k-*)
|
||||
os=-elf
|
||||
;;
|
||||
or32-*)
|
||||
os=-coff
|
||||
;;
|
||||
|
@ -1524,7 +1610,7 @@ case $basic_machine in
|
|||
*-ibm)
|
||||
os=-aix
|
||||
;;
|
||||
*-knuth)
|
||||
*-knuth)
|
||||
os=-mmixware
|
||||
;;
|
||||
*-wec)
|
||||
|
|
362
src/lt/config.sub
vendored
362
src/lt/config.sub
vendored
|
@ -1,44 +1,40 @@
|
|||
#! /bin/sh
|
||||
# Configuration validation subroutine script.
|
||||
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
||||
# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
|
||||
# Inc.
|
||||
# Copyright 1992-2013 Free Software Foundation, Inc.
|
||||
|
||||
timestamp='2007-04-29'
|
||||
timestamp='2013-02-12'
|
||||
|
||||
# This file is (in principle) common to ALL GNU software.
|
||||
# The presence of a machine in this file suggests that SOME GNU software
|
||||
# can handle that machine. It does not imply ALL GNU software can.
|
||||
#
|
||||
# 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
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# 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
|
||||
# the Free Software Foundation; either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
# This program is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
|
||||
# 02110-1301, USA.
|
||||
# along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# As a special exception to the GNU General Public License, if you
|
||||
# distribute this file as part of a program that contains a
|
||||
# configuration script generated by Autoconf, you may include it under
|
||||
# the same distribution terms that you use for the rest of that program.
|
||||
# the same distribution terms that you use for the rest of that
|
||||
# program. This Exception is an additional permission under section 7
|
||||
# of the GNU General Public License, version 3 ("GPLv3").
|
||||
|
||||
|
||||
# Please send patches to <config-patches@gnu.org>. Submit a context
|
||||
# diff and a properly formatted ChangeLog entry.
|
||||
# Please send patches with a ChangeLog entry to config-patches@gnu.org.
|
||||
#
|
||||
# Configuration subroutine to validate and canonicalize a configuration type.
|
||||
# Supply the specified configuration type as an argument.
|
||||
# If it is invalid, we print an error message on stderr and exit with code 1.
|
||||
# Otherwise, we print the canonical config type on stdout and succeed.
|
||||
|
||||
# You can get the latest version of this script from:
|
||||
# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
|
||||
|
||||
# This file is supposed to be the same for all GNU packages
|
||||
# and recognize all the CPU types, system types and aliases
|
||||
# that are meaningful with *any* GNU software.
|
||||
|
@ -72,8 +68,7 @@ Report bugs and patches to <config-patches@gnu.org>."
|
|||
version="\
|
||||
GNU config.sub ($timestamp)
|
||||
|
||||
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
|
||||
Free Software Foundation, Inc.
|
||||
Copyright 1992-2013 Free Software Foundation, Inc.
|
||||
|
||||
This is free software; see the source for copying conditions. There is NO
|
||||
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
|
||||
|
@ -120,12 +115,18 @@ esac
|
|||
# Here we must recognize all the valid KERNEL-OS combinations.
|
||||
maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
|
||||
case $maybe_os in
|
||||
nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
|
||||
uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
|
||||
nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
|
||||
linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
|
||||
knetbsd*-gnu* | netbsd*-gnu* | \
|
||||
kopensolaris*-gnu* | \
|
||||
storm-chaos* | os2-emx* | rtmk-nova*)
|
||||
os=-$maybe_os
|
||||
basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
|
||||
;;
|
||||
android-linux)
|
||||
os=-linux-android
|
||||
basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
|
||||
;;
|
||||
*)
|
||||
basic_machine=`echo $1 | sed 's/-[^-]*$//'`
|
||||
if [ $basic_machine != $1 ]
|
||||
|
@ -148,10 +149,13 @@ case $os in
|
|||
-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
|
||||
-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
|
||||
-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
|
||||
-apple | -axis | -knuth | -cray)
|
||||
-apple | -axis | -knuth | -cray | -microblaze*)
|
||||
os=
|
||||
basic_machine=$1
|
||||
;;
|
||||
-bluegene*)
|
||||
os=-cnk
|
||||
;;
|
||||
-sim | -cisco | -oki | -wec | -winbond)
|
||||
os=
|
||||
basic_machine=$1
|
||||
|
@ -166,10 +170,10 @@ case $os in
|
|||
os=-chorusos
|
||||
basic_machine=$1
|
||||
;;
|
||||
-chorusrdb)
|
||||
os=-chorusrdb
|
||||
-chorusrdb)
|
||||
os=-chorusrdb
|
||||
basic_machine=$1
|
||||
;;
|
||||
;;
|
||||
-hiux*)
|
||||
os=-hiuxwe2
|
||||
;;
|
||||
|
@ -214,6 +218,12 @@ case $os in
|
|||
-isc*)
|
||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||
;;
|
||||
-lynx*178)
|
||||
os=-lynxos178
|
||||
;;
|
||||
-lynx*5)
|
||||
os=-lynxos5
|
||||
;;
|
||||
-lynx*)
|
||||
os=-lynxos
|
||||
;;
|
||||
|
@ -238,24 +248,34 @@ case $basic_machine in
|
|||
# Some are omitted here because they have special meanings below.
|
||||
1750a | 580 \
|
||||
| a29k \
|
||||
| aarch64 | aarch64_be \
|
||||
| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
|
||||
| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
|
||||
| am33_2.0 \
|
||||
| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
|
||||
| arc \
|
||||
| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
|
||||
| avr | avr32 \
|
||||
| be32 | be64 \
|
||||
| bfin \
|
||||
| c4x | clipper \
|
||||
| d10v | d30v | dlx | dsp16xx \
|
||||
| epiphany \
|
||||
| fido | fr30 | frv \
|
||||
| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
|
||||
| hexagon \
|
||||
| i370 | i860 | i960 | ia64 \
|
||||
| ip2k | iq2000 \
|
||||
| le32 | le64 \
|
||||
| lm32 \
|
||||
| m32c | m32r | m32rle | m68000 | m68k | m88k \
|
||||
| maxq | mb | microblaze | mcore | mep \
|
||||
| maxq | mb | microblaze | microblazeel | mcore | mep | metag \
|
||||
| mips | mipsbe | mipseb | mipsel | mipsle \
|
||||
| mips16 \
|
||||
| mips64 | mips64el \
|
||||
| mips64vr | mips64vrel \
|
||||
| mips64octeon | mips64octeonel \
|
||||
| mips64orion | mips64orionel \
|
||||
| mips64r5900 | mips64r5900el \
|
||||
| mips64vr | mips64vrel \
|
||||
| mips64vr4100 | mips64vr4100el \
|
||||
| mips64vr4300 | mips64vr4300el \
|
||||
| mips64vr5000 | mips64vr5000el \
|
||||
|
@ -266,31 +286,45 @@ case $basic_machine in
|
|||
| mipsisa64r2 | mipsisa64r2el \
|
||||
| mipsisa64sb1 | mipsisa64sb1el \
|
||||
| mipsisa64sr71k | mipsisa64sr71kel \
|
||||
| mipsr5900 | mipsr5900el \
|
||||
| mipstx39 | mipstx39el \
|
||||
| mn10200 | mn10300 \
|
||||
| moxie \
|
||||
| mt \
|
||||
| msp430 \
|
||||
| nios | nios2 \
|
||||
| nds32 | nds32le | nds32be \
|
||||
| nios | nios2 | nios2eb | nios2el \
|
||||
| ns16k | ns32k \
|
||||
| or32 \
|
||||
| open8 \
|
||||
| or1k | or32 \
|
||||
| pdp10 | pdp11 | pj | pjl \
|
||||
| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
|
||||
| powerpc | powerpc64 | powerpc64le | powerpcle \
|
||||
| pyramid \
|
||||
| rl78 | rx \
|
||||
| score \
|
||||
| sh | sh[1234] | sh[24]a | 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 \
|
||||
| sh64 | sh64le \
|
||||
| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
|
||||
| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
|
||||
| spu | strongarm \
|
||||
| tahoe | thumb | tic4x | tic80 | tron \
|
||||
| v850 | v850e \
|
||||
| spu \
|
||||
| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
|
||||
| ubicom32 \
|
||||
| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
|
||||
| we32k \
|
||||
| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
|
||||
| z8k)
|
||||
| x86 | xc16x | xstormy16 | xtensa \
|
||||
| z8k | z80)
|
||||
basic_machine=$basic_machine-unknown
|
||||
;;
|
||||
m6811 | m68hc11 | m6812 | m68hc12)
|
||||
# Motorola 68HC11/12.
|
||||
c54x)
|
||||
basic_machine=tic54x-unknown
|
||||
;;
|
||||
c55x)
|
||||
basic_machine=tic55x-unknown
|
||||
;;
|
||||
c6x)
|
||||
basic_machine=tic6x-unknown
|
||||
;;
|
||||
m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip)
|
||||
basic_machine=$basic_machine-unknown
|
||||
os=-none
|
||||
;;
|
||||
|
@ -300,6 +334,21 @@ case $basic_machine in
|
|||
basic_machine=mt-unknown
|
||||
;;
|
||||
|
||||
strongarm | thumb | xscale)
|
||||
basic_machine=arm-unknown
|
||||
;;
|
||||
xgate)
|
||||
basic_machine=$basic_machine-unknown
|
||||
os=-none
|
||||
;;
|
||||
xscaleeb)
|
||||
basic_machine=armeb-unknown
|
||||
;;
|
||||
|
||||
xscaleel)
|
||||
basic_machine=armel-unknown
|
||||
;;
|
||||
|
||||
# We use `pc' rather than `unknown'
|
||||
# because (1) that's what they normally are, and
|
||||
# (2) the word "unknown" tends to confuse beginning users.
|
||||
|
@ -314,29 +363,37 @@ case $basic_machine in
|
|||
# Recognize the basic CPU types with company name.
|
||||
580-* \
|
||||
| a29k-* \
|
||||
| aarch64-* | aarch64_be-* \
|
||||
| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
|
||||
| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
|
||||
| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
|
||||
| arm-* | armbe-* | armle-* | armeb-* | armv*-* \
|
||||
| avr-* | avr32-* \
|
||||
| be32-* | be64-* \
|
||||
| bfin-* | bs2000-* \
|
||||
| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
|
||||
| c[123]* | c30-* | [cjt]90-* | c4x-* \
|
||||
| clipper-* | craynv-* | cydra-* \
|
||||
| d10v-* | d30v-* | dlx-* \
|
||||
| elxsi-* \
|
||||
| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
|
||||
| h8300-* | h8500-* \
|
||||
| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
|
||||
| hexagon-* \
|
||||
| i*86-* | i860-* | i960-* | ia64-* \
|
||||
| ip2k-* | iq2000-* \
|
||||
| le32-* | le64-* \
|
||||
| lm32-* \
|
||||
| m32c-* | m32r-* | m32rle-* \
|
||||
| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
|
||||
| m88110-* | m88k-* | maxq-* | mcore-* \
|
||||
| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
|
||||
| microblaze-* | microblazeel-* \
|
||||
| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
|
||||
| mips16-* \
|
||||
| mips64-* | mips64el-* \
|
||||
| mips64vr-* | mips64vrel-* \
|
||||
| mips64octeon-* | mips64octeonel-* \
|
||||
| mips64orion-* | mips64orionel-* \
|
||||
| mips64r5900-* | mips64r5900el-* \
|
||||
| mips64vr-* | mips64vrel-* \
|
||||
| mips64vr4100-* | mips64vr4100el-* \
|
||||
| mips64vr4300-* | mips64vr4300el-* \
|
||||
| mips64vr5000-* | mips64vr5000el-* \
|
||||
|
@ -347,31 +404,41 @@ case $basic_machine in
|
|||
| mipsisa64r2-* | mipsisa64r2el-* \
|
||||
| mipsisa64sb1-* | mipsisa64sb1el-* \
|
||||
| mipsisa64sr71k-* | mipsisa64sr71kel-* \
|
||||
| mipsr5900-* | mipsr5900el-* \
|
||||
| mipstx39-* | mipstx39el-* \
|
||||
| mmix-* \
|
||||
| mt-* \
|
||||
| msp430-* \
|
||||
| nios-* | nios2-* \
|
||||
| nds32-* | nds32le-* | nds32be-* \
|
||||
| nios-* | nios2-* | nios2eb-* | nios2el-* \
|
||||
| none-* | np1-* | ns16k-* | ns32k-* \
|
||||
| open8-* \
|
||||
| orion-* \
|
||||
| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
|
||||
| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
|
||||
| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
|
||||
| pyramid-* \
|
||||
| romp-* | rs6000-* \
|
||||
| sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
|
||||
| rl78-* | romp-* | rs6000-* | rx-* \
|
||||
| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
|
||||
| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
|
||||
| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
|
||||
| sparclite-* \
|
||||
| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
|
||||
| tahoe-* | thumb-* \
|
||||
| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
|
||||
| tahoe-* \
|
||||
| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
|
||||
| tile*-* \
|
||||
| tron-* \
|
||||
| v850-* | v850e-* | vax-* \
|
||||
| ubicom32-* \
|
||||
| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
|
||||
| vax-* \
|
||||
| we32k-* \
|
||||
| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
|
||||
| xstormy16-* | xtensa-* \
|
||||
| x86-* | x86_64-* | xc16x-* | xps100-* \
|
||||
| xstormy16-* | xtensa*-* \
|
||||
| ymp-* \
|
||||
| z8k-*)
|
||||
| z8k-* | z80-*)
|
||||
;;
|
||||
# Recognize the basic CPU types without company name, with glob match.
|
||||
xtensa*)
|
||||
basic_machine=$basic_machine-unknown
|
||||
;;
|
||||
# Recognize the various machine names and aliases which stand
|
||||
# for a CPU type and a company and sometimes even an OS.
|
||||
|
@ -389,7 +456,7 @@ case $basic_machine in
|
|||
basic_machine=a29k-amd
|
||||
os=-udi
|
||||
;;
|
||||
abacus)
|
||||
abacus)
|
||||
basic_machine=abacus-unknown
|
||||
;;
|
||||
adobe68k)
|
||||
|
@ -435,6 +502,10 @@ case $basic_machine in
|
|||
basic_machine=m68k-apollo
|
||||
os=-bsd
|
||||
;;
|
||||
aros)
|
||||
basic_machine=i386-pc
|
||||
os=-aros
|
||||
;;
|
||||
aux)
|
||||
basic_machine=m68k-apple
|
||||
os=-aux
|
||||
|
@ -443,10 +514,35 @@ case $basic_machine in
|
|||
basic_machine=ns32k-sequent
|
||||
os=-dynix
|
||||
;;
|
||||
blackfin)
|
||||
basic_machine=bfin-unknown
|
||||
os=-linux
|
||||
;;
|
||||
blackfin-*)
|
||||
basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
os=-linux
|
||||
;;
|
||||
bluegene*)
|
||||
basic_machine=powerpc-ibm
|
||||
os=-cnk
|
||||
;;
|
||||
c54x-*)
|
||||
basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
c55x-*)
|
||||
basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
c6x-*)
|
||||
basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
c90)
|
||||
basic_machine=c90-cray
|
||||
os=-unicos
|
||||
;;
|
||||
cegcc)
|
||||
basic_machine=arm-unknown
|
||||
os=-cegcc
|
||||
;;
|
||||
convex-c1)
|
||||
basic_machine=c1-convex
|
||||
os=-bsd
|
||||
|
@ -475,8 +571,8 @@ case $basic_machine in
|
|||
basic_machine=craynv-cray
|
||||
os=-unicosmp
|
||||
;;
|
||||
cr16c)
|
||||
basic_machine=cr16c-unknown
|
||||
cr16 | cr16-*)
|
||||
basic_machine=cr16-unknown
|
||||
os=-elf
|
||||
;;
|
||||
crds | unos)
|
||||
|
@ -514,6 +610,10 @@ case $basic_machine in
|
|||
basic_machine=m88k-motorola
|
||||
os=-sysv3
|
||||
;;
|
||||
dicos)
|
||||
basic_machine=i686-pc
|
||||
os=-dicos
|
||||
;;
|
||||
djgpp)
|
||||
basic_machine=i586-pc
|
||||
os=-msdosdjgpp
|
||||
|
@ -629,7 +729,6 @@ case $basic_machine in
|
|||
i370-ibm* | ibm*)
|
||||
basic_machine=i370-ibm
|
||||
;;
|
||||
# I'm not sure what "Sysv32" means. Should this be sysv3.2?
|
||||
i*86v32)
|
||||
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
|
||||
os=-sysv32
|
||||
|
@ -668,6 +767,14 @@ case $basic_machine in
|
|||
basic_machine=m68k-isi
|
||||
os=-sysv
|
||||
;;
|
||||
m68knommu)
|
||||
basic_machine=m68k-unknown
|
||||
os=-linux
|
||||
;;
|
||||
m68knommu-*)
|
||||
basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
os=-linux
|
||||
;;
|
||||
m88k-omron*)
|
||||
basic_machine=m88k-omron
|
||||
;;
|
||||
|
@ -679,6 +786,13 @@ case $basic_machine in
|
|||
basic_machine=ns32k-utek
|
||||
os=-sysv
|
||||
;;
|
||||
microblaze*)
|
||||
basic_machine=microblaze-xilinx
|
||||
;;
|
||||
mingw64)
|
||||
basic_machine=x86_64-pc
|
||||
os=-mingw64
|
||||
;;
|
||||
mingw32)
|
||||
basic_machine=i386-pc
|
||||
os=-mingw32
|
||||
|
@ -715,10 +829,18 @@ case $basic_machine in
|
|||
ms1-*)
|
||||
basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
|
||||
;;
|
||||
msys)
|
||||
basic_machine=i386-pc
|
||||
os=-msys
|
||||
;;
|
||||
mvs)
|
||||
basic_machine=i370-ibm
|
||||
os=-mvs
|
||||
;;
|
||||
nacl)
|
||||
basic_machine=le32-unknown
|
||||
os=-nacl
|
||||
;;
|
||||
ncr3000)
|
||||
basic_machine=i486-ncr
|
||||
os=-sysv4
|
||||
|
@ -783,6 +905,12 @@ case $basic_machine in
|
|||
np1)
|
||||
basic_machine=np1-gould
|
||||
;;
|
||||
neo-tandem)
|
||||
basic_machine=neo-tandem
|
||||
;;
|
||||
nse-tandem)
|
||||
basic_machine=nse-tandem
|
||||
;;
|
||||
nsr-tandem)
|
||||
basic_machine=nsr-tandem
|
||||
;;
|
||||
|
@ -813,6 +941,14 @@ case $basic_machine in
|
|||
basic_machine=i860-intel
|
||||
os=-osf
|
||||
;;
|
||||
parisc)
|
||||
basic_machine=hppa-unknown
|
||||
os=-linux
|
||||
;;
|
||||
parisc-*)
|
||||
basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
os=-linux
|
||||
;;
|
||||
pbd)
|
||||
basic_machine=sparc-tti
|
||||
;;
|
||||
|
@ -857,9 +993,10 @@ case $basic_machine in
|
|||
;;
|
||||
power) basic_machine=power-ibm
|
||||
;;
|
||||
ppc) basic_machine=powerpc-unknown
|
||||
ppc | ppcbe) basic_machine=powerpc-unknown
|
||||
;;
|
||||
ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
ppc-* | ppcbe-*)
|
||||
basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
ppcle | powerpclittle | ppc-le | powerpc-little)
|
||||
basic_machine=powerpcle-unknown
|
||||
|
@ -884,7 +1021,11 @@ case $basic_machine in
|
|||
basic_machine=i586-unknown
|
||||
os=-pw32
|
||||
;;
|
||||
rdos)
|
||||
rdos | rdos64)
|
||||
basic_machine=x86_64-pc
|
||||
os=-rdos
|
||||
;;
|
||||
rdos32)
|
||||
basic_machine=i386-pc
|
||||
os=-rdos
|
||||
;;
|
||||
|
@ -953,6 +1094,9 @@ case $basic_machine in
|
|||
basic_machine=i860-stratus
|
||||
os=-sysv4
|
||||
;;
|
||||
strongarm-* | thumb-*)
|
||||
basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
sun2)
|
||||
basic_machine=m68000-sun
|
||||
;;
|
||||
|
@ -1009,17 +1153,9 @@ case $basic_machine in
|
|||
basic_machine=t90-cray
|
||||
os=-unicos
|
||||
;;
|
||||
tic54x | c54x*)
|
||||
basic_machine=tic54x-unknown
|
||||
os=-coff
|
||||
;;
|
||||
tic55x | c55x*)
|
||||
basic_machine=tic55x-unknown
|
||||
os=-coff
|
||||
;;
|
||||
tic6x | c6x*)
|
||||
basic_machine=tic6x-unknown
|
||||
os=-coff
|
||||
tile*)
|
||||
basic_machine=$basic_machine-unknown
|
||||
os=-linux-gnu
|
||||
;;
|
||||
tx39)
|
||||
basic_machine=mipstx39-unknown
|
||||
|
@ -1088,6 +1224,9 @@ case $basic_machine in
|
|||
xps | xps100)
|
||||
basic_machine=xps100-honeywell
|
||||
;;
|
||||
xscale-* | xscalee[bl]-*)
|
||||
basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
|
||||
;;
|
||||
ymp)
|
||||
basic_machine=ymp-cray
|
||||
os=-unicos
|
||||
|
@ -1096,6 +1235,10 @@ case $basic_machine in
|
|||
basic_machine=z8k-unknown
|
||||
os=-sim
|
||||
;;
|
||||
z80-*-coff)
|
||||
basic_machine=z80-unknown
|
||||
os=-sim
|
||||
;;
|
||||
none)
|
||||
basic_machine=none-none
|
||||
os=-none
|
||||
|
@ -1134,7 +1277,7 @@ case $basic_machine in
|
|||
we32k)
|
||||
basic_machine=we32k-att
|
||||
;;
|
||||
sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
|
||||
sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
|
||||
basic_machine=sh-unknown
|
||||
;;
|
||||
sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
|
||||
|
@ -1181,9 +1324,12 @@ esac
|
|||
if [ x"$os" != x"" ]
|
||||
then
|
||||
case $os in
|
||||
# First match some system type aliases
|
||||
# that might get confused with valid system types.
|
||||
# First match some system type aliases
|
||||
# that might get confused with valid system types.
|
||||
# -solaris* is a basic system type, with this one exception.
|
||||
-auroraux)
|
||||
os=-auroraux
|
||||
;;
|
||||
-solaris1 | -solaris1.*)
|
||||
os=`echo $os | sed -e 's|solaris1|sunos4|'`
|
||||
;;
|
||||
|
@ -1204,21 +1350,23 @@ case $os in
|
|||
# Each alternative MUST END IN A *, to match a version number.
|
||||
# -sysv* is not here because it comes later, after sysvr4.
|
||||
-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
|
||||
| -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
|
||||
| -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
|
||||
| -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
|
||||
| -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
|
||||
| -sym* | -kopensolaris* | -plan9* \
|
||||
| -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
|
||||
| -aos* \
|
||||
| -aos* | -aros* \
|
||||
| -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
|
||||
| -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
|
||||
| -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
|
||||
| -openbsd* | -solidbsd* \
|
||||
| -bitrig* | -openbsd* | -solidbsd* \
|
||||
| -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
|
||||
| -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
|
||||
| -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
|
||||
| -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
|
||||
| -chorusos* | -chorusrdb* \
|
||||
| -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
|
||||
| -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
|
||||
| -chorusos* | -chorusrdb* | -cegcc* \
|
||||
| -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
|
||||
| -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
|
||||
| -linux-newlib* | -linux-musl* | -linux-uclibc* \
|
||||
| -uxpv* | -beos* | -mpeix* | -udk* \
|
||||
| -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
|
||||
| -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
|
||||
|
@ -1226,7 +1374,7 @@ case $os in
|
|||
| -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
|
||||
| -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
|
||||
| -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
|
||||
| -skyos* | -haiku* | -rdos* | -toppers* | -drops*)
|
||||
| -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
|
||||
# Remember, each alternative MUST END IN *, to match a version number.
|
||||
;;
|
||||
-qnx*)
|
||||
|
@ -1265,7 +1413,7 @@ case $os in
|
|||
-opened*)
|
||||
os=-openedition
|
||||
;;
|
||||
-os400*)
|
||||
-os400*)
|
||||
os=-os400
|
||||
;;
|
||||
-wince*)
|
||||
|
@ -1314,7 +1462,7 @@ case $os in
|
|||
-sinix*)
|
||||
os=-sysv4
|
||||
;;
|
||||
-tpf*)
|
||||
-tpf*)
|
||||
os=-tpf
|
||||
;;
|
||||
-triton*)
|
||||
|
@ -1350,12 +1498,14 @@ case $os in
|
|||
-aros*)
|
||||
os=-aros
|
||||
;;
|
||||
-kaos*)
|
||||
os=-kaos
|
||||
;;
|
||||
-zvmoe)
|
||||
os=-zvmoe
|
||||
;;
|
||||
-dicos*)
|
||||
os=-dicos
|
||||
;;
|
||||
-nacl*)
|
||||
;;
|
||||
-none)
|
||||
;;
|
||||
*)
|
||||
|
@ -1378,10 +1528,10 @@ else
|
|||
# system, and we'll never get to this point.
|
||||
|
||||
case $basic_machine in
|
||||
score-*)
|
||||
score-*)
|
||||
os=-elf
|
||||
;;
|
||||
spu-*)
|
||||
spu-*)
|
||||
os=-elf
|
||||
;;
|
||||
*-acorn)
|
||||
|
@ -1393,8 +1543,20 @@ case $basic_machine in
|
|||
arm*-semi)
|
||||
os=-aout
|
||||
;;
|
||||
c4x-* | tic4x-*)
|
||||
os=-coff
|
||||
c4x-* | tic4x-*)
|
||||
os=-coff
|
||||
;;
|
||||
hexagon-*)
|
||||
os=-elf
|
||||
;;
|
||||
tic54x-*)
|
||||
os=-coff
|
||||
;;
|
||||
tic55x-*)
|
||||
os=-coff
|
||||
;;
|
||||
tic6x-*)
|
||||
os=-coff
|
||||
;;
|
||||
# This must come before the *-dec entry.
|
||||
pdp10-*)
|
||||
|
@ -1414,14 +1576,11 @@ case $basic_machine in
|
|||
;;
|
||||
m68000-sun)
|
||||
os=-sunos3
|
||||
# This also exists in the configure program, but was not the
|
||||
# default.
|
||||
# os=-sunos4
|
||||
;;
|
||||
m68*-cisco)
|
||||
os=-aout
|
||||
;;
|
||||
mep-*)
|
||||
mep-*)
|
||||
os=-elf
|
||||
;;
|
||||
mips*-cisco)
|
||||
|
@ -1430,6 +1589,9 @@ case $basic_machine in
|
|||
mips*-*)
|
||||
os=-elf
|
||||
;;
|
||||
or1k-*)
|
||||
os=-elf
|
||||
;;
|
||||
or32-*)
|
||||
os=-coff
|
||||
;;
|
||||
|
@ -1448,7 +1610,7 @@ case $basic_machine in
|
|||
*-ibm)
|
||||
os=-aix
|
||||
;;
|
||||
*-knuth)
|
||||
*-knuth)
|
||||
os=-mmixware
|
||||
;;
|
||||
*-wec)
|
||||
|
@ -1553,7 +1715,7 @@ case $basic_machine in
|
|||
-sunos*)
|
||||
vendor=sun
|
||||
;;
|
||||
-aix*)
|
||||
-cnk*|-aix*)
|
||||
vendor=ibm
|
||||
;;
|
||||
-beos*)
|
||||
|
|
|
@ -1242,7 +1242,7 @@ fi
|
|||
############## drop optimization flags ################
|
||||
|
||||
if test "${enable_noopt}" = "yes" ; then
|
||||
AWKPRG='BEGIN { FS = "(^| )-O(0|1|2|3|4|5|6|7|8|9|())( |$)" } /.*/ { for (i = 1; i < NF; i++) printf "%s ", $i; print $NF }'
|
||||
AWKPRG='BEGIN { FS = "(^| )-O(0|1|2|3|4|5|6|7|8|9)?( |$)" } /.*/ { for (i = 1; i < NF; i++) printf "%s ", $i; print $NF }'
|
||||
CFLAGS=`echo "$CFLAGS" | awk "$AWKPRG"`
|
||||
fi
|
||||
|
||||
|
|
|
@ -207,7 +207,7 @@ typedef struct FSSpec mzFSSpec;
|
|||
#endif
|
||||
|
||||
#ifndef MZ_DONT_USE_JIT
|
||||
# if defined(MZ_USE_JIT_PPC) || defined(MZ_USE_JIT_I386) || defined(MZ_USE_JIT_X86_64)
|
||||
# if defined(MZ_USE_JIT_PPC) || defined(MZ_USE_JIT_I386) || defined(MZ_USE_JIT_X86_64) || defined(MZ_USE_JIT_ARM)
|
||||
# define MZ_USE_JIT
|
||||
# endif
|
||||
#endif
|
||||
|
|
|
@ -156,39 +156,49 @@
|
|||
|
||||
#if defined(linux)
|
||||
|
||||
# ifdef __ANDROID__
|
||||
# define SPLS_LINUX "android"
|
||||
# else
|
||||
# define SPLS_LINUX "linux"
|
||||
# endif
|
||||
|
||||
# if defined(i386)
|
||||
# define SCHEME_PLATFORM_LIBRARY_SUBPATH "i386-linux"
|
||||
# define SCHEME_PLATFORM_LIBRARY_SUBPATH "i386-" SPLS_LINUX
|
||||
# define REGISTER_POOR_MACHINE
|
||||
# define MZ_TRY_EXTFLONUMS
|
||||
# define ASM_DBLPREC_CONTROL_87
|
||||
# endif
|
||||
# if defined(powerpc)
|
||||
# define SCHEME_PLATFORM_LIBRARY_SUBPATH "ppc-linux"
|
||||
# define SCHEME_PLATFORM_LIBRARY_SUBPATH "ppc-" SPLS_LINUX
|
||||
# endif
|
||||
# if defined(__mc68000__)
|
||||
# define SCHEME_PLATFORM_LIBRARY_SUBPATH "m68k-linux"
|
||||
# define SCHEME_PLATFORM_LIBRARY_SUBPATH "m68k-" SPLS_LINUX
|
||||
# endif
|
||||
# if defined(mips)
|
||||
# define SCHEME_PLATFORM_LIBRARY_SUBPATH "mips-linux"
|
||||
# define SCHEME_PLATFORM_LIBRARY_SUBPATH "mips-" SPLS_LINUX
|
||||
# endif
|
||||
# if defined(__alpha__)
|
||||
# define SCHEME_PLATFORM_LIBRARY_SUBPATH "alpha-linux"
|
||||
# define SCHEME_PLATFORM_LIBRARY_SUBPATH "alpha-" SPLS_LINUX
|
||||
# endif
|
||||
# if defined(__hppa__)
|
||||
# define SCHEME_PLATFORM_LIBRARY_SUBPATH "hppa-linux"
|
||||
# define SCHEME_PLATFORM_LIBRARY_SUBPATH "hppa-" SPLS_LINUX
|
||||
# endif
|
||||
# if defined(__sparc__)
|
||||
# define SCHEME_PLATFORM_LIBRARY_SUBPATH "sparc-linux"
|
||||
# define SCHEME_PLATFORM_LIBRARY_SUBPATH "sparc-" SPLS_LINUX
|
||||
# define FLUSH_SPARC_REGISTER_WINDOWS
|
||||
# endif
|
||||
# if defined(__arm__) || defined(__thumb__)
|
||||
# define SCHEME_PLATFORM_LIBRARY_SUBPATH "arm-" SPLS_LINUX
|
||||
# define FFI_CALLBACK_NEED_INT_CLEAR
|
||||
# endif
|
||||
# if defined(__x86_64__)
|
||||
# define SCHEME_PLATFORM_LIBRARY_SUBPATH "x86_64-linux"
|
||||
# define SCHEME_PLATFORM_LIBRARY_SUBPATH "x86_64-" SPLS_LINUX
|
||||
# define REGISTER_POOR_MACHINE
|
||||
# define ASM_DBLPREC_CONTROL_87
|
||||
# define MZ_TRY_EXTFLONUMS
|
||||
# endif
|
||||
# ifndef SCHEME_PLATFORM_LIBRARY_SUBPATH
|
||||
# define SCHEME_PLATFORM_LIBRARY_SUBPATH "unknown-linux"
|
||||
# define SCHEME_PLATFORM_LIBRARY_SUBPATH "unknown-" SPLS_LINUX
|
||||
# endif
|
||||
|
||||
# include "uconfig.h"
|
||||
|
@ -215,6 +225,10 @@
|
|||
|
||||
# define MZ_TCP_LISTEN_IPV6_ONLY_SOCKOPT
|
||||
|
||||
# ifdef __ANDROID__
|
||||
# define USE_FCNTL_O_NONBLOCK
|
||||
# endif
|
||||
|
||||
# define FLAGS_ALREADY_SET
|
||||
|
||||
#if defined(i386)
|
||||
|
@ -229,6 +243,10 @@
|
|||
#if defined(powerpc)
|
||||
# define MZ_USE_JIT_PPC
|
||||
#endif
|
||||
# if defined(__arm__)
|
||||
# define MZ_USE_JIT_ARM
|
||||
# define MZ_USE_DWARF_LIBUNWIND
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -1655,6 +1673,10 @@
|
|||
/* WIN32S_HACK uses a special hack to implement threads under Win32s
|
||||
with some compilers. Obsolete. */
|
||||
|
||||
/* FFI_CALLBACK_NEED_INT_CLEAR indiates thet libffi callback results
|
||||
that are smaller than an `int' should clear `int'-sized space
|
||||
in the result area. */
|
||||
|
||||
#endif /* FLAGS_ALREADY_SET */
|
||||
|
||||
/****** (END CONFIGURATION FLAG DESCRPTIONS AND DEFAULTS) *******/
|
||||
|
|
|
@ -305,6 +305,11 @@ JIT_HEADERS = $(srcdir)/jit.h $(srcdir)/jitfpu.h $(srcdir)/stypes.h \
|
|||
$(srcdir)/lightning/ppc/asm.h $(srcdir)/lightning/ppc/asm-common.h \
|
||||
$(srcdir)/lightning/ppc/funcs.h $(srcdir)/lightning/ppc/funcs-common.h \
|
||||
$(srcdir)/lightning/ppc/fp.h $(srcdir)/lightning/ppc/fp-common.h \
|
||||
$(srcdir)/lightning/arm/core.h $(srcdir)/lightning/arm/core-common.h \
|
||||
$(srcdir)/lightning/arm/asm.h $(srcdir)/lightning/arm/asm-common.h \
|
||||
$(srcdir)/lightning/arm/funcs.h $(srcdir)/lightning/arm/funcs-common.h \
|
||||
$(srcdir)/lightning/arm/fp.h $(srcdir)/lightning/arm/fp-common.h \
|
||||
$(srcdir)/lightning/arm/fp-vfp.h $(srcdir)/lightning/arm/fp-swf.h \
|
||||
$(srcdir)/future.h $(srcdir)/jit_ts.c $(srcdir)/jit_ts_protos.h
|
||||
|
||||
salloc.@LTO@: $(COMMON_HEADERS) \
|
||||
|
|
|
@ -933,7 +933,7 @@ static void patch_branch_addr(mz_jit_state *jitter, Branch_Info_Addr *addr, int
|
|||
} else if (addr[i].kind == BRANCH_ADDR_UCBRANCH) {
|
||||
mz_patch_ucbranch(addr[i].addr);
|
||||
} else {
|
||||
jit_patch_movi(addr[i].addr, (_jit.x.pc));
|
||||
jit_patch_movi(addr[i].addr, jit_get_ip());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -972,7 +972,7 @@ void scheme_add_or_patch_branch_true_movi(mz_jit_state *jitter, Branch_Info *for
|
|||
if (for_branch->true_needs_jump) {
|
||||
add_branch(for_branch, ref, BRANCH_ADDR_TRUE, BRANCH_ADDR_MOVI);
|
||||
} else {
|
||||
jit_patch_movi(ref, (_jit.x.pc));
|
||||
jit_patch_movi(ref, jit_get_ip());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2353,7 +2353,7 @@ int scheme_generate(Scheme_Object *obj, mz_jit_state *jitter, int is_tail, int w
|
|||
CHECK_RUNSTACK_OVERFLOW();
|
||||
/* Copy args: */
|
||||
jit_ldxi_l(JIT_R1, JIT_R1, &((Scheme_Thread *)0x0)->ku.multiple.array);
|
||||
refloop = _jit.x.pc;
|
||||
refloop = jit_get_ip();
|
||||
ref3 = jit_blei_l(jit_forward(), JIT_R2, 0);
|
||||
jit_subi_l(JIT_R2, JIT_R2, JIT_WORD_SIZE);
|
||||
jit_ldxr_p(JIT_R0, JIT_R1, JIT_R2);
|
||||
|
@ -2983,6 +2983,8 @@ int scheme_generate(Scheme_Object *obj, mz_jit_state *jitter, int is_tail, int w
|
|||
__END_TINY_JUMPS__(1);
|
||||
}
|
||||
|
||||
CHECK_LIMIT();
|
||||
|
||||
/* Key and value are (still) on runstack */
|
||||
if (!wcm_may_replace) {
|
||||
(void)jit_calli(sjc.wcm_nontail_code);
|
||||
|
@ -3020,8 +3022,8 @@ int scheme_generate(Scheme_Object *obj, mz_jit_state *jitter, int is_tail, int w
|
|||
mz_rs_sync();
|
||||
|
||||
jit_movi_i(JIT_R0, WORDS_TO_BYTES(c));
|
||||
jit_movi_i(JIT_R1, &(((Scheme_Prefix *)0x0)->a[i + p + 1]));
|
||||
jit_movi_i(JIT_R2, &(((Scheme_Prefix *)0x0)->a[p]));
|
||||
jit_movi_i(JIT_R1, (int)&(((Scheme_Prefix *)0x0)->a[i + p + 1]));
|
||||
jit_movi_i(JIT_R2, (int)&(((Scheme_Prefix *)0x0)->a[p]));
|
||||
(void)jit_calli(sjc.quote_syntax_code);
|
||||
|
||||
CHECK_LIMIT();
|
||||
|
@ -3232,6 +3234,9 @@ typedef struct {
|
|||
Scheme_Native_Closure *nc;
|
||||
int argc, argv_delta;
|
||||
Scheme_Object **argv;
|
||||
#ifdef NEED_RETAIN_CODE_POINTERS
|
||||
void *retain_code;
|
||||
#endif
|
||||
} Generate_Closure_Data;
|
||||
|
||||
static int do_generate_closure(mz_jit_state *jitter, void *_data)
|
||||
|
@ -3239,10 +3244,13 @@ static int do_generate_closure(mz_jit_state *jitter, void *_data)
|
|||
Generate_Closure_Data *gdata = (Generate_Closure_Data *)_data;
|
||||
Scheme_Closure_Data *data = gdata->data;
|
||||
void *start_code, *tail_code, *code_end, *arity_code;
|
||||
#ifdef NEED_RETAIN_CODE_POINTERS
|
||||
void *retain_code = NULL;
|
||||
#endif
|
||||
int i, r, cnt, has_rest, is_method, num_params, to_args, argc, argv_delta;
|
||||
Scheme_Object **argv;
|
||||
|
||||
start_code = jit_get_ip().ptr;
|
||||
start_code = jit_get_ip();
|
||||
|
||||
jitter->nc = gdata->nc;
|
||||
|
||||
|
@ -3278,23 +3286,30 @@ static int do_generate_closure(mz_jit_state *jitter, void *_data)
|
|||
shared_arity_code = sjc.shared_arity_check[num_params][has_rest][is_method];
|
||||
if (!shared_arity_code) {
|
||||
shared_arity_code = generate_lambda_simple_arity_check(num_params, has_rest, is_method, 1);
|
||||
shared_arity_code = jit_adjust_ip(shared_arity_code);
|
||||
sjc.shared_arity_check[num_params][has_rest][is_method] = shared_arity_code;
|
||||
}
|
||||
|
||||
arity_code = jit_get_ip().ptr;
|
||||
arity_code = jit_get_ip();
|
||||
|
||||
if (!has_rest)
|
||||
(void)jit_bnei_i(shared_arity_code, JIT_R1, num_params);
|
||||
else
|
||||
(void)jit_blti_i(shared_arity_code, JIT_R1, num_params);
|
||||
} else
|
||||
} else {
|
||||
arity_code = generate_lambda_simple_arity_check(num_params, has_rest, is_method, 0);
|
||||
#ifdef NEED_RETAIN_CODE_POINTERS
|
||||
retain_code = MALLOC_N(void*,2);
|
||||
((void **)retain_code)[1] = arity_code;
|
||||
#endif
|
||||
arity_code = jit_adjust_ip(arity_code);
|
||||
}
|
||||
|
||||
/* A tail call starts here. Caller must ensure that the stack is big
|
||||
enough, right number of arguments (at start of runstack), closure
|
||||
is in R0. If the closure has a rest arg, also ensure argc in R1
|
||||
and argv in R2. */
|
||||
tail_code = jit_get_ip().ptr;
|
||||
tail_code = jit_get_ip();
|
||||
|
||||
/* 0 params and has_rest => (lambda args E) where args is not in E,
|
||||
so accept any number of arguments and just clear them (for space
|
||||
|
@ -3558,7 +3573,7 @@ static int do_generate_closure(mz_jit_state *jitter, void *_data)
|
|||
|
||||
jitter->self_data = data;
|
||||
|
||||
jitter->self_restart_code = jit_get_ip().ptr;
|
||||
jitter->self_restart_code = jit_get_ip();
|
||||
jitter->self_restart_space = jitter->flostack_space;
|
||||
jitter->self_restart_offset = jitter->flostack_offset;
|
||||
if (!has_rest)
|
||||
|
@ -3586,7 +3601,7 @@ static int do_generate_closure(mz_jit_state *jitter, void *_data)
|
|||
jit_ret();
|
||||
}
|
||||
|
||||
code_end = jit_get_ip().ptr;
|
||||
code_end = jit_get_ip();
|
||||
|
||||
if (jitter->retain_start) {
|
||||
gdata->arity_code = arity_code;
|
||||
|
@ -3597,6 +3612,13 @@ static int do_generate_closure(mz_jit_state *jitter, void *_data)
|
|||
gdata->max_tail_depth = jitter->max_tail_depth;
|
||||
gdata->code_end = code_end;
|
||||
gdata->patch_depth = jitter->patch_depth;
|
||||
#ifdef NEED_RETAIN_CODE_POINTERS
|
||||
if (retain_code)
|
||||
((void **)retain_code)[0] = jit_unadjust_ip(start_code);
|
||||
else
|
||||
retain_code = jit_unadjust_ip(start_code);
|
||||
gdata->retain_code = retain_code;
|
||||
#endif
|
||||
}
|
||||
|
||||
return 1;
|
||||
|
@ -3644,10 +3666,14 @@ static void on_demand_generate_lambda(Scheme_Native_Closure *nc, int argc, Schem
|
|||
tail_code = gdata.tail_code;
|
||||
|
||||
if (data->name) {
|
||||
scheme_jit_add_symbol((uintptr_t)start_code, (uintptr_t)gdata.code_end - 1, data->name, 1);
|
||||
scheme_jit_add_symbol((uintptr_t)jit_unadjust_ip(start_code),
|
||||
(uintptr_t)jit_unadjust_ip(gdata.code_end) - 1,
|
||||
data->name, 1);
|
||||
} else {
|
||||
#ifdef MZ_USE_DWARF_LIBUNWIND
|
||||
scheme_jit_add_symbol((uintptr_t)start_code, (uintptr_t)gdata.code_end - 1, scheme_null, 1);
|
||||
scheme_jit_add_symbol((uintptr_t)jit_unadjust_ip(start_code),
|
||||
(uintptr_t)jit_unadjust_ip(gdata.code_end) - 1,
|
||||
scheme_null, 1);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -3682,6 +3708,9 @@ static void on_demand_generate_lambda(Scheme_Native_Closure *nc, int argc, Schem
|
|||
ndata->u2.name = data->name;
|
||||
/* Let-depth is in bytes instead of words: */
|
||||
ndata->max_let_depth = max_depth;
|
||||
#ifdef NEED_RETAIN_CODE_POINTERS
|
||||
ndata->retain_code = gdata.retain_code;
|
||||
#endif
|
||||
}
|
||||
|
||||
void scheme_on_demand_generate_lambda(Scheme_Native_Closure *nc, int argc, Scheme_Object **argv, int argv_delta)
|
||||
|
@ -3948,17 +3977,20 @@ static int do_generate_case_lambda_dispatch(mz_jit_state *jitter, void *_data)
|
|||
Generate_Case_Dispatch_Data *data = (Generate_Case_Dispatch_Data *)_data;
|
||||
void *start_code, *arity_code;
|
||||
|
||||
start_code = jit_get_ip().ptr;
|
||||
start_code = jit_get_ip();
|
||||
|
||||
generate_function_prolog(jitter, start_code, data->ndata->max_let_depth);
|
||||
CHECK_LIMIT();
|
||||
|
||||
if (generate_case_lambda_dispatch(jitter, data->c, data->ndata, 1)) {
|
||||
arity_code = jit_get_ip().ptr;
|
||||
arity_code = jit_get_ip();
|
||||
if (generate_case_lambda_dispatch(jitter, data->c, data->ndata, 0)) {
|
||||
data->ndata->start_code = start_code;
|
||||
data->ndata->arity_code = arity_code;
|
||||
|
||||
#ifdef NEED_RETAIN_CODE_POINTERS
|
||||
data->ndata->retain_code = jit_unadjust_ip(start_code);
|
||||
#endif
|
||||
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -67,9 +67,6 @@ END_XFORM_ARITH;
|
|||
#endif
|
||||
|
||||
#ifdef MZ_USE_JIT_PPC
|
||||
# ifndef DEFINE_LIGHTNING_FUNCS
|
||||
# define SUPPRESS_LIGHTNING_FUNCS
|
||||
# endif
|
||||
# define DEFINE_LIGHTNING_FUNCS_STATIC /* empty */
|
||||
# define jit_notify_freed_code scheme_jit_notify_freed_code
|
||||
# define jit_flush_code scheme_jit_flush_code
|
||||
|
@ -77,8 +74,13 @@ END_XFORM_ARITH;
|
|||
# define _jit_epilog scheme_jit_epilog
|
||||
#endif
|
||||
|
||||
#ifndef DEFINE_LIGHTNING_FUNCS
|
||||
# define SUPPRESS_LIGHTNING_FUNCS
|
||||
#endif
|
||||
|
||||
#include "lightning/lightning.h"
|
||||
#define _jit (jitter->js)
|
||||
#define _jitp (&_jit)
|
||||
|
||||
#ifdef MZ_USE_JIT_X86_64
|
||||
# define JIT_LOG_WORD_SIZE 3
|
||||
|
@ -128,20 +130,25 @@ END_XFORM_ARITH;
|
|||
#if defined(MZ_USE_JIT_I386) && !defined(MZ_USE_JIT_X86_64)
|
||||
# define USE_TINY_JUMPS
|
||||
#endif
|
||||
#if defined(MZ_USE_JIT_ARM)
|
||||
/* For ARM, long jumps are needed for jumps longer than 2^23: */
|
||||
# define NEED_LONG_JUMPS
|
||||
# define LONG_JUMPS_DEFAULT(x) 1
|
||||
#endif
|
||||
|
||||
#if defined(MZ_PRECISE_GC) && defined(MZ_USE_JIT_I386)
|
||||
# define USE_FLONUM_UNBOXING
|
||||
#if defined(MZ_PRECISE_GC)
|
||||
# if defined(MZ_USE_JIT_I386)
|
||||
# define USE_FLONUM_UNBOXING
|
||||
# endif
|
||||
# if defined(MZ_USE_JIT_ARM) && defined(__ARM_PCS_VFP)
|
||||
# define USE_FLONUM_UNBOXING
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef MZ_USE_FUTURES
|
||||
# define MZ_USE_LWC
|
||||
#endif
|
||||
|
||||
#define JIT_NOT_RET JIT_R1
|
||||
#if JIT_NOT_RET == JIT_RET
|
||||
Fix me! See use.
|
||||
#endif
|
||||
|
||||
#ifdef MZ_USE_SINGLE_FLOATS
|
||||
# define SCHEME_FLOAT_TYPE scheme_float_type
|
||||
#else
|
||||
|
@ -177,12 +184,12 @@ static void assert_failure(int where) { printf("JIT assert failed %d\n", where);
|
|||
extern int jit_sizes[NUM_CATEGORIES];
|
||||
extern int jit_counts[NUM_CATEGORIES];
|
||||
extern int jit_code_size;
|
||||
# define START_JIT_DATA() void *__pos = jit_get_ip().ptr; uintptr_t __total = 0
|
||||
# define START_JIT_DATA() void *__pos = jit_get_ip(); uintptr_t __total = 0
|
||||
# define END_JIT_DATA(where) if (jitter->retain_start) { \
|
||||
jit_sizes[where] += __total + ((uintptr_t)jit_get_ip().ptr - (uintptr_t)__pos); \
|
||||
jit_sizes[where] += __total + ((uintptr_t)jit_get_ip() - (uintptr_t)__pos); \
|
||||
jit_counts[where]++; }
|
||||
# define PAUSE_JIT_DATA() __total += ((uintptr_t)jit_get_ip().ptr - (uintptr_t)__pos)
|
||||
# define RESUME_JIT_DATA() __pos = jit_get_ip().ptr
|
||||
# define PAUSE_JIT_DATA() __total += ((uintptr_t)jit_get_ip() - (uintptr_t)__pos)
|
||||
# define RESUME_JIT_DATA() __pos = jit_get_ip()
|
||||
# define RECORD_CODE_SIZE(s) jit_code_size += s
|
||||
#else
|
||||
# define START_JIT_DATA() /* empty */
|
||||
|
@ -555,8 +562,8 @@ void *scheme_jit_get_threadlocal_table();
|
|||
# define tl_scheme_jit_save_extfp (&scheme_jit_save_extfp)
|
||||
# define tl_scheme_jit_save_extfp2 (&scheme_jit_save_extfp2)
|
||||
# endif
|
||||
# define tl_scheme_fuel_counter (&scheme_fuel_counter)
|
||||
# define tl_scheme_jit_stack_boundary (&scheme_jit_stack_boundary)
|
||||
# define tl_scheme_fuel_counter ((void *)&scheme_fuel_counter)
|
||||
# define tl_scheme_jit_stack_boundary ((void *)&scheme_jit_stack_boundary)
|
||||
#endif
|
||||
|
||||
/*========================================================================*/
|
||||
|
@ -709,6 +716,8 @@ int check_location;
|
|||
is one word past alignment. Push 1 to realign (but
|
||||
mz_push_locals() pushes 3, because we need at least
|
||||
two locals).
|
||||
- On ARM, the stack should be 8-byte aligned, and
|
||||
jit_prolog() leaves the stack in an aligned state.
|
||||
*/
|
||||
|
||||
/* LOCAL1 is used to save the value current_cont_mark_stack,
|
||||
|
@ -740,7 +749,7 @@ int check_location;
|
|||
|
||||
* On some platforms, a lightweight function created with
|
||||
mz_prolog() and mz_epilog() uses LOCAL2 to save the return
|
||||
address. On those platforms, though, LOCAL3 is dufferent from
|
||||
address. On those platforms, though, LOCAL3 is different from
|
||||
LOCAL2. So, LOCAL3 can always be used for temporary storage in
|
||||
such functions (assuming that they're called from a function that
|
||||
pushes locals, and that nothing else is using LOCAL2).
|
||||
|
@ -773,7 +782,8 @@ int check_location;
|
|||
#define mz_set_local_p(x, l) mz_set_local_p_x(x, l, JIT_FP)
|
||||
#define mz_get_local_p(x, l) mz_get_local_p_x(x, l, JIT_FP)
|
||||
|
||||
#ifdef MZ_USE_JIT_PPC
|
||||
/* --- PPC --- */
|
||||
#if defined(MZ_USE_JIT_PPC)
|
||||
/* JIT_LOCAL1, JIT_LOCAL2, and JIT_LOCAL3 are offsets in the stack frame. */
|
||||
# define JIT_LOCAL1 56
|
||||
# define JIT_LOCAL2 60
|
||||
|
@ -821,7 +831,40 @@ void scheme_jit_prolog_again(mz_jit_state *jitter, int n, int ret_addr_reg)
|
|||
}
|
||||
# endif
|
||||
# define _jit_prolog_again scheme_jit_prolog_again
|
||||
#else
|
||||
#endif
|
||||
|
||||
/* --- ARM --- */
|
||||
#ifdef MZ_USE_JIT_ARM
|
||||
# define JIT_LOCAL1 JIT_FRAME_EXTRA_SPACE_OFFSET
|
||||
# define JIT_LOCAL2 (JIT_FRAME_EXTRA_SPACE_OFFSET+4)
|
||||
# define JIT_LOCAL3 (JIT_FRAME_EXTRA_SPACE_OFFSET+8)
|
||||
# define JIT_LOCAL4 (JIT_FRAME_EXTRA_SPACE_OFFSET+12)
|
||||
# define JIT_FRAME_FLOSTACK_OFFSET JIT_FRAME_EXTRA_SPACE_OFFSET
|
||||
# define mz_set_local_p_x(x, l, FP) jit_stxi_p(l, FP, x)
|
||||
# define mz_get_local_p_x(x, l, FP) jit_ldxi_p(x, FP, l)
|
||||
# define mz_patch_branch_at(a, v) jit_patch_at(a, v)
|
||||
# define mz_patch_ucbranch_at(a, v) jit_patch_at(a, v)
|
||||
# define mz_prolog(x) (mz_set_local_p(JIT_LR, JIT_LOCAL2))
|
||||
# define mz_epilog(x) (mz_get_local_p(x, JIT_LOCAL2), jit_jmpr(x))
|
||||
# define mz_epilog_without_jmp() /* empty */
|
||||
# define jit_shuffle_saved_regs() /* empty */
|
||||
# define jit_unshuffle_saved_regs() /* empty */
|
||||
# define mz_push_locals() /* empty */
|
||||
# define mz_pop_locals() /* empty */
|
||||
# ifdef SUPPRESS_LIGHTNING_FUNCS
|
||||
void scheme_jit_prolog_again(mz_jit_state *jitter, int n, int ret_addr_reg);
|
||||
# else
|
||||
void scheme_jit_prolog_again(mz_jit_state *jitter, int n, int ret_addr_reg)
|
||||
{
|
||||
jit_movr_p(JIT_LR, ret_addr_reg);
|
||||
arm_prolog(_jitp, n);
|
||||
}
|
||||
# endif
|
||||
# define _jit_prolog_again scheme_jit_prolog_again
|
||||
#endif
|
||||
|
||||
/* --- x86[_64] --- */
|
||||
#if defined(JIT_X86_64) || defined(JIT_X86_PLAIN)
|
||||
/* From frame pointer, -1 is saved frame pointer, -2 is saved ESI/R12,
|
||||
and -3 is saved EDI/R13. On entry to a procedure, prolog pushes 4
|
||||
since the call (which also pushed), so if the stack was 16-bytes
|
||||
|
@ -934,8 +977,8 @@ static jit_insn *fp_tmpr;
|
|||
# define mz_st_fppop_x(i, r, FP, extfl) (check_fp_depth(i, FP), (void)jit_FPSEL_stxi_xd_fppop(extfl, (JIT_FRAME_FLOSTACK_OFFSET - (i)), FP, r))
|
||||
# define mz_st_fppop(i, r, extfl) mz_st_fppop_x(i, r, JIT_FP, extfl)
|
||||
|
||||
#define mz_patch_branch(a) mz_patch_branch_at(a, (_jit.x.pc))
|
||||
#define mz_patch_ucbranch(a) mz_patch_ucbranch_at(a, (_jit.x.pc))
|
||||
#define mz_patch_branch(a) mz_patch_branch_at(a, jit_get_ip())
|
||||
#define mz_patch_ucbranch(a) mz_patch_ucbranch_at(a, jit_get_ip())
|
||||
|
||||
#ifdef NEED_LONG_JUMPS
|
||||
# define __START_SHORT_JUMPS__(cond) if (cond) { _jitl.long_jumps = 0; }
|
||||
|
@ -1233,14 +1276,14 @@ static void emit_indentation(mz_jit_state *jitter)
|
|||
# define JIT_BUFFER_PAD_SIZE 100
|
||||
#endif
|
||||
|
||||
#define PAST_LIMIT() ((uintptr_t)jit_get_ip().ptr > (uintptr_t)jitter->limit)
|
||||
#define PAST_LIMIT() ((uintptr_t)jit_get_raw_ip() > (uintptr_t)jitter->limit)
|
||||
#define CHECK_LIMIT() if (PAST_LIMIT()) return past_limit(jitter, __FILE__, __LINE__);
|
||||
#if 1
|
||||
# define past_limit(j, f, l) 0
|
||||
#else
|
||||
static int past_limit(mz_jit_state *jitter, const char *file, int line)
|
||||
{
|
||||
if (((uintptr_t)jit_get_ip().ptr > (uintptr_t)jitter->limit + JIT_BUFFER_PAD_SIZE)
|
||||
if (((uintptr_t)jit_get_raw_ip() > (uintptr_t)jitter->limit + JIT_BUFFER_PAD_SIZE)
|
||||
|| (jitter->retain_start)) {
|
||||
printf("way past %s %d\n", file, line); abort();
|
||||
}
|
||||
|
|
|
@ -132,7 +132,7 @@ int scheme_inline_alloc(mz_jit_state *jitter, int amt, Scheme_Type ty, int flags
|
|||
algn = GC_alloc_alignment();
|
||||
|
||||
__START_TINY_JUMPS__(1);
|
||||
reffail = _jit.x.pc;
|
||||
reffail = jit_get_ip();
|
||||
mz_tl_ldi_p(JIT_V1, tl_GC_gen0_alloc_page_ptr);
|
||||
jit_subi_l(JIT_R2, JIT_V1, 1);
|
||||
jit_andi_l(JIT_R2, JIT_R2, (algn - 1));
|
||||
|
@ -141,21 +141,30 @@ int scheme_inline_alloc(mz_jit_state *jitter, int amt, Scheme_Type ty, int flags
|
|||
__END_TINY_JUMPS__(1);
|
||||
|
||||
/* Failure handling */
|
||||
if (keep_r0_r1) {
|
||||
if (inline_retry) {
|
||||
scheme_generate_alloc_retry(jitter, 1);
|
||||
CHECK_LIMIT();
|
||||
} else {
|
||||
(void)jit_calli(sjc.retry_alloc_code_keep_r0_r1);
|
||||
}
|
||||
} else if (keep_fpr1) {
|
||||
(void)jit_calli(sjc.retry_alloc_code_keep_fpr1);
|
||||
#ifdef MZ_LONG_DOUBLE
|
||||
} else if (keep_extfpr1) {
|
||||
(void)jit_calli(sjc.retry_alloc_code_keep_extfpr1);
|
||||
#endif
|
||||
if (inline_retry) {
|
||||
int mode;
|
||||
if (keep_r0_r1)
|
||||
mode = 1;
|
||||
else if (keep_fpr1)
|
||||
mode = 2;
|
||||
else if (keep_extfpr1)
|
||||
mode = 3;
|
||||
else
|
||||
mode = 0;
|
||||
scheme_generate_alloc_retry(jitter, mode);
|
||||
CHECK_LIMIT();
|
||||
} else {
|
||||
(void)jit_calli(sjc.retry_alloc_code);
|
||||
if (keep_r0_r1) {
|
||||
(void)jit_calli(sjc.retry_alloc_code_keep_r0_r1);
|
||||
} else if (keep_fpr1) {
|
||||
(void)jit_calli(sjc.retry_alloc_code_keep_fpr1);
|
||||
#ifdef MZ_LONG_DOUBLE
|
||||
} else if (keep_extfpr1) {
|
||||
(void)jit_calli(sjc.retry_alloc_code_keep_extfpr1);
|
||||
#endif
|
||||
} else {
|
||||
(void)jit_calli(sjc.retry_alloc_code);
|
||||
}
|
||||
}
|
||||
__START_TINY_JUMPS__(1);
|
||||
(void)jit_jmpi(reffail);
|
||||
|
|
|
@ -364,7 +364,7 @@ static jit_insn *generate_arith_slow_path(mz_jit_state *jitter, Scheme_Object *r
|
|||
{
|
||||
GC_CAN_IGNORE jit_insn *ref, *ref4, *refslow;
|
||||
|
||||
refslow = _jit.x.pc;
|
||||
refslow = jit_get_ip();
|
||||
|
||||
(void)jit_movi_p(JIT_R2, ((Scheme_Primitive_Proc *)rator)->prim_val);
|
||||
if (for_branch) {
|
||||
|
@ -417,7 +417,7 @@ static jit_insn *generate_arith_slow_path(mz_jit_state *jitter, Scheme_Object *r
|
|||
|
||||
if (arith == ARITH_LSH) {
|
||||
/* Add tag back to first arg, just in case. See arithmetic-shift branch to refslow. */
|
||||
ref = _jit.x.pc;
|
||||
ref = jit_get_ip();
|
||||
|
||||
if (reversed || use_v) {
|
||||
jit_ori_l(JIT_R0, JIT_R0, 0x1);
|
||||
|
@ -700,6 +700,8 @@ static int generate_float_point_arith(mz_jit_state *jitter, Scheme_Object *rator
|
|||
}
|
||||
#endif
|
||||
|
||||
CHECK_LIMIT();
|
||||
|
||||
if (arith) {
|
||||
#if defined(MZ_LONG_DOUBLE) && defined(MZ_NEED_SET_EXTFL_MODE)
|
||||
int need_control_reset = 0;
|
||||
|
@ -766,6 +768,7 @@ static int generate_float_point_arith(mz_jit_state *jitter, Scheme_Object *rator
|
|||
refc = jit_FPSEL_bger_xd_fppop(extfl, jit_forward(), fpr0, fpr1);
|
||||
}
|
||||
}
|
||||
CHECK_LIMIT();
|
||||
if (unboxed) {
|
||||
jit_FPSEL_movr_xd_rel(extfl, fpr0, fpr1);
|
||||
need_post_pop = 1;
|
||||
|
@ -800,8 +803,10 @@ static int generate_float_point_arith(mz_jit_state *jitter, Scheme_Object *rator
|
|||
/* to check whether it fits in a fixnum, we
|
||||
need to convert back and check whether it
|
||||
is the same */
|
||||
if (unboxed)
|
||||
jit_FPSEL_movr_xd_fppush(extfl, fpr1+1, fpr1); /* for slow path */
|
||||
if (unboxed) {
|
||||
JIT_ASSERT(jitter->unbox_depth == 0);
|
||||
jit_FPSEL_movr_xd_fppush(extfl, JIT_FPR2, fpr1); /* for slow path */
|
||||
}
|
||||
jit_FPSEL_extr_l_xd_fppush(extfl, fpr0, JIT_R1);
|
||||
__START_TINY_JUMPS__(1);
|
||||
refs = jit_FPSEL_bantieqr_xd_fppop(extfl, jit_forward(), fpr0, fpr1);
|
||||
|
@ -814,7 +819,7 @@ static int generate_float_point_arith(mz_jit_state *jitter, Scheme_Object *rator
|
|||
__END_TINY_JUMPS__(1);
|
||||
#if !defined(DIRECT_FPR_ACCESS) || defined(MZ_LONG_DOUBLE)
|
||||
if (unboxed && !USES_DIRECT_FPR_ACCESS)
|
||||
jit_FPSEL_roundr_xd_l_fppop(extfl, JIT_R1, fpr1+1); /* slow path won't be needed */
|
||||
jit_FPSEL_roundr_xd_l_fppop(extfl, JIT_R1, JIT_FPR2); /* slow path won't be needed */
|
||||
#endif
|
||||
}
|
||||
jit_fixnum_l(dest, JIT_R1);
|
||||
|
@ -1037,7 +1042,7 @@ static int check_float_type_result(mz_jit_state *jitter, int reg, void *fail_cod
|
|||
ref = jit_bmci_l(jit_forward(), reg, 0x1);
|
||||
__END_TINY_JUMPS__(1);
|
||||
|
||||
reffail = _jit.x.pc;
|
||||
reffail = jit_get_ip();
|
||||
(void)jit_movi_p(JIT_V1, ((Scheme_Primitive_Proc *)rator)->prim_val);
|
||||
(void)jit_calli(fail_code);
|
||||
|
||||
|
@ -1645,7 +1650,7 @@ int scheme_generate_arith_for(mz_jit_state *jitter, Scheme_Object *rator, Scheme
|
|||
if (!unsafe_fx || overflow_refslow) {
|
||||
GC_CAN_IGNORE jit_insn *refx;
|
||||
__START_INNER_TINY__(branch_short);
|
||||
refx = jit_bnei_l(jit_forward(), JIT_R0, (void *)(((intptr_t)1 << ((8 * JIT_WORD_SIZE) - 2))));
|
||||
refx = jit_bnei_p(jit_forward(), JIT_R0, (void *)(((intptr_t)1 << ((8 * JIT_WORD_SIZE) - 2))));
|
||||
__END_INNER_TINY__(branch_short);
|
||||
/* first argument must have been most negative fixnum,
|
||||
second argument must have been -1: */
|
||||
|
@ -1688,11 +1693,11 @@ int scheme_generate_arith_for(mz_jit_state *jitter, Scheme_Object *rator, Scheme
|
|||
if (!unsafe_fx || overflow_refslow) {
|
||||
/* check for a small enough shift */
|
||||
if (arith == ARITH_RSH) {
|
||||
(void)jit_blti_l(refslow, v2, scheme_make_integer(0));
|
||||
(void)jit_bgti_l(refslow, v2, scheme_make_integer(MAX_TRY_SHIFT));
|
||||
(void)jit_blti_p(refslow, v2, scheme_make_integer(0));
|
||||
(void)jit_bgti_p(refslow, v2, scheme_make_integer(MAX_TRY_SHIFT));
|
||||
jit_rshi_l(JIT_V1, v2, 0x1);
|
||||
} else {
|
||||
(void)jit_blti_l(refslow, v2, scheme_make_integer(-MAX_TRY_SHIFT));
|
||||
(void)jit_blti_p(refslow, v2, scheme_make_integer(-MAX_TRY_SHIFT));
|
||||
jit_notr_l(JIT_V1, v2);
|
||||
jit_rshi_l(JIT_V1, JIT_V1, 0x1);
|
||||
jit_addi_l(JIT_V1, JIT_V1, 0x1);
|
||||
|
@ -2228,7 +2233,7 @@ int scheme_generate_nary_arith(mz_jit_state *jitter, Scheme_App_Rec *app,
|
|||
mz_patch_branch(reffx);
|
||||
}
|
||||
|
||||
refslow = _jit.x.pc;
|
||||
refslow = jit_get_ip();
|
||||
/* slow path */
|
||||
if (alt_args) {
|
||||
/* get all args on runstack */
|
||||
|
@ -2251,7 +2256,7 @@ int scheme_generate_nary_arith(mz_jit_state *jitter, Scheme_App_Rec *app,
|
|||
}
|
||||
refdone = jit_jmpi(jit_forward());
|
||||
if (!arith) {
|
||||
reffalse = _jit.x.pc;
|
||||
reffalse = jit_get_ip();
|
||||
(void)jit_movi_p(JIT_R0, scheme_false);
|
||||
refdone3 = jit_jmpi(jit_forward());
|
||||
} else {
|
||||
|
|
|
@ -355,7 +355,7 @@ int scheme_generate_tail_call(mz_jit_state *jitter, int num_rands, int direct_na
|
|||
ref = ref2 = NULL;
|
||||
}
|
||||
|
||||
refagain = _jit.x.pc;
|
||||
refagain = jit_get_ip();
|
||||
|
||||
/* Right kind of function. Extract data and check stack depth: */
|
||||
if (!direct_to_code) {
|
||||
|
@ -644,7 +644,7 @@ static int generate_retry_call(mz_jit_state *jitter, int num_rands, int multi_ok
|
|||
jit_ldxi_p(JIT_V1, JIT_R1, &((Scheme_Thread *)0x0)->ku.apply.tail_rands);
|
||||
jit_lshi_l(JIT_R2, JIT_R2, JIT_LOG_WORD_SIZE);
|
||||
CHECK_LIMIT();
|
||||
refloop = _jit.x.pc;
|
||||
refloop = jit_get_ip();
|
||||
ref2 = jit_blei_l(jit_forward(), JIT_R2, 0);
|
||||
jit_subi_l(JIT_R2, JIT_R2, JIT_WORD_SIZE);
|
||||
jit_ldxr_p(JIT_R0, JIT_V1, JIT_R2);
|
||||
|
@ -667,7 +667,7 @@ static int generate_retry_call(mz_jit_state *jitter, int num_rands, int multi_ok
|
|||
|
||||
/* Slow path; restore R0 to SCHEME_TAIL_CALL_WAITING */
|
||||
mz_patch_branch(ref);
|
||||
jit_movi_l(JIT_R0, SCHEME_TAIL_CALL_WAITING);
|
||||
jit_movi_p(JIT_R0, SCHEME_TAIL_CALL_WAITING);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@ -741,7 +741,7 @@ int scheme_generate_non_tail_call(mz_jit_state *jitter, int num_rands, int direc
|
|||
if (num_rands != -1) {
|
||||
mz_prolog(JIT_R1);
|
||||
} else {
|
||||
reftop = _jit.x.pc;
|
||||
reftop = jit_get_ip();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -756,7 +756,7 @@ int scheme_generate_non_tail_call(mz_jit_state *jitter, int num_rands, int direc
|
|||
ref = ref2 = NULL;
|
||||
}
|
||||
|
||||
refagain = _jit.x.pc;
|
||||
refagain = jit_get_ip();
|
||||
|
||||
/* Before inlined native, check max let depth */
|
||||
if (!nontail_self) {
|
||||
|
@ -801,7 +801,7 @@ int scheme_generate_non_tail_call(mz_jit_state *jitter, int num_rands, int direc
|
|||
/* keep call & ret paired by jumping to where we really
|
||||
want to return,then back here: */
|
||||
refr = jit_jmpi(jit_forward());
|
||||
refxr = _jit.x.pc;
|
||||
refxr = jit_get_ip();
|
||||
jit_base_prolog();
|
||||
#else
|
||||
refr = jit_patchable_movi_p(JIT_R1, jit_forward());
|
||||
|
@ -837,7 +837,7 @@ int scheme_generate_non_tail_call(mz_jit_state *jitter, int num_rands, int direc
|
|||
GC_CAN_IGNORE jit_insn *refrr;
|
||||
refrr = jit_patchable_movi_p(JIT_R1, jit_forward());
|
||||
jit_jmpr(JIT_V1);
|
||||
jit_patch_movi(refrr, _jit.x.pc);
|
||||
jit_patch_movi(refrr, jit_get_ip());
|
||||
jit_movi_i(JIT_R1, num_rands); /* argc */
|
||||
jit_movr_p(JIT_R2, JIT_RUNSTACK); /* argv */
|
||||
}
|
||||
|
@ -861,7 +861,7 @@ int scheme_generate_non_tail_call(mz_jit_state *jitter, int num_rands, int direc
|
|||
mz_patch_ucbranch(refr);
|
||||
(void)jit_short_calli(refxr);
|
||||
#else
|
||||
jit_patch_movi(refr, (_jit.x.pc));
|
||||
jit_patch_movi(refr, jit_get_ip());
|
||||
#endif
|
||||
jit_unshuffle_saved_regs(); /* maybe uncopies V registers */
|
||||
/* If num_rands < 0, then V1 has argc */
|
||||
|
@ -1093,7 +1093,7 @@ static int generate_self_tail_call(Scheme_Object *rator, mz_jit_state *jitter, i
|
|||
|
||||
__START_TINY_OR_SHORT_JUMPS__(jmp_tiny, jmp_short);
|
||||
|
||||
refagain = _jit.x.pc;
|
||||
refagain = jit_get_ip();
|
||||
|
||||
/* Check for thread swap: */
|
||||
(void)mz_tl_ldi_i(JIT_R2, tl_scheme_fuel_counter);
|
||||
|
@ -1210,7 +1210,7 @@ static int generate_self_tail_call(Scheme_Object *rator, mz_jit_state *jitter, i
|
|||
iref = NULL;
|
||||
jit_movi_l(JIT_R0, aoffset);
|
||||
mz_rs_sync();
|
||||
MZ_FPUSEL_STMT(extfl,
|
||||
MZ_FPUSEL_STMT(extfl,
|
||||
(void)jit_calli(sjc.box_extflonum_from_stack_code),
|
||||
(void)jit_calli(sjc.box_flonum_from_stack_code));
|
||||
if (i != num_rands - 1)
|
||||
|
@ -1313,9 +1313,11 @@ void scheme_jit_register_sub_func(mz_jit_state *jitter, void *code, Scheme_Objec
|
|||
{
|
||||
void *code_end;
|
||||
|
||||
code_end = jit_get_ip().ptr;
|
||||
code_end = jit_get_ip();
|
||||
if (jitter->retain_start)
|
||||
scheme_jit_add_symbol((uintptr_t)code, (uintptr_t)code_end - 1, protocol, 0);
|
||||
scheme_jit_add_symbol((uintptr_t)jit_unadjust_ip(code),
|
||||
(uintptr_t)jit_unadjust_ip(code_end) - 1,
|
||||
protocol, 0);
|
||||
}
|
||||
|
||||
void scheme_jit_register_helper_func(mz_jit_state *jitter, void *code)
|
||||
|
@ -1339,7 +1341,7 @@ static int do_generate_shared_call(mz_jit_state *jitter, void *_data)
|
|||
int ok;
|
||||
void *code;
|
||||
|
||||
code = jit_get_ip().ptr;
|
||||
code = jit_get_ip();
|
||||
|
||||
if (data->direct_prim)
|
||||
ok = generate_direct_prim_tail_call(jitter, data->num_rands);
|
||||
|
@ -1354,7 +1356,7 @@ static int do_generate_shared_call(mz_jit_state *jitter, void *_data)
|
|||
int ok;
|
||||
void *code;
|
||||
|
||||
code = jit_get_ip().ptr;
|
||||
code = jit_get_ip();
|
||||
|
||||
if (data->direct_prim)
|
||||
ok = generate_direct_prim_non_tail_call(jitter, data->num_rands, data->multi_ok, 1);
|
||||
|
@ -1374,6 +1376,7 @@ void *scheme_generate_shared_call(int num_rands, mz_jit_state *old_jitter, int m
|
|||
int unboxed_args)
|
||||
{
|
||||
Generate_Call_Data data;
|
||||
void *ip;
|
||||
|
||||
data.num_rands = num_rands;
|
||||
data.old_jitter = old_jitter;
|
||||
|
@ -1385,7 +1388,8 @@ void *scheme_generate_shared_call(int num_rands, mz_jit_state *old_jitter, int m
|
|||
data.nontail_self = nontail_self;
|
||||
data.unboxed_args = unboxed_args;
|
||||
|
||||
return scheme_generate_one(old_jitter, do_generate_shared_call, &data, 0, NULL, NULL);
|
||||
ip = scheme_generate_one(old_jitter, do_generate_shared_call, &data, 0, NULL, NULL);
|
||||
return jit_adjust_ip(ip);
|
||||
}
|
||||
|
||||
void scheme_ensure_retry_available(mz_jit_state *jitter, int multi_ok, int result_ignored)
|
||||
|
@ -1566,7 +1570,7 @@ static int generate_call_path_with_unboxes(mz_jit_state *jitter, int direct_flos
|
|||
int i, k, offset;
|
||||
|
||||
refgo = jit_jmpi(jit_forward());
|
||||
refcopy = _jit.x.pc;
|
||||
refcopy = jit_get_ip();
|
||||
|
||||
/* Callback code to copy unboxed arguments.
|
||||
R1 has the return address, R2 holds the old FP */
|
||||
|
|
|
@ -103,7 +103,7 @@ static Scheme_Object *vector_check_chaperone_of(Scheme_Object *o, Scheme_Object
|
|||
|
||||
static int save_struct_temp(mz_jit_state *jitter, int reg)
|
||||
{
|
||||
#ifdef MZ_USE_JIT_PPC
|
||||
#if defined(MZ_USE_JIT_PPC) || defined(MZ_USE_JIT_ARM)
|
||||
jit_movr_p(JIT_V(3), reg);
|
||||
#endif
|
||||
#ifdef MZ_USE_JIT_I386
|
||||
|
@ -122,7 +122,7 @@ int scheme_save_struct_temp(mz_jit_state *jitter, int reg) {
|
|||
|
||||
static int restore_struct_temp(mz_jit_state *jitter, int reg)
|
||||
{
|
||||
#ifdef MZ_USE_JIT_PPC
|
||||
#if defined(MZ_USE_JIT_PPC) || defined(MZ_USE_JIT_ARM)
|
||||
jit_movr_p(reg, JIT_V(3));
|
||||
#endif
|
||||
#ifdef MZ_USE_JIT_I386
|
||||
|
@ -204,7 +204,7 @@ static int common0(mz_jit_state *jitter, void *_data)
|
|||
|
||||
/* *** check_arity_code *** */
|
||||
/* Called as a function: */
|
||||
sjc.check_arity_code = (Native_Check_Arity_Proc)jit_get_ip().ptr;
|
||||
sjc.check_arity_code = (Native_Check_Arity_Proc)jit_get_ip();
|
||||
jit_prolog(NATIVE_ARG_COUNT); /* only need 2 arguments, but return path overlaps with proc conventions */
|
||||
mz_push_threadlocal_early();
|
||||
in = jit_arg_p();
|
||||
|
@ -223,7 +223,7 @@ static int common0(mz_jit_state *jitter, void *_data)
|
|||
|
||||
/* *** get_arity_code *** */
|
||||
/* Called as a function: */
|
||||
sjc.get_arity_code = (Native_Get_Arity_Proc)jit_get_ip().ptr;
|
||||
sjc.get_arity_code = (Native_Get_Arity_Proc)jit_get_ip();
|
||||
jit_prolog(NATIVE_ARG_COUNT); /* only need 1 argument, but return path overlaps with proc conventions */
|
||||
mz_push_threadlocal_early();
|
||||
in = jit_arg_p();
|
||||
|
@ -243,7 +243,7 @@ static int common0(mz_jit_state *jitter, void *_data)
|
|||
|
||||
/* *** bad_result_arity_code *** */
|
||||
/* Jumped-to from non-tail contexts */
|
||||
sjc.bad_result_arity_code = (Native_Get_Arity_Proc)jit_get_ip().ptr;
|
||||
sjc.bad_result_arity_code = (Native_Get_Arity_Proc)jit_get_ip();
|
||||
mz_tl_ldi_p(JIT_R2, tl_scheme_current_thread);
|
||||
jit_ldxi_l(JIT_R1, JIT_R2, &((Scheme_Thread *)0x0)->ku.multiple.count);
|
||||
jit_ldxi_p(JIT_R2, JIT_R2, &((Scheme_Thread *)0x0)->ku.multiple.array);
|
||||
|
@ -258,7 +258,7 @@ static int common0(mz_jit_state *jitter, void *_data)
|
|||
CHECK_LIMIT();
|
||||
|
||||
/* *** unbound_global_code *** */
|
||||
sjc.unbound_global_code = jit_get_ip().ptr;
|
||||
sjc.unbound_global_code = jit_get_ip();
|
||||
JIT_UPDATE_THREAD_RSPTR();
|
||||
mz_prepare(1);
|
||||
jit_pusharg_p(JIT_R2);
|
||||
|
@ -267,7 +267,7 @@ static int common0(mz_jit_state *jitter, void *_data)
|
|||
|
||||
/* *** quote_syntax_code *** */
|
||||
/* R0 is WORDS_TO_BYTES(c), R1 is &0->a[i+p+1], R2 is &0->a[p] */
|
||||
sjc.quote_syntax_code = jit_get_ip().ptr;
|
||||
sjc.quote_syntax_code = jit_get_ip();
|
||||
mz_prolog(JIT_V1);
|
||||
__START_SHORT_JUMPS__(1);
|
||||
/* Load global array: */
|
||||
|
@ -328,7 +328,7 @@ static int common1(mz_jit_state *jitter, void *_data)
|
|||
for (i = 0; i < 13; i++) {
|
||||
void *code;
|
||||
|
||||
code = jit_get_ip().ptr;
|
||||
code = jit_get_ip();
|
||||
switch (i) {
|
||||
case 0:
|
||||
sjc.bad_car_code = code;
|
||||
|
@ -460,7 +460,7 @@ static int common1b(mz_jit_state *jitter, void *_data)
|
|||
/* Bad argument is in R0, other is in R1 */
|
||||
for (i = 0; i < 4; i++) {
|
||||
void *code;
|
||||
code = jit_get_ip().ptr;
|
||||
code = jit_get_ip();
|
||||
switch (i) {
|
||||
case 0:
|
||||
sjc.bad_set_mcar_code = code;
|
||||
|
@ -509,7 +509,7 @@ static int common1b(mz_jit_state *jitter, void *_data)
|
|||
|
||||
/* *** unbox_code *** */
|
||||
/* R0 is argument */
|
||||
sjc.unbox_code = jit_get_ip().ptr;
|
||||
sjc.unbox_code = jit_get_ip();
|
||||
mz_prolog(JIT_R1);
|
||||
JIT_UPDATE_THREAD_RSPTR();
|
||||
jit_prepare(1);
|
||||
|
@ -522,7 +522,7 @@ static int common1b(mz_jit_state *jitter, void *_data)
|
|||
|
||||
/* *** set_box_code *** */
|
||||
/* R0 is box, R1 is value */
|
||||
sjc.set_box_code = jit_get_ip().ptr;
|
||||
sjc.set_box_code = jit_get_ip();
|
||||
mz_prolog(JIT_R2);
|
||||
JIT_UPDATE_THREAD_RSPTR();
|
||||
jit_prepare(2);
|
||||
|
@ -539,7 +539,7 @@ static int common1b(mz_jit_state *jitter, void *_data)
|
|||
/* call scheme_box_cas to raise the exception,
|
||||
we use mz_finish_lwe because it will capture the stack,
|
||||
and the ts_ version because we may be in a future */
|
||||
sjc.box_cas_fail_code = jit_get_ip().ptr;
|
||||
sjc.box_cas_fail_code = jit_get_ip();
|
||||
mz_prolog(JIT_R2);
|
||||
JIT_UPDATE_THREAD_RSPTR_IF_NEEDED();
|
||||
jit_movi_l(JIT_R0, 3);
|
||||
|
@ -552,7 +552,7 @@ static int common1b(mz_jit_state *jitter, void *_data)
|
|||
|
||||
/* *** bad_vector_length_code *** */
|
||||
/* R0 is argument */
|
||||
sjc.bad_vector_length_code = jit_get_ip().ptr;
|
||||
sjc.bad_vector_length_code = jit_get_ip();
|
||||
mz_prolog(JIT_R1);
|
||||
|
||||
/* Check for chaperone: */
|
||||
|
@ -572,7 +572,7 @@ static int common1b(mz_jit_state *jitter, void *_data)
|
|||
|
||||
/* *** bad_flvector_length_code *** */
|
||||
/* R0 is argument */
|
||||
sjc.bad_flvector_length_code = jit_get_ip().ptr;
|
||||
sjc.bad_flvector_length_code = jit_get_ip();
|
||||
mz_prolog(JIT_R1);
|
||||
jit_prepare(1);
|
||||
jit_pusharg_p(JIT_R0);
|
||||
|
@ -583,7 +583,7 @@ static int common1b(mz_jit_state *jitter, void *_data)
|
|||
#ifdef MZ_LONG_DOUBLE
|
||||
/* *** bad_extflvector_length_code *** */
|
||||
/* R0 is argument */
|
||||
sjc.bad_extflvector_length_code = jit_get_ip().ptr;
|
||||
sjc.bad_extflvector_length_code = jit_get_ip();
|
||||
mz_prolog(JIT_R1);
|
||||
jit_prepare(1);
|
||||
jit_pusharg_p(JIT_R0);
|
||||
|
@ -594,7 +594,7 @@ static int common1b(mz_jit_state *jitter, void *_data)
|
|||
|
||||
/* *** bad_fxvector_length_code *** */
|
||||
/* R0 is argument */
|
||||
sjc.bad_fxvector_length_code = jit_get_ip().ptr;
|
||||
sjc.bad_fxvector_length_code = jit_get_ip();
|
||||
mz_prolog(JIT_R1);
|
||||
jit_prepare(1);
|
||||
jit_pusharg_p(JIT_R0);
|
||||
|
@ -619,7 +619,7 @@ static int common2(mz_jit_state *jitter, void *_data)
|
|||
void *code;
|
||||
for (j = 0; j < 2; j++) {
|
||||
CHECK_LIMIT();
|
||||
code = jit_get_ip().ptr;
|
||||
code = jit_get_ip();
|
||||
if (!i) {
|
||||
if (!j)
|
||||
sjc.call_original_unary_arith_code = code;
|
||||
|
@ -693,7 +693,7 @@ static int common2(mz_jit_state *jitter, void *_data)
|
|||
{
|
||||
void *code;
|
||||
|
||||
code = jit_get_ip().ptr;
|
||||
code = jit_get_ip();
|
||||
sjc.call_original_nary_arith_code = code;
|
||||
|
||||
mz_prolog(JIT_R2);
|
||||
|
@ -718,7 +718,7 @@ static int common2(mz_jit_state *jitter, void *_data)
|
|||
/* Used as the code stub for a closure whose
|
||||
code is not yet compiled. See generate_function_prolog
|
||||
for the state of registers on entry */
|
||||
scheme_on_demand_jit_code = jit_get_ip().ptr;
|
||||
scheme_on_demand_jit_code = jit_get_ip();
|
||||
jit_prolog(NATIVE_ARG_COUNT);
|
||||
mz_push_threadlocal_early();
|
||||
in = jit_arg_p();
|
||||
|
@ -731,7 +731,7 @@ static int common2(mz_jit_state *jitter, void *_data)
|
|||
mz_push_locals();
|
||||
mz_push_threadlocal(in);
|
||||
mz_tl_ldi_p(JIT_RUNSTACK, tl_MZ_RUNSTACK);
|
||||
sjc.on_demand_jit_arity_code = jit_get_ip().ptr; /* <<<- arity variant starts here */
|
||||
sjc.on_demand_jit_arity_code = jit_get_ip(); /* <<<- arity variant starts here */
|
||||
jit_subi_p(JIT_RUNSTACK, JIT_RUNSTACK, WORDS_TO_BYTES(2));
|
||||
CHECK_RUNSTACK_OVERFLOW();
|
||||
jit_str_p(JIT_RUNSTACK, JIT_R0);
|
||||
|
@ -794,13 +794,13 @@ static int common2(mz_jit_state *jitter, void *_data)
|
|||
/* Used for the state of a function that is being JITted
|
||||
(for a kind of cycle detection) without breaking concurrent
|
||||
future threads that might try to call the function. */
|
||||
sjc.in_progress_on_demand_jit_arity_code = jit_get_ip().ptr;
|
||||
sjc.in_progress_on_demand_jit_arity_code = jit_get_ip();
|
||||
(void)jit_jmpi(sjc.on_demand_jit_arity_code);
|
||||
|
||||
/* *** app_values_tail_slow_code *** */
|
||||
/* RELIES ON jit_prolog(NATIVE_ARG_COUNT) FROM ABOVE */
|
||||
/* Rator in V1, arguments are in thread's multiple-values cells. */
|
||||
sjc.app_values_tail_slow_code = jit_get_ip().ptr;
|
||||
sjc.app_values_tail_slow_code = jit_get_ip();
|
||||
JIT_UPDATE_THREAD_RSPTR();
|
||||
mz_prepare(1);
|
||||
jit_pusharg_p(JIT_V1);
|
||||
|
@ -815,17 +815,17 @@ static int common2(mz_jit_state *jitter, void *_data)
|
|||
|
||||
/* *** finish_tail_call_[fixup_]code *** */
|
||||
/* RELIES ON jit_prolog(NATIVE_ARG_COUNT) FROM ABOVE */
|
||||
sjc.finish_tail_call_code = jit_get_ip().ptr;
|
||||
sjc.finish_tail_call_code = jit_get_ip();
|
||||
scheme_generate_finish_tail_call(jitter, 0);
|
||||
CHECK_LIMIT();
|
||||
scheme_jit_register_helper_func(jitter, sjc.finish_tail_call_code);
|
||||
sjc.finish_tail_call_fixup_code = jit_get_ip().ptr;
|
||||
sjc.finish_tail_call_fixup_code = jit_get_ip();
|
||||
scheme_generate_finish_tail_call(jitter, 2);
|
||||
CHECK_LIMIT();
|
||||
scheme_jit_register_helper_func(jitter, sjc.finish_tail_call_fixup_code);
|
||||
|
||||
/* *** get_stack_pointer_code *** */
|
||||
sjc.get_stack_pointer_code = jit_get_ip().ptr;
|
||||
sjc.get_stack_pointer_code = jit_get_ip();
|
||||
jit_leaf(0);
|
||||
jit_movr_p(JIT_R0, JIT_FP);
|
||||
/* Get frame pointer of caller... */
|
||||
|
@ -834,6 +834,9 @@ static int common2(mz_jit_state *jitter, void *_data)
|
|||
#endif
|
||||
#ifdef MZ_USE_JIT_I386
|
||||
jit_ldr_p(JIT_R0, JIT_R0);
|
||||
#endif
|
||||
#ifdef MZ_USE_JIT_ARM
|
||||
jit_ldxi_p(JIT_R0, JIT_R0, JIT_NEXT_FP_OFFSET);
|
||||
#endif
|
||||
jit_movr_p(JIT_RET, JIT_R0);
|
||||
jit_ret();
|
||||
|
@ -844,7 +847,7 @@ static int common2(mz_jit_state *jitter, void *_data)
|
|||
any registers that a function call would normally save
|
||||
and restore. JIT_AUX, which is used by things like jit_ldi,
|
||||
is such a register for PPC. */
|
||||
sjc.stack_cache_pop_code = jit_get_ip().ptr;
|
||||
sjc.stack_cache_pop_code = jit_get_ip();
|
||||
jit_movr_p(JIT_R0, JIT_RET);
|
||||
#ifdef MZ_USE_JIT_PPC
|
||||
jit_subi_p(JIT_SP, JIT_SP, 48); /* includes space maybe used by callee */
|
||||
|
@ -875,7 +878,7 @@ static int common2(mz_jit_state *jitter, void *_data)
|
|||
|
||||
/* *** bad_app_vals_target *** */
|
||||
/* Non-proc is in R0 */
|
||||
sjc.bad_app_vals_target = jit_get_ip().ptr;
|
||||
sjc.bad_app_vals_target = jit_get_ip();
|
||||
JIT_UPDATE_THREAD_RSPTR();
|
||||
mz_prepare(1);
|
||||
jit_pusharg_p(JIT_R0);
|
||||
|
@ -887,9 +890,9 @@ static int common2(mz_jit_state *jitter, void *_data)
|
|||
/* Rator in V1, arguments are in thread's multiple-values cells. */
|
||||
for (i = 0; i < 2; i++) {
|
||||
if (i)
|
||||
sjc.app_values_multi_slow_code = jit_get_ip().ptr;
|
||||
sjc.app_values_multi_slow_code = jit_get_ip();
|
||||
else
|
||||
sjc.app_values_slow_code = jit_get_ip().ptr;
|
||||
sjc.app_values_slow_code = jit_get_ip();
|
||||
mz_prolog(JIT_R1);
|
||||
JIT_UPDATE_THREAD_RSPTR();
|
||||
mz_prepare(1);
|
||||
|
@ -910,7 +913,7 @@ static int common2(mz_jit_state *jitter, void *_data)
|
|||
{
|
||||
GC_CAN_IGNORE jit_insn *refslow, *ref1, *refloop, *ref2;
|
||||
|
||||
sjc.values_code = jit_get_ip().ptr;
|
||||
sjc.values_code = jit_get_ip();
|
||||
mz_prolog(JIT_R1);
|
||||
mz_tl_ldi_p(JIT_R2, tl_scheme_current_thread);
|
||||
jit_ldxi_p(JIT_R1, JIT_R2, &((Scheme_Thread *)0x0)->values_buffer);
|
||||
|
@ -918,7 +921,7 @@ static int common2(mz_jit_state *jitter, void *_data)
|
|||
CHECK_LIMIT();
|
||||
|
||||
/* Allocate new array: */
|
||||
refslow = _jit.x.pc;
|
||||
refslow = jit_get_ip();
|
||||
JIT_UPDATE_THREAD_RSPTR();
|
||||
mz_prepare(2);
|
||||
jit_pusharg_p(JIT_R2);
|
||||
|
@ -942,7 +945,7 @@ static int common2(mz_jit_state *jitter, void *_data)
|
|||
|
||||
/* Copy values over: */
|
||||
jit_movr_p(JIT_R0, JIT_RUNSTACK);
|
||||
refloop = _jit.x.pc;
|
||||
refloop = jit_get_ip();
|
||||
jit_ldr_p(JIT_R2, JIT_R0);
|
||||
jit_str_p(JIT_R1, JIT_R2);
|
||||
jit_subi_l(JIT_V1, JIT_V1, 1);
|
||||
|
@ -1055,7 +1058,7 @@ static int common3(mz_jit_state *jitter, void *_data)
|
|||
int offset, count_offset, log_elem_size;
|
||||
void *code;
|
||||
|
||||
code = jit_get_ip().ptr;
|
||||
code = jit_get_ip();
|
||||
|
||||
switch (ii) {
|
||||
case -1:
|
||||
|
@ -1173,7 +1176,7 @@ static int common3(mz_jit_state *jitter, void *_data)
|
|||
CHECK_LIMIT();
|
||||
|
||||
/* Slow path: */
|
||||
reffail = _jit.x.pc;
|
||||
reffail = jit_get_ip();
|
||||
if (ii != -1) {
|
||||
/* in chaperone mode, we already saved original and index on runstack */
|
||||
if (!i) {
|
||||
|
@ -1470,7 +1473,7 @@ int scheme_generate_struct_op(mz_jit_state *jitter, int kind, int for_branch,
|
|||
/* Check argument: */
|
||||
if (kind == 1) {
|
||||
bref1 = jit_bmsi_ul(jit_forward(), JIT_R1, 0x1);
|
||||
refretry = _jit.x.pc;
|
||||
refretry = jit_get_ip();
|
||||
jit_ldxi_s(JIT_R2, JIT_R1, &((Scheme_Object *)0x0)->type);
|
||||
__START_INNER_TINY__(1);
|
||||
ref2 = jit_beqi_i(jit_forward(), JIT_R2, scheme_structure_type);
|
||||
|
@ -1674,7 +1677,7 @@ static int common4(mz_jit_state *jitter, void *_data)
|
|||
for (i = 0; i < 3; i++) {
|
||||
void *code;
|
||||
|
||||
code = jit_get_ip().ptr;
|
||||
code = jit_get_ip();
|
||||
|
||||
if (!i) {
|
||||
sjc.flvector_ref_check_index_code[iii] = code;
|
||||
|
@ -1731,7 +1734,7 @@ static int common4(mz_jit_state *jitter, void *_data)
|
|||
for (iii = 0; iii < 2; iii++) { /* ref, set */
|
||||
void *code;
|
||||
|
||||
code = jit_get_ip().ptr;
|
||||
code = jit_get_ip();
|
||||
|
||||
if (!iii) {
|
||||
sjc.struct_raw_ref_code = code;
|
||||
|
@ -1767,13 +1770,13 @@ static int common4(mz_jit_state *jitter, void *_data)
|
|||
/* R0 is (potential) syntax object */
|
||||
{
|
||||
GC_CAN_IGNORE jit_insn *ref, *reffail, *refrts;
|
||||
sjc.syntax_e_code = jit_get_ip().ptr;
|
||||
sjc.syntax_e_code = jit_get_ip();
|
||||
__START_TINY_JUMPS__(1);
|
||||
mz_prolog(JIT_R2);
|
||||
|
||||
ref = jit_bmci_ul(jit_forward(), JIT_R0, 0x1);
|
||||
|
||||
reffail = _jit.x.pc;
|
||||
reffail = jit_get_ip();
|
||||
jit_subi_p(JIT_RUNSTACK, JIT_RUNSTACK, WORDS_TO_BYTES(1));
|
||||
CHECK_RUNSTACK_OVERFLOW();
|
||||
jit_str_p(JIT_RUNSTACK, JIT_R0);
|
||||
|
@ -1829,41 +1832,41 @@ static int common4(mz_jit_state *jitter, void *_data)
|
|||
if ((ii == 1) && (i == 1)) continue; /* no multi variant of pred branch */
|
||||
if ((ii == 2) && (i == 1)) continue; /* no tail variant of pred branch */
|
||||
|
||||
code = jit_get_ip().ptr;
|
||||
code = jit_get_ip();
|
||||
|
||||
if (!i) {
|
||||
kind = 1;
|
||||
for_branch = 0;
|
||||
if (ii == 2)
|
||||
sjc.struct_pred_tail_code = jit_get_ip().ptr;
|
||||
sjc.struct_pred_tail_code = jit_get_ip();
|
||||
else if (ii == 1)
|
||||
sjc.struct_pred_multi_code = jit_get_ip().ptr;
|
||||
sjc.struct_pred_multi_code = jit_get_ip();
|
||||
else
|
||||
sjc.struct_pred_code = jit_get_ip().ptr;
|
||||
sjc.struct_pred_code = jit_get_ip();
|
||||
} else if (i == 1) {
|
||||
kind = 1;
|
||||
for_branch = 1;
|
||||
sjc.struct_pred_branch_code = jit_get_ip().ptr;
|
||||
sjc.struct_pred_branch_code = jit_get_ip();
|
||||
/* Save target address for false branch: */
|
||||
save_struct_temp(jitter, JIT_V1);
|
||||
} else if (i == 2) {
|
||||
kind = 2;
|
||||
for_branch = 0;
|
||||
if (ii == 2)
|
||||
sjc.struct_get_tail_code = jit_get_ip().ptr;
|
||||
sjc.struct_get_tail_code = jit_get_ip();
|
||||
else if (ii == 1)
|
||||
sjc.struct_get_multi_code = jit_get_ip().ptr;
|
||||
sjc.struct_get_multi_code = jit_get_ip();
|
||||
else
|
||||
sjc.struct_get_code = jit_get_ip().ptr;
|
||||
sjc.struct_get_code = jit_get_ip();
|
||||
} else {
|
||||
kind = 3;
|
||||
for_branch = 0;
|
||||
if (ii == 2)
|
||||
sjc.struct_set_tail_code = jit_get_ip().ptr;
|
||||
sjc.struct_set_tail_code = jit_get_ip();
|
||||
else if (ii == 1)
|
||||
sjc.struct_set_multi_code = jit_get_ip().ptr;
|
||||
sjc.struct_set_multi_code = jit_get_ip();
|
||||
else
|
||||
sjc.struct_set_code = jit_get_ip().ptr;
|
||||
sjc.struct_set_code = jit_get_ip();
|
||||
/* Save value to install: */
|
||||
save_struct_temp(jitter, JIT_V1);
|
||||
}
|
||||
|
@ -1876,13 +1879,13 @@ static int common4(mz_jit_state *jitter, void *_data)
|
|||
CHECK_LIMIT();
|
||||
|
||||
/* Slow path: non-struct proc. */
|
||||
refslow = _jit.x.pc;
|
||||
refslow = jit_get_ip();
|
||||
gen_struct_slow(jitter, kind, 0, for_branch, ii == 2, ii == 1, &bref5, &bref6);
|
||||
CHECK_LIMIT();
|
||||
|
||||
if ((kind == 2) || (kind == 3)) {
|
||||
/* Slow path: argument type is bad for a getter/setter. */
|
||||
refslow2 = _jit.x.pc;
|
||||
refslow2 = jit_get_ip();
|
||||
gen_struct_slow(jitter, kind, 1, 0, 0, 0, NULL, NULL);
|
||||
CHECK_LIMIT();
|
||||
} else
|
||||
|
@ -1916,7 +1919,7 @@ static int common4b(mz_jit_state *jitter, void *_data)
|
|||
void *code;
|
||||
GC_CAN_IGNORE jit_insn *ref, *ref2, *ref3, *refno, *refslow, *refloop;
|
||||
|
||||
code = jit_get_ip().ptr;
|
||||
code = jit_get_ip();
|
||||
|
||||
if (i == 0) {
|
||||
if (ii == 2)
|
||||
|
@ -1957,7 +1960,7 @@ static int common4b(mz_jit_state *jitter, void *_data)
|
|||
|
||||
/* Slow path: non-struct-prop proc, or argument type is
|
||||
bad for a getter. */
|
||||
refslow = _jit.x.pc;
|
||||
refslow = jit_get_ip();
|
||||
jit_subi_p(JIT_RUNSTACK, JIT_RUNSTACK, WORDS_TO_BYTES(1));
|
||||
CHECK_RUNSTACK_OVERFLOW();
|
||||
JIT_UPDATE_THREAD_RSPTR();
|
||||
|
@ -1987,7 +1990,7 @@ static int common4b(mz_jit_state *jitter, void *_data)
|
|||
mz_epilog(JIT_V1);
|
||||
CHECK_LIMIT();
|
||||
if (i == 2) {
|
||||
refno = _jit.x.pc;
|
||||
refno = jit_get_ip();
|
||||
(void)jit_movi_p(JIT_R0, scheme_false);
|
||||
mz_epilog(JIT_V1);
|
||||
CHECK_LIMIT();
|
||||
|
@ -2028,7 +2031,7 @@ static int common4b(mz_jit_state *jitter, void *_data)
|
|||
if (i == 2) {
|
||||
(void)jit_blei_i(refslow, JIT_V1, 0);
|
||||
}
|
||||
refloop = _jit.x.pc;
|
||||
refloop = jit_get_ip();
|
||||
(void)jit_blei_i(refno, JIT_V1, 0);
|
||||
jit_subi_i(JIT_V1, JIT_V1, 1);
|
||||
mz_set_local_p(JIT_V1, JIT_LOCAL3);
|
||||
|
@ -2097,7 +2100,7 @@ static int common4c(mz_jit_state *jitter, void *_data)
|
|||
void *code;
|
||||
int num_args;
|
||||
|
||||
code = jit_get_ip().ptr;
|
||||
code = jit_get_ip();
|
||||
|
||||
if (i == 0) {
|
||||
if (ii == 2)
|
||||
|
@ -2151,14 +2154,14 @@ static int common5(mz_jit_state *jitter, void *_data)
|
|||
/* *** retry_alloc_code[{_keep_r0_r1,_keep_fpr1}] *** */
|
||||
for (i = 0; i < END_OF_I; i++) {
|
||||
if (!i)
|
||||
sjc.retry_alloc_code = jit_get_ip().ptr;
|
||||
sjc.retry_alloc_code = jit_get_ip();
|
||||
else if (i == 1)
|
||||
sjc.retry_alloc_code_keep_r0_r1 = jit_get_ip().ptr;
|
||||
sjc.retry_alloc_code_keep_r0_r1 = jit_get_ip();
|
||||
else if (i == 2)
|
||||
sjc.retry_alloc_code_keep_fpr1 = jit_get_ip().ptr;
|
||||
sjc.retry_alloc_code_keep_fpr1 = jit_get_ip();
|
||||
#ifdef MZ_LONG_DOUBLE
|
||||
else if (i == 3)
|
||||
sjc.retry_alloc_code_keep_extfpr1 = jit_get_ip().ptr;
|
||||
sjc.retry_alloc_code_keep_extfpr1 = jit_get_ip();
|
||||
#endif
|
||||
|
||||
mz_prolog(JIT_V1);
|
||||
|
@ -2176,9 +2179,9 @@ static int common5(mz_jit_state *jitter, void *_data)
|
|||
GC_CAN_IGNORE jit_insn *ref, *refnext;
|
||||
|
||||
if (i == 0)
|
||||
sjc.make_list_code = jit_get_ip().ptr;
|
||||
sjc.make_list_code = jit_get_ip();
|
||||
else
|
||||
sjc.make_list_star_code = jit_get_ip().ptr;
|
||||
sjc.make_list_star_code = jit_get_ip();
|
||||
mz_prolog(JIT_R1);
|
||||
jit_lshi_l(JIT_R2, JIT_R2, JIT_LOG_WORD_SIZE);
|
||||
if (i == 0)
|
||||
|
@ -2190,7 +2193,7 @@ static int common5(mz_jit_state *jitter, void *_data)
|
|||
|
||||
__START_SHORT_JUMPS__(1);
|
||||
ref = jit_beqi_l(jit_forward(), JIT_R2, 0);
|
||||
refnext = _jit.x.pc;
|
||||
refnext = jit_get_ip();
|
||||
__END_SHORT_JUMPS__(1);
|
||||
CHECK_LIMIT();
|
||||
|
||||
|
@ -2215,7 +2218,7 @@ static int common5(mz_jit_state *jitter, void *_data)
|
|||
/* *** box_flonum_from_stack_code *** */
|
||||
/* R0 has offset from frame pointer to double on stack */
|
||||
{
|
||||
sjc.box_flonum_from_stack_code = jit_get_ip().ptr;
|
||||
sjc.box_flonum_from_stack_code = jit_get_ip();
|
||||
|
||||
mz_prolog(JIT_R2);
|
||||
|
||||
|
@ -2232,7 +2235,7 @@ static int common5(mz_jit_state *jitter, void *_data)
|
|||
/* *** box_flonum_from_reg_code *** */
|
||||
/* JIT_FPR2 (reg-based) or JIT_FPR0 (stack-based) has value */
|
||||
{
|
||||
sjc.box_flonum_from_reg_code = jit_get_ip().ptr;
|
||||
sjc.box_flonum_from_reg_code = jit_get_ip();
|
||||
|
||||
mz_prolog(JIT_R2);
|
||||
|
||||
|
@ -2252,7 +2255,7 @@ static int common5(mz_jit_state *jitter, void *_data)
|
|||
/* *** box_extflonum_from_stack_code *** */
|
||||
/* R0 has offset from frame pointer to long double on stack */
|
||||
{
|
||||
sjc.box_extflonum_from_stack_code = jit_get_ip().ptr;
|
||||
sjc.box_extflonum_from_stack_code = jit_get_ip();
|
||||
|
||||
mz_prolog(JIT_R2);
|
||||
|
||||
|
@ -2269,7 +2272,7 @@ static int common5(mz_jit_state *jitter, void *_data)
|
|||
/* *** box_extflonum_from_reg_code *** */
|
||||
/* JIT_FPU_FPR2 (reg-based) or JIT_FPU_FPR0 (stack-based) has value */
|
||||
{
|
||||
sjc.box_extflonum_from_reg_code = jit_get_ip().ptr;
|
||||
sjc.box_extflonum_from_reg_code = jit_get_ip();
|
||||
|
||||
mz_prolog(JIT_R2);
|
||||
|
||||
|
@ -2285,7 +2288,7 @@ static int common5(mz_jit_state *jitter, void *_data)
|
|||
/* *** fl1_fail_code *** */
|
||||
/* R0 has argument, V1 has primitive proc */
|
||||
for (iii = 0; iii < JIT_NUM_FL_KINDS; iii++) {
|
||||
sjc.fl1_fail_code[iii] = jit_get_ip().ptr;
|
||||
sjc.fl1_fail_code[iii] = jit_get_ip();
|
||||
|
||||
mz_prolog(JIT_R2);
|
||||
|
||||
|
@ -2316,7 +2319,7 @@ static int common5(mz_jit_state *jitter, void *_data)
|
|||
void *code;
|
||||
int a0, a1;
|
||||
|
||||
code = jit_get_ip().ptr;
|
||||
code = jit_get_ip();
|
||||
switch (i) {
|
||||
case 0:
|
||||
sjc.fl2rr_fail_code[ii][iii] = code;
|
||||
|
@ -2388,14 +2391,14 @@ static int common6(mz_jit_state *jitter, void *_data)
|
|||
{
|
||||
GC_CAN_IGNORE jit_insn *refloop, *ref, *ref2, *ref3, *ref4, *ref5, *ref7, *ref8;
|
||||
|
||||
sjc.wcm_code = jit_get_ip().ptr;
|
||||
sjc.wcm_code = jit_get_ip();
|
||||
|
||||
mz_prolog(JIT_R2);
|
||||
|
||||
(void)mz_tl_ldi_p(JIT_R2, tl_scheme_current_cont_mark_stack);
|
||||
/* R2 has counter for search */
|
||||
|
||||
refloop = _jit.x.pc;
|
||||
refloop = jit_get_ip();
|
||||
(void)mz_tl_ldi_p(JIT_R1, tl_scheme_current_thread);
|
||||
jit_ldxi_l(JIT_R0, JIT_R1, &((Scheme_Thread *)0x0)->cont_mark_stack_bottom);
|
||||
ref = jit_bler_i(jit_forward(), JIT_R2, JIT_R0); /* => double-check meta-continuation */
|
||||
|
@ -2439,14 +2442,14 @@ static int common6(mz_jit_state *jitter, void *_data)
|
|||
jit_subi_l(JIT_R2, JIT_R2, 2);
|
||||
ref = jit_bner_i(jit_forward(), JIT_R2, JIT_R0); /* => try to allocate new slot */
|
||||
jit_ldxi_p(JIT_R1, JIT_R1, &((Scheme_Thread *)0x0)->meta_continuation);
|
||||
ref7 = jit_beqi_l(jit_forward(), JIT_R1, NULL); /* => try to allocate new slot */
|
||||
ref7 = jit_beqi_p(jit_forward(), JIT_R1, NULL); /* => try to allocate new slot */
|
||||
/* we need to check a meta-continuation... take the slow path. */
|
||||
ref8 = jit_jmpi(jit_forward());
|
||||
CHECK_LIMIT();
|
||||
|
||||
/* Entry point when we know we're not in non-tail position with respect
|
||||
to any enclosing wcm: */
|
||||
sjc.wcm_nontail_code = jit_get_ip().ptr;
|
||||
sjc.wcm_nontail_code = jit_get_ip();
|
||||
mz_prolog(JIT_R2);
|
||||
|
||||
/* Try to allocate new slot: */
|
||||
|
@ -2491,7 +2494,7 @@ static int common6(mz_jit_state *jitter, void *_data)
|
|||
CHECK_LIMIT();
|
||||
|
||||
/* return: */
|
||||
ref5 = _jit.x.pc;
|
||||
ref5 = jit_get_ip();
|
||||
mz_epilog(JIT_R2);
|
||||
|
||||
/* slow path: */
|
||||
|
@ -2519,7 +2522,7 @@ static int common6(mz_jit_state *jitter, void *_data)
|
|||
/* key and value are on runstack and are updated there */
|
||||
{
|
||||
GC_CAN_IGNORE jit_insn *ref2;
|
||||
sjc.wcm_chaperone = jit_get_ip().ptr;
|
||||
sjc.wcm_chaperone = jit_get_ip();
|
||||
|
||||
mz_prolog(JIT_R2);
|
||||
JIT_UPDATE_THREAD_RSPTR();
|
||||
|
@ -2545,7 +2548,7 @@ static int common7(mz_jit_state *jitter, void *_data)
|
|||
GC_CAN_IGNORE jit_insn *refloop, *ref1, *ref2, *ref3, *ref4;
|
||||
GC_CAN_IGNORE jit_insn *ref5, *ref6, *ref7, *ref8;
|
||||
|
||||
code = jit_get_ip().ptr;
|
||||
code = jit_get_ip();
|
||||
if (!i)
|
||||
sjc.list_p_code = code;
|
||||
else
|
||||
|
@ -2562,7 +2565,7 @@ static int common7(mz_jit_state *jitter, void *_data)
|
|||
/* Note: there's no fuel check in this loop, just like there isn't in
|
||||
scheme_is_list(). */
|
||||
|
||||
refloop = _jit.x.pc;
|
||||
refloop = jit_get_ip();
|
||||
jit_ldxi_s(JIT_R2, JIT_R0, &MZ_OPT_HASH_KEY(&((Scheme_Stx *)0x0)->iso));
|
||||
ref1 = jit_bmsi_ul(jit_forward(), JIT_R2, PAIR_FLAG_MASK);
|
||||
|
||||
|
@ -2673,7 +2676,7 @@ static int common8(mz_jit_state *jitter, void *_data)
|
|||
void *code;
|
||||
GC_CAN_IGNORE jit_insn *refloop, *ref1, *ref2, *ref3, *ref4, *ref5;
|
||||
|
||||
code = jit_get_ip().ptr;
|
||||
code = jit_get_ip();
|
||||
sjc.list_length_code = code;
|
||||
|
||||
mz_prolog(JIT_R2);
|
||||
|
@ -2689,7 +2692,7 @@ static int common8(mz_jit_state *jitter, void *_data)
|
|||
/* R0 has argument, R1 has counter */
|
||||
jit_movi_l(JIT_R1, 0);
|
||||
|
||||
refloop = _jit.x.pc;
|
||||
refloop = jit_get_ip();
|
||||
|
||||
ref2 = jit_beqi_p(jit_forward(), JIT_R0, scheme_null);
|
||||
ref3 = jit_bmsi_l(jit_forward(), JIT_R0, 0x1);
|
||||
|
@ -2710,7 +2713,7 @@ static int common8(mz_jit_state *jitter, void *_data)
|
|||
mz_patch_branch(ref2);
|
||||
__END_SHORT_JUMPS__(1);
|
||||
jit_fixnum_l(JIT_R0, JIT_R1);
|
||||
ref1 = _jit.x.pc;
|
||||
ref1 = jit_get_ip();
|
||||
mz_epilog(JIT_R2);
|
||||
|
||||
__START_SHORT_JUMPS__(1);
|
||||
|
@ -2747,7 +2750,7 @@ static int common8_5(mz_jit_state *jitter, void *_data)
|
|||
GC_CAN_IGNORE jit_insn *refslow, *refloop, *refdone, *ref, *refr;
|
||||
GC_CAN_IGNORE jit_insn *refmaybedone, *refresume;
|
||||
|
||||
code = jit_get_ip().ptr;
|
||||
code = jit_get_ip();
|
||||
if (i == 0)
|
||||
sjc.list_tail_code = code;
|
||||
else
|
||||
|
@ -2763,7 +2766,7 @@ static int common8_5(mz_jit_state *jitter, void *_data)
|
|||
|
||||
ref = jit_bmsi_l(jit_forward(), JIT_R1, 0x1);
|
||||
|
||||
refslow = _jit.x.pc;
|
||||
refslow = jit_get_ip();
|
||||
|
||||
jit_subi_p(JIT_RUNSTACK, JIT_RUNSTACK, WORDS_TO_BYTES(2));
|
||||
JIT_UPDATE_THREAD_RSPTR();
|
||||
|
@ -2794,10 +2797,10 @@ static int common8_5(mz_jit_state *jitter, void *_data)
|
|||
jit_rshi_l(JIT_R1, JIT_R1, 1);
|
||||
(void)jit_blti_l(refslow, JIT_R1, 0);
|
||||
|
||||
refloop = _jit.x.pc;
|
||||
refloop = jit_get_ip();
|
||||
if (i == 0) {
|
||||
refmaybedone = jit_bmci_l(jit_forward(), JIT_R1, 0xFFF);
|
||||
refresume = _jit.x.pc;
|
||||
refresume = jit_get_ip();
|
||||
} else {
|
||||
refmaybedone = NULL;
|
||||
refresume = NULL;
|
||||
|
@ -2806,7 +2809,7 @@ static int common8_5(mz_jit_state *jitter, void *_data)
|
|||
(void)mz_bnei_t(refslow, JIT_R0, scheme_pair_type, JIT_R2);
|
||||
if (i == 1) {
|
||||
refmaybedone = jit_bmci_l(jit_forward(), JIT_R1, 0xFFF);
|
||||
refresume = _jit.x.pc;
|
||||
refresume = jit_get_ip();
|
||||
}
|
||||
jit_subi_l(JIT_R1, JIT_R1, 1);
|
||||
jit_ldxi_p(JIT_R0, JIT_R0, (intptr_t)&SCHEME_CDR(0x0));
|
||||
|
@ -2848,7 +2851,7 @@ static int common9(mz_jit_state *jitter, void *_data)
|
|||
void *code;
|
||||
GC_CAN_IGNORE jit_insn *ref;
|
||||
|
||||
code = jit_get_ip().ptr;
|
||||
code = jit_get_ip();
|
||||
if (i == 0)
|
||||
sjc.eqv_code = code;
|
||||
else
|
||||
|
@ -2902,7 +2905,7 @@ static int common10(mz_jit_state *jitter, void *_data)
|
|||
{
|
||||
GC_CAN_IGNORE jit_insn *ref, *refslow, *refr ,*ref_nc, *ref_prim, *refno;
|
||||
|
||||
sjc.proc_arity_includes_code = jit_get_ip().ptr;
|
||||
sjc.proc_arity_includes_code = jit_get_ip();
|
||||
|
||||
mz_prolog(JIT_R2);
|
||||
|
||||
|
@ -2910,7 +2913,7 @@ static int common10(mz_jit_state *jitter, void *_data)
|
|||
|
||||
ref = jit_bmsi_l(jit_forward(), JIT_R1, 0x1);
|
||||
|
||||
refslow = _jit.x.pc;
|
||||
refslow = jit_get_ip();
|
||||
|
||||
jit_subi_p(JIT_RUNSTACK, JIT_RUNSTACK, WORDS_TO_BYTES(2));
|
||||
JIT_UPDATE_THREAD_RSPTR();
|
||||
|
@ -2931,7 +2934,7 @@ static int common10(mz_jit_state *jitter, void *_data)
|
|||
|
||||
mz_epilog(JIT_R2);
|
||||
|
||||
refno = _jit.x.pc;
|
||||
refno = jit_get_ip();
|
||||
(void)jit_movi_p(JIT_R0, scheme_false);
|
||||
mz_epilog(JIT_R2);
|
||||
|
||||
|
@ -3018,7 +3021,7 @@ static int common11(mz_jit_state *jitter, void *_data)
|
|||
{
|
||||
GC_CAN_IGNORE jit_insn *refr;
|
||||
|
||||
sjc.bad_char_to_integer_code = jit_get_ip().ptr;
|
||||
sjc.bad_char_to_integer_code = jit_get_ip();
|
||||
|
||||
mz_prolog(JIT_R2);
|
||||
|
||||
|
@ -3043,7 +3046,7 @@ static int common11(mz_jit_state *jitter, void *_data)
|
|||
{
|
||||
GC_CAN_IGNORE jit_insn *refr;
|
||||
|
||||
sjc.slow_integer_to_char_code = jit_get_ip().ptr;
|
||||
sjc.slow_integer_to_char_code = jit_get_ip();
|
||||
|
||||
mz_prolog(JIT_R2);
|
||||
|
||||
|
@ -3097,7 +3100,7 @@ static int more_common0(mz_jit_state *jitter, void *_data)
|
|||
{
|
||||
GC_CAN_IGNORE jit_insn *ref, *ref2, *ref3, *refslow, *refrts;
|
||||
|
||||
sjc.struct_proc_extract_code = jit_get_ip().ptr;
|
||||
sjc.struct_proc_extract_code = jit_get_ip();
|
||||
mz_prolog(JIT_V1);
|
||||
|
||||
__START_SHORT_JUMPS__(1);
|
||||
|
@ -3107,7 +3110,7 @@ static int more_common0(mz_jit_state *jitter, void *_data)
|
|||
CHECK_LIMIT();
|
||||
|
||||
/* Slow path: call C implementation */
|
||||
refslow = _jit.x.pc;
|
||||
refslow = jit_get_ip();
|
||||
JIT_UPDATE_THREAD_RSPTR();
|
||||
jit_movi_i(JIT_V1, 5);
|
||||
jit_prepare(2);
|
||||
|
@ -3204,7 +3207,7 @@ static int more_common0(mz_jit_state *jitter, void *_data)
|
|||
{
|
||||
int in;
|
||||
|
||||
sjc.module_run_start_code = jit_get_ip().ptr;
|
||||
sjc.module_run_start_code = jit_get_ip();
|
||||
jit_prolog(3);
|
||||
in = jit_arg_p();
|
||||
jit_getarg_p(JIT_R0, in); /* menv */
|
||||
|
@ -3235,7 +3238,7 @@ static int more_common0(mz_jit_state *jitter, void *_data)
|
|||
{
|
||||
int in;
|
||||
|
||||
sjc.module_exprun_start_code = jit_get_ip().ptr;
|
||||
sjc.module_exprun_start_code = jit_get_ip();
|
||||
jit_prolog(3);
|
||||
in = jit_arg_p();
|
||||
jit_getarg_p(JIT_R0, in); /* menv */
|
||||
|
@ -3266,7 +3269,7 @@ static int more_common0(mz_jit_state *jitter, void *_data)
|
|||
{
|
||||
int in;
|
||||
|
||||
sjc.module_start_start_code = jit_get_ip().ptr;
|
||||
sjc.module_start_start_code = jit_get_ip();
|
||||
jit_prolog(2);
|
||||
in = jit_arg_p();
|
||||
jit_getarg_p(JIT_R0, in); /* a */
|
||||
|
@ -3299,7 +3302,7 @@ static int more_common1(mz_jit_state *jitter, void *_data)
|
|||
{
|
||||
GC_CAN_IGNORE jit_insn *ref1, *ref2, *ref3, *ref4, *ref5, *ref6, *refloop;
|
||||
|
||||
sjc.apply_to_list_tail_code = jit_get_ip().ptr;
|
||||
sjc.apply_to_list_tail_code = jit_get_ip();
|
||||
|
||||
__START_SHORT_JUMPS__(1);
|
||||
|
||||
|
@ -3311,7 +3314,7 @@ static int more_common1(mz_jit_state *jitter, void *_data)
|
|||
CHECK_LIMIT();
|
||||
|
||||
/* check that it's a list and get the length */
|
||||
refloop = _jit.x.pc;
|
||||
refloop = jit_get_ip();
|
||||
__START_INNER_TINY__(1);
|
||||
ref2 = jit_beqi_p(jit_forward(), JIT_R0, scheme_null);
|
||||
__END_INNER_TINY__(1);
|
||||
|
@ -3365,7 +3368,7 @@ static int more_common1(mz_jit_state *jitter, void *_data)
|
|||
jit_addr_l(JIT_R2, JIT_R2, JIT_R0); /* move R2 and RUNSTACK pointers to end instead of start */
|
||||
jit_addr_l(JIT_RUNSTACK, JIT_RUNSTACK, JIT_R0);
|
||||
jit_negr_l(JIT_R0, JIT_R0); /* negate counter */
|
||||
refloop = _jit.x.pc;
|
||||
refloop = jit_get_ip();
|
||||
jit_ldxr_p(JIT_R1, JIT_RUNSTACK, JIT_R0);
|
||||
jit_stxr_p(JIT_R0, JIT_R2, JIT_R1);
|
||||
jit_addi_l(JIT_R0, JIT_R0, JIT_WORD_SIZE);
|
||||
|
@ -3383,7 +3386,7 @@ static int more_common1(mz_jit_state *jitter, void *_data)
|
|||
mz_patch_branch(ref6);
|
||||
jit_subi_l(JIT_R0, JIT_V1, 1); /* drop last arg */
|
||||
jit_lshi_ul(JIT_R0, JIT_R0, JIT_LOG_WORD_SIZE);
|
||||
refloop = _jit.x.pc;
|
||||
refloop = jit_get_ip();
|
||||
jit_subi_l(JIT_R0, JIT_R0, JIT_WORD_SIZE);
|
||||
jit_ldxr_p(JIT_R1, JIT_RUNSTACK, JIT_R0);
|
||||
jit_stxr_p(JIT_R0, JIT_R2, JIT_R1);
|
||||
|
@ -3400,7 +3403,7 @@ static int more_common1(mz_jit_state *jitter, void *_data)
|
|||
mz_get_local_p(JIT_R0, JIT_LOCAL2); /* list in R0 */
|
||||
jit_subi_l(JIT_R1, JIT_V1, 1); /* drop last original arg */
|
||||
jit_lshi_ul(JIT_R1, JIT_R1, JIT_LOG_WORD_SIZE);
|
||||
refloop = _jit.x.pc;
|
||||
refloop = jit_get_ip();
|
||||
__START_INNER_TINY__(1);
|
||||
ref6 = jit_beqi_p(jit_forward(), JIT_R0, scheme_null);
|
||||
__END_INNER_TINY__(1);
|
||||
|
@ -3437,7 +3440,7 @@ static int more_common1(mz_jit_state *jitter, void *_data)
|
|||
mz_ld_runstack_base_alt(JIT_R2);
|
||||
jit_lshi_ul(JIT_R0, JIT_V1, JIT_LOG_WORD_SIZE);
|
||||
jit_subr_p(JIT_R2, JIT_RUNSTACK_BASE_OR_ALT(JIT_R2), JIT_R0);
|
||||
refloop = _jit.x.pc;
|
||||
refloop = jit_get_ip();
|
||||
jit_subi_l(JIT_R0, JIT_R0, JIT_WORD_SIZE);
|
||||
jit_ldxr_p(JIT_R1, JIT_RUNSTACK, JIT_R0);
|
||||
jit_stxr_p(JIT_R0, JIT_R2, JIT_R1);
|
||||
|
@ -3468,7 +3471,7 @@ static int more_common1(mz_jit_state *jitter, void *_data)
|
|||
void *code;
|
||||
|
||||
for (multi_ok = 0; multi_ok < 2; multi_ok++) {
|
||||
code = jit_get_ip().ptr;
|
||||
code = jit_get_ip();
|
||||
if (multi_ok)
|
||||
sjc.apply_to_list_multi_ok_code = code;
|
||||
else
|
||||
|
@ -3487,7 +3490,7 @@ static int more_common1(mz_jit_state *jitter, void *_data)
|
|||
|
||||
/* check that it's a list and get the length */
|
||||
|
||||
refloop = _jit.x.pc;
|
||||
refloop = jit_get_ip();
|
||||
__START_INNER_TINY__(1);
|
||||
ref2 = jit_beqi_p(jit_forward(), JIT_R0, scheme_null);
|
||||
__END_INNER_TINY__(1);
|
||||
|
@ -3523,7 +3526,7 @@ static int more_common1(mz_jit_state *jitter, void *_data)
|
|||
jit_subi_l(JIT_R0, JIT_V1, 2); /* drop first and last arg */
|
||||
jit_lshi_ul(JIT_R0, JIT_R0, JIT_LOG_WORD_SIZE);
|
||||
jit_addi_p(JIT_RUNSTACK, JIT_RUNSTACK, JIT_WORD_SIZE); /* skip first arg */
|
||||
refloop = _jit.x.pc;
|
||||
refloop = jit_get_ip();
|
||||
jit_subi_l(JIT_R0, JIT_R0, JIT_WORD_SIZE);
|
||||
jit_ldxr_p(JIT_R1, JIT_RUNSTACK, JIT_R0);
|
||||
jit_stxr_p(JIT_R0, JIT_R2, JIT_R1);
|
||||
|
@ -3546,7 +3549,7 @@ static int more_common1(mz_jit_state *jitter, void *_data)
|
|||
|
||||
jit_subi_l(JIT_R1, JIT_V1, 2); /* drop first and last original arg */
|
||||
jit_lshi_ul(JIT_R1, JIT_R1, JIT_LOG_WORD_SIZE);
|
||||
refloop = _jit.x.pc;
|
||||
refloop = jit_get_ip();
|
||||
__START_INNER_TINY__(1);
|
||||
ref6 = jit_beqi_p(jit_forward(), JIT_R0, scheme_null);
|
||||
__END_INNER_TINY__(1);
|
||||
|
@ -3582,7 +3585,7 @@ static int more_common1(mz_jit_state *jitter, void *_data)
|
|||
wants to pop N arguments. */
|
||||
jit_lshi_ul(JIT_R0, JIT_V1, JIT_LOG_WORD_SIZE);
|
||||
jit_subr_p(JIT_R2, JIT_RUNSTACK, JIT_R0);
|
||||
refloop = _jit.x.pc;
|
||||
refloop = jit_get_ip();
|
||||
jit_subi_l(JIT_R0, JIT_R0, JIT_WORD_SIZE);
|
||||
jit_ldxr_p(JIT_R1, JIT_RUNSTACK, JIT_R0);
|
||||
jit_stxr_p(JIT_R0, JIT_R2, JIT_R1);
|
||||
|
@ -3610,7 +3613,7 @@ static int more_common1(mz_jit_state *jitter, void *_data)
|
|||
#ifdef MZ_USE_LWC
|
||||
/* native_starter_code */
|
||||
{
|
||||
sjc.native_starter_code = (LWC_Native_Starter)jit_get_ip().ptr;
|
||||
sjc.native_starter_code = (LWC_Native_Starter)jit_get_ip();
|
||||
|
||||
/* store stack pointer in address given by 5th argument, then jump to
|
||||
the address given by the 4th argument */
|
||||
|
@ -3626,7 +3629,7 @@ static int more_common1(mz_jit_state *jitter, void *_data)
|
|||
{
|
||||
int in;
|
||||
|
||||
sjc.continuation_apply_indirect_code = (Continuation_Apply_Indirect)jit_get_ip().ptr;
|
||||
sjc.continuation_apply_indirect_code = (Continuation_Apply_Indirect)jit_get_ip();
|
||||
|
||||
/* install stack pointer into first argument before doing anything */
|
||||
jit_getprearg__p(JIT_PREARG);
|
||||
|
@ -3667,7 +3670,7 @@ static int more_common1(mz_jit_state *jitter, void *_data)
|
|||
{
|
||||
int in;
|
||||
|
||||
sjc.continuation_apply_finish_code = (Continuation_Apply_Finish)jit_get_ip().ptr;
|
||||
sjc.continuation_apply_finish_code = (Continuation_Apply_Finish)jit_get_ip();
|
||||
|
||||
jit_prolog(2);
|
||||
in = jit_arg_p();
|
||||
|
|
|
@ -412,7 +412,7 @@ static int generate_inlined_struct_op(int kind, mz_jit_state *jitter,
|
|||
if (inline_rator && (kind != INLINE_STRUCT_PROC_PRED)) {
|
||||
__START_SHORT_JUMPS__(1);
|
||||
ref = jit_bmci_ul(jit_forward(), JIT_R1, 0x1);
|
||||
refslow = _jit.x.pc;
|
||||
refslow = jit_get_ip();
|
||||
if (kind == INLINE_STRUCT_PROC_SET)
|
||||
scheme_restore_struct_temp(jitter, JIT_V1);
|
||||
__END_SHORT_JUMPS__(1);
|
||||
|
@ -662,7 +662,7 @@ int scheme_generate_struct_alloc(mz_jit_state *jitter, int num_args,
|
|||
|
||||
/* Slow path: non-struct-prop proc, or argument type is
|
||||
bad for a getter. */
|
||||
refslow = _jit.x.pc;
|
||||
refslow = jit_get_ip();
|
||||
if (inline_slow) {
|
||||
if (num_args == 1) {
|
||||
jit_subi_p(JIT_RUNSTACK, JIT_RUNSTACK, WORDS_TO_BYTES(1));
|
||||
|
@ -1224,7 +1224,7 @@ int scheme_generate_inlined_unary(mz_jit_state *jitter, Scheme_App2_Rec *app, in
|
|||
if (!sjc.skip_checks) {
|
||||
if (!i) {
|
||||
ref = jit_bmci_ul(jit_forward(), JIT_R0, 0x1);
|
||||
reffail = _jit.x.pc;
|
||||
reffail = jit_get_ip();
|
||||
__END_TINY_JUMPS__(1);
|
||||
if (steps == 1) {
|
||||
if (name[1] == 'a') {
|
||||
|
@ -1289,7 +1289,7 @@ int scheme_generate_inlined_unary(mz_jit_state *jitter, Scheme_App2_Rec *app, in
|
|||
__START_TINY_JUMPS__(1);
|
||||
|
||||
ref = jit_bmci_ul(jit_forward(), JIT_R0, 0x1);
|
||||
reffail = _jit.x.pc;
|
||||
reffail = jit_get_ip();
|
||||
__END_TINY_JUMPS__(1);
|
||||
if (name[2] == 'a') {
|
||||
(void)jit_calli(sjc.bad_mcar_code);
|
||||
|
@ -1398,7 +1398,7 @@ int scheme_generate_inlined_unary(mz_jit_state *jitter, Scheme_App2_Rec *app, in
|
|||
ref = jit_bmci_ul(jit_forward(), JIT_R0, 0x1);
|
||||
__END_TINY_JUMPS__(1);
|
||||
|
||||
reffail = _jit.x.pc;
|
||||
reffail = jit_get_ip();
|
||||
if (for_fl) {
|
||||
MZ_FPUSEL_STMT(extfl,
|
||||
(void)jit_calli(sjc.bad_extflvector_length_code),
|
||||
|
@ -1477,7 +1477,7 @@ int scheme_generate_inlined_unary(mz_jit_state *jitter, Scheme_App2_Rec *app, in
|
|||
ref = jit_bmci_ul(jit_forward(), JIT_R0, 0x1);
|
||||
__END_TINY_JUMPS__(1);
|
||||
|
||||
reffail = _jit.x.pc;
|
||||
reffail = jit_get_ip();
|
||||
(void)jit_calli(sjc.unbox_code);
|
||||
jit_movr_p(dest, JIT_R0);
|
||||
|
||||
|
@ -1580,7 +1580,7 @@ int scheme_generate_inlined_unary(mz_jit_state *jitter, Scheme_App2_Rec *app, in
|
|||
__START_TINY_JUMPS__(1);
|
||||
|
||||
ref = jit_bmci_ul(jit_forward(), JIT_R0, 0x1);
|
||||
reffail = _jit.x.pc;
|
||||
reffail = jit_get_ip();
|
||||
__END_TINY_JUMPS__(1);
|
||||
if (name[0] == 'i') {
|
||||
(void)jit_calli(sjc.imag_part_code);
|
||||
|
@ -1842,7 +1842,7 @@ int scheme_generate_inlined_unary(mz_jit_state *jitter, Scheme_App2_Rec *app, in
|
|||
__START_TINY_JUMPS__(1);
|
||||
|
||||
ref = jit_bmci_ul(jit_forward(), JIT_R0, 0x1);
|
||||
reffail = _jit.x.pc;
|
||||
reffail = jit_get_ip();
|
||||
__END_TINY_JUMPS__(1);
|
||||
(void)jit_calli(sjc.bad_char_to_integer_code);
|
||||
__START_TINY_JUMPS__(1);
|
||||
|
@ -1869,14 +1869,14 @@ int scheme_generate_inlined_unary(mz_jit_state *jitter, Scheme_App2_Rec *app, in
|
|||
__START_TINY_JUMPS__(1);
|
||||
|
||||
ref = jit_bmsi_ul(jit_forward(), JIT_R0, 0x1);
|
||||
refslow = _jit.x.pc;
|
||||
refslow = jit_get_ip();
|
||||
__END_TINY_JUMPS__(1);
|
||||
(void)jit_calli(sjc.slow_integer_to_char_code);
|
||||
__START_TINY_JUMPS__(1);
|
||||
refdone = jit_jmpi(jit_forward());
|
||||
mz_patch_branch(ref);
|
||||
(void)jit_blti_l(refslow, JIT_R0, scheme_make_integer(0));
|
||||
(void)jit_bgti_l(refslow, JIT_R0, scheme_make_integer(255));
|
||||
(void)jit_blti_p(refslow, JIT_R0, scheme_make_integer(0));
|
||||
(void)jit_bgti_p(refslow, JIT_R0, scheme_make_integer(255));
|
||||
|
||||
jit_rshi_l(JIT_R0, JIT_R0, 1);
|
||||
jit_lshi_l(JIT_R2, JIT_R0, JIT_LOG_WORD_SIZE);
|
||||
|
@ -2077,7 +2077,7 @@ static int generate_binary_char(mz_jit_state *jitter, Scheme_App3_Rec *app,
|
|||
if (!SCHEME_CHARP(r1)) {
|
||||
GC_CAN_IGNORE jit_insn *pref;
|
||||
pref = jit_bmci_ul(jit_forward(), JIT_R0, 0x1);
|
||||
reffail = _jit.x.pc;
|
||||
reffail = jit_get_ip();
|
||||
(void)jit_movi_p(JIT_R2, ((Scheme_Primitive_Proc *)rator)->prim_val);
|
||||
__END_SHORT_JUMPS__(branch_short);
|
||||
if (direction > 0) {
|
||||
|
@ -2097,7 +2097,7 @@ static int generate_binary_char(mz_jit_state *jitter, Scheme_App3_Rec *app,
|
|||
if (!reffail) {
|
||||
GC_CAN_IGNORE jit_insn *pref;
|
||||
pref = jit_bmci_ul(jit_forward(), JIT_R1, 0x1);
|
||||
reffail = _jit.x.pc;
|
||||
reffail = jit_get_ip();
|
||||
(void)jit_movi_p(JIT_R2, ((Scheme_Primitive_Proc *)rator)->prim_val);
|
||||
__END_SHORT_JUMPS__(branch_short);
|
||||
if (direction > 0) {
|
||||
|
@ -2174,7 +2174,7 @@ static int generate_vector_op(mz_jit_state *jitter, int set, int int_ready, int
|
|||
}
|
||||
__END_TINY_JUMPS__(1);
|
||||
|
||||
reffail = _jit.x.pc;
|
||||
reffail = jit_get_ip();
|
||||
if (int_ready) {
|
||||
jit_fixnum_l(JIT_R1, JIT_R1);
|
||||
}
|
||||
|
@ -3024,7 +3024,7 @@ int scheme_generate_inlined_binary(mz_jit_state *jitter, Scheme_App3_Rec *app, i
|
|||
|
||||
offset = SCHEME_INT_VAL(app->rand2);
|
||||
if (!unsafe || can_chaperone)
|
||||
(void)jit_movi_p(JIT_R1, offset);
|
||||
(void)jit_movi_l(JIT_R1, offset);
|
||||
if (!which)
|
||||
offset = base_offset + WORDS_TO_BYTES(offset);
|
||||
else if (which == 3)
|
||||
|
@ -3208,7 +3208,7 @@ int scheme_generate_inlined_binary(mz_jit_state *jitter, Scheme_App3_Rec *app, i
|
|||
|
||||
__START_TINY_JUMPS__(1);
|
||||
ref = jit_bmci_ul(jit_forward(), JIT_R0, 0x1);
|
||||
reffail = _jit.x.pc;
|
||||
reffail = jit_get_ip();
|
||||
__END_TINY_JUMPS__(1);
|
||||
if (set_mcar)
|
||||
(void)jit_calli(sjc.bad_set_mcar_code);
|
||||
|
@ -3268,7 +3268,7 @@ int scheme_generate_inlined_binary(mz_jit_state *jitter, Scheme_App3_Rec *app, i
|
|||
ref = mz_beqi_t(jit_forward(), JIT_R0, scheme_box_type, JIT_R2);
|
||||
if (ref3)
|
||||
mz_patch_branch(ref3);
|
||||
reffail = _jit.x.pc;
|
||||
reffail = jit_get_ip();
|
||||
(void)jit_calli(sjc.set_box_code);
|
||||
ref2 = jit_jmpi(jit_forward());
|
||||
mz_patch_branch(ref);
|
||||
|
@ -3395,7 +3395,7 @@ int scheme_generate_inlined_binary(mz_jit_state *jitter, Scheme_App3_Rec *app, i
|
|||
jit_ldxi_s(JIT_R2, JIT_R0, &((Scheme_Object *)0x0)->type);
|
||||
ref2 = jit_bgei_i(jit_forward(), JIT_R2, scheme_bignum_type);
|
||||
/* (slow path) */
|
||||
refslow = _jit.x.pc;
|
||||
refslow = jit_get_ip();
|
||||
(void)jit_calli(sjc.make_rectangular_code);
|
||||
jit_retval(dest);
|
||||
CHECK_LIMIT();
|
||||
|
@ -3446,7 +3446,7 @@ int scheme_generate_inlined_binary(mz_jit_state *jitter, Scheme_App3_Rec *app, i
|
|||
|
||||
__START_TINY_JUMPS__(1);
|
||||
ref = jit_bmci_ul(jit_forward(), JIT_R0, 0x1);
|
||||
refslow = _jit.x.pc;
|
||||
refslow = jit_get_ip();
|
||||
(void)jit_calli(sjc.bad_make_flrectangular_code);
|
||||
mz_patch_branch(ref);
|
||||
(void)mz_bnei_t(refslow, JIT_R0, scheme_double_type, JIT_R2);
|
||||
|
@ -3604,7 +3604,7 @@ int scheme_generate_inlined_nary(mz_jit_state *jitter, Scheme_App_Rec *app, int
|
|||
__START_TINY_JUMPS__(1);
|
||||
/* Fail if this isn't a pointer (0x1 is the integer tag) */
|
||||
ref = jit_bmci_ul(jit_forward(), JIT_R1, 0x1);
|
||||
reffail = _jit.x.pc;
|
||||
reffail = jit_get_ip();
|
||||
__END_TINY_JUMPS__(1);
|
||||
|
||||
(void)jit_calli(sjc.box_cas_fail_code);
|
||||
|
@ -3643,7 +3643,7 @@ int scheme_generate_inlined_nary(mz_jit_state *jitter, Scheme_App_Rec *app, int
|
|||
#ifdef MZ_USE_FUTURES
|
||||
if (scheme_is_multithreaded(0)) {
|
||||
jit_lock_cmpxchgr_l(JIT_R1, JIT_V1); /* implicitly uses JIT_R0 */
|
||||
reffalse = (JNEm(jit_forward(), 0,0,0), _jit.x.pc);
|
||||
reffalse = (JNEm(jit_forward(), 0,0,0), jit_get_ip());
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
|
@ -3941,7 +3941,7 @@ int scheme_generate_inlined_nary(mz_jit_state *jitter, Scheme_App_Rec *app, int
|
|||
} else {
|
||||
intptr_t offset;
|
||||
offset = SCHEME_INT_VAL(app->args[2]);
|
||||
(void)jit_movi_p(JIT_R1, offset);
|
||||
(void)jit_movi_l(JIT_R1, offset);
|
||||
if (!which)
|
||||
offset = base_offset + WORDS_TO_BYTES(offset);
|
||||
else if (which == 3)
|
||||
|
|
|
@ -58,6 +58,7 @@ void scheme_register_stack_cache_stack(void)
|
|||
typedef void *(*Get_Stack_Proc)();
|
||||
|
||||
#ifdef MZ_USE_JIT_PPC
|
||||
# define NEXT_FRAME_OFFSET 0
|
||||
# ifdef _CALL_DARWIN
|
||||
# define RETURN_ADDRESS_OFFSET 2
|
||||
# else
|
||||
|
@ -65,8 +66,13 @@ typedef void *(*Get_Stack_Proc)();
|
|||
# endif
|
||||
#endif
|
||||
#ifdef MZ_USE_JIT_I386
|
||||
# define NEXT_FRAME_OFFSET 0
|
||||
# define RETURN_ADDRESS_OFFSET 1
|
||||
#endif
|
||||
#ifdef MZ_USE_JIT_ARM
|
||||
# define NEXT_FRAME_OFFSET JIT_NEXT_FP_OFFSET
|
||||
# define RETURN_ADDRESS_OFFSET (JIT_NEXT_FP_OFFSET+1)
|
||||
#endif
|
||||
|
||||
#define CACHE_STACK_MIN_TRIGGER 128
|
||||
|
||||
|
@ -109,7 +115,7 @@ static void check_stack(void)
|
|||
}
|
||||
}
|
||||
|
||||
q = *(void **)p;
|
||||
q = ((void **)p)[NEXT_FRAME_OFFSET];
|
||||
if (STK_COMP((uintptr_t)q, (uintptr_t)p))
|
||||
break;
|
||||
p = q;
|
||||
|
@ -330,23 +336,31 @@ Scheme_Object *scheme_native_stack_trace(void)
|
|||
|
||||
name = find_symbol((uintptr_t)q);
|
||||
#ifdef MZ_USE_DWARF_LIBUNWIND
|
||||
if (name) manual_unw = 1;
|
||||
if (name && !manual_unw) {
|
||||
manual_unw = 1;
|
||||
# ifdef MZ_USE_JIT_ARM
|
||||
use_unw = 0;
|
||||
p = (void *)unw_get_frame_pointer(&c);
|
||||
if (!(STK_COMP((uintptr_t)p, stack_end)
|
||||
&& STK_COMP(stack_start, (uintptr_t)p)))
|
||||
break;
|
||||
# endif
|
||||
}
|
||||
#endif
|
||||
|
||||
if (SCHEME_FALSEP(name) || SCHEME_VOIDP(name)) {
|
||||
/* Code uses special calling convention */
|
||||
#ifdef MZ_USE_JIT_PPC
|
||||
#if defined(MZ_USE_JIT_PPC) || defined(MZ_USE_JIT_ARM)
|
||||
/* JIT_LOCAL2 has the next return address */
|
||||
q = ((void **)p)[JIT_LOCAL2 >> JIT_LOG_WORD_SIZE];
|
||||
#endif
|
||||
#ifdef MZ_USE_JIT_I386
|
||||
|
||||
# ifdef MZ_USE_DWARF_LIBUNWIND
|
||||
if (use_unw) {
|
||||
q = (void *)unw_get_frame_pointer(&c);
|
||||
} else
|
||||
# endif
|
||||
q = *(void **)p;
|
||||
q = ((void **)p)[NEXT_FRAME_OFFSET];
|
||||
|
||||
/* q is now the frame pointer for the former q,
|
||||
so we can find the actual q */
|
||||
|
@ -368,7 +382,7 @@ Scheme_Object *scheme_native_stack_trace(void)
|
|||
} else if (SCHEME_EOFP(name)) {
|
||||
/* Stub (to mark start of running a module body, for example) */
|
||||
/* JIT_LOCAL2 has the name to use */
|
||||
#ifdef MZ_USE_JIT_PPC
|
||||
#if defined(MZ_USE_JIT_PPC) || defined(MZ_USE_JIT_ARM)
|
||||
name = *(Scheme_Object **)((void **)p)[JIT_LOCAL2 >> JIT_LOG_WORD_SIZE];
|
||||
#endif
|
||||
#ifdef MZ_USE_JIT_I386
|
||||
|
@ -450,7 +464,7 @@ Scheme_Object *scheme_native_stack_trace(void)
|
|||
#endif
|
||||
|
||||
if (!use_unw) {
|
||||
q = *(void **)p;
|
||||
q = ((void **)p)[NEXT_FRAME_OFFSET];
|
||||
if (STK_COMP((uintptr_t)q, (uintptr_t)p))
|
||||
break;
|
||||
p = q;
|
||||
|
|
|
@ -49,7 +49,7 @@ static volatile uintptr_t code_low, code_high;
|
|||
|
||||
static void *get_end_pointer(mz_jit_state *jitter)
|
||||
{
|
||||
return jit_get_ip().ptr;
|
||||
return jit_unadjust_ip(jit_get_ip());
|
||||
}
|
||||
|
||||
int scheme_mz_retain_it(mz_jit_state *jitter, void *v)
|
||||
|
@ -204,6 +204,10 @@ void *scheme_generate_one(mz_jit_state *old_jitter,
|
|||
#endif
|
||||
}
|
||||
|
||||
#ifdef MZ_USE_JIT_ARM
|
||||
jit_get_cpu();
|
||||
#endif
|
||||
|
||||
while (1) {
|
||||
memset(jitter, 0, sizeof(_jitter));
|
||||
#ifdef SET_DEFAULT_LONG_JUMPS
|
||||
|
@ -282,7 +286,7 @@ void *scheme_generate_one(mz_jit_state *old_jitter,
|
|||
}
|
||||
#endif
|
||||
|
||||
(void)jit_set_ip(buffer).ptr;
|
||||
(void)jit_set_ip(buffer);
|
||||
jitter->limit = (char *)buffer + size_pre_retained_double - padding;
|
||||
if (known_size) {
|
||||
jitter->retain_double_start = (double *)jitter->limit;
|
||||
|
@ -348,7 +352,7 @@ void *scheme_generate_one(mz_jit_state *old_jitter,
|
|||
if (PAST_LIMIT() || (jitter->retain_start
|
||||
&& (jitter->retained > num_retained))) {
|
||||
scheme_console_printf("JIT buffer overflow: %p [%p,%p] (%d)!!\n",
|
||||
jit_get_ip().ptr,
|
||||
jit_get_ip(),
|
||||
buffer, jitter->limit,
|
||||
!!jitter->retain_start);
|
||||
abort();
|
||||
|
@ -366,11 +370,11 @@ void *scheme_generate_one(mz_jit_state *old_jitter,
|
|||
scheme_signal_error("internal error: ended with unbox_extflonum");
|
||||
if (known_size) {
|
||||
/* That was in the permanent area, so return: */
|
||||
jit_flush_code(buffer, jit_get_ip().ptr);
|
||||
jit_flush_code(buffer, jit_get_raw_ip());
|
||||
return buffer;
|
||||
} else {
|
||||
/* Allocate permanent area and jit again: */
|
||||
known_size = ((uintptr_t)jit_get_ip().ptr) - (uintptr_t)buffer;
|
||||
known_size = ((uintptr_t)jit_get_raw_ip()) - (uintptr_t)buffer;
|
||||
/* Make sure room for pointers is aligned: */
|
||||
if (known_size & (JIT_WORD_SIZE - 1)) {
|
||||
known_size += (JIT_WORD_SIZE - (known_size & (JIT_WORD_SIZE - 1)));
|
||||
|
|
269
src/racket/src/lightning/arm/asm-common.h
Normal file
269
src/racket/src/lightning/arm/asm-common.h
Normal file
|
@ -0,0 +1,269 @@
|
|||
/******************************** -*- C -*- ****************************
|
||||
*
|
||||
* Dynamic assembler support
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Copyright 2000, 2001, 2002 Free Software Foundation, Inc.
|
||||
* Written by Paolo Bonzini.
|
||||
*
|
||||
* This file is part of GNU lightning.
|
||||
*
|
||||
* GNU lightning is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 3, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* GNU lightning is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with GNU lightning; see the file COPYING.LESSER; if not, write to the
|
||||
* Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301, USA.
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
#ifndef __lightning_asm_common_h
|
||||
#define __lightning_asm_common_h_
|
||||
|
||||
#if 1
|
||||
# include <assert.h>
|
||||
# define jit_assert(x) assert(x)
|
||||
#else
|
||||
# define jit_assert(x) /* empty */
|
||||
#endif
|
||||
|
||||
#define __WORDSIZE 32
|
||||
|
||||
#define __jit_constructor /* empty */
|
||||
#define __jit_inline XFORM_NONGCING MZ_INLINE static
|
||||
|
||||
typedef unsigned int _ui;
|
||||
|
||||
typedef signed char _sc;
|
||||
typedef unsigned char _uc, jit_insn;
|
||||
typedef unsigned short _us;
|
||||
typedef unsigned int _ui;
|
||||
typedef long _sl;
|
||||
typedef unsigned long _ul;
|
||||
typedef struct jit_local_state jit_local_state;
|
||||
|
||||
typedef struct jit_state jit_state;
|
||||
|
||||
struct jit_local_state {
|
||||
int long_jumps;
|
||||
int nextarg_get;
|
||||
int nextarg_put;
|
||||
int nextarg_getf;
|
||||
jit_insn *thumb;
|
||||
};
|
||||
|
||||
struct {
|
||||
_ui version : 4;
|
||||
_ui extend : 1;
|
||||
/* only generate thumb instructions for thumb2 */
|
||||
_ui thumb : 1;
|
||||
_ui vfp : 3;
|
||||
_ui neon : 1;
|
||||
_ui abi : 2;
|
||||
} jit_cpu;
|
||||
struct {
|
||||
/* prevent using thumb instructions that set flags? */
|
||||
_ui no_set_flags : 1;
|
||||
} jit_flags;
|
||||
|
||||
typedef struct jit_state {
|
||||
union {
|
||||
jit_insn *pc;
|
||||
_uc *uc_pc;
|
||||
_us *us_pc;
|
||||
_ui *ui_pc;
|
||||
_ul *ul_pc;
|
||||
} x;
|
||||
struct jit_fp *fp;
|
||||
jit_local_state jitl;
|
||||
} jit_state_t[1];
|
||||
|
||||
#ifndef _ASM_SAFETY
|
||||
#define JITFAIL(MSG) 0
|
||||
#else
|
||||
#if (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L) || (defined __GNUC__ && (__GNUC__ == 3 ? __GNUC_MINOR__ >= 2 : __GNUC__ > 3))
|
||||
#define JITFAIL(MSG) jit_fail(MSG, __FILE__, __LINE__, __func__)
|
||||
#elif defined __GNUC__
|
||||
#define JITFAIL(MSG) jit_fail(MSG, __FILE__, __LINE__, __FUNCTION__)
|
||||
#else
|
||||
#define JITFAIL(MSG) jit_fail(MSG, __FILE__, __LINE__, "(unknown)")
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if (defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L) || (defined __GNUC__ && (__GNUC__ == 3 ? __GNUC_MINOR__ >= 2 : __GNUC__ > 3))
|
||||
#define JITSORRY(MSG) jit_fail("sorry, unimplemented: " MSG, __FILE__, __LINE__, __func__)
|
||||
#elif defined __GNUC__
|
||||
#define JITSORRY(MSG) jit_fail("sorry, unimplemented: " MSG, __FILE__, __LINE__, __FUNCTION__)
|
||||
#else
|
||||
#define JITSORRY(MSG) jit_fail("sorry, unimplemented: " MSG, __FILE__, __LINE__, "(unknown)")
|
||||
#endif
|
||||
|
||||
#ifdef __GNUC__
|
||||
#define JIT_UNUSED __attribute__((__unused__))
|
||||
#else
|
||||
#define JIT_UNUSED
|
||||
#endif
|
||||
|
||||
static int jit_fail(const char *, const char*, int, const char *) JIT_UNUSED;
|
||||
|
||||
|
||||
/* NextStep 2.0 cc is really gcc 1.93 but it defines __GNUC__ = 2 and
|
||||
does not implement __extension__. But that compiler doesn't define
|
||||
__GNUC_MINOR__. */
|
||||
#ifdef __GNUC__
|
||||
#if __GNUC__ < 2 || (defined(__NeXT__) && !__GNUC_MINOR__)
|
||||
#define __extension__
|
||||
#endif
|
||||
|
||||
#define _TEMPD(type, var)
|
||||
|
||||
#define _TEMP(type, var, val, body) __extension__ ({ \
|
||||
register struct { type var } _jitl; _jitl.var = val; \
|
||||
body; \
|
||||
})
|
||||
|
||||
#else
|
||||
|
||||
/* Between loading a global and calling a subroutine, we choose the lesser
|
||||
* evil. */
|
||||
#define _TEMPD(type, var) static type var;
|
||||
#define _TEMP(type, var, val, body) ((var = val), body)
|
||||
|
||||
#endif
|
||||
|
||||
#define _jit_UC(X) ((_uc )(X))
|
||||
#define _jit_US(X) ((_us )(X))
|
||||
#define _jit_UI(X) ((_ui )(X))
|
||||
#define _jit_SI(X) ((int )(X))
|
||||
#define _jit_SL(X) ((_sl )(X))
|
||||
#define _jit_UL(X) ((_ul )(X))
|
||||
# define _PUC(X) ((_uc *)(X))
|
||||
# define _PUS(X) ((_us *)(X))
|
||||
# define _PUI(X) ((_ui *)(X))
|
||||
# define _PSI(X) ((int *)(X))
|
||||
# define _PSL(X) ((_sl *)(X))
|
||||
# define _PUL(X) ((_ul *)(X))
|
||||
|
||||
#define _jit_B(B) _jit_UL(((*_jitp->x.uc_pc++)= _jit_UC((B)& 0xff)))
|
||||
#define _jit_W(W) _jit_UL(((*_jitp->x.us_pc++)= _jit_US((W)&0xffff)))
|
||||
#define _jit_I(I) _jit_UL(((*_jitp->x.ui_pc++)= _jit_UI((I) )))
|
||||
#define _jit_L(L) _jit_UL(((*_jitp->x.ul_pc++)= _jit_UL((L) )))
|
||||
#define _jit_I_noinc(I) _jit_UL(((*_jitp->x.ui_pc)= _jit_UI((I) )))
|
||||
|
||||
#define _MASK(N) ((unsigned long)((1L<<(N)))-1L)
|
||||
#define _siP(N,I) (!((((unsigned long)(I))^(((unsigned long)(I))<<1))&~_MASK(N)))
|
||||
#define _uiP(N,I) (!(((unsigned long)(I))&~_MASK(N)))
|
||||
#define _suiP(N,I) (_siP(N,I) | _uiP(N,I))
|
||||
|
||||
#ifndef _ASM_SAFETY
|
||||
#define _ck_s(W,I) (_jit_UL(I) & _MASK(W))
|
||||
#define _ck_u(W,I) (_jit_UL(I) & _MASK(W))
|
||||
#define _ck_su(W,I) (_jit_UL(I) & _MASK(W))
|
||||
#define _ck_d(W,I) (_jit_UL(I) & _MASK(W))
|
||||
#else
|
||||
#define _ck_s(W,I) (_siP(W,I) ? (_jit_UL(I) & _MASK(W)) : JITFAIL( "signed integer `"#I"' too large for "#W"-bit field"))
|
||||
#define _ck_u(W,I) (_uiP(W,I) ? (_jit_UL(I) & _MASK(W)) : JITFAIL("unsigned integer `"#I"' too large for "#W"-bit field"))
|
||||
#define _ck_su(W,I) (_suiP(W,I) ? (_jit_UL(I) & _MASK(W)) : JITFAIL( "integer `"#I"' too large for "#W"-bit field"))
|
||||
#define _ck_d(W,I) (_siP(W,I) ? (_jit_UL(I) & _MASK(W)) : JITFAIL( "displacement `"#I"' too large for "#W"-bit field"))
|
||||
#endif
|
||||
|
||||
#define _s0P(I) ((I)==0)
|
||||
#define _s8P(I) _siP(8,I)
|
||||
#define _s16P(I) _siP(16,I)
|
||||
#define _s20P(I) _siP(20,I)
|
||||
#define _s24P(I) _siP(24,I)
|
||||
#define _s32P(I) _siP(32,I)
|
||||
#define _u8P(I) _uiP(8,I)
|
||||
#define _u16P(I) _uiP(16,I)
|
||||
#define _u32P(I) _uiP(32,I)
|
||||
|
||||
#define _su8(I) _ck_su(8,I)
|
||||
#define _su16(I) _ck_su(16,I)
|
||||
|
||||
#define _s1(I) _ck_s( 1,I)
|
||||
#define _s2(I) _ck_s( 2,I)
|
||||
#define _s3(I) _ck_s( 3,I)
|
||||
#define _s4(I) _ck_s( 4,I)
|
||||
#define _s5(I) _ck_s( 5,I)
|
||||
#define _s6(I) _ck_s( 6,I)
|
||||
#define _s7(I) _ck_s( 7,I)
|
||||
#define _s8(I) _ck_s( 8,I)
|
||||
#define _s9(I) _ck_s( 9,I)
|
||||
#define _s10(I) _ck_s(10,I)
|
||||
#define _s11(I) _ck_s(11,I)
|
||||
#define _s12(I) _ck_s(12,I)
|
||||
#define _s13(I) _ck_s(13,I)
|
||||
#define _s14(I) _ck_s(14,I)
|
||||
#define _s15(I) _ck_s(15,I)
|
||||
#define _s16(I) _ck_s(16,I)
|
||||
#define _s17(I) _ck_s(17,I)
|
||||
#define _s18(I) _ck_s(18,I)
|
||||
#define _s19(I) _ck_s(19,I)
|
||||
#define _s20(I) _ck_s(20,I)
|
||||
#define _s21(I) _ck_s(21,I)
|
||||
#define _s22(I) _ck_s(22,I)
|
||||
#define _s23(I) _ck_s(23,I)
|
||||
#define _s24(I) _ck_s(24,I)
|
||||
#define _s25(I) _ck_s(25,I)
|
||||
#define _s26(I) _ck_s(26,I)
|
||||
#define _s27(I) _ck_s(27,I)
|
||||
#define _s28(I) _ck_s(28,I)
|
||||
#define _s29(I) _ck_s(29,I)
|
||||
#define _s30(I) _ck_s(30,I)
|
||||
#define _s31(I) _ck_s(31,I)
|
||||
#if __WORDSIZE == 32
|
||||
# define _s32(I) (I)
|
||||
#else
|
||||
# define _s32(I) _ck_s(32,I)
|
||||
#endif
|
||||
#define _u1(I) _ck_u( 1,I)
|
||||
#define _u2(I) _ck_u( 2,I)
|
||||
#define _u3(I) _ck_u( 3,I)
|
||||
#define _u4(I) _ck_u( 4,I)
|
||||
#define _u5(I) _ck_u( 5,I)
|
||||
#define _u6(I) _ck_u( 6,I)
|
||||
#define _u7(I) _ck_u( 7,I)
|
||||
#define _u8(I) _ck_u( 8,I)
|
||||
#define _u9(I) _ck_u( 9,I)
|
||||
#define _u10(I) _ck_u(10,I)
|
||||
#define _u11(I) _ck_u(11,I)
|
||||
#define _u12(I) _ck_u(12,I)
|
||||
#define _u13(I) _ck_u(13,I)
|
||||
#define _u14(I) _ck_u(14,I)
|
||||
#define _u15(I) _ck_u(15,I)
|
||||
#define _u16(I) _ck_u(16,I)
|
||||
#define _u17(I) _ck_u(17,I)
|
||||
#define _u18(I) _ck_u(18,I)
|
||||
#define _u19(I) _ck_u(19,I)
|
||||
#define _u20(I) _ck_u(20,I)
|
||||
#define _u21(I) _ck_u(21,I)
|
||||
#define _u22(I) _ck_u(22,I)
|
||||
#define _u23(I) _ck_u(23,I)
|
||||
#define _u24(I) _ck_u(24,I)
|
||||
#define _u25(I) _ck_u(25,I)
|
||||
#define _u26(I) _ck_u(26,I)
|
||||
#define _u27(I) _ck_u(27,I)
|
||||
#define _u28(I) _ck_u(28,I)
|
||||
#define _u29(I) _ck_u(29,I)
|
||||
#define _u30(I) _ck_u(30,I)
|
||||
#define _u31(I) _ck_u(31,I)
|
||||
#if __WORDSIZE == 32
|
||||
# define _u32(I) (I)
|
||||
#else
|
||||
# define _u32(I) _ck_u(32,I)
|
||||
#endif
|
||||
|
||||
#endif /* __lightning_asm_common_h */
|
2220
src/racket/src/lightning/arm/asm.h
Normal file
2220
src/racket/src/lightning/arm/asm.h
Normal file
File diff suppressed because it is too large
Load Diff
695
src/racket/src/lightning/arm/core-common.h
Normal file
695
src/racket/src/lightning/arm/core-common.h
Normal file
|
@ -0,0 +1,695 @@
|
|||
/******************************** -*- C -*- ****************************
|
||||
*
|
||||
* Platform-independent layer support
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Copyright 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
|
||||
* Written by Paolo Bonzini.
|
||||
*
|
||||
* This file is part of GNU lightning.
|
||||
*
|
||||
* GNU lightning is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 3, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* GNU lightning is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with GNU lightning; see the file COPYING.LESSER; if not, write to the
|
||||
* Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301, USA.
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
#ifndef __lightning_core_common_h
|
||||
#define __lightning_core_common_h_
|
||||
|
||||
#define JIT_NOREG (-1)
|
||||
|
||||
#define jit_get_raw_ip() _jitp->x.pc
|
||||
#define jit_get_ip() jit_adjust_ip(_jitp->x.pc)
|
||||
#define jit_set_ip(ptr) (_jitp->x.pc = (ptr), jit_get_ip ())
|
||||
#define jit_get_label() jit_get_ip()
|
||||
#define jit_forward() jit_get_ip()
|
||||
|
||||
#define jit_adjust_ip(x) ((jit_insn *)(((char *)(x)) + jit_cpu.thumb))
|
||||
#define jit_unadjust_ip(x) ((jit_insn *)(((char *)(x)) - jit_cpu.thumb))
|
||||
|
||||
#define jit_field(struc, f) ( ((long) (&((struc *) 8)->f) ) - 8)
|
||||
#define jit_ptr_field(struc_p, f) ( ((long) (&((struc_p) 8)->f) ) - 8)
|
||||
|
||||
/* realignment via N-byte no-ops */
|
||||
|
||||
#ifndef jit_align
|
||||
#define jit_align(n)
|
||||
#endif
|
||||
|
||||
/* jit_code: union of many possible function pointer types. Returned
|
||||
* by jit_get_ip().
|
||||
*/
|
||||
typedef union jit_code {
|
||||
char *ptr;
|
||||
void (*vptr)(void);
|
||||
char (*cptr)(void);
|
||||
unsigned char (*ucptr)(void);
|
||||
short (*sptr)(void);
|
||||
unsigned short (*usptr)(void);
|
||||
int (*iptr)(void);
|
||||
unsigned int (*uiptr)(void);
|
||||
long (*lptr)(void);
|
||||
unsigned long (*ulptr)(void);
|
||||
void * (*pptr)(void);
|
||||
float (*fptr)(void);
|
||||
double (*dptr)(void);
|
||||
} jit_code;
|
||||
|
||||
#ifndef jit_fill_delay_after
|
||||
#define jit_fill_delay_after(branch) (branch)
|
||||
#endif
|
||||
|
||||
#define jit_delay(insn, branch) ((insn), jit_fill_delay_after(branch))
|
||||
|
||||
|
||||
/* ALU synonyms */
|
||||
#if !defined(jit_addci_ui)
|
||||
# if !defined(jit_addci_i)
|
||||
/* need add/sub that sets carry for all operands */
|
||||
# if _ASM_SAFETY
|
||||
# warning Assuming jit_{add,sub}{r,i}_{i,ui} always sets carry
|
||||
# endif
|
||||
# define jit_addci_ui(d, rs, is) jit_addi_ui((d), (rs), (is))
|
||||
# define jit_addcr_ui(d, s1, s2) jit_addr_ui((d), (s1), (s2))
|
||||
# define jit_subci_ui(d, rs, is) jit_subi_ui((d), (rs), (is))
|
||||
# define jit_subcr_ui(d, s1, s2) jit_subr_ui((d), (s1), (s2))
|
||||
# elif defined(jit_addci_i)
|
||||
/* allow logically reversed definitions */
|
||||
# define jit_addci_ui(d, rs, is) jit_addci_i((d), (rs), (is))
|
||||
# define jit_addcr_ui(d, s1, s2) jit_addcr_i((d), (s1), (s2))
|
||||
# define jit_subci_ui(d, rs, is) jit_subci_i((d), (rs), (is))
|
||||
# define jit_subcr_ui(d, s1, s2) jit_subcr_i((d), (s1), (s2))
|
||||
# endif
|
||||
#endif
|
||||
#if !defined(jit_addci_i) && defined(jit_addci_ui)
|
||||
/* provide compatibility logically wrong definitions */
|
||||
# define jit_addci_i(d, rs, is) jit_addci_ui((d), (rs), (is))
|
||||
# define jit_addcr_i(d, s1, s2) jit_addcr_ui((d), (s1), (s2))
|
||||
# define jit_subci_i(d, rs, is) jit_subci_ui((d), (rs), (is))
|
||||
# define jit_subcr_i(d, s1, s2) jit_subcr_ui((d), (s1), (s2))
|
||||
#endif
|
||||
#if !defined(jit_addxi_ui) && defined(jit_addxi_i)
|
||||
/* allow logically reversed definitions */
|
||||
# define jit_addxi_ui(d, rs, is) jit_addxi_i((d), (rs), (is))
|
||||
# define jit_addxr_ui(d, s1, s2) jit_addxr_i((d), (s1), (s2))
|
||||
# define jit_subxi_ui(d, rs, is) jit_subxi_i((d), (rs), (is))
|
||||
# define jit_subxr_ui(d, s1, s2) jit_subxr_i((d), (s1), (s2))
|
||||
#endif
|
||||
#if !defined(jit_addxi_i) && defined(jit_addxi_ui)
|
||||
/* provide compatibility logically wrong definitions */
|
||||
# define jit_addxi_i(d, rs, is) jit_addxi_ui((d), (rs), (is))
|
||||
# define jit_addxr_i(d, s1, s2) jit_addxr_ui((d), (s1), (s2))
|
||||
# define jit_subxi_i(d, rs, is) jit_subxi_ui((d), (rs), (is))
|
||||
# define jit_subxr_i(d, s1, s2) jit_subxr_ui((d), (s1), (s2))
|
||||
#endif
|
||||
|
||||
#define jit_addi_ui(d, rs, is) jit_addi_i((d), (rs), (is))
|
||||
#define jit_addr_ui(d, s1, s2) jit_addr_i((d), (s1), (s2))
|
||||
#define jit_andi_ui(d, rs, is) jit_andi_i((d), (rs), (is))
|
||||
#define jit_andr_ui(d, s1, s2) jit_andr_i((d), (s1), (s2))
|
||||
#define jit_lshi_ui(d, rs, is) jit_lshi_i((d), (rs), (is))
|
||||
#define jit_lshr_ui(d, s1, s2) jit_lshr_i((d), (s1), (s2))
|
||||
#ifndef jit_movi_ui
|
||||
# define jit_movi_ui(d, rs) jit_movi_i((d), (rs))
|
||||
#endif
|
||||
#define jit_movr_ui(d, rs) jit_movr_i((d), (rs))
|
||||
#define jit_ori_ui(d, rs, is) jit_ori_i((d), (rs), (is))
|
||||
#define jit_orr_ui(d, s1, s2) jit_orr_i((d), (s1), (s2))
|
||||
#define jit_rsbi_ui(d, rs, is) jit_rsbi_i((d), (rs), (is))
|
||||
#define jit_rsbr_ui(d, s1, s2) jit_rsbr_i((d), (s1), (s2))
|
||||
#define jit_subi_ui(d, rs, is) jit_subi_i((d), (rs), (is))
|
||||
#define jit_subr_ui(d, s1, s2) jit_subr_i((d), (s1), (s2))
|
||||
#define jit_xori_ui(d, rs, is) jit_xori_i((d), (rs), (is))
|
||||
#define jit_xorr_ui(d, s1, s2) jit_xorr_i((d), (s1), (s2))
|
||||
|
||||
#if __WORDSIZE == 32
|
||||
/* common definitions when sizeof(long) == sizeof(int) */
|
||||
# if !defined(jit_addci_ul) && defined(jit_addci_ui)
|
||||
# define jit_addci_ul(d, rs, is) jit_addci_ui((d), (rs), (is))
|
||||
# define jit_addcr_ul(d, s1, s2) jit_addcr_ui((d), (s1), (s2))
|
||||
# define jit_subci_ul(d, rs, is) jit_subci_ui((d), (rs), (is))
|
||||
# define jit_subcr_ul(d, s1, s2) jit_subcr_ui((d), (s1), (s2))
|
||||
# endif
|
||||
# if !defined(jit_addxi_ul) && defined(jit_addxi_ui)
|
||||
# define jit_addxi_ul(d, rs, is) jit_addxi_ui((d), (rs), (is))
|
||||
# define jit_addxr_ul(d, s1, s2) jit_addxr_ui((d), (s1), (s2))
|
||||
# define jit_subxi_ul(d, rs, is) jit_subxi_ui((d), (rs), (is))
|
||||
# define jit_subxr_ul(d, s1, s2) jit_subxr_ui((d), (s1), (s2))
|
||||
# endif
|
||||
#endif
|
||||
#if !defined(jit_addci_ul)
|
||||
# if !defined(jit_addci_l)
|
||||
/* need add/sub that sets carry for all operands */
|
||||
# if _ASM_SAFETY
|
||||
# warning Assuming jit_{add,sub}{r,i}_{l,ul} always sets carry
|
||||
# endif
|
||||
# define jit_addci_ul(d, rs, is) jit_addi_ul((d), (rs), (is))
|
||||
# define jit_addcr_ul(d, s1, s2) jit_addr_ul((d), (s1), (s2))
|
||||
# define jit_subci_ul(d, rs, is) jit_subi_ul((d), (rs), (is))
|
||||
# define jit_subcr_ul(d, s1, s2) jit_subr_ul((d), (s1), (s2))
|
||||
# elif defined(jit_addci_l)
|
||||
/* allow logically reversed definitions */
|
||||
# define jit_addci_ul(d, rs, is) jit_addci_l((d), (rs), (is))
|
||||
# define jit_addcr_ul(d, s1, s2) jit_addcr_l((d), (s1), (s2))
|
||||
# define jit_subci_ul(d, rs, is) jit_subci_l((d), (rs), (is))
|
||||
# define jit_subcr_ul(d, s1, s2) jit_subcr_l((d), (s1), (s2))
|
||||
# endif
|
||||
#endif
|
||||
#if !defined(jit_addci_l) && defined(jit_addci_ul)
|
||||
/* provide compatibility logically wrong definitions */
|
||||
# define jit_addci_l(d, rs, is) jit_addci_ul((d), (rs), (is))
|
||||
# define jit_addcr_l(d, s1, s2) jit_addcr_ul((d), (s1), (s2))
|
||||
# define jit_subci_l(d, rs, is) jit_subci_ul((d), (rs), (is))
|
||||
# define jit_subcr_l(d, s1, s2) jit_subcr_ul((d), (s1), (s2))
|
||||
#endif
|
||||
#if !defined(jit_addxi_ul) && defined(jit_addxi_l)
|
||||
/* allow logically reversed definitions */
|
||||
# define jit_addxi_ul(d, rs, is) jit_addxi_l((d), (rs), (is))
|
||||
# define jit_addxr_ul(d, s1, s2) jit_addxr_l((d), (s1), (s2))
|
||||
# define jit_subxi_ul(d, rs, is) jit_subxi_l((d), (rs), (is))
|
||||
# define jit_subxr_ul(d, s1, s2) jit_subxr_l((d), (s1), (s2))
|
||||
#endif
|
||||
#if !defined(jit_addxi_l) && defined(jit_addxi_ul)
|
||||
/* provide compatibility logically wrong definitions */
|
||||
# define jit_addxi_l(d, rs, is) jit_addxi_ul((d), (rs), (is))
|
||||
# define jit_addxr_l(d, s1, s2) jit_addxr_ul((d), (s1), (s2))
|
||||
# define jit_subxi_l(d, rs, is) jit_subxi_ul((d), (rs), (is))
|
||||
# define jit_subxr_l(d, s1, s2) jit_subxr_ul((d), (s1), (s2))
|
||||
#endif
|
||||
#define jit_addi_ul(d, rs, is) jit_addi_l((d), (rs), (is))
|
||||
#define jit_addr_ul(d, s1, s2) jit_addr_l((d), (s1), (s2))
|
||||
#define jit_andi_ul(d, rs, is) jit_andi_l((d), (rs), (is))
|
||||
#define jit_andr_ul(d, s1, s2) jit_andr_l((d), (s1), (s2))
|
||||
#define jit_lshi_ul(d, rs, is) jit_lshi_l((d), (rs), (is))
|
||||
#define jit_lshr_ul(d, s1, s2) jit_lshr_l((d), (s1), (s2))
|
||||
#ifndef jit_movi_ul
|
||||
# define jit_movi_ul(d, rs) jit_movi_l((d), (rs))
|
||||
#endif
|
||||
#ifndef jit_movr_ul
|
||||
# define jit_movr_ul(d, rs) jit_movr_l((d), (rs))
|
||||
#endif
|
||||
#define jit_ori_ul(d, rs, is) jit_ori_l((d), (rs), (is))
|
||||
#define jit_orr_ul(d, s1, s2) jit_orr_l((d), (s1), (s2))
|
||||
#define jit_rsbi_ul(d, rs, is) jit_rsbi_l((d), (rs), (is))
|
||||
#define jit_rsbr_ul(d, s1, s2) jit_rsbr_l((d), (s1), (s2))
|
||||
#define jit_subi_ul(d, rs, is) jit_subi_l((d), (rs), (is))
|
||||
#define jit_subr_ul(d, s1, s2) jit_subr_l((d), (s1), (s2))
|
||||
#define jit_xori_ul(d, rs, is) jit_xori_l((d), (rs), (is))
|
||||
#define jit_xorr_ul(d, s1, s2) jit_xorr_l((d), (s1), (s2))
|
||||
#define jit_addr_p(d, s1, s2) jit_addr_ul((d), (s1), (s2))
|
||||
#define jit_addi_p(d, rs, is) jit_addi_ul((d), (rs), (long) (is))
|
||||
#ifndef jit_movr_p
|
||||
# define jit_movr_p(d, rs) jit_movr_ul((d), (rs))
|
||||
#endif
|
||||
#define jit_subr_p(d, s1, s2) jit_subr_ul((d), (s1), (s2))
|
||||
#define jit_subi_p(d, rs, is) jit_subi_ul((d), (rs), (long) (is))
|
||||
#define jit_rsbi_p(d, rs, is) jit_rsbi_ul((d), (rs), (long) (is))
|
||||
|
||||
#ifndef jit_movi_p
|
||||
#define jit_movi_p(d, is) (jit_movi_ul((d), (long) (is)), jit_get_ip())
|
||||
#endif
|
||||
|
||||
#define jit_patch(pv) jit_patch_at ((pv), jit_get_ip())
|
||||
|
||||
/* NEG is not mandatory -- pick an appropriate implementation */
|
||||
#ifndef jit_negr_i
|
||||
# ifdef JIT_RZERO
|
||||
# define jit_negr_i(d, rs) jit_subr_i((d), JIT_RZERO, (rs))
|
||||
# if __WORDSIZE == 64
|
||||
# define jit_negr_l(d, rs) jit_subr_l((d), JIT_RZERO, (rs))
|
||||
# endif
|
||||
# else /* !JIT_RZERO */
|
||||
# ifndef jit_rsbi_i
|
||||
# define jit_negr_i(d, rs) (jit_xori_i((d), (rs), -1), jit_addi_l((d), (d), 1))
|
||||
# define jit_negr_l(d, rs) (jit_xori_l((d), (rs), -1), jit_addi_l((d), (d), 1))
|
||||
# else /* jit_rsbi_i */
|
||||
# define jit_negr_i(d, rs) jit_rsbi_i((d), (rs), 0)
|
||||
# define jit_negr_l(d, rs) jit_rsbi_l((d), (rs), 0)
|
||||
# endif /* jit_rsbi_i */
|
||||
# endif /* !JIT_RZERO */
|
||||
#endif /* !jit_negr_i */
|
||||
|
||||
/* Common 'shortcut' implementations */
|
||||
#ifndef jit_subi_i
|
||||
# define jit_subi_i(d, rs, is) jit_addi_i((d), (rs), -(is))
|
||||
#endif
|
||||
#ifndef jit_subi_l
|
||||
# define jit_subi_l(d, rs, is) jit_subi_i((d), (rs), (is))
|
||||
#endif
|
||||
#define jit_rsbr_f(d, s1, s2) jit_subr_f((d), (s2), (s1))
|
||||
#define jit_rsbr_d(d, s1, s2) jit_subr_d((d), (s2), (s1))
|
||||
#ifndef jit_rsbr_i
|
||||
# define jit_rsbr_i(d, s1, s2) jit_subr_i((d), (s2), (s1))
|
||||
#endif
|
||||
#define jit_rsbr_l(d, s1, s2) jit_subr_l((d), (s2), (s1))
|
||||
#define jit_rsbr_p(d, s1, s2) jit_subr_p((d), (s2), (s1))
|
||||
|
||||
/* Unary */
|
||||
#ifndef jit_notr_i
|
||||
# define jit_notr_i(d, rs) jit_xori_i((d), (rs), ~0)
|
||||
#endif
|
||||
#ifndef jit_notr_l
|
||||
# define jit_notr_l(d, rs) jit_xori_l((d), (rs), ~0L)
|
||||
#endif
|
||||
#ifndef jit_notr_c
|
||||
# define jit_notr_c(d, rs) jit_notr_i((d), (rs))
|
||||
# define jit_notr_uc(d, rs) jit_notr_i((d), (rs))
|
||||
# define jit_notr_s(d, rs) jit_notr_i((d), (rs))
|
||||
# define jit_notr_us(d, rs) jit_notr_i((d), (rs))
|
||||
#endif
|
||||
#ifndef jit_notr_ui
|
||||
# define jit_notr_ui(d, rs) jit_notr_i((d), (rs))
|
||||
#endif
|
||||
#ifndef jit_notr_ul
|
||||
# define jit_notr_ul(d, rs) jit_notr_l((d), (rs))
|
||||
#endif
|
||||
|
||||
#ifndef jit_extr_c_ui
|
||||
# define jit_extr_c_ui(d, rs) jit_andi_ui((d), (rs), 0xFF)
|
||||
#endif
|
||||
#ifndef jit_extr_s_ui
|
||||
# define jit_extr_s_ui(d, rs) jit_andi_ui((d), (rs), 0xFFFF)
|
||||
#endif
|
||||
#ifndef jit_extr_c_i
|
||||
# define jit_extr_c_i(d, rs) (jit_lshi_i((d), (rs), 24), jit_rshi_i((d), (d), 24))
|
||||
#endif
|
||||
#ifndef jit_extr_s_i
|
||||
# define jit_extr_s_i(d, rs) (jit_lshi_i((d), (rs), 16), jit_rshi_i((d), (d), 16))
|
||||
#endif
|
||||
|
||||
#if __WORDSIZE == 64
|
||||
# ifndef jit_extr_c_l
|
||||
# define jit_extr_c_l(d, rs) (jit_lshi_l((d), (rs), 56), jit_rshi_l((d), (d), 56))
|
||||
# endif
|
||||
# ifndef jit_extr_s_l
|
||||
# define jit_extr_s_l(d, rs) (jit_lshi_l((d), (rs), 48), jit_rshi_l((d), (d), 48))
|
||||
# endif
|
||||
# ifndef jit_extr_i_l
|
||||
# define jit_extr_i_l(d, rs) (jit_lshi_l((d), (rs), 32), jit_rshi_l((d), (d), 32))
|
||||
# endif
|
||||
# ifndef jit_extr_c_ul
|
||||
# define jit_extr_c_ul(d, rs) jit_andi_l((d), (rs), 0xFF)
|
||||
# endif
|
||||
# ifndef jit_extr_s_ul
|
||||
# define jit_extr_s_ul(d, rs) jit_andi_l((d), (rs), 0xFFFF)
|
||||
# endif
|
||||
# ifndef jit_extr_i_ul
|
||||
# define jit_extr_i_ul(d, rs) jit_andi_l((d), (rs), 0xFFFFFFFFUL)
|
||||
# endif
|
||||
#endif /* __WORDSIZE == 64 */
|
||||
|
||||
#define jit_extr_c_s(d, rs) jit_extr_c_i((d), (rs))
|
||||
#define jit_extr_c_us(d, rs) jit_extr_c_ui((d), (rs))
|
||||
#define jit_extr_uc_s(d, rs) jit_extr_uc_i((d), (rs))
|
||||
#define jit_extr_uc_us(d, rs) jit_extr_uc_ui((d), (rs))
|
||||
#define jit_extr_uc_i(d, rs) jit_extr_c_ui((d), (rs))
|
||||
#define jit_extr_uc_ui(d, rs) jit_extr_c_ui((d), (rs))
|
||||
#define jit_extr_us_i(d, rs) jit_extr_s_ui((d), (rs))
|
||||
#define jit_extr_us_ui(d, rs) jit_extr_s_ui((d), (rs))
|
||||
#define jit_extr_uc_l(d, rs) jit_extr_c_ul((d), (rs))
|
||||
#define jit_extr_uc_ul(d, rs) jit_extr_c_ul((d), (rs))
|
||||
#define jit_extr_us_l(d, rs) jit_extr_s_ul((d), (rs))
|
||||
#define jit_extr_us_ul(d, rs) jit_extr_s_ul((d), (rs))
|
||||
#define jit_extr_ui_l(d, rs) jit_extr_i_ul((d), (rs))
|
||||
#define jit_extr_ui_ul(d, rs) jit_extr_i_ul((d), (rs))
|
||||
|
||||
|
||||
/* NTOH/HTON is not mandatory for big endian architectures */
|
||||
#ifndef jit_ntoh_ui /* big endian */
|
||||
#define jit_ntoh_ui(d, rs) ((d) == (rs) ? (void)0 : jit_movr_i((d), (rs)))
|
||||
#define jit_ntoh_us(d, rs) ((d) == (rs) ? (void)0 : jit_movr_i((d), (rs)))
|
||||
#endif /* big endian */
|
||||
|
||||
/* hton is a synonym for ntoh */
|
||||
#define jit_hton_ui(d, rs) jit_ntoh_ui((d), (rs))
|
||||
#define jit_hton_us(d, rs) jit_ntoh_us((d), (rs))
|
||||
|
||||
/* Stack synonyms */
|
||||
#define jit_pushr_ui(rs) jit_pushr_i(rs)
|
||||
#define jit_popr_ui(rs) jit_popr_i(rs)
|
||||
#define jit_pushr_ul(rs) jit_pushr_l(rs)
|
||||
#define jit_popr_ul(rs) jit_popr_l(rs)
|
||||
#define jit_pushr_p(rs) jit_pushr_ul(rs)
|
||||
#define jit_popr_p(rs) jit_popr_ul(rs)
|
||||
|
||||
#define jit_prepare(nint) jit_prepare_i((nint))
|
||||
#define jit_pusharg_c(rs) jit_pusharg_i(rs)
|
||||
#define jit_pusharg_s(rs) jit_pusharg_i(rs)
|
||||
#define jit_pusharg_uc(rs) jit_pusharg_i(rs)
|
||||
#define jit_pusharg_us(rs) jit_pusharg_i(rs)
|
||||
#define jit_pusharg_ui(rs) jit_pusharg_i(rs)
|
||||
#define jit_pusharg_ul(rs) jit_pusharg_l(rs)
|
||||
#define jit_pusharg_p(rs) jit_pusharg_ul(rs)
|
||||
|
||||
#define jit_normal_pushonlyarg_p(r0) jit_normal_pushonlyarg_i(r0)
|
||||
|
||||
/* Memory synonyms */
|
||||
|
||||
#ifdef JIT_RZERO
|
||||
#ifndef jit_ldi_c
|
||||
#define jit_ldi_c(rd, is) jit_ldxi_c((rd), JIT_RZERO, (is))
|
||||
#define jit_sti_c(id, rs) jit_stxi_c((id), JIT_RZERO, (rs))
|
||||
#define jit_ldi_s(rd, is) jit_ldxi_s((rd), JIT_RZERO, (is))
|
||||
#define jit_sti_s(id, rs) jit_stxi_s((id), JIT_RZERO, (rs))
|
||||
#define jit_ldi_i(rd, is) jit_ldxi_i((rd), JIT_RZERO, (is))
|
||||
#define jit_sti_i(id, rs) jit_stxi_i((id), JIT_RZERO, (rs))
|
||||
#define jit_ldi_l(rd, is) jit_ldxi_l((rd), JIT_RZERO, (is))
|
||||
#define jit_sti_l(id, rs) jit_stxi_l((id), JIT_RZERO, (rs))
|
||||
#define jit_ldi_uc(rd, is) jit_ldxi_uc((rd), JIT_RZERO, (is))
|
||||
#define jit_ldi_us(rd, is) jit_ldxi_us((rd), JIT_RZERO, (is))
|
||||
#define jit_ldi_ui(rd, is) jit_ldxi_ui((rd), JIT_RZERO, (is))
|
||||
# if __WORDSIZE == 64
|
||||
# define jit_ldi_ul(rd, is) jit_ldxi_ul((rd), JIT_RZERO, (is))
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef jit_ldr_c
|
||||
#define jit_ldr_c(rd, rs) jit_ldxr_c((rd), JIT_RZERO, (rs))
|
||||
#define jit_str_c(rd, rs) jit_stxr_c(JIT_RZERO, (rd), (rs))
|
||||
#define jit_ldr_s(rd, rs) jit_ldxr_s((rd), JIT_RZERO, (rs))
|
||||
#define jit_str_s(rd, rs) jit_stxr_s(JIT_RZERO, (rd), (rs))
|
||||
#define jit_ldr_i(rd, rs) jit_ldxr_i((rd), JIT_RZERO, (rs))
|
||||
#define jit_str_i(rd, rs) jit_stxr_i(JIT_RZERO, (rd), (rs))
|
||||
#define jit_ldr_l(rd, rs) jit_ldxr_l((rd), JIT_RZERO, (rs))
|
||||
#define jit_str_l(rd, rs) jit_stxr_l(JIT_RZERO, (rd), (rs))
|
||||
#define jit_ldr_uc(rd, rs) jit_ldxr_uc((rd), JIT_RZERO, (rs))
|
||||
#define jit_ldr_us(rd, rs) jit_ldxr_us((rd), JIT_RZERO, (rs))
|
||||
#define jit_ldr_ui(rd, rs) jit_ldxr_ui((rd), JIT_RZERO, (rs))
|
||||
# if __WORDSIZE == 64
|
||||
# define jit_ldr_ul(rd, rs) jit_ldxr_ul((rd), JIT_RZERO, (rs))
|
||||
# endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define jit_str_uc(rd, rs) jit_str_c((rd), (rs))
|
||||
#define jit_sti_uc(id, rs) jit_sti_c((id), (rs))
|
||||
#define jit_stxr_uc(d1, d2, rs) jit_stxr_c((d1), (d2), (rs))
|
||||
#define jit_stxi_uc(id, rd, is) jit_stxi_c((id), (rd), (is))
|
||||
|
||||
#define jit_str_us(rd, rs) jit_str_s((rd), (rs))
|
||||
#define jit_sti_us(id, rs) jit_sti_s((id), (rs))
|
||||
#define jit_stxr_us(d1, d2, rs) jit_stxr_s((d1), (d2), (rs))
|
||||
#define jit_stxi_us(id, rd, is) jit_stxi_s((id), (rd), (is))
|
||||
|
||||
#define jit_str_ui(rd, rs) jit_str_i((rd), (rs))
|
||||
#define jit_sti_ui(id, rs) jit_sti_i((id), (rs))
|
||||
#define jit_stxr_ui(d1, d2, rs) jit_stxr_i((d1), (d2), (rs))
|
||||
#define jit_stxi_ui(id, rd, is) jit_stxi_i((id), (rd), (is))
|
||||
|
||||
#define jit_str_ul(rd, rs) jit_str_l((rd), (rs))
|
||||
#define jit_sti_ul(id, rs) jit_sti_l((id), (rs))
|
||||
#define jit_stxr_ul(d1, d2, rs) jit_stxr_l((d1), (d2), (rs))
|
||||
#define jit_stxi_ul(id, rd, is) jit_stxi_l((id), (rd), (is))
|
||||
|
||||
#define jit_str_p(rd, rs) jit_str_l((rd), (rs))
|
||||
#define jit_sti_p(id, rs) jit_sti_l((id), (rs))
|
||||
#define jit_stxr_p(d1, d2, rs) jit_stxr_l((d1), (d2), (rs))
|
||||
#define jit_stxi_p(id, rd, is) jit_stxi_l((id), (rd), (is))
|
||||
|
||||
#define jit_ldr_p(rd, rs) jit_ldr_l((rd), (rs))
|
||||
#define jit_ldi_p(rd, is) jit_ldi_l((rd), (is))
|
||||
#define jit_ldxr_p(rd, s1, s2) jit_ldxr_l((rd), (s1), (s2))
|
||||
#ifndef jit_ldxi_p
|
||||
# define jit_ldxi_p(rd, rs, is) jit_ldxi_l((rd), (rs), (is))
|
||||
#endif
|
||||
|
||||
#define jit_ldr_ul(d, rs) jit_ldr_l((d), (rs))
|
||||
#define jit_ldi_ul(d, is) jit_ldi_l((d), (is))
|
||||
#define jit_ldxr_ul(d, s1, s2) jit_ldxr_l((d), (s1), (s2))
|
||||
#ifndef jit_ldxi_ul
|
||||
# define jit_ldxi_ul(d, rs, is) jit_ldxi_l((d), (rs), (is))
|
||||
#endif
|
||||
|
||||
|
||||
/* Boolean & branch synonyms */
|
||||
#define jit_eqr_ui(d, s1, s2) jit_eqr_i((d), (s1), (s2))
|
||||
#define jit_eqi_ui(d, rs, is) jit_eqi_i((d), (rs), (is))
|
||||
#define jit_ner_ui(d, s1, s2) jit_ner_i((d), (s1), (s2))
|
||||
#define jit_nei_ui(d, rs, is) jit_nei_i((d), (rs), (is))
|
||||
|
||||
#define jit_eqr_ul(d, s1, s2) jit_eqr_l((d), (s1), (s2))
|
||||
#define jit_eqi_ul(d, rs, is) jit_eqi_l((d), (rs), (is))
|
||||
#define jit_ner_ul(d, s1, s2) jit_ner_l((d), (s1), (s2))
|
||||
#define jit_nei_ul(d, rs, is) jit_nei_l((d), (rs), (is))
|
||||
|
||||
#define jit_beqr_ui(label, s1, s2) jit_beqr_i((label), (s1), (s2))
|
||||
#define jit_beqi_ui(label, rs, is) jit_beqi_i((label), (rs), (is))
|
||||
#define jit_bner_ui(label, s1, s2) jit_bner_i((label), (s1), (s2))
|
||||
#define jit_bnei_ui(label, rs, is) jit_bnei_i((label), (rs), (is))
|
||||
#define jit_bmcr_ui(label, s1, s2) jit_bmcr_i((label), (s1), (s2))
|
||||
#define jit_bmci_ui(label, rs, is) jit_bmci_i((label), (rs), (is))
|
||||
#define jit_bmsr_ui(label, s1, s2) jit_bmsr_i((label), (s1), (s2))
|
||||
#define jit_bmsi_ui(label, rs, is) jit_bmsi_i((label), (rs), (is))
|
||||
|
||||
#define jit_beqr_ul(label, s1, s2) jit_beqr_l((label), (s1), (s2))
|
||||
#define jit_beqi_ul(label, rs, is) jit_beqi_l((label), (rs), (is))
|
||||
#define jit_bner_ul(label, s1, s2) jit_bner_l((label), (s1), (s2))
|
||||
#define jit_bnei_ul(label, rs, is) jit_bnei_l((label), (rs), (is))
|
||||
#define jit_bmcr_ul(label, s1, s2) jit_bmcr_l((label), (s1), (s2))
|
||||
#define jit_bmci_ul(label, rs, is) jit_bmci_l((label), (rs), (is))
|
||||
#define jit_bmsr_ul(label, s1, s2) jit_bmsr_l((label), (s1), (s2))
|
||||
#define jit_bmsi_ul(label, rs, is) jit_bmsi_l((label), (rs), (is))
|
||||
|
||||
#define jit_ltr_p(d, s1, s2) jit_ltr_ul((d), (s1), (s2))
|
||||
#define jit_lti_p(d, rs, is) jit_lti_ul((d), (rs), (long)(is))
|
||||
#define jit_ler_p(d, s1, s2) jit_ler_ul((d), (s1), (s2))
|
||||
#define jit_lei_p(d, rs, is) jit_lei_ul((d), (rs), (long)(is))
|
||||
#define jit_gtr_p(d, s1, s2) jit_gtr_ul((d), (s1), (s2))
|
||||
#define jit_gti_p(d, rs, is) jit_gti_ul((d), (rs), (long)(is))
|
||||
#define jit_ger_p(d, s1, s2) jit_ger_ul((d), (s1), (s2))
|
||||
#define jit_gei_p(d, rs, is) jit_gei_ul((d), (rs), (long)(is))
|
||||
#define jit_eqr_p(d, s1, s2) jit_eqr_ul((d), (s1), (s2))
|
||||
#define jit_eqi_p(d, rs, is) jit_eqi_ul((d), (rs), (long)(is))
|
||||
#define jit_ner_p(d, s1, s2) jit_ner_ul((d), (s1), (s2))
|
||||
#define jit_nei_p(d, rs, is) jit_nei_ul((d), (rs), (long)(is))
|
||||
|
||||
#define jit_bltr_p(label, s1, s2) jit_bltr_ul((label), (s1), (s2))
|
||||
#define jit_blti_p(label, rs, is) jit_blti_ul((label), (rs), (long)(is))
|
||||
#define jit_bler_p(label, s1, s2) jit_bler_ul((label), (s1), (s2))
|
||||
#define jit_blei_p(label, rs, is) jit_blei_ul((label), (rs), (long)(is))
|
||||
#define jit_bgtr_p(label, s1, s2) jit_bgtr_ul((label), (s1), (s2))
|
||||
#define jit_bgti_p(label, rs, is) jit_bgti_ul((label), (rs), (long)(is))
|
||||
#define jit_bger_p(label, s1, s2) jit_bger_ul((label), (s1), (s2))
|
||||
#define jit_bgei_p(label, rs, is) jit_bgei_ul((label), (rs), (long)(is))
|
||||
#define jit_beqr_p(label, s1, s2) jit_beqr_ul((label), (s1), (s2))
|
||||
#define jit_beqi_p(label, rs, is) jit_beqi_ul((label), (rs), (long)(is))
|
||||
#define jit_bner_p(label, s1, s2) jit_bner_ul((label), (s1), (s2))
|
||||
#define jit_bnei_p(label, rs, is) jit_bnei_ul((label), (rs), (long)(is))
|
||||
|
||||
#define jit_retval_ui(rd) jit_retval_i((rd))
|
||||
#define jit_retval_uc(rd) jit_retval_i((rd))
|
||||
#define jit_retval_us(rd) jit_retval_i((rd))
|
||||
#define jit_retval_ul(rd) jit_retval_l((rd))
|
||||
#define jit_retval_p(rd) jit_retval_ul((rd))
|
||||
#define jit_retval_c(rd) jit_retval_i((rd))
|
||||
#define jit_retval_s(rd) jit_retval_i((rd))
|
||||
|
||||
/* This was a bug, but we keep it. */
|
||||
#define jit_retval(rd) jit_retval_i ((rd))
|
||||
|
||||
#ifndef jit_finish
|
||||
#define jit_finish(sub) jit_calli(sub)
|
||||
#endif
|
||||
|
||||
#ifndef jit_finishr
|
||||
#define jit_finishr(reg) jit_callr(reg)
|
||||
#endif
|
||||
|
||||
#ifndef jit_prolog
|
||||
#define jit_prolog(numargs)
|
||||
#endif
|
||||
|
||||
#ifndef jit_leaf
|
||||
#define jit_leaf(numargs) jit_prolog(numargs)
|
||||
#endif
|
||||
|
||||
#ifndef jit_getarg_c
|
||||
#ifndef JIT_AP
|
||||
#define jit_getarg_c(reg, ofs) jit_extr_c_l ((reg), (ofs))
|
||||
#define jit_getarg_i(reg, ofs) jit_extr_i_l ((reg), (ofs))
|
||||
#define jit_getarg_l(reg, ofs) jit_movr_l ((reg), (ofs))
|
||||
#define jit_getarg_p(reg, ofs) jit_movr_p ((reg), (ofs))
|
||||
#define jit_getarg_s(reg, ofs) jit_extr_s_l ((reg), (ofs))
|
||||
#define jit_getarg_uc(reg, ofs) jit_extr_uc_ul((reg), (ofs))
|
||||
#define jit_getarg_ui(reg, ofs) jit_extr_ui_ul((reg), (ofs))
|
||||
#define jit_getarg_ul(reg, ofs) jit_movr_ul ((reg), (ofs))
|
||||
#define jit_getarg_us(reg, ofs) jit_extr_us_ul((reg), (ofs))
|
||||
#else
|
||||
#define jit_getarg_c(reg, ofs) jit_ldxi_c((reg), JIT_AP, (ofs));
|
||||
#define jit_getarg_uc(reg, ofs) jit_ldxi_uc((reg), JIT_AP, (ofs));
|
||||
#define jit_getarg_s(reg, ofs) jit_ldxi_s((reg), JIT_AP, (ofs));
|
||||
#define jit_getarg_us(reg, ofs) jit_ldxi_us((reg), JIT_AP, (ofs));
|
||||
#define jit_getarg_i(reg, ofs) jit_ldxi_i((reg), JIT_AP, (ofs));
|
||||
#define jit_getarg_ui(reg, ofs) jit_ldxi_ui((reg), JIT_AP, (ofs));
|
||||
#define jit_getarg_l(reg, ofs) jit_ldxi_l((reg), JIT_AP, (ofs));
|
||||
#define jit_getarg_ul(reg, ofs) jit_ldxi_ul((reg), JIT_AP, (ofs));
|
||||
#define jit_getarg_p(reg, ofs) jit_ldxi_p((reg), JIT_AP, (ofs));
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
/* Common definitions when sizeof(long) = sizeof(int) */
|
||||
#if __WORDSIZE == 32
|
||||
/* ALU */
|
||||
# define jit_addi_l(d, rs, is) jit_addi_i((d), (rs), (is))
|
||||
# define jit_addr_l(d, s1, s2) jit_addr_i((d), (s1), (s2))
|
||||
# define jit_andi_l(d, rs, is) jit_andi_i((d), (rs), (is))
|
||||
# define jit_andr_l(d, s1, s2) jit_andr_i((d), (s1), (s2))
|
||||
# define jit_divi_l(d, rs, is) jit_divi_i((d), (rs), (is))
|
||||
# define jit_divr_l(d, s1, s2) jit_divr_i((d), (s1), (s2))
|
||||
# define jit_hmuli_l(d, rs, is) jit_hmuli_i((d), (rs), (is))
|
||||
# define jit_hmulr_l(d, s1, s2) jit_hmulr_i((d), (s1), (s2))
|
||||
# define jit_lshi_l(d, rs, is) jit_lshi_i((d), (rs), (is))
|
||||
# define jit_lshr_l(d, s1, s2) jit_lshr_i((d), (s1), (s2))
|
||||
# define jit_modi_l(d, rs, is) jit_modi_i((d), (rs), (is))
|
||||
# define jit_modr_l(d, s1, s2) jit_modr_i((d), (s1), (s2))
|
||||
# define jit_muli_l(d, rs, is) jit_muli_i((d), (rs), (is))
|
||||
# define jit_mulr_l(d, s1, s2) jit_mulr_i((d), (s1), (s2))
|
||||
# ifndef jit_negr_l
|
||||
# define jit_negr_l(d, s1) jit_negr_i((d), (s1))
|
||||
# endif
|
||||
# define jit_ori_l(d, rs, is) jit_ori_i((d), (rs), (is))
|
||||
# define jit_orr_l(d, s1, s2) jit_orr_i((d), (s1), (s2))
|
||||
# define jit_rshi_l(d, rs, is) jit_rshi_i((d), (rs), (is))
|
||||
# define jit_rshr_l(d, s1, s2) jit_rshr_i((d), (s1), (s2))
|
||||
# define jit_subr_l(d, s1, s2) jit_subr_i((d), (s1), (s2))
|
||||
# define jit_xori_l(d, rs, is) jit_xori_i((d), (rs), (is))
|
||||
# define jit_xorr_l(d, s1, s2) jit_xorr_i((d), (s1), (s2))
|
||||
# define jit_rsbi_l(d, rs, is) jit_rsbi_i((d), (rs), (is))
|
||||
# define jit_divi_ul(d, rs, is) jit_divi_ui((d), (rs), (is))
|
||||
# define jit_divr_ul(d, s1, s2) jit_divr_ui((d), (s1), (s2))
|
||||
# define jit_hmuli_ul(d, rs, is) jit_hmuli_ui((d), (rs), (is))
|
||||
# define jit_hmulr_ul(d, s1, s2) jit_hmulr_ui((d), (s1), (s2))
|
||||
# define jit_modi_ul(d, rs, is) jit_modi_ui((d), (rs), (is))
|
||||
# define jit_modr_ul(d, s1, s2) jit_modr_ui((d), (s1), (s2))
|
||||
# define jit_muli_ul(d, rs, is) jit_muli_ui((d), (rs), (is))
|
||||
# define jit_mulr_ul(d, s1, s2) jit_mulr_ui((d), (s1), (s2))
|
||||
# define jit_rshi_ul(d, rs, is) jit_rshi_ui((d), (rs), (is))
|
||||
# define jit_rshr_ul(d, s1, s2) jit_rshr_ui((d), (s1), (s2))
|
||||
|
||||
# define jit_bomulr_l(d, s1, s2) jit_bomulr_i((d), (s1), (s2))
|
||||
|
||||
/* Sign/Zero extension */
|
||||
# define jit_extr_c_l(d, rs) jit_extr_c_i(d, rs)
|
||||
# define jit_extr_c_ul(d, rs) jit_extr_c_ui(d, rs)
|
||||
# define jit_extr_s_l(d, rs) jit_extr_s_i(d, rs)
|
||||
# define jit_extr_s_ul(d, rs) jit_extr_s_ui(d, rs)
|
||||
# define jit_extr_i_l(d, rs) jit_movr_i(d, rs)
|
||||
# define jit_extr_i_ul(d, rs) jit_movr_i(d, rs)
|
||||
|
||||
/* Unary */
|
||||
# define jit_movi_l(d, rs) jit_movi_i((d), (rs))
|
||||
# define jit_movr_l(d, rs) jit_movr_i((d), (rs))
|
||||
|
||||
/* Stack */
|
||||
# define jit_pushr_l(rs) jit_pushr_i(rs)
|
||||
# define jit_popr_l(rs) jit_popr_i(rs)
|
||||
# define jit_pusharg_l(rs) jit_pusharg_i(rs)
|
||||
|
||||
/* Memory */
|
||||
# ifndef JIT_RZERO
|
||||
# define jit_ldr_l(d, rs) jit_ldr_i((d), (rs))
|
||||
# define jit_ldi_l(d, is) jit_ldi_i((d), (is))
|
||||
# define jit_str_l(d, rs) jit_str_i((d), (rs))
|
||||
# define jit_sti_l(d, is) jit_sti_i((d), (is))
|
||||
# define jit_ldr_ui(d, rs) jit_ldr_i((d), (rs))
|
||||
# define jit_ldi_ui(d, is) jit_ldi_i((d), (is))
|
||||
# endif
|
||||
|
||||
# define jit_ldxr_l(d, s1, s2) jit_ldxr_i((d), (s1), (s2))
|
||||
# define jit_ldxi_l(d, rs, is) jit_ldxi_i((d), (rs), (is))
|
||||
# define jit_stxr_l(d, s1, s2) jit_stxr_i((d), (s1), (s2))
|
||||
# define jit_stxi_l(d, rs, is) jit_stxi_i((d), (rs), (is))
|
||||
# if !defined (jit_ldxr_ui)
|
||||
# define jit_ldxr_ui(d, s1, s2) jit_ldxr_i((d), (s1), (s2))
|
||||
# endif
|
||||
# if !defined (jit_ldxi_ui)
|
||||
# define jit_ldxi_ui(d, rs, is) jit_ldxi_i((d), (rs), (is))
|
||||
# endif
|
||||
|
||||
|
||||
/* Boolean */
|
||||
# define jit_ltr_l(d, s1, s2) jit_ltr_i((d), (s1), (s2))
|
||||
# define jit_lti_l(d, rs, is) jit_lti_i((d), (rs), (is))
|
||||
# define jit_ler_l(d, s1, s2) jit_ler_i((d), (s1), (s2))
|
||||
# define jit_lei_l(d, rs, is) jit_lei_i((d), (rs), (is))
|
||||
# define jit_gtr_l(d, s1, s2) jit_gtr_i((d), (s1), (s2))
|
||||
# define jit_gti_l(d, rs, is) jit_gti_i((d), (rs), (is))
|
||||
# define jit_ger_l(d, s1, s2) jit_ger_i((d), (s1), (s2))
|
||||
# define jit_gei_l(d, rs, is) jit_gei_i((d), (rs), (is))
|
||||
# define jit_eqr_l(d, s1, s2) jit_eqr_i((d), (s1), (s2))
|
||||
# define jit_eqi_l(d, rs, is) jit_eqi_i((d), (rs), (is))
|
||||
# define jit_ner_l(d, s1, s2) jit_ner_i((d), (s1), (s2))
|
||||
# define jit_nei_l(d, rs, is) jit_nei_i((d), (rs), (is))
|
||||
# define jit_ltr_ul(d, s1, s2) jit_ltr_ui((d), (s1), (s2))
|
||||
# define jit_lti_ul(d, rs, is) jit_lti_ui((d), (rs), (is))
|
||||
# define jit_ler_ul(d, s1, s2) jit_ler_ui((d), (s1), (s2))
|
||||
# define jit_lei_ul(d, rs, is) jit_lei_ui((d), (rs), (is))
|
||||
# define jit_gtr_ul(d, s1, s2) jit_gtr_ui((d), (s1), (s2))
|
||||
# define jit_gti_ul(d, rs, is) jit_gti_ui((d), (rs), (is))
|
||||
# define jit_ger_ul(d, s1, s2) jit_ger_ui((d), (s1), (s2))
|
||||
# define jit_gei_ul(d, rs, is) jit_gei_ui((d), (rs), (is))
|
||||
|
||||
/* Branches */
|
||||
# define jit_bltr_l(label, s1, s2) jit_bltr_i((label), (s1), (s2))
|
||||
# define jit_blti_l(label, rs, is) jit_blti_i((label), (rs), (is))
|
||||
# define jit_bler_l(label, s1, s2) jit_bler_i((label), (s1), (s2))
|
||||
# define jit_blei_l(label, rs, is) jit_blei_i((label), (rs), (is))
|
||||
# define jit_bgtr_l(label, s1, s2) jit_bgtr_i((label), (s1), (s2))
|
||||
# define jit_bgti_l(label, rs, is) jit_bgti_i((label), (rs), (is))
|
||||
# define jit_bger_l(label, s1, s2) jit_bger_i((label), (s1), (s2))
|
||||
# define jit_bgei_l(label, rs, is) jit_bgei_i((label), (rs), (is))
|
||||
# define jit_beqr_l(label, s1, s2) jit_beqr_i((label), (s1), (s2))
|
||||
# define jit_beqi_l(label, rs, is) jit_beqi_i((label), (rs), (is))
|
||||
# define jit_bner_l(label, s1, s2) jit_bner_i((label), (s1), (s2))
|
||||
# define jit_bnei_l(label, rs, is) jit_bnei_i((label), (rs), (is))
|
||||
# define jit_bmcr_l(label, s1, s2) jit_bmcr_i((label), (s1), (s2))
|
||||
# define jit_bmci_l(label, rs, is) jit_bmci_i((label), (rs), (is))
|
||||
# define jit_bmsr_l(label, s1, s2) jit_bmsr_i((label), (s1), (s2))
|
||||
# define jit_bmsi_l(label, rs, is) jit_bmsi_i((label), (rs), (is))
|
||||
# define jit_boaddr_l(label, s1, s2) jit_boaddr_i((label), (s1), (s2))
|
||||
# define jit_boaddi_l(label, rs, is) jit_boaddi_i((label), (rs), (is))
|
||||
# define jit_bosubr_l(label, s1, s2) jit_bosubr_i((label), (s1), (s2))
|
||||
# define jit_bosubi_l(label, rs, is) jit_bosubi_i((label), (rs), (is))
|
||||
# define jit_bltr_ul(label, s1, s2) jit_bltr_ui((label), (s1), (s2))
|
||||
# define jit_blti_ul(label, rs, is) jit_blti_ui((label), (rs), (is))
|
||||
# define jit_bler_ul(label, s1, s2) jit_bler_ui((label), (s1), (s2))
|
||||
# define jit_blei_ul(label, rs, is) jit_blei_ui((label), (rs), (is))
|
||||
# define jit_bgtr_ul(label, s1, s2) jit_bgtr_ui((label), (s1), (s2))
|
||||
# define jit_bgti_ul(label, rs, is) jit_bgti_ui((label), (rs), (is))
|
||||
# define jit_bger_ul(label, s1, s2) jit_bger_ui((label), (s1), (s2))
|
||||
# define jit_bgei_ul(label, rs, is) jit_bgei_ui((label), (rs), (is))
|
||||
# define jit_boaddr_ul(label, s1, s2) jit_boaddr_ui((label), (s1), (s2))
|
||||
# define jit_boaddi_ul(label, rs, is) jit_boaddi_ui((label), (rs), (is))
|
||||
# define jit_bosubr_ul(label, s1, s2) jit_bosubr_ui((label), (s1), (s2))
|
||||
# define jit_bosubi_ul(label, rs, is) jit_bosubi_ui((label), (rs), (is))
|
||||
|
||||
# define jit_retval_l(rd) jit_retval_i((rd))
|
||||
#endif /* __WORDSIZE == 32 */
|
||||
|
||||
/* RSB is not mandatory */
|
||||
#ifndef jit_rsbi_i
|
||||
# define jit_rsbi_i(d, rs, is) (jit_subi_i((d), (rs), (is)), jit_negr_i((d), (d)))
|
||||
|
||||
# ifndef jit_rsbi_l
|
||||
# define jit_rsbi_l(d, rs, is) (jit_subi_l((d), (rs), (is)), jit_negr_l((d), (d)))
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#endif /* __lightning_core_common_h_ */
|
2588
src/racket/src/lightning/arm/core.h
Normal file
2588
src/racket/src/lightning/arm/core.h
Normal file
File diff suppressed because it is too large
Load Diff
188
src/racket/src/lightning/arm/fp-common.h
Normal file
188
src/racket/src/lightning/arm/fp-common.h
Normal file
|
@ -0,0 +1,188 @@
|
|||
/******************************** -*- C -*- ****************************
|
||||
*
|
||||
* Platform-independent layer floating-point interface
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Copyright 2000, 2001, 2002 Free Software Foundation, Inc.
|
||||
* Written by Paolo Bonzini.
|
||||
*
|
||||
* This file is part of GNU lightning.
|
||||
*
|
||||
* GNU lightning is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 3, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* GNU lightning is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with GNU lightning; see the file COPYING.LESSER; if not, write to the
|
||||
* Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301, USA.
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
#define JIT_FPR0 JIT_FPR(0)
|
||||
#define JIT_FPR1 JIT_FPR(1)
|
||||
#define JIT_FPR2 JIT_FPR(2)
|
||||
#define JIT_FPR3 JIT_FPR(3)
|
||||
#define JIT_FPR4 JIT_FPR(4)
|
||||
#define JIT_FPR5 JIT_FPR(5)
|
||||
|
||||
#ifdef JIT_RZERO
|
||||
#ifndef jit_ldi_f
|
||||
#define jit_ldi_f(rd, is) jit_ldxi_f((rd), JIT_RZERO, (is))
|
||||
#define jit_sti_f(id, rs) jit_stxi_f((id), JIT_RZERO, (rs))
|
||||
#define jit_ldi_d(rd, is) jit_ldxi_d((rd), JIT_RZERO, (is))
|
||||
#define jit_sti_d(id, rs) jit_stxi_d((id), JIT_RZERO, (rs))
|
||||
#endif
|
||||
|
||||
#ifndef jit_ldr_f
|
||||
#define jit_ldr_f(rd, rs) jit_ldxr_f((rd), JIT_RZERO, (rs))
|
||||
#define jit_str_f(rd, rs) jit_stxr_f((rd), JIT_RZERO, (rs))
|
||||
#define jit_ldr_d(rd, rs) jit_ldxr_d((rd), JIT_RZERO, (rs))
|
||||
#define jit_str_d(rd, rs) jit_stxr_d((rd), JIT_RZERO, (rs))
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef jit_addr_f
|
||||
#define jit_addr_f(rd,s1,s2) jit_addr_d(rd,s1,s2)
|
||||
#define jit_subr_f(rd,s1,s2) jit_subr_d(rd,s1,s2)
|
||||
#define jit_mulr_f(rd,s1,s2) jit_mulr_d(rd,s1,s2)
|
||||
#define jit_divr_f(rd,s1,s2) jit_divr_d(rd,s1,s2)
|
||||
#define jit_movr_f(rd,rs) jit_movr_d(rd,rs)
|
||||
#endif
|
||||
|
||||
#if !defined(jit_absr_f)
|
||||
#define jit_absr_f(rd,rs) jit_absr_d(rd,rs)
|
||||
#define jit_negr_f(rd,rs) jit_negr_d(rd,rs)
|
||||
#define jit_sqrtr_f(rd,rs) jit_sqrtr_d(rd,rs)
|
||||
#endif
|
||||
|
||||
#if !defined(jit_extr_i_f)
|
||||
# define jit_extr_i_f(rd, rs) jit_extr_i_d(rd, rs)
|
||||
#endif
|
||||
|
||||
#if !defined(jit_rintr_d_i)
|
||||
# define jit_rintr_d_i(rd, rs) jit_truncr_d_i(rd, rs)
|
||||
#endif
|
||||
|
||||
#if !defined(jit_rintr_f_i)
|
||||
# define jit_rintr_f_i(rd, rs) jit_rintr_d_i(rd, rs)
|
||||
#endif
|
||||
|
||||
#if !defined(jit_roundr_f_i)
|
||||
# define jit_roundr_f_i(rd, rs) jit_roundr_d_i(rd, rs)
|
||||
# define jit_floorr_f_i(rd, rs) jit_floorr_d_i(rd, rs)
|
||||
# define jit_ceilr_f_i(rd, rs) jit_ceilr_d_i(rd, rs)
|
||||
# define jit_truncr_f_i(rd, rs) jit_truncr_d_i(rd, rs)
|
||||
#endif
|
||||
|
||||
#if !defined(jit_eqr_f)
|
||||
#define jit_eqr_f(rd, s0, s1) jit_eqr_d(rd, s0, s1)
|
||||
#define jit_ner_f(rd, s0, s1) jit_ner_d(rd, s0, s1)
|
||||
#define jit_gtr_f(rd, s0, s1) jit_gtr_d(rd, s0, s1)
|
||||
#define jit_ger_f(rd, s0, s1) jit_ger_d(rd, s0, s1)
|
||||
#define jit_ltr_f(rd, s0, s1) jit_ltr_d(rd, s0, s1)
|
||||
#define jit_ler_f(rd, s0, s1) jit_ler_d(rd, s0, s1)
|
||||
#define jit_uneqr_f(rd, s0, s1) jit_uneqr_d(rd, s0, s1)
|
||||
#define jit_ltgtr_f(rd, s0, s1) jit_ltgtr_d(rd, s0, s1)
|
||||
#define jit_ungtr_f(rd, s0, s1) jit_ungtr_d(rd, s0, s1)
|
||||
#define jit_unger_f(rd, s0, s1) jit_unger_d(rd, s0, s1)
|
||||
#define jit_unltr_f(rd, s0, s1) jit_unltr_d(rd, s0, s1)
|
||||
#define jit_unler_f(rd, s0, s1) jit_unler_d(rd, s0, s1)
|
||||
#define jit_ordr_f(rd, s0, s1) jit_ordr_d(rd, s0, s1)
|
||||
#define jit_unordr_f(rd, s0, s1) jit_unordr_d(rd, s0, s1)
|
||||
#endif
|
||||
|
||||
#if !defined(jit_retval_f)
|
||||
#define jit_retval_f(rs) jit_retval_d(rs)
|
||||
#endif
|
||||
|
||||
#ifndef jit_extr_f_d
|
||||
# define jit_extr_f_d(rd, rs) jit_movr_d(rd, rs)
|
||||
#endif
|
||||
|
||||
#ifndef jit_extr_d_f
|
||||
# define jit_extr_d_f(rd, rs) jit_movr_d(rd, rs)
|
||||
#endif
|
||||
|
||||
#if !defined(__WORDSIZE) || __WORDSIZE == 32
|
||||
# if !defined(jit_extr_l_f)
|
||||
# define jit_extr_l_f(rd, rs) jit_extr_i_f(rd, rs)
|
||||
# endif
|
||||
# if !defined(jit_extr_l_d)
|
||||
# define jit_extr_l_d(rd, rs) jit_extr_i_d(rd, rs)
|
||||
# endif
|
||||
# if !defined(jit_roundr_f_l)
|
||||
# if defined(jit_rintr_f_i)
|
||||
# define jit_rintr_f_l(rd, rs) jit_rintr_f_i(rd, rs)
|
||||
# endif
|
||||
# define jit_roundr_f_l(rd, rs) jit_roundr_f_i(rd, rs)
|
||||
# define jit_truncr_f_l(rd, rs) jit_truncr_f_i(rd, rs)
|
||||
# define jit_floorr_f_l(rd, rs) jit_floorr_f_i(rd, rs)
|
||||
# define jit_ceilr_f_l(rd, rs) jit_ceilr_f_i(rd, rs)
|
||||
# endif
|
||||
# if !defined(jit_roundr_d_l)
|
||||
# if defined(jit_rintr_d_i)
|
||||
# define jit_rintr_d_l(rd, rs) jit_rintr_d_i(rd, rs)
|
||||
# endif
|
||||
# define jit_roundr_d_l(rd, rs) jit_roundr_d_i(rd, rs)
|
||||
# define jit_truncr_d_l(rd, rs) jit_truncr_d_i(rd, rs)
|
||||
# define jit_floorr_d_l(rd, rs) jit_floorr_d_i(rd, rs)
|
||||
# define jit_ceilr_d_l(rd, rs) jit_ceilr_d_i(rd, rs)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef jit_beqr_f
|
||||
#define jit_beqr_f(lab, a, b) jit_beqr_d(lab, a, b)
|
||||
#define jit_bner_f(lab, a, b) jit_bner_d(lab, a, b)
|
||||
#define jit_bgtr_f(lab, a, b) jit_bgtr_d(lab, a, b)
|
||||
#define jit_bger_f(lab, a, b) jit_bger_d(lab, a, b)
|
||||
#define jit_bltr_f(lab, a, b) jit_bltr_d(lab, a, b)
|
||||
#define jit_bler_f(lab, a, b) jit_bler_d(lab, a, b)
|
||||
#define jit_buneqr_f(lab, a, b) jit_buneqr_d(lab, a, b)
|
||||
#define jit_bltgtr_f(lab, a, b) jit_bltgtr_d(lab, a, b)
|
||||
#define jit_bungtr_f(lab, a, b) jit_bungtr_d(lab, a, b)
|
||||
#define jit_bunger_f(lab, a, b) jit_bunger_d(lab, a, b)
|
||||
#define jit_bunltr_f(lab, a, b) jit_bunltr_d(lab, a, b)
|
||||
#define jit_bunler_f(lab, a, b) jit_bunler_d(lab, a, b)
|
||||
#define jit_bordr_f(lab, a, b) jit_bordr_d(lab, a, b)
|
||||
#define jit_bunordr_f(lab, a, b) jit_bunordr_d(lab, a, b)
|
||||
#endif
|
||||
|
||||
#ifndef jit_retval_f
|
||||
#define jit_retval_f(op1) jit_movr_f((op1), JIT_FPRET)
|
||||
#endif
|
||||
|
||||
#ifndef jit_retval_d
|
||||
#define jit_retval_d(op1) jit_movr_d((op1), JIT_FPRET)
|
||||
#endif
|
||||
|
||||
#ifndef jit_prolog_d
|
||||
#define jit_prolog_f(numargs)
|
||||
#define jit_prolog_d(numargs)
|
||||
#endif
|
||||
|
||||
#ifndef jit_leaf_d
|
||||
#define jit_leaf_f(numargs) jit_prolog_f(numargs)
|
||||
#define jit_leaf_d(numargs) jit_prolog_d(numargs)
|
||||
#endif
|
||||
|
||||
#ifndef jit_getarg_f
|
||||
#ifndef JIT_AP
|
||||
#define jit_getarg_f(reg, ofs) jit_movr_f ((reg), (ofs))
|
||||
#define jit_getarg_d(reg, ofs) jit_movr_d ((reg), (ofs))
|
||||
#else
|
||||
#define jit_getarg_f(reg, ofs) jit_ldxi_f((reg), JIT_AP, (ofs));
|
||||
#define jit_getarg_d(reg, ofs) jit_ldxi_d((reg), JIT_AP, (ofs));
|
||||
#endif
|
||||
#endif
|
||||
|
1171
src/racket/src/lightning/arm/fp-swf.h
Normal file
1171
src/racket/src/lightning/arm/fp-swf.h
Normal file
File diff suppressed because it is too large
Load Diff
1022
src/racket/src/lightning/arm/fp-vfp.h
Normal file
1022
src/racket/src/lightning/arm/fp-vfp.h
Normal file
File diff suppressed because it is too large
Load Diff
1074
src/racket/src/lightning/arm/fp.h
Normal file
1074
src/racket/src/lightning/arm/fp.h
Normal file
File diff suppressed because it is too large
Load Diff
47
src/racket/src/lightning/arm/funcs-common.h
Normal file
47
src/racket/src/lightning/arm/funcs-common.h
Normal file
|
@ -0,0 +1,47 @@
|
|||
/******************************** -*- C -*- ****************************
|
||||
*
|
||||
* Platform-independent layer inline functions (common part)
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Copyright 2000, 2001, 2002 Free Software Foundation, Inc.
|
||||
* Written by Paolo Bonzini.
|
||||
*
|
||||
* This file is part of GNU lightning.
|
||||
*
|
||||
* GNU lightning is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 3, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* GNU lightning is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with GNU lightning; see the file COPYING.LESSER; if not, write to the
|
||||
* Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301, USA.
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
#ifndef __lightning_funcs_common_h
|
||||
#define __lightning_funcs_common_h
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
int
|
||||
jit_fail(const char *msg, const char *file, int line, const char *function)
|
||||
{
|
||||
fprintf(stderr, "%s: In function `%s':\n", file, function);
|
||||
fprintf(stderr, "%s:%d: %s\n", file, line, msg);
|
||||
abort();
|
||||
}
|
||||
|
||||
|
||||
#endif /* __lightning_funcs_common_h */
|
136
src/racket/src/lightning/arm/funcs.h
Normal file
136
src/racket/src/lightning/arm/funcs.h
Normal file
|
@ -0,0 +1,136 @@
|
|||
/******************************** -*- C -*- ****************************
|
||||
*
|
||||
* Run-time assembler for the arm
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
/***********************************************************************
|
||||
*
|
||||
* Copyright 2011 Free Software Foundation
|
||||
*
|
||||
* This file is part of GNU lightning.
|
||||
*
|
||||
* GNU lightning is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU Lesser General Public License as published
|
||||
* by the Free Software Foundation; either version 3, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* GNU lightning is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
||||
* License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with GNU lightning; see the file COPYING.LESSER; if not, write to the
|
||||
* Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301, USA.
|
||||
*
|
||||
* Authors:
|
||||
* Paulo Cesar Pereira de Andrade
|
||||
***********************************************************************/
|
||||
|
||||
#ifndef __lightning_funcs_h
|
||||
#define __lightning_funcs_h
|
||||
|
||||
#if defined(__linux__)
|
||||
# include <stdio.h>
|
||||
# include <string.h>
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define jit_notify_freed_code() /* empty */
|
||||
|
||||
extern void __clear_cache(void*, void*);
|
||||
|
||||
__jit_inline void
|
||||
jit_flush_code(void *start, void *end)
|
||||
{
|
||||
/* Flush via __clear_cache() --- which seems to work only for ranges
|
||||
that fall within a page, so call it once for each page in the
|
||||
range `start' to `end'. */
|
||||
while (start < end) {
|
||||
void *e;
|
||||
e = (void *)(((uintptr_t)start + 4096) & ~4095);
|
||||
if (e < end) {
|
||||
__clear_cache(start, e);
|
||||
start = e;
|
||||
} else {
|
||||
__clear_cache(start, end);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#define jit_get_cpu jit_get_cpu
|
||||
__jit_constructor __jit_inline void
|
||||
jit_get_cpu(void)
|
||||
{
|
||||
static int initialized;
|
||||
|
||||
if (initialized)
|
||||
return;
|
||||
|
||||
initialized = 1;
|
||||
|
||||
#if defined(__linux__)
|
||||
{
|
||||
FILE *fp;
|
||||
char *ptr;
|
||||
char buf[128];
|
||||
|
||||
if ((fp = fopen("/proc/cpuinfo", "r")) == NULL)
|
||||
return;
|
||||
|
||||
while (fgets(buf, sizeof(buf), fp)) {
|
||||
if (strncmp(buf, "CPU architecture:", 17) == 0) {
|
||||
jit_cpu.version = strtol(buf + 17, &ptr, 10);
|
||||
while (*ptr) {
|
||||
if (*ptr == 'T' || *ptr == 't') {
|
||||
++ptr;
|
||||
jit_cpu.thumb = 1;
|
||||
}
|
||||
else if (*ptr == 'E' || *ptr == 'e') {
|
||||
jit_cpu.extend = 1;
|
||||
++ptr;
|
||||
}
|
||||
else
|
||||
++ptr;
|
||||
}
|
||||
}
|
||||
else if (strncmp(buf, "Features\t:", 10) == 0) {
|
||||
if ((ptr = strstr(buf + 10, "vfpv")))
|
||||
jit_cpu.vfp = strtol(ptr + 4, NULL, 0);
|
||||
if ((ptr = strstr(buf + 10, "neon")))
|
||||
jit_cpu.neon = 1;
|
||||
if ((ptr = strstr(buf + 10, "thumb")))
|
||||
jit_cpu.thumb = 1;
|
||||
}
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
#endif
|
||||
#if defined(__ARM_PCS_VFP)
|
||||
if (!jit_cpu.vfp)
|
||||
jit_cpu.vfp = 3;
|
||||
if (!jit_cpu.version)
|
||||
jit_cpu.version = 7;
|
||||
jit_cpu.abi = 1;
|
||||
#endif
|
||||
#ifdef __VFP_FP__
|
||||
if (!jit_cpu.vfp)
|
||||
jit_cpu.vfp = 1;
|
||||
#endif
|
||||
/* armv6t2 todo (software float and thumb2) */
|
||||
if (!jit_cpu.vfp && jit_cpu.thumb)
|
||||
jit_cpu.thumb = 0;
|
||||
|
||||
/* Note that software float works only when the ABI does not use
|
||||
VFP for floating-point arguments. VFP, in contrast, works
|
||||
whether or not a VFP ABI is in use (since we avoid passing
|
||||
floating-point arguments or receiving floating-point results in
|
||||
that mode). */
|
||||
}
|
||||
|
||||
#endif /* __lightning_funcs_h */
|
|
@ -72,11 +72,15 @@ static jit_state _jit;
|
|||
|
||||
#define _jitl _jit.jitl
|
||||
|
||||
#define jit_get_ip() (_jit.x.code)
|
||||
#define jit_get_ip() (_jit.x.pc)
|
||||
#define jit_get_raw_ip() jit_get_ip()
|
||||
#define jit_set_ip(ptr) (_jit.x.pc = (ptr), jit_get_ip ())
|
||||
#define jit_get_label() (_jit.x.pc)
|
||||
#define jit_forward() (_jit.x.pc)
|
||||
|
||||
#define jit_adjust_ip(x) x
|
||||
#define jit_unadjust_ip(x) x
|
||||
|
||||
#define jit_field(struc, f) ( ((intptr_t) (&((struc *) 8)->f) ) - 8)
|
||||
#define jit_ptr_field(struc_p, f) ( ((intptr_t) (&((struc_p) 8)->f) ) - 8)
|
||||
|
||||
|
|
|
@ -64,6 +64,19 @@ extern "C" {
|
|||
|
||||
#endif
|
||||
|
||||
#ifdef MZ_USE_JIT_ARM
|
||||
|
||||
#include "arm/asm-common.h"
|
||||
#include "arm/asm.h"
|
||||
#include "arm/funcs.h"
|
||||
#include "arm/funcs-common.h"
|
||||
#include "arm/core.h"
|
||||
#include "arm/core-common.h"
|
||||
#include "arm/fp.h"
|
||||
#include "arm/fp-common.h"
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef JIT_R0
|
||||
#error GNU lightning does not support the current target
|
||||
#endif
|
||||
|
|
|
@ -83,11 +83,15 @@ static jit_state _jit;
|
|||
|
||||
#define _jitl _jit.jitl
|
||||
|
||||
#define jit_get_ip() (_jit.x.code)
|
||||
#define jit_get_ip() (_jit.x.pc)
|
||||
#define jit_get_raw_ip() jit_get_ip()
|
||||
#define jit_set_ip(ptr) (_jit.x.pc = (ptr), jit_get_ip ())
|
||||
#define jit_get_label() (_jit.x.pc)
|
||||
#define jit_forward() (_jit.x.pc)
|
||||
|
||||
#define jit_adjust_ip(x) x
|
||||
#define jit_unadjust_ip(x) x
|
||||
|
||||
#define jit_field(struc, f) ( ((long) (&((struc *) 8)->f) ) - 8)
|
||||
#define jit_ptr_field(struc_p, f) ( ((long) (&((struc_p) 8)->f) ) - 8)
|
||||
|
||||
|
|
|
@ -319,8 +319,6 @@ Scheme_Object *scheme_place(int argc, Scheme_Object *args[]) {
|
|||
place_data->parent_gc = parent_gc;
|
||||
|
||||
{
|
||||
Scheme_Object *so;
|
||||
|
||||
in_arg = args[2];
|
||||
out_arg = args[3];
|
||||
err_arg = args[4];
|
||||
|
|
|
@ -2572,6 +2572,11 @@ typedef struct Scheme_Native_Closure_Data {
|
|||
#ifdef MZ_PRECISE_GC
|
||||
void **retained; /* inside code */
|
||||
#endif
|
||||
#if defined(MZ_USE_JIT_ARM) && !defined(MZ_PRECISE_GC)
|
||||
# define NEED_RETAIN_CODE_POINTERS
|
||||
/* Thumb code is off by one, need real start for GC */
|
||||
void *retain_code;
|
||||
#endif
|
||||
} Scheme_Native_Closure_Data;
|
||||
|
||||
#define SCHEME_NATIVE_CLOSURE_DATA_FLAGS(obj) MZ_OPT_HASH_KEY(&(obj)->iso)
|
||||
|
@ -3840,7 +3845,7 @@ intptr_t scheme_port_closed_p (Scheme_Object *port);
|
|||
#define CURRENT_OUTPUT_PORT(config) scheme_get_param(config, MZCONFIG_OUTPUT_PORT)
|
||||
#define CHECK_PORT_CLOSED(who, kind, port, closed) if (closed) scheme_raise_exn(MZEXN_FAIL, "%s: " kind " port is closed", who);
|
||||
|
||||
#ifdef USE_FCNTL_O_NONBLOCK
|
||||
#if defined(USE_FCNTL_O_NONBLOCK)
|
||||
# define MZ_NONBLOCKING O_NONBLOCK
|
||||
#else
|
||||
# define MZ_NONBLOCKING FNDELAY
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -32,11 +32,23 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
|||
#if defined(i386)
|
||||
# define PLAIN_X86
|
||||
#endif
|
||||
#if defined(__x86_64__)
|
||||
# define UNW_X86_64
|
||||
#endif
|
||||
#if defined(__arm__)
|
||||
# define UNW_ARM
|
||||
#endif
|
||||
|
||||
#ifdef PLAIN_X86
|
||||
#if defined(PLAIN_X86)
|
||||
# define UNW_IP UNW_X86_EIP
|
||||
#else
|
||||
#elif defined(UNW_X86_64)
|
||||
# define UNW_IP UNW_X86_64_RIP
|
||||
#elif defined(UNW_ARM)
|
||||
# define UNW_IP UNW_ARM_RIP
|
||||
#endif
|
||||
|
||||
#ifdef UNW_ARM
|
||||
# define CONFIG_DEBUG_FRAME
|
||||
#endif
|
||||
|
||||
#if defined(__cplusplus) || defined(c_plusplus)
|
||||
|
@ -44,10 +56,12 @@ extern "C" {
|
|||
#endif
|
||||
|
||||
#include <inttypes.h>
|
||||
#define _XOPEN_SOURCE /* needed for Mac OS X */
|
||||
#define __USE_GNU
|
||||
#include <ucontext.h>
|
||||
#undef __USE_GNU
|
||||
#ifndef UNW_ARM
|
||||
# define _XOPEN_SOURCE /* needed for Mac OS X */
|
||||
# define __USE_GNU
|
||||
# include <ucontext.h>
|
||||
# undef __USE_GNU
|
||||
#endif
|
||||
|
||||
/* XXXXXXXXXXXXXXXXXXXX x86 Target XXXXXXXXXXXXXXXXXXXX */
|
||||
|
||||
|
@ -157,13 +171,17 @@ typedef enum
|
|||
}
|
||||
x86_regnum_t;
|
||||
|
||||
/* On x86, we can directly use ucontext_t as the unwind context. */
|
||||
typedef ucontext_t unw_tdep_context_t;
|
||||
#define unw_tdep_getcontext(uc) (getcontext (uc), 0)
|
||||
|
||||
#endif
|
||||
|
||||
/* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */
|
||||
|
||||
/* XXXXXXXXXXXXXXXXXXXX x86_64 Target XXXXXXXXXXXXXXXXXXXX */
|
||||
|
||||
#ifndef PLAIN_X86
|
||||
#ifdef UNW_X86_64
|
||||
|
||||
#define UNW_TARGET x86_64
|
||||
#define UNW_TARGET_X86_64 1
|
||||
|
@ -216,6 +234,94 @@ typedef enum
|
|||
}
|
||||
x86_64_regnum_t;
|
||||
|
||||
/* On x86, we can directly use ucontext_t as the unwind context. */
|
||||
typedef ucontext_t unw_tdep_context_t;
|
||||
#define unw_tdep_getcontext(uc) (getcontext (uc), 0)
|
||||
|
||||
#endif
|
||||
|
||||
/* XXXXXXXXXXXXXXXXXXXX ARM Target XXXXXXXXXXXXXXXXXXXX */
|
||||
|
||||
#ifdef UNW_ARM
|
||||
|
||||
#define UNW_TARGET ARM
|
||||
#define UNW_TARGET_ARM 1
|
||||
|
||||
#define _U_TDEP_QP_TRUE 0 /* see libunwind-dynamic.h */
|
||||
|
||||
/* This needs to be big enough to accommodate "struct cursor", while
|
||||
leaving some slack for future expansion. Changing this value will
|
||||
require recompiling all users of this library. Stack allocation is
|
||||
relatively cheap and unwind-state copying is relatively rare, so we
|
||||
want to err on making it rather too big than too small. */
|
||||
#define UNW_TDEP_CURSOR_LEN 127
|
||||
|
||||
typedef uint32_t unw_word_t;
|
||||
typedef int32_t unw_sword_t;
|
||||
|
||||
typedef double unw_tdep_fpreg_t;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
UNW_ARM_R0,
|
||||
UNW_ARM_R1,
|
||||
UNW_ARM_R2,
|
||||
UNW_ARM_R3,
|
||||
UNW_ARM_R4,
|
||||
UNW_ARM_R5,
|
||||
UNW_ARM_R6,
|
||||
UNW_ARM_R7,
|
||||
UNW_ARM_R8,
|
||||
UNW_ARM_R9,
|
||||
UNW_ARM_R10,
|
||||
UNW_ARM_R11,
|
||||
UNW_ARM_R12,
|
||||
UNW_ARM_R13,
|
||||
UNW_ARM_RSP = UNW_ARM_R13,
|
||||
UNW_ARM_R14,
|
||||
UNW_ARM_R15,
|
||||
UNW_ARM_RIP = UNW_ARM_R15,
|
||||
|
||||
UNW_TDEP_LAST_REG = UNW_ARM_R15,
|
||||
|
||||
UNW_TDEP_IP = UNW_ARM_RIP,
|
||||
UNW_TDEP_SP = UNW_ARM_RSP,
|
||||
UNW_TDEP_EH = UNW_ARM_R0
|
||||
|
||||
}
|
||||
arm_regnum_t;
|
||||
|
||||
typedef struct {
|
||||
unsigned long regs[16];
|
||||
} unw_tdep_context_t;
|
||||
|
||||
/* There is no getcontext() on ARM. Use a stub version which only saves GP
|
||||
registers. FIXME: Not ideal, may not be sufficient for all libunwind
|
||||
use cases. Stores pc+8, which is only approximately correct, really. */
|
||||
#ifndef __thumb__
|
||||
#define unw_tdep_getcontext(uc) (({ \
|
||||
unw_tdep_context_t *unw_ctx = (uc); \
|
||||
register unsigned long *unw_base asm ("r0") = unw_ctx; \
|
||||
__asm__ __volatile__ ( \
|
||||
"stmia %[base], {r0-r15}" \
|
||||
: : [base] "r" (unw_base) : "memory"); \
|
||||
}), 0)
|
||||
#else /* __thumb__ */
|
||||
#define unw_tdep_getcontext(uc) (({ \
|
||||
unw_tdep_context_t *unw_ctx = (uc); \
|
||||
register unsigned long *unw_base asm ("r0") = unw_ctx; \
|
||||
__asm__ __volatile__ ( \
|
||||
".align 2\nbx pc\nnop\n.code 32\n" \
|
||||
"stmia %[base], {r0-r15}\n" \
|
||||
"orr %[base], pc, #1\nbx %[base]" \
|
||||
: [base] "+r" (unw_base) : : "memory", "cc"); \
|
||||
}), 0)
|
||||
#endif
|
||||
|
||||
#ifndef PT_GNU_EH_FRAME
|
||||
# define PT_GNU_EH_FRAME -1
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */
|
||||
|
@ -228,15 +334,6 @@ typedef struct unw_tdep_save_loc
|
|||
}
|
||||
unw_tdep_save_loc_t;
|
||||
|
||||
/* On x86, we can directly use ucontext_t as the unwind context. */
|
||||
typedef ucontext_t unw_tdep_context_t;
|
||||
|
||||
/* XXX this is not ideal: an application should not be prevented from
|
||||
using the "getcontext" name just because it's using libunwind. We
|
||||
can't just use __getcontext() either, because that isn't exported
|
||||
by glibc... */
|
||||
#define unw_tdep_getcontext(uc) (getcontext (uc), 0)
|
||||
|
||||
|
||||
typedef struct unw_dyn_remote_table_info
|
||||
{
|
||||
|
|
|
@ -530,6 +530,7 @@ typedef struct dwarf_reg_state
|
|||
unsigned short lru_chain; /* used for least-recently-used chain */
|
||||
unsigned short coll_chain; /* used for hash collisions */
|
||||
unsigned short hint; /* hint for next rs to try (or -1) */
|
||||
char valid, signal_frame;
|
||||
}
|
||||
dwarf_reg_state_t;
|
||||
|
||||
|
@ -549,6 +550,7 @@ typedef struct dwarf_cie_info
|
|||
uint8_t lsda_encoding;
|
||||
unsigned int sized_augmentation : 1;
|
||||
unsigned int have_abi_marker : 1;
|
||||
unsigned int signal_frame : 1;
|
||||
}
|
||||
dwarf_cie_info_t;
|
||||
|
||||
|
@ -581,6 +583,8 @@ typedef struct dwarf_cursor
|
|||
|
||||
short hint; /* faster lookup of the rs cache */
|
||||
short prev_rs;
|
||||
|
||||
int use_prev_instr;
|
||||
}
|
||||
dwarf_cursor_t;
|
||||
|
||||
|
@ -637,6 +641,7 @@ HIDDEN int dwarf_extract_proc_info_from_fde (unw_addr_space_t as,
|
|||
unw_word_t *fde_addr,
|
||||
unw_proc_info_t *pi,
|
||||
int need_unwind_info,
|
||||
unw_word_t base,
|
||||
void *arg);
|
||||
HIDDEN int dwarf_find_save_locs (struct dwarf_cursor *c);
|
||||
HIDDEN int dwarf_read_encoded_pointer (unw_addr_space_t as,
|
||||
|
@ -649,6 +654,23 @@ HIDDEN int dwarf_step (struct dwarf_cursor *c);
|
|||
|
||||
/*XXXXXXXXXXXXXXXXXXXXXXXXX End dwarf.h XXXXXXXXXXXXXXXXXXXXXXXXXX*/
|
||||
|
||||
#ifdef CONFIG_DEBUG_FRAME
|
||||
struct unw_debug_frame_list
|
||||
{
|
||||
/* The start (inclusive) and end (exclusive) of the described region. */
|
||||
unw_word_t start;
|
||||
unw_word_t end;
|
||||
/* The debug frame itself. */
|
||||
char *debug_frame;
|
||||
size_t debug_frame_size;
|
||||
/* Index (for binary search). */
|
||||
struct table_entry *index;
|
||||
size_t index_size;
|
||||
/* Pointer to next descriptor. */
|
||||
struct unw_debug_frame_list *next;
|
||||
};
|
||||
#endif
|
||||
|
||||
struct unw_addr_space
|
||||
{
|
||||
void *mem_pool;
|
||||
|
@ -660,6 +682,9 @@ struct unw_addr_space
|
|||
uint32_t cache_generation;
|
||||
#endif
|
||||
struct dwarf_rs_cache global_cache;
|
||||
#ifdef CONFIG_DEBUG_FRAME
|
||||
struct unw_debug_frame_list *debug_frames;
|
||||
#endif
|
||||
};
|
||||
|
||||
struct cursor
|
||||
|
@ -672,7 +697,8 @@ struct cursor
|
|||
{
|
||||
X86_SCF_NONE, /* no signal frame encountered */
|
||||
X86_SCF_LINUX_SIGFRAME, /* classic x86 sigcontext */
|
||||
X86_SCF_LINUX_RT_SIGFRAME /* POSIX ucontext_t */
|
||||
X86_SCF_LINUX_RT_SIGFRAME, /* POSIX ucontext_t */
|
||||
ARM_SCF_NONE
|
||||
}
|
||||
sigcontext_format;
|
||||
unw_word_t sigcontext_addr;
|
||||
|
@ -756,7 +782,7 @@ extern void tdep_init (void);
|
|||
extern int tdep_search_unwind_table (unw_addr_space_t as, unw_word_t ip,
|
||||
unw_dyn_info_t *di, unw_proc_info_t *pi,
|
||||
int need_unwind_info, void *arg);
|
||||
extern void *tdep_uc_addr (ucontext_t *uc, int reg);
|
||||
extern void *tdep_uc_addr (unw_context_t *uc, int reg);
|
||||
extern int tdep_get_elf_image (struct elf_image *ei, pid_t pid, unw_word_t ip,
|
||||
unsigned long *segbase, unsigned long *mapoff);
|
||||
extern int tdep_access_reg (struct cursor *c, unw_regnum_t reg,
|
||||
|
|
297
src/racket/src/unwind/os-linux.h
Normal file
297
src/racket/src/unwind/os-linux.h
Normal file
|
@ -0,0 +1,297 @@
|
|||
/* libunwind - a platform-independent unwind library
|
||||
Copyright (C) 2003-2004 Hewlett-Packard Co
|
||||
Copyright (C) 2007 David Mosberger-Tang
|
||||
Contributed by David Mosberger-Tang <dmosberger@gmail.com>
|
||||
|
||||
This file is part of libunwind.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
|
||||
#ifndef os_linux_h
|
||||
#define os_linux_h
|
||||
|
||||
struct map_iterator
|
||||
{
|
||||
off_t offset;
|
||||
int fd;
|
||||
size_t buf_size;
|
||||
char *buf;
|
||||
char *buf_end;
|
||||
char *path;
|
||||
};
|
||||
|
||||
static inline char *
|
||||
ltoa (char *buf, long val)
|
||||
{
|
||||
char *cp = buf, tmp;
|
||||
ssize_t i, len;
|
||||
|
||||
do
|
||||
{
|
||||
*cp++ = '0' + (val % 10);
|
||||
val /= 10;
|
||||
}
|
||||
while (val);
|
||||
|
||||
/* reverse the order of the digits: */
|
||||
len = cp - buf;
|
||||
--cp;
|
||||
for (i = 0; i < len / 2; ++i)
|
||||
{
|
||||
tmp = buf[i];
|
||||
buf[i] = cp[-i];
|
||||
cp[-i] = tmp;
|
||||
}
|
||||
return buf + len;
|
||||
}
|
||||
|
||||
static inline int
|
||||
maps_init (struct map_iterator *mi, pid_t pid)
|
||||
{
|
||||
char path[sizeof ("/proc/0123456789/maps")], *cp;
|
||||
|
||||
memcpy (path, "/proc/", 6);
|
||||
cp = ltoa (path + 6, pid);
|
||||
assert (cp + 6 < path + sizeof (path));
|
||||
memcpy (cp, "/maps", 6);
|
||||
|
||||
mi->fd = open (path, O_RDONLY);
|
||||
if (mi->fd >= 0)
|
||||
{
|
||||
/* Try to allocate a page-sized buffer. */
|
||||
mi->buf_size = getpagesize ();
|
||||
cp = mmap (NULL, mi->buf_size, PROT_READ | PROT_WRITE,
|
||||
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
|
||||
if (cp == MAP_FAILED)
|
||||
{
|
||||
close(mi->fd);
|
||||
mi->fd = -1;
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
mi->offset = 0;
|
||||
mi->buf = mi->buf_end = cp + mi->buf_size;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
static inline char *
|
||||
skip_whitespace (char *cp)
|
||||
{
|
||||
if (!cp)
|
||||
return NULL;
|
||||
|
||||
while (*cp == ' ' || *cp == '\t')
|
||||
++cp;
|
||||
return cp;
|
||||
}
|
||||
|
||||
static inline char *
|
||||
scan_hex (char *cp, unsigned long *valp)
|
||||
{
|
||||
unsigned long num_digits = 0, digit, val = 0;
|
||||
|
||||
cp = skip_whitespace (cp);
|
||||
if (!cp)
|
||||
return NULL;
|
||||
|
||||
while (1)
|
||||
{
|
||||
digit = *cp;
|
||||
if ((digit - '0') <= 9)
|
||||
digit -= '0';
|
||||
else if ((digit - 'a') < 6)
|
||||
digit -= 'a' - 10;
|
||||
else if ((digit - 'A') < 6)
|
||||
digit -= 'A' - 10;
|
||||
else
|
||||
break;
|
||||
val = (val << 4) | digit;
|
||||
++num_digits;
|
||||
++cp;
|
||||
}
|
||||
if (!num_digits)
|
||||
return NULL;
|
||||
*valp = val;
|
||||
return cp;
|
||||
}
|
||||
|
||||
static inline char *
|
||||
scan_dec (char *cp, unsigned long *valp)
|
||||
{
|
||||
unsigned long num_digits = 0, digit, val = 0;
|
||||
|
||||
if (!(cp = skip_whitespace (cp)))
|
||||
return NULL;
|
||||
|
||||
while (1)
|
||||
{
|
||||
digit = *cp;
|
||||
if ((digit - '0') <= 9)
|
||||
{
|
||||
digit -= '0';
|
||||
++cp;
|
||||
}
|
||||
else
|
||||
break;
|
||||
val = (10 * val) + digit;
|
||||
++num_digits;
|
||||
}
|
||||
if (!num_digits)
|
||||
return NULL;
|
||||
*valp = val;
|
||||
return cp;
|
||||
}
|
||||
|
||||
static inline char *
|
||||
scan_char (char *cp, char *valp)
|
||||
{
|
||||
if (!cp)
|
||||
return NULL;
|
||||
|
||||
*valp = *cp;
|
||||
|
||||
/* don't step over NUL terminator */
|
||||
if (*cp)
|
||||
++cp;
|
||||
return cp;
|
||||
}
|
||||
|
||||
/* Scan a string delimited by white-space. Fails on empty string or
|
||||
if string is doesn't fit in the specified buffer. */
|
||||
static inline char *
|
||||
scan_string (char *cp, char *valp, size_t buf_size)
|
||||
{
|
||||
size_t i = 0;
|
||||
|
||||
if (!(cp = skip_whitespace (cp)))
|
||||
return NULL;
|
||||
|
||||
while (*cp != ' ' && *cp != '\t' && *cp != '\0')
|
||||
{
|
||||
if ((valp != NULL) && (i < buf_size - 1))
|
||||
valp[i++] = *cp;
|
||||
++cp;
|
||||
}
|
||||
if (i == 0 || i >= buf_size)
|
||||
return NULL;
|
||||
valp[i] = '\0';
|
||||
return cp;
|
||||
}
|
||||
|
||||
static inline int
|
||||
maps_next (struct map_iterator *mi,
|
||||
unsigned long *low, unsigned long *high, unsigned long *offset)
|
||||
{
|
||||
char perm[16], dash = 0, colon = 0, *cp;
|
||||
unsigned long major, minor, inum;
|
||||
ssize_t i, nread;
|
||||
|
||||
if (mi->fd < 0)
|
||||
return 0;
|
||||
|
||||
while (1)
|
||||
{
|
||||
ssize_t bytes_left = mi->buf_end - mi->buf;
|
||||
char *eol = NULL;
|
||||
|
||||
for (i = 0; i < bytes_left; ++i)
|
||||
{
|
||||
if (mi->buf[i] == '\n')
|
||||
{
|
||||
eol = mi->buf + i;
|
||||
break;
|
||||
}
|
||||
else if (mi->buf[i] == '\0')
|
||||
break;
|
||||
}
|
||||
if (!eol)
|
||||
{
|
||||
/* copy down the remaining bytes, if any */
|
||||
if (bytes_left > 0)
|
||||
memmove (mi->buf_end - mi->buf_size, mi->buf, bytes_left);
|
||||
|
||||
mi->buf = mi->buf_end - mi->buf_size;
|
||||
nread = read (mi->fd, mi->buf + bytes_left,
|
||||
mi->buf_size - bytes_left);
|
||||
if (nread <= 0)
|
||||
return 0;
|
||||
else if ((size_t) (nread + bytes_left) < mi->buf_size)
|
||||
{
|
||||
/* Move contents to the end of the buffer so we
|
||||
maintain the invariant that all bytes between
|
||||
mi->buf and mi->buf_end are valid. */
|
||||
memmove (mi->buf_end - nread - bytes_left, mi->buf,
|
||||
nread + bytes_left);
|
||||
mi->buf = mi->buf_end - nread - bytes_left;
|
||||
}
|
||||
|
||||
eol = mi->buf + bytes_left + nread - 1;
|
||||
|
||||
for (i = bytes_left; i < bytes_left + nread; ++i)
|
||||
if (mi->buf[i] == '\n')
|
||||
{
|
||||
eol = mi->buf + i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
cp = mi->buf;
|
||||
mi->buf = eol + 1;
|
||||
*eol = '\0';
|
||||
|
||||
/* scan: "LOW-HIGH PERM OFFSET MAJOR:MINOR INUM PATH" */
|
||||
cp = scan_hex (cp, low);
|
||||
cp = scan_char (cp, &dash);
|
||||
cp = scan_hex (cp, high);
|
||||
cp = scan_string (cp, perm, sizeof (perm));
|
||||
cp = scan_hex (cp, offset);
|
||||
cp = scan_hex (cp, &major);
|
||||
cp = scan_char (cp, &colon);
|
||||
cp = scan_hex (cp, &minor);
|
||||
cp = scan_dec (cp, &inum);
|
||||
cp = mi->path = skip_whitespace (cp);
|
||||
if (!cp)
|
||||
continue;
|
||||
cp = scan_string (cp, NULL, 0);
|
||||
if (dash != '-' || colon != ':')
|
||||
continue; /* skip line with unknown or bad format */
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void
|
||||
maps_close (struct map_iterator *mi)
|
||||
{
|
||||
if (mi->fd < 0)
|
||||
return;
|
||||
close (mi->fd);
|
||||
mi->fd = -1;
|
||||
if (mi->buf)
|
||||
{
|
||||
munmap (mi->buf_end - mi->buf_size, mi->buf_size);
|
||||
mi->buf = mi->buf_end = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* os_linux_h */
|
Loading…
Reference in New Issue
Block a user