From adaf67929aaec4b26c230bca88b32fb32b7103c6 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Mon, 30 Jan 2006 19:22:10 +0000 Subject: [PATCH] v301.4 svn: r2046 --- src/mzscheme/cmdline.inc | 12 +- src/mzscheme/gc2/Makefile.in | 2 +- src/mzscheme/include/mzscheme.exp | 2 + src/mzscheme/include/mzscheme3m.exp | 2 + src/mzscheme/include/mzwin.def | 2 + src/mzscheme/include/scheme.h | 47 +- src/mzscheme/sconfig.h | 44 +- src/mzscheme/src/Makefile.in | 6 + src/mzscheme/src/bool.c | 10 +- src/mzscheme/src/char.c | 6 +- src/mzscheme/src/codetab.inc | 334 + src/mzscheme/src/cstartup.inc | 5427 +++++++++-------- src/mzscheme/src/env.c | 8 +- src/mzscheme/src/error.c | 22 +- src/mzscheme/src/eval.c | 544 +- src/mzscheme/src/fun.c | 273 +- src/mzscheme/src/jit.c | 3595 +++++++++++ src/mzscheme/src/lightning/README | 10 + src/mzscheme/src/lightning/i386/asm-common.h | 197 + src/mzscheme/src/lightning/i386/asm.h | 1062 ++++ src/mzscheme/src/lightning/i386/core-common.h | 626 ++ src/mzscheme/src/lightning/i386/core.h | 413 ++ src/mzscheme/src/lightning/i386/fp-common.h | 86 + src/mzscheme/src/lightning/i386/fp.h | 347 ++ .../src/lightning/i386/funcs-common.h | 54 + src/mzscheme/src/lightning/i386/funcs.h | 91 + src/mzscheme/src/lightning/lightning.h | 75 + src/mzscheme/src/lightning/ppc/asm-common.h | 197 + src/mzscheme/src/lightning/ppc/asm.h | 647 ++ src/mzscheme/src/lightning/ppc/core-common.h | 626 ++ src/mzscheme/src/lightning/ppc/core.h | 299 + src/mzscheme/src/lightning/ppc/fp-common.h | 86 + src/mzscheme/src/lightning/ppc/fp.h | 211 + src/mzscheme/src/lightning/ppc/funcs-common.h | 54 + src/mzscheme/src/lightning/ppc/funcs.h | 168 + src/mzscheme/src/list.c | 444 +- src/mzscheme/src/module.c | 112 +- src/mzscheme/src/mzmark.c | 14 + src/mzscheme/src/mzmarksrc.c | 7 + src/mzscheme/src/numarith.c | 42 +- src/mzscheme/src/port.c | 8 +- src/mzscheme/src/portfun.c | 384 +- src/mzscheme/src/print.c | 33 +- src/mzscheme/src/read.c | 3 +- src/mzscheme/src/schemef.h | 6 +- src/mzscheme/src/schemex.h | 6 +- src/mzscheme/src/schemex.inc | 2 + src/mzscheme/src/schemexm.h | 2 + src/mzscheme/src/schmach.h | 3 + src/mzscheme/src/schminc.h | 2 +- src/mzscheme/src/schnapp.inc | 70 + src/mzscheme/src/schpriv.h | 91 +- src/mzscheme/src/schvers.h | 6 +- src/mzscheme/src/setjmpup.c | 8 + src/mzscheme/src/startup.inc | 13 +- src/mzscheme/src/startup.ss | 14 +- src/mzscheme/src/string.c | 518 +- src/mzscheme/src/stxobj.c | 90 +- src/mzscheme/src/stypes.h | 315 +- src/mzscheme/src/symbol.c | 39 +- src/mzscheme/src/syntax.c | 349 +- src/mzscheme/src/thread.c | 34 +- src/mzscheme/src/type.c | 1 + src/mzscheme/src/vector.c | 54 +- src/mzscheme/utils/xctocc | 6 +- src/worksp-vc70/libmzsch/libmzsch.vcproj | 3 + src/worksp/libmzsch/libmzsch.vcproj | 3 + src/wxwindow/include/msw/wx_item.h | 2 +- src/wxwindow/src/msw/wx_gbox.cxx | 2 +- src/wxwindow/src/msw/wx_item.cxx | 8 +- src/wxwindow/src/msw/wx_lbox.cxx | 4 +- src/wxwindow/src/msw/wx_messg.cxx | 2 +- src/wxwindow/src/msw/wx_tabc.cxx | 2 +- 73 files changed, 14483 insertions(+), 3804 deletions(-) create mode 100644 src/mzscheme/src/codetab.inc create mode 100644 src/mzscheme/src/jit.c create mode 100644 src/mzscheme/src/lightning/README create mode 100644 src/mzscheme/src/lightning/i386/asm-common.h create mode 100644 src/mzscheme/src/lightning/i386/asm.h create mode 100644 src/mzscheme/src/lightning/i386/core-common.h create mode 100644 src/mzscheme/src/lightning/i386/core.h create mode 100644 src/mzscheme/src/lightning/i386/fp-common.h create mode 100644 src/mzscheme/src/lightning/i386/fp.h create mode 100644 src/mzscheme/src/lightning/i386/funcs-common.h create mode 100644 src/mzscheme/src/lightning/i386/funcs.h create mode 100644 src/mzscheme/src/lightning/lightning.h create mode 100644 src/mzscheme/src/lightning/ppc/asm-common.h create mode 100644 src/mzscheme/src/lightning/ppc/asm.h create mode 100644 src/mzscheme/src/lightning/ppc/core-common.h create mode 100644 src/mzscheme/src/lightning/ppc/core.h create mode 100644 src/mzscheme/src/lightning/ppc/fp-common.h create mode 100644 src/mzscheme/src/lightning/ppc/fp.h create mode 100644 src/mzscheme/src/lightning/ppc/funcs-common.h create mode 100644 src/mzscheme/src/lightning/ppc/funcs.h create mode 100644 src/mzscheme/src/schnapp.inc diff --git a/src/mzscheme/cmdline.inc b/src/mzscheme/cmdline.inc index b2e2d4847e..016fa2fb17 100644 --- a/src/mzscheme/cmdline.inc +++ b/src/mzscheme/cmdline.inc @@ -733,6 +733,8 @@ static int run_from_cmd_line(int argc, char *_argv[], argv[0] = "-v"; else if (!strcmp("--no-init-file", argv[0])) argv[0] = "-q"; + else if (!strcmp("--no-jit", argv[0])) + argv[0] = "-j"; else if (!strcmp("--no-argv", argv[0])) argv[0] = "-A"; else if (!strcmp("--mute-banner", argv[0])) @@ -955,6 +957,9 @@ static int run_from_cmd_line(int argc, char *_argv[], case '-': no_more_switches = 1; break; + case 'j': + scheme_set_startup_use_jit(0); + break; case 'b': scheme_set_binary_mode_stdio(1); break; @@ -1021,7 +1026,7 @@ static int run_from_cmd_line(int argc, char *_argv[], #endif } #endif /* DONT_PARSE_COMMAND_LINE */ - + global_env = mk_basic_env(); sch_argv = scheme_make_vector(argc, NULL); @@ -1127,6 +1132,11 @@ static int run_from_cmd_line(int argc, char *_argv[], " -x, --no-lib-path : Skips trying to set current-library-collection-paths.\n" " -q, --no-init-file : Skips trying to load " INIT_FILENAME ".\n" " -A : Skips defining `argv' and `program'.\n" +# ifdef MZ_USE_JIT + " -j, --no-jit : Disables just-in-time compiler.\n" +# else + " -j, --no-jit : No effect, since the just-in-time compiler is unavailable.\n" +# endif " Language setting switches:\n" " -g, --case-sens : Identifiers/symbols are initially case-sensitive.\n" " -G, --case-insens : Identifiers/symbols are initially case-insensitive.\n" diff --git a/src/mzscheme/gc2/Makefile.in b/src/mzscheme/gc2/Makefile.in index d5bbe8d2ba..9d1c00677f 100644 --- a/src/mzscheme/gc2/Makefile.in +++ b/src/mzscheme/gc2/Makefile.in @@ -175,7 +175,7 @@ $(XSRCDIR)/sema.c: ../src/sema.@LTO@ $(XFORMDEP) $(XSRCDIR)/setjmpup.c: ../src/setjmpup.@LTO@ $(XFORMDEP) $(XFORM) $(XSRCDIR)/setjmpup.c $(SRCDIR)/setjmpup.c $(XSRCDIR)/string.c: ../src/string.@LTO@ $(XFORMDEP) - $(XFORM_SETUP) --cpp "$(CPP) -I$(OBJDIR) $(CPPFLAGS)" -o $(XSRCDIR)/string.c $(SRCDIR)/string.c + $(XFORM_SETUP) --cpp "$(CPP) -I../src $(CPPFLAGS)" -o $(XSRCDIR)/string.c $(SRCDIR)/string.c $(XSRCDIR)/struct.c: ../src/struct.@LTO@ $(XFORMDEP) $(XFORM) $(XSRCDIR)/struct.c $(SRCDIR)/struct.c $(XSRCDIR)/stxobj.c: ../src/stxobj.@LTO@ $(XFORMDEP) diff --git a/src/mzscheme/include/mzscheme.exp b/src/mzscheme/include/mzscheme.exp index c9cb0b8ac8..041a38a9b8 100644 --- a/src/mzscheme/include/mzscheme.exp +++ b/src/mzscheme/include/mzscheme.exp @@ -128,6 +128,7 @@ scheme_tail_apply_to_list scheme_tail_eval_expr scheme_set_tail_buffer_size scheme_force_value +scheme_force_one_value scheme_set_cont_mark scheme_push_continuation_frame scheme_pop_continuation_frame @@ -183,6 +184,7 @@ scheme_make_noneternal_prim scheme_make_closed_prim scheme_make_prim_w_arity scheme_make_folding_prim +scheme_make_noncm_prim scheme_make_noneternal_prim_w_arity scheme_make_closed_prim_w_arity scheme_make_folding_closed_prim diff --git a/src/mzscheme/include/mzscheme3m.exp b/src/mzscheme/include/mzscheme3m.exp index a298c39fc4..8d782dc014 100644 --- a/src/mzscheme/include/mzscheme3m.exp +++ b/src/mzscheme/include/mzscheme3m.exp @@ -128,6 +128,7 @@ scheme_tail_apply_to_list scheme_tail_eval_expr scheme_set_tail_buffer_size scheme_force_value +scheme_force_one_value scheme_set_cont_mark scheme_push_continuation_frame scheme_pop_continuation_frame @@ -190,6 +191,7 @@ scheme_make_noneternal_prim scheme_make_closed_prim scheme_make_prim_w_arity scheme_make_folding_prim +scheme_make_noncm_prim scheme_make_noneternal_prim_w_arity scheme_make_closed_prim_w_arity scheme_make_folding_closed_prim diff --git a/src/mzscheme/include/mzwin.def b/src/mzscheme/include/mzwin.def index 7775f6aa7a..025ea89bd6 100644 --- a/src/mzscheme/include/mzwin.def +++ b/src/mzscheme/include/mzwin.def @@ -124,6 +124,7 @@ EXPORTS scheme_tail_eval_expr scheme_set_tail_buffer_size scheme_force_value + scheme_force_one_value scheme_set_cont_mark scheme_push_continuation_frame scheme_pop_continuation_frame @@ -175,6 +176,7 @@ EXPORTS scheme_make_closed_prim scheme_make_prim_w_arity scheme_make_folding_prim + scheme_make_noncm_prim scheme_make_noneternal_prim_w_arity scheme_make_closed_prim_w_arity scheme_make_folding_closed_prim diff --git a/src/mzscheme/include/scheme.h b/src/mzscheme/include/scheme.h index 9588ac5768..58fe5d277a 100644 --- a/src/mzscheme/include/scheme.h +++ b/src/mzscheme/include/scheme.h @@ -156,6 +156,12 @@ typedef struct FSSpec mzFSSpec; #define MZ_EXTERN extern MZ_DLLSPEC +#ifndef MZ_PRECISE_GC +# if defined(MZ_USE_JIT_PPC) || defined(MZ_USE_JIT_I386) +# define MZ_USE_JIT +# endif +#endif + /* Define _W64 for MSC if needed. */ #if defined(_MSC_VER) && !defined(_W64) # if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 @@ -574,6 +580,7 @@ typedef void (*Scheme_Type_Printer)(Scheme_Object *v, int for_display, Scheme_Pr #define SCHEME_PRIM_IS_USER_PARAMETER 1024 #define SCHEME_PRIM_IS_METHOD 2048 #define SCHEME_PRIM_IS_POST_DATA 4096 +#define SCHEME_PRIM_IS_NONCM 8192 typedef struct Scheme_Object * (Scheme_Prim)(int argc, struct Scheme_Object *argv[]); @@ -705,7 +712,7 @@ typedef struct { /* ------------------------------------------------- */ -#define SCHEME_PROCP(obj) (!SCHEME_INTP(obj) && ((_SCHEME_TYPE(obj) >= scheme_prim_type) && (_SCHEME_TYPE(obj) <= scheme_proc_struct_type))) +#define SCHEME_PROCP(obj) (!SCHEME_INTP(obj) && ((_SCHEME_TYPE(obj) >= scheme_prim_type) && (_SCHEME_TYPE(obj) <= scheme_native_closure_type))) #define SCHEME_SYNTAXP(obj) SAME_TYPE(SCHEME_TYPE(obj), scheme_syntax_compiler_type) #define SCHEME_PRIMP(obj) SAME_TYPE(SCHEME_TYPE(obj), scheme_prim_type) #define SCHEME_CLSD_PRIMP(obj) SAME_TYPE(SCHEME_TYPE(obj), scheme_closed_prim_type) @@ -780,14 +787,21 @@ typedef long mz_pre_jmp_buf[8]; # define mz_pre_jmp_buf jmp_buf #endif +#ifdef MZ_USE_JIT +typedef struct { mz_pre_jmp_buf jb; void *stack_frame; } mz_one_jit_jmp_buf; +typedef mz_one_jit_jmp_buf mz_jit_jmp_buf[1]; +#else +# define mz_jit_jmp_buf mz_pre_jmp_buf +#endif + #ifdef MZ_PRECISE_GC typedef struct { - mz_pre_jmp_buf jb; + mz_jit_jmp_buf jb; long gcvs; /* declared as `long' so it isn't pushed when on the stack! */ long gcvs_cnt; } mz_jmp_buf; #else -# define mz_jmp_buf mz_pre_jmp_buf +# define mz_jmp_buf mz_jit_jmp_buf #endif /* Like setjmp & longjmp, but you can jmp to a deeper stack position */ @@ -877,6 +891,11 @@ typedef struct Scheme_Thread { struct Scheme_Saved_Stack *runstack_saved; Scheme_Object **runstack_tmp_keep; + /* in case of bouncing, we keep a recently + released runstack; it's dropped on GC, though */ + Scheme_Object **spare_runstack; + long spare_runstack_size; + struct Scheme_Thread **runstack_owner; struct Scheme_Saved_Stack *runstack_swapped; @@ -930,6 +949,8 @@ typedef struct Scheme_Thread { Scheme_Object *(*overflow_k)(void); Scheme_Object *overflow_reply; + /* content of tail_buffer is zeroed on GC, unless + runstack_tmp_keep is set to tail_buffer */ Scheme_Object **tail_buffer; int tail_buffer_size; @@ -1067,6 +1088,7 @@ enum { MZCONFIG_ERROR_ESCAPE_HANDLER, MZCONFIG_ALLOW_SET_UNDEFINED, + MZCONFIG_USE_JIT, MZCONFIG_CUSTODIAN, MZCONFIG_INSPECTOR, @@ -1350,18 +1372,27 @@ MZ_EXTERN Scheme_Object *scheme_eval_waiting; # endif #endif +#ifdef MZ_USE_JIT +MZ_EXTERN void scheme_jit_longjmp(mz_jit_jmp_buf b, int v); +MZ_EXTERN void scheme_jit_setjmp_prepare(mz_jit_jmp_buf b); +# define scheme_jit_setjmp(b) (scheme_jit_setjmp_prepare(b), scheme_mz_setjmp((b)->jb)) +#else +# define scheme_jit_longjmp(b, v) scheme_mz_longjmp(b, v) +# define scheme_jit_setjmp(b) scheme_mz_setjmp(b) +#endif + #ifdef MZ_PRECISE_GC /* Need to make sure that a __gc_var_stack__ is always available where setjmp & longjmp are used. */ # define scheme_longjmp(b, v) (((long *)(void*)((b).gcvs))[1] = (b).gcvs_cnt, \ GC_variable_stack = (void **)(void*)(b).gcvs, \ - scheme_mz_longjmp((b).jb, v)) + scheme_jit_longjmp((b).jb, v)) # define scheme_setjmp(b) ((b).gcvs = (long)__gc_var_stack__, \ (b).gcvs_cnt = (long)(__gc_var_stack__[1]), \ - scheme_mz_setjmp((b).jb)) + scheme_jit_setjmp((b).jb)) #else -# define scheme_longjmp(b, v) scheme_mz_longjmp(b, v) -# define scheme_setjmp(b) scheme_mz_setjmp(b) +# define scheme_longjmp(b, v) scheme_jit_longjmp(b, v) +# define scheme_setjmp(b) scheme_jit_setjmp(b) #endif /*========================================================================*/ @@ -1487,10 +1518,12 @@ MZ_EXTERN int scheme_curly_braces_are_parens; /* Defaults to 1 */ MZ_EXTERN int scheme_hash_percent_syntax_only; /* Defaults to 0 */ MZ_EXTERN int scheme_hash_percent_globals_only; /* Defaults to 0 */ MZ_EXTERN int scheme_binary_mode_stdio; /* Windows-MacOS-specific. Defaults to 0 */ +MZ_EXTERN int scheme_startup_use_jit; MZ_EXTERN void scheme_set_case_sensitive(int); MZ_EXTERN void scheme_set_allow_set_undefined(int); MZ_EXTERN void scheme_set_binary_mode_stdio(int); +MZ_EXTERN void scheme_set_startup_use_jit(int); MZ_EXTERN int scheme_get_allow_set_undefined(); diff --git a/src/mzscheme/sconfig.h b/src/mzscheme/sconfig.h index a18c45b27a..24ce5dae94 100644 --- a/src/mzscheme/sconfig.h +++ b/src/mzscheme/sconfig.h @@ -134,6 +134,10 @@ # define FLUSH_SPARC_REGISTER_WINDOWS # endif +#ifdef i386 +# define MZ_USE_JIT_I386 +#endif + # define FLAGS_ALREADY_SET #endif @@ -238,6 +242,13 @@ # define FLAGS_ALREADY_SET +#if defined(i386) +# define MZ_USE_JIT_I386 +#endif +#if defined(powerpc) +# define MZ_USE_JIT_PPC +#endif + #endif /********************* NetBSD ***********************/ @@ -267,6 +278,13 @@ # define USE_DIVIDE_MAKE_INFINITY #endif +#if defined(i386) +# define MZ_USE_JIT_I386 +#endif +#if defined(powerpc) +# define MZ_USE_JIT_PPC +#endif + # define FLAGS_ALREADY_SET #endif @@ -298,6 +316,8 @@ # define USE_TM_GMTOFF_FIELD +# define MZ_USE_JIT_I386 + # define FLAGS_ALREADY_SET #endif @@ -333,6 +353,8 @@ # define REGISTER_POOR_MACHINE +# define MZ_USE_JIT_I386 + # define FLAGS_ALREADY_SET #endif @@ -566,6 +588,8 @@ # define USE_ICONV_DLL # define NO_MBTOWC_FUNCTIONS +# define MZ_USE_JIT_I386 + # define FLAGS_ALREADY_SET #endif @@ -611,13 +635,15 @@ # define LINK_EXTENSIONS_BY_TABLE +# define MZ_USE_JIT_I386 + # define FLAGS_ALREADY_SET #endif /************** Mac OS X ****************/ -# if (defined(__APPLE__) && defined(__ppc__) && defined(__MACH__)) || defined(OS_X) +# if defined(OS_X) || defined(XONX) #ifdef XONX # define SCHEME_PLATFORM_LIBRARY_SUBPATH "ppc-darwin" @@ -658,6 +684,12 @@ # define OS_X 1 # endif +#ifdef __POWERPC__ +# define MZ_USE_JIT_PPC +#else +# define MZ_USE_JIT_I386 +#endif + # define FLAGS_ALREADY_SET #endif @@ -681,6 +713,8 @@ # define FLAGS_ALREADY_SET +# define MZ_USE_JIT_I386 + # endif /************ Macintosh with CodeWarrior (not OS X) *************/ @@ -1271,6 +1305,14 @@ MzScheme is itself a shared library instead of embedded in an application */ + /***********************/ + /* JIT */ +/***********************/ + + /* MZ_USE_JIT_I386 enables the JIT for x86 */ + + /* MZ_USE_JIT_PPC enables the JIT for PowerPC */ + /***********************/ /* Heap Images */ /***********************/ diff --git a/src/mzscheme/src/Makefile.in b/src/mzscheme/src/Makefile.in index 35051d92da..32f5856f58 100644 --- a/src/mzscheme/src/Makefile.in +++ b/src/mzscheme/src/Makefile.in @@ -29,6 +29,7 @@ OBJS = salloc.@LTO@ \ gmp.@LTO@ \ hash.@LTO@ \ image.@LTO@ \ + jit.@LTO@ \ list.@LTO@ \ module.@LTO@ \ network.@LTO@ \ @@ -68,6 +69,7 @@ SRCS = $(srcdir)/salloc.c \ $(srcdir)/gmp/gmp.c \ $(srcdir)/hash.c \ $(srcdir)/image.c \ + $(srcdir)/jit.c \ $(srcdir)/list.c \ $(srcdir)/module.c \ $(srcdir)/network.c \ @@ -169,6 +171,8 @@ hash.@LTO@: $(srcdir)/hash.c $(CC) $(CFLAGS) -c $(srcdir)/hash.c -o hash.@LTO@ image.@LTO@: $(srcdir)/image.c $(CC) $(CFLAGS) -c $(srcdir)/image.c -o image.@LTO@ +jit.@LTO@: $(srcdir)/jit.c + $(CC) $(CFLAGS) -c $(srcdir)/jit.c -o jit.@LTO@ list.@LTO@: $(srcdir)/list.c $(CC) $(CFLAGS) -c $(srcdir)/list.c -o list.@LTO@ module.@LTO@: $(srcdir)/module.c @@ -253,6 +257,8 @@ hash.@LTO@: $(srcdir)/schpriv.h $(srcdir)/schexn.h $(SCONFIG) $(srcdir)/../inclu $(srcdir)/../src/stypes.h image.@LTO@: $(srcdir)/schpriv.h $(srcdir)/schexn.h $(SCONFIG) $(srcdir)/../include/scheme.h \ $(srcdir)/../src/stypes.h $(srcdir)/schvers.h +jit.@LTO@: $(srcdir)/schpriv.h $(srcdir)/schexn.h $(SCONFIG) $(srcdir)/../include/scheme.h \ + $(srcdir)/../src/stypes.h $(srcdir)/schvers.h $(srcdir)/codetab.inc list.@LTO@: $(srcdir)/schpriv.h $(srcdir)/schexn.h $(SCONFIG) $(srcdir)/../include/scheme.h \ $(srcdir)/../src/stypes.h module.@LTO@: $(srcdir)/schpriv.h $(srcdir)/schexn.h $(SCONFIG) $(srcdir)/../include/scheme.h \ diff --git a/src/mzscheme/src/bool.c b/src/mzscheme/src/bool.c index 53df82c4d0..a7dd5a5560 100644 --- a/src/mzscheme/src/bool.c +++ b/src/mzscheme/src/bool.c @@ -36,6 +36,7 @@ Scheme_Object scheme_true[1]; Scheme_Object scheme_false[1]; Scheme_Object *scheme_not_prim; +Scheme_Object *scheme_eq_prim; /* locals */ static Scheme_Object *not_prim (int argc, Scheme_Object *argv[]); @@ -57,6 +58,7 @@ void scheme_init_true_false(void) void scheme_init_bool (Scheme_Env *env) { REGISTER_SO(scheme_not_prim); + REGISTER_SO(scheme_eq_prim); scheme_not_prim = scheme_make_folding_prim(not_prim, "not", 1, 1, 1); @@ -66,11 +68,9 @@ void scheme_init_bool (Scheme_Env *env) "boolean?", 1, 1, 1), env); - scheme_add_global_constant("eq?", - scheme_make_folding_prim(eq_prim, - "eq?", - 2, 2, 1), - env); + + scheme_eq_prim = scheme_make_folding_prim(eq_prim, "eq?", 2, 2, 1); + scheme_add_global_constant("eq?", scheme_eq_prim, env); scheme_add_global_constant("eqv?", scheme_make_folding_prim(eqv_prim, "eqv?", diff --git a/src/mzscheme/src/char.c b/src/mzscheme/src/char.c index ae23a7ccae..47e095e724 100644 --- a/src/mzscheme/src/char.c +++ b/src/mzscheme/src/char.c @@ -237,9 +237,9 @@ void scheme_init_char (Scheme_Env *env) env); scheme_add_global_constant("make-known-char-range-list", - scheme_make_prim_w_arity(char_map_list, - "make-known-char-range-list", - 0, 0), + scheme_make_noncm_prim(char_map_list, + "make-known-char-range-list", + 0, 0), env); } diff --git a/src/mzscheme/src/codetab.inc b/src/mzscheme/src/codetab.inc new file mode 100644 index 0000000000..7157dec924 --- /dev/null +++ b/src/mzscheme/src/codetab.inc @@ -0,0 +1,334 @@ + +/* Implementation of the "symbol table" for mapping code + pointers to function names. */ + +#ifdef USE_SENORA_GC +# define GC_is_marked(p) GC_base(p) +#else +extern MZ_DLLIMPORT int GC_is_marked(void *); +#endif + +#define LOG_KEY_SIZE 4 +#define KEY_MASK ((1 << LOG_KEY_SIZE) - 1) +#define KEY_COUNT (1 << LOG_KEY_SIZE) + +#define NODE_HEADER_SIZE 2 + +#define NODE_STARTS_OFFSET 1 +#define NODE_GCABLE_OFFSET 2 + +static void **tree; + +static int during_set; + +static void *find_symbol(unsigned long v) +{ + unsigned long k; + void **t = tree, *val; + int offset = (JIT_WORD_SIZE * 8); + + while (offset) { + if (!t) + return NULL; + offset -= LOG_KEY_SIZE; + k = ((v >> offset) & KEY_MASK) + NODE_HEADER_SIZE; + val = t[k]; + if (!val) + return NULL; + if (*(Scheme_Type *)val) + return val; + t = (void **)val; + } + + printf("Error: walked off end of tree\n"); + return NULL; +} + +static void add_symbol(unsigned long start, unsigned long end, void *value, int gc_able) +{ + unsigned long k1, k2, split_t_start = 0, split_t_end = 0, i; + int m; + int offset = (JIT_WORD_SIZE * 8), split_offset = 0; + void **t1, **t2, **split_t, *val1, *val2; + + if (!tree) { + REGISTER_SO(tree); + tree = (void **)scheme_malloc((KEY_COUNT + NODE_HEADER_SIZE) * sizeof(void *)); + } + + during_set++; + + t1 = t2 = tree; + split_t = NULL; + while (offset) { + offset -= LOG_KEY_SIZE; + + k1 = ((start >> offset) & KEY_MASK) + NODE_HEADER_SIZE; + if (offset) { + val1 = t1[k1]; + if (!val1) { + val1 = (void **)scheme_malloc((KEY_COUNT + NODE_HEADER_SIZE) * sizeof(void *)); + t1[k1] = val1; + } + } else + val1 = t1; + + k2 = ((end >> offset) & KEY_MASK) + NODE_HEADER_SIZE; + if (offset) { + /* Need to go deeper... */ + val2 = t2[k2]; + if (!val2) { + val2 = (void **)scheme_malloc((KEY_COUNT + NODE_HEADER_SIZE) * sizeof(void *)); + t2[k2] = val2; + } + } else + val2 = t2; + + if (!split_t && (val1 != val2)) { + split_t = t1; + split_t_start = k1; + split_t_end = k2; + split_offset = offset; + } + + t1 = val1; + t2 = val2; + } + + if (!split_t) { + /* assert: t1 == t2 */ + split_t = t1; + split_t_start = k1; + split_t_end = k2; + } + + /* Mark start bit: */ + m = (1 << (k1 - NODE_HEADER_SIZE)); + ((unsigned short *)t1)[NODE_STARTS_OFFSET] |= m; + if (gc_able) + ((unsigned short *)t1)[NODE_GCABLE_OFFSET] |= m; + + /* Fill in start and end: */ + t1[k1] = value; + t2[k2] = value; + /* Fill in range between branches: */ + for (i = split_t_start + 1; i < split_t_end; i++) { + split_t[i] = value; + } + /* Fill in places to right of start branches: */ + if (t1 != split_t) { + k1 = ((start >> split_offset) & KEY_MASK) + NODE_HEADER_SIZE; + t1 = split_t[k1]; + offset = split_offset; + while (offset) { + offset -= LOG_KEY_SIZE; + k1 = ((start >> offset) & KEY_MASK) + NODE_HEADER_SIZE; + for (i = k1 + 1; i < KEY_COUNT + NODE_HEADER_SIZE; i++) { + t1[i] = value; + } + t1 = t1[k1]; + } + } + /* Fill in places to left of end branch: */ + if (t2 != split_t) { + k2 = ((end >> split_offset) & KEY_MASK) + NODE_HEADER_SIZE; + t2 = split_t[k2]; + offset = split_offset; + while (offset) { + offset -= LOG_KEY_SIZE; + k2 = ((end >> offset) & KEY_MASK) + NODE_HEADER_SIZE; + for (i = NODE_HEADER_SIZE; i < k2; i++) { + t2[i] = value; + } + t2 = t2[k2]; + } + } + + --during_set; +} + +static int do_clear_symbols(void **t, int offset, unsigned long addr, int clearing) +{ + int i, m, j; + void *p, *val, **subt; + + /* Note: this function might be called (via a GC callback) + while add_symbol is running. */ + + for (i = 0; i < KEY_COUNT; i++) { + m = (1 << i); + if (((unsigned short *)t)[NODE_STARTS_OFFSET] & m) { + clearing = 0; + if (((unsigned short *)t)[NODE_GCABLE_OFFSET] & m) { + /* GCable pointer starts here */ + p = (void *)(addr + (i << offset)); + if (!GC_is_marked(p)) { + /* Collected... */ + ((unsigned short *)t)[NODE_STARTS_OFFSET] -= m; + ((unsigned short *)t)[NODE_GCABLE_OFFSET] -= m; + clearing = 1; + } + } + } + val = t[i + NODE_HEADER_SIZE]; + if (val) { + if (!*(Scheme_Type *)val) { + subt = (void **)val; + clearing = do_clear_symbols(subt, + offset - LOG_KEY_SIZE, + (addr + (i << offset)), + clearing); + if (!during_set) { + /* If the branch is empty, then drop it. */ + for (j = 0; j < KEY_COUNT; j++) { + if (subt[j + NODE_HEADER_SIZE]) + break; + } + if (j == KEY_COUNT) { + t[i + NODE_HEADER_SIZE] = NULL; + } + } + } else if (clearing) + t[i + NODE_HEADER_SIZE] = NULL; + } + } + + return clearing; +} + +static void clear_symbols_for_collected() +{ + if (tree) { + do_clear_symbols(tree, (JIT_WORD_SIZE * 8) - LOG_KEY_SIZE, 0, 0); + } +} + +/*============================================================*/ +/* testing */ +/*============================================================*/ + +#if 0 + +Scheme_Type a[] = {1}; +Scheme_Type b[] = {2}; +Scheme_Type c[] = {3}; + +static char *nameof(void *p) +{ + if (p == a) return "a"; + if (p == b) return "b"; + if (p == c) return "c"; + if (!p) return "NULL"; + return "?"; +} + +void *alt_gc; +void *gcs[3]; + +int GC_is_marked(void *p) +{ + if (alt_gc) { + if (p == alt_gc) + return 1; + else + return 0; + } else { + if ((p == gcs[0]) + || (p == gcs[1]) + || (p == gcs[2])) + return 0; + else + return 1; + } +} + +void check(int j, int delta, int i, void *expect, unsigned long addr) +{ + void *got; + + got = find_symbol(addr); + + if (i == 2) + expect = NULL; + + if (expect != got) + printf("(%d,%d,%d) Expected %s, found %s at %p\n", + j, delta, i, + nameof(expect), nameof(got), + addr); +} + +int main() +{ + int i, d, delta, j; + + for (j = 0; j < 2; j++) { + for (d = 0; d < 16; d++) { + delta = d; + for (i = 0; i < 3; i++) { + if (i != 1) + check(j, delta, 1, NULL, (delta + 0x12341234)); + if (!i) + add_symbol(delta + 0x12341200, delta + 0x12341234, a, 1); + check(j, delta, i, a, ((delta + 0x12341234))); + check(j, delta, i, a, ((delta + 0x12341200))); + check(j, delta, i, a, ((delta + 0x12341201))); + check(j, delta, i, a, ((delta + 0x12341210))); + check(j, delta, i, a, ((delta + 0x12341231))); + check(j, delta, i, a, ((delta + 0x12341200))); + + if (i != 1) + check(j, delta, i, NULL, ((delta + 0x12341236))); + if (!i) + add_symbol(delta + 0x12341236, delta + 0x12370000, b, 1); + check(j, delta, i, a, ((delta + 0x12341234))); + if (!i) + check(j, delta, i, NULL, ((delta + 0x12341235))); + check(j, delta, i, b, ((delta + 0x12341236))); + check(j, delta, i, b, ((delta + 0x12370000))); + check(j, delta, i, NULL, ((delta + 0x12370001))); + check(j, delta, i, b, ((delta + 0x12351236))); + check(j, delta, i, b, ((delta + 0x12350000))); + check(j, delta, i, b, ((delta + 0x12360000))); + + if (!i) { + check(j, delta, i, NULL, ((delta + 0x12341235))); + add_symbol(delta + 0x12341235, delta + 0x12341235, c, 1); + } + check(j, delta, i, a, ((delta + 0x12341234))); + check(j, delta, i == 2 ? 0 : i, c, ((delta + 0x12341235))); + check(j, delta, i, b, ((delta + 0x12341236))); + + if (!delta) { + if (!i && !j) { + check(j, delta, i, NULL, ((0x55556666))); + add_symbol(0x55556663, 0x55556669, a, 0); /* Not GCable */ + } + } + check(j, delta, 0, a, ((0x55556666))); + check(j, delta, 0, a, ((0x55556663))); + check(j, delta, 0, a, ((0x55556669))); + + if (i == 0) { + alt_gc = NULL; + gcs[0] = NULL; + gcs[1] = NULL; + gcs[2] = NULL; + } else { + if (0) + alt_gc = (void *)0x55556663; + gcs[0] = (void *)(delta + 0x12341200); + gcs[1] = (void *)(delta + 0x12341236); + if (i == 2) + gcs[2] = (void *)(delta + 0x12341235); + else + gcs[2] = NULL; + } + + clear_symbols_for_collected(); + } + } + } +} + +#endif diff --git a/src/mzscheme/src/cstartup.inc b/src/mzscheme/src/cstartup.inc index bedcd1ed45..bab0fab8d3 100644 --- a/src/mzscheme/src/cstartup.inc +++ b/src/mzscheme/src/cstartup.inc @@ -1,7 +1,7 @@ { - static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,48,46,51,37,252,205,4,159,32,20,96,158,16,1,20,23, -65,98,101,103,105,110,0,16,0,83,158,39,20,93,114,65,35,37,115,116,120, -1,29,2,11,11,10,10,10,32,80,158,32,32,20,96,158,16,16,30,3,2, + static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,49,46,52,37,252,205,4,159,32,20,97,158,16,1,20,23, +65,98,101,103,105,110,0,16,0,83,158,39,20,94,114,65,35,37,115,116,120, +1,29,2,11,11,10,10,10,32,80,158,32,32,20,97,158,16,16,30,3,2, 2,71,105,100,101,110,116,105,102,105,101,114,63,4,254,1,30,5,2,2,69, 115,116,120,45,110,117,108,108,63,6,254,1,30,7,2,2,71,115,116,120,45, 110,117,108,108,47,35,102,8,254,1,30,9,2,2,69,115,116,120,45,112,97, @@ -62,19 +62,19 @@ EVAL_ONE_SIZED_STR((char *)expr, 1241); } { - static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,48,46,51,90,252,39,10,159,32,20,96,158,16,1,20,23, -65,98,101,103,105,110,0,16,0,83,158,39,20,93,114,71,35,37,113,113,45, -97,110,100,45,111,114,1,29,2,11,11,10,10,10,32,80,158,32,32,20,96, + static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,49,46,52,90,252,39,10,159,32,20,97,158,16,1,20,23, +65,98,101,103,105,110,0,16,0,83,158,39,20,94,114,71,35,37,113,113,45, +97,110,100,45,111,114,1,29,2,11,11,10,10,10,32,80,158,32,32,20,97, 158,16,1,30,3,2,2,69,113,113,45,97,112,112,101,110,100,4,254,1,16, -0,11,11,16,1,2,4,33,11,16,3,70,113,117,97,115,105,113,117,111,116, -101,5,62,111,114,6,63,97,110,100,7,16,3,11,11,11,16,3,2,5,2, -6,2,7,32,35,95,16,5,93,2,5,27,83,160,41,32,33,38,27,83,160, +0,11,11,16,1,2,4,33,11,16,3,62,111,114,5,70,113,117,97,115,105, +113,117,111,116,101,6,63,97,110,100,7,16,3,11,11,11,16,3,2,5,2, +6,2,7,32,35,95,16,5,93,2,6,27,83,160,41,32,33,38,27,83,160, 41,33,34,38,27,83,160,41,34,35,38,89,162,32,33,48,9,226,3,0,1, -2,87,94,28,248,80,158,36,32,197,250,22,252,31,2,11,6,10,10,98,97, +2,87,94,28,248,80,158,36,32,197,250,22,252,32,2,11,6,10,10,98,97, 100,32,115,121,110,116,97,120,199,12,27,28,248,80,158,37,33,248,80,158,38, 34,199,28,248,80,158,37,35,248,80,158,38,34,248,80,158,39,34,200,248,80, -158,37,36,248,80,158,38,34,199,250,22,252,31,2,11,6,10,10,98,97,100, -32,115,121,110,116,97,120,200,250,22,252,31,2,11,6,10,10,98,97,100,32, +158,37,36,248,80,158,38,34,199,250,22,252,32,2,11,6,10,10,98,97,100, +32,115,121,110,116,97,120,200,250,22,252,32,2,11,6,10,10,98,97,100,32, 115,121,110,116,97,120,200,27,89,162,32,34,37,66,110,111,114,109,97,108,8, 223,5,28,249,22,252,5,2,195,196,28,248,80,158,33,35,194,83,160,41,35, 32,38,249,22,58,83,160,41,36,34,38,195,193,27,89,162,32,34,39,70,97, @@ -90,20 +90,20 @@ 248,80,158,41,36,202,28,28,28,248,80,158,41,32,193,249,22,222,194,200,11, 248,80,158,41,37,202,11,27,248,80,158,42,34,203,87,94,28,27,248,22,252, 3,2,248,80,158,44,33,195,28,192,192,248,22,252,3,2,248,80,158,44,35, -248,80,158,45,34,196,251,22,252,31,2,67,117,110,113,117,111,116,101,12,6, +248,80,158,45,34,196,251,22,252,32,2,67,117,110,113,117,111,116,101,12,6, 30,30,101,120,112,101,99,116,115,32,101,120,97,99,116,108,121,32,111,110,101, 32,101,120,112,114,101,115,115,105,111,110,202,206,12,28,248,22,185,204,248,80, 158,42,36,193,249,196,204,248,22,170,206,28,28,28,248,80,158,41,32,193,249, 22,222,194,83,160,41,41,42,38,11,248,80,158,41,37,202,11,249,195,203,248, 22,169,205,28,28,28,248,80,158,41,32,193,249,22,222,194,201,11,248,80,158, -41,37,202,11,251,22,252,31,2,76,117,110,113,117,111,116,101,45,115,112,108, +41,37,202,11,251,22,252,32,2,76,117,110,113,117,111,116,101,45,115,112,108, 105,99,105,110,103,13,6,33,33,105,110,118,97,108,105,100,32,99,111,110,116, 101,120,116,32,119,105,116,104,105,110,32,113,117,97,115,105,113,117,111,116,101, 201,205,28,28,248,80,158,41,33,193,28,248,80,158,41,32,248,80,158,42,36, 194,28,249,22,222,248,80,158,43,36,195,201,248,80,158,41,37,193,11,11,11, 27,248,80,158,42,34,194,87,94,28,27,248,22,252,3,2,248,80,158,44,33, 195,28,192,192,248,22,252,3,2,248,80,158,44,35,248,80,158,45,34,196,251, -22,252,31,2,2,12,6,30,30,101,120,112,101,99,116,115,32,101,120,97,99, +22,252,32,2,2,12,6,30,30,101,120,112,101,99,116,115,32,101,120,97,99, 116,108,121,32,111,110,101,32,101,120,112,114,101,115,115,105,111,110,202,206,12, 27,248,80,158,43,36,194,27,248,80,158,44,34,205,27,249,200,248,80,158,47, 34,23,16,23,16,28,248,22,185,23,15,27,249,202,195,196,250,22,58,83,160, @@ -114,91 +114,91 @@ 195,205,28,249,22,252,5,2,195,194,202,249,22,58,83,160,41,44,43,38,194, 28,28,248,22,205,201,248,22,106,248,22,209,202,11,27,248,22,107,248,22,209, 203,27,249,197,195,205,28,249,22,252,5,2,195,194,202,249,22,58,83,160,41, -45,43,38,194,200,199,202,35,20,96,158,16,6,30,14,65,35,37,115,116,120, +45,43,38,194,200,199,202,35,20,97,158,16,6,30,14,65,35,37,115,116,120, 15,71,105,100,101,110,116,105,102,105,101,114,63,16,2,30,17,2,15,69,115, 116,120,45,112,97,105,114,63,18,11,30,19,2,15,67,115,116,120,45,99,100, 114,20,6,30,21,2,15,69,115,116,120,45,110,117,108,108,63,22,10,30,23, 2,15,67,115,116,120,45,99,97,114,24,5,30,25,2,15,69,115,116,120,45, 108,105,115,116,63,26,8,16,14,18,97,64,104,101,114,101,27,37,97,35,10, -32,11,16,8,2,4,2,2,2,5,2,2,2,6,2,2,2,7,2,2,97, +32,11,16,8,2,5,2,2,2,4,2,2,2,6,2,2,2,7,2,2,97, 34,10,33,11,16,32,70,115,116,120,45,114,111,116,97,116,101,28,2,15,2, -18,2,15,73,115,116,120,45,99,104,101,99,107,47,101,115,99,29,2,15,71, -115,116,120,45,114,111,116,97,116,101,42,30,2,15,2,26,2,15,74,115,112, -108,105,116,45,115,116,120,45,108,105,115,116,31,2,15,69,97,112,112,101,110, -100,47,35,102,32,2,15,69,115,116,120,45,62,108,105,115,116,33,2,15,2, -24,2,15,2,16,2,15,2,20,2,15,71,115,116,120,45,118,101,99,116,111, -114,63,34,2,15,2,22,2,15,67,99,111,110,115,47,35,102,35,2,15,71, -115,116,120,45,110,117,108,108,47,35,102,36,2,15,74,115,116,120,45,118,101, -99,116,111,114,45,114,101,102,37,2,15,96,33,8,254,1,11,16,0,18,158, +18,2,15,74,115,116,120,45,118,101,99,116,111,114,45,114,101,102,29,2,15, +71,115,116,120,45,114,111,116,97,116,101,42,30,2,15,2,26,2,15,73,115, +116,120,45,99,104,101,99,107,47,101,115,99,31,2,15,69,115,116,120,45,62, +108,105,115,116,32,2,15,74,115,112,108,105,116,45,115,116,120,45,108,105,115, +116,33,2,15,2,24,2,15,2,16,2,15,2,20,2,15,71,115,116,120,45, +118,101,99,116,111,114,63,34,2,15,2,22,2,15,67,99,111,110,115,47,35, +102,35,2,15,69,97,112,112,101,110,100,47,35,102,36,2,15,71,115,116,120, +45,110,117,108,108,47,35,102,37,2,15,96,33,8,254,1,11,16,0,18,158, 2,12,37,18,158,2,13,37,18,100,9,41,35,34,33,16,8,40,11,2,27, 71,117,110,113,117,111,116,101,45,115,116,120,38,1,20,117,110,113,117,111,116, 101,45,115,112,108,105,99,105,110,103,45,115,116,120,39,3,1,7,101,110,118, -50,50,55,56,40,2,40,2,40,16,4,39,11,67,105,110,45,102,111,114,109, -41,3,1,7,101,110,118,50,50,55,57,42,16,6,38,11,61,120,43,63,111, -108,100,44,3,1,7,101,110,118,50,50,56,49,45,2,45,18,158,65,113,117, +50,51,48,56,40,2,40,2,40,16,4,39,11,67,105,110,45,102,111,114,109, +41,3,1,7,101,110,118,50,51,48,57,42,16,6,38,11,61,120,43,63,111, +108,100,44,3,1,7,101,110,118,50,51,49,49,45,2,45,18,158,65,113,117, 111,116,101,46,41,18,100,64,108,105,115,116,47,43,35,34,33,40,39,16,6, -42,11,61,97,48,61,100,49,3,1,7,101,110,118,50,50,56,50,50,2,50, +42,11,61,97,48,61,100,49,3,1,7,101,110,118,50,51,49,50,50,2,50, 18,158,2,47,43,18,158,2,47,43,18,158,64,99,111,110,115,51,43,18,104, -2,5,49,35,34,33,40,39,16,8,48,11,64,102,111,114,109,52,2,8,2, -9,3,1,7,101,110,118,50,50,56,48,53,2,53,2,53,16,4,47,11,2, -10,3,1,7,101,110,118,50,50,56,51,54,16,6,46,11,2,43,65,108,101, -118,101,108,55,3,1,7,101,110,118,50,50,56,52,56,2,56,16,4,45,11, -2,11,3,1,7,101,110,118,50,50,56,53,57,16,4,44,11,65,102,105,114, -115,116,58,3,1,7,101,110,118,50,50,57,49,59,18,106,2,4,52,35,34, +2,6,49,35,34,33,40,39,16,8,48,11,64,102,111,114,109,52,2,8,2, +9,3,1,7,101,110,118,50,51,49,48,53,2,53,2,53,16,4,47,11,2, +10,3,1,7,101,110,118,50,51,49,51,54,16,6,46,11,2,43,65,108,101, +118,101,108,55,3,1,7,101,110,118,50,51,49,52,56,2,56,16,4,45,11, +2,11,3,1,7,101,110,118,50,51,49,53,57,16,4,44,11,65,102,105,114, +115,116,58,3,1,7,101,110,118,50,51,50,49,59,18,106,2,4,52,35,34, 33,40,39,48,47,46,45,44,16,4,51,11,64,114,101,115,116,60,3,1,7, -101,110,118,50,50,57,52,61,16,8,50,11,64,117,113,115,100,62,65,111,108, -100,45,108,63,61,108,64,3,1,7,101,110,118,50,50,57,54,65,2,65,2, +101,110,118,50,51,50,52,61,16,8,50,11,64,117,113,115,100,62,65,111,108, +100,45,108,63,61,108,64,3,1,7,101,110,118,50,51,50,54,65,2,65,2, 65,18,158,94,107,2,46,54,35,34,33,40,39,48,47,46,45,44,51,50,16, -4,53,11,65,114,101,115,116,120,66,3,1,7,101,110,118,50,50,57,56,67, +4,53,11,65,114,101,115,116,120,66,3,1,7,101,110,118,50,51,50,56,67, 158,2,13,54,54,18,105,72,108,105,115,116,45,62,118,101,99,116,111,114,68, 57,35,34,33,40,39,48,47,46,45,16,4,56,11,2,64,3,1,7,101,110, -118,50,50,57,57,69,16,4,55,11,62,108,50,70,3,1,7,101,110,118,50, -51,48,48,71,18,105,63,98,111,120,72,8,28,35,34,33,40,39,48,47,46, -45,16,4,59,11,61,118,73,3,1,7,101,110,118,50,51,48,49,74,16,4, -58,11,62,113,118,75,3,1,7,101,110,118,50,51,48,50,76,11,16,5,93, +118,50,51,50,57,69,16,4,55,11,62,108,50,70,3,1,7,101,110,118,50, +51,51,48,71,18,105,63,98,111,120,72,8,28,35,34,33,40,39,48,47,46, +45,16,4,59,11,61,118,73,3,1,7,101,110,118,50,51,51,49,74,16,4, +58,11,62,113,118,75,3,1,7,101,110,118,50,51,51,50,76,11,16,5,93, 2,7,27,83,160,41,32,33,37,89,162,32,33,46,9,224,1,0,87,94,28, -248,80,158,34,32,195,12,250,22,252,31,2,11,6,10,10,98,97,100,32,115, +248,80,158,34,32,195,12,250,22,252,32,2,11,6,10,10,98,97,100,32,115, 121,110,116,97,120,197,27,248,80,158,35,33,196,28,248,80,158,35,34,193,83, 160,41,33,34,37,28,28,248,80,158,35,35,193,248,80,158,35,34,248,80,158, 36,33,194,10,248,80,158,35,36,193,250,22,208,196,251,22,58,83,160,41,34, 41,37,248,80,158,42,36,200,249,22,50,83,160,41,35,43,37,248,80,158,44, -33,202,83,160,41,36,41,37,198,33,20,96,158,16,5,2,25,2,19,2,21, +33,202,83,160,41,36,41,37,198,33,20,97,158,16,5,2,25,2,19,2,21, 2,17,2,23,16,5,18,97,2,27,8,29,35,34,33,18,100,10,8,33,35, -34,33,16,4,8,32,11,2,27,3,1,7,101,110,118,50,51,48,52,77,16, -4,8,31,11,2,43,3,1,7,101,110,118,50,51,48,53,78,16,4,8,30, -11,61,101,79,3,1,7,101,110,118,50,51,48,54,80,18,158,62,105,102,81, -8,33,18,158,2,7,8,33,18,158,11,8,33,11,16,5,93,2,6,27,83, +34,33,16,4,8,32,11,2,27,3,1,7,101,110,118,50,51,51,52,77,16, +4,8,31,11,2,43,3,1,7,101,110,118,50,51,51,53,78,16,4,8,30, +11,61,101,79,3,1,7,101,110,118,50,51,51,54,80,18,158,62,105,102,81, +8,33,18,158,2,7,8,33,18,158,11,8,33,11,16,5,93,2,5,27,83, 160,41,32,33,38,89,162,32,33,50,9,224,1,0,87,94,28,248,80,158,34, -32,195,250,22,252,31,2,11,6,10,10,98,97,100,32,115,121,110,116,97,120, +32,195,250,22,252,32,2,11,6,10,10,98,97,100,32,115,121,110,116,97,120, 197,12,27,248,80,158,35,33,196,28,248,80,158,35,34,193,83,160,41,33,34, 38,28,28,248,80,158,35,35,193,248,80,158,35,34,248,80,158,36,33,194,11, 248,80,158,35,36,193,28,248,80,158,35,37,193,27,67,111,114,45,112,97,114, 116,82,250,22,208,197,250,22,58,83,160,41,34,41,38,248,22,58,249,22,58, 201,248,80,158,45,36,203,251,22,58,83,160,41,35,45,38,202,202,249,22,50, -83,160,41,36,47,38,248,80,158,48,33,206,199,250,22,252,31,2,11,6,10, -10,98,97,100,32,115,121,110,116,97,120,198,33,20,96,158,16,6,2,14,2, +83,160,41,36,47,38,248,80,158,48,33,206,199,250,22,252,32,2,11,6,10, +10,98,97,100,32,115,121,110,116,97,120,198,33,20,97,158,16,6,2,14,2, 19,2,21,2,17,2,23,2,25,16,5,18,158,2,27,8,29,18,100,11,8, -37,35,34,33,16,4,8,36,11,2,27,3,1,7,101,110,118,50,51,48,56, -83,16,4,8,35,11,2,43,3,1,7,101,110,118,50,51,48,57,84,16,4, -8,34,11,2,79,3,1,7,101,110,118,50,51,49,48,85,18,101,63,108,101, +37,35,34,33,16,4,8,36,11,2,27,3,1,7,101,110,118,50,51,51,56, +83,16,4,8,35,11,2,43,3,1,7,101,110,118,50,51,51,57,84,16,4, +8,34,11,2,79,3,1,7,101,110,118,50,51,52,48,85,18,101,63,108,101, 116,86,8,39,35,34,33,8,36,8,35,8,34,16,4,8,38,11,63,116,109, -112,87,3,1,7,101,110,118,50,51,49,49,88,18,158,2,81,8,39,18,158, -2,6,8,39,11,93,83,159,32,93,80,158,32,32,89,162,32,34,37,2,4, -222,28,248,22,57,193,249,22,64,194,195,250,22,252,32,2,2,13,6,11,11, +112,87,3,1,7,101,110,118,50,51,52,49,88,18,158,2,81,8,39,18,158, +2,5,8,39,11,93,83,159,32,93,80,158,32,32,89,162,32,34,37,2,4, +222,28,248,22,57,193,249,22,64,194,195,250,22,252,33,2,2,13,6,11,11, 112,114,111,112,101,114,32,108,105,115,116,195,93,68,35,37,107,101,114,110,101, 108,89,94,2,15,2,89,0}; EVAL_ONE_SIZED_STR((char *)expr, 2611); } { - static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,48,46,51,58,252,127,5,159,32,20,96,158,16,1,20,23, -65,98,101,103,105,110,0,16,0,83,158,39,20,93,114,66,35,37,99,111,110, -100,1,29,2,11,11,10,10,10,32,80,158,32,32,20,96,158,16,0,16,0, + static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,49,46,52,58,252,127,5,159,32,20,97,158,16,1,20,23, +65,98,101,103,105,110,0,16,0,83,158,39,20,94,114,66,35,37,99,111,110, +100,1,29,2,11,11,10,10,10,32,80,158,32,32,20,97,158,16,0,16,0, 11,11,16,0,32,11,16,1,64,99,111,110,100,3,16,1,11,16,1,2,3, 32,33,93,16,5,93,2,3,27,83,160,41,32,33,37,89,162,32,33,43,9, -224,1,0,87,94,28,248,80,158,34,32,195,250,22,252,31,2,11,6,10,10, +224,1,0,87,94,28,248,80,158,34,32,195,250,22,252,32,2,11,6,10,10, 98,97,100,32,115,121,110,116,97,120,197,12,250,22,208,195,27,248,80,158,38, 33,199,27,89,162,32,34,39,66,115,101,114,114,111,114,4,223,7,251,22,252, -31,2,11,197,196,198,249,91,159,33,11,20,12,95,33,192,89,162,32,34,55, +32,2,11,197,196,198,249,91,159,33,11,20,12,95,33,192,89,162,32,34,55, 64,108,111,111,112,5,225,9,3,0,28,248,80,158,35,34,196,83,160,41,33, 34,37,28,248,80,158,35,35,196,27,248,80,158,36,36,197,27,248,80,158,37, 33,198,28,248,80,158,37,35,194,27,248,80,158,38,36,195,27,248,80,158,39, @@ -223,48 +223,48 @@ 32,116,101,115,116,45,118,97,108,117,101,32,112,97,105,114,41,195,249,195,6, 46,46,98,97,100,32,115,121,110,116,97,120,32,40,98,111,100,121,32,109,117, 115,116,32,99,111,110,116,97,105,110,32,97,32,108,105,115,116,32,111,102,32, -112,97,105,114,115,41,197,195,10,197,33,20,96,158,16,5,30,6,65,35,37, +112,97,105,114,115,41,197,195,10,197,33,20,97,158,16,5,30,6,65,35,37, 115,116,120,7,71,105,100,101,110,116,105,102,105,101,114,63,8,2,30,9,2, 7,67,115,116,120,45,99,100,114,10,6,30,11,2,7,69,115,116,120,45,110, 117,108,108,63,12,10,30,13,2,7,69,115,116,120,45,112,97,105,114,63,14, 11,30,15,2,7,67,115,116,120,45,99,97,114,16,5,16,13,18,97,64,104, 101,114,101,17,37,97,35,10,32,11,16,2,2,3,2,2,97,34,10,33,11, -16,38,70,115,116,120,45,114,111,116,97,116,101,18,2,7,2,14,2,7,73, -115,116,120,45,99,104,101,99,107,47,101,115,99,19,2,7,71,115,116,120,45, -114,111,116,97,116,101,42,20,2,7,69,115,116,120,45,108,105,115,116,63,21, -2,7,74,115,112,108,105,116,45,115,116,120,45,108,105,115,116,22,2,7,69, -97,112,112,101,110,100,47,35,102,23,2,7,63,97,110,100,24,71,35,37,113, -113,45,97,110,100,45,111,114,25,69,115,116,120,45,62,108,105,115,116,26,2, -7,62,111,114,27,2,25,2,16,2,7,2,8,2,7,2,10,2,7,71,115, -116,120,45,118,101,99,116,111,114,63,28,2,7,2,12,2,7,67,99,111,110, -115,47,35,102,29,2,7,70,113,117,97,115,105,113,117,111,116,101,30,2,25, -71,115,116,120,45,110,117,108,108,47,35,102,31,2,7,74,115,116,120,45,118, -101,99,116,111,114,45,114,101,102,32,2,7,96,33,8,254,1,11,16,0,18, +16,38,70,115,116,120,45,114,111,116,97,116,101,18,2,7,2,14,2,7,74, +115,116,120,45,118,101,99,116,111,114,45,114,101,102,19,2,7,71,115,116,120, +45,114,111,116,97,116,101,42,20,2,7,69,115,116,120,45,108,105,115,116,63, +21,2,7,73,115,116,120,45,99,104,101,99,107,47,101,115,99,22,2,7,69, +115,116,120,45,62,108,105,115,116,23,2,7,62,111,114,24,71,35,37,113,113, +45,97,110,100,45,111,114,25,74,115,112,108,105,116,45,115,116,120,45,108,105, +115,116,26,2,7,2,16,2,7,2,8,2,7,63,97,110,100,27,2,25,2, +10,2,7,71,115,116,120,45,118,101,99,116,111,114,63,28,2,7,2,12,2, +7,67,99,111,110,115,47,35,102,29,2,7,70,113,117,97,115,105,113,117,111, +116,101,30,2,25,69,97,112,112,101,110,100,47,35,102,31,2,7,71,115,116, +120,45,110,117,108,108,47,35,102,32,2,7,96,33,8,254,1,11,16,0,18, 158,93,102,64,118,111,105,100,33,43,35,34,33,16,4,42,11,2,17,3,1, -7,101,110,118,50,51,49,53,34,16,4,41,11,67,105,110,45,102,111,114,109, -35,3,1,7,101,110,118,50,51,49,54,36,16,6,40,11,64,102,111,114,109, -37,2,4,3,1,7,101,110,118,50,51,49,55,38,2,38,16,4,39,11,2, -5,3,1,7,101,110,118,50,51,49,57,39,16,6,38,11,65,116,101,115,116, -115,40,66,102,105,114,115,116,63,41,3,1,7,101,110,118,50,51,50,48,42, +7,101,110,118,50,51,52,53,34,16,4,41,11,67,105,110,45,102,111,114,109, +35,3,1,7,101,110,118,50,51,52,54,36,16,6,40,11,64,102,111,114,109, +37,2,4,3,1,7,101,110,118,50,51,52,55,38,2,38,16,4,39,11,2, +5,3,1,7,101,110,118,50,51,52,57,39,16,6,38,11,65,116,101,115,116, +115,40,66,102,105,114,115,116,63,41,3,1,7,101,110,118,50,51,53,48,42, 2,42,43,18,104,64,101,108,115,101,43,46,35,34,33,42,41,40,39,38,16, 6,45,11,64,108,105,110,101,44,64,114,101,115,116,45,3,1,7,101,110,118, -50,51,50,49,46,2,46,16,6,44,11,64,116,101,115,116,47,65,118,97,108, -117,101,48,3,1,7,101,110,118,50,51,50,50,49,2,49,18,104,62,61,62, +50,51,53,49,46,2,46,16,6,44,11,64,116,101,115,116,47,65,118,97,108, +117,101,48,3,1,7,101,110,118,50,51,53,50,49,2,49,18,104,62,61,62, 50,48,35,34,33,42,41,40,39,38,45,16,8,47,11,2,47,2,48,65,101, 108,115,101,63,51,2,49,2,49,2,49,18,105,63,108,101,116,52,50,35,34, 33,42,41,40,39,38,45,47,16,4,49,11,63,103,101,110,53,3,1,7,101, -110,118,50,51,50,51,54,18,158,62,105,102,55,50,18,158,2,55,48,18,158, +110,118,50,51,53,51,54,18,158,62,105,102,55,50,18,158,2,55,48,18,158, 2,0,48,18,158,2,0,48,18,105,2,52,52,35,34,33,42,41,40,39,38, -45,47,16,4,51,11,2,53,3,1,7,101,110,118,50,51,50,52,56,18,158, +45,47,16,4,51,11,2,53,3,1,7,101,110,118,50,51,53,52,56,18,158, 2,55,52,18,158,2,55,48,18,158,2,0,48,11,9,93,68,35,37,107,101, 114,110,101,108,57,95,2,7,2,25,2,57,0}; EVAL_ONE_SIZED_STR((char *)expr, 1419); } { - static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,48,46,51,24,252,148,2,159,32,20,96,158,16,1,20,23, -65,98,101,103,105,110,0,16,0,83,158,39,20,93,114,73,35,37,115,116,114, + static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,49,46,52,24,252,148,2,159,32,20,97,158,16,1,20,23, +65,98,101,103,105,110,0,16,0,83,158,39,20,94,114,73,35,37,115,116,114, 117,99,116,45,105,110,102,111,1,29,2,11,11,10,10,10,32,80,158,32,32, -20,96,158,16,9,30,3,2,2,74,105,100,101,110,116,105,102,105,101,114,47, +20,97,158,16,9,30,3,2,2,74,105,100,101,110,116,105,102,105,101,114,47, 35,102,63,4,254,1,30,5,65,35,37,115,116,120,6,71,105,100,101,110,116, 105,102,105,101,114,63,7,2,30,8,2,2,71,105,100,47,35,102,45,108,105, 115,116,63,9,254,1,30,10,2,2,72,115,116,114,117,99,116,45,105,110,102, @@ -297,9 +297,9 @@ EVAL_ONE_SIZED_STR((char *)expr, 672); } { - static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,48,46,51,27,252,153,3,159,32,20,96,158,16,1,20,23, -65,98,101,103,105,110,0,16,0,83,158,39,20,93,114,71,35,37,100,115,45, -104,101,108,112,101,114,1,29,2,11,11,10,10,10,32,80,158,32,32,20,96, + static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,49,46,52,27,252,153,3,159,32,20,97,158,16,1,20,23, +65,98,101,103,105,110,0,16,0,83,158,39,20,94,114,71,35,37,100,115,45, +104,101,108,112,101,114,1,29,2,11,11,10,10,10,32,80,158,32,32,20,97, 158,16,6,30,3,2,2,1,20,108,105,115,116,45,62,105,109,109,117,116,97, 98,108,101,45,108,105,115,116,4,254,1,30,5,2,2,72,103,101,116,45,115, 116,120,45,105,110,102,111,6,254,1,30,7,73,35,37,115,116,114,117,99,116, @@ -319,9 +319,9 @@ 104,101,114,19,222,249,91,159,33,11,20,12,95,33,192,89,162,32,34,40,64, 108,111,111,112,20,223,0,28,248,22,56,194,194,28,248,22,56,248,22,52,195, 249,22,50,248,22,51,196,196,249,194,248,22,79,196,249,22,50,248,22,51,198, -198,194,9,27,28,197,249,22,252,69,3,199,89,162,40,32,32,9,222,11,11, +198,194,9,27,28,197,249,22,252,70,3,199,89,162,40,32,32,9,222,11,11, 87,94,28,197,28,27,248,22,252,3,2,248,80,158,38,34,195,28,192,192,248, -22,252,3,2,248,80,158,38,35,195,251,22,252,31,2,11,28,248,80,158,40, +22,252,3,2,248,80,158,38,35,195,251,22,252,32,2,11,28,248,80,158,40, 34,197,6,63,63,112,97,114,101,110,116,32,115,116,114,117,99,116,32,105,110, 102,111,114,109,97,116,105,111,110,32,100,111,101,115,32,110,111,116,32,105,110, 99,108,117,100,101,32,97,32,116,121,112,101,32,102,111,114,32,115,117,98,116, @@ -345,15 +345,15 @@ EVAL_ONE_SIZED_STR((char *)expr, 933); } { - static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,48,46,51,121,252,233,12,159,32,20,96,158,16,1,20,23, -65,98,101,103,105,110,0,16,0,83,158,39,20,93,114,74,35,37,100,101,102, + static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,49,46,52,121,252,233,12,159,32,20,97,158,16,1,20,23, +65,98,101,103,105,110,0,16,0,83,158,39,20,94,114,74,35,37,100,101,102, 105,110,101,45,101,116,45,97,108,1,29,2,11,11,10,10,10,32,80,158,32, -32,20,96,158,16,0,16,0,11,11,16,0,32,11,16,6,64,119,104,101,110, -3,66,117,110,108,101,115,115,4,66,108,101,116,47,101,99,5,67,45,100,101, -102,105,110,101,6,74,45,100,101,102,105,110,101,45,115,121,110,116,97,120,7, -73,100,101,102,105,110,101,45,115,116,114,117,99,116,8,16,6,11,11,11,11, +32,20,97,158,16,0,16,0,11,11,16,0,32,11,16,6,67,45,100,101,102, +105,110,101,3,73,100,101,102,105,110,101,45,115,116,114,117,99,116,4,74,45, +100,101,102,105,110,101,45,115,121,110,116,97,120,5,64,119,104,101,110,6,66, +117,110,108,101,115,115,7,66,108,101,116,47,101,99,8,16,6,11,11,11,11, 11,11,16,6,2,3,2,4,2,5,2,6,2,7,2,8,32,38,97,16,5, -94,2,6,2,7,27,83,160,41,32,33,37,27,89,162,32,33,35,69,109,107, +94,2,3,2,5,27,83,160,41,32,33,37,27,89,162,32,33,35,69,109,107, 45,100,101,102,105,110,101,9,224,2,1,89,162,32,33,52,9,225,1,0,2, 27,248,80,158,36,32,197,27,248,80,158,37,33,194,28,248,80,158,37,34,193, 250,22,208,198,249,22,50,199,249,22,50,248,22,58,200,249,80,158,45,35,248, @@ -361,7 +361,7 @@ 208,83,160,41,33,40,37,250,22,58,201,248,22,58,248,80,158,45,33,201,249, 22,50,66,108,97,109,98,100,97,10,249,22,50,248,80,158,48,32,204,249,80, 158,49,35,248,80,158,50,36,205,9,201,249,22,7,248,195,83,160,41,34,37, -37,248,195,83,160,41,35,37,37,37,20,96,158,16,5,30,11,65,35,37,115, +37,248,195,83,160,41,35,37,37,37,20,97,158,16,5,30,11,65,35,37,115, 116,120,12,67,115,116,120,45,99,100,114,13,6,30,14,2,12,67,115,116,120, 45,99,97,114,15,5,30,16,2,12,71,105,100,101,110,116,105,102,105,101,114, 63,17,2,30,18,71,35,37,113,113,45,97,110,100,45,111,114,19,69,113,113, @@ -370,61 +370,61 @@ 12,2,3,2,2,2,4,2,2,2,5,2,2,2,6,2,2,2,7,2,2, 2,8,2,2,97,34,10,33,11,16,54,1,24,115,116,114,117,99,116,45,105, 110,102,111,45,112,114,101,100,105,99,97,116,101,45,105,100,24,73,35,37,115, -116,114,117,99,116,45,105,110,102,111,25,71,115,116,120,45,118,101,99,116,111, -114,63,26,2,12,2,15,2,12,74,115,116,120,45,118,101,99,116,111,114,45, -114,101,102,27,2,12,2,13,2,12,70,115,116,120,45,114,111,116,97,116,101, -28,2,12,73,115,116,120,45,99,104,101,99,107,47,101,115,99,29,2,12,67, -99,111,110,115,47,35,102,30,2,12,71,115,116,120,45,114,111,116,97,116,101, -42,31,2,12,63,97,110,100,32,2,19,74,115,112,108,105,116,45,115,116,120, -45,108,105,115,116,33,2,12,62,111,114,34,2,19,79,115,116,114,117,99,116, -45,105,110,102,111,45,116,121,112,101,45,105,100,35,2,25,2,17,2,12,69, -115,116,120,45,112,97,105,114,63,36,2,12,1,24,115,116,114,117,99,116,45, -105,110,102,111,45,97,99,99,101,115,115,111,114,45,105,100,115,37,2,25,69, -115,116,120,45,110,117,108,108,63,38,2,12,70,113,117,97,115,105,113,117,111, -116,101,39,2,19,1,23,115,116,114,117,99,116,45,105,110,102,111,45,109,117, -116,97,116,111,114,45,105,100,115,40,2,25,64,99,111,110,100,41,66,35,37, -99,111,110,100,42,71,115,116,120,45,110,117,108,108,47,35,102,43,2,12,69, -97,112,112,101,110,100,47,35,102,44,2,12,69,115,116,120,45,108,105,115,116, -63,45,2,12,72,115,116,114,117,99,116,45,105,110,102,111,63,46,2,25,1, -26,115,116,114,117,99,116,45,105,110,102,111,45,99,111,110,115,116,114,117,99, -116,111,114,45,105,100,47,2,25,2,22,2,12,72,103,101,116,45,115,116,120, -45,105,110,102,111,48,71,35,37,100,115,45,104,101,108,112,101,114,49,96,33, +116,114,117,99,116,45,105,110,102,111,25,63,97,110,100,26,2,19,71,115,116, +120,45,118,101,99,116,111,114,63,27,2,12,62,111,114,28,2,19,2,15,2, +12,69,97,112,112,101,110,100,47,35,102,29,2,12,72,103,101,116,45,115,116, +120,45,105,110,102,111,30,71,35,37,100,115,45,104,101,108,112,101,114,31,64, +99,111,110,100,32,66,35,37,99,111,110,100,33,2,13,2,12,70,115,116,120, +45,114,111,116,97,116,101,34,2,12,74,115,116,120,45,118,101,99,116,111,114, +45,114,101,102,35,2,12,67,99,111,110,115,47,35,102,36,2,12,71,115,116, +120,45,114,111,116,97,116,101,42,37,2,12,73,115,116,120,45,99,104,101,99, +107,47,101,115,99,38,2,12,1,23,115,116,114,117,99,116,45,105,110,102,111, +45,109,117,116,97,116,111,114,45,105,100,115,39,2,25,1,24,115,116,114,117, +99,116,45,105,110,102,111,45,97,99,99,101,115,115,111,114,45,105,100,115,40, +2,25,74,115,112,108,105,116,45,115,116,120,45,108,105,115,116,41,2,12,2, +17,2,12,69,115,116,120,45,110,117,108,108,63,42,2,12,70,113,117,97,115, +105,113,117,111,116,101,43,2,19,71,115,116,120,45,110,117,108,108,47,35,102, +44,2,12,69,115,116,120,45,112,97,105,114,63,45,2,12,69,115,116,120,45, +108,105,115,116,63,46,2,12,1,26,115,116,114,117,99,116,45,105,110,102,111, +45,99,111,110,115,116,114,117,99,116,111,114,45,105,100,47,2,25,2,22,2, +12,79,115,116,114,117,99,116,45,105,110,102,111,45,116,121,112,101,45,105,100, +48,2,25,72,115,116,114,117,99,116,45,105,110,102,111,63,49,2,25,96,33, 8,254,1,11,16,0,18,103,2,23,44,35,34,33,16,4,43,11,2,23,3, -1,7,101,110,118,50,51,53,51,50,16,4,42,11,64,98,97,115,101,51,3, -1,7,101,110,118,50,51,53,53,52,16,4,41,11,64,99,111,100,101,53,3, -1,7,101,110,118,50,51,53,54,54,16,4,40,11,64,98,111,100,121,55,3, -1,7,101,110,118,50,51,53,55,56,16,4,39,11,65,102,105,114,115,116,57, -3,1,7,101,110,118,50,51,53,56,58,16,4,38,11,65,112,98,111,100,121, -59,3,1,7,101,110,118,50,51,53,57,60,18,99,73,100,101,102,105,110,101, +1,7,101,110,118,50,51,56,51,50,16,4,42,11,64,98,97,115,101,51,3, +1,7,101,110,118,50,51,56,53,52,16,4,41,11,64,99,111,100,101,53,3, +1,7,101,110,118,50,51,56,54,54,16,4,40,11,64,98,111,100,121,55,3, +1,7,101,110,118,50,51,56,55,56,16,4,39,11,65,102,105,114,115,116,57, +3,1,7,101,110,118,50,51,56,56,58,16,4,38,11,65,112,98,111,100,121, +59,3,1,7,101,110,118,50,51,56,57,60,18,99,73,100,101,102,105,110,101, 45,118,97,108,117,101,115,61,46,35,34,33,43,16,4,45,11,2,9,3,1, -7,101,110,118,50,51,53,52,62,18,158,75,100,101,102,105,110,101,45,115,121, -110,116,97,120,101,115,63,46,11,16,5,93,2,3,89,162,32,33,45,9,223, +7,101,110,118,50,51,56,52,62,18,158,75,100,101,102,105,110,101,45,115,121, +110,116,97,120,101,115,63,46,11,16,5,93,2,6,89,162,32,33,45,9,223, 0,27,248,22,215,195,28,28,192,249,22,182,248,22,63,195,34,11,250,22,208, 83,160,41,32,36,34,250,22,58,83,160,41,33,39,34,248,80,158,40,32,248, 80,158,41,33,202,249,22,60,83,160,41,34,41,34,248,80,158,42,33,248,80, -158,43,33,204,197,250,22,252,31,2,11,6,10,10,98,97,100,32,115,121,110, -116,97,120,197,32,20,96,158,16,2,2,14,2,11,16,3,18,99,2,23,49, -35,34,33,16,4,48,11,61,120,64,3,1,7,101,110,118,50,51,54,49,65, -16,4,47,11,61,108,66,3,1,7,101,110,118,50,51,54,50,67,18,158,62, -105,102,68,49,18,158,2,0,49,11,16,5,93,2,4,89,162,32,33,45,9, +158,43,33,204,197,250,22,252,32,2,11,6,10,10,98,97,100,32,115,121,110, +116,97,120,197,32,20,97,158,16,2,2,14,2,11,16,3,18,99,2,23,49, +35,34,33,16,4,48,11,61,120,64,3,1,7,101,110,118,50,51,57,49,65, +16,4,47,11,61,108,66,3,1,7,101,110,118,50,51,57,50,67,18,158,62, +105,102,68,49,18,158,2,0,49,11,16,5,93,2,7,89,162,32,33,45,9, 223,0,27,248,22,215,195,28,28,192,249,22,182,248,22,63,195,34,11,250,22, 208,83,160,41,32,36,32,251,22,58,83,160,41,33,40,32,248,22,77,200,83, 160,41,34,40,32,249,22,60,83,160,41,35,42,32,248,22,79,202,197,250,22, -252,31,2,11,6,10,10,98,97,100,32,115,121,110,116,97,120,197,32,20,96, +252,32,2,11,6,10,10,98,97,100,32,115,121,110,116,97,120,197,32,20,97, 158,16,0,16,4,18,99,2,23,52,35,34,33,16,4,51,11,2,64,3,1, -7,101,110,118,50,51,54,52,69,16,4,50,11,2,66,3,1,7,101,110,118, -50,51,54,53,70,18,158,2,68,52,18,158,93,158,64,118,111,105,100,71,52, -52,18,158,2,0,52,11,16,5,93,2,5,89,162,32,33,49,9,223,0,27, +7,101,110,118,50,51,57,52,69,16,4,50,11,2,66,3,1,7,101,110,118, +50,51,57,53,70,18,158,2,68,52,18,158,93,158,64,118,111,105,100,71,52, +52,18,158,2,0,52,11,16,5,93,2,8,89,162,32,33,49,9,223,0,27, 248,22,215,195,28,28,192,28,249,22,182,248,22,63,195,34,248,80,158,34,32, 248,22,77,194,11,11,27,248,22,77,194,27,248,80,158,36,33,248,80,158,37, 33,198,250,22,208,83,160,41,32,38,36,249,22,58,67,99,97,108,108,47,101, 99,72,249,22,50,2,10,249,22,50,248,22,58,203,249,80,158,46,34,248,80, -158,47,35,204,9,199,250,22,252,31,2,11,6,10,10,98,97,100,32,115,121, -110,116,97,120,197,32,20,96,158,16,4,2,16,2,11,2,18,2,21,16,1, +158,47,35,204,9,199,250,22,252,32,2,11,6,10,10,98,97,100,32,115,121, +110,116,97,120,197,32,20,97,158,16,4,2,16,2,11,2,18,2,21,16,1, 18,100,2,23,56,35,34,33,16,4,55,11,2,53,3,1,7,101,110,118,50, -51,54,55,73,16,4,54,11,2,66,3,1,7,101,110,118,50,51,54,56,74, +51,57,55,73,16,4,54,11,2,66,3,1,7,101,110,118,50,51,57,56,74, 16,6,53,11,63,118,97,114,75,65,101,120,112,114,115,76,3,1,7,101,110, -118,50,51,54,57,77,2,77,11,16,5,93,2,8,27,89,162,32,36,53,69, +118,50,51,57,57,77,2,77,11,16,5,93,2,4,27,89,162,32,36,53,69, 109,97,107,101,45,99,111,114,101,78,223,1,250,22,58,70,108,101,116,45,118, 97,108,117,101,115,79,248,22,58,249,22,58,21,97,64,116,121,112,101,80,65, 109,97,107,101,114,81,64,112,114,101,100,82,66,97,99,99,101,115,115,83,66, @@ -439,10 +439,10 @@ 1,25,109,97,107,101,45,115,116,114,117,99,116,45,102,105,101,108,100,45,109, 117,116,97,116,111,114,91,2,84,201,249,22,58,2,86,248,22,51,203,249,197, 248,22,52,199,248,22,169,200,23,19,32,9,89,162,32,33,8,31,9,224,1, -0,87,94,28,248,80,158,34,33,195,250,22,252,31,2,11,6,10,10,98,97, +0,87,94,28,248,80,158,34,33,195,250,22,252,32,2,11,6,10,10,98,97, 100,32,115,121,110,116,97,120,197,12,27,248,80,158,35,34,248,80,158,36,35, 197,27,89,162,33,34,40,72,115,121,110,116,97,120,45,101,114,114,111,114,92, -223,4,252,22,1,22,252,31,2,11,198,197,199,27,89,162,32,34,46,78,98, +223,4,252,22,1,22,252,32,2,11,198,197,199,27,89,162,32,34,46,78,98, 117,105,108,100,45,115,116,114,117,99,116,45,110,97,109,101,115,93,222,27,248, 22,43,248,22,209,195,27,249,22,2,22,43,249,22,2,22,209,199,27,22,252, 158,1,249,22,2,22,41,249,22,64,250,22,58,249,201,6,7,7,115,116,114, @@ -470,7 +470,7 @@ 3,89,162,32,33,38,9,224,6,3,27,248,80,158,35,33,196,28,192,192,249, 195,6,27,27,102,105,101,108,100,32,110,97,109,101,32,110,111,116,32,97,32, 105,100,101,110,116,105,102,105,101,114,197,248,80,158,39,34,248,22,77,198,28, -249,22,70,247,22,252,71,3,21,93,70,101,120,112,114,101,115,115,105,111,110, +249,22,70,247,22,252,72,3,21,93,70,101,120,112,114,101,115,115,105,111,110, 94,248,194,6,35,35,97,108,108,111,119,101,100,32,111,110,108,121,32,105,110, 32,100,101,102,105,110,105,116,105,111,110,32,99,111,110,116,101,120,116,115,12, 27,28,248,80,158,38,33,248,22,51,197,248,22,51,196,248,80,158,38,38,248, @@ -484,47 +484,47 @@ 15,251,22,58,63,108,101,116,96,248,22,58,249,22,58,2,95,23,22,21,95, 2,68,96,2,68,2,95,94,63,110,111,116,97,94,70,105,110,115,112,101,99, 116,111,114,63,98,2,95,11,96,76,114,97,105,115,101,45,116,121,112,101,45, -101,114,114,111,114,99,94,2,86,2,8,6,15,15,105,110,115,112,101,99,116, +101,114,114,111,114,99,94,2,86,2,4,6,15,15,105,110,115,112,101,99,116, 111,114,32,111,114,32,35,102,2,95,196,192,250,22,58,2,63,248,22,58,23, 17,203,23,16,28,196,250,22,217,195,75,100,105,115,97,112,112,101,97,114,101, -100,45,117,115,101,100,248,22,252,74,3,200,192,33,20,96,158,16,9,2,18, -2,16,2,21,2,11,30,101,2,12,2,45,8,30,102,2,12,2,36,11,2, -14,30,103,2,12,2,38,10,30,104,2,49,2,48,0,16,2,18,158,93,101, +100,45,117,115,101,100,248,22,252,75,3,200,192,33,20,97,158,16,9,2,18, +2,16,2,21,2,11,30,101,2,12,2,46,8,30,102,2,12,2,45,11,2, +14,30,103,2,12,2,42,10,30,104,2,31,2,30,0,16,2,18,158,93,101, 77,99,117,114,114,101,110,116,45,105,110,115,112,101,99,116,111,114,105,8,29, -35,34,33,16,4,8,28,11,2,78,3,1,7,101,110,118,50,51,55,49,106, -16,4,59,11,63,115,116,120,107,3,1,7,101,110,118,50,51,55,53,108,16, -4,58,11,2,55,3,1,7,101,110,118,50,51,55,54,109,16,6,57,11,2, -92,2,93,3,1,7,101,110,118,50,51,55,55,110,2,110,8,29,18,104,2, +35,34,33,16,4,8,28,11,2,78,3,1,7,101,110,118,50,52,48,49,106, +16,4,59,11,63,115,116,120,107,3,1,7,101,110,118,50,52,48,53,108,16, +4,58,11,2,55,3,1,7,101,110,118,50,52,48,54,109,16,6,57,11,2, +92,2,93,3,1,7,101,110,118,50,52,48,55,110,2,110,8,29,18,104,2, 23,8,33,35,34,33,8,28,59,58,57,16,10,8,32,11,64,110,97,109,101, 111,71,102,105,101,108,100,45,110,97,109,101,115,112,2,95,68,115,117,112,101, -114,45,105,100,113,3,1,7,101,110,118,50,51,57,49,114,2,114,2,114,2, +114,45,105,100,113,3,1,7,101,110,118,50,52,50,49,114,2,114,2,114,2, 114,16,4,8,31,11,73,100,101,102,105,110,101,100,45,110,97,109,101,115,115, -3,1,7,101,110,118,50,51,57,50,116,16,6,8,30,11,76,115,117,112,101, +3,1,7,101,110,118,50,52,50,50,116,16,6,8,30,11,76,115,117,112,101, 114,45,105,100,47,115,116,114,117,99,116,58,117,68,115,116,120,45,105,110,102, -111,118,3,1,7,101,110,118,50,51,57,52,119,2,119,11,9,93,68,35,37, -107,101,114,110,101,108,120,98,2,120,2,12,2,19,2,42,2,25,2,49,0}; +111,118,3,1,7,101,110,118,50,52,50,52,119,2,119,11,9,93,68,35,37, +107,101,114,110,101,108,120,98,2,120,2,12,2,19,2,33,2,25,2,31,0}; EVAL_ONE_SIZED_STR((char *)expr, 3317); } { - static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,48,46,51,18,252,4,1,159,32,20,96,158,16,1,20,23, -65,98,101,103,105,110,0,16,0,83,158,39,20,93,114,74,35,37,115,109,97, + static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,49,46,52,18,252,4,1,159,32,20,97,158,16,1,20,23, +65,98,101,103,105,110,0,16,0,83,158,39,20,94,114,74,35,37,115,109,97, 108,108,45,115,99,104,101,109,101,1,29,2,11,11,10,10,10,32,80,158,32, -32,20,96,158,16,0,16,0,11,11,16,0,32,11,16,10,64,119,104,101,110, -3,66,117,110,108,101,115,115,4,63,97,110,100,5,66,108,101,116,47,101,99, -6,67,45,100,101,102,105,110,101,7,62,111,114,8,73,100,101,102,105,110,101, -45,115,116,114,117,99,116,9,74,45,100,101,102,105,110,101,45,115,121,110,116, -97,120,10,64,99,111,110,100,11,70,113,117,97,115,105,113,117,111,116,101,12, -16,10,74,35,37,100,101,102,105,110,101,45,101,116,45,97,108,13,2,13,71, -35,37,113,113,45,97,110,100,45,111,114,14,2,13,2,13,2,14,2,13,2, -13,66,35,37,99,111,110,100,15,2,14,16,10,2,3,2,4,2,5,2,6, +32,20,97,158,16,0,16,0,11,11,16,0,32,11,16,10,67,45,100,101,102, +105,110,101,3,73,100,101,102,105,110,101,45,115,116,114,117,99,116,4,74,45, +100,101,102,105,110,101,45,115,121,110,116,97,120,5,64,99,111,110,100,6,63, +97,110,100,7,64,119,104,101,110,8,62,111,114,9,66,117,110,108,101,115,115, +10,70,113,117,97,115,105,113,117,111,116,101,11,66,108,101,116,47,101,99,12, +16,10,74,35,37,100,101,102,105,110,101,45,101,116,45,97,108,13,2,13,2, +13,66,35,37,99,111,110,100,14,71,35,37,113,113,45,97,110,100,45,111,114, +15,2,13,2,15,2,13,2,15,2,13,16,10,2,3,2,4,2,5,2,6, 2,7,2,8,2,9,2,10,2,11,2,12,32,42,9,9,97,68,35,37,107, -101,114,110,101,108,16,65,35,37,115,116,120,17,2,14,2,15,2,13,9,0}; +101,114,110,101,108,16,65,35,37,115,116,120,17,2,15,2,14,2,13,9,0}; EVAL_ONE_SIZED_STR((char *)expr, 272); } { - static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,48,46,51,189,252,51,32,159,32,20,96,158,16,1,20,23, -65,98,101,103,105,110,0,16,0,83,158,39,20,93,114,64,35,37,115,99,1, -29,2,11,11,10,10,10,48,80,158,32,32,20,96,158,16,37,30,3,2,2, + static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,49,46,52,189,252,51,32,159,32,20,97,158,16,1,20,23, +65,98,101,103,105,110,0,16,0,83,158,39,20,94,114,64,35,37,115,99,1, +29,2,11,11,10,10,10,48,80,158,32,32,20,97,158,16,37,30,3,2,2, 64,46,46,46,63,4,254,1,30,5,2,2,68,115,116,120,45,109,101,109,113, 6,254,1,30,7,2,2,72,115,116,120,45,109,101,109,113,45,112,111,115,8, 254,1,30,9,2,2,73,115,116,120,45,109,101,109,113,42,45,112,111,115,10, @@ -564,52 +564,52 @@ 1,21,115,121,110,116,97,120,45,109,97,112,112,105,110,103,45,118,97,108,118, 97,114,76,254,1,30,77,2,2,1,26,115,101,116,45,115,121,110,116,97,120, 45,109,97,112,112,105,110,103,45,118,97,108,118,97,114,33,78,254,1,16,2, -18,98,63,46,46,46,79,38,97,36,10,32,11,16,114,66,108,101,116,47,101, -99,80,74,35,37,100,101,102,105,110,101,45,101,116,45,97,108,81,2,8,2, -2,2,64,2,2,2,16,2,2,2,60,2,2,74,115,121,110,116,97,120,45, -109,97,112,112,105,110,103,82,2,2,2,56,2,2,74,45,100,101,102,105,110, -101,45,115,121,110,116,97,120,83,2,81,64,99,111,110,100,84,66,35,37,99, -111,110,100,85,2,27,2,2,2,4,2,2,73,100,101,102,105,110,101,45,115, -116,114,117,99,116,86,2,81,2,12,2,2,2,37,2,18,2,19,2,18,2, -70,2,2,2,74,2,2,71,115,116,120,45,110,117,108,108,47,35,102,87,2, -18,2,31,2,18,2,10,2,2,2,23,2,18,69,115,116,120,45,108,105,115, -116,63,88,2,18,2,25,2,2,69,115,116,120,45,62,108,105,115,116,89,2, -18,2,29,2,2,2,14,2,2,67,99,111,110,115,47,35,102,90,2,18,2, -39,2,18,74,115,116,120,45,118,101,99,116,111,114,45,114,101,102,91,2,18, -63,97,110,100,92,2,41,69,97,112,112,101,110,100,47,35,102,93,2,18,73, -115,116,120,45,99,104,101,99,107,47,101,115,99,94,2,18,62,111,114,95,2, -41,74,115,112,108,105,116,45,115,116,120,45,108,105,115,116,96,2,18,2,21, -2,18,71,115,116,120,45,114,111,116,97,116,101,42,97,2,18,2,50,2,2, -70,113,117,97,115,105,113,117,111,116,101,98,2,41,2,44,2,2,2,72,2, -2,2,46,2,2,67,45,100,101,102,105,110,101,99,2,81,2,76,2,2,2, -48,2,2,2,66,2,2,2,35,2,2,2,62,2,2,2,33,2,2,2,78, -2,2,2,68,2,2,70,115,116,120,45,114,111,116,97,116,101,100,2,18,2, -6,2,2,2,58,2,2,2,52,2,2,64,119,104,101,110,101,2,81,2,54, -2,2,66,117,110,108,101,115,115,102,2,81,96,35,33,11,16,0,96,34,8, -254,1,11,16,0,16,4,33,11,61,115,103,3,1,7,101,110,118,50,51,57, +18,98,63,46,46,46,79,38,97,36,10,32,11,16,114,2,54,2,2,2,12, +2,2,2,16,2,2,2,60,2,2,2,64,2,2,2,56,2,2,2,23,2, +18,2,70,2,2,74,45,100,101,102,105,110,101,45,115,121,110,116,97,120,80, +74,35,37,100,101,102,105,110,101,45,101,116,45,97,108,81,67,45,100,101,102, +105,110,101,82,2,81,73,100,101,102,105,110,101,45,115,116,114,117,99,116,83, +2,81,2,37,2,18,2,72,2,2,2,19,2,18,2,62,2,2,2,50,2, +2,2,74,2,2,71,115,116,120,45,110,117,108,108,47,35,102,84,2,18,64, +99,111,110,100,85,66,35,37,99,111,110,100,86,2,68,2,2,2,4,2,2, +2,8,2,2,64,119,104,101,110,87,2,81,69,115,116,120,45,108,105,115,116, +63,88,2,18,74,115,121,110,116,97,120,45,109,97,112,112,105,110,103,89,2, +2,66,117,110,108,101,115,115,90,2,81,2,10,2,2,2,78,2,2,69,115, +116,120,45,62,108,105,115,116,91,2,18,66,108,101,116,47,101,99,92,2,81, +2,14,2,2,2,29,2,2,2,31,2,18,2,33,2,2,69,97,112,112,101, +110,100,47,35,102,93,2,18,2,66,2,2,74,115,116,120,45,118,101,99,116, +111,114,45,114,101,102,94,2,18,62,111,114,95,2,41,70,115,116,120,45,114, +111,116,97,116,101,96,2,18,73,115,116,120,45,99,104,101,99,107,47,101,115, +99,97,2,18,2,21,2,18,71,115,116,120,45,114,111,116,97,116,101,42,98, +2,18,70,113,117,97,115,105,113,117,111,116,101,99,2,41,67,99,111,110,115, +47,35,102,100,2,18,74,115,112,108,105,116,45,115,116,120,45,108,105,115,116, +101,2,18,2,44,2,2,63,97,110,100,102,2,41,2,46,2,2,2,39,2, +18,2,58,2,2,2,48,2,2,2,35,2,2,2,6,2,2,2,76,2,2, +2,27,2,2,2,52,2,2,2,25,2,2,96,35,33,11,16,0,96,34,8, +254,1,11,16,0,16,4,33,11,61,115,103,3,1,7,101,110,118,50,52,50, 57,104,18,103,2,79,45,36,35,34,16,10,44,11,61,112,105,67,112,114,111, 116,111,45,114,106,61,107,107,64,100,101,115,116,108,3,1,7,101,110,118,50, -52,55,57,109,2,109,2,109,2,109,16,6,43,11,68,101,120,112,97,110,100, -101,114,110,63,116,111,112,111,3,1,7,101,110,118,50,52,56,51,112,3,1, -7,101,110,118,50,52,56,49,113,16,6,42,11,2,110,2,111,2,112,2,113, +53,48,57,109,2,109,2,109,2,109,16,6,43,11,68,101,120,112,97,110,100, +101,114,110,63,116,111,112,111,3,1,7,101,110,118,50,53,49,51,112,3,1, +7,101,110,118,50,53,49,49,113,16,6,42,11,2,110,2,111,2,112,2,113, 16,10,41,11,69,108,111,99,97,108,45,116,111,112,114,73,117,115,101,45,101, 108,108,105,112,115,101,115,63,115,72,117,115,101,45,116,97,105,108,45,112,111, -115,116,65,104,97,115,104,33,117,3,1,7,101,110,118,50,52,56,53,118,2, +115,116,65,104,97,115,104,33,117,3,1,7,101,110,118,50,53,49,53,118,2, 118,2,118,2,118,16,10,40,11,66,112,45,104,101,97,100,119,68,101,108,45, 99,111,117,110,116,120,66,114,101,115,116,45,112,121,67,108,97,115,116,45,101, -108,122,3,1,7,101,110,118,50,52,56,54,123,2,123,2,123,2,123,16,4, -39,11,64,108,111,111,112,124,3,1,7,101,110,118,50,52,56,57,125,11,11, +108,122,3,1,7,101,110,118,50,53,49,54,123,2,123,2,123,2,123,16,4, +39,11,64,108,111,111,112,124,3,1,7,101,110,118,50,53,49,57,125,11,11, 16,21,2,4,2,33,2,35,2,29,2,58,2,54,2,56,2,60,2,50,2, 16,2,52,2,27,2,25,2,14,2,62,2,12,2,74,2,78,2,66,2,6, 2,10,53,16,9,10,10,10,10,10,10,10,10,10,16,9,2,46,2,44,2, 48,2,68,2,64,2,8,2,72,2,76,2,70,16,9,11,11,11,11,11,11, 11,11,11,16,9,2,46,2,44,2,48,2,68,2,64,2,8,2,72,2,76, -2,70,41,41,93,16,5,93,2,82,253,22,59,248,247,22,252,76,3,83,160, -41,32,39,32,248,247,22,252,76,3,83,160,41,33,39,32,248,247,22,252,76, -3,83,160,41,34,39,32,249,22,59,248,247,22,252,76,3,83,160,41,35,41, -32,248,247,22,252,76,3,83,160,41,36,41,32,249,22,59,248,247,22,252,76, -3,83,160,41,37,41,32,248,247,22,252,76,3,83,160,41,38,41,32,10,41, -20,96,158,16,0,16,7,18,97,2,66,46,36,35,34,18,158,2,68,46,18, +2,70,41,41,93,16,5,93,2,89,253,22,59,248,247,22,252,77,3,83,160, +41,32,39,32,248,247,22,252,77,3,83,160,41,33,39,32,248,247,22,252,77, +3,83,160,41,34,39,32,249,22,59,248,247,22,252,77,3,83,160,41,35,41, +32,248,247,22,252,77,3,83,160,41,36,41,32,249,22,59,248,247,22,252,77, +3,83,160,41,37,41,32,248,247,22,252,77,3,83,160,41,38,41,32,10,41, +20,97,158,16,0,16,7,18,97,2,66,46,36,35,34,18,158,2,68,46,18, 158,2,70,46,18,158,2,76,46,18,158,2,72,46,18,158,2,78,46,18,158, 2,74,46,11,116,83,159,32,93,80,158,32,32,89,162,32,33,36,2,4,223, 0,28,248,22,40,248,22,209,195,249,22,222,195,83,160,41,32,34,8,37,11, @@ -629,7 +629,7 @@ 11,252,200,204,204,10,10,11,28,201,27,247,22,109,87,94,248,91,159,33,11, 20,12,95,33,192,89,162,32,33,43,2,124,226,9,8,2,0,28,248,22,205, 197,27,250,22,115,197,248,22,209,201,89,97,40,32,32,9,222,87,94,28,249, -22,5,89,162,32,33,36,9,223,7,249,22,220,195,194,194,251,22,252,31,2, +22,5,89,162,32,33,36,9,223,7,249,22,220,195,194,194,251,22,252,32,2, 248,22,209,200,6,30,30,118,97,114,105,97,98,108,101,32,117,115,101,100,32, 116,119,105,99,101,32,105,110,32,112,97,116,116,101,114,110,200,201,12,250,22, 114,197,248,22,209,201,249,22,50,202,197,28,248,22,49,197,87,94,248,193,248, @@ -645,21 +645,21 @@ 2,22,58,200,11,11,27,249,80,158,45,43,198,89,162,40,33,33,9,222,10, 250,22,7,250,22,58,2,126,21,93,2,127,249,22,50,62,105,102,130,249,22, 50,21,94,2,88,2,127,249,22,50,27,248,80,158,57,44,23,15,28,249,22, -252,7,2,194,21,94,64,108,105,115,116,131,2,127,28,23,28,21,94,2,89, -2,127,21,94,2,131,94,2,89,2,127,28,248,22,56,206,249,22,50,66,97, +252,7,2,194,21,94,64,108,105,115,116,131,2,127,28,23,28,21,94,2,91, +2,127,21,94,2,131,94,2,91,2,127,28,248,22,56,206,249,22,50,66,97, 110,100,109,97,112,132,249,22,50,250,22,58,2,126,21,93,2,127,199,21,93, -94,2,89,2,127,250,22,58,2,80,63,101,115,99,133,250,22,58,63,108,101, +94,2,91,2,127,250,22,58,2,92,63,101,115,99,133,250,22,58,63,108,101, 116,134,248,22,58,249,22,58,61,108,135,249,22,50,63,109,97,112,136,249,22, -50,250,22,58,2,126,21,93,2,127,249,22,50,2,94,249,22,50,23,20,21, -93,2,133,21,93,94,2,89,2,127,251,22,58,2,130,21,94,65,110,117,108, +50,250,22,58,2,126,21,93,2,127,249,22,50,2,97,249,22,50,23,20,21, +93,2,133,21,93,94,2,91,2,127,251,22,58,2,130,21,94,65,110,117,108, 108,63,137,2,135,249,22,58,65,113,117,111,116,101,138,27,249,22,2,89,97, 40,33,33,9,222,23,28,28,23,41,249,22,1,22,60,194,192,249,22,50,28, -23,40,2,97,2,100,21,93,2,135,21,93,11,197,11,27,249,22,58,248,80, +23,40,2,98,2,96,21,93,2,135,21,93,11,197,11,27,249,22,58,248,80, 158,41,41,202,248,80,158,41,41,248,80,158,42,40,203,27,248,80,158,40,40, 248,80,158,41,40,202,91,159,34,11,90,161,34,32,11,249,91,159,33,11,20, 12,95,33,192,89,162,32,34,43,2,124,226,12,9,8,0,28,248,80,158,36, 39,197,249,22,7,199,10,28,248,80,158,36,45,197,87,94,28,248,80,158,36, -32,248,80,158,37,41,198,251,22,252,31,2,248,22,209,198,6,54,54,109,105, +32,248,80,158,37,41,198,251,22,252,32,2,248,22,209,198,6,54,54,109,105, 115,112,108,97,99,101,100,32,101,108,108,105,112,115,101,115,32,105,110,32,112, 97,116,116,101,114,110,32,40,102,111,108,108,111,119,115,32,111,116,104,101,114, 32,101,108,108,105,112,115,101,115,41,198,248,80,158,40,41,201,12,249,194,248, @@ -671,7 +671,7 @@ 249,22,64,203,200,11,11,250,22,7,250,22,58,2,126,21,93,2,127,250,22, 58,71,108,101,116,42,45,118,97,108,117,101,115,139,248,22,58,249,22,58,21, 95,69,112,114,101,45,105,116,101,109,115,140,70,112,111,115,116,45,105,116,101, -109,115,141,63,111,107,63,142,251,22,58,2,96,2,127,23,25,23,26,249,22, +109,115,141,63,111,107,63,142,251,22,58,2,101,2,127,23,25,23,26,249,22, 50,2,130,249,22,50,2,142,249,22,50,27,27,249,80,158,8,37,46,23,25, 2,140,27,249,80,158,8,38,46,23,23,2,141,28,23,25,249,80,158,8,38, 47,195,194,249,22,50,2,130,249,22,50,197,249,22,50,198,21,93,11,28,23, @@ -681,7 +681,7 @@ 28,248,80,158,38,45,199,27,248,80,158,39,41,200,28,28,201,248,80,158,39, 32,193,11,28,28,248,80,158,39,45,248,80,158,40,40,201,248,80,158,39,39, 248,80,158,40,40,248,80,158,41,40,202,11,27,248,80,158,40,41,248,80,158, -41,40,202,252,199,197,197,11,23,16,11,251,22,252,31,2,248,22,209,199,6, +41,40,202,252,199,197,197,11,23,16,11,251,22,252,32,2,248,22,209,199,6, 29,29,109,105,115,112,108,97,99,101,100,32,101,108,108,105,112,115,101,115,32, 105,110,32,112,97,116,116,101,114,110,199,196,91,159,41,11,90,161,35,32,11, 28,206,252,23,15,206,206,23,23,11,11,250,22,7,11,11,11,90,161,35,35, @@ -695,13 +695,13 @@ 11,28,23,18,28,23,33,250,22,58,2,134,21,93,94,2,143,96,2,130,94, 2,144,2,127,2,127,2,143,195,250,22,58,2,134,21,93,94,2,143,2,127, 195,192,21,93,11,28,202,202,199,28,200,23,23,11,28,248,80,158,38,39,199, -28,196,250,22,7,9,11,11,250,22,7,2,87,11,11,28,248,80,158,38,48, +28,196,250,22,7,9,11,11,250,22,7,2,84,11,11,28,248,80,158,38,48, 199,28,249,80,158,39,33,200,197,28,196,250,22,7,9,11,11,250,22,7,250, 22,58,2,126,21,93,2,127,249,22,50,2,130,249,22,50,21,94,2,37,2, 127,249,22,50,249,22,50,2,130,249,22,50,250,22,58,2,128,2,127,249,22, 58,72,113,117,111,116,101,45,115,121,110,116,97,120,145,23,27,21,94,64,110, 117,108,108,146,11,21,93,11,11,11,28,28,200,248,80,158,38,32,199,11,251, -22,252,31,2,248,22,209,198,6,29,29,109,105,115,112,108,97,99,101,100,32, +22,252,32,2,248,22,209,198,6,29,29,109,105,115,112,108,97,99,101,100,32, 101,108,108,105,112,115,101,115,32,105,110,32,112,97,116,116,101,114,110,198,202, 28,196,250,22,7,248,22,58,202,11,11,250,22,7,27,28,205,89,162,32,33, 36,64,119,114,97,112,147,222,250,22,58,2,126,21,93,2,127,195,89,162,32, @@ -716,7 +716,7 @@ 22,50,2,130,249,22,50,250,22,58,2,39,2,127,205,249,22,50,23,19,21, 93,11,201,91,159,35,11,90,161,35,32,11,27,249,22,252,222,1,248,22,209, 201,248,22,170,205,252,205,197,197,204,248,22,252,3,2,23,17,11,250,198,248, -22,170,205,28,205,205,196,27,249,80,158,46,46,198,250,22,58,2,91,2,127, +22,170,205,28,205,205,196,27,249,80,158,46,46,198,250,22,58,2,94,2,127, 248,22,170,23,19,28,248,22,56,23,16,192,28,197,249,80,158,46,47,194,23, 17,249,22,50,2,130,249,22,50,196,249,22,50,23,21,21,93,11,195,248,22, 252,3,2,23,15,9,91,159,35,11,90,161,35,32,11,252,201,200,23,15,23, @@ -726,7 +726,7 @@ 149,94,68,115,121,110,116,97,120,45,101,150,2,127,21,93,11,196,11,28,196, 250,22,7,9,11,11,250,22,7,250,22,58,2,126,21,93,2,127,249,22,50, 2,130,249,22,50,27,249,22,50,66,101,113,117,97,108,63,151,249,22,50,248, -22,209,23,22,21,93,94,2,150,2,127,28,23,21,250,22,58,2,92,21,94, +22,209,23,22,21,93,94,2,150,2,127,28,23,21,250,22,58,2,102,21,94, 2,144,2,127,195,192,21,94,2,146,11,11,11,83,159,32,93,80,158,32,51, 89,162,32,37,44,2,44,223,0,253,80,158,38,37,199,200,201,202,11,203,83, 159,32,93,80,158,32,52,89,162,32,36,43,2,46,223,0,253,80,158,38,37, @@ -742,7 +742,7 @@ 195,196,249,22,58,194,195,83,159,32,93,80,158,32,47,89,162,32,34,46,2, 35,222,28,28,248,22,49,193,28,249,22,252,5,2,248,22,51,195,2,131,28, 248,22,49,248,22,52,194,248,22,56,248,22,79,194,11,11,11,250,22,58,2, -90,248,22,77,196,196,250,22,58,2,134,248,22,58,249,22,58,61,118,152,198, +100,248,22,77,196,196,250,22,58,2,134,248,22,58,249,22,58,61,118,152,198, 249,22,50,2,130,249,22,50,2,152,249,22,50,250,22,58,2,93,2,152,205, 21,93,11,83,159,32,93,80,158,32,53,89,162,32,36,8,50,2,48,223,0, 91,159,34,10,90,161,33,32,10,195,90,161,33,33,10,89,162,32,38,8,44, @@ -755,7 +755,7 @@ 90,161,33,36,11,248,91,159,33,11,20,12,95,33,192,89,162,32,33,42,2, 124,225,11,2,0,28,248,22,185,196,193,249,22,208,11,249,22,58,248,197,248, 22,170,201,83,160,41,33,38,8,37,194,90,161,33,37,11,28,203,249,80,158, -43,42,198,202,11,87,94,28,248,22,56,198,251,22,1,22,252,31,2,66,115, +43,42,198,202,11,87,94,28,248,22,56,198,251,22,1,22,252,32,2,66,115, 121,110,116,97,120,153,6,48,48,110,111,32,112,97,116,116,101,114,110,32,118, 97,114,105,97,98,108,101,115,32,98,101,102,111,114,101,32,101,108,108,105,112, 115,101,115,32,105,110,32,116,101,109,112,108,97,116,101,249,80,158,47,36,219, @@ -767,7 +767,7 @@ 0,28,248,22,56,194,9,28,248,22,78,194,249,22,50,248,22,76,196,248,195, 248,22,52,197,248,193,248,22,52,195,195,11,27,28,23,15,248,80,158,46,55, 195,11,27,28,23,16,248,80,158,47,55,195,11,27,28,248,22,56,196,12,28, -248,22,56,197,251,22,1,22,252,31,2,2,153,6,29,29,116,111,111,32,109, +248,22,56,197,251,22,1,22,252,32,2,2,153,6,29,29,116,111,111,32,109, 97,110,121,32,101,108,108,105,112,115,101,115,32,105,110,32,116,101,109,112,108, 97,116,101,249,80,158,53,36,24,18,23,15,12,27,253,24,20,23,15,23,24, 23,25,10,23,27,23,28,27,253,24,21,23,18,28,23,25,249,22,64,205,206, @@ -793,19 +793,19 @@ 198,28,28,200,248,80,158,37,32,193,11,28,28,248,80,158,37,45,248,80,158, 38,40,199,248,80,158,37,39,248,80,158,38,40,248,80,158,39,40,200,11,27, 248,80,158,38,41,248,80,158,39,40,200,253,216,198,205,198,11,23,16,23,17, -251,22,252,31,2,2,153,6,30,30,109,105,115,112,108,97,99,101,100,32,101, +251,22,252,32,2,2,153,6,30,30,109,105,115,112,108,97,99,101,100,32,101, 108,108,105,112,115,101,115,32,105,110,32,116,101,109,112,108,97,116,101,212,196, 27,253,216,199,205,199,23,15,23,16,23,17,27,253,217,248,80,158,45,40,206, 206,23,15,23,16,23,17,23,18,28,200,250,22,58,2,126,21,93,2,154,251, 80,158,45,58,206,248,80,158,46,57,201,248,80,158,46,57,200,206,12,28,249, 80,158,37,49,198,11,27,253,215,248,22,252,224,1,248,22,209,205,204,203,206, 23,15,23,16,28,198,250,22,58,2,126,21,93,2,154,249,22,58,72,108,105, -115,116,45,62,118,101,99,116,111,114,163,249,22,58,2,89,248,80,158,44,57, +115,116,45,62,118,101,99,116,111,114,163,249,22,58,2,91,248,80,158,44,57, 200,12,28,248,80,158,36,48,197,28,249,80,158,37,33,198,196,28,197,250,22, 58,2,126,21,93,2,154,249,22,58,2,145,201,12,28,197,27,249,80,158,38, 33,199,200,28,192,250,22,58,2,126,21,93,2,154,250,80,158,42,56,2,154, 249,80,158,44,34,205,206,23,15,87,95,28,28,200,248,80,158,37,32,198,11, -251,22,252,31,2,2,153,6,30,30,109,105,115,112,108,97,99,101,100,32,101, +251,22,252,32,2,2,153,6,30,30,109,105,115,112,108,97,99,101,100,32,101, 108,108,105,112,115,101,115,32,105,110,32,116,101,109,112,108,97,116,101,212,201, 12,249,80,158,38,59,199,200,250,22,58,2,126,21,93,2,154,249,22,58,2, 145,202,28,28,248,80,158,36,32,197,199,11,12,248,202,197,28,248,22,56,197, @@ -818,7 +818,7 @@ 21,94,2,154,63,115,114,99,164,27,249,22,50,2,148,249,22,50,249,22,58, 2,145,28,23,18,250,22,208,23,21,2,108,11,11,249,22,50,248,80,158,47, 57,203,21,93,2,164,28,248,80,158,41,8,28,203,250,22,58,2,134,21,93, -94,64,101,120,110,104,165,11,248,22,58,250,22,58,2,80,2,133,249,22,50, +94,64,101,120,110,104,165,11,248,22,58,250,22,58,2,92,2,133,249,22,50, 72,100,121,110,97,109,105,99,45,119,105,110,100,166,249,22,50,251,22,58,2, 126,9,21,95,64,115,101,116,33,167,2,165,93,1,25,99,117,114,114,101,110, 116,45,101,120,99,101,112,116,105,111,110,45,104,97,110,100,108,101,114,168,249, @@ -874,7 +874,7 @@ 22,49,196,248,22,49,197,11,250,195,248,22,51,199,248,22,51,200,10,28,248, 22,49,197,250,195,198,248,22,51,200,11,28,28,248,22,205,196,248,22,205,197, 11,28,249,22,220,197,198,249,22,50,28,199,195,196,248,22,252,3,2,200,11, -11,195,196,248,22,49,198,197,87,94,28,192,12,251,22,1,22,252,31,2,2, +11,195,196,248,22,49,198,197,87,94,28,192,12,251,22,1,22,252,32,2,2, 153,6,49,49,116,111,111,32,102,101,119,32,101,108,108,105,112,115,101,115,32, 102,111,114,32,112,97,116,116,101,114,110,32,118,97,114,105,97,98,108,101,32, 105,110,32,116,101,109,112,108,97,116,101,249,80,158,39,36,202,248,91,159,33, @@ -885,7 +885,7 @@ 51,195,193,194,83,159,32,93,80,158,32,59,89,162,32,34,36,2,60,222,249, 22,3,89,162,32,33,36,9,223,2,28,248,22,49,194,248,91,159,33,11,20, 12,95,33,192,89,162,32,33,38,2,124,224,2,0,28,248,22,205,195,28,249, -22,220,196,195,250,22,252,31,2,2,153,6,50,50,109,105,115,115,105,110,103, +22,220,196,195,250,22,252,32,2,2,153,6,50,50,109,105,115,115,105,110,103, 32,101,108,108,105,112,115,101,115,32,119,105,116,104,32,112,97,116,116,101,114, 110,32,118,97,114,105,97,98,108,101,32,105,110,32,116,101,109,112,108,97,116, 101,196,12,248,193,248,22,51,196,248,22,51,195,12,195,83,159,32,93,80,158, @@ -907,39 +907,39 @@ 248,80,158,34,41,195,248,80,158,33,8,29,248,80,158,34,40,195,11,28,248, 80,158,33,48,194,248,22,252,3,2,248,80,158,34,32,195,10,194,83,159,32, 99,80,158,32,8,30,80,158,32,8,31,80,158,32,8,32,80,158,32,8,33, -80,158,32,8,34,80,158,32,8,35,80,158,32,8,36,27,247,22,252,103,2, -87,94,28,28,192,248,22,252,3,2,248,22,252,102,2,194,11,250,22,252,32, -2,2,86,6,15,15,105,110,115,112,101,99,116,111,114,32,111,114,32,35,102, -195,12,91,159,37,11,90,161,37,32,11,254,22,252,82,2,2,82,11,34,32, -11,9,204,254,22,7,199,200,201,250,22,252,84,2,205,32,65,100,101,112,116, -104,185,250,22,252,85,2,206,32,2,185,250,22,252,84,2,205,33,66,118,97, -108,118,97,114,186,250,22,252,85,2,206,33,2,186,95,68,35,37,107,101,114, +80,158,32,8,34,80,158,32,8,35,80,158,32,8,36,27,247,22,252,104,2, +87,94,28,28,192,248,22,252,3,2,248,22,252,103,2,194,11,250,22,252,33, +2,2,83,6,15,15,105,110,115,112,101,99,116,111,114,32,111,114,32,35,102, +195,12,91,159,37,11,90,161,37,32,11,254,22,252,83,2,2,89,11,34,32, +11,9,204,254,22,7,199,200,201,250,22,252,85,2,205,32,65,100,101,112,116, +104,185,250,22,252,86,2,206,32,2,185,250,22,252,85,2,205,33,66,118,97, +108,118,97,114,186,250,22,252,86,2,206,33,2,186,95,68,35,37,107,101,114, 110,101,108,187,2,18,74,35,37,115,109,97,108,108,45,115,99,104,101,109,101, 188,9,0}; EVAL_ONE_SIZED_STR((char *)expr, 8255); } { - static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,48,46,51,155,252,154,16,159,32,20,96,158,16,1,20,23, -65,98,101,103,105,110,0,16,0,83,158,39,20,93,114,69,35,37,115,116,120, -99,97,115,101,1,29,2,11,11,10,10,10,32,80,158,32,32,20,96,158,16, + static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,49,46,52,155,252,154,16,159,32,20,97,158,16,1,20,23, +65,98,101,103,105,110,0,16,0,83,158,39,20,94,114,69,35,37,115,116,120, +99,97,115,101,1,29,2,11,11,10,10,10,32,80,158,32,32,20,97,158,16, 1,30,3,2,2,1,20,101,108,108,105,112,115,105,115,45,99,111,117,110,116, 45,101,114,114,111,114,4,254,1,16,0,11,11,16,1,2,4,33,11,16,2, -66,115,121,110,116,97,120,5,73,115,121,110,116,97,120,45,99,97,115,101,42, -42,6,16,2,11,11,16,2,2,5,2,6,32,34,94,16,5,93,2,6,89, +73,115,121,110,116,97,120,45,99,97,115,101,42,42,5,66,115,121,110,116,97, +120,6,16,2,11,11,16,2,2,5,2,6,32,34,94,16,5,93,2,5,89, 162,32,33,8,32,9,223,0,91,159,33,10,90,161,33,32,10,28,248,80,158, 34,32,195,248,22,52,248,80,158,35,33,196,11,87,94,28,28,248,80,158,34, -32,195,249,22,182,248,22,63,210,35,11,12,250,22,252,31,2,11,6,8,8, +32,195,249,22,182,248,22,63,210,35,11,12,250,22,252,32,2,11,6,8,8, 98,97,100,32,102,111,114,109,197,27,248,22,51,209,27,248,22,77,210,27,248, 22,86,211,27,248,22,89,212,27,248,22,89,248,22,52,214,27,248,22,88,248, -22,52,215,87,96,28,248,80,158,40,32,195,12,250,22,252,31,2,248,22,209, +22,52,215,87,96,28,248,80,158,40,32,195,12,250,22,252,32,2,248,22,209, 201,6,56,56,101,120,112,101,99,116,101,100,32,97,32,112,97,114,101,110,116, 104,101,115,105,122,101,100,32,115,101,113,117,101,110,99,101,32,111,102,32,108, 105,116,101,114,97,108,32,105,100,101,110,116,105,102,105,101,114,115,197,249,22, 3,89,162,32,33,39,9,224,9,7,28,248,80,158,34,34,195,12,250,22,252, -31,2,248,22,209,196,6,28,28,108,105,116,101,114,97,108,32,105,115,32,110, +32,2,248,22,209,196,6,28,28,108,105,116,101,114,97,108,32,105,115,32,110, 111,116,32,97,110,32,105,100,101,110,116,105,102,105,101,114,197,248,80,158,42, 33,197,249,22,3,89,162,32,33,40,9,224,9,7,28,28,248,80,158,34,32, -195,250,22,183,34,248,22,63,248,80,158,38,33,199,35,11,12,250,22,252,31, +195,250,22,183,34,248,22,63,248,80,158,38,33,199,35,11,12,250,22,252,32, 2,248,22,209,196,6,10,10,98,97,100,32,99,108,97,117,115,101,197,194,27, 249,22,2,80,158,42,35,195,27,249,22,2,89,162,32,33,37,9,223,11,28, 248,80,158,33,36,248,80,158,34,37,248,80,158,35,37,196,248,80,158,33,35, @@ -987,7 +987,7 @@ 22,58,83,160,41,58,8,37,41,23,27,23,25,23,21,23,21,202,28,201,250, 22,58,83,160,41,59,54,41,248,22,58,249,22,58,68,116,114,121,45,110,101, 120,116,13,250,22,58,83,160,41,8,28,8,28,41,247,22,58,23,20,195,192, -23,16,23,15,203,206,23,18,32,20,96,158,16,9,30,14,65,35,37,115,116, +23,16,23,15,203,206,23,18,32,20,97,158,16,9,30,14,65,35,37,115,116, 120,15,69,115,116,120,45,108,105,115,116,63,16,8,30,17,2,15,69,115,116, 120,45,62,108,105,115,116,18,4,30,19,2,15,71,105,100,101,110,116,105,102, 105,101,114,63,20,2,30,21,2,15,67,115,116,120,45,99,97,114,22,5,30, @@ -996,43 +996,43 @@ 109,97,116,99,104,45,118,97,114,115,29,0,30,30,2,28,74,109,97,107,101, 45,109,97,116,99,104,38,101,110,118,31,1,30,32,2,28,72,115,116,120,45, 109,101,109,113,45,112,111,115,33,5,16,29,18,101,63,97,114,103,34,41,97, -39,10,32,11,16,58,2,6,2,2,2,5,2,2,71,115,116,120,45,118,101, -99,116,111,114,63,35,2,15,67,45,100,101,102,105,110,101,36,74,35,37,100, -101,102,105,110,101,45,101,116,45,97,108,37,2,22,2,15,74,115,116,120,45, -118,101,99,116,111,114,45,114,101,102,38,2,15,2,26,2,15,70,115,116,120, -45,114,111,116,97,116,101,39,2,15,73,115,116,120,45,99,104,101,99,107,47, -101,115,99,40,2,15,67,99,111,110,115,47,35,102,41,2,15,71,115,116,120, -45,114,111,116,97,116,101,42,42,2,15,63,97,110,100,43,71,35,37,113,113, -45,97,110,100,45,111,114,44,74,115,112,108,105,116,45,115,116,120,45,108,105, -115,116,45,2,15,2,4,2,2,62,111,114,46,2,44,2,20,2,15,73,100, -101,102,105,110,101,45,115,116,114,117,99,116,47,2,37,69,115,116,120,45,110, -117,108,108,63,48,2,15,70,113,117,97,115,105,113,117,111,116,101,49,2,44, -64,99,111,110,100,50,66,35,37,99,111,110,100,51,71,115,116,120,45,110,117, -108,108,47,35,102,52,2,15,66,117,110,108,101,115,115,53,2,37,69,97,112, -112,101,110,100,47,35,102,54,2,15,64,119,104,101,110,55,2,37,66,108,101, -116,47,101,99,56,2,37,2,16,2,15,74,45,100,101,102,105,110,101,45,115, -121,110,116,97,120,57,2,37,2,18,2,15,2,24,2,15,97,38,10,33,11, -16,70,75,115,121,110,116,97,120,45,109,97,112,112,105,110,103,63,58,2,28, -2,35,2,15,2,36,2,37,2,22,2,15,2,38,2,15,2,29,2,28,2, -26,2,15,2,39,2,15,2,40,2,15,2,41,2,15,72,110,111,45,101,108, -108,105,112,115,101,115,63,59,2,28,2,42,2,15,2,43,2,44,2,45,2, -15,2,33,2,28,1,21,115,121,110,116,97,120,45,109,97,112,112,105,110,103, -45,118,97,108,118,97,114,60,2,28,2,46,2,44,2,20,2,15,2,31,2, -28,2,47,2,37,1,20,115,121,110,116,97,120,45,109,97,112,112,105,110,103, -45,100,101,112,116,104,61,2,28,79,109,97,107,101,45,115,121,110,116,97,120, -45,109,97,112,112,105,110,103,62,2,28,2,48,2,15,2,49,2,44,2,50, -2,51,2,52,2,15,2,53,2,37,72,109,97,107,101,45,112,101,120,112,97, -110,100,63,2,28,2,54,2,15,2,55,2,37,2,56,2,37,2,16,2,15, -2,57,2,37,2,18,2,15,2,24,2,15,96,37,8,254,1,11,16,0,16, -4,36,11,61,120,64,3,1,7,101,110,118,50,53,55,53,65,16,4,35,11, -61,108,66,3,1,7,101,110,118,50,53,55,55,67,16,14,34,11,63,119,104, +39,10,32,11,16,58,2,6,2,2,63,97,110,100,35,71,35,37,113,113,45, +97,110,100,45,111,114,36,71,115,116,120,45,118,101,99,116,111,114,63,37,2, +15,62,111,114,38,2,36,2,22,2,15,69,97,112,112,101,110,100,47,35,102, +39,2,15,64,99,111,110,100,40,66,35,37,99,111,110,100,41,2,26,2,15, +70,115,116,120,45,114,111,116,97,116,101,42,2,15,74,115,116,120,45,118,101, +99,116,111,114,45,114,101,102,43,2,15,67,99,111,110,115,47,35,102,44,2, +15,67,45,100,101,102,105,110,101,45,74,35,37,100,101,102,105,110,101,45,101, +116,45,97,108,46,71,115,116,120,45,114,111,116,97,116,101,42,47,2,15,73, +115,116,120,45,99,104,101,99,107,47,101,115,99,48,2,15,2,4,2,2,64, +119,104,101,110,49,2,46,74,115,112,108,105,116,45,115,116,120,45,108,105,115, +116,50,2,15,2,20,2,15,2,24,2,15,69,115,116,120,45,110,117,108,108, +63,51,2,15,70,113,117,97,115,105,113,117,111,116,101,52,2,36,73,100,101, +102,105,110,101,45,115,116,114,117,99,116,53,2,46,71,115,116,120,45,110,117, +108,108,47,35,102,54,2,15,66,117,110,108,101,115,115,55,2,46,66,108,101, +116,47,101,99,56,2,46,2,5,2,2,74,45,100,101,102,105,110,101,45,115, +121,110,116,97,120,57,2,46,2,16,2,15,2,18,2,15,97,38,10,33,11, +16,70,2,35,2,36,2,37,2,15,2,38,2,36,2,22,2,15,2,39,2, +15,2,40,2,41,2,26,2,15,2,42,2,15,2,43,2,15,2,44,2,15, +2,45,2,46,2,47,2,15,2,48,2,15,1,20,115,121,110,116,97,120,45, +109,97,112,112,105,110,103,45,100,101,112,116,104,58,2,28,72,110,111,45,101, +108,108,105,112,115,101,115,63,59,2,28,2,49,2,46,2,50,2,15,2,20, +2,15,2,24,2,15,2,51,2,15,75,115,121,110,116,97,120,45,109,97,112, +112,105,110,103,63,60,2,28,2,52,2,36,2,53,2,46,2,54,2,15,2, +55,2,46,2,29,2,28,72,109,97,107,101,45,112,101,120,112,97,110,100,61, +2,28,2,56,2,46,1,21,115,121,110,116,97,120,45,109,97,112,112,105,110, +103,45,118,97,108,118,97,114,62,2,28,2,57,2,46,2,16,2,15,2,31, +2,28,2,18,2,15,2,33,2,28,79,109,97,107,101,45,115,121,110,116,97, +120,45,109,97,112,112,105,110,103,63,2,28,96,37,8,254,1,11,16,0,16, +4,36,11,61,120,64,3,1,7,101,110,118,50,54,48,53,65,16,4,35,11, +61,108,66,3,1,7,101,110,118,50,54,48,55,67,16,14,34,11,63,119,104, 111,68,71,97,114,103,45,105,115,45,115,116,120,63,69,64,101,120,112,114,70, 63,107,119,115,71,68,108,105,116,45,99,111,109,112,72,67,99,108,97,117,115, -101,115,73,3,1,7,101,110,118,50,53,56,49,74,2,74,2,74,2,74,2, +101,115,73,3,1,7,101,110,118,50,54,49,49,74,2,74,2,74,2,74,2, 74,2,74,16,8,33,11,68,112,97,116,116,101,114,110,115,75,67,102,101,110, 100,101,114,115,76,67,97,110,115,119,101,114,115,77,3,1,7,101,110,118,50, -53,56,53,78,2,78,2,78,18,102,64,114,115,108,116,79,43,39,38,37,36, -35,34,33,16,4,42,11,2,34,3,1,7,101,110,118,50,53,56,57,80,18, +54,49,53,78,2,78,2,78,18,102,64,114,115,108,116,79,43,39,38,37,36, +35,34,33,16,4,42,11,2,34,3,1,7,101,110,118,50,54,49,57,80,18, 102,2,11,45,39,38,37,36,35,34,33,16,8,44,11,2,34,2,79,73,112, 97,116,116,101,114,110,45,118,97,114,115,115,81,2,80,2,80,2,80,18,102, 2,7,47,39,38,37,36,35,34,33,16,10,46,11,2,34,2,79,2,81,76, @@ -1041,46 +1041,46 @@ 45,62,115,121,110,116,97,120,45,111,98,106,101,99,116,84,47,18,158,72,113, 117,111,116,101,45,115,121,110,116,97,120,85,47,18,104,78,114,97,105,115,101, 45,115,121,110,116,97,120,45,101,114,114,111,114,86,50,39,38,37,36,35,34, -33,46,16,4,49,11,2,8,3,1,7,101,110,118,50,53,57,49,87,16,4, +33,46,16,4,49,11,2,8,3,1,7,101,110,118,50,54,50,49,87,16,4, 48,11,1,20,117,110,102,108,97,116,45,112,97,116,116,101,114,110,45,118,97, -114,115,115,88,3,1,7,101,110,118,50,53,57,50,89,18,107,2,13,54,39, +114,115,115,88,3,1,7,101,110,118,50,54,50,50,89,18,107,2,13,54,39, 38,37,36,35,34,33,46,49,48,16,4,53,11,64,114,101,115,116,90,3,1, -7,101,110,118,50,53,57,51,91,16,10,52,11,67,112,97,116,116,101,114,110, +7,101,110,118,50,54,50,51,91,16,10,52,11,67,112,97,116,116,101,114,110, 92,66,102,101,110,100,101,114,93,79,117,110,102,108,97,116,45,112,97,116,116, 101,114,110,45,118,97,114,115,94,66,97,110,115,119,101,114,95,3,1,7,101, -110,118,50,53,57,52,96,2,96,2,96,2,96,16,8,51,11,76,116,97,105, +110,118,50,54,50,52,96,2,96,2,96,2,96,16,8,51,11,76,116,97,105, 108,45,112,97,116,116,101,114,110,45,118,97,114,97,69,116,101,109,112,45,118, 97,114,115,98,72,112,97,116,116,101,114,110,45,118,97,114,115,99,3,1,7, -101,110,118,50,54,48,48,100,3,1,7,101,110,118,50,53,57,56,101,3,1, -7,101,110,118,50,53,57,54,102,18,108,2,83,56,39,38,37,36,35,34,33, +101,110,118,50,54,51,48,100,3,1,7,101,110,118,50,54,50,56,101,3,1, +7,101,110,118,50,54,50,54,102,18,108,2,83,56,39,38,37,36,35,34,33, 46,49,48,53,52,51,16,8,55,11,71,100,111,45,116,114,121,45,110,101,120, 116,103,64,109,116,99,104,104,70,99,97,110,116,45,102,97,105,108,63,105,3, -1,7,101,110,118,50,54,48,54,106,2,106,2,106,18,158,2,7,56,18,158, +1,7,101,110,118,50,54,51,54,106,2,106,2,106,18,158,2,7,56,18,158, 62,105,102,107,56,18,158,2,83,56,18,110,63,99,100,114,108,59,39,38,37, 36,35,34,33,46,49,48,53,52,51,55,16,6,58,11,71,112,97,116,116,101, 114,110,45,118,97,114,109,68,116,101,109,112,45,118,97,114,110,3,1,7,101, -110,118,50,54,48,55,111,2,111,16,4,57,11,63,112,111,115,112,3,1,7, -101,110,118,50,54,48,56,113,18,158,64,99,100,100,114,114,59,18,158,65,99, +110,118,50,54,51,55,111,2,111,16,4,57,11,63,112,111,115,112,3,1,7, +101,110,118,50,54,51,56,113,18,158,64,99,100,100,114,114,59,18,158,65,99, 100,100,100,114,115,59,18,158,66,99,100,100,100,100,114,116,59,18,158,63,99, 97,114,117,59,18,158,64,99,97,100,114,118,59,18,158,65,99,97,100,100,114, 119,59,18,158,66,99,97,100,100,100,114,120,59,18,111,69,108,105,115,116,45, 116,97,105,108,121,8,29,39,38,37,36,35,34,33,46,49,48,53,52,51,55, 58,57,16,4,8,28,11,68,97,99,99,101,115,115,111,114,122,3,1,7,101, -110,118,50,54,48,57,123,18,158,68,108,105,115,116,45,114,101,102,124,8,29, +110,118,50,54,51,57,123,18,158,68,108,105,115,116,45,114,101,102,124,8,29, 18,158,1,22,108,101,116,114,101,99,45,115,121,110,116,97,120,101,115,43,118, -97,108,117,101,115,125,56,18,109,2,62,8,31,39,38,37,36,35,34,33,46, +97,108,117,101,115,125,56,18,109,2,63,8,31,39,38,37,36,35,34,33,46, 49,48,53,52,51,55,16,8,8,30,11,2,109,78,117,110,102,108,97,116,45, 112,97,116,116,101,114,110,45,118,97,114,126,2,110,3,1,7,101,110,118,50, -54,49,48,127,2,127,2,127,18,158,2,85,8,31,18,158,2,107,56,18,108, +54,52,48,127,2,127,2,127,18,158,2,85,8,31,18,158,2,107,56,18,108, 2,83,8,33,39,38,37,36,35,34,33,46,49,48,53,52,51,16,10,8,32, 11,2,103,2,104,2,105,61,109,128,2,106,2,106,2,106,2,106,18,158,2, -9,8,33,11,16,5,93,2,5,89,162,32,33,53,9,223,0,91,159,33,10, +9,8,33,11,16,5,93,2,6,89,162,32,33,53,9,223,0,91,159,33,10, 90,161,33,32,10,83,160,41,32,33,42,87,94,28,28,248,80,158,34,32,195, 27,248,80,158,35,33,196,28,248,80,158,35,32,193,248,80,158,35,34,248,80, -158,36,33,194,11,11,12,250,22,252,31,2,11,6,8,8,98,97,100,32,102, +158,36,33,194,11,11,12,250,22,252,32,2,11,6,8,8,98,97,100,32,102, 111,114,109,197,250,22,208,210,27,248,80,158,38,35,248,80,158,39,33,200,27, 251,80,158,42,36,197,11,9,11,27,249,22,2,89,162,32,33,37,9,223,9, -27,249,22,252,69,3,196,89,162,40,32,32,9,222,11,28,248,80,158,34,37, +27,249,22,252,70,3,196,89,162,40,32,32,9,222,11,28,248,80,158,34,37, 193,192,11,195,28,28,27,248,22,56,194,28,192,192,248,22,252,3,2,249,22, 5,89,162,32,33,33,9,222,192,196,248,80,158,40,38,195,11,249,22,58,83, 160,41,33,41,42,196,27,249,91,159,33,11,20,12,95,33,192,89,162,32,34, @@ -1098,26 +1098,26 @@ 248,22,51,193,250,22,58,250,22,208,24,16,199,204,27,248,22,63,197,28,248, 22,185,193,83,160,41,34,47,42,28,249,22,180,194,33,248,22,51,197,249,22, 50,83,160,41,35,49,42,198,249,22,58,83,160,41,36,48,42,250,22,208,11, -66,115,114,99,116,97,103,129,23,20,197,32,20,96,158,16,10,2,23,2,25, -30,130,2,15,2,48,10,2,21,30,131,2,28,2,63,2,30,132,2,28,2, -58,8,30,133,2,28,2,59,4,30,134,2,28,2,61,6,30,135,2,28,2, -60,7,2,19,16,5,18,100,2,7,8,37,39,38,37,16,4,8,36,11,2, -64,3,1,7,101,110,118,50,54,49,52,136,16,4,8,35,11,68,104,101,114, -101,45,115,116,120,137,3,1,7,101,110,118,50,54,49,54,138,16,4,8,34, +66,115,114,99,116,97,103,129,23,20,197,32,20,97,158,16,10,2,23,2,25, +30,130,2,15,2,51,10,2,21,30,131,2,28,2,61,2,30,132,2,28,2, +60,8,30,133,2,28,2,59,4,30,134,2,28,2,58,6,30,135,2,28,2, +62,7,2,19,16,5,18,100,2,7,8,37,39,38,37,16,4,8,36,11,2, +64,3,1,7,101,110,118,50,54,52,52,136,16,4,8,35,11,68,104,101,114, +101,45,115,116,120,137,3,1,7,101,110,118,50,54,52,54,138,16,4,8,34, 11,2,137,2,138,18,102,2,85,8,42,39,38,37,8,36,16,4,8,41,11, -2,137,2,138,16,4,8,40,11,2,92,3,1,7,101,110,118,50,54,50,49, +2,137,2,138,16,4,8,40,11,2,92,3,1,7,101,110,118,50,54,53,49, 139,16,4,8,39,11,71,117,110,105,113,117,101,45,118,97,114,115,140,3,1, -7,101,110,118,50,54,50,50,141,16,4,8,38,11,72,118,97,114,45,98,105, -110,100,105,110,103,115,142,3,1,7,101,110,118,50,54,50,51,143,18,105,9, +7,101,110,118,50,54,53,50,141,16,4,8,38,11,72,118,97,114,45,98,105, +110,100,105,110,103,115,142,3,1,7,101,110,118,50,54,53,51,143,18,105,9, 8,46,39,38,37,8,36,8,41,8,40,8,39,8,38,16,6,8,45,11,67, 112,114,111,116,111,45,114,144,76,110,111,110,45,112,97,116,116,101,114,110,45, -118,97,114,115,145,3,1,7,101,110,118,50,54,50,57,146,2,146,16,6,8, +118,97,114,115,145,3,1,7,101,110,118,50,54,53,57,146,2,146,16,6,8, 44,11,79,98,117,105,108,100,45,102,114,111,109,45,116,101,109,112,108,97,116, -101,147,61,114,148,3,1,7,101,110,118,50,54,51,56,149,2,149,16,4,8, -43,11,63,108,101,110,150,3,1,7,101,110,118,50,54,52,49,151,18,158,65, +101,147,61,114,148,3,1,7,101,110,118,50,54,54,56,149,2,149,16,4,8, +43,11,63,108,101,110,150,3,1,7,101,110,118,50,54,55,49,151,18,158,65, 108,105,115,116,42,152,8,46,18,104,2,85,8,47,39,38,37,8,36,8,41, 8,40,8,39,8,38,8,45,8,44,11,93,83,159,32,93,80,158,32,32,89, -162,32,34,38,2,4,222,251,22,252,31,2,2,5,6,47,47,105,110,99,111, +162,32,34,38,2,4,222,251,22,252,32,2,2,6,6,47,47,105,110,99,111, 109,112,97,116,105,98,108,101,32,101,108,108,105,112,115,105,115,32,109,97,116, 99,104,32,99,111,117,110,116,115,32,102,111,114,32,116,101,109,112,108,97,116, 101,196,197,95,68,35,37,107,101,114,110,101,108,153,2,15,74,35,37,115,109, @@ -1125,67 +1125,67 @@ EVAL_ONE_SIZED_STR((char *)expr, 4262); } { - static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,48,46,51,71,252,1,7,159,32,20,96,158,16,1,20,23, -65,98,101,103,105,110,0,16,0,83,158,39,20,93,114,68,35,37,115,116,120, -108,111,99,1,29,2,11,11,10,10,10,32,80,158,32,32,20,96,158,16,2, + static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,49,46,52,71,252,1,7,159,32,20,97,158,16,1,20,23, +65,98,101,103,105,110,0,16,0,83,158,39,20,94,114,68,35,37,115,116,120, +108,111,99,1,29,2,11,11,10,10,10,32,80,158,32,32,20,97,158,16,2, 30,3,2,2,68,108,111,99,45,105,110,115,112,4,254,1,30,5,2,2,68, 114,101,108,111,99,97,116,101,6,254,1,16,0,11,11,16,2,2,4,2,6, -34,11,16,3,71,115,121,110,116,97,120,45,99,97,115,101,7,70,115,121,110, -116,97,120,47,108,111,99,8,72,115,121,110,116,97,120,45,99,97,115,101,42, +34,11,16,3,72,115,121,110,116,97,120,45,99,97,115,101,42,7,70,115,121, +110,116,97,120,47,108,111,99,8,71,115,121,110,116,97,120,45,99,97,115,101, 9,16,3,11,11,11,16,3,2,7,2,8,2,9,32,35,95,16,5,93,2, -9,89,162,32,33,57,9,223,0,27,28,248,80,158,34,32,195,249,80,158,35, +7,89,162,32,33,57,9,223,0,27,28,248,80,158,34,32,195,249,80,158,35, 33,248,80,158,36,34,197,27,248,80,158,37,35,198,28,248,80,158,37,32,193, 249,80,158,38,33,248,80,158,39,34,195,27,248,80,158,40,35,196,28,248,80, 158,40,32,193,249,80,158,41,33,248,80,158,42,34,195,27,248,80,158,43,35, 196,28,248,80,158,43,32,193,249,80,158,44,33,248,80,158,45,34,195,27,248, 80,158,46,35,196,28,248,80,158,46,36,193,248,80,158,46,37,193,11,11,11, 11,11,28,192,27,248,22,51,194,27,248,22,77,195,27,248,22,86,196,27,248, -22,89,197,27,248,22,88,198,27,252,22,60,202,200,201,198,199,27,83,160,41, +22,89,197,27,248,22,88,198,27,252,22,60,199,198,202,200,201,27,83,160,41, 32,40,38,250,22,208,83,160,41,33,43,38,250,22,208,83,160,41,34,46,38, -254,22,60,83,160,41,35,53,38,248,22,51,23,15,83,160,41,36,53,38,248, -22,86,23,15,248,22,77,23,15,248,22,88,23,15,248,22,89,23,15,83,160, -41,37,46,38,195,250,22,252,31,2,11,6,10,10,98,97,100,32,115,121,110, -116,97,120,197,32,20,96,158,16,6,30,10,65,35,37,115,116,120,11,69,115, +254,22,60,83,160,41,35,53,38,248,22,86,23,15,83,160,41,36,53,38,248, +22,88,23,15,248,22,89,23,15,248,22,51,23,15,248,22,77,23,15,83,160, +41,37,46,38,195,250,22,252,32,2,11,6,10,10,98,97,100,32,115,121,110, +116,97,120,197,32,20,97,158,16,6,30,10,65,35,37,115,116,120,11,69,115, 116,120,45,112,97,105,114,63,12,11,30,13,2,11,67,99,111,110,115,47,35, 102,14,1,30,15,2,11,67,115,116,120,45,99,97,114,16,5,30,17,2,11, 67,115,116,120,45,99,100,114,18,6,30,19,2,11,69,115,116,120,45,108,105, 115,116,63,20,8,30,21,2,11,69,115,116,120,45,62,108,105,115,116,22,4, -16,6,18,16,2,95,66,115,114,99,116,97,103,23,34,93,8,252,48,7,95, -9,8,252,48,7,69,35,37,115,116,120,99,97,115,101,24,18,100,64,100,101, -115,116,25,41,97,40,10,32,11,16,26,64,119,104,101,110,26,74,35,37,100, -101,102,105,110,101,45,101,116,45,97,108,27,66,117,110,108,101,115,115,28,2, -27,66,108,101,116,47,101,99,29,2,27,2,7,2,2,67,45,100,101,102,105, -110,101,30,2,27,66,115,121,110,116,97,120,31,2,24,74,45,100,101,102,105, -110,101,45,115,121,110,116,97,120,32,2,27,73,115,121,110,116,97,120,45,99, -97,115,101,42,42,33,2,24,2,4,2,2,73,100,101,102,105,110,101,45,115, -116,114,117,99,116,34,2,27,2,6,2,2,2,9,2,2,2,8,2,2,97, -39,10,33,11,16,4,2,31,2,24,2,33,2,24,96,38,8,254,1,11,16, -0,16,4,37,11,63,115,116,120,35,3,1,7,101,110,118,50,54,52,53,36, -16,12,36,11,3,1,4,103,50,55,52,37,3,1,4,103,50,55,53,38,3, -1,4,103,50,55,54,39,3,1,4,103,50,55,55,40,3,1,4,103,50,55, -56,41,3,1,7,101,110,118,50,54,53,51,42,2,42,2,42,2,42,2,42, +16,6,18,16,2,95,66,115,114,99,116,97,103,23,34,93,8,252,70,7,95, +9,8,252,70,7,69,35,37,115,116,120,99,97,115,101,24,18,100,64,100,101, +115,116,25,41,97,40,10,32,11,16,26,67,45,100,101,102,105,110,101,26,74, +35,37,100,101,102,105,110,101,45,101,116,45,97,108,27,73,115,121,110,116,97, +120,45,99,97,115,101,42,42,28,2,24,2,9,2,2,73,100,101,102,105,110, +101,45,115,116,114,117,99,116,29,2,27,66,115,121,110,116,97,120,30,2,24, +2,4,2,2,2,6,2,2,74,45,100,101,102,105,110,101,45,115,121,110,116, +97,120,31,2,27,64,119,104,101,110,32,2,27,2,8,2,2,2,7,2,2, +66,117,110,108,101,115,115,33,2,27,66,108,101,116,47,101,99,34,2,27,97, +39,10,33,11,16,4,2,28,2,24,2,30,2,24,96,38,8,254,1,11,16, +0,16,4,37,11,63,115,116,120,35,3,1,7,101,110,118,50,54,55,53,36, +16,12,36,11,3,1,4,103,50,56,48,37,3,1,4,103,50,56,49,38,3, +1,4,103,50,56,50,39,3,1,4,103,50,56,51,40,3,1,4,103,50,56, +52,41,3,1,7,101,110,118,50,54,56,51,42,2,42,2,42,2,42,2,42, 16,12,35,11,61,95,43,64,115,116,120,101,44,62,107,108,45,64,105,100,61, -63,46,66,99,108,97,117,115,101,47,3,1,7,101,110,118,50,54,53,52,48, -2,48,2,48,2,48,2,48,18,158,63,99,116,120,49,41,18,158,2,33,41, -18,158,11,41,18,158,2,49,41,11,16,5,93,2,7,89,162,32,33,56,9, +63,46,66,99,108,97,117,115,101,47,3,1,7,101,110,118,50,54,56,52,48, +2,48,2,48,2,48,2,48,18,158,63,99,116,120,49,41,18,158,2,28,41, +18,158,11,41,18,158,2,49,41,11,16,5,93,2,9,89,162,32,33,56,9, 223,0,27,28,248,80,158,34,32,195,249,80,158,35,33,248,80,158,36,34,197, 27,248,80,158,37,35,198,28,248,80,158,37,32,193,249,80,158,38,33,248,80, 158,39,34,195,27,248,80,158,40,35,196,28,248,80,158,40,32,193,249,80,158, 41,33,248,80,158,42,34,195,27,248,80,158,43,35,196,28,248,80,158,43,36, 193,248,80,158,43,37,193,11,11,11,11,28,192,27,248,22,51,194,27,248,22, -77,195,27,248,22,86,196,27,248,22,87,197,27,251,22,60,200,199,197,198,27, +77,195,27,248,22,86,196,27,248,22,87,197,27,251,22,60,197,200,198,199,27, 83,160,41,32,39,38,250,22,208,83,160,41,33,42,38,250,22,208,83,160,41, -34,45,38,254,22,60,83,160,41,35,52,38,248,22,51,23,15,83,160,41,36, -52,38,248,22,77,23,15,248,22,87,23,15,83,160,41,37,52,38,248,22,86, -23,15,83,160,41,38,45,38,195,250,22,252,31,2,11,6,10,10,98,97,100, -32,115,121,110,116,97,120,197,32,20,96,158,16,6,2,10,2,13,2,15,2, -17,2,19,2,21,16,7,18,16,2,95,2,23,42,93,8,252,56,7,95,9, -8,252,56,7,2,24,18,100,2,25,46,40,39,38,16,4,45,11,2,35,3, -1,7,101,110,118,50,54,54,51,50,16,10,44,11,3,1,4,103,50,55,57, -51,3,1,4,103,50,56,48,52,3,1,4,103,50,56,49,53,3,1,4,103, -50,56,50,54,3,1,7,101,110,118,50,54,55,48,55,2,55,2,55,2,55, -16,10,43,11,2,43,2,44,2,45,2,47,3,1,7,101,110,118,50,54,55, -49,56,2,56,2,56,2,56,18,158,2,49,46,18,158,2,33,46,18,158,11, +34,45,38,254,22,60,83,160,41,35,52,38,248,22,77,23,15,83,160,41,36, +52,38,248,22,87,23,15,248,22,86,23,15,83,160,41,37,52,38,248,22,51, +23,15,83,160,41,38,45,38,195,250,22,252,32,2,11,6,10,10,98,97,100, +32,115,121,110,116,97,120,197,32,20,97,158,16,6,2,10,2,13,2,15,2, +17,2,19,2,21,16,7,18,16,2,95,2,23,42,93,8,252,78,7,95,9, +8,252,78,7,2,24,18,100,2,25,46,40,39,38,16,4,45,11,2,35,3, +1,7,101,110,118,50,54,57,51,50,16,10,44,11,3,1,4,103,50,56,53, +51,3,1,4,103,50,56,54,52,3,1,4,103,50,56,55,53,3,1,4,103, +50,56,56,54,3,1,7,101,110,118,50,55,48,48,55,2,55,2,55,2,55, +16,10,43,11,2,43,2,44,2,45,2,47,3,1,7,101,110,118,50,55,48, +49,56,2,56,2,56,2,56,18,158,2,49,46,18,158,2,28,46,18,158,11, 46,18,158,79,109,111,100,117,108,101,45,105,100,101,110,116,105,102,105,101,114, 61,63,57,46,18,158,2,49,46,11,16,5,93,2,8,89,162,32,33,56,9, 223,0,27,28,248,80,158,34,32,195,249,80,158,35,33,248,80,158,36,34,197, @@ -1197,26 +1197,26 @@ 33,41,38,250,22,208,83,160,41,34,44,38,250,22,58,83,160,41,35,47,38, 248,22,52,203,250,22,208,83,160,41,36,50,38,249,22,58,83,160,41,37,52, 38,248,22,51,23,16,83,160,41,38,50,38,83,160,41,39,44,38,195,250,22, -252,31,2,11,6,10,10,98,97,100,32,115,121,110,116,97,120,197,32,20,96, +252,32,2,11,6,10,10,98,97,100,32,115,121,110,116,97,120,197,32,20,97, 158,16,6,2,10,2,13,2,15,2,17,30,58,2,11,69,97,112,112,101,110, 100,47,35,102,59,0,30,60,2,11,71,115,116,120,45,110,117,108,108,47,35, -102,61,9,16,8,18,16,2,95,2,23,47,93,8,252,66,7,95,9,8,252, -66,7,2,24,18,100,2,25,51,40,39,38,16,4,50,11,2,35,3,1,7, -101,110,118,50,54,55,57,62,16,8,49,11,3,1,4,103,50,56,51,63,3, -1,4,103,50,56,52,64,3,1,4,103,50,56,53,65,3,1,7,101,110,118, -50,54,56,54,66,2,66,2,66,16,8,48,11,2,43,63,108,111,99,67,67, -112,97,116,116,101,114,110,68,3,1,7,101,110,118,50,54,56,55,69,2,69, -2,69,18,158,2,49,51,18,158,2,6,51,18,158,2,49,51,18,158,2,31, +102,61,9,16,8,18,16,2,95,2,23,47,93,8,252,88,7,95,9,8,252, +88,7,2,24,18,100,2,25,51,40,39,38,16,4,50,11,2,35,3,1,7, +101,110,118,50,55,48,57,62,16,8,49,11,3,1,4,103,50,56,57,63,3, +1,4,103,50,57,48,64,3,1,4,103,50,57,49,65,3,1,7,101,110,118, +50,55,49,54,66,2,66,2,66,16,8,48,11,2,43,63,108,111,99,67,67, +112,97,116,116,101,114,110,68,3,1,7,101,110,118,50,55,49,55,69,2,69, +2,69,18,158,2,49,51,18,158,2,6,51,18,158,2,49,51,18,158,2,30, 51,18,158,2,49,51,18,158,2,49,51,11,94,83,159,32,93,80,158,32,32, -247,22,252,104,2,83,159,32,93,80,158,32,33,89,162,32,34,40,2,6,223, +247,22,252,105,2,83,159,32,93,80,158,32,33,89,162,32,34,40,2,6,223, 0,27,250,22,208,198,248,22,209,199,197,251,22,231,196,199,80,158,37,32,11, 95,68,35,37,107,101,114,110,101,108,70,2,24,2,27,94,2,70,2,24,0}; EVAL_ONE_SIZED_STR((char *)expr, 1805); } { - static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,48,46,51,115,252,60,10,159,32,20,96,158,16,1,20,23, -65,98,101,103,105,110,0,16,0,83,158,39,20,93,114,70,35,37,119,105,116, -104,45,115,116,120,1,29,2,11,11,10,10,10,32,80,158,32,32,20,96,158, + static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,49,46,52,115,252,74,10,159,32,20,97,158,16,1,20,23, +65,98,101,103,105,110,0,16,0,83,158,39,20,94,114,70,35,37,119,105,116, +104,45,115,116,120,1,29,2,11,11,10,10,10,32,80,158,32,32,20,97,158, 16,7,30,3,2,2,76,119,105,116,104,45,115,121,110,116,97,120,45,102,97, 105,108,4,254,1,30,5,2,2,67,99,111,117,110,116,101,114,6,254,1,30, 7,2,2,73,97,112,112,101,110,100,45,110,117,109,98,101,114,8,254,1,30, @@ -1233,143 +1233,144 @@ 249,80,158,40,33,248,80,158,41,34,195,27,248,80,158,42,35,196,28,248,80, 158,42,37,193,248,80,158,42,38,193,11,11,11,11,11,28,192,27,248,22,51, 194,27,248,22,77,195,27,248,22,79,196,249,80,158,39,39,200,27,249,22,60, -198,197,27,83,160,41,33,41,44,250,22,208,83,160,41,34,44,44,250,22,208, -83,160,41,35,47,44,249,22,50,83,160,41,36,49,44,201,83,160,41,37,47, -44,195,27,28,248,80,158,36,32,195,249,80,158,37,33,248,80,158,38,34,197, -27,248,80,158,39,35,198,28,248,80,158,39,32,193,27,27,248,80,158,41,34, -195,28,248,80,158,41,37,193,248,22,8,89,162,32,33,39,9,224,9,1,27, -249,22,2,89,162,32,33,44,9,224,4,5,249,80,158,35,40,28,248,80,158, -36,32,197,249,80,158,37,33,248,80,158,38,34,199,27,248,80,158,39,35,200, -28,248,80,158,39,32,193,249,80,158,40,33,248,80,158,41,34,195,248,80,158, -41,36,248,80,158,42,35,196,11,11,194,248,80,158,37,38,196,28,248,22,56, -193,21,94,9,9,248,80,158,35,41,193,11,28,192,249,80,158,41,42,194,27, -248,80,158,43,35,197,28,248,80,158,43,32,193,249,80,158,44,33,248,80,158, -45,34,195,27,248,80,158,46,35,196,28,248,80,158,46,37,193,248,80,158,46, -38,193,11,11,11,11,11,28,192,27,248,22,51,194,27,248,22,77,195,27,248, -22,86,196,27,248,22,89,197,27,248,22,88,198,27,248,22,215,27,83,160,41, -38,43,44,250,22,208,83,160,41,39,46,44,200,195,87,94,251,80,158,45,43, -201,206,27,83,160,41,40,46,44,250,22,208,83,160,41,41,49,44,204,195,9, -27,249,22,2,89,162,32,33,34,9,222,248,22,47,65,119,115,116,109,112,19, -195,27,249,22,2,89,162,32,33,36,9,222,250,22,208,195,64,104,101,114,101, -20,195,196,27,248,22,215,27,83,160,41,42,46,44,250,22,208,83,160,41,43, -49,44,204,195,250,22,208,83,160,41,44,47,44,250,22,58,63,108,101,116,21, -251,22,2,89,162,32,35,42,9,222,249,22,58,194,250,22,58,1,20,100,97, -116,117,109,45,62,115,121,110,116,97,120,45,111,98,106,101,99,116,22,249,22, -58,72,113,117,111,116,101,45,115,121,110,116,97,120,23,200,199,204,203,205,249, -91,159,33,11,20,12,95,33,192,89,162,32,34,57,64,108,111,111,112,24,226, -21,13,14,0,28,248,22,56,197,27,249,22,60,196,197,27,83,160,41,45,37, -44,250,22,208,83,160,41,46,40,44,250,22,208,83,160,41,47,43,44,249,22, -50,83,160,41,48,45,44,201,83,160,41,49,43,44,195,26,8,22,58,73,115, -121,110,116,97,120,45,99,97,115,101,42,42,25,11,10,248,22,51,205,9,79, -109,111,100,117,108,101,45,105,100,101,110,116,105,102,105,101,114,61,63,26,249, -22,58,248,22,51,23,16,249,204,248,22,52,23,17,248,22,52,23,18,249,22, -58,65,95,101,108,115,101,27,249,22,58,2,4,249,22,58,2,23,250,22,208, -11,248,22,207,248,22,51,23,24,248,22,51,23,23,202,200,23,16,250,22,252, -31,2,11,6,10,10,98,97,100,32,115,121,110,116,97,120,197,32,20,96,158, -16,12,30,28,2,12,69,115,116,120,45,112,97,105,114,63,29,11,30,30,2, -12,67,99,111,110,115,47,35,102,31,1,30,32,2,12,67,115,116,120,45,99, -97,114,33,5,30,34,2,12,67,115,116,120,45,99,100,114,35,6,30,36,2, -12,71,115,116,120,45,110,117,108,108,47,35,102,37,9,30,38,2,12,2,13, -8,30,39,2,12,2,15,4,30,40,68,35,37,115,116,120,108,111,99,41,68, -114,101,108,111,99,97,116,101,42,1,30,43,2,12,73,115,116,120,45,99,104, -101,99,107,47,101,115,99,44,7,30,45,2,12,70,115,116,120,45,114,111,116, -97,116,101,46,12,30,47,2,12,69,97,112,112,101,110,100,47,35,102,48,0, -30,49,64,35,37,115,99,50,74,103,101,116,45,109,97,116,99,104,45,118,97, -114,115,51,0,16,18,18,98,2,20,38,97,36,10,32,11,16,72,2,25,69, -35,37,115,116,120,99,97,115,101,52,72,115,121,110,116,97,120,45,99,97,115, -101,42,53,2,41,2,18,2,2,66,115,121,110,116,97,120,54,2,52,71,115, -116,120,45,118,101,99,116,111,114,63,55,2,12,67,45,100,101,102,105,110,101, -56,74,35,37,100,101,102,105,110,101,45,101,116,45,97,108,57,2,33,2,12, -74,115,116,120,45,118,101,99,116,111,114,45,114,101,102,58,2,12,2,35,2, -12,70,115,121,110,116,97,120,47,108,111,99,59,2,41,2,46,2,12,2,44, -2,12,2,31,2,12,2,4,2,2,71,115,116,120,45,114,111,116,97,116,101, -42,60,2,12,63,97,110,100,61,71,35,37,113,113,45,97,110,100,45,111,114, -62,74,115,112,108,105,116,45,115,116,120,45,108,105,115,116,63,2,12,2,6, -2,2,74,45,100,101,102,105,110,101,45,115,121,110,116,97,120,64,2,57,2, -17,2,12,2,10,2,2,73,100,101,102,105,110,101,45,115,116,114,117,99,116, -65,2,57,69,115,116,120,45,110,117,108,108,63,66,2,12,70,113,117,97,115, -105,113,117,111,116,101,67,2,62,64,99,111,110,100,68,66,35,37,99,111,110, -100,69,2,37,2,12,66,117,110,108,101,115,115,70,2,57,2,8,2,2,2, -48,2,12,64,119,104,101,110,71,2,57,66,108,101,116,47,101,99,72,2,57, -2,13,2,12,62,111,114,73,2,62,2,15,2,12,2,29,2,12,71,115,121, -110,116,97,120,45,99,97,115,101,74,2,41,97,35,10,33,11,16,36,72,115, -116,120,45,109,101,109,113,45,112,111,115,75,2,50,72,110,111,45,101,108,108, -105,112,115,101,115,63,76,2,50,2,51,2,50,2,61,2,62,1,20,115,121, -110,116,97,120,45,109,97,112,112,105,110,103,45,100,101,112,116,104,77,2,50, -2,74,2,41,2,54,2,52,2,73,2,62,2,25,2,52,75,115,121,110,116, -97,120,45,109,97,112,112,105,110,103,63,78,2,50,1,21,115,121,110,116,97, -120,45,109,97,112,112,105,110,103,45,118,97,108,118,97,114,79,2,50,2,68, -2,69,2,53,2,41,79,109,97,107,101,45,115,121,110,116,97,120,45,109,97, -112,112,105,110,103,80,2,50,2,59,2,41,74,109,97,107,101,45,109,97,116, -99,104,38,101,110,118,81,2,50,2,67,2,62,72,109,97,107,101,45,112,101, -120,112,97,110,100,82,2,50,96,34,8,254,1,11,16,0,16,4,33,11,61, -120,83,3,1,7,101,110,118,50,54,57,56,84,18,16,2,95,66,115,114,99, -116,97,103,85,39,93,8,252,99,7,95,9,8,252,99,7,2,52,18,100,64, -100,101,115,116,86,42,36,35,34,33,16,8,41,11,3,1,4,103,50,57,49, -87,3,1,4,103,50,57,50,88,3,1,4,103,50,57,51,89,3,1,7,101, -110,118,50,55,48,53,90,2,90,2,90,16,8,40,11,61,95,91,62,101,49, -92,62,101,50,93,3,1,7,101,110,118,50,55,48,54,94,2,94,2,94,18, -158,63,99,116,120,95,42,18,158,2,0,42,18,158,2,95,42,18,16,2,95, -2,85,43,93,8,252,101,7,95,9,8,252,101,7,2,52,18,100,2,86,46, -36,35,34,33,16,12,45,11,3,1,4,103,50,56,54,96,3,1,4,103,50, -56,55,97,3,1,4,103,50,56,56,98,3,1,4,103,50,56,57,99,3,1, -4,103,50,57,48,100,3,1,7,101,110,118,50,55,50,51,101,2,101,2,101, -2,101,2,101,16,12,44,11,2,91,63,111,117,116,102,62,105,110,103,2,92, -2,93,3,1,7,101,110,118,50,55,50,52,104,2,104,2,104,2,104,2,104, -18,16,2,95,2,85,47,93,8,252,117,7,95,9,8,252,117,7,2,52,18, -101,2,86,49,36,35,34,33,45,44,16,4,48,11,63,105,110,115,105,3,1, -7,101,110,118,50,55,51,48,106,18,16,2,95,2,85,50,93,8,252,118,7, -95,9,8,252,118,7,2,52,18,158,2,86,49,18,102,2,20,52,36,35,34, -33,45,44,48,16,8,51,11,64,116,109,112,115,107,65,104,101,114,101,115,108, -64,111,117,116,115,109,3,1,7,101,110,118,50,55,51,51,110,2,110,2,110, -18,16,2,95,2,85,53,93,8,252,123,7,95,9,8,252,123,7,2,52,18, -103,2,86,55,36,35,34,33,45,44,48,51,16,4,54,11,2,24,3,1,7, -101,110,118,50,55,51,56,111,18,158,2,95,55,18,158,2,0,55,18,158,2, -95,55,11,96,83,159,32,93,80,158,32,32,89,162,32,33,36,2,4,222,250, -22,252,31,2,2,18,6,20,20,98,105,110,100,105,110,103,32,109,97,116,99, -104,32,102,97,105,108,101,100,195,83,159,32,93,80,158,32,33,32,83,159,32, -93,80,158,32,34,89,162,32,33,38,2,8,223,0,87,94,83,160,34,11,80, -158,32,33,248,22,169,80,158,33,33,248,22,41,250,22,252,179,1,6,4,4, -126,97,126,115,197,80,158,36,33,83,159,32,93,80,158,32,35,89,162,32,33, -37,2,10,223,0,87,94,28,248,80,158,33,36,194,12,250,22,252,32,2,2, -10,6,11,11,115,121,110,116,97,120,32,112,97,105,114,196,27,248,80,158,34, -37,195,249,22,2,89,162,32,33,39,9,223,3,248,247,22,252,75,3,28,248, -22,40,195,249,22,208,11,248,80,158,36,34,197,28,248,22,252,135,1,195,249, -22,208,11,248,80,158,36,34,197,28,248,80,158,34,38,195,249,22,208,11,248, -80,158,36,34,248,22,209,198,249,22,208,11,248,80,158,36,34,64,116,101,109, -112,112,194,97,68,35,37,107,101,114,110,101,108,113,2,12,2,41,74,35,37, -115,109,97,108,108,45,115,99,104,101,109,101,114,2,52,98,2,113,2,52,2, -41,2,50,2,62,2,69,0}; - EVAL_ONE_SIZED_STR((char *)expr, 2632); +197,198,27,83,160,41,33,41,44,250,22,208,83,160,41,34,44,44,250,22,208, +83,160,41,35,47,44,250,22,60,83,160,41,36,50,44,248,22,52,203,248,22, +51,203,83,160,41,37,47,44,195,27,28,248,80,158,36,32,195,249,80,158,37, +33,248,80,158,38,34,197,27,248,80,158,39,35,198,28,248,80,158,39,32,193, +27,27,248,80,158,41,34,195,28,248,80,158,41,37,193,248,22,8,89,162,32, +33,39,9,224,9,1,27,249,22,2,89,162,32,33,44,9,224,4,5,249,80, +158,35,40,28,248,80,158,36,32,197,249,80,158,37,33,248,80,158,38,34,199, +27,248,80,158,39,35,200,28,248,80,158,39,32,193,249,80,158,40,33,248,80, +158,41,34,195,248,80,158,41,36,248,80,158,42,35,196,11,11,194,248,80,158, +37,38,196,28,248,22,56,193,21,94,9,9,248,80,158,35,41,193,11,28,192, +249,80,158,41,42,194,27,248,80,158,43,35,197,28,248,80,158,43,32,193,249, +80,158,44,33,248,80,158,45,34,195,27,248,80,158,46,35,196,28,248,80,158, +46,37,193,248,80,158,46,38,193,11,11,11,11,11,28,192,27,248,22,51,194, +27,248,22,77,195,27,248,22,86,196,27,248,22,89,197,27,248,22,88,198,27, +248,22,215,27,83,160,41,38,43,44,250,22,208,83,160,41,39,46,44,200,195, +87,94,251,80,158,45,43,201,206,27,83,160,41,40,46,44,250,22,208,83,160, +41,41,49,44,204,195,9,27,249,22,2,89,162,32,33,34,9,222,248,22,47, +65,119,115,116,109,112,19,195,27,249,22,2,89,162,32,33,36,9,222,250,22, +208,195,64,104,101,114,101,20,195,196,27,248,22,215,27,83,160,41,42,46,44, +250,22,208,83,160,41,43,49,44,204,195,250,22,208,83,160,41,44,47,44,250, +22,58,63,108,101,116,21,251,22,2,89,162,32,35,42,9,222,249,22,58,194, +250,22,58,1,20,100,97,116,117,109,45,62,115,121,110,116,97,120,45,111,98, +106,101,99,116,22,249,22,58,72,113,117,111,116,101,45,115,121,110,116,97,120, +23,200,199,204,203,205,249,91,159,33,11,20,12,95,33,192,89,162,32,34,57, +64,108,111,111,112,24,226,21,13,14,0,28,248,22,56,197,27,249,22,60,197, +196,27,83,160,41,45,37,44,250,22,208,83,160,41,46,40,44,250,22,208,83, +160,41,47,43,44,250,22,60,83,160,41,48,46,44,248,22,52,203,248,22,51, +203,83,160,41,49,43,44,195,26,8,22,58,73,115,121,110,116,97,120,45,99, +97,115,101,42,42,25,11,10,248,22,51,205,9,79,109,111,100,117,108,101,45, +105,100,101,110,116,105,102,105,101,114,61,63,26,249,22,58,248,22,51,23,16, +249,204,248,22,52,23,17,248,22,52,23,18,249,22,58,65,95,101,108,115,101, +27,249,22,58,2,4,249,22,58,2,23,250,22,208,11,248,22,207,248,22,51, +23,24,248,22,51,23,23,202,200,23,16,250,22,252,32,2,11,6,10,10,98, +97,100,32,115,121,110,116,97,120,197,32,20,97,158,16,12,30,28,2,12,69, +115,116,120,45,112,97,105,114,63,29,11,30,30,2,12,67,99,111,110,115,47, +35,102,31,1,30,32,2,12,67,115,116,120,45,99,97,114,33,5,30,34,2, +12,67,115,116,120,45,99,100,114,35,6,30,36,2,12,71,115,116,120,45,110, +117,108,108,47,35,102,37,9,30,38,2,12,2,13,8,30,39,2,12,2,15, +4,30,40,68,35,37,115,116,120,108,111,99,41,68,114,101,108,111,99,97,116, +101,42,1,30,43,2,12,73,115,116,120,45,99,104,101,99,107,47,101,115,99, +44,7,30,45,2,12,70,115,116,120,45,114,111,116,97,116,101,46,12,30,47, +2,12,69,97,112,112,101,110,100,47,35,102,48,0,30,49,64,35,37,115,99, +50,74,103,101,116,45,109,97,116,99,104,45,118,97,114,115,51,0,16,18,18, +98,2,20,38,97,36,10,32,11,16,72,2,25,69,35,37,115,116,120,99,97, +115,101,52,66,115,121,110,116,97,120,53,2,52,63,97,110,100,54,71,35,37, +113,113,45,97,110,100,45,111,114,55,71,115,116,120,45,118,101,99,116,111,114, +63,56,2,12,62,111,114,57,2,55,72,115,121,110,116,97,120,45,99,97,115, +101,42,58,2,41,2,33,2,12,2,48,2,12,64,99,111,110,100,59,66,35, +37,99,111,110,100,60,2,35,2,12,2,46,2,12,74,115,116,120,45,118,101, +99,116,111,114,45,114,101,102,61,2,12,2,31,2,12,67,45,100,101,102,105, +110,101,62,74,35,37,100,101,102,105,110,101,45,101,116,45,97,108,63,71,115, +116,120,45,114,111,116,97,116,101,42,64,2,12,2,44,2,12,64,119,104,101, +110,65,2,63,74,115,112,108,105,116,45,115,116,120,45,108,105,115,116,66,2, +12,2,17,2,12,2,8,2,2,2,29,2,12,69,115,116,120,45,110,117,108, +108,63,67,2,12,70,113,117,97,115,105,113,117,111,116,101,68,2,55,73,100, +101,102,105,110,101,45,115,116,114,117,99,116,69,2,63,2,37,2,12,66,117, +110,108,101,115,115,70,2,63,70,115,121,110,116,97,120,47,108,111,99,71,2, +41,66,108,101,116,47,101,99,72,2,63,2,18,2,2,71,115,121,110,116,97, +120,45,99,97,115,101,73,2,41,74,45,100,101,102,105,110,101,45,115,121,110, +116,97,120,74,2,63,2,13,2,12,2,4,2,2,2,6,2,2,2,15,2, +12,2,10,2,2,97,35,10,33,11,16,36,2,25,2,52,2,73,2,41,72, +109,97,107,101,45,112,101,120,112,97,110,100,75,2,50,72,110,111,45,101,108, +108,105,112,115,101,115,63,76,2,50,2,53,2,52,2,59,2,60,2,54,2, +55,74,109,97,107,101,45,109,97,116,99,104,38,101,110,118,77,2,50,79,109, +97,107,101,45,115,121,110,116,97,120,45,109,97,112,112,105,110,103,78,2,50, +1,20,115,121,110,116,97,120,45,109,97,112,112,105,110,103,45,100,101,112,116, +104,79,2,50,75,115,121,110,116,97,120,45,109,97,112,112,105,110,103,63,80, +2,50,2,57,2,55,2,71,2,41,2,58,2,41,72,115,116,120,45,109,101, +109,113,45,112,111,115,81,2,50,1,21,115,121,110,116,97,120,45,109,97,112, +112,105,110,103,45,118,97,108,118,97,114,82,2,50,2,68,2,55,2,51,2, +50,96,34,8,254,1,11,16,0,16,4,33,11,61,120,83,3,1,7,101,110, +118,50,55,50,56,84,18,16,2,95,66,115,114,99,116,97,103,85,39,93,8, +252,121,7,95,9,8,252,121,7,2,52,18,100,64,100,101,115,116,86,42,36, +35,34,33,16,8,41,11,3,1,4,103,50,57,55,87,3,1,4,103,50,57, +56,88,3,1,4,103,50,57,57,89,3,1,7,101,110,118,50,55,51,53,90, +2,90,2,90,16,8,40,11,61,95,91,62,101,49,92,62,101,50,93,3,1, +7,101,110,118,50,55,51,54,94,2,94,2,94,18,158,63,99,116,120,95,42, +18,158,2,0,42,18,158,2,95,42,18,16,2,95,2,85,43,93,8,252,123, +7,95,9,8,252,123,7,2,52,18,100,2,86,46,36,35,34,33,16,12,45, +11,3,1,4,103,50,57,50,96,3,1,4,103,50,57,51,97,3,1,4,103, +50,57,52,98,3,1,4,103,50,57,53,99,3,1,4,103,50,57,54,100,3, +1,7,101,110,118,50,55,53,51,101,2,101,2,101,2,101,2,101,16,12,44, +11,2,91,63,111,117,116,102,62,105,110,103,2,92,2,93,3,1,7,101,110, +118,50,55,53,52,104,2,104,2,104,2,104,2,104,18,16,2,95,2,85,47, +93,8,252,139,7,95,9,8,252,139,7,2,52,18,101,2,86,49,36,35,34, +33,45,44,16,4,48,11,63,105,110,115,105,3,1,7,101,110,118,50,55,54, +48,106,18,16,2,95,2,85,50,93,8,252,140,7,95,9,8,252,140,7,2, +52,18,158,2,86,49,18,102,2,20,52,36,35,34,33,45,44,48,16,8,51, +11,64,116,109,112,115,107,65,104,101,114,101,115,108,64,111,117,116,115,109,3, +1,7,101,110,118,50,55,54,51,110,2,110,2,110,18,16,2,95,2,85,53, +93,8,252,145,7,95,9,8,252,145,7,2,52,18,103,2,86,55,36,35,34, +33,45,44,48,51,16,4,54,11,2,24,3,1,7,101,110,118,50,55,54,56, +111,18,158,2,95,55,18,158,2,0,55,18,158,2,95,55,11,96,83,159,32, +93,80,158,32,32,89,162,32,33,36,2,4,222,250,22,252,32,2,2,18,6, +20,20,98,105,110,100,105,110,103,32,109,97,116,99,104,32,102,97,105,108,101, +100,195,83,159,32,93,80,158,32,33,32,83,159,32,93,80,158,32,34,89,162, +32,33,38,2,8,223,0,87,94,83,160,34,11,80,158,32,33,248,22,169,80, +158,33,33,248,22,41,250,22,252,179,1,6,4,4,126,97,126,115,197,80,158, +36,33,83,159,32,93,80,158,32,35,89,162,32,33,37,2,10,223,0,87,94, +28,248,80,158,33,36,194,12,250,22,252,33,2,2,10,6,11,11,115,121,110, +116,97,120,32,112,97,105,114,196,27,248,80,158,34,37,195,249,22,2,89,162, +32,33,39,9,223,3,248,247,22,252,76,3,28,248,22,40,195,249,22,208,11, +248,80,158,36,34,197,28,248,22,252,135,1,195,249,22,208,11,248,80,158,36, +34,197,28,248,80,158,34,38,195,249,22,208,11,248,80,158,36,34,248,22,209, +198,249,22,208,11,248,80,158,36,34,64,116,101,109,112,112,194,97,68,35,37, +107,101,114,110,101,108,113,2,12,2,41,74,35,37,115,109,97,108,108,45,115, +99,104,101,109,101,114,2,52,98,2,113,2,52,2,41,2,50,2,55,2,60, +0}; + EVAL_ONE_SIZED_STR((char *)expr, 2646); } { - static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,48,46,51,192,252,75,32,159,32,20,96,158,16,1,20,23, -65,98,101,103,105,110,0,16,0,83,158,39,20,93,114,76,35,37,115,116,120, + static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,49,46,52,192,252,29,32,159,32,20,97,158,16,1,20,23, +65,98,101,103,105,110,0,16,0,83,158,39,20,94,114,76,35,37,115,116,120, 99,97,115,101,45,115,99,104,101,109,101,1,29,2,11,11,10,10,10,32,80, -158,32,32,20,96,158,16,2,30,3,2,2,1,26,99,104,101,99,107,45,100, +158,32,32,20,97,158,16,2,30,3,2,2,1,26,99,104,101,99,107,45,100, 117,112,108,105,99,97,116,101,45,105,100,101,110,116,105,102,105,101,114,4,254, 1,30,5,65,35,37,115,116,120,6,71,105,100,101,110,116,105,102,105,101,114, 63,7,2,16,0,11,11,16,0,32,11,16,23,2,4,1,20,103,101,110,101, -114,97,116,101,45,116,101,109,112,111,114,97,114,105,101,115,8,75,115,121,110, -116,97,120,45,105,100,45,114,117,108,101,115,9,64,119,104,101,110,10,75,108, -101,116,114,101,99,45,115,121,110,116,97,120,101,115,11,70,108,101,116,45,115, -121,110,116,97,120,12,64,99,111,110,100,13,73,108,101,116,114,101,99,45,115, -121,110,116,97,120,14,71,115,121,110,116,97,120,45,99,97,115,101,15,67,45, -100,101,102,105,110,101,16,66,115,121,110,116,97,120,17,62,111,114,18,63,97, -110,100,19,71,119,105,116,104,45,115,121,110,116,97,120,20,66,108,101,116,47, -101,99,21,72,108,101,116,45,115,121,110,116,97,120,101,115,22,70,115,121,110, -116,97,120,47,108,111,99,23,66,117,110,108,101,115,115,24,72,115,121,110,116, -97,120,45,99,97,115,101,42,25,72,115,121,110,116,97,120,45,114,117,108,101, -115,26,74,45,100,101,102,105,110,101,45,115,121,110,116,97,120,27,70,113,117, -97,115,105,113,117,111,116,101,28,73,100,101,102,105,110,101,45,115,116,114,117, -99,116,29,16,23,11,70,35,37,119,105,116,104,45,115,116,120,30,11,74,35, -37,100,101,102,105,110,101,45,101,116,45,97,108,31,11,11,66,35,37,99,111, -110,100,32,11,68,35,37,115,116,120,108,111,99,33,2,31,69,35,37,115,116, -120,99,97,115,101,34,71,35,37,113,113,45,97,110,100,45,111,114,35,2,35, -2,30,2,31,11,2,33,2,31,2,33,11,2,31,2,35,2,31,16,23,2, +114,97,116,101,45,116,101,109,112,111,114,97,114,105,101,115,8,73,108,101,116, +114,101,99,45,115,121,110,116,97,120,9,67,45,100,101,102,105,110,101,10,71, +115,121,110,116,97,120,45,99,97,115,101,11,72,108,101,116,45,115,121,110,116, +97,120,101,115,12,74,45,100,101,102,105,110,101,45,115,121,110,116,97,120,13, +72,115,121,110,116,97,120,45,99,97,115,101,42,14,70,108,101,116,45,115,121, +110,116,97,120,15,66,115,121,110,116,97,120,16,72,115,121,110,116,97,120,45, +114,117,108,101,115,17,63,97,110,100,18,73,100,101,102,105,110,101,45,115,116, +114,117,99,116,19,75,115,121,110,116,97,120,45,105,100,45,114,117,108,101,115, +20,64,99,111,110,100,21,64,119,104,101,110,22,62,111,114,23,70,115,121,110, +116,97,120,47,108,111,99,24,66,117,110,108,101,115,115,25,75,108,101,116,114, +101,99,45,115,121,110,116,97,120,101,115,26,70,113,117,97,115,105,113,117,111, +116,101,27,66,108,101,116,47,101,99,28,71,119,105,116,104,45,115,121,110,116, +97,120,29,16,23,11,70,35,37,119,105,116,104,45,115,116,120,30,11,74,35, +37,100,101,102,105,110,101,45,101,116,45,97,108,31,68,35,37,115,116,120,108, +111,99,32,11,2,31,2,32,11,69,35,37,115,116,120,99,97,115,101,33,11, +71,35,37,113,113,45,97,110,100,45,111,114,34,2,31,11,66,35,37,99,111, +110,100,35,2,31,2,34,2,32,2,31,11,2,34,2,31,2,30,16,23,2, 4,2,8,2,9,2,10,2,11,2,12,2,13,2,14,2,15,2,16,2,17, 2,18,2,19,2,20,2,21,2,22,2,23,2,24,2,25,2,26,2,27,2, -28,2,29,34,55,98,16,5,93,2,11,89,162,32,33,49,9,223,0,27,249, +28,2,29,34,55,98,16,5,93,2,26,89,162,32,33,49,9,223,0,27,249, 22,208,83,160,41,32,35,44,196,27,28,248,80,158,35,32,194,249,80,158,36, 33,248,80,158,37,34,196,27,248,80,158,38,35,197,28,248,80,158,38,32,193, 27,27,248,80,158,40,34,195,28,248,80,158,40,36,193,248,22,8,89,162,32, @@ -1383,23 +1384,23 @@ 193,249,80,158,43,33,248,80,158,44,34,195,27,248,80,158,45,35,196,28,248, 80,158,45,36,193,248,80,158,45,38,193,11,11,11,11,11,28,192,27,248,22, 51,194,27,248,22,77,195,27,248,22,86,196,27,248,22,89,197,27,248,22,88, -198,249,80,158,41,42,202,27,251,22,60,200,202,201,199,27,83,160,41,33,43, +198,249,80,158,41,42,202,27,251,22,60,201,202,200,199,27,83,160,41,33,43, 44,91,159,33,11,90,161,33,32,11,83,160,38,32,33,11,247,248,22,8,89, 162,32,33,40,9,226,13,2,3,1,250,22,31,89,162,32,32,36,9,225,6, -3,7,90,161,33,33,10,247,22,252,174,2,248,22,252,174,2,89,162,32,33, -36,9,224,3,1,248,193,89,162,32,32,36,9,224,2,3,28,248,22,252,171, -2,193,248,22,252,176,2,193,249,80,158,35,43,21,98,1,22,108,101,116,114, +3,7,90,161,33,33,10,247,22,252,175,2,248,22,252,175,2,89,162,32,33, +36,9,224,3,1,248,193,89,162,32,32,36,9,224,2,3,28,248,22,252,172, +2,193,248,22,252,177,2,193,249,80,158,35,43,21,98,1,22,108,101,116,114, 101,99,45,115,121,110,116,97,120,101,115,43,118,97,108,117,101,115,36,94,94, 94,62,105,100,37,63,46,46,46,38,64,101,120,112,114,39,2,38,9,65,98, 111,100,121,49,40,64,98,111,100,121,41,2,38,83,160,41,34,35,44,89,162, 32,32,51,9,225,6,5,4,27,250,22,208,83,160,41,35,38,44,250,22,208, 83,160,41,36,41,44,252,22,60,83,160,41,37,46,44,250,22,2,89,162,33, 33,41,9,223,17,250,22,208,83,160,41,38,35,44,249,22,58,248,22,51,199, -248,22,77,199,83,160,41,39,35,44,248,22,77,23,16,248,22,86,23,16,83, -160,41,40,46,44,248,22,51,205,248,22,87,205,83,160,41,41,41,44,197,89, -162,32,32,33,9,223,0,192,89,162,32,32,34,9,223,3,248,22,252,174,2, -208,250,22,252,31,2,11,6,10,10,98,97,100,32,115,121,110,116,97,120,196, -32,20,96,158,16,12,30,42,2,6,69,115,116,120,45,112,97,105,114,63,43, +248,22,77,199,83,160,41,39,35,44,248,22,77,23,16,248,22,51,23,16,83, +160,41,40,46,44,248,22,86,205,248,22,87,205,83,160,41,41,41,44,197,89, +162,32,32,33,9,223,0,192,89,162,32,32,34,9,223,3,248,22,252,175,2, +208,250,22,252,32,2,11,6,10,10,98,97,100,32,115,121,110,116,97,120,196, +32,20,97,158,16,12,30,42,2,6,69,115,116,120,45,112,97,105,114,63,43, 11,30,44,2,6,67,99,111,110,115,47,35,102,45,1,30,46,2,6,67,115, 116,120,45,99,97,114,47,5,30,48,2,6,67,115,116,120,45,99,100,114,49, 6,30,50,2,6,69,115,116,120,45,108,105,115,116,63,51,8,30,52,2,6, @@ -1407,42 +1408,42 @@ 115,116,120,45,62,108,105,115,116,55,4,30,56,2,6,69,97,112,112,101,110, 100,47,35,102,57,0,30,58,2,6,71,115,116,120,45,110,117,108,108,47,35, 102,59,9,30,60,2,6,70,115,116,120,45,114,111,116,97,116,101,61,12,30, -62,2,33,68,114,101,108,111,99,97,116,101,63,1,30,64,2,34,1,20,101, +62,2,32,68,114,101,108,111,99,97,116,101,63,1,30,64,2,33,1,20,101, 108,108,105,112,115,105,115,45,99,111,117,110,116,45,101,114,114,111,114,65,0, -16,10,18,98,64,104,101,114,101,66,38,97,36,10,32,11,16,80,73,115,121, -110,116,97,120,45,99,97,115,101,42,42,67,2,34,2,25,2,33,2,20,2, -30,2,17,2,34,71,115,116,120,45,118,101,99,116,111,114,63,68,2,6,2, -12,2,2,2,16,2,31,2,47,2,6,74,115,116,120,45,118,101,99,116,111, -114,45,114,101,102,69,2,6,2,53,2,6,2,4,2,2,2,49,2,6,2, -23,2,33,2,61,2,6,2,24,2,31,2,45,2,6,71,115,116,120,45,114, -111,116,97,116,101,42,70,2,6,2,19,2,35,74,115,112,108,105,116,45,115, -116,120,45,108,105,115,116,71,2,6,2,22,2,2,2,18,2,35,2,7,2, -6,2,8,2,30,2,29,2,31,69,115,116,120,45,110,117,108,108,63,72,2, -6,2,28,2,35,2,13,2,32,2,59,2,6,2,26,2,2,2,14,2,2, -2,43,2,6,2,10,2,31,2,9,2,2,2,11,2,2,2,21,2,31,2, -51,2,6,2,27,2,31,2,55,2,6,2,57,2,6,2,15,2,33,97,35, -10,33,11,16,66,2,67,2,34,2,25,2,33,2,20,2,30,2,17,2,34, -2,68,2,6,2,16,2,31,2,47,2,6,2,69,2,6,2,53,2,6,2, -49,2,6,2,23,2,33,2,61,2,6,2,24,2,31,2,45,2,6,2,70, -2,6,2,19,2,35,2,71,2,6,2,18,2,35,2,7,2,6,2,8,2, -30,2,29,2,31,2,72,2,6,2,28,2,35,2,13,2,32,2,59,2,6, -2,43,2,6,2,10,2,31,2,21,2,31,2,51,2,6,2,27,2,31,2, -55,2,6,2,57,2,6,2,15,2,33,96,34,8,254,1,11,16,0,16,4, -33,11,63,115,116,120,73,3,1,7,101,110,118,50,55,53,50,74,18,16,2, -95,66,115,114,99,116,97,103,75,39,93,8,252,159,7,95,9,8,252,159,7, -2,34,18,16,2,99,2,38,44,93,8,252,159,7,16,6,43,11,61,114,76, -63,115,114,99,77,3,1,7,101,110,118,50,55,55,53,78,2,78,16,4,42, -11,64,101,120,110,104,79,3,1,7,101,110,118,50,55,55,54,80,16,4,41, -11,63,101,115,99,81,3,1,7,101,110,118,50,55,55,55,82,16,4,40,11, -63,101,120,110,83,3,1,7,101,110,118,50,55,55,57,84,95,9,8,252,159, -7,2,34,18,100,64,100,101,115,116,85,47,36,35,34,33,16,12,46,11,3, -1,4,103,50,57,52,86,3,1,4,103,50,57,53,87,3,1,4,103,50,57, -54,88,3,1,4,103,50,57,55,89,3,1,4,103,50,57,56,90,3,1,7, -101,110,118,50,55,54,55,91,2,91,2,91,2,91,2,91,16,12,45,11,61, -95,92,2,37,2,39,2,40,2,41,3,1,7,101,110,118,50,55,54,56,93, +16,10,18,98,64,104,101,114,101,66,38,97,36,10,32,11,16,80,2,17,2, +2,2,26,2,2,2,11,2,32,2,16,2,33,2,18,2,34,71,115,116,120, +45,118,101,99,116,111,114,63,67,2,6,2,23,2,34,2,24,2,32,2,47, +2,6,2,57,2,6,2,21,2,35,2,49,2,6,2,61,2,6,74,115,116, +120,45,118,101,99,116,111,114,45,114,101,102,68,2,6,2,45,2,6,2,10, +2,31,71,115,116,120,45,114,111,116,97,116,101,42,69,2,6,2,53,2,6, +2,12,2,2,2,4,2,2,2,22,2,31,74,115,112,108,105,116,45,115,116, +120,45,108,105,115,116,70,2,6,2,15,2,2,2,7,2,6,2,13,2,31, +69,115,116,120,45,110,117,108,108,63,71,2,6,2,20,2,2,2,27,2,34, +2,19,2,31,2,59,2,6,2,25,2,31,2,14,2,32,2,28,2,31,2, +29,2,30,73,115,121,110,116,97,120,45,99,97,115,101,42,42,72,2,33,2, +51,2,6,2,55,2,6,2,43,2,6,2,9,2,2,2,8,2,30,97,35, +10,33,11,16,66,2,11,2,32,2,16,2,33,2,18,2,34,2,67,2,6, +2,23,2,34,2,24,2,32,2,47,2,6,2,57,2,6,2,21,2,35,2, +49,2,6,2,61,2,6,2,68,2,6,2,45,2,6,2,10,2,31,2,69, +2,6,2,53,2,6,2,22,2,31,2,70,2,6,2,7,2,6,2,13,2, +31,2,71,2,6,2,27,2,34,2,19,2,31,2,59,2,6,2,25,2,31, +2,14,2,32,2,28,2,31,2,29,2,30,2,72,2,33,2,51,2,6,2, +55,2,6,2,43,2,6,2,8,2,30,96,34,8,254,1,11,16,0,16,4, +33,11,63,115,116,120,73,3,1,7,101,110,118,50,55,56,50,74,18,16,2, +95,66,115,114,99,116,97,103,75,39,93,8,252,181,7,95,9,8,252,181,7, +2,33,18,16,2,99,2,38,44,93,8,252,181,7,16,6,43,11,61,114,76, +63,115,114,99,77,3,1,7,101,110,118,50,56,48,53,78,2,78,16,4,42, +11,64,101,120,110,104,79,3,1,7,101,110,118,50,56,48,54,80,16,4,41, +11,63,101,115,99,81,3,1,7,101,110,118,50,56,48,55,82,16,4,40,11, +63,101,120,110,83,3,1,7,101,110,118,50,56,48,57,84,95,9,8,252,181, +7,2,33,18,100,64,100,101,115,116,85,47,36,35,34,33,16,12,46,11,3, +1,4,103,51,48,48,86,3,1,4,103,51,48,49,87,3,1,4,103,51,48, +50,88,3,1,4,103,51,48,51,89,3,1,4,103,51,48,52,90,3,1,7, +101,110,118,50,55,57,55,91,2,91,2,91,2,91,2,91,16,12,45,11,61, +95,92,2,37,2,39,2,40,2,41,3,1,7,101,110,118,50,55,57,56,93, 2,93,2,93,2,93,2,93,18,158,63,99,116,120,94,47,18,158,2,36,47, 18,158,2,94,47,18,158,2,94,47,18,158,9,47,18,158,2,94,47,11,16, -5,93,2,14,89,162,32,33,49,9,223,0,27,249,22,208,83,160,41,32,35, +5,93,2,9,89,162,32,33,49,9,223,0,27,249,22,208,83,160,41,32,35, 44,196,27,28,248,80,158,35,32,194,249,80,158,36,33,248,80,158,37,34,196, 27,248,80,158,38,35,197,28,248,80,158,38,32,193,27,27,248,80,158,40,34, 195,28,248,80,158,40,36,193,248,22,8,89,162,32,33,39,9,224,8,1,27, @@ -1455,36 +1456,36 @@ 44,34,195,27,248,80,158,45,35,196,28,248,80,158,45,36,193,248,80,158,45, 39,193,11,11,11,11,11,28,192,27,248,22,51,194,27,248,22,77,195,27,248, 22,86,196,27,248,22,89,197,27,248,22,88,198,249,80,158,41,42,202,27,251, -22,60,200,202,201,199,27,83,160,41,33,43,44,91,159,33,11,90,161,33,32, +22,60,201,202,200,199,27,83,160,41,33,43,44,91,159,33,11,90,161,33,32, 11,83,160,38,32,33,11,247,248,22,8,89,162,32,33,40,9,226,13,2,3, 1,250,22,31,89,162,32,32,36,9,225,6,3,7,90,161,33,33,10,247,22, -252,174,2,248,22,252,174,2,89,162,32,33,36,9,224,3,1,248,193,89,162, -32,32,36,9,224,2,3,28,248,22,252,171,2,193,248,22,252,176,2,193,249, +252,175,2,248,22,252,175,2,89,162,32,33,36,9,224,3,1,248,193,89,162, +32,32,36,9,224,2,3,28,248,22,252,172,2,193,248,22,252,177,2,193,249, 80,158,35,43,21,98,2,36,94,94,93,2,37,2,39,2,38,9,2,40,2, 41,2,38,83,160,41,34,35,44,89,162,32,32,51,9,225,6,5,4,27,250, 22,208,83,160,41,35,38,44,250,22,208,83,160,41,36,41,44,252,22,60,83, 160,41,37,46,44,250,22,2,89,162,33,33,45,9,223,17,250,22,208,83,160, 41,38,35,44,249,22,58,250,22,208,83,160,41,39,40,44,248,22,58,248,22, 51,203,83,160,41,40,40,44,248,22,77,199,83,160,41,41,35,44,248,22,77, -23,16,248,22,86,23,16,83,160,41,42,46,44,248,22,51,205,248,22,87,205, +23,16,248,22,51,23,16,83,160,41,42,46,44,248,22,86,205,248,22,87,205, 83,160,41,43,41,44,197,89,162,32,32,33,9,223,0,192,89,162,32,32,34, -9,223,3,248,22,252,174,2,208,250,22,252,31,2,11,6,10,10,98,97,100, -32,115,121,110,116,97,120,196,32,20,96,158,16,12,2,42,2,44,2,46,2, +9,223,3,248,22,252,175,2,208,250,22,252,32,2,11,6,10,10,98,97,100, +32,115,121,110,116,97,120,196,32,20,97,158,16,12,2,42,2,44,2,46,2, 48,2,50,2,52,2,58,2,54,2,60,2,56,2,62,2,64,16,12,18,98, -2,66,49,36,35,34,16,4,48,11,2,73,3,1,7,101,110,118,50,55,56, -56,95,18,16,2,95,2,75,50,93,8,252,174,7,95,9,8,252,174,7,2, -34,18,16,2,99,2,38,55,93,8,252,174,7,16,6,54,11,2,76,2,77, -3,1,7,101,110,118,50,56,48,57,96,2,96,16,4,53,11,2,79,3,1, -7,101,110,118,50,56,49,48,97,16,4,52,11,2,81,3,1,7,101,110,118, -50,56,49,49,98,16,4,51,11,2,83,3,1,7,101,110,118,50,56,49,51, -99,95,9,8,252,174,7,2,34,18,100,2,85,58,36,35,34,48,16,12,57, -11,3,1,4,103,50,57,57,100,3,1,4,103,51,48,48,101,3,1,4,103, -51,48,49,102,3,1,4,103,51,48,50,103,3,1,4,103,51,48,51,104,3, -1,7,101,110,118,50,56,48,49,105,2,105,2,105,2,105,2,105,16,12,56, -11,2,92,2,37,2,39,2,40,2,41,3,1,7,101,110,118,50,56,48,50, +2,66,49,36,35,34,16,4,48,11,2,73,3,1,7,101,110,118,50,56,49, +56,95,18,16,2,95,2,75,50,93,8,252,196,7,95,9,8,252,196,7,2, +33,18,16,2,99,2,38,55,93,8,252,196,7,16,6,54,11,2,76,2,77, +3,1,7,101,110,118,50,56,51,57,96,2,96,16,4,53,11,2,79,3,1, +7,101,110,118,50,56,52,48,97,16,4,52,11,2,81,3,1,7,101,110,118, +50,56,52,49,98,16,4,51,11,2,83,3,1,7,101,110,118,50,56,52,51, +99,95,9,8,252,196,7,2,33,18,100,2,85,58,36,35,34,48,16,12,57, +11,3,1,4,103,51,48,53,100,3,1,4,103,51,48,54,101,3,1,4,103, +51,48,55,102,3,1,4,103,51,48,56,103,3,1,4,103,51,48,57,104,3, +1,7,101,110,118,50,56,51,49,105,2,105,2,105,2,105,2,105,16,12,56, +11,2,92,2,37,2,39,2,40,2,41,3,1,7,101,110,118,50,56,51,50, 106,2,106,2,106,2,106,2,106,18,158,2,94,58,18,158,2,36,58,18,158, 2,94,58,18,158,2,94,58,18,158,2,94,58,18,158,2,94,58,18,158,9, -58,18,158,2,94,58,11,16,5,93,2,22,89,162,32,33,54,9,223,0,27, +58,18,158,2,94,58,11,16,5,93,2,12,89,162,32,33,54,9,223,0,27, 249,22,208,83,160,41,32,35,47,196,27,28,248,80,158,35,32,194,249,80,158, 36,33,248,80,158,37,34,196,27,248,80,158,38,35,197,28,248,80,158,38,32, 193,27,27,248,80,158,40,34,195,28,248,80,158,40,36,193,248,22,8,89,162, @@ -1504,11 +1505,11 @@ 2,89,162,32,33,39,9,224,4,5,249,80,158,35,37,28,248,80,158,36,36, 197,248,22,58,248,80,158,37,38,198,11,194,248,80,158,37,38,196,28,248,22, 56,193,9,248,80,158,35,43,193,11,28,192,249,80,158,43,44,204,27,252,22, -60,205,204,200,202,203,27,83,160,41,36,45,47,91,159,33,11,90,161,33,32, +60,205,203,202,204,200,27,83,160,41,36,45,47,91,159,33,11,90,161,33,32, 11,83,160,38,32,33,11,247,248,22,8,89,162,32,33,40,9,226,15,2,3, 1,250,22,31,89,162,32,32,36,9,225,6,3,7,90,161,33,33,10,247,22, -252,174,2,248,22,252,174,2,89,162,32,33,36,9,224,3,1,248,193,89,162, -32,32,36,9,224,2,3,28,248,22,252,171,2,193,248,22,252,176,2,193,249, +252,175,2,248,22,252,175,2,89,162,32,33,36,9,224,3,1,248,193,89,162, +32,32,36,9,224,2,3,28,248,22,252,172,2,193,248,22,252,177,2,193,249, 80,158,35,45,21,96,2,36,94,94,94,63,116,109,112,107,2,38,2,39,2, 38,9,98,2,36,94,94,94,2,37,2,38,95,66,118,97,108,117,101,115,108, 94,1,23,109,97,107,101,45,114,101,110,97,109,101,45,116,114,97,110,115,102, @@ -1517,7 +1518,7 @@ 32,32,58,9,225,6,5,4,27,250,22,208,83,160,41,38,38,47,250,22,208, 83,160,41,39,41,47,251,22,58,83,160,41,40,45,47,250,22,2,89,162,33, 33,41,9,223,16,250,22,208,83,160,41,41,35,47,249,22,58,248,22,51,199, -248,22,77,199,83,160,41,42,35,47,248,22,86,23,15,248,22,77,23,15,83, +248,22,77,199,83,160,41,42,35,47,248,22,88,23,15,248,22,89,23,15,83, 160,41,43,45,47,250,22,208,83,160,41,44,48,47,252,22,60,83,160,41,45, 53,47,250,22,2,89,162,33,33,48,9,223,24,250,22,208,83,160,41,46,35, 47,249,22,58,248,22,51,199,250,22,208,83,160,41,47,40,47,249,22,50,83, @@ -1525,42 +1526,42 @@ 41,49,35,47,249,22,58,83,160,41,50,37,47,250,22,208,83,160,41,51,40, 47,249,22,58,83,160,41,52,42,47,248,22,51,204,83,160,41,53,40,47,83, 160,41,54,35,47,248,22,77,206,83,160,41,55,40,47,83,160,41,56,35,47, -248,22,51,23,23,248,22,86,23,23,83,160,41,57,53,47,248,22,88,23,20, -248,22,89,23,20,83,160,41,58,48,47,83,160,41,59,41,47,197,89,162,32, -32,33,9,223,0,192,89,162,32,32,34,9,223,3,248,22,252,174,2,208,248, -80,158,42,46,83,160,41,8,28,42,47,250,22,252,31,2,11,6,10,10,98, -97,100,32,115,121,110,116,97,120,196,32,20,96,158,16,15,2,42,2,44,2, +248,22,51,23,23,248,22,88,23,23,83,160,41,57,53,47,248,22,77,23,20, +248,22,86,23,20,83,160,41,58,48,47,83,160,41,59,41,47,197,89,162,32, +32,33,9,223,0,192,89,162,32,32,34,9,223,3,248,22,252,175,2,208,248, +80,158,42,46,83,160,41,8,28,42,47,250,22,252,32,2,11,6,10,10,98, +97,100,32,115,121,110,116,97,120,196,32,20,97,158,16,15,2,42,2,44,2, 46,2,48,2,50,2,52,2,54,2,56,2,58,2,60,30,111,2,30,2,8, -0,30,112,2,6,2,70,13,2,62,2,64,30,113,2,30,76,119,105,116,104, +0,30,112,2,6,2,69,13,2,62,2,64,30,113,2,30,76,119,105,116,104, 45,115,121,110,116,97,120,45,102,97,105,108,114,3,16,29,18,98,2,66,8, -28,36,35,34,16,4,59,11,2,73,3,1,7,101,110,118,50,56,50,50,115, -18,100,2,66,8,31,36,35,34,59,16,12,8,30,11,3,1,4,103,51,48, -52,116,3,1,4,103,51,48,53,117,3,1,4,103,51,48,54,118,3,1,4, -103,51,48,55,119,3,1,4,103,51,48,56,120,3,1,7,101,110,118,50,56, -51,55,121,2,121,2,121,2,121,2,121,16,12,8,29,11,2,92,2,37,2, -39,2,40,2,41,3,1,7,101,110,118,50,56,51,56,122,2,122,2,122,2, -122,2,122,18,16,2,95,2,75,8,32,93,8,252,190,7,95,9,8,252,190, -7,2,34,18,158,2,85,8,31,18,16,2,95,2,75,8,33,93,8,252,196, -7,95,9,8,252,196,7,2,34,18,16,2,99,2,38,8,38,93,8,252,196, -7,16,6,8,37,11,2,76,2,77,3,1,7,101,110,118,50,56,53,55,123, -2,123,16,4,8,36,11,2,79,3,1,7,101,110,118,50,56,53,56,124,16, -4,8,35,11,2,81,3,1,7,101,110,118,50,56,53,57,125,16,4,8,34, -11,2,83,3,1,7,101,110,118,50,56,54,49,126,95,9,8,252,196,7,2, -34,18,102,2,85,8,41,36,35,34,59,8,30,8,29,16,4,8,40,11,3, -1,4,103,51,49,49,127,3,1,7,101,110,118,50,56,53,51,128,16,4,8, -39,11,2,107,3,1,7,101,110,118,50,56,53,52,129,18,158,2,94,8,41, +28,36,35,34,16,4,59,11,2,73,3,1,7,101,110,118,50,56,53,50,115, +18,100,2,66,8,31,36,35,34,59,16,12,8,30,11,3,1,4,103,51,49, +48,116,3,1,4,103,51,49,49,117,3,1,4,103,51,49,50,118,3,1,4, +103,51,49,51,119,3,1,4,103,51,49,52,120,3,1,7,101,110,118,50,56, +54,55,121,2,121,2,121,2,121,2,121,16,12,8,29,11,2,92,2,37,2, +39,2,40,2,41,3,1,7,101,110,118,50,56,54,56,122,2,122,2,122,2, +122,2,122,18,16,2,95,2,75,8,32,93,8,252,212,7,95,9,8,252,212, +7,2,33,18,158,2,85,8,31,18,16,2,95,2,75,8,33,93,8,252,218, +7,95,9,8,252,218,7,2,33,18,16,2,99,2,38,8,38,93,8,252,218, +7,16,6,8,37,11,2,76,2,77,3,1,7,101,110,118,50,56,56,55,123, +2,123,16,4,8,36,11,2,79,3,1,7,101,110,118,50,56,56,56,124,16, +4,8,35,11,2,81,3,1,7,101,110,118,50,56,56,57,125,16,4,8,34, +11,2,83,3,1,7,101,110,118,50,56,57,49,126,95,9,8,252,218,7,2, +33,18,102,2,85,8,41,36,35,34,59,8,30,8,29,16,4,8,40,11,3, +1,4,103,51,49,55,127,3,1,7,101,110,118,50,56,56,51,128,16,4,8, +39,11,2,107,3,1,7,101,110,118,50,56,56,52,129,18,158,2,94,8,41, 18,158,2,36,8,41,18,158,2,94,8,41,18,158,2,94,8,41,18,158,9, 8,41,18,158,2,94,8,41,18,158,2,36,8,41,18,158,2,94,8,41,18, 158,2,94,8,41,18,158,2,108,8,41,18,158,2,94,8,41,18,158,2,109, 8,41,18,158,2,94,8,41,18,158,2,110,8,41,18,158,2,94,8,41,18, 158,2,94,8,41,18,158,2,94,8,41,18,158,2,94,8,41,18,158,9,8, 41,18,158,2,94,8,41,18,158,2,94,8,41,18,16,2,158,94,158,94,98, -2,107,8,45,93,8,252,189,7,16,4,8,44,11,3,1,8,119,115,116,109, -112,51,48,57,130,3,1,7,101,110,118,50,56,52,53,131,16,4,8,43,11, -3,1,4,103,51,49,48,132,3,1,7,101,110,118,50,56,55,52,133,16,4, -8,42,11,65,95,101,108,115,101,134,3,1,7,101,110,118,50,56,55,53,135, -158,2,38,8,45,8,45,158,2,38,8,45,8,45,95,9,8,252,189,7,2, -30,11,16,5,93,2,12,89,162,32,33,49,9,223,0,27,249,22,208,83,160, +2,107,8,45,93,8,252,211,7,16,4,8,44,11,3,1,8,119,115,116,109, +112,51,49,53,130,3,1,7,101,110,118,50,56,55,53,131,16,4,8,43,11, +3,1,4,103,51,49,54,132,3,1,7,101,110,118,50,57,48,52,133,16,4, +8,42,11,65,95,101,108,115,101,134,3,1,7,101,110,118,50,57,48,53,135, +158,2,38,8,45,8,45,158,2,38,8,45,8,45,95,9,8,252,211,7,2, +30,11,16,5,93,2,15,89,162,32,33,49,9,223,0,27,249,22,208,83,160, 41,32,35,44,196,27,28,248,80,158,35,32,194,249,80,158,36,33,248,80,158, 37,34,196,27,248,80,158,38,35,197,28,248,80,158,38,32,193,27,27,248,80, 158,40,34,195,28,248,80,158,40,36,193,248,22,8,89,162,32,33,39,9,224, @@ -1573,38 +1574,38 @@ 248,80,158,44,34,195,27,248,80,158,45,35,196,28,248,80,158,45,36,193,248, 80,158,45,39,193,11,11,11,11,11,28,192,27,248,22,51,194,27,248,22,77, 195,27,248,22,86,196,27,248,22,89,197,27,248,22,88,198,249,80,158,41,42, -202,27,251,22,60,202,201,199,200,27,83,160,41,33,43,44,91,159,33,11,90, +202,27,251,22,60,201,200,202,199,27,83,160,41,33,43,44,91,159,33,11,90, 161,33,32,11,83,160,38,32,33,11,247,248,22,8,89,162,32,33,40,9,226, 13,2,3,1,250,22,31,89,162,32,32,36,9,225,6,3,7,90,161,33,33, -10,247,22,252,174,2,248,22,252,174,2,89,162,32,33,36,9,224,3,1,248, -193,89,162,32,32,36,9,224,2,3,28,248,22,252,171,2,193,248,22,252,176, -2,193,249,80,158,35,43,21,97,2,22,94,94,93,2,37,2,39,2,38,2, +10,247,22,252,175,2,248,22,252,175,2,89,162,32,33,36,9,224,3,1,248, +193,89,162,32,32,36,9,224,2,3,28,248,22,252,172,2,193,248,22,252,177, +2,193,249,80,158,35,43,21,97,2,12,94,94,93,2,37,2,39,2,38,2, 40,2,41,2,38,83,160,41,34,35,44,89,162,32,32,50,9,225,6,5,4, 27,250,22,208,83,160,41,35,38,44,250,22,208,83,160,41,36,41,44,251,22, 60,83,160,41,37,45,44,250,22,2,89,162,33,33,45,9,223,16,250,22,208, 83,160,41,38,35,44,249,22,58,250,22,208,83,160,41,39,40,44,248,22,58, 248,22,51,203,83,160,41,40,40,44,248,22,77,199,83,160,41,41,35,44,248, -22,51,23,15,248,22,77,23,15,248,22,87,204,248,22,86,204,83,160,41,42, +22,86,23,15,248,22,51,23,15,248,22,77,204,248,22,87,204,83,160,41,42, 41,44,197,89,162,32,32,33,9,223,0,192,89,162,32,32,34,9,223,3,248, -22,252,174,2,208,250,22,252,31,2,11,6,10,10,98,97,100,32,115,121,110, -116,97,120,196,32,20,96,158,16,12,2,42,2,44,2,46,2,48,2,50,2, +22,252,175,2,208,250,22,252,32,2,11,6,10,10,98,97,100,32,115,121,110, +116,97,120,196,32,20,97,158,16,12,2,42,2,44,2,46,2,48,2,50,2, 52,2,58,2,54,2,60,2,56,2,62,2,64,16,11,18,98,2,66,8,47, -36,35,34,16,4,8,46,11,2,73,3,1,7,101,110,118,50,56,55,56,136, -18,16,2,95,2,75,8,48,93,8,252,212,7,95,9,8,252,212,7,2,34, -18,16,2,99,2,38,8,53,93,8,252,212,7,16,6,8,52,11,2,76,2, -77,3,1,7,101,110,118,50,56,57,57,137,2,137,16,4,8,51,11,2,79, -3,1,7,101,110,118,50,57,48,48,138,16,4,8,50,11,2,81,3,1,7, -101,110,118,50,57,48,49,139,16,4,8,49,11,2,83,3,1,7,101,110,118, -50,57,48,51,140,95,9,8,252,212,7,2,34,18,100,2,85,8,56,36,35, -34,8,46,16,12,8,55,11,3,1,4,103,51,49,50,141,3,1,4,103,51, -49,51,142,3,1,4,103,51,49,52,143,3,1,4,103,51,49,53,144,3,1, -4,103,51,49,54,145,3,1,7,101,110,118,50,56,57,49,146,2,146,2,146, +36,35,34,16,4,8,46,11,2,73,3,1,7,101,110,118,50,57,48,56,136, +18,16,2,95,2,75,8,48,93,8,252,234,7,95,9,8,252,234,7,2,33, +18,16,2,99,2,38,8,53,93,8,252,234,7,16,6,8,52,11,2,76,2, +77,3,1,7,101,110,118,50,57,50,57,137,2,137,16,4,8,51,11,2,79, +3,1,7,101,110,118,50,57,51,48,138,16,4,8,50,11,2,81,3,1,7, +101,110,118,50,57,51,49,139,16,4,8,49,11,2,83,3,1,7,101,110,118, +50,57,51,51,140,95,9,8,252,234,7,2,33,18,100,2,85,8,56,36,35, +34,8,46,16,12,8,55,11,3,1,4,103,51,49,56,141,3,1,4,103,51, +49,57,142,3,1,4,103,51,50,48,143,3,1,4,103,51,50,49,144,3,1, +4,103,51,50,50,145,3,1,7,101,110,118,50,57,50,49,146,2,146,2,146, 2,146,2,146,16,12,8,54,11,2,92,2,37,2,39,2,40,2,41,3,1, -7,101,110,118,50,56,57,50,147,2,147,2,147,2,147,2,147,18,158,2,94, -8,56,18,158,2,22,8,56,18,158,2,94,8,56,18,158,2,94,8,56,18, +7,101,110,118,50,57,50,50,147,2,147,2,147,2,147,2,147,18,158,2,94, +8,56,18,158,2,12,8,56,18,158,2,94,8,56,18,158,2,94,8,56,18, 158,2,94,8,56,18,158,2,94,8,56,18,158,2,94,8,56,11,16,5,93, -2,26,89,162,32,33,55,9,223,0,27,89,162,32,32,36,68,116,114,121,45, -110,101,120,116,148,223,2,250,22,252,31,2,11,6,10,10,98,97,100,32,115, +2,17,89,162,32,33,55,9,223,0,27,89,162,32,32,36,68,116,114,121,45, +110,101,120,116,148,223,2,250,22,252,32,2,11,6,10,10,98,97,100,32,115, 121,110,116,97,120,195,27,28,248,80,158,35,32,196,249,80,158,36,33,248,80, 158,37,34,198,27,248,80,158,38,35,199,28,248,80,158,38,32,193,27,27,248, 80,158,40,34,195,28,248,80,158,40,36,193,248,22,58,248,80,158,41,37,194, @@ -1622,139 +1623,137 @@ 195,27,249,22,208,83,160,41,34,42,46,249,22,2,89,162,32,33,36,9,222, 248,22,42,248,22,43,248,22,209,195,248,22,215,27,83,160,41,35,46,46,250, 22,208,83,160,41,36,49,46,204,195,27,28,248,80,158,42,36,194,248,80,158, -42,37,194,11,28,192,249,80,158,43,43,204,27,252,22,60,200,206,202,203,205, +42,37,194,11,28,192,249,80,158,43,43,204,27,252,22,60,200,203,202,205,206, 27,83,160,41,37,45,46,91,159,33,11,90,161,33,32,11,83,160,38,32,33, 11,247,248,22,8,89,162,32,33,40,9,226,15,2,3,1,250,22,31,89,162, -32,32,36,9,225,6,3,7,90,161,33,33,10,247,22,252,174,2,248,22,252, -174,2,89,162,32,33,36,9,224,3,1,248,193,89,162,32,32,36,9,224,2, -3,28,248,22,252,171,2,193,248,22,252,176,2,193,249,80,158,35,44,21,95, -66,108,97,109,98,100,97,149,93,61,120,150,100,2,67,2,92,10,2,150,94, +32,32,36,9,225,6,3,7,90,161,33,33,10,247,22,252,175,2,248,22,252, +175,2,89,162,32,33,36,9,224,3,1,248,193,89,162,32,32,36,9,224,2, +3,28,248,22,252,172,2,193,248,22,252,177,2,193,249,80,158,35,44,21,95, +66,108,97,109,98,100,97,149,93,61,120,150,100,2,72,2,92,10,2,150,94, 61,107,151,2,38,79,109,111,100,117,108,101,45,105,100,101,110,116,105,102,105, 101,114,61,63,152,94,158,65,100,117,109,109,121,153,67,112,97,116,116,101,114, -110,154,95,2,23,2,150,68,116,101,109,112,108,97,116,101,155,2,38,83,160, +110,154,95,2,24,2,150,68,116,101,109,112,108,97,116,101,155,2,38,83,160, 41,38,35,46,89,162,32,32,8,28,9,225,6,5,4,27,250,22,208,83,160, 41,39,38,46,250,22,208,83,160,41,40,41,46,250,22,58,83,160,41,41,44, 46,83,160,41,42,44,46,250,22,208,83,160,41,43,47,46,254,22,60,83,160, -41,44,54,46,248,22,77,23,21,83,160,41,45,54,46,83,160,41,46,54,46, -248,22,88,23,21,83,160,41,47,54,46,251,22,2,89,162,33,33,47,9,223, +41,44,54,46,248,22,88,23,21,83,160,41,45,54,46,83,160,41,46,54,46, +248,22,89,23,21,83,160,41,47,54,46,251,22,2,89,162,33,33,47,9,223, 26,250,22,208,83,160,41,48,35,46,249,22,58,250,22,208,83,160,41,49,40, 46,249,22,50,248,22,51,204,248,22,77,204,83,160,41,50,40,46,250,22,208, 83,160,41,51,40,46,250,22,58,83,160,41,52,43,46,83,160,41,53,43,46, 248,22,86,205,83,160,41,54,40,46,83,160,41,55,35,46,248,22,51,23,25, -248,22,89,23,25,248,22,86,23,25,83,160,41,56,47,46,83,160,41,57,41, +248,22,77,23,25,248,22,86,23,25,83,160,41,56,47,46,83,160,41,57,41, 46,197,89,162,32,32,33,9,223,0,192,89,162,32,32,34,9,223,3,248,22, -252,174,2,208,248,80,158,42,45,83,160,41,58,42,46,247,198,247,193,32,20, -96,158,16,14,2,42,2,44,2,46,2,48,2,50,2,54,2,56,2,52,2, +252,175,2,208,248,80,158,42,45,83,160,41,58,42,46,247,198,247,193,32,20, +97,158,16,14,2,42,2,44,2,46,2,48,2,50,2,54,2,56,2,52,2, 58,2,112,30,156,2,6,2,7,2,2,62,2,64,2,113,16,27,18,16,2, -95,2,75,8,57,93,8,252,227,7,95,9,8,252,227,7,2,34,18,100,2, +95,2,75,8,57,93,8,252,249,7,95,9,8,252,249,7,2,33,18,100,2, 85,8,61,36,35,34,16,4,8,60,11,2,150,3,1,7,101,110,118,50,57, -49,50,157,16,12,8,59,11,3,1,4,103,51,49,55,158,3,1,4,103,51, -49,56,159,3,1,4,103,51,49,57,160,3,1,4,103,51,50,48,161,3,1, -4,103,51,50,49,162,3,1,7,101,110,118,50,57,51,48,163,2,163,2,163, +52,50,157,16,12,8,59,11,3,1,4,103,51,50,51,158,3,1,4,103,51, +50,52,159,3,1,4,103,51,50,53,160,3,1,4,103,51,50,54,161,3,1, +4,103,51,50,55,162,3,1,7,101,110,118,50,57,54,48,163,2,163,2,163, 2,163,2,163,16,12,8,58,11,2,92,2,151,67,107,101,121,119,111,114,100, -164,2,154,2,155,3,1,7,101,110,118,50,57,51,49,165,2,165,2,165,2, -165,2,165,18,158,2,66,8,61,18,16,2,95,2,75,8,62,93,8,252,229, -7,95,9,8,252,229,7,2,34,18,158,2,85,8,61,18,16,2,95,2,75, -8,63,93,8,252,232,7,95,9,8,252,232,7,2,34,18,16,2,99,2,38, -8,68,93,8,252,232,7,16,6,8,67,11,2,76,2,77,3,1,7,101,110, -118,50,57,52,56,166,2,166,16,4,8,66,11,2,79,3,1,7,101,110,118, -50,57,52,57,167,16,4,8,65,11,2,81,3,1,7,101,110,118,50,57,53, -48,168,16,4,8,64,11,2,83,3,1,7,101,110,118,50,57,53,50,169,95, -9,8,252,232,7,2,34,18,102,2,85,8,73,36,35,34,8,60,16,12,8, -72,11,2,158,2,159,2,160,2,161,2,162,2,163,2,163,2,163,2,163,2, -163,16,12,8,71,11,2,92,2,151,2,164,2,154,2,155,2,165,2,165,2, -165,2,165,2,165,16,4,8,70,11,3,1,4,103,51,50,52,170,3,1,7, -101,110,118,50,57,52,52,171,16,4,8,69,11,2,153,3,1,7,101,110,118, -50,57,52,53,172,18,158,2,94,8,73,18,158,2,149,8,73,18,158,93,158, -2,150,8,73,8,73,18,158,2,94,8,73,18,158,2,67,8,73,18,158,10, -8,73,18,158,2,150,8,73,18,158,2,152,8,73,18,158,2,94,8,73,18, -158,2,94,8,73,18,158,2,94,8,73,18,158,2,94,8,73,18,158,2,23, -8,73,18,158,2,150,8,73,18,158,2,94,8,73,18,158,2,94,8,73,18, -158,2,94,8,73,18,158,2,94,8,73,18,16,2,158,94,98,2,153,8,77, -93,8,252,228,7,16,4,8,76,11,3,1,8,119,115,116,109,112,51,50,50, -173,3,1,7,101,110,118,50,57,51,56,174,16,4,8,75,11,3,1,4,103, -51,50,51,175,3,1,7,101,110,118,50,57,54,49,176,16,4,8,74,11,2, -134,3,1,7,101,110,118,50,57,54,50,177,158,2,38,8,77,8,77,95,9, -8,252,228,7,2,30,11,16,5,93,2,9,89,162,32,33,49,9,223,0,27, -89,162,32,32,36,2,148,223,2,250,22,252,31,2,11,6,10,10,98,97,100, -32,115,121,110,116,97,120,195,27,28,248,80,158,35,32,196,249,80,158,36,33, -248,80,158,37,34,198,27,248,80,158,38,35,199,28,248,80,158,38,32,193,27, -27,248,80,158,40,34,195,28,248,80,158,40,36,193,248,22,58,248,80,158,41, -37,194,11,28,192,249,80,158,40,38,194,27,248,80,158,42,35,197,28,248,80, -158,42,36,193,248,22,8,89,162,32,33,39,9,224,10,1,27,249,22,2,89, -162,32,33,44,9,224,4,5,249,80,158,35,39,28,248,80,158,36,32,197,249, -80,158,37,33,248,80,158,38,34,199,27,248,80,158,39,35,200,28,248,80,158, -39,32,193,249,80,158,40,33,248,80,158,41,34,195,248,80,158,41,40,248,80, -158,42,35,196,11,11,194,248,80,158,37,37,196,28,248,22,56,193,21,93,9, -248,80,158,35,41,193,11,11,11,11,28,192,27,248,22,51,194,27,248,22,77, -195,27,248,22,86,196,27,248,22,87,197,28,249,22,4,80,158,40,42,248,22, -215,27,83,160,41,32,42,45,250,22,208,83,160,41,33,45,45,201,195,249,80, -158,40,43,201,27,251,22,60,202,199,200,201,27,83,160,41,34,42,45,91,159, -33,11,90,161,33,32,11,83,160,38,32,33,11,247,248,22,8,89,162,32,33, -40,9,226,12,2,3,1,250,22,31,89,162,32,32,36,9,225,6,3,7,90, -161,33,33,10,247,22,252,174,2,248,22,252,174,2,89,162,32,33,36,9,224, -3,1,248,193,89,162,32,32,36,9,224,2,3,28,248,22,252,171,2,193,248, -22,252,176,2,193,249,80,158,35,44,21,94,1,21,109,97,107,101,45,115,101, -116,33,45,116,114,97,110,115,102,111,114,109,101,114,178,95,2,149,93,2,150, -100,2,67,2,92,10,2,150,94,2,151,2,38,2,152,94,2,154,95,2,23, -2,150,2,155,2,38,83,160,41,35,35,45,89,162,32,32,8,32,9,225,6, -5,4,27,250,22,208,83,160,41,36,38,45,250,22,208,83,160,41,37,41,45, -249,22,58,83,160,41,38,43,45,250,22,208,83,160,41,39,46,45,250,22,58, -83,160,41,40,49,45,83,160,41,41,49,45,250,22,208,83,160,41,42,52,45, -254,22,60,83,160,41,43,59,45,248,22,51,23,26,83,160,41,44,59,45,83, -160,41,45,59,45,248,22,87,23,26,83,160,41,46,59,45,250,22,2,89,162, -33,33,47,9,223,30,250,22,208,83,160,41,47,35,45,249,22,58,248,22,51, -199,250,22,208,83,160,41,48,40,45,250,22,58,83,160,41,49,43,45,83,160, -41,50,43,45,248,22,77,205,83,160,41,51,40,45,83,160,41,52,35,45,248, -22,86,23,29,248,22,77,23,29,83,160,41,53,52,45,83,160,41,54,46,45, -83,160,41,55,41,45,197,89,162,32,32,33,9,223,0,192,89,162,32,32,34, -9,223,3,248,22,252,174,2,208,247,197,247,193,32,20,96,158,16,13,2,42, -2,44,2,46,2,48,2,50,2,54,2,56,2,52,2,58,2,112,2,156,2, -62,2,64,16,24,18,16,2,95,2,75,8,78,93,8,252,246,7,95,9,8, -252,246,7,2,34,18,100,2,85,8,82,36,35,34,16,4,8,81,11,2,150, -3,1,7,101,110,118,50,57,54,53,179,16,10,8,80,11,3,1,4,103,51, -50,53,180,3,1,4,103,51,50,54,181,3,1,4,103,51,50,55,182,3,1, -4,103,51,50,56,183,3,1,7,101,110,118,50,57,55,57,184,2,184,2,184, -2,184,16,10,8,79,11,2,92,2,151,2,154,2,155,3,1,7,101,110,118, -50,57,56,48,185,2,185,2,185,2,185,18,16,2,95,2,75,8,83,93,8, -252,248,7,95,9,8,252,248,7,2,34,18,16,2,99,2,38,8,88,93,8, -252,248,7,16,6,8,87,11,2,76,2,77,3,1,7,101,110,118,50,57,56, -54,186,2,186,16,4,8,86,11,2,79,3,1,7,101,110,118,50,57,56,55, -187,16,4,8,85,11,2,81,3,1,7,101,110,118,50,57,56,56,188,16,4, -8,84,11,2,83,3,1,7,101,110,118,50,57,57,48,189,95,9,8,252,248, -7,2,34,18,158,2,85,8,82,18,158,2,94,8,82,18,158,2,178,8,82, -18,158,2,94,8,82,18,158,2,149,8,82,18,158,93,158,2,150,8,82,8, -82,18,158,2,94,8,82,18,158,2,67,8,82,18,158,10,8,82,18,158,2, -150,8,82,18,158,2,152,8,82,18,158,2,94,8,82,18,158,2,94,8,82, -18,158,2,23,8,82,18,158,2,150,8,82,18,158,2,94,8,82,18,158,2, -94,8,82,18,158,2,94,8,82,18,158,2,94,8,82,18,158,2,94,8,82, -11,93,83,159,32,93,80,158,32,32,89,162,32,33,35,2,4,223,0,248,22, -8,89,162,32,33,38,9,224,1,2,27,247,22,109,87,94,249,22,3,89,162, -32,33,43,9,226,4,3,5,2,87,94,28,248,80,158,36,33,197,12,250,22, -252,32,2,2,4,6,19,19,108,105,115,116,32,111,102,32,105,100,101,110,116, -105,102,105,101,114,115,197,27,250,22,115,196,248,22,209,201,89,97,40,32,32, -9,222,87,94,28,249,22,5,89,162,32,33,36,9,223,7,249,22,220,195,194, -194,248,195,198,12,250,22,114,196,248,22,209,201,249,22,50,202,197,195,11,98, -68,35,37,107,101,114,110,101,108,190,74,35,37,115,109,97,108,108,45,115,99, -104,101,109,101,191,2,6,2,34,2,30,2,33,98,2,190,2,191,2,6,2, -34,2,30,2,33,0}; - EVAL_ONE_SIZED_STR((char *)expr, 8279); +164,2,154,2,155,3,1,7,101,110,118,50,57,54,49,165,2,165,2,165,2, +165,2,165,18,158,2,66,8,61,18,16,2,95,2,75,8,62,93,8,252,251, +7,95,9,8,252,251,7,2,33,18,158,2,85,8,61,18,16,2,95,2,75, +8,63,93,8,252,254,7,95,9,8,252,254,7,2,33,18,16,2,99,2,38, +8,68,93,8,252,254,7,16,6,8,67,11,2,76,2,77,3,1,7,101,110, +118,50,57,55,56,166,2,166,16,4,8,66,11,2,79,3,1,7,101,110,118, +50,57,55,57,167,16,4,8,65,11,2,81,3,1,7,101,110,118,50,57,56, +48,168,16,4,8,64,11,2,83,3,1,7,101,110,118,50,57,56,50,169,95, +9,8,252,254,7,2,33,18,102,2,85,8,71,36,35,34,8,60,8,59,8, +58,16,4,8,70,11,3,1,4,103,51,51,48,170,3,1,7,101,110,118,50, +57,55,52,171,16,4,8,69,11,2,153,3,1,7,101,110,118,50,57,55,53, +172,18,158,2,94,8,71,18,158,2,149,8,71,18,158,93,158,2,150,8,71, +8,71,18,158,2,94,8,71,18,158,2,72,8,71,18,158,10,8,71,18,158, +2,150,8,71,18,158,2,152,8,71,18,158,2,94,8,71,18,158,2,94,8, +71,18,158,2,94,8,71,18,158,2,94,8,71,18,158,2,24,8,71,18,158, +2,150,8,71,18,158,2,94,8,71,18,158,2,94,8,71,18,158,2,94,8, +71,18,158,2,94,8,71,18,16,2,158,94,98,2,153,8,75,93,8,252,250, +7,16,4,8,74,11,3,1,8,119,115,116,109,112,51,50,56,173,3,1,7, +101,110,118,50,57,54,56,174,16,4,8,73,11,3,1,4,103,51,50,57,175, +3,1,7,101,110,118,50,57,57,49,176,16,4,8,72,11,2,134,3,1,7, +101,110,118,50,57,57,50,177,158,2,38,8,75,8,75,95,9,8,252,250,7, +2,30,11,16,5,93,2,20,89,162,32,33,49,9,223,0,27,89,162,32,32, +36,2,148,223,2,250,22,252,32,2,11,6,10,10,98,97,100,32,115,121,110, +116,97,120,195,27,28,248,80,158,35,32,196,249,80,158,36,33,248,80,158,37, +34,198,27,248,80,158,38,35,199,28,248,80,158,38,32,193,27,27,248,80,158, +40,34,195,28,248,80,158,40,36,193,248,22,58,248,80,158,41,37,194,11,28, +192,249,80,158,40,38,194,27,248,80,158,42,35,197,28,248,80,158,42,36,193, +248,22,8,89,162,32,33,39,9,224,10,1,27,249,22,2,89,162,32,33,44, +9,224,4,5,249,80,158,35,39,28,248,80,158,36,32,197,249,80,158,37,33, +248,80,158,38,34,199,27,248,80,158,39,35,200,28,248,80,158,39,32,193,249, +80,158,40,33,248,80,158,41,34,195,248,80,158,41,40,248,80,158,42,35,196, +11,11,194,248,80,158,37,37,196,28,248,22,56,193,21,93,9,248,80,158,35, +41,193,11,11,11,11,28,192,27,248,22,51,194,27,248,22,77,195,27,248,22, +86,196,27,248,22,87,197,28,249,22,4,80,158,40,42,248,22,215,27,83,160, +41,32,42,45,250,22,208,83,160,41,33,45,45,201,195,249,80,158,40,43,201, +27,251,22,60,200,201,199,202,27,83,160,41,34,42,45,91,159,33,11,90,161, +33,32,11,83,160,38,32,33,11,247,248,22,8,89,162,32,33,40,9,226,12, +2,3,1,250,22,31,89,162,32,32,36,9,225,6,3,7,90,161,33,33,10, +247,22,252,175,2,248,22,252,175,2,89,162,32,33,36,9,224,3,1,248,193, +89,162,32,32,36,9,224,2,3,28,248,22,252,172,2,193,248,22,252,177,2, +193,249,80,158,35,44,21,94,1,21,109,97,107,101,45,115,101,116,33,45,116, +114,97,110,115,102,111,114,109,101,114,178,95,2,149,93,2,150,100,2,72,2, +92,10,2,150,94,2,151,2,38,2,152,94,2,154,95,2,24,2,150,2,155, +2,38,83,160,41,35,35,45,89,162,32,32,8,32,9,225,6,5,4,27,250, +22,208,83,160,41,36,38,45,250,22,208,83,160,41,37,41,45,249,22,58,83, +160,41,38,43,45,250,22,208,83,160,41,39,46,45,250,22,58,83,160,41,40, +49,45,83,160,41,41,49,45,250,22,208,83,160,41,42,52,45,254,22,60,83, +160,41,43,59,45,248,22,87,23,26,83,160,41,44,59,45,83,160,41,45,59, +45,248,22,77,23,26,83,160,41,46,59,45,250,22,2,89,162,33,33,47,9, +223,30,250,22,208,83,160,41,47,35,45,249,22,58,248,22,51,199,250,22,208, +83,160,41,48,40,45,250,22,58,83,160,41,49,43,45,83,160,41,50,43,45, +248,22,77,205,83,160,41,51,40,45,83,160,41,52,35,45,248,22,51,23,29, +248,22,86,23,29,83,160,41,53,52,45,83,160,41,54,46,45,83,160,41,55, +41,45,197,89,162,32,32,33,9,223,0,192,89,162,32,32,34,9,223,3,248, +22,252,175,2,208,247,197,247,193,32,20,97,158,16,13,2,42,2,44,2,46, +2,48,2,50,2,54,2,56,2,52,2,58,2,112,2,156,2,62,2,64,16, +24,18,16,2,95,2,75,8,76,93,8,252,12,8,95,9,8,252,12,8,2, +33,18,100,2,85,8,80,36,35,34,16,4,8,79,11,2,150,3,1,7,101, +110,118,50,57,57,53,179,16,10,8,78,11,3,1,4,103,51,51,49,180,3, +1,4,103,51,51,50,181,3,1,4,103,51,51,51,182,3,1,4,103,51,51, +52,183,3,1,7,101,110,118,51,48,48,57,184,2,184,2,184,2,184,16,10, +8,77,11,2,92,2,151,2,154,2,155,3,1,7,101,110,118,51,48,49,48, +185,2,185,2,185,2,185,18,16,2,95,2,75,8,81,93,8,252,14,8,95, +9,8,252,14,8,2,33,18,16,2,99,2,38,8,86,93,8,252,14,8,16, +6,8,85,11,2,76,2,77,3,1,7,101,110,118,51,48,49,54,186,2,186, +16,4,8,84,11,2,79,3,1,7,101,110,118,51,48,49,55,187,16,4,8, +83,11,2,81,3,1,7,101,110,118,51,48,49,56,188,16,4,8,82,11,2, +83,3,1,7,101,110,118,51,48,50,48,189,95,9,8,252,14,8,2,33,18, +158,2,85,8,80,18,158,2,94,8,80,18,158,2,178,8,80,18,158,2,94, +8,80,18,158,2,149,8,80,18,158,93,158,2,150,8,80,8,80,18,158,2, +94,8,80,18,158,2,72,8,80,18,158,10,8,80,18,158,2,150,8,80,18, +158,2,152,8,80,18,158,2,94,8,80,18,158,2,94,8,80,18,158,2,24, +8,80,18,158,2,150,8,80,18,158,2,94,8,80,18,158,2,94,8,80,18, +158,2,94,8,80,18,158,2,94,8,80,18,158,2,94,8,80,11,93,83,159, +32,93,80,158,32,32,89,162,32,33,35,2,4,223,0,248,22,8,89,162,32, +33,38,9,224,1,2,27,247,22,109,87,94,249,22,3,89,162,32,33,43,9, +226,4,3,5,2,87,94,28,248,80,158,36,33,197,12,250,22,252,33,2,2, +4,6,19,19,108,105,115,116,32,111,102,32,105,100,101,110,116,105,102,105,101, +114,115,197,27,250,22,115,196,248,22,209,201,89,97,40,32,32,9,222,87,94, +28,249,22,5,89,162,32,33,36,9,223,7,249,22,220,195,194,194,248,195,198, +12,250,22,114,196,248,22,209,201,249,22,50,202,197,195,11,98,68,35,37,107, +101,114,110,101,108,190,74,35,37,115,109,97,108,108,45,115,99,104,101,109,101, +191,2,6,2,33,2,30,2,32,98,2,190,2,191,2,6,2,33,2,30,2, +32,0}; + EVAL_ONE_SIZED_STR((char *)expr, 8233); } { - static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,48,46,51,134,252,6,15,159,32,20,96,158,16,1,20,23, -65,98,101,103,105,110,0,16,0,83,158,39,20,93,114,67,35,37,113,113,115, -116,120,1,29,2,11,11,10,10,10,32,80,158,32,32,20,96,158,16,2,30, + static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,49,46,52,134,252,6,15,159,32,20,97,158,16,1,20,23, +65,98,101,103,105,110,0,16,0,83,158,39,20,94,114,67,35,37,113,113,115, +116,120,1,29,2,11,11,10,10,10,32,80,158,32,32,20,97,158,16,2,30, 3,2,2,79,99,104,101,99,107,45,115,112,108,105,99,105,110,103,45,108,105, 115,116,4,254,1,30,5,65,35,37,115,116,120,6,69,115,116,120,45,108,105, -115,116,63,7,8,16,0,11,11,16,1,2,4,33,11,16,4,68,117,110,115, -121,110,116,97,120,8,75,113,117,97,115,105,115,121,110,116,97,120,47,108,111, -99,9,77,117,110,115,121,110,116,97,120,45,115,112,108,105,99,105,110,103,10, +115,116,63,7,8,16,0,11,11,16,1,2,4,33,11,16,4,75,113,117,97, +115,105,115,121,110,116,97,120,47,108,111,99,8,77,117,110,115,121,110,116,97, +120,45,115,112,108,105,99,105,110,103,9,68,117,110,115,121,110,116,97,120,10, 71,113,117,97,115,105,115,121,110,116,97,120,11,16,4,11,11,11,11,16,4, -2,8,2,9,2,10,2,11,32,36,94,16,5,94,2,8,2,10,27,89,162, -32,33,36,61,102,12,222,250,22,252,31,2,11,6,30,30,105,108,108,101,103, +2,8,2,9,2,10,2,11,32,36,94,16,5,94,2,10,2,9,27,89,162, +32,33,36,61,102,12,222,250,22,252,32,2,11,6,30,30,105,108,108,101,103, 97,108,32,111,117,116,115,105,100,101,32,111,102,32,113,117,97,115,105,115,121, -110,116,97,120,195,249,22,7,194,194,35,20,96,158,16,0,16,0,11,16,5, -94,2,11,2,9,27,89,162,32,35,42,62,113,113,13,223,1,27,83,160,41, +110,116,97,120,195,249,22,7,194,194,35,20,97,158,16,0,16,0,11,16,5, +94,2,11,2,8,27,89,162,32,35,42,62,113,113,13,223,1,27,83,160,41, 32,33,40,251,91,159,33,11,20,12,95,33,192,89,162,32,36,57,64,108,111, 111,112,14,226,6,7,5,0,27,249,22,208,83,160,41,33,38,40,199,27,28, 248,80,158,38,32,194,28,27,248,80,158,39,33,195,28,248,80,158,39,34,193, @@ -1765,7 +1764,7 @@ 22,58,249,22,58,197,198,251,198,196,248,22,170,204,204,89,162,32,34,46,9, 226,9,7,13,10,249,195,250,22,208,199,249,22,58,248,80,158,43,33,200,203, 197,199,27,28,248,80,158,39,34,195,28,249,22,222,196,83,160,41,35,40,40, -9,11,11,28,192,251,22,252,31,2,11,6,25,25,109,105,115,117,115,101,32, +9,11,11,28,192,251,22,252,32,2,11,6,25,25,109,105,115,117,115,101,32, 119,105,116,104,105,110,32,113,117,97,115,105,115,121,110,116,97,120,201,203,27, 28,248,80,158,40,32,196,27,27,248,80,158,42,33,198,28,248,80,158,42,32, 193,28,27,248,80,158,43,33,194,28,248,80,158,43,34,193,28,249,22,222,194, @@ -1777,12 +1776,12 @@ 45,107,16,226,10,14,11,2,27,249,22,208,83,160,41,37,38,40,248,22,51, 248,80,158,40,38,21,93,63,117,113,115,17,27,249,22,208,83,160,41,38,39, 40,250,22,208,199,63,99,116,120,18,199,249,198,250,22,208,200,250,22,60,201, -83,160,41,39,45,40,206,200,249,22,50,27,250,22,60,201,202,200,27,83,160, +83,160,41,39,45,40,206,200,249,22,50,27,250,22,60,200,201,202,27,83,160, 41,40,43,40,250,22,208,83,160,41,41,46,40,250,22,208,83,160,41,42,49, -40,249,22,58,250,22,208,83,160,41,43,54,40,249,22,58,248,22,51,23,15, +40,249,22,58,250,22,208,83,160,41,43,54,40,249,22,58,248,22,77,23,15, 83,160,41,44,56,40,83,160,41,45,54,40,250,22,208,83,160,41,46,54,40, -250,22,58,83,160,41,47,57,40,248,22,77,23,16,250,22,208,83,160,41,48, -8,28,40,249,22,58,83,160,41,49,8,30,40,248,22,79,23,21,83,160,41, +250,22,58,83,160,41,47,57,40,248,22,79,23,16,250,22,208,83,160,41,48, +8,28,40,249,22,58,83,160,41,49,8,30,40,248,22,51,23,21,83,160,41, 50,8,28,40,83,160,41,51,54,40,83,160,41,52,49,40,195,203,251,203,197, 23,16,89,162,32,32,36,9,224,5,4,249,194,195,9,196,27,89,162,32,34, 36,74,109,107,45,114,101,115,116,45,100,111,110,101,45,107,19,224,14,11,89, @@ -1793,7 +1792,7 @@ 158,44,33,201,249,22,58,248,80,158,46,33,248,80,158,47,33,204,206,248,80, 158,44,33,201,202,251,201,198,200,89,162,32,32,36,9,224,6,4,249,194,195, 9,196,27,28,248,80,158,41,34,197,28,249,22,222,198,83,160,41,53,42,40, -9,11,11,28,192,251,22,252,31,2,11,6,25,25,109,105,115,117,115,101,32, +9,11,11,28,192,251,22,252,32,2,11,6,25,25,109,105,115,117,115,101,32, 119,105,116,104,105,110,32,113,117,97,115,105,115,121,110,116,97,120,203,205,27, 28,248,80,158,42,32,198,28,27,248,80,158,43,33,199,28,248,80,158,43,34, 193,28,249,22,222,194,83,160,41,54,44,40,9,11,11,27,248,80,158,43,35, @@ -1826,7 +1825,7 @@ 158,39,35,197,28,248,80,158,39,32,193,27,248,80,158,40,33,194,28,192,249, 80,158,41,36,194,248,80,158,42,37,248,80,158,43,35,197,11,11,11,28,192, 27,248,22,51,194,27,248,22,52,195,250,199,201,195,89,162,32,33,36,9,223, -8,249,22,58,83,160,41,8,28,34,40,195,250,22,252,31,2,11,6,10,10, +8,249,22,58,83,160,41,8,28,34,40,195,250,22,252,32,2,11,6,10,10, 98,97,100,32,115,121,110,116,97,120,196,89,162,32,33,49,9,224,3,2,27, 249,22,208,83,160,41,8,29,36,40,197,27,28,248,80,158,36,32,194,249,80, 158,37,39,248,80,158,38,33,196,27,248,80,158,39,35,197,28,248,80,158,39, @@ -1834,8 +1833,8 @@ 248,80,158,42,32,193,27,248,80,158,43,33,194,28,192,249,80,158,44,36,194, 248,80,158,45,37,248,80,158,46,35,197,11,11,11,11,28,192,27,248,22,51, 194,27,248,22,77,195,27,248,22,79,196,250,200,202,195,89,162,32,33,38,9, -224,9,4,250,22,58,83,160,41,8,30,36,40,195,197,250,22,252,31,2,11, -6,10,10,98,97,100,32,115,121,110,116,97,120,196,35,20,96,158,16,8,30, +224,9,4,250,22,58,83,160,41,8,30,36,40,195,197,250,22,252,32,2,11, +6,10,10,98,97,100,32,115,121,110,116,97,120,196,35,20,97,158,16,8,30, 23,2,6,69,115,116,120,45,112,97,105,114,63,24,11,30,25,2,6,67,115, 116,120,45,99,97,114,26,5,30,27,2,6,71,105,100,101,110,116,105,102,105, 101,114,63,28,2,30,29,2,6,67,115,116,120,45,99,100,114,30,6,30,31, @@ -1843,102 +1842,102 @@ 120,45,110,117,108,108,47,35,102,34,9,30,35,70,35,37,119,105,116,104,45, 115,116,120,36,1,20,103,101,110,101,114,97,116,101,45,116,101,109,112,111,114, 97,114,105,101,115,37,0,30,38,2,6,67,99,111,110,115,47,35,102,39,1, -16,31,18,98,64,104,101,114,101,40,38,97,36,10,32,11,16,88,2,34,2, -6,71,119,105,116,104,45,115,121,110,116,97,120,41,2,36,66,115,121,110,116, -97,120,42,69,35,37,115,116,120,99,97,115,101,43,71,115,116,120,45,118,101, -99,116,111,114,63,44,2,6,2,10,2,2,74,45,100,101,102,105,110,101,45, -115,121,110,116,97,120,45,74,35,37,100,101,102,105,110,101,45,101,116,45,97, -108,46,2,24,2,6,2,37,2,36,73,115,116,120,45,99,104,101,99,107,47, -101,115,99,47,2,6,1,26,99,104,101,99,107,45,100,117,112,108,105,99,97, -116,101,45,105,100,101,110,116,105,102,105,101,114,48,76,35,37,115,116,120,99, -97,115,101,45,115,99,104,101,109,101,49,69,115,116,120,45,110,117,108,108,63, -50,2,6,70,115,121,110,116,97,120,47,108,111,99,51,68,35,37,115,116,120, -108,111,99,52,70,115,116,120,45,114,111,116,97,116,101,53,2,6,2,7,2, -6,2,39,2,6,2,26,2,6,71,115,116,120,45,114,111,116,97,116,101,42, -54,2,6,63,97,110,100,55,71,35,37,113,113,45,97,110,100,45,111,114,56, -66,108,101,116,47,101,99,57,2,46,70,108,101,116,45,115,121,110,116,97,120, -58,2,49,62,111,114,59,2,56,2,11,2,2,2,28,2,6,73,100,101,102, -105,110,101,45,115,116,114,117,99,116,60,2,46,2,30,2,6,72,108,101,116, -45,115,121,110,116,97,120,101,115,61,2,49,70,113,117,97,115,105,113,117,111, -116,101,62,2,56,64,99,111,110,100,63,66,35,37,99,111,110,100,64,72,115, -121,110,116,97,120,45,99,97,115,101,42,65,2,52,72,115,121,110,116,97,120, -45,114,117,108,101,115,66,2,49,2,8,2,2,2,4,2,2,74,115,112,108, -105,116,45,115,116,120,45,108,105,115,116,67,2,6,74,115,116,120,45,118,101, -99,116,111,114,45,114,101,102,68,2,6,64,119,104,101,110,69,2,46,75,115, -121,110,116,97,120,45,105,100,45,114,117,108,101,115,70,2,49,75,108,101,116, -114,101,99,45,115,121,110,116,97,120,101,115,71,2,49,73,108,101,116,114,101, -99,45,115,121,110,116,97,120,72,2,49,66,117,110,108,101,115,115,73,2,46, -2,9,2,2,67,45,100,101,102,105,110,101,74,2,46,69,115,116,120,45,62, -108,105,115,116,75,2,6,2,32,2,6,71,115,121,110,116,97,120,45,99,97, -115,101,76,2,52,97,35,10,33,11,16,78,2,34,2,6,2,41,2,36,2, -42,2,43,2,44,2,6,2,45,2,46,2,24,2,6,2,37,2,36,2,47, -2,6,2,48,2,49,2,50,2,6,2,51,2,52,2,53,2,6,2,7,2, -6,2,39,2,6,2,26,2,6,2,54,2,6,2,55,2,56,2,57,2,46, -2,58,2,49,2,59,2,56,2,28,2,6,2,60,2,46,2,30,2,6,2, -61,2,49,2,62,2,56,2,63,2,64,2,65,2,52,2,66,2,49,2,67, -2,6,2,68,2,6,2,69,2,46,2,70,2,49,2,71,2,49,2,72,2, -49,2,73,2,46,2,74,2,46,2,75,2,6,2,32,2,6,2,76,2,52, +16,31,18,98,64,104,101,114,101,40,38,97,36,10,32,11,16,88,70,108,101, +116,45,115,121,110,116,97,120,41,76,35,37,115,116,120,99,97,115,101,45,115, +99,104,101,109,101,42,66,115,121,110,116,97,120,43,69,35,37,115,116,120,99, +97,115,101,44,63,97,110,100,45,71,35,37,113,113,45,97,110,100,45,111,114, +46,71,115,116,120,45,118,101,99,116,111,114,63,47,2,6,62,111,114,48,2, +46,72,115,121,110,116,97,120,45,99,97,115,101,42,49,68,35,37,115,116,120, +108,111,99,50,2,24,2,6,2,32,2,6,2,9,2,2,75,108,101,116,114, +101,99,45,115,121,110,116,97,120,101,115,51,2,42,71,115,121,110,116,97,120, +45,99,97,115,101,52,2,50,2,26,2,6,70,115,116,120,45,114,111,116,97, +116,101,53,2,6,74,115,116,120,45,118,101,99,116,111,114,45,114,101,102,54, +2,6,2,39,2,6,73,108,101,116,114,101,99,45,115,121,110,116,97,120,55, +2,42,71,115,116,120,45,114,111,116,97,116,101,42,56,2,6,73,115,116,120, +45,99,104,101,99,107,47,101,115,99,57,2,6,72,108,101,116,45,115,121,110, +116,97,120,101,115,58,2,42,2,8,2,2,64,119,104,101,110,59,74,35,37, +100,101,102,105,110,101,45,101,116,45,97,108,60,64,99,111,110,100,61,66,35, +37,99,111,110,100,62,72,115,121,110,116,97,120,45,114,117,108,101,115,63,2, +42,2,28,2,6,74,45,100,101,102,105,110,101,45,115,121,110,116,97,120,64, +2,60,2,30,2,6,2,10,2,2,75,115,121,110,116,97,120,45,105,100,45, +114,117,108,101,115,65,2,42,70,113,117,97,115,105,113,117,111,116,101,66,2, +46,73,100,101,102,105,110,101,45,115,116,114,117,99,116,67,2,60,2,34,2, +6,66,117,110,108,101,115,115,68,2,60,70,115,121,110,116,97,120,47,108,111, +99,69,2,50,66,108,101,116,47,101,99,70,2,60,71,119,105,116,104,45,115, +121,110,116,97,120,71,2,36,2,11,2,2,1,26,99,104,101,99,107,45,100, +117,112,108,105,99,97,116,101,45,105,100,101,110,116,105,102,105,101,114,72,2, +42,2,7,2,6,69,115,116,120,45,110,117,108,108,63,73,2,6,69,115,116, +120,45,62,108,105,115,116,74,2,6,74,115,112,108,105,116,45,115,116,120,45, +108,105,115,116,75,2,6,67,45,100,101,102,105,110,101,76,2,60,2,4,2, +2,2,37,2,36,97,35,10,33,11,16,78,2,41,2,42,2,43,2,44,2, +45,2,46,2,47,2,6,2,48,2,46,2,49,2,50,2,24,2,6,2,32, +2,6,2,51,2,42,2,52,2,50,2,26,2,6,2,53,2,6,2,54,2, +6,2,39,2,6,2,55,2,42,2,56,2,6,2,57,2,6,2,58,2,42, +2,59,2,60,2,61,2,62,2,63,2,42,2,28,2,6,2,64,2,60,2, +30,2,6,2,65,2,42,2,66,2,46,2,67,2,60,2,34,2,6,2,68, +2,60,2,69,2,50,2,70,2,60,2,71,2,36,2,72,2,42,2,7,2, +6,2,73,2,6,2,74,2,6,2,75,2,6,2,76,2,60,2,37,2,36, 96,34,8,254,1,11,16,0,16,8,33,11,68,111,114,105,103,45,115,116,120, 77,64,98,111,100,121,78,68,109,107,45,102,105,110,97,108,79,3,1,7,101, -110,118,51,48,49,51,80,2,80,2,80,18,101,2,40,42,36,35,34,33,16, +110,118,51,48,52,51,80,2,80,2,80,18,101,2,40,42,36,35,34,33,16, 4,41,11,68,104,101,114,101,45,115,116,120,81,3,1,7,101,110,118,51,48, -49,52,82,16,4,40,11,2,14,3,1,7,101,110,118,51,48,49,53,83,16, +52,52,82,16,4,40,11,2,14,3,1,7,101,110,118,51,48,52,53,83,16, 10,39,11,63,115,116,120,84,65,100,101,112,116,104,85,2,22,2,21,3,1, -7,101,110,118,51,48,49,54,86,2,86,2,86,2,86,18,158,2,8,42,18, -158,2,8,42,18,158,2,10,42,18,104,2,40,46,36,35,34,33,41,40,39, -16,6,45,11,3,1,4,103,51,51,49,87,3,1,4,103,51,51,50,88,3, -1,7,101,110,118,51,48,51,57,89,2,89,16,6,44,11,61,120,90,64,114, -101,115,116,91,3,1,7,101,110,118,51,48,52,48,92,2,92,16,6,43,11, +7,101,110,118,51,48,52,54,86,2,86,2,86,2,86,18,158,2,10,42,18, +158,2,10,42,18,158,2,9,42,18,104,2,40,46,36,35,34,33,41,40,39, +16,6,45,11,3,1,4,103,51,51,55,87,3,1,4,103,51,51,56,88,3, +1,7,101,110,118,51,48,54,57,89,2,89,16,6,44,11,61,120,90,64,114, +101,115,116,91,3,1,7,101,110,118,51,48,55,48,92,2,92,16,6,43,11, 66,114,101,115,116,45,118,93,68,98,105,110,100,105,110,103,115,94,3,1,7, -101,110,118,51,48,52,52,95,2,95,18,158,2,40,46,18,108,63,46,46,46, +101,110,118,51,48,55,52,95,2,95,18,158,2,40,46,18,108,63,46,46,46, 96,51,36,35,34,33,41,40,39,45,44,43,16,4,50,11,3,1,4,103,51, -51,55,97,3,1,7,101,110,118,51,48,53,50,98,16,4,49,11,64,116,101, -109,112,99,3,1,7,101,110,118,51,48,53,51,100,16,4,48,11,3,1,4, -103,51,51,57,101,3,1,7,101,110,118,51,48,54,50,102,16,4,47,11,2, -18,3,1,7,101,110,118,51,48,54,51,103,18,16,2,95,66,115,114,99,116, -97,103,104,52,93,8,252,36,8,95,9,8,252,36,8,2,43,18,158,64,100, +52,51,97,3,1,7,101,110,118,51,48,56,50,98,16,4,49,11,64,116,101, +109,112,99,3,1,7,101,110,118,51,48,56,51,100,16,4,48,11,3,1,4, +103,51,52,53,101,3,1,7,101,110,118,51,48,57,50,102,16,4,47,11,2, +18,3,1,7,101,110,118,51,48,57,51,103,18,16,2,95,66,115,114,99,116, +97,103,104,52,93,8,252,58,8,95,9,8,252,58,8,2,44,18,158,64,100, 101,115,116,105,51,18,158,2,18,51,18,158,2,18,51,18,158,2,96,51,18, 158,2,18,51,18,158,2,18,51,18,158,2,4,51,18,158,2,18,51,18,158, 72,113,117,111,116,101,45,115,121,110,116,97,120,106,51,18,158,2,18,51,18, -158,2,18,51,18,158,2,18,51,18,158,2,10,42,18,158,2,11,42,18,106, -2,8,58,36,35,34,33,41,40,39,16,4,57,11,3,1,4,103,51,50,57, -107,3,1,7,101,110,118,51,48,56,55,108,16,4,56,11,65,95,101,108,115, -101,109,3,1,7,101,110,118,51,48,56,56,110,16,4,55,11,2,20,3,1, -7,101,110,118,51,48,57,49,111,16,4,54,11,61,108,112,3,1,7,101,110, -118,51,48,57,50,113,16,4,53,11,61,97,114,3,1,7,101,110,118,51,48, -57,51,115,18,158,2,11,58,18,158,2,10,58,18,100,2,41,8,28,36,35, -34,33,41,16,4,59,11,2,94,3,1,7,101,110,118,51,49,48,53,116,18, +158,2,18,51,18,158,2,18,51,18,158,2,9,42,18,158,2,11,42,18,106, +2,10,58,36,35,34,33,41,40,39,16,4,57,11,3,1,4,103,51,51,53, +107,3,1,7,101,110,118,51,49,49,55,108,16,4,56,11,65,95,101,108,115, +101,109,3,1,7,101,110,118,51,49,49,56,110,16,4,55,11,2,20,3,1, +7,101,110,118,51,49,50,49,111,16,4,54,11,61,108,112,3,1,7,101,110, +118,51,49,50,50,113,16,4,53,11,61,97,114,3,1,7,101,110,118,51,49, +50,51,115,18,158,2,11,58,18,158,2,9,58,18,100,2,71,8,28,36,35, +34,33,41,16,4,59,11,2,94,3,1,7,101,110,118,51,49,51,53,116,18, 99,2,40,8,31,36,35,34,16,4,8,30,11,2,13,3,1,7,101,110,118, -51,48,49,50,117,16,4,8,29,11,2,77,3,1,7,101,110,118,51,49,48, -54,118,18,102,2,42,8,35,36,35,34,8,30,8,29,16,6,8,34,11,3, -1,4,103,51,52,48,119,3,1,4,103,51,52,49,120,3,1,7,101,110,118, -51,49,49,50,121,2,121,16,6,8,33,11,61,95,122,2,84,3,1,7,101, -110,118,51,49,49,51,123,2,123,16,4,8,32,11,2,78,3,1,7,101,110, -118,51,49,49,54,124,18,99,2,40,8,37,36,35,34,8,30,16,4,8,36, -11,2,77,3,1,7,101,110,118,51,49,49,55,125,18,102,2,51,8,41,36, -35,34,8,30,8,36,16,8,8,40,11,3,1,4,103,51,52,50,126,3,1, -4,103,51,52,51,127,3,1,4,103,51,52,52,128,3,1,7,101,110,118,51, -49,50,52,129,2,129,2,129,16,8,8,39,11,2,122,63,108,111,99,130,2, -84,3,1,7,101,110,118,51,49,50,53,131,2,131,2,131,16,4,8,38,11, -2,78,3,1,7,101,110,118,51,49,50,57,132,11,93,83,159,32,93,80,158, +51,48,52,50,117,16,4,8,29,11,2,77,3,1,7,101,110,118,51,49,51, +54,118,18,102,2,43,8,35,36,35,34,8,30,8,29,16,6,8,34,11,3, +1,4,103,51,52,54,119,3,1,4,103,51,52,55,120,3,1,7,101,110,118, +51,49,52,50,121,2,121,16,6,8,33,11,61,95,122,2,84,3,1,7,101, +110,118,51,49,52,51,123,2,123,16,4,8,32,11,2,78,3,1,7,101,110, +118,51,49,52,54,124,18,99,2,40,8,37,36,35,34,8,30,16,4,8,36, +11,2,77,3,1,7,101,110,118,51,49,52,55,125,18,102,2,69,8,41,36, +35,34,8,30,8,36,16,8,8,40,11,3,1,4,103,51,52,56,126,3,1, +4,103,51,52,57,127,3,1,4,103,51,53,48,128,3,1,7,101,110,118,51, +49,53,52,129,2,129,2,129,16,8,8,39,11,2,122,63,108,111,99,130,2, +84,3,1,7,101,110,118,51,49,53,53,131,2,131,2,131,16,4,8,38,11, +2,78,3,1,7,101,110,118,51,49,53,57,132,11,93,83,159,32,93,80,158, 32,32,89,162,32,34,38,2,4,223,0,87,94,28,248,80,158,33,33,194,12, -250,22,252,32,2,2,10,6,18,18,112,114,111,112,101,114,32,115,121,110,116, +250,22,252,33,2,2,9,6,18,18,112,114,111,112,101,114,32,115,121,110,116, 97,120,32,108,105,115,116,196,250,22,208,197,196,197,95,68,35,37,107,101,114, -110,101,108,133,2,49,2,6,95,2,133,2,49,2,6,0}; +110,101,108,133,2,42,2,6,95,2,133,2,42,2,6,0}; EVAL_ONE_SIZED_STR((char *)expr, 3858); } { - static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,48,46,51,207,252,150,29,159,32,20,96,158,16,1,20,23, -65,98,101,103,105,110,0,16,0,83,158,39,20,93,114,68,35,37,100,101,102, -105,110,101,1,29,2,11,11,10,10,10,32,80,158,32,32,20,96,158,16,0, -16,0,11,11,16,0,32,11,16,4,77,100,101,102,105,110,101,45,102,111,114, -45,115,121,110,116,97,120,3,73,100,101,102,105,110,101,45,115,121,110,116,97, -120,4,66,100,101,102,105,110,101,5,76,98,101,103,105,110,45,102,111,114,45, + static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,49,46,52,207,252,157,29,159,32,20,97,158,16,1,20,23, +65,98,101,103,105,110,0,16,0,83,158,39,20,94,114,68,35,37,100,101,102, +105,110,101,1,29,2,11,11,10,10,10,32,80,158,32,32,20,97,158,16,0, +16,0,11,11,16,0,32,11,16,4,66,100,101,102,105,110,101,3,77,100,101, +102,105,110,101,45,102,111,114,45,115,121,110,116,97,120,4,73,100,101,102,105, +110,101,45,115,121,110,116,97,120,5,76,98,101,103,105,110,45,102,111,114,45, 115,121,110,116,97,120,6,16,4,11,11,11,11,16,4,2,3,2,4,2,5, -2,6,32,36,94,16,5,95,2,5,2,4,2,3,27,89,162,32,33,34,62, +2,6,32,36,94,16,5,95,2,3,2,5,2,4,27,89,162,32,33,34,62, 109,107,7,223,1,89,162,32,33,8,31,9,224,0,1,87,94,28,249,22,70, -247,22,252,71,3,21,93,70,101,120,112,114,101,115,115,105,111,110,8,250,22, -252,31,2,11,6,36,36,110,111,116,32,97,108,108,111,119,101,100,32,105,110, +247,22,252,72,3,21,93,70,101,120,112,114,101,115,115,105,111,110,8,250,22, +252,32,2,11,6,36,36,110,111,116,32,97,108,108,111,119,101,100,32,105,110, 32,97,110,32,101,120,112,114,101,115,115,105,111,110,32,99,111,110,116,101,120, 116,197,12,27,249,22,208,83,160,41,32,36,45,197,27,89,162,32,32,8,28, 68,116,114,121,45,110,101,120,116,9,226,3,2,4,1,27,89,162,32,32,50, @@ -1953,350 +1952,350 @@ 28,248,80,158,38,32,194,249,80,158,39,33,248,80,158,40,34,196,27,248,80, 158,41,35,197,28,248,80,158,41,36,193,248,80,158,41,37,193,11,11,28,192, 27,248,22,51,194,27,248,22,52,195,249,22,7,248,22,215,27,83,160,41,34, -43,45,250,22,208,83,160,41,35,46,45,199,195,89,162,32,33,52,9,225,9, +43,45,250,22,208,83,160,41,35,46,45,199,195,89,162,32,33,54,9,225,9, 8,2,27,249,22,208,83,160,41,36,37,45,198,249,80,158,37,38,196,27,249, -22,60,198,197,27,83,160,41,37,39,45,250,22,208,83,160,41,38,42,45,250, -22,208,83,160,41,39,45,45,249,22,50,83,160,41,40,47,45,201,83,160,41, -41,45,45,195,27,28,248,80,158,39,32,195,249,80,158,40,33,248,80,158,41, -34,197,27,248,80,158,42,35,198,91,159,35,11,90,161,35,32,11,250,80,158, -47,39,198,33,11,28,194,27,28,248,22,205,197,196,201,27,28,248,80,158,47, -36,195,248,22,58,248,80,158,48,37,196,11,28,192,249,80,158,48,40,194,250, -22,208,198,200,198,11,11,11,28,192,27,248,22,51,194,27,248,22,77,195,27, -248,22,79,196,249,22,7,248,22,215,27,249,22,60,199,198,27,83,160,41,42, -46,45,250,22,208,83,160,41,43,49,45,249,22,64,248,22,51,199,248,22,58, -248,22,52,200,195,89,162,32,33,57,9,226,11,10,2,3,27,249,22,208,83, -160,41,44,38,45,199,249,80,158,38,38,197,27,250,22,60,198,199,200,27,83, -160,41,45,40,45,250,22,208,83,160,41,46,43,45,250,22,208,83,160,41,47, -46,45,250,22,60,83,160,41,48,49,45,249,22,64,248,22,77,205,248,22,79, -205,248,22,51,203,83,160,41,49,46,45,195,250,22,252,31,2,11,6,10,10, -98,97,100,32,115,121,110,116,97,120,197,87,95,249,22,3,89,162,32,33,39, -9,224,5,4,28,248,80,158,34,41,195,12,251,22,252,31,2,11,6,40,40, -110,111,116,32,97,110,32,105,100,101,110,116,105,102,105,101,114,32,102,111,114, -32,112,114,111,99,101,100,117,114,101,32,97,114,103,117,109,101,110,116,196,198, -194,27,248,80,158,37,42,194,28,192,251,22,252,31,2,11,6,29,29,100,117, -112,108,105,99,97,116,101,32,97,114,103,117,109,101,110,116,32,105,100,101,110, -116,105,102,105,101,114,199,196,12,193,89,162,32,33,48,73,103,101,110,101,114, -97,108,45,112,114,111,116,111,11,226,11,9,1,0,27,249,22,208,83,160,41, -50,38,45,199,27,89,162,32,32,56,2,9,228,5,4,3,2,6,1,27,28, -248,80,158,39,32,194,27,27,248,80,158,41,34,196,28,248,80,158,41,32,193, -249,80,158,42,33,248,80,158,43,34,195,27,248,80,158,44,35,196,248,22,58, -250,22,208,199,196,199,11,28,192,249,80,158,41,40,194,27,248,80,158,43,35, -198,250,22,208,200,195,200,11,11,28,192,27,248,22,51,194,27,248,22,77,195, -27,248,22,79,196,91,159,34,11,90,161,34,32,11,248,202,27,249,22,60,199, -200,27,83,160,41,51,46,45,250,22,208,83,160,41,52,49,45,250,22,208,83, -160,41,53,52,45,249,22,50,248,22,52,202,248,22,51,202,83,160,41,54,52, -45,195,27,248,202,201,249,22,7,195,89,162,32,33,38,9,224,4,2,248,194, -248,22,58,248,195,197,27,28,248,80,158,40,32,195,249,80,158,41,33,248,80, -158,42,34,197,27,248,80,158,43,35,198,250,22,208,200,195,200,11,28,192,27, -248,22,51,194,27,248,22,52,195,251,22,252,31,2,11,6,82,82,98,97,100, -32,115,121,110,116,97,120,32,40,110,111,116,32,97,110,32,105,100,101,110,116, -105,102,105,101,114,32,102,111,114,32,112,114,111,99,101,100,117,114,101,32,110, -97,109,101,44,32,97,110,100,32,110,111,116,32,97,32,110,101,115,116,101,100, -32,112,114,111,99,101,100,117,114,101,32,102,111,114,109,41,204,197,250,22,252, -31,2,11,6,10,10,98,97,100,32,115,121,110,116,97,120,197,27,28,248,80, -158,39,32,195,249,80,158,40,33,248,80,158,41,34,197,27,248,80,158,42,35, -198,250,22,208,200,195,200,11,28,192,27,248,22,51,194,27,248,22,52,195,28, -248,80,158,41,41,194,249,22,7,195,248,200,204,247,195,247,193,87,95,28,248, -80,158,42,36,195,12,250,22,252,31,2,11,6,50,50,98,97,100,32,115,121, -110,116,97,120,32,40,105,108,108,101,103,97,108,32,117,115,101,32,111,102,32, -96,46,39,32,102,111,114,32,112,114,111,99,101,100,117,114,101,32,98,111,100, -121,41,202,28,248,80,158,42,43,195,250,22,252,31,2,11,6,46,46,98,97, -100,32,115,121,110,116,97,120,32,40,110,111,32,101,120,112,114,101,115,115,105, -111,110,115,32,102,111,114,32,112,114,111,99,101,100,117,114,101,32,98,111,100, -121,41,202,12,27,249,22,208,83,160,41,55,44,45,203,27,249,22,208,83,160, -41,56,45,45,196,27,249,22,208,83,160,41,57,46,45,248,199,200,249,80,158, -46,38,204,27,250,22,60,198,200,199,27,83,160,41,58,48,45,250,22,208,83, -160,41,59,51,45,250,22,208,83,160,41,8,28,54,45,250,22,58,248,22,77, -203,250,22,208,83,160,41,8,29,8,28,45,248,22,58,248,22,79,23,15,83, -160,41,8,30,8,28,45,248,22,51,203,83,160,41,8,31,54,45,195,250,22, -252,31,2,11,6,10,10,98,97,100,32,115,121,110,116,97,120,196,27,28,248, -80,158,38,32,195,249,80,158,39,33,248,80,158,40,34,197,27,248,80,158,41, -35,198,28,248,80,158,41,32,193,27,28,248,22,205,194,193,198,249,80,158,43, -33,248,80,158,44,34,196,27,248,80,158,45,35,197,250,22,208,198,195,198,11, -11,28,192,27,248,22,51,194,27,248,22,77,195,27,248,22,79,196,28,248,80, -158,41,32,194,247,196,251,22,252,31,2,11,6,10,10,98,97,100,32,115,121, -110,116,97,120,202,197,247,193,27,28,248,80,158,38,32,195,249,80,158,39,33, -248,80,158,40,34,197,27,248,80,158,41,35,198,28,248,80,158,41,32,193,27, -28,248,22,205,194,193,198,249,80,158,43,33,248,80,158,44,34,196,27,248,80, -158,45,35,197,250,22,208,198,195,198,11,11,28,192,27,248,22,51,194,27,248, -22,77,195,27,248,22,79,196,28,248,80,158,41,41,194,250,22,252,31,2,11, -27,249,22,208,83,160,41,8,32,46,45,204,27,28,248,80,158,46,32,194,249, -80,158,47,33,248,80,158,48,34,196,27,248,80,158,49,35,197,28,248,80,158, -49,32,193,249,80,158,50,33,248,80,158,51,34,195,27,248,80,158,52,35,196, -28,248,80,158,52,36,193,248,80,158,52,37,193,11,11,11,28,192,27,248,22, -51,194,27,248,22,77,195,27,248,22,79,196,6,50,50,98,97,100,32,115,121, -110,116,97,120,32,40,109,117,108,116,105,112,108,101,32,101,120,112,114,101,115, -115,105,111,110,115,32,97,102,116,101,114,32,105,100,101,110,116,105,102,105,101, -114,41,27,28,248,80,158,47,32,195,249,80,158,48,33,248,80,158,49,34,197, -27,248,80,158,50,35,198,28,248,80,158,50,32,193,27,248,80,158,51,34,194, -28,192,249,80,158,52,40,194,248,80,158,53,44,248,80,158,54,35,197,11,11, -11,28,192,27,248,22,51,194,27,248,22,52,195,6,46,46,98,97,100,32,115, -121,110,116,97,120,32,40,122,101,114,111,32,101,120,112,114,101,115,115,105,111, -110,115,32,97,102,116,101,114,32,105,100,101,110,116,105,102,105,101,114,41,27, -28,248,80,158,48,32,196,249,80,158,49,33,248,80,158,50,34,198,27,248,80, -158,51,35,199,28,248,80,158,51,32,193,27,28,248,22,205,194,193,199,249,80, -158,53,33,248,80,158,54,34,196,27,248,80,158,55,35,197,250,22,208,198,195, -198,11,11,28,192,27,248,22,51,194,27,248,22,77,195,27,248,22,79,196,6, -31,31,98,97,100,32,115,121,110,116,97,120,32,40,105,108,108,101,103,97,108, -32,117,115,101,32,111,102,32,96,46,39,41,250,22,252,31,2,11,6,10,10, -98,97,100,32,115,121,110,116,97,120,198,201,247,196,247,193,27,28,248,80,158, -37,32,195,249,80,158,38,33,248,80,158,39,34,197,27,248,80,158,40,35,198, -28,248,80,158,40,32,193,249,80,158,41,33,248,80,158,42,34,195,27,248,80, -158,43,35,196,28,248,80,158,43,32,193,27,248,80,158,44,34,194,28,192,249, -80,158,45,40,194,248,80,158,46,44,248,80,158,47,35,197,11,11,11,11,28, -192,27,248,22,51,194,27,248,22,77,195,27,248,22,79,196,28,248,80,158,40, -41,194,27,249,22,208,83,160,41,8,33,42,45,201,249,80,158,42,38,203,27, -250,22,60,198,199,200,27,83,160,41,8,34,44,45,250,22,208,83,160,41,8, -35,47,45,250,22,208,83,160,41,8,36,50,45,250,22,58,248,22,51,203,250, -22,208,83,160,41,8,37,56,45,248,22,58,248,22,79,23,15,83,160,41,8, -38,56,45,248,22,77,203,83,160,41,8,39,50,45,195,247,196,247,193,250,22, -7,248,196,83,160,41,8,40,37,45,248,196,83,160,41,8,41,37,45,248,196, -83,160,41,8,42,37,45,37,20,96,158,16,13,30,12,65,35,37,115,116,120, -13,69,115,116,120,45,112,97,105,114,63,14,11,30,15,2,13,67,99,111,110, -115,47,35,102,16,1,30,17,2,13,67,115,116,120,45,99,97,114,18,5,30, -19,2,13,67,115,116,120,45,99,100,114,20,6,30,21,2,13,69,115,116,120, -45,108,105,115,116,63,22,8,30,23,2,13,69,115,116,120,45,62,108,105,115, -116,24,4,30,25,68,35,37,115,116,120,108,111,99,26,68,114,101,108,111,99, -97,116,101,27,1,30,28,2,13,74,115,112,108,105,116,45,115,116,120,45,108, -105,115,116,29,3,30,30,2,13,69,97,112,112,101,110,100,47,35,102,31,0, -30,32,2,13,71,105,100,101,110,116,105,102,105,101,114,63,33,2,30,34,76, -35,37,115,116,120,99,97,115,101,45,115,99,104,101,109,101,35,1,26,99,104, -101,99,107,45,100,117,112,108,105,99,97,116,101,45,105,100,101,110,116,105,102, -105,101,114,36,0,30,37,2,13,69,115,116,120,45,110,117,108,108,63,38,10, -30,39,2,13,71,115,116,120,45,110,117,108,108,47,35,102,40,9,16,43,18, -99,64,104,101,114,101,41,39,97,37,10,32,11,16,8,2,3,2,2,2,4, -2,2,2,5,2,2,2,6,2,2,97,36,10,33,11,16,86,2,40,2,13, -71,119,105,116,104,45,115,121,110,116,97,120,42,70,35,37,119,105,116,104,45, -115,116,120,43,66,115,121,110,116,97,120,44,69,35,37,115,116,120,99,97,115, -101,45,71,115,116,120,45,118,101,99,116,111,114,63,46,2,13,77,117,110,115, -121,110,116,97,120,45,115,112,108,105,99,105,110,103,47,67,35,37,113,113,115, -116,120,48,74,45,100,101,102,105,110,101,45,115,121,110,116,97,120,49,74,35, -37,100,101,102,105,110,101,45,101,116,45,97,108,50,2,14,2,13,1,20,103, -101,110,101,114,97,116,101,45,116,101,109,112,111,114,97,114,105,101,115,51,2, -43,73,115,116,120,45,99,104,101,99,107,47,101,115,99,52,2,13,2,36,2, -35,2,38,2,13,70,115,121,110,116,97,120,47,108,111,99,53,2,26,70,115, -116,120,45,114,111,116,97,116,101,54,2,13,2,22,2,13,2,16,2,13,2, -18,2,13,71,115,116,120,45,114,111,116,97,116,101,42,55,2,13,63,97,110, -100,56,71,35,37,113,113,45,97,110,100,45,111,114,57,66,108,101,116,47,101, -99,58,2,50,70,108,101,116,45,115,121,110,116,97,120,59,2,35,62,111,114, -60,2,57,71,113,117,97,115,105,115,121,110,116,97,120,61,2,48,2,33,2, -13,73,100,101,102,105,110,101,45,115,116,114,117,99,116,62,2,50,2,20,2, -13,72,108,101,116,45,115,121,110,116,97,120,101,115,63,2,35,70,113,117,97, -115,105,113,117,111,116,101,64,2,57,64,99,111,110,100,65,66,35,37,99,111, -110,100,66,72,115,121,110,116,97,120,45,99,97,115,101,42,67,2,26,72,115, -121,110,116,97,120,45,114,117,108,101,115,68,2,35,68,117,110,115,121,110,116, -97,120,69,2,48,2,29,2,13,74,115,116,120,45,118,101,99,116,111,114,45, -114,101,102,70,2,13,64,119,104,101,110,71,2,50,75,115,121,110,116,97,120, -45,105,100,45,114,117,108,101,115,72,2,35,75,108,101,116,114,101,99,45,115, -121,110,116,97,120,101,115,73,2,35,73,108,101,116,114,101,99,45,115,121,110, -116,97,120,74,2,35,66,117,110,108,101,115,115,75,2,50,75,113,117,97,115, -105,115,121,110,116,97,120,47,108,111,99,76,2,48,67,45,100,101,102,105,110, -101,77,2,50,2,24,2,13,2,31,2,13,71,115,121,110,116,97,120,45,99, -97,115,101,78,2,26,96,35,8,254,1,11,16,0,16,4,34,11,77,100,101, -102,105,110,101,45,118,97,108,117,101,115,45,115,116,120,79,3,1,7,101,110, -118,51,49,51,53,80,16,4,33,11,63,115,116,120,81,3,1,7,101,110,118, -51,49,51,54,82,18,102,2,41,43,37,36,35,34,33,16,8,42,11,3,1, -4,103,51,52,53,83,3,1,4,103,51,52,54,84,3,1,4,103,51,52,55, -85,3,1,7,101,110,118,51,49,53,49,86,2,86,2,86,16,8,41,11,61, -95,87,65,112,114,111,116,111,88,64,98,111,100,121,89,3,1,7,101,110,118, -51,49,53,50,90,2,90,2,90,16,6,40,11,2,10,2,11,3,1,7,101, -110,118,51,49,53,55,91,2,91,18,16,2,95,66,115,114,99,116,97,103,92, -44,93,8,252,112,8,95,9,8,252,112,8,2,45,18,104,64,100,101,115,116, -93,47,37,36,35,34,33,42,41,40,16,6,46,11,3,1,4,103,51,54,48, -94,3,1,4,103,51,54,49,95,3,1,7,101,110,118,51,49,54,52,96,2, -96,16,6,45,11,62,105,100,97,63,97,114,103,98,3,1,7,101,110,118,51, -49,54,53,99,2,99,18,158,2,41,47,18,16,2,95,2,92,48,93,8,252, -118,8,95,9,8,252,118,8,2,45,18,158,2,93,47,18,158,63,99,116,120, -100,47,18,158,66,108,97,109,98,100,97,101,47,18,158,2,100,47,18,16,2, -95,2,92,49,93,8,252,119,8,95,9,8,252,119,8,2,45,18,104,2,93, -52,37,36,35,34,33,42,41,40,16,8,51,11,3,1,4,103,51,53,55,102, -3,1,4,103,51,53,56,103,3,1,4,103,51,53,57,104,3,1,7,101,110, -118,51,49,57,49,105,2,105,2,105,16,8,50,11,2,97,2,98,64,114,101, -115,116,106,3,1,7,101,110,118,51,49,57,50,107,2,107,2,107,18,158,2, -41,52,18,16,2,95,2,92,53,93,8,252,125,8,95,9,8,252,125,8,2, -45,18,158,2,93,52,18,158,2,100,52,18,158,2,101,52,18,158,2,100,52, -18,158,2,41,43,18,16,2,95,2,92,54,93,8,252,137,8,95,9,8,252, -137,8,2,45,18,104,2,93,58,37,36,35,34,33,42,41,16,6,57,11,2, -10,2,11,2,91,2,91,16,8,56,11,3,1,4,103,51,55,48,108,3,1, -4,103,51,55,49,109,3,1,4,103,51,55,50,110,3,1,7,101,110,118,51, -50,50,52,111,2,111,2,111,16,8,55,11,69,115,111,109,101,116,104,105,110, -103,112,64,109,111,114,101,113,2,106,3,1,7,101,110,118,51,50,50,53,114, -2,114,2,114,18,158,2,100,58,18,158,2,100,58,18,102,2,41,8,28,37, -36,35,34,33,42,41,16,6,59,11,2,97,66,109,107,45,114,104,115,115,3, -1,7,101,110,118,51,49,53,54,116,2,116,18,158,2,41,8,28,18,158,2, -41,8,28,18,16,2,95,2,92,8,29,93,8,252,156,8,95,9,8,252,156, -8,2,45,18,158,2,93,8,28,18,158,2,100,8,28,18,158,2,100,8,28, -18,158,2,100,8,28,18,158,2,100,8,28,18,101,2,41,8,32,37,36,35, -34,33,16,8,8,31,11,3,1,4,103,51,53,49,117,3,1,4,103,51,53, -50,118,3,1,4,103,51,53,51,119,3,1,7,101,110,118,51,50,57,57,120, -2,120,2,120,16,8,8,30,11,2,87,2,97,2,106,3,1,7,101,110,118, -51,51,48,48,121,2,121,2,121,18,101,2,41,8,35,37,36,35,34,33,16, -8,8,34,11,3,1,4,103,51,53,52,122,3,1,4,103,51,53,53,123,3, -1,4,103,51,53,54,124,3,1,7,101,110,118,51,51,51,56,125,2,125,2, -125,16,8,8,33,11,2,87,2,97,64,101,120,112,114,126,3,1,7,101,110, -118,51,51,51,57,127,2,127,2,127,18,16,2,95,2,92,8,36,93,8,252, -180,8,95,9,8,252,180,8,2,45,18,158,2,93,8,35,18,158,2,100,8, -35,18,158,2,100,8,35,18,158,2,100,8,35,18,158,2,100,8,35,18,98, -73,100,101,102,105,110,101,45,118,97,108,117,101,115,128,8,38,37,36,35,16, -4,8,37,11,2,7,3,1,7,101,110,118,51,49,51,52,129,18,158,75,100, -101,102,105,110,101,45,115,121,110,116,97,120,101,115,130,8,38,18,158,1,24, -100,101,102,105,110,101,45,118,97,108,117,101,115,45,102,111,114,45,115,121,110, -116,97,120,131,8,38,11,16,5,93,2,6,89,162,32,33,8,35,9,223,0, -27,247,22,252,71,3,87,94,28,249,22,70,194,21,95,66,109,111,100,117,108, -101,132,72,109,111,100,117,108,101,45,98,101,103,105,110,133,69,116,111,112,45, -108,101,118,101,108,134,12,250,22,252,31,2,11,6,51,51,97,108,108,111,119, -101,100,32,111,110,108,121,32,97,116,32,116,104,101,32,116,111,112,45,108,101, -118,101,108,32,111,114,32,97,32,109,111,100,117,108,101,32,116,111,112,45,108, -101,118,101,108,197,27,249,22,208,83,160,41,32,36,42,197,27,28,248,80,158, -36,32,194,27,248,80,158,37,33,195,28,192,249,80,158,38,34,194,248,80,158, -39,35,248,80,158,40,36,198,11,11,28,192,83,160,41,33,35,42,27,89,162, -32,32,52,2,9,225,4,5,2,27,28,248,80,158,36,32,194,249,80,158,37, -37,248,80,158,38,33,196,27,248,80,158,39,36,197,28,248,80,158,39,38,193, -248,80,158,39,39,193,11,11,28,192,27,248,22,51,194,27,248,22,52,195,249, -80,158,39,40,198,27,83,160,41,34,40,42,250,22,208,83,160,41,35,43,42, -250,22,208,83,160,41,36,46,42,249,22,50,83,160,41,37,48,42,249,22,2, -89,162,33,33,41,9,223,18,250,22,208,83,160,41,38,35,42,249,22,58,83, -160,41,39,37,42,248,22,51,199,83,160,41,40,35,42,205,83,160,41,41,46, -42,195,250,22,252,31,2,11,6,10,10,98,97,100,32,115,121,110,116,97,120, -196,27,28,248,80,158,38,32,196,249,80,158,39,37,248,80,158,40,33,198,27, -248,80,158,41,36,199,28,248,80,158,41,32,193,27,248,80,158,42,33,194,28, -192,249,80,158,43,34,194,248,80,158,44,35,248,80,158,45,36,197,11,11,11, -28,192,27,248,22,51,194,27,248,22,52,195,28,249,22,252,5,2,200,2,133, -247,195,27,250,22,252,19,2,196,202,248,22,215,83,160,41,42,44,42,27,249, -22,208,83,160,41,43,43,42,195,27,27,22,223,28,248,80,158,44,32,195,28, -27,248,80,158,45,33,196,28,248,80,158,45,41,193,28,249,195,194,83,160,41, -44,46,42,9,11,11,27,248,80,158,45,36,196,28,248,80,158,45,38,193,248, -80,158,45,39,193,11,11,11,28,192,27,83,160,41,45,43,42,250,22,208,83, -160,41,46,46,42,250,22,208,83,160,41,47,49,42,249,22,50,83,160,41,48, -51,42,201,83,160,41,49,49,42,195,27,27,22,223,28,248,80,158,45,32,196, -28,27,248,80,158,46,33,197,28,248,80,158,46,41,193,28,249,195,194,83,160, -41,50,47,42,9,11,11,27,248,80,158,46,36,197,28,248,80,158,46,32,193, -27,27,248,80,158,48,33,195,28,248,80,158,48,38,193,248,22,58,248,80,158, -49,39,194,11,28,192,249,80,158,48,34,194,27,248,80,158,50,36,197,28,248, -80,158,50,32,193,27,248,80,158,51,33,194,28,192,249,80,158,52,34,194,248, -80,158,53,35,248,80,158,54,36,197,11,11,11,11,11,11,28,192,27,248,22, -51,194,27,248,22,52,195,27,249,22,60,196,195,27,83,160,41,51,47,42,250, -22,208,83,160,41,52,50,42,250,22,208,83,160,41,53,53,42,250,22,58,83, -160,41,54,56,42,248,22,51,203,248,22,52,203,83,160,41,55,53,42,195,27, -27,22,223,28,248,80,158,46,32,197,28,27,248,80,158,47,33,198,28,248,80, -158,47,41,193,28,249,195,194,83,160,41,56,48,42,9,11,11,27,248,80,158, -47,36,198,28,248,80,158,47,38,193,248,80,158,47,39,193,11,11,11,28,192, -27,83,160,41,57,45,42,250,22,208,83,160,41,58,48,42,250,22,208,83,160, -41,59,51,42,249,22,50,83,160,41,8,28,53,42,201,83,160,41,8,29,51, -42,195,27,27,22,223,28,248,80,158,47,32,198,28,27,248,80,158,48,33,199, -28,248,80,158,48,41,193,28,249,195,194,83,160,41,8,30,49,42,9,11,11, -27,248,80,158,48,36,199,28,248,80,158,48,38,193,248,80,158,48,39,193,11, -11,11,28,192,27,83,160,41,8,31,46,42,250,22,208,83,160,41,8,32,49, -42,250,22,208,83,160,41,8,33,52,42,249,22,50,83,160,41,8,34,54,42, -201,83,160,41,8,35,52,42,195,27,27,22,223,28,248,80,158,48,32,199,28, -27,248,80,158,49,33,200,28,248,80,158,49,41,193,28,249,195,194,83,160,41, -8,36,50,42,9,11,11,27,248,80,158,49,36,200,28,248,80,158,49,32,193, -27,27,248,80,158,51,33,195,28,248,80,158,51,38,193,248,22,58,248,80,158, -52,39,194,11,28,192,249,80,158,51,34,194,27,248,80,158,53,36,197,28,248, -80,158,53,32,193,27,248,80,158,54,33,194,28,192,249,80,158,55,34,194,248, -80,158,56,35,248,80,158,57,36,197,11,11,11,11,11,11,28,192,27,248,22, -51,194,27,248,22,52,195,250,22,252,31,2,11,6,54,54,115,121,110,116,97, -120,32,100,101,102,105,110,105,116,105,111,110,115,32,110,111,116,32,97,108,108, -111,119,101,100,32,119,105,116,104,105,110,32,98,101,103,105,110,45,102,111,114, -45,115,121,110,116,97,120,204,27,83,160,41,8,37,47,42,250,22,208,83,160, -41,8,38,50,42,250,22,208,83,160,41,8,39,53,42,250,22,58,83,160,41, -8,40,56,42,83,160,41,8,41,56,42,250,22,208,83,160,41,8,42,59,42, -250,22,60,83,160,41,8,43,8,30,42,23,21,83,160,41,8,44,8,30,42, -83,160,41,8,45,59,42,83,160,41,8,46,53,42,195,247,193,32,20,96,158, -16,10,2,12,2,17,2,30,2,39,2,19,2,15,2,21,2,23,2,25,2, -32,16,47,18,99,2,41,8,41,37,36,35,16,4,8,40,11,2,81,3,1, -7,101,110,118,51,51,53,54,135,16,4,8,39,11,2,100,3,1,7,101,110, -118,51,51,53,55,136,18,158,93,101,2,0,8,44,37,36,35,8,40,8,39, -16,4,8,43,11,3,1,4,103,51,57,57,137,3,1,7,101,110,118,51,51, -54,51,138,16,4,8,42,11,2,87,3,1,7,101,110,118,51,51,54,52,139, -8,44,18,16,2,95,2,92,8,45,93,8,252,194,8,95,9,8,252,194,8, -2,45,18,101,2,93,8,48,37,36,35,8,40,8,39,16,6,8,47,11,3, -1,4,103,51,57,53,140,3,1,4,103,51,57,54,141,3,1,7,101,110,118, -51,51,55,50,142,2,142,16,6,8,46,11,2,87,64,101,108,101,109,143,3, -1,7,101,110,118,51,51,55,51,144,2,144,18,158,2,100,8,48,18,158,2, -0,8,48,18,158,2,100,8,48,18,158,2,6,8,48,18,158,2,100,8,48, -18,158,2,100,8,48,18,158,110,101,2,0,8,51,37,36,35,8,40,8,39, -16,6,8,50,11,3,1,4,103,51,57,55,145,3,1,4,103,51,57,56,146, -3,1,7,101,110,118,51,51,56,52,147,2,147,16,6,8,49,11,2,87,2, -143,3,1,7,101,110,118,51,51,56,53,148,2,148,158,2,128,8,51,158,2, -130,8,51,158,2,131,8,51,158,64,115,101,116,33,149,8,51,158,70,108,101, -116,45,118,97,108,117,101,115,150,8,51,158,71,108,101,116,42,45,118,97,108, -117,101,115,151,8,51,158,73,108,101,116,114,101,99,45,118,97,108,117,101,115, -152,8,51,158,2,101,8,51,158,71,99,97,115,101,45,108,97,109,98,100,97, -153,8,51,158,62,105,102,154,8,51,158,65,113,117,111,116,101,155,8,51,158, -1,22,108,101,116,114,101,99,45,115,121,110,116,97,120,101,115,43,118,97,108, -117,101,115,156,8,51,158,76,102,108,117,105,100,45,108,101,116,45,115,121,110, -116,97,120,157,8,51,158,1,22,119,105,116,104,45,99,111,110,116,105,110,117, -97,116,105,111,110,45,109,97,114,107,158,8,51,158,65,35,37,97,112,112,159, -8,51,158,65,35,37,116,111,112,160,8,51,158,67,35,37,100,97,116,117,109, -161,8,51,8,51,18,102,2,41,8,53,37,36,35,8,40,8,39,8,50,8, -49,16,4,8,52,11,61,101,162,3,1,7,101,110,118,51,51,56,56,163,18, -158,2,0,8,53,18,16,2,95,2,92,8,54,93,8,252,211,8,95,9,8, -252,211,8,2,45,18,104,2,93,8,57,37,36,35,8,40,8,39,8,50,8, -49,8,52,16,4,8,56,11,3,1,4,103,52,48,55,164,3,1,7,101,110, -118,51,51,57,52,165,16,4,8,55,11,61,118,166,3,1,7,101,110,118,51, -51,57,53,167,18,158,2,100,8,57,18,158,2,6,8,57,18,158,2,100,8, -57,18,158,2,128,8,53,18,16,2,95,2,92,8,58,93,8,252,212,8,95, -9,8,252,212,8,2,45,18,104,2,93,8,61,37,36,35,8,40,8,39,8, -50,8,49,8,52,16,6,8,60,11,3,1,4,103,52,48,53,168,3,1,4, -103,52,48,54,169,3,1,7,101,110,118,51,52,48,55,170,2,170,16,6,8, -59,11,2,97,2,126,3,1,7,101,110,118,51,52,48,56,171,2,171,18,158, -2,100,8,61,18,158,2,131,8,61,18,158,2,100,8,61,18,158,67,114,101, -113,117,105,114,101,172,8,53,18,16,2,95,2,92,8,62,93,8,252,213,8, -95,9,8,252,213,8,2,45,18,104,2,93,8,65,37,36,35,8,40,8,39, -8,50,8,49,8,52,16,4,8,64,11,3,1,4,103,52,48,52,173,3,1, -7,101,110,118,51,52,49,55,174,16,4,8,63,11,2,166,3,1,7,101,110, -118,51,52,49,56,175,18,158,2,100,8,65,18,158,78,114,101,113,117,105,114, -101,45,102,111,114,45,115,121,110,116,97,120,176,8,65,18,158,2,100,8,65, -18,158,1,20,114,101,113,117,105,114,101,45,102,111,114,45,116,101,109,112,108, -97,116,101,177,8,53,18,16,2,95,2,92,8,66,93,8,252,214,8,95,9, -8,252,214,8,2,45,18,104,2,93,8,69,37,36,35,8,40,8,39,8,50, -8,49,8,52,16,4,8,68,11,3,1,4,103,52,48,51,178,3,1,7,101, -110,118,51,52,50,54,179,16,4,8,67,11,2,166,3,1,7,101,110,118,51, -52,50,55,180,18,158,2,100,8,69,18,158,2,172,8,69,18,158,2,100,8, -69,18,158,2,130,8,53,18,16,2,95,2,92,8,70,93,8,252,216,8,95, -9,8,252,216,8,2,45,18,104,2,93,8,73,37,36,35,8,40,8,39,8, -50,8,49,8,52,16,4,8,72,11,3,1,4,103,52,48,48,181,3,1,7, -101,110,118,51,52,52,52,182,16,4,8,71,11,65,111,116,104,101,114,183,3, -1,7,101,110,118,51,52,52,53,184,18,158,2,100,8,73,18,158,2,131,8, -73,18,158,9,8,73,18,158,2,100,8,73,18,158,2,0,8,73,18,16,2, -103,93,158,93,158,66,118,97,108,117,101,115,185,8,73,8,73,8,81,97,8, -80,10,32,11,16,58,73,115,121,110,116,97,120,45,99,97,115,101,42,42,186, -29,187,11,11,2,44,2,187,2,46,2,13,2,77,2,50,2,18,2,13,2, -70,2,13,2,20,2,13,2,54,2,13,2,52,2,13,2,16,2,13,2,55, -2,13,2,56,2,57,2,29,2,13,1,20,101,108,108,105,112,115,105,115,45, -99,111,117,110,116,45,101,114,114,111,114,188,2,187,2,60,2,57,2,33,2, -13,2,62,2,50,2,38,2,13,2,64,2,57,2,65,2,66,2,40,2,13, -2,75,2,50,2,31,2,13,2,71,2,50,2,58,2,50,2,22,2,13,2, -49,2,50,2,24,2,13,2,14,2,13,97,8,79,10,33,11,16,70,75,115, -121,110,116,97,120,45,109,97,112,112,105,110,103,63,189,64,35,37,115,99,190, -2,46,2,13,2,77,2,50,2,18,2,13,2,70,2,13,74,103,101,116,45, -109,97,116,99,104,45,118,97,114,115,191,2,190,2,20,2,13,2,54,2,13, -2,52,2,13,2,16,2,13,72,110,111,45,101,108,108,105,112,115,101,115,63, -192,2,190,2,55,2,13,2,56,2,57,2,29,2,13,72,115,116,120,45,109, -101,109,113,45,112,111,115,193,2,190,1,21,115,121,110,116,97,120,45,109,97, -112,112,105,110,103,45,118,97,108,118,97,114,194,2,190,2,60,2,57,2,33, -2,13,74,109,97,107,101,45,109,97,116,99,104,38,101,110,118,195,2,190,2, -62,2,50,1,20,115,121,110,116,97,120,45,109,97,112,112,105,110,103,45,100, -101,112,116,104,196,2,190,79,109,97,107,101,45,115,121,110,116,97,120,45,109, -97,112,112,105,110,103,197,2,190,2,38,2,13,2,64,2,57,2,65,2,66, -2,40,2,13,2,75,2,50,72,109,97,107,101,45,112,101,120,112,97,110,100, -198,2,190,2,31,2,13,2,71,2,50,2,58,2,50,2,22,2,13,2,49, -2,50,2,24,2,13,2,14,2,13,96,8,78,8,254,1,11,16,0,16,4, -8,77,11,61,120,199,3,1,6,101,110,118,51,56,48,200,16,4,8,76,11, -68,104,101,114,101,45,115,116,120,201,3,1,6,101,110,118,51,56,50,202,16, -4,8,75,11,2,201,2,202,13,16,3,33,2,187,2,45,93,8,252,216,8, -16,6,8,74,11,61,114,203,63,115,114,99,204,3,1,7,101,110,118,51,52, -52,56,205,2,205,95,9,8,252,216,8,2,45,18,158,2,100,8,73,18,158, -2,100,8,73,11,9,93,68,35,37,107,101,114,110,101,108,206,96,2,206,2, -35,2,13,2,48,0}; - EVAL_ONE_SIZED_STR((char *)expr, 7586); +22,60,197,198,27,83,160,41,37,39,45,250,22,208,83,160,41,38,42,45,250, +22,208,83,160,41,39,45,45,250,22,60,83,160,41,40,48,45,248,22,52,203, +248,22,51,203,83,160,41,41,45,45,195,27,28,248,80,158,39,32,195,249,80, +158,40,33,248,80,158,41,34,197,27,248,80,158,42,35,198,91,159,35,11,90, +161,35,32,11,250,80,158,47,39,198,33,11,28,194,27,28,248,22,205,197,196, +201,27,28,248,80,158,47,36,195,248,22,58,248,80,158,48,37,196,11,28,192, +249,80,158,48,40,194,250,22,208,198,200,198,11,11,11,28,192,27,248,22,51, +194,27,248,22,77,195,27,248,22,79,196,249,22,7,248,22,215,27,249,22,60, +198,199,27,83,160,41,42,46,45,250,22,208,83,160,41,43,49,45,249,22,64, +248,22,52,199,248,22,58,248,22,51,200,195,89,162,32,33,57,9,226,11,10, +2,3,27,249,22,208,83,160,41,44,38,45,199,249,80,158,38,38,197,27,250, +22,60,198,200,199,27,83,160,41,45,40,45,250,22,208,83,160,41,46,43,45, +250,22,208,83,160,41,47,46,45,250,22,60,83,160,41,48,49,45,249,22,64, +248,22,79,205,248,22,77,205,248,22,51,203,83,160,41,49,46,45,195,250,22, +252,32,2,11,6,10,10,98,97,100,32,115,121,110,116,97,120,197,87,95,249, +22,3,89,162,32,33,39,9,224,5,4,28,248,80,158,34,41,195,12,251,22, +252,32,2,11,6,40,40,110,111,116,32,97,110,32,105,100,101,110,116,105,102, +105,101,114,32,102,111,114,32,112,114,111,99,101,100,117,114,101,32,97,114,103, +117,109,101,110,116,196,198,194,27,248,80,158,37,42,194,28,192,251,22,252,32, +2,11,6,29,29,100,117,112,108,105,99,97,116,101,32,97,114,103,117,109,101, +110,116,32,105,100,101,110,116,105,102,105,101,114,199,196,12,193,89,162,32,33, +48,73,103,101,110,101,114,97,108,45,112,114,111,116,111,11,226,11,9,1,0, +27,249,22,208,83,160,41,50,38,45,199,27,89,162,32,32,56,2,9,228,5, +4,3,2,6,1,27,28,248,80,158,39,32,194,27,27,248,80,158,41,34,196, +28,248,80,158,41,32,193,249,80,158,42,33,248,80,158,43,34,195,27,248,80, +158,44,35,196,248,22,58,250,22,208,199,196,199,11,28,192,249,80,158,41,40, +194,27,248,80,158,43,35,198,250,22,208,200,195,200,11,11,28,192,27,248,22, +51,194,27,248,22,77,195,27,248,22,79,196,91,159,34,11,90,161,34,32,11, +248,202,27,249,22,60,199,200,27,83,160,41,51,46,45,250,22,208,83,160,41, +52,49,45,250,22,208,83,160,41,53,52,45,249,22,50,248,22,52,202,248,22, +51,202,83,160,41,54,52,45,195,27,248,202,201,249,22,7,195,89,162,32,33, +38,9,224,4,2,248,194,248,22,58,248,195,197,27,28,248,80,158,40,32,195, +249,80,158,41,33,248,80,158,42,34,197,27,248,80,158,43,35,198,250,22,208, +200,195,200,11,28,192,27,248,22,51,194,27,248,22,52,195,251,22,252,32,2, +11,6,82,82,98,97,100,32,115,121,110,116,97,120,32,40,110,111,116,32,97, +110,32,105,100,101,110,116,105,102,105,101,114,32,102,111,114,32,112,114,111,99, +101,100,117,114,101,32,110,97,109,101,44,32,97,110,100,32,110,111,116,32,97, +32,110,101,115,116,101,100,32,112,114,111,99,101,100,117,114,101,32,102,111,114, +109,41,204,197,250,22,252,32,2,11,6,10,10,98,97,100,32,115,121,110,116, +97,120,197,27,28,248,80,158,39,32,195,249,80,158,40,33,248,80,158,41,34, +197,27,248,80,158,42,35,198,250,22,208,200,195,200,11,28,192,27,248,22,51, +194,27,248,22,52,195,28,248,80,158,41,41,194,249,22,7,195,248,200,204,247, +195,247,193,87,95,28,248,80,158,42,36,195,12,250,22,252,32,2,11,6,50, +50,98,97,100,32,115,121,110,116,97,120,32,40,105,108,108,101,103,97,108,32, +117,115,101,32,111,102,32,96,46,39,32,102,111,114,32,112,114,111,99,101,100, +117,114,101,32,98,111,100,121,41,202,28,248,80,158,42,43,195,250,22,252,32, +2,11,6,46,46,98,97,100,32,115,121,110,116,97,120,32,40,110,111,32,101, +120,112,114,101,115,115,105,111,110,115,32,102,111,114,32,112,114,111,99,101,100, +117,114,101,32,98,111,100,121,41,202,12,27,249,22,208,83,160,41,55,44,45, +203,27,249,22,208,83,160,41,56,45,45,196,27,249,22,208,83,160,41,57,46, +45,248,199,200,249,80,158,46,38,204,27,250,22,60,200,198,199,27,83,160,41, +58,48,45,250,22,208,83,160,41,59,51,45,250,22,208,83,160,41,8,28,54, +45,250,22,58,248,22,51,203,250,22,208,83,160,41,8,29,8,28,45,248,22, +58,248,22,79,23,15,83,160,41,8,30,8,28,45,248,22,77,203,83,160,41, +8,31,54,45,195,250,22,252,32,2,11,6,10,10,98,97,100,32,115,121,110, +116,97,120,196,27,28,248,80,158,38,32,195,249,80,158,39,33,248,80,158,40, +34,197,27,248,80,158,41,35,198,28,248,80,158,41,32,193,27,28,248,22,205, +194,193,198,249,80,158,43,33,248,80,158,44,34,196,27,248,80,158,45,35,197, +250,22,208,198,195,198,11,11,28,192,27,248,22,51,194,27,248,22,77,195,27, +248,22,79,196,28,248,80,158,41,32,194,247,196,251,22,252,32,2,11,6,10, +10,98,97,100,32,115,121,110,116,97,120,202,197,247,193,27,28,248,80,158,38, +32,195,249,80,158,39,33,248,80,158,40,34,197,27,248,80,158,41,35,198,28, +248,80,158,41,32,193,27,28,248,22,205,194,193,198,249,80,158,43,33,248,80, +158,44,34,196,27,248,80,158,45,35,197,250,22,208,198,195,198,11,11,28,192, +27,248,22,51,194,27,248,22,77,195,27,248,22,79,196,28,248,80,158,41,41, +194,250,22,252,32,2,11,27,249,22,208,83,160,41,8,32,46,45,204,27,28, +248,80,158,46,32,194,249,80,158,47,33,248,80,158,48,34,196,27,248,80,158, +49,35,197,28,248,80,158,49,32,193,249,80,158,50,33,248,80,158,51,34,195, +27,248,80,158,52,35,196,28,248,80,158,52,36,193,248,80,158,52,37,193,11, +11,11,28,192,27,248,22,51,194,27,248,22,77,195,27,248,22,79,196,6,50, +50,98,97,100,32,115,121,110,116,97,120,32,40,109,117,108,116,105,112,108,101, +32,101,120,112,114,101,115,115,105,111,110,115,32,97,102,116,101,114,32,105,100, +101,110,116,105,102,105,101,114,41,27,28,248,80,158,47,32,195,249,80,158,48, +33,248,80,158,49,34,197,27,248,80,158,50,35,198,28,248,80,158,50,32,193, +27,248,80,158,51,34,194,28,192,249,80,158,52,40,194,248,80,158,53,44,248, +80,158,54,35,197,11,11,11,28,192,27,248,22,51,194,27,248,22,52,195,6, +46,46,98,97,100,32,115,121,110,116,97,120,32,40,122,101,114,111,32,101,120, +112,114,101,115,115,105,111,110,115,32,97,102,116,101,114,32,105,100,101,110,116, +105,102,105,101,114,41,27,28,248,80,158,48,32,196,249,80,158,49,33,248,80, +158,50,34,198,27,248,80,158,51,35,199,28,248,80,158,51,32,193,27,28,248, +22,205,194,193,199,249,80,158,53,33,248,80,158,54,34,196,27,248,80,158,55, +35,197,250,22,208,198,195,198,11,11,28,192,27,248,22,51,194,27,248,22,77, +195,27,248,22,79,196,6,31,31,98,97,100,32,115,121,110,116,97,120,32,40, +105,108,108,101,103,97,108,32,117,115,101,32,111,102,32,96,46,39,41,250,22, +252,32,2,11,6,10,10,98,97,100,32,115,121,110,116,97,120,198,201,247,196, +247,193,27,28,248,80,158,37,32,195,249,80,158,38,33,248,80,158,39,34,197, +27,248,80,158,40,35,198,28,248,80,158,40,32,193,249,80,158,41,33,248,80, +158,42,34,195,27,248,80,158,43,35,196,28,248,80,158,43,32,193,27,248,80, +158,44,34,194,28,192,249,80,158,45,40,194,248,80,158,46,44,248,80,158,47, +35,197,11,11,11,11,28,192,27,248,22,51,194,27,248,22,77,195,27,248,22, +79,196,28,248,80,158,40,41,194,27,249,22,208,83,160,41,8,33,42,45,201, +249,80,158,42,38,203,27,250,22,60,199,200,198,27,83,160,41,8,34,44,45, +250,22,208,83,160,41,8,35,47,45,250,22,208,83,160,41,8,36,50,45,250, +22,58,248,22,79,203,250,22,208,83,160,41,8,37,56,45,248,22,58,248,22, +77,23,15,83,160,41,8,38,56,45,248,22,51,203,83,160,41,8,39,50,45, +195,247,196,247,193,250,22,7,248,196,83,160,41,8,40,37,45,248,196,83,160, +41,8,41,37,45,248,196,83,160,41,8,42,37,45,37,20,97,158,16,13,30, +12,65,35,37,115,116,120,13,69,115,116,120,45,112,97,105,114,63,14,11,30, +15,2,13,67,99,111,110,115,47,35,102,16,1,30,17,2,13,67,115,116,120, +45,99,97,114,18,5,30,19,2,13,67,115,116,120,45,99,100,114,20,6,30, +21,2,13,69,115,116,120,45,108,105,115,116,63,22,8,30,23,2,13,69,115, +116,120,45,62,108,105,115,116,24,4,30,25,68,35,37,115,116,120,108,111,99, +26,68,114,101,108,111,99,97,116,101,27,1,30,28,2,13,74,115,112,108,105, +116,45,115,116,120,45,108,105,115,116,29,3,30,30,2,13,69,97,112,112,101, +110,100,47,35,102,31,0,30,32,2,13,71,105,100,101,110,116,105,102,105,101, +114,63,33,2,30,34,76,35,37,115,116,120,99,97,115,101,45,115,99,104,101, +109,101,35,1,26,99,104,101,99,107,45,100,117,112,108,105,99,97,116,101,45, +105,100,101,110,116,105,102,105,101,114,36,0,30,37,2,13,69,115,116,120,45, +110,117,108,108,63,38,10,30,39,2,13,71,115,116,120,45,110,117,108,108,47, +35,102,40,9,16,43,18,99,64,104,101,114,101,41,39,97,37,10,32,11,16, +8,2,3,2,2,2,4,2,2,2,5,2,2,2,6,2,2,97,36,10,33, +11,16,86,70,108,101,116,45,115,121,110,116,97,120,42,2,35,66,115,121,110, +116,97,120,43,69,35,37,115,116,120,99,97,115,101,44,63,97,110,100,45,71, +35,37,113,113,45,97,110,100,45,111,114,46,71,115,116,120,45,118,101,99,116, +111,114,63,47,2,13,62,111,114,48,2,46,72,115,121,110,116,97,120,45,99, +97,115,101,42,49,2,26,2,14,2,13,2,31,2,13,77,117,110,115,121,110, +116,97,120,45,115,112,108,105,99,105,110,103,50,67,35,37,113,113,115,116,120, +51,75,108,101,116,114,101,99,45,115,121,110,116,97,120,101,115,52,2,35,71, +115,121,110,116,97,120,45,99,97,115,101,53,2,26,2,18,2,13,70,115,116, +120,45,114,111,116,97,116,101,54,2,13,74,115,116,120,45,118,101,99,116,111, +114,45,114,101,102,55,2,13,2,16,2,13,73,108,101,116,114,101,99,45,115, +121,110,116,97,120,56,2,35,71,115,116,120,45,114,111,116,97,116,101,42,57, +2,13,73,115,116,120,45,99,104,101,99,107,47,101,115,99,58,2,13,72,108, +101,116,45,115,121,110,116,97,120,101,115,59,2,35,75,113,117,97,115,105,115, +121,110,116,97,120,47,108,111,99,60,2,51,64,119,104,101,110,61,74,35,37, +100,101,102,105,110,101,45,101,116,45,97,108,62,64,99,111,110,100,63,66,35, +37,99,111,110,100,64,72,115,121,110,116,97,120,45,114,117,108,101,115,65,2, +35,2,33,2,13,74,45,100,101,102,105,110,101,45,115,121,110,116,97,120,66, +2,62,2,20,2,13,68,117,110,115,121,110,116,97,120,67,2,51,75,115,121, +110,116,97,120,45,105,100,45,114,117,108,101,115,68,2,35,70,113,117,97,115, +105,113,117,111,116,101,69,2,46,73,100,101,102,105,110,101,45,115,116,114,117, +99,116,70,2,62,2,40,2,13,66,117,110,108,101,115,115,71,2,62,70,115, +121,110,116,97,120,47,108,111,99,72,2,26,66,108,101,116,47,101,99,73,2, +62,71,119,105,116,104,45,115,121,110,116,97,120,74,70,35,37,119,105,116,104, +45,115,116,120,75,71,113,117,97,115,105,115,121,110,116,97,120,76,2,51,2, +36,2,35,2,22,2,13,2,38,2,13,2,24,2,13,2,29,2,13,67,45, +100,101,102,105,110,101,77,2,62,1,20,103,101,110,101,114,97,116,101,45,116, +101,109,112,111,114,97,114,105,101,115,78,2,75,96,35,8,254,1,11,16,0, +16,4,34,11,77,100,101,102,105,110,101,45,118,97,108,117,101,115,45,115,116, +120,79,3,1,7,101,110,118,51,49,54,53,80,16,4,33,11,63,115,116,120, +81,3,1,7,101,110,118,51,49,54,54,82,18,102,2,41,43,37,36,35,34, +33,16,8,42,11,3,1,4,103,51,53,49,83,3,1,4,103,51,53,50,84, +3,1,4,103,51,53,51,85,3,1,7,101,110,118,51,49,56,49,86,2,86, +2,86,16,8,41,11,61,95,87,65,112,114,111,116,111,88,64,98,111,100,121, +89,3,1,7,101,110,118,51,49,56,50,90,2,90,2,90,16,6,40,11,2, +10,2,11,3,1,7,101,110,118,51,49,56,55,91,2,91,18,16,2,95,66, +115,114,99,116,97,103,92,44,93,8,252,134,8,95,9,8,252,134,8,2,44, +18,104,64,100,101,115,116,93,48,37,36,35,34,33,42,41,16,6,47,11,2, +10,2,11,2,91,2,91,16,6,46,11,3,1,4,103,51,54,54,94,3,1, +4,103,51,54,55,95,3,1,7,101,110,118,51,49,57,52,96,2,96,16,6, +45,11,62,105,100,97,63,97,114,103,98,3,1,7,101,110,118,51,49,57,53, +99,2,99,18,158,2,41,48,18,16,2,95,2,92,49,93,8,252,140,8,95, +9,8,252,140,8,2,44,18,158,2,93,48,18,158,63,99,116,120,100,48,18, +158,66,108,97,109,98,100,97,101,48,18,158,2,100,48,18,16,2,95,2,92, +50,93,8,252,141,8,95,9,8,252,141,8,2,44,18,104,2,93,53,37,36, +35,34,33,42,41,47,16,8,52,11,3,1,4,103,51,54,51,102,3,1,4, +103,51,54,52,103,3,1,4,103,51,54,53,104,3,1,7,101,110,118,51,50, +50,49,105,2,105,2,105,16,8,51,11,2,97,2,98,64,114,101,115,116,106, +3,1,7,101,110,118,51,50,50,50,107,2,107,2,107,18,158,2,41,53,18, +16,2,95,2,92,54,93,8,252,147,8,95,9,8,252,147,8,2,44,18,158, +2,93,53,18,158,2,100,53,18,158,2,101,53,18,158,2,100,53,18,158,2, +41,43,18,16,2,95,2,92,55,93,8,252,159,8,95,9,8,252,159,8,2, +44,18,104,2,93,58,37,36,35,34,33,42,41,40,16,8,57,11,3,1,4, +103,51,55,54,108,3,1,4,103,51,55,55,109,3,1,4,103,51,55,56,110, +3,1,7,101,110,118,51,50,53,52,111,2,111,2,111,16,8,56,11,69,115, +111,109,101,116,104,105,110,103,112,64,109,111,114,101,113,2,106,3,1,7,101, +110,118,51,50,53,53,114,2,114,2,114,18,158,2,100,58,18,158,2,100,58, +18,102,2,41,8,28,37,36,35,34,33,42,41,16,6,59,11,2,97,66,109, +107,45,114,104,115,115,3,1,7,101,110,118,51,49,56,54,116,2,116,18,158, +2,41,8,28,18,158,2,41,8,28,18,16,2,95,2,92,8,29,93,8,252, +178,8,95,9,8,252,178,8,2,44,18,158,2,93,8,28,18,158,2,100,8, +28,18,158,2,100,8,28,18,158,2,100,8,28,18,158,2,100,8,28,18,101, +2,41,8,32,37,36,35,34,33,16,8,8,31,11,3,1,4,103,51,53,55, +117,3,1,4,103,51,53,56,118,3,1,4,103,51,53,57,119,3,1,7,101, +110,118,51,51,50,57,120,2,120,2,120,16,8,8,30,11,2,87,2,97,2, +106,3,1,7,101,110,118,51,51,51,48,121,2,121,2,121,18,101,2,41,8, +35,37,36,35,34,33,16,8,8,34,11,3,1,4,103,51,54,48,122,3,1, +4,103,51,54,49,123,3,1,4,103,51,54,50,124,3,1,7,101,110,118,51, +51,54,56,125,2,125,2,125,16,8,8,33,11,2,87,2,97,64,101,120,112, +114,126,3,1,7,101,110,118,51,51,54,57,127,2,127,2,127,18,16,2,95, +2,92,8,36,93,8,252,202,8,95,9,8,252,202,8,2,44,18,158,2,93, +8,35,18,158,2,100,8,35,18,158,2,100,8,35,18,158,2,100,8,35,18, +158,2,100,8,35,18,98,73,100,101,102,105,110,101,45,118,97,108,117,101,115, +128,8,38,37,36,35,16,4,8,37,11,2,7,3,1,7,101,110,118,51,49, +54,52,129,18,158,75,100,101,102,105,110,101,45,115,121,110,116,97,120,101,115, +130,8,38,18,158,1,24,100,101,102,105,110,101,45,118,97,108,117,101,115,45, +102,111,114,45,115,121,110,116,97,120,131,8,38,11,16,5,93,2,6,89,162, +32,33,8,35,9,223,0,27,247,22,252,72,3,87,94,28,249,22,70,194,21, +95,66,109,111,100,117,108,101,132,72,109,111,100,117,108,101,45,98,101,103,105, +110,133,69,116,111,112,45,108,101,118,101,108,134,12,250,22,252,32,2,11,6, +51,51,97,108,108,111,119,101,100,32,111,110,108,121,32,97,116,32,116,104,101, +32,116,111,112,45,108,101,118,101,108,32,111,114,32,97,32,109,111,100,117,108, +101,32,116,111,112,45,108,101,118,101,108,197,27,249,22,208,83,160,41,32,36, +42,197,27,28,248,80,158,36,32,194,27,248,80,158,37,33,195,28,192,249,80, +158,38,34,194,248,80,158,39,35,248,80,158,40,36,198,11,11,28,192,83,160, +41,33,35,42,27,89,162,32,32,52,2,9,225,4,5,2,27,28,248,80,158, +36,32,194,249,80,158,37,37,248,80,158,38,33,196,27,248,80,158,39,36,197, +28,248,80,158,39,38,193,248,80,158,39,39,193,11,11,28,192,27,248,22,51, +194,27,248,22,52,195,249,80,158,39,40,198,27,83,160,41,34,40,42,250,22, +208,83,160,41,35,43,42,250,22,208,83,160,41,36,46,42,249,22,50,83,160, +41,37,48,42,249,22,2,89,162,33,33,41,9,223,18,250,22,208,83,160,41, +38,35,42,249,22,58,83,160,41,39,37,42,248,22,51,199,83,160,41,40,35, +42,205,83,160,41,41,46,42,195,250,22,252,32,2,11,6,10,10,98,97,100, +32,115,121,110,116,97,120,196,27,28,248,80,158,38,32,196,249,80,158,39,37, +248,80,158,40,33,198,27,248,80,158,41,36,199,28,248,80,158,41,32,193,27, +248,80,158,42,33,194,28,192,249,80,158,43,34,194,248,80,158,44,35,248,80, +158,45,36,197,11,11,11,28,192,27,248,22,51,194,27,248,22,52,195,28,249, +22,252,5,2,200,2,133,247,195,27,250,22,252,19,2,196,202,248,22,215,83, +160,41,42,44,42,27,249,22,208,83,160,41,43,43,42,195,27,27,22,223,28, +248,80,158,44,32,195,28,27,248,80,158,45,33,196,28,248,80,158,45,41,193, +28,249,195,194,83,160,41,44,46,42,9,11,11,27,248,80,158,45,36,196,28, +248,80,158,45,38,193,248,80,158,45,39,193,11,11,11,28,192,27,83,160,41, +45,43,42,250,22,208,83,160,41,46,46,42,250,22,208,83,160,41,47,49,42, +249,22,50,83,160,41,48,51,42,201,83,160,41,49,49,42,195,27,27,22,223, +28,248,80,158,45,32,196,28,27,248,80,158,46,33,197,28,248,80,158,46,41, +193,28,249,195,194,83,160,41,50,47,42,9,11,11,27,248,80,158,46,36,197, +28,248,80,158,46,32,193,27,27,248,80,158,48,33,195,28,248,80,158,48,38, +193,248,22,58,248,80,158,49,39,194,11,28,192,249,80,158,48,34,194,27,248, +80,158,50,36,197,28,248,80,158,50,32,193,27,248,80,158,51,33,194,28,192, +249,80,158,52,34,194,248,80,158,53,35,248,80,158,54,36,197,11,11,11,11, +11,11,28,192,27,248,22,51,194,27,248,22,52,195,27,249,22,60,195,196,27, +83,160,41,51,47,42,250,22,208,83,160,41,52,50,42,250,22,208,83,160,41, +53,53,42,250,22,58,83,160,41,54,56,42,248,22,52,203,248,22,51,203,83, +160,41,55,53,42,195,27,27,22,223,28,248,80,158,46,32,197,28,27,248,80, +158,47,33,198,28,248,80,158,47,41,193,28,249,195,194,83,160,41,56,48,42, +9,11,11,27,248,80,158,47,36,198,28,248,80,158,47,38,193,248,80,158,47, +39,193,11,11,11,28,192,27,83,160,41,57,45,42,250,22,208,83,160,41,58, +48,42,250,22,208,83,160,41,59,51,42,249,22,50,83,160,41,8,28,53,42, +201,83,160,41,8,29,51,42,195,27,27,22,223,28,248,80,158,47,32,198,28, +27,248,80,158,48,33,199,28,248,80,158,48,41,193,28,249,195,194,83,160,41, +8,30,49,42,9,11,11,27,248,80,158,48,36,199,28,248,80,158,48,38,193, +248,80,158,48,39,193,11,11,11,28,192,27,83,160,41,8,31,46,42,250,22, +208,83,160,41,8,32,49,42,250,22,208,83,160,41,8,33,52,42,249,22,50, +83,160,41,8,34,54,42,201,83,160,41,8,35,52,42,195,27,27,22,223,28, +248,80,158,48,32,199,28,27,248,80,158,49,33,200,28,248,80,158,49,41,193, +28,249,195,194,83,160,41,8,36,50,42,9,11,11,27,248,80,158,49,36,200, +28,248,80,158,49,32,193,27,27,248,80,158,51,33,195,28,248,80,158,51,38, +193,248,22,58,248,80,158,52,39,194,11,28,192,249,80,158,51,34,194,27,248, +80,158,53,36,197,28,248,80,158,53,32,193,27,248,80,158,54,33,194,28,192, +249,80,158,55,34,194,248,80,158,56,35,248,80,158,57,36,197,11,11,11,11, +11,11,28,192,27,248,22,51,194,27,248,22,52,195,250,22,252,32,2,11,6, +54,54,115,121,110,116,97,120,32,100,101,102,105,110,105,116,105,111,110,115,32, +110,111,116,32,97,108,108,111,119,101,100,32,119,105,116,104,105,110,32,98,101, +103,105,110,45,102,111,114,45,115,121,110,116,97,120,204,27,83,160,41,8,37, +47,42,250,22,208,83,160,41,8,38,50,42,250,22,208,83,160,41,8,39,53, +42,250,22,58,83,160,41,8,40,56,42,83,160,41,8,41,56,42,250,22,208, +83,160,41,8,42,59,42,250,22,60,83,160,41,8,43,8,30,42,23,21,83, +160,41,8,44,8,30,42,83,160,41,8,45,59,42,83,160,41,8,46,53,42, +195,247,193,32,20,97,158,16,10,2,12,2,17,2,30,2,39,2,19,2,15, +2,21,2,23,2,25,2,32,16,47,18,99,2,41,8,41,37,36,35,16,4, +8,40,11,2,81,3,1,7,101,110,118,51,51,56,54,135,16,4,8,39,11, +2,100,3,1,7,101,110,118,51,51,56,55,136,18,158,93,101,2,0,8,44, +37,36,35,8,40,8,39,16,4,8,43,11,3,1,4,103,52,48,53,137,3, +1,7,101,110,118,51,51,57,51,138,16,4,8,42,11,2,87,3,1,7,101, +110,118,51,51,57,52,139,8,44,18,16,2,95,2,92,8,45,93,8,252,216, +8,95,9,8,252,216,8,2,44,18,101,2,93,8,48,37,36,35,8,40,8, +39,16,6,8,47,11,3,1,4,103,52,48,49,140,3,1,4,103,52,48,50, +141,3,1,7,101,110,118,51,52,48,50,142,2,142,16,6,8,46,11,2,87, +64,101,108,101,109,143,3,1,7,101,110,118,51,52,48,51,144,2,144,18,158, +2,100,8,48,18,158,2,0,8,48,18,158,2,100,8,48,18,158,2,6,8, +48,18,158,2,100,8,48,18,158,2,100,8,48,18,158,110,101,2,0,8,51, +37,36,35,8,40,8,39,16,6,8,50,11,3,1,4,103,52,48,51,145,3, +1,4,103,52,48,52,146,3,1,7,101,110,118,51,52,49,52,147,2,147,16, +6,8,49,11,2,87,2,143,3,1,7,101,110,118,51,52,49,53,148,2,148, +158,2,128,8,51,158,2,130,8,51,158,2,131,8,51,158,64,115,101,116,33, +149,8,51,158,70,108,101,116,45,118,97,108,117,101,115,150,8,51,158,71,108, +101,116,42,45,118,97,108,117,101,115,151,8,51,158,73,108,101,116,114,101,99, +45,118,97,108,117,101,115,152,8,51,158,2,101,8,51,158,71,99,97,115,101, +45,108,97,109,98,100,97,153,8,51,158,62,105,102,154,8,51,158,65,113,117, +111,116,101,155,8,51,158,1,22,108,101,116,114,101,99,45,115,121,110,116,97, +120,101,115,43,118,97,108,117,101,115,156,8,51,158,76,102,108,117,105,100,45, +108,101,116,45,115,121,110,116,97,120,157,8,51,158,1,22,119,105,116,104,45, +99,111,110,116,105,110,117,97,116,105,111,110,45,109,97,114,107,158,8,51,158, +65,35,37,97,112,112,159,8,51,158,65,35,37,116,111,112,160,8,51,158,67, +35,37,100,97,116,117,109,161,8,51,8,51,18,102,2,41,8,53,37,36,35, +8,40,8,39,8,50,8,49,16,4,8,52,11,61,101,162,3,1,7,101,110, +118,51,52,49,56,163,18,158,2,0,8,53,18,16,2,95,2,92,8,54,93, +8,252,233,8,95,9,8,252,233,8,2,44,18,104,2,93,8,57,37,36,35, +8,40,8,39,8,50,8,49,8,52,16,4,8,56,11,3,1,4,103,52,49, +51,164,3,1,7,101,110,118,51,52,50,52,165,16,4,8,55,11,61,118,166, +3,1,7,101,110,118,51,52,50,53,167,18,158,2,100,8,57,18,158,2,6, +8,57,18,158,2,100,8,57,18,158,2,128,8,53,18,16,2,95,2,92,8, +58,93,8,252,234,8,95,9,8,252,234,8,2,44,18,104,2,93,8,61,37, +36,35,8,40,8,39,8,50,8,49,8,52,16,6,8,60,11,3,1,4,103, +52,49,49,168,3,1,4,103,52,49,50,169,3,1,7,101,110,118,51,52,51, +55,170,2,170,16,6,8,59,11,2,97,2,126,3,1,7,101,110,118,51,52, +51,56,171,2,171,18,158,2,100,8,61,18,158,2,131,8,61,18,158,2,100, +8,61,18,158,67,114,101,113,117,105,114,101,172,8,53,18,16,2,95,2,92, +8,62,93,8,252,235,8,95,9,8,252,235,8,2,44,18,104,2,93,8,65, +37,36,35,8,40,8,39,8,50,8,49,8,52,16,4,8,64,11,3,1,4, +103,52,49,48,173,3,1,7,101,110,118,51,52,52,55,174,16,4,8,63,11, +2,166,3,1,7,101,110,118,51,52,52,56,175,18,158,2,100,8,65,18,158, +78,114,101,113,117,105,114,101,45,102,111,114,45,115,121,110,116,97,120,176,8, +65,18,158,2,100,8,65,18,158,1,20,114,101,113,117,105,114,101,45,102,111, +114,45,116,101,109,112,108,97,116,101,177,8,53,18,16,2,95,2,92,8,66, +93,8,252,236,8,95,9,8,252,236,8,2,44,18,104,2,93,8,69,37,36, +35,8,40,8,39,8,50,8,49,8,52,16,4,8,68,11,3,1,4,103,52, +48,57,178,3,1,7,101,110,118,51,52,53,54,179,16,4,8,67,11,2,166, +3,1,7,101,110,118,51,52,53,55,180,18,158,2,100,8,69,18,158,2,172, +8,69,18,158,2,100,8,69,18,158,2,130,8,53,18,16,2,95,2,92,8, +70,93,8,252,238,8,95,9,8,252,238,8,2,44,18,104,2,93,8,73,37, +36,35,8,40,8,39,8,50,8,49,8,52,16,4,8,72,11,3,1,4,103, +52,48,54,181,3,1,7,101,110,118,51,52,55,52,182,16,4,8,71,11,65, +111,116,104,101,114,183,3,1,7,101,110,118,51,52,55,53,184,18,158,2,100, +8,73,18,158,2,131,8,73,18,158,9,8,73,18,158,2,100,8,73,18,158, +2,0,8,73,18,16,2,103,93,158,93,158,66,118,97,108,117,101,115,185,8, +73,8,73,8,81,97,8,80,10,32,11,16,58,2,43,29,186,11,11,2,45, +2,46,2,47,2,13,2,48,2,46,2,18,2,13,2,31,2,13,2,63,2, +64,2,20,2,13,2,54,2,13,2,55,2,13,2,16,2,13,2,77,2,62, +2,57,2,13,2,58,2,13,1,20,101,108,108,105,112,115,105,115,45,99,111, +117,110,116,45,101,114,114,111,114,187,2,186,2,61,2,62,2,29,2,13,2, +33,2,13,2,14,2,13,2,38,2,13,2,69,2,46,2,70,2,62,2,40, +2,13,2,71,2,62,2,73,2,62,73,115,121,110,116,97,120,45,99,97,115, +101,42,42,188,2,186,2,66,2,62,2,22,2,13,2,24,2,13,97,8,79, +10,33,11,16,70,2,45,2,46,2,47,2,13,2,48,2,46,2,18,2,13, +2,31,2,13,2,63,2,64,2,20,2,13,2,54,2,13,2,55,2,13,2, +16,2,13,2,77,2,62,2,57,2,13,2,58,2,13,1,20,115,121,110,116, +97,120,45,109,97,112,112,105,110,103,45,100,101,112,116,104,189,64,35,37,115, +99,190,72,110,111,45,101,108,108,105,112,115,101,115,63,191,2,190,2,61,2, +62,2,29,2,13,2,33,2,13,2,14,2,13,2,38,2,13,75,115,121,110, +116,97,120,45,109,97,112,112,105,110,103,63,192,2,190,2,69,2,46,2,70, +2,62,2,40,2,13,2,71,2,62,74,103,101,116,45,109,97,116,99,104,45, +118,97,114,115,193,2,190,72,109,97,107,101,45,112,101,120,112,97,110,100,194, +2,190,2,73,2,62,1,21,115,121,110,116,97,120,45,109,97,112,112,105,110, +103,45,118,97,108,118,97,114,195,2,190,2,66,2,62,2,22,2,13,74,109, +97,107,101,45,109,97,116,99,104,38,101,110,118,196,2,190,2,24,2,13,72, +115,116,120,45,109,101,109,113,45,112,111,115,197,2,190,79,109,97,107,101,45, +115,121,110,116,97,120,45,109,97,112,112,105,110,103,198,2,190,96,8,78,8, +254,1,11,16,0,16,4,8,77,11,61,120,199,3,1,6,101,110,118,51,56, +48,200,16,4,8,76,11,68,104,101,114,101,45,115,116,120,201,3,1,6,101, +110,118,51,56,50,202,16,4,8,75,11,2,201,2,202,13,16,3,33,2,186, +2,44,93,8,252,238,8,16,6,8,74,11,61,114,203,63,115,114,99,204,3, +1,7,101,110,118,51,52,55,56,205,2,205,95,9,8,252,238,8,2,44,18, +158,2,100,8,73,18,158,2,100,8,73,11,9,93,68,35,37,107,101,114,110, +101,108,206,96,2,206,2,35,2,13,2,51,0}; + EVAL_ONE_SIZED_STR((char *)expr, 7593); } { - static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,48,46,51,252,197,1,252,111,87,159,32,20,96,158,16,1, -20,23,65,98,101,103,105,110,0,16,0,83,158,39,20,93,114,73,35,37,109, + static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,49,46,52,252,211,1,252,219,90,159,32,20,97,158,16,1, +20,23,65,98,101,103,105,110,0,16,0,83,158,39,20,94,114,73,35,37,109, 111,114,101,45,115,99,104,101,109,101,1,29,2,11,11,10,10,10,46,80,158, -32,32,20,96,158,16,24,30,3,2,2,74,115,116,114,117,99,116,58,112,114, +32,32,20,97,158,16,24,30,3,2,2,74,115,116,114,117,99,116,58,112,114, 111,109,105,115,101,4,254,1,30,5,2,2,72,109,97,107,101,45,112,114,111, 109,105,115,101,6,254,1,30,7,2,2,68,112,114,111,109,105,115,101,63,8, 254,1,30,9,2,2,69,112,114,111,109,105,115,101,45,112,10,254,1,30,11, @@ -2331,1041 +2330,1083 @@ 99,107,45,102,111,114,45,98,114,101,97,107,51,254,1,16,0,11,11,16,14, 2,41,2,39,2,31,2,33,2,29,2,37,2,27,2,6,2,10,2,43,2, 12,2,35,2,25,2,4,46,11,16,18,2,49,2,23,2,45,2,16,2,14, -2,8,64,99,97,115,101,52,69,102,108,117,105,100,45,108,101,116,53,65,100, -101,108,97,121,54,62,100,111,55,78,112,97,114,97,109,101,116,101,114,105,122, -101,45,98,114,101,97,107,56,70,108,101,116,45,115,116,114,117,99,116,57,74, -119,105,116,104,45,104,97,110,100,108,101,114,115,42,58,71,115,101,116,33,45, -118,97,108,117,101,115,59,64,116,105,109,101,60,72,112,97,114,97,109,101,116, -101,114,105,122,101,61,66,108,101,116,47,99,99,62,73,119,105,116,104,45,104, -97,110,100,108,101,114,115,63,16,18,11,11,11,11,11,11,11,11,11,11,11, +2,8,70,108,101,116,45,115,116,114,117,99,116,52,74,119,105,116,104,45,104, +97,110,100,108,101,114,115,42,53,72,112,97,114,97,109,101,116,101,114,105,122, +101,54,71,115,101,116,33,45,118,97,108,117,101,115,55,64,116,105,109,101,56, +64,99,97,115,101,57,65,100,101,108,97,121,58,73,119,105,116,104,45,104,97, +110,100,108,101,114,115,59,69,102,108,117,105,100,45,108,101,116,60,66,108,101, +116,47,99,99,61,62,100,111,62,78,112,97,114,97,109,101,116,101,114,105,122, +101,45,98,114,101,97,107,63,16,18,11,11,11,11,11,11,11,11,11,11,11, 11,11,11,11,11,11,11,16,18,2,49,2,23,2,45,2,16,2,14,2,8, 2,52,2,53,2,54,2,55,2,56,2,57,2,58,2,59,2,60,2,61,2, -62,2,63,38,50,105,16,5,93,2,52,89,162,32,33,8,28,9,223,0,27, -249,22,208,83,160,41,32,35,43,196,27,28,248,80,158,35,32,194,249,80,158, -36,33,248,80,158,37,34,196,27,248,80,158,38,35,197,28,248,80,158,38,32, -193,27,248,80,158,39,34,194,28,192,249,80,158,40,36,194,248,80,158,41,37, -248,80,158,42,35,197,11,11,11,28,192,27,248,22,51,194,27,248,22,52,195, -27,83,160,41,33,37,43,250,22,208,83,160,41,34,40,43,250,22,208,83,160, -41,35,43,43,250,22,60,83,160,41,36,46,43,202,83,160,41,37,46,43,83, -160,41,38,43,43,195,27,28,248,80,158,36,32,195,249,80,158,37,33,248,80, -158,38,34,197,27,248,80,158,39,35,198,28,248,80,158,39,32,193,249,80,158, -40,33,248,80,158,41,34,195,27,248,80,158,42,35,196,28,248,80,158,42,32, -193,27,27,248,80,158,44,34,195,28,248,80,158,44,32,193,28,27,248,80,158, -45,34,194,28,248,80,158,45,38,193,28,249,22,222,194,83,160,41,39,46,43, -9,11,11,27,248,80,158,45,35,194,28,248,80,158,45,32,193,249,80,158,46, -33,248,80,158,47,34,195,27,248,80,158,48,35,196,28,248,80,158,48,39,193, -248,80,158,48,40,193,11,11,11,11,28,192,249,80,158,44,36,194,248,80,158, -45,37,248,80,158,46,35,197,11,11,11,11,28,192,27,248,22,51,194,27,248, -22,77,195,27,248,22,86,196,27,248,22,87,197,249,80,158,41,41,202,27,250, -22,60,199,200,198,27,83,160,41,40,43,43,250,22,208,83,160,41,41,46,43, -250,22,208,83,160,41,42,49,43,251,22,60,83,160,41,43,53,43,248,22,77, -204,248,22,51,204,248,22,79,204,83,160,41,44,49,43,195,27,28,248,80,158, -37,32,196,249,80,158,38,33,248,80,158,39,34,198,27,248,80,158,40,35,199, -28,248,80,158,40,32,193,249,80,158,41,33,248,80,158,42,34,195,27,248,80, -158,43,35,196,28,248,80,158,43,32,193,27,27,248,80,158,45,34,195,28,248, -80,158,45,32,193,27,27,248,80,158,47,34,195,28,248,80,158,47,39,193,248, -22,58,248,80,158,48,40,194,11,28,192,249,80,158,47,36,194,27,248,80,158, -49,35,197,28,248,80,158,49,32,193,249,80,158,50,33,248,80,158,51,34,195, -27,248,80,158,52,35,196,28,248,80,158,52,39,193,248,80,158,52,40,193,11, -11,11,11,28,192,249,80,158,45,36,194,248,80,158,46,37,248,80,158,47,35, -197,11,11,11,11,28,192,27,248,22,51,194,27,248,22,77,195,27,248,22,86, -196,27,248,22,89,197,27,248,22,88,198,249,80,158,43,41,204,27,251,22,60, -200,199,202,201,27,83,160,41,45,45,43,91,159,33,11,90,161,33,32,11,83, -160,38,32,33,11,247,248,22,8,89,162,32,33,40,9,226,15,2,3,1,250, -22,31,89,162,32,32,36,9,225,6,3,7,90,161,33,33,10,247,22,252,174, -2,248,22,252,174,2,89,162,32,33,36,9,224,3,1,248,193,89,162,32,32, -36,9,224,2,3,28,248,22,252,171,2,193,248,22,252,176,2,193,249,80,158, -35,42,21,95,62,105,102,64,95,64,109,101,109,118,65,61,118,66,94,65,113, -117,111,116,101,67,94,61,107,68,63,46,46,46,69,96,2,0,62,101,49,70, -62,101,50,71,2,69,83,160,41,46,35,43,89,162,32,32,57,9,225,6,5, -4,27,250,22,208,83,160,41,47,38,43,250,22,208,83,160,41,48,41,43,250, -22,58,83,160,41,49,44,43,250,22,208,83,160,41,50,47,43,250,22,58,83, -160,41,51,50,43,248,22,86,23,17,250,22,208,83,160,41,52,53,43,249,22, -58,83,160,41,53,55,43,248,22,87,23,22,83,160,41,54,53,43,83,160,41, -55,47,43,250,22,208,83,160,41,56,47,43,250,22,60,83,160,41,57,50,43, -248,22,51,23,17,248,22,77,23,17,83,160,41,58,47,43,83,160,41,59,41, -43,197,89,162,32,32,33,9,223,0,192,89,162,32,32,34,9,223,3,248,22, -252,174,2,208,27,28,248,80,158,38,32,197,249,80,158,39,33,248,80,158,40, -34,199,27,248,80,158,41,35,200,28,248,80,158,41,32,193,249,80,158,42,33, -248,80,158,43,34,195,27,248,80,158,44,35,196,28,248,80,158,44,32,193,27, -27,248,80,158,46,34,195,28,248,80,158,46,32,193,27,27,248,80,158,48,34, -195,28,248,80,158,48,39,193,248,22,58,248,80,158,49,40,194,11,28,192,249, -80,158,48,36,194,27,248,80,158,50,35,197,28,248,80,158,50,32,193,249,80, -158,51,33,248,80,158,52,34,195,27,248,80,158,53,35,196,28,248,80,158,53, -39,193,248,22,58,248,80,158,54,40,194,11,11,11,11,28,192,249,80,158,46, -36,194,27,248,80,158,48,35,197,28,248,80,158,48,32,193,249,80,158,49,33, -248,80,158,50,34,195,27,248,80,158,51,35,196,28,248,80,158,51,39,193,248, -80,158,51,40,193,11,11,11,11,11,11,28,192,27,248,22,51,194,27,248,22, -77,195,27,248,22,86,196,27,248,22,89,197,27,249,22,69,199,36,27,249,22, -69,200,37,27,249,22,68,201,38,249,80,158,46,41,23,15,27,253,22,60,204, -203,201,206,205,202,27,83,160,41,8,28,48,43,91,159,33,11,90,161,33,32, -11,83,160,38,32,33,11,247,248,22,8,89,162,32,33,40,9,226,18,2,3, -1,250,22,31,89,162,32,32,36,9,225,6,3,7,90,161,33,33,10,247,22, -252,174,2,248,22,252,174,2,89,162,32,33,36,9,224,3,1,248,193,89,162, -32,32,36,9,224,2,3,28,248,22,252,171,2,193,248,22,252,176,2,193,249, -80,158,35,42,21,95,63,108,101,116,72,93,94,61,120,73,2,66,96,2,64, -95,2,65,2,73,94,2,67,94,2,68,2,69,96,2,0,2,70,2,71,2, -69,97,2,52,2,73,62,99,49,74,62,99,50,75,2,69,83,160,41,8,29, -35,43,89,162,32,32,8,33,9,225,6,5,4,27,250,22,208,83,160,41,8, -30,38,43,250,22,208,83,160,41,8,31,41,43,250,22,58,83,160,41,8,32, -44,43,250,22,208,83,160,41,8,33,47,43,248,22,58,250,22,208,83,160,41, -8,34,51,43,249,22,58,83,160,41,8,35,53,43,248,22,89,23,20,83,160, -41,8,36,51,43,83,160,41,8,37,47,43,250,22,208,83,160,41,8,38,47, -43,251,22,58,83,160,41,8,39,51,43,250,22,208,83,160,41,8,40,54,43, -250,22,58,83,160,41,8,41,57,43,83,160,41,8,42,57,43,250,22,208,83, -160,41,8,43,8,28,43,249,22,58,83,160,41,8,44,8,30,43,249,22,69, -23,30,36,83,160,41,8,45,8,28,43,83,160,41,8,46,54,43,250,22,208, -83,160,41,8,47,54,43,250,22,60,83,160,41,8,48,57,43,248,22,51,23, -24,248,22,77,23,24,83,160,41,8,49,54,43,250,22,208,83,160,41,8,50, -54,43,251,22,60,83,160,41,8,51,58,43,83,160,41,8,52,58,43,249,22, -68,23,26,37,248,22,86,23,25,83,160,41,8,53,54,43,83,160,41,8,54, -47,43,83,160,41,8,55,41,43,197,89,162,32,32,33,9,223,0,192,89,162, -32,32,34,9,223,3,248,22,252,174,2,208,27,28,248,80,158,39,32,198,249, -80,158,40,33,248,80,158,41,34,200,27,248,80,158,42,35,201,28,248,80,158, -42,32,193,27,28,248,22,205,194,193,201,249,80,158,44,33,248,80,158,45,34, -196,27,248,80,158,46,35,197,28,248,80,158,46,32,193,27,28,248,22,205,194, -193,196,27,27,248,80,158,49,34,196,28,248,80,158,49,32,193,249,80,158,50, -33,248,80,158,51,34,195,27,248,80,158,52,35,196,28,248,80,158,52,32,193, -249,80,158,53,33,248,80,158,54,34,195,27,248,80,158,55,35,196,28,248,80, -158,55,39,193,248,22,58,248,80,158,56,40,194,11,11,11,28,192,249,80,158, -49,36,194,27,248,80,158,51,35,198,250,22,208,199,195,199,11,11,11,11,28, -192,27,248,22,51,194,27,248,22,77,195,27,248,22,86,196,27,248,22,89,197, -27,249,22,69,199,36,27,249,22,68,200,37,251,22,252,31,2,11,6,33,33, -98,97,100,32,115,121,110,116,97,120,32,40,110,111,116,32,97,32,100,97,116, -117,109,32,115,101,113,117,101,110,99,101,41,23,17,199,27,28,248,80,158,40, -32,199,249,80,158,41,33,248,80,158,42,34,201,27,248,80,158,43,35,202,28, -248,80,158,43,32,193,27,28,248,22,205,194,193,202,249,80,158,45,33,248,80, -158,46,34,196,27,248,80,158,47,35,197,28,248,80,158,47,32,193,27,28,248, -22,205,194,193,196,249,80,158,49,33,248,80,158,50,34,196,27,248,80,158,51, -35,197,250,22,208,198,195,198,11,11,11,28,192,27,248,22,51,194,27,248,22, -77,195,27,248,22,86,196,27,248,22,87,197,251,22,252,31,2,11,6,52,52, -98,97,100,32,115,121,110,116,97,120,32,40,109,105,115,115,105,110,103,32,101, -120,112,114,101,115,115,105,111,110,32,97,102,116,101,114,32,100,97,116,117,109, -32,115,101,113,117,101,110,99,101,41,23,16,197,27,89,162,32,32,36,68,116, -114,121,45,110,101,120,116,76,223,7,250,22,252,31,2,11,6,10,10,98,97, -100,32,115,121,110,116,97,120,195,27,28,248,80,158,42,32,201,249,80,158,43, -33,248,80,158,44,34,203,27,248,80,158,45,35,204,250,22,208,206,195,206,11, -28,192,27,248,22,51,194,27,248,22,52,195,28,248,22,56,248,22,209,194,247, -195,250,22,252,31,2,11,6,31,31,98,97,100,32,115,121,110,116,97,120,32, -40,105,108,108,101,103,97,108,32,117,115,101,32,111,102,32,96,46,39,41,23, -15,247,193,32,20,96,158,16,11,30,77,65,35,37,115,116,120,78,69,115,116, -120,45,112,97,105,114,63,79,11,30,80,2,78,67,99,111,110,115,47,35,102, -81,1,30,82,2,78,67,115,116,120,45,99,97,114,83,5,30,84,2,78,67, -115,116,120,45,99,100,114,85,6,30,86,2,78,69,97,112,112,101,110,100,47, -35,102,87,0,30,88,2,78,71,115,116,120,45,110,117,108,108,47,35,102,89, -9,30,90,2,78,71,105,100,101,110,116,105,102,105,101,114,63,91,2,30,92, -2,78,69,115,116,120,45,108,105,115,116,63,93,8,30,94,2,78,69,115,116, -120,45,62,108,105,115,116,95,4,30,96,68,35,37,115,116,120,108,111,99,97, -68,114,101,108,111,99,97,116,101,98,1,30,99,69,35,37,115,116,120,99,97, -115,101,100,1,20,101,108,108,105,112,115,105,115,45,99,111,117,110,116,45,101, -114,114,111,114,101,0,16,56,18,98,64,104,101,114,101,102,38,97,36,10,32, -11,16,104,2,58,2,2,66,108,101,116,47,101,99,103,74,35,37,100,101,102, -105,110,101,45,101,116,45,97,108,104,1,22,98,114,101,97,107,45,112,97,114, -97,109,101,116,101,114,105,122,97,116,105,111,110,105,2,2,2,45,2,2,2, -14,2,2,74,45,100,101,102,105,110,101,45,115,121,110,116,97,120,106,2,104, -2,54,2,2,2,35,2,2,73,100,101,102,105,110,101,45,115,116,114,117,99, -116,107,2,104,2,37,2,2,67,112,114,111,109,105,115,101,108,2,2,2,25, -2,2,2,41,2,2,2,8,2,2,2,4,2,2,2,27,2,2,2,56,2, -2,73,100,101,102,105,110,101,45,115,121,110,116,97,120,109,68,35,37,100,101, -102,105,110,101,110,2,29,2,2,2,10,2,2,2,62,2,2,64,99,111,110, -100,111,66,35,37,99,111,110,100,112,2,33,2,2,2,47,2,18,2,59,2, -2,2,57,2,2,63,97,110,100,113,71,35,37,113,113,45,97,110,100,45,111, -114,114,66,100,101,102,105,110,101,115,2,110,2,43,2,2,2,53,2,2,62, -111,114,116,2,114,2,31,2,2,70,113,117,97,115,105,113,117,111,116,101,117, -2,114,2,52,2,2,2,39,2,2,2,49,2,2,67,45,100,101,102,105,110, -101,118,2,104,2,6,2,2,2,51,2,18,2,12,2,2,2,61,2,2,77, -100,101,102,105,110,101,45,102,111,114,45,115,121,110,116,97,120,119,2,110,2, -55,2,2,2,21,2,18,2,16,2,2,76,98,101,103,105,110,45,102,111,114, -45,115,121,110,116,97,120,120,2,110,2,60,2,2,64,119,104,101,110,121,2, -104,2,63,2,2,2,19,2,18,66,117,110,108,101,115,115,122,2,104,2,23, -2,2,97,35,10,33,11,16,86,72,115,121,110,116,97,120,45,99,97,115,101, -42,123,2,97,71,119,105,116,104,45,115,121,110,116,97,120,124,70,35,37,119, -105,116,104,45,115,116,120,125,66,115,121,110,116,97,120,126,2,100,71,115,116, -120,45,118,101,99,116,111,114,63,127,2,78,70,108,101,116,45,115,121,110,116, -97,120,128,76,35,37,115,116,120,99,97,115,101,45,115,99,104,101,109,101,129, -77,117,110,115,121,110,116,97,120,45,115,112,108,105,99,105,110,103,130,67,35, -37,113,113,115,116,120,131,2,116,2,114,2,83,2,78,74,115,116,120,45,118, -101,99,116,111,114,45,114,101,102,132,2,78,73,108,101,116,114,101,99,45,115, -121,110,116,97,120,133,2,129,2,85,2,78,70,115,121,110,116,97,120,47,108, -111,99,134,2,97,70,115,116,120,45,114,111,116,97,116,101,135,2,78,2,93, -2,78,2,81,2,78,71,115,116,120,45,114,111,116,97,116,101,42,136,2,78, -2,113,2,114,74,115,112,108,105,116,45,115,116,120,45,108,105,115,116,137,2, -78,72,108,101,116,45,115,121,110,116,97,120,101,115,138,2,129,1,26,99,104, -101,99,107,45,100,117,112,108,105,99,97,116,101,45,105,100,101,110,116,105,102, -105,101,114,139,2,129,2,106,2,104,71,113,117,97,115,105,115,121,110,116,97, -120,140,2,131,2,91,2,78,1,20,103,101,110,101,114,97,116,101,45,116,101, -109,112,111,114,97,114,105,101,115,141,2,125,2,107,2,104,69,115,116,120,45, -110,117,108,108,63,142,2,78,2,117,2,114,2,111,2,112,2,89,2,78,72, -115,121,110,116,97,120,45,114,117,108,101,115,143,2,129,68,117,110,115,121,110, -116,97,120,144,2,131,2,118,2,104,2,87,2,78,2,121,2,104,75,115,121, -110,116,97,120,45,105,100,45,114,117,108,101,115,145,2,129,75,108,101,116,114, -101,99,45,115,121,110,116,97,120,101,115,146,2,129,2,103,2,104,2,122,2, -104,75,113,117,97,115,105,115,121,110,116,97,120,47,108,111,99,147,2,131,73, -115,116,120,45,99,104,101,99,107,47,101,115,99,148,2,78,2,95,2,78,2, -79,2,78,71,115,121,110,116,97,120,45,99,97,115,101,149,2,97,96,34,8, -254,1,11,16,0,16,4,33,11,2,73,3,1,7,101,110,118,51,52,53,48, -150,18,16,2,95,66,115,114,99,116,97,103,151,39,93,8,252,19,9,95,9, -8,252,19,9,2,100,18,100,64,100,101,115,116,152,42,36,35,34,33,16,6, -41,11,3,1,4,103,52,51,54,153,3,1,4,103,52,51,55,154,3,1,7, -101,110,118,51,52,53,54,155,2,155,16,6,40,11,61,95,156,2,66,3,1, -7,101,110,118,51,52,53,55,157,2,157,18,158,63,99,116,120,158,42,18,158, -2,0,42,18,16,2,103,93,158,93,158,2,111,42,42,50,97,49,10,32,11, -16,58,73,115,121,110,116,97,120,45,99,97,115,101,42,42,159,29,160,11,11, -2,126,2,160,2,127,2,78,2,118,2,104,2,83,2,78,2,132,2,78,2, -85,2,78,2,135,2,78,2,148,2,78,2,81,2,78,2,136,2,78,2,113, -2,114,2,137,2,78,2,101,2,160,2,116,2,114,2,91,2,78,2,107,2, -104,2,142,2,78,2,117,2,114,2,111,2,112,2,89,2,78,2,122,2,104, -2,87,2,78,2,121,2,104,2,103,2,104,2,93,2,78,2,106,2,104,2, -95,2,78,2,79,2,78,97,48,10,33,11,16,70,75,115,121,110,116,97,120, -45,109,97,112,112,105,110,103,63,161,64,35,37,115,99,162,2,127,2,78,2, -118,2,104,2,83,2,78,2,132,2,78,74,103,101,116,45,109,97,116,99,104, -45,118,97,114,115,163,2,162,2,85,2,78,2,135,2,78,2,148,2,78,2, -81,2,78,72,110,111,45,101,108,108,105,112,115,101,115,63,164,2,162,2,136, -2,78,2,113,2,114,2,137,2,78,72,115,116,120,45,109,101,109,113,45,112, -111,115,165,2,162,1,21,115,121,110,116,97,120,45,109,97,112,112,105,110,103, -45,118,97,108,118,97,114,166,2,162,2,116,2,114,2,91,2,78,74,109,97, -107,101,45,109,97,116,99,104,38,101,110,118,167,2,162,2,107,2,104,1,20, -115,121,110,116,97,120,45,109,97,112,112,105,110,103,45,100,101,112,116,104,168, -2,162,79,109,97,107,101,45,115,121,110,116,97,120,45,109,97,112,112,105,110, -103,169,2,162,2,142,2,78,2,117,2,114,2,111,2,112,2,89,2,78,2, -122,2,104,72,109,97,107,101,45,112,101,120,112,97,110,100,170,2,162,2,87, -2,78,2,121,2,104,2,103,2,104,2,93,2,78,2,106,2,104,2,95,2, -78,2,79,2,78,96,47,8,254,1,11,16,0,16,4,46,11,2,73,3,1, -6,101,110,118,51,56,48,171,16,4,45,11,68,104,101,114,101,45,115,116,120, -172,3,1,6,101,110,118,51,56,50,173,16,4,44,11,2,172,2,173,13,16, -3,33,2,160,2,100,93,8,252,19,9,16,6,43,11,61,114,174,63,115,114, -99,175,3,1,7,101,110,118,51,52,54,49,176,2,176,95,9,8,252,19,9, -2,100,18,158,2,158,42,18,158,64,101,108,115,101,177,38,18,16,2,95,2, -151,51,93,8,252,21,9,95,9,8,252,21,9,2,100,18,100,2,152,54,36, -35,34,33,16,10,53,11,3,1,4,103,52,51,50,178,3,1,4,103,52,51, -51,179,3,1,4,103,52,51,52,180,3,1,4,103,52,51,53,181,3,1,7, -101,110,118,51,52,55,49,182,2,182,2,182,2,182,16,10,52,11,2,156,2, -66,2,70,2,71,3,1,7,101,110,118,51,52,55,50,183,2,183,2,183,2, -183,18,158,2,158,54,18,158,2,0,54,18,158,2,158,54,18,16,2,95,2, -151,55,93,8,252,23,9,95,9,8,252,23,9,2,100,18,16,2,99,2,69, -8,28,93,8,252,23,9,16,6,59,11,2,174,2,175,3,1,7,101,110,118, -51,52,57,55,184,2,184,16,4,58,11,64,101,120,110,104,185,3,1,7,101, -110,118,51,52,57,56,186,16,4,57,11,63,101,115,99,187,3,1,7,101,110, -118,51,52,57,57,188,16,4,56,11,63,101,120,110,189,3,1,7,101,110,118, -51,53,48,49,190,95,9,8,252,23,9,2,100,18,100,2,152,8,31,36,35, -34,33,16,12,8,30,11,3,1,4,103,52,50,55,191,3,1,4,103,52,50, -56,192,3,1,4,103,52,50,57,193,3,1,4,103,52,51,48,194,3,1,4, -103,52,51,49,195,3,1,7,101,110,118,51,52,56,57,196,2,196,2,196,2, -196,2,196,16,12,8,29,11,2,156,2,66,2,68,2,70,2,71,3,1,7, -101,110,118,51,52,57,48,197,2,197,2,197,2,197,2,197,18,158,2,158,8, -31,18,158,2,64,8,31,18,158,2,158,8,31,18,158,2,65,8,31,18,158, -2,158,8,31,18,158,2,67,8,31,18,158,2,158,8,31,18,158,2,158,8, -31,18,158,2,158,8,31,18,158,2,0,8,31,18,158,2,158,8,31,18,158, -2,158,8,31,18,16,2,95,2,151,8,32,93,8,252,26,9,95,9,8,252, -26,9,2,100,18,16,2,99,2,69,8,37,93,8,252,26,9,16,6,8,36, -11,2,174,2,175,3,1,7,101,110,118,51,53,50,57,198,2,198,16,4,8, -35,11,2,185,3,1,7,101,110,118,51,53,51,48,199,16,4,8,34,11,2, -187,3,1,7,101,110,118,51,53,51,49,200,16,4,8,33,11,2,189,3,1, -7,101,110,118,51,53,51,51,201,95,9,8,252,26,9,2,100,18,100,2,152, -8,40,36,35,34,33,16,16,8,39,11,3,1,4,103,52,50,48,202,3,1, -4,103,52,50,49,203,3,1,4,103,52,50,50,204,3,1,4,103,52,50,51, -205,3,1,4,103,52,50,52,206,3,1,4,103,52,50,53,207,3,1,4,103, -52,50,54,208,3,1,7,101,110,118,51,53,49,57,209,2,209,2,209,2,209, -2,209,2,209,2,209,16,16,8,38,11,2,156,2,66,2,68,2,70,2,71, -2,74,2,75,3,1,7,101,110,118,51,53,50,48,210,2,210,2,210,2,210, -2,210,2,210,2,210,18,158,2,158,8,40,18,158,2,72,8,40,18,158,2, -158,8,40,18,158,2,158,8,40,18,158,2,73,8,40,18,158,2,158,8,40, -18,158,2,158,8,40,18,158,2,158,8,40,18,158,2,64,8,40,18,158,2, -158,8,40,18,158,2,65,8,40,18,158,2,73,8,40,18,158,2,158,8,40, -18,158,2,67,8,40,18,158,2,158,8,40,18,158,2,158,8,40,18,158,2, -158,8,40,18,158,2,0,8,40,18,158,2,158,8,40,18,158,2,158,8,40, -18,158,2,52,8,40,18,158,2,73,8,40,18,158,2,158,8,40,18,158,2, -158,8,40,18,158,2,158,8,40,11,16,5,93,2,55,89,162,32,33,8,31, -9,223,0,27,249,22,208,83,160,41,32,35,45,196,27,28,248,80,158,35,32, -194,249,80,158,36,33,248,80,158,37,34,196,27,248,80,158,38,35,197,28,248, -80,158,38,32,193,27,27,248,80,158,40,34,195,28,248,80,158,40,36,193,248, -22,8,89,162,32,33,39,9,224,8,1,27,249,22,2,89,162,32,33,49,9, -224,4,5,249,80,158,35,37,28,248,80,158,36,32,197,249,80,158,37,33,248, -80,158,38,34,199,27,248,80,158,39,35,200,28,248,80,158,39,32,193,27,28, -248,22,205,194,193,200,249,80,158,41,33,248,80,158,42,34,196,27,248,80,158, -43,35,197,248,22,58,250,22,208,199,196,199,11,11,194,248,80,158,37,38,196, -28,248,22,56,193,21,95,9,9,9,248,80,158,35,39,193,11,28,192,249,80, -158,40,40,194,27,248,80,158,42,35,197,28,248,80,158,42,32,193,27,27,248, -80,158,44,34,195,28,248,80,158,44,32,193,249,80,158,45,33,248,80,158,46, -34,195,27,248,80,158,47,35,196,28,248,80,158,47,36,193,248,22,58,248,80, -158,48,38,194,11,11,28,192,249,80,158,44,40,194,27,248,80,158,46,35,197, -28,248,80,158,46,36,193,248,80,158,46,38,193,11,11,11,11,11,11,28,192, -27,248,22,51,194,27,248,22,77,195,27,248,22,86,196,27,248,22,89,197,27, -249,22,69,199,36,27,249,22,69,200,37,27,249,22,68,201,38,27,249,22,208, -83,160,41,33,44,45,250,22,2,89,162,32,34,45,9,224,15,16,27,249,22, -208,83,160,41,34,36,45,198,27,248,80,158,36,41,194,28,192,196,27,28,248, -80,158,37,32,195,27,248,80,158,38,34,196,28,192,249,80,158,39,40,194,248, -80,158,40,41,248,80,158,41,35,199,11,11,28,192,192,250,22,252,31,2,11, -6,19,19,98,97,100,32,118,97,114,105,97,98,108,101,32,115,121,110,116,97, -120,198,248,22,215,27,83,160,41,35,49,45,250,22,208,83,160,41,36,52,45, -23,16,195,248,22,215,27,83,160,41,37,49,45,250,22,208,83,160,41,38,52, -45,206,195,27,28,248,80,158,44,36,194,248,80,158,44,38,194,11,28,192,27, -249,22,208,83,160,41,39,46,45,27,83,160,41,40,47,45,250,22,208,83,160, -41,41,50,45,202,195,27,248,80,158,46,41,194,28,192,249,80,158,47,42,23, -16,27,252,22,60,23,17,206,204,23,16,202,27,83,160,41,42,49,45,91,159, -33,11,90,161,33,32,11,83,160,38,32,33,11,247,248,22,8,89,162,32,33, -40,9,226,19,2,3,1,250,22,31,89,162,32,32,36,9,225,6,3,7,90, -161,33,33,10,247,22,252,174,2,248,22,252,174,2,89,162,32,33,36,9,224, -3,1,248,193,89,162,32,32,36,9,224,2,3,28,248,22,252,171,2,193,248, -22,252,176,2,193,249,80,158,35,43,21,96,2,72,66,100,111,108,111,111,112, -211,94,94,63,118,97,114,212,64,105,110,105,116,213,2,69,95,2,64,94,63, -110,111,116,214,62,101,48,215,96,2,0,61,99,216,2,69,95,2,211,64,115, -116,101,112,217,2,69,83,160,41,43,35,45,89,162,32,32,8,34,9,225,6, -5,4,27,250,22,208,83,160,41,44,38,45,250,22,208,83,160,41,45,41,45, -251,22,58,83,160,41,46,45,45,83,160,41,47,45,45,250,22,2,89,162,33, -33,41,9,223,16,250,22,208,83,160,41,48,35,45,249,22,58,248,22,51,199, -248,22,77,199,83,160,41,49,35,45,248,22,51,23,15,248,22,89,23,15,250, -22,208,83,160,41,50,48,45,250,22,58,83,160,41,51,51,45,250,22,208,83, -160,41,52,54,45,249,22,58,83,160,41,53,56,45,248,22,77,23,23,83,160, -41,54,54,45,250,22,208,83,160,41,55,54,45,249,22,50,83,160,41,56,56, -45,249,22,64,248,22,86,23,25,248,22,58,250,22,208,83,160,41,57,8,30, -45,249,22,50,83,160,41,58,8,32,45,248,22,88,23,31,83,160,41,59,8, -30,45,83,160,41,8,28,54,45,83,160,41,8,29,48,45,83,160,41,8,30, -41,45,197,89,162,32,32,33,9,223,0,192,89,162,32,32,34,9,223,3,248, -22,252,174,2,208,27,28,248,80,158,47,32,195,249,80,158,48,33,248,80,158, -49,34,197,27,248,80,158,50,35,198,28,248,80,158,50,36,193,248,80,158,50, -38,193,11,11,28,192,27,248,22,51,194,27,248,22,52,195,249,80,158,50,42, -23,19,27,254,22,60,203,23,22,202,23,19,23,17,23,21,23,15,27,83,160, -41,8,31,52,45,91,159,33,11,90,161,33,32,11,83,160,38,32,33,11,247, -248,22,8,89,162,32,33,40,9,226,22,2,3,1,250,22,31,89,162,32,32, -36,9,225,6,3,7,90,161,33,33,10,247,22,252,174,2,248,22,252,174,2, -89,162,32,33,36,9,224,3,1,248,193,89,162,32,32,36,9,224,2,3,28, -248,22,252,171,2,193,248,22,252,176,2,193,249,80,158,35,43,21,96,2,72, -2,211,94,94,2,212,2,213,2,69,96,2,64,2,215,96,2,0,2,70,2, -71,2,69,96,2,0,2,216,2,69,95,2,211,2,217,2,69,83,160,41,8, -32,35,45,89,162,32,32,8,36,9,225,6,5,4,27,250,22,208,83,160,41, -8,33,38,45,250,22,208,83,160,41,8,34,41,45,251,22,58,83,160,41,8, -35,45,45,83,160,41,8,36,45,45,250,22,2,89,162,33,33,41,9,223,16, -250,22,208,83,160,41,8,37,35,45,249,22,58,248,22,51,199,248,22,77,199, -83,160,41,8,38,35,45,248,22,77,23,15,249,22,69,23,16,37,250,22,208, -83,160,41,8,39,48,45,251,22,58,83,160,41,8,40,52,45,248,22,89,23, -19,250,22,208,83,160,41,8,41,55,45,250,22,60,83,160,41,8,42,58,45, -248,22,51,23,25,248,22,86,23,25,83,160,41,8,43,55,45,250,22,208,83, -160,41,8,44,55,45,249,22,50,83,160,41,8,45,57,45,249,22,64,249,22, -69,23,27,36,248,22,58,250,22,208,83,160,41,8,46,8,31,45,249,22,50, -83,160,41,8,47,8,33,45,249,22,68,23,33,38,83,160,41,8,48,8,31, -45,83,160,41,8,49,55,45,83,160,41,8,50,48,45,83,160,41,8,51,41, -45,197,89,162,32,32,33,9,223,0,192,89,162,32,32,34,9,223,3,248,22, -252,174,2,208,250,22,252,31,2,11,6,10,10,98,97,100,32,115,121,110,116, -97,120,197,248,80,158,44,44,83,160,41,8,52,44,45,250,22,252,31,2,11, -6,10,10,98,97,100,32,115,121,110,116,97,120,196,32,20,96,158,16,13,2, -77,2,80,2,82,2,84,2,92,30,218,2,78,2,148,7,2,94,30,219,2, -78,2,135,12,2,86,2,88,2,96,2,99,30,220,2,125,76,119,105,116,104, -45,115,121,110,116,97,120,45,102,97,105,108,221,3,16,53,18,98,2,102,8, -42,36,35,34,16,4,8,41,11,66,111,114,105,103,45,120,222,3,1,7,101, -110,118,51,53,56,52,223,18,100,2,102,8,45,36,35,34,8,41,16,16,8, -44,11,3,1,4,103,52,51,56,224,3,1,4,103,52,51,57,225,3,1,4, -103,52,52,48,226,3,1,4,103,52,52,49,227,3,1,4,103,52,52,50,228, -3,1,4,103,52,52,51,229,3,1,4,103,52,52,52,230,3,1,7,101,110, -118,51,54,48,51,231,2,231,2,231,2,231,2,231,2,231,2,231,16,16,8, -43,11,2,156,2,212,2,213,2,217,2,215,2,70,2,216,3,1,7,101,110, -118,51,54,48,52,232,2,232,2,232,2,232,2,232,2,232,2,232,18,101,2, -102,8,47,36,35,34,8,41,8,44,8,43,16,6,8,46,11,2,66,61,115, -233,3,1,7,101,110,118,51,54,49,52,234,2,234,18,16,2,95,2,151,8, -48,93,8,252,48,9,95,9,8,252,48,9,2,100,18,158,2,152,8,45,18, -16,2,95,2,151,8,49,93,8,252,49,9,95,9,8,252,49,9,2,100,18, -158,2,152,8,45,18,101,2,102,8,51,36,35,34,8,41,8,44,8,43,16, -4,8,50,11,3,1,4,103,52,52,57,235,3,1,7,101,110,118,51,54,51, -53,236,18,16,2,95,2,151,8,52,93,8,252,53,9,95,9,8,252,53,9, -2,100,18,158,2,152,8,51,18,16,2,95,2,151,8,53,93,8,252,55,9, -95,9,8,252,55,9,2,100,18,16,2,99,2,69,8,58,93,8,252,55,9, -16,6,8,57,11,2,174,2,175,3,1,7,101,110,118,51,54,52,53,237,2, -237,16,4,8,56,11,2,185,3,1,7,101,110,118,51,54,52,54,238,16,4, -8,55,11,2,187,3,1,7,101,110,118,51,54,52,55,239,16,4,8,54,11, -2,189,3,1,7,101,110,118,51,54,52,57,240,95,9,8,252,55,9,2,100, -18,158,2,152,8,51,18,158,2,158,8,51,18,158,2,72,8,51,18,158,2, -211,8,51,18,158,2,158,8,51,18,158,2,158,8,51,18,158,2,158,8,51, -18,158,2,64,8,51,18,158,2,158,8,51,18,158,2,214,8,51,18,158,2, -158,8,51,18,158,2,158,8,51,18,158,2,0,8,51,18,158,2,158,8,51, -18,158,2,211,8,51,18,158,2,158,8,51,18,158,2,158,8,51,18,158,2, -158,8,51,18,158,2,158,8,51,18,16,2,95,2,151,8,59,93,8,252,58, -9,95,9,8,252,58,9,2,100,18,16,2,99,2,69,8,64,93,8,252,58, -9,16,6,8,63,11,2,174,2,175,3,1,7,101,110,118,51,54,54,53,241, -2,241,16,4,8,62,11,2,185,3,1,7,101,110,118,51,54,54,54,242,16, -4,8,61,11,2,187,3,1,7,101,110,118,51,54,54,55,243,16,4,8,60, -11,2,189,3,1,7,101,110,118,51,54,54,57,244,95,9,8,252,58,9,2, -100,18,103,2,152,8,67,36,35,34,8,41,8,44,8,43,8,50,16,6,8, -66,11,3,1,4,103,52,53,48,245,3,1,4,103,52,53,49,246,3,1,7, -101,110,118,51,54,54,48,247,2,247,16,4,8,65,11,2,71,3,1,7,101, -110,118,51,54,54,49,248,18,158,2,158,8,67,18,158,2,72,8,67,18,158, -2,211,8,67,18,158,2,158,8,67,18,158,2,158,8,67,18,158,2,158,8, -67,18,158,2,64,8,67,18,158,2,158,8,67,18,158,2,0,8,67,18,158, -2,158,8,67,18,158,2,158,8,67,18,158,2,0,8,67,18,158,2,158,8, -67,18,158,2,211,8,67,18,158,2,158,8,67,18,158,2,158,8,67,18,158, -2,158,8,67,18,158,2,158,8,67,18,16,2,158,94,98,2,217,8,71,93, -8,252,44,9,16,4,8,70,11,3,1,8,119,115,116,109,112,52,52,53,249, -3,1,7,101,110,118,51,54,49,51,250,16,4,8,69,11,3,1,4,103,52, -52,56,251,3,1,7,101,110,118,51,54,55,56,252,252,0,16,4,8,68,11, -65,95,101,108,115,101,252,253,0,3,1,7,101,110,118,51,54,55,57,252,254, -0,158,2,69,8,71,8,71,95,9,8,252,44,9,2,125,11,16,5,93,2, -54,89,162,32,33,56,9,223,0,27,249,22,208,83,160,41,32,35,39,196,27, -28,248,80,158,35,32,194,249,80,158,36,33,248,80,158,37,34,196,27,248,80, -158,38,35,197,28,248,80,158,38,32,193,27,248,80,158,39,34,194,28,192,249, -80,158,40,36,194,248,80,158,41,37,248,80,158,42,35,197,11,11,11,28,192, -27,248,22,51,194,27,248,22,52,195,249,80,158,38,38,199,27,83,160,41,33, -39,39,250,22,208,83,160,41,34,42,39,250,22,208,83,160,41,35,45,39,249, -22,58,83,160,41,36,47,39,250,22,208,83,160,41,37,50,39,250,22,58,83, -160,41,38,53,39,83,160,41,39,53,39,23,17,83,160,41,40,50,39,83,160, -41,41,45,39,195,250,22,252,31,2,11,6,10,10,98,97,100,32,115,121,110, -116,97,120,196,32,20,96,158,16,7,2,77,2,80,2,82,2,84,2,86,2, -88,2,96,16,10,18,98,2,102,8,73,36,35,34,16,4,8,72,11,2,73, -3,1,7,101,110,118,51,54,56,50,252,255,0,18,16,2,95,2,151,8,74, -93,8,252,68,9,95,9,8,252,68,9,2,100,18,100,2,152,8,77,36,35, -34,8,72,16,6,8,76,11,3,1,4,103,52,53,50,252,0,1,3,1,4, -103,52,53,51,252,1,1,3,1,7,101,110,118,51,54,56,56,252,2,1,2, -252,2,1,16,6,8,75,11,2,54,63,101,120,112,252,3,1,3,1,7,101, -110,118,51,54,56,57,252,4,1,2,252,4,1,18,158,2,158,8,77,18,158, -2,6,8,77,18,158,2,158,8,77,18,158,66,108,97,109,98,100,97,252,5, -1,8,77,18,158,9,8,77,18,158,2,158,8,77,18,158,2,158,8,77,11, -16,5,93,2,108,253,22,59,248,247,22,252,76,3,83,160,41,32,39,32,248, -247,22,252,76,3,83,160,41,33,39,32,248,247,22,252,76,3,83,160,41,34, -39,32,248,22,59,248,247,22,252,76,3,83,160,41,35,40,32,248,22,59,248, -247,22,252,76,3,83,160,41,36,40,32,10,40,20,96,158,16,0,16,5,18, -97,2,4,8,78,36,35,34,18,158,2,6,8,78,18,158,2,8,8,78,18, -158,2,10,8,78,18,158,2,12,8,78,11,16,5,93,2,61,89,162,32,33, -56,9,223,0,27,249,22,208,83,160,41,32,35,45,196,27,28,248,80,158,35, -32,194,249,80,158,36,33,248,80,158,37,34,196,27,248,80,158,38,35,197,28, -248,80,158,38,32,193,28,248,80,158,38,36,248,80,158,39,34,194,27,248,80, -158,39,35,194,28,248,80,158,39,32,193,249,80,158,40,33,248,80,158,41,34, -195,27,248,80,158,42,35,196,28,248,80,158,42,37,193,248,80,158,42,38,193, -11,11,11,11,11,28,192,27,248,22,51,194,27,248,22,77,195,27,248,22,79, -196,27,249,22,60,195,196,27,83,160,41,33,39,45,250,22,208,83,160,41,34, -42,45,250,22,208,83,160,41,35,45,45,251,22,60,83,160,41,36,49,45,83, -160,41,37,49,45,248,22,52,204,248,22,51,204,83,160,41,38,45,45,195,27, -28,248,80,158,36,32,195,249,80,158,37,33,248,80,158,38,34,197,27,248,80, -158,39,35,198,28,248,80,158,39,32,193,27,27,248,80,158,41,34,195,28,248, -80,158,41,37,193,248,22,8,89,162,32,33,39,9,224,9,1,27,249,22,2, -89,162,32,33,44,9,224,4,5,249,80,158,35,39,28,248,80,158,36,32,197, -249,80,158,37,33,248,80,158,38,34,199,27,248,80,158,39,35,200,28,248,80, -158,39,32,193,249,80,158,40,33,248,80,158,41,34,195,248,80,158,41,36,248, -80,158,42,35,196,11,11,194,248,80,158,37,38,196,28,248,22,56,193,21,94, -9,9,248,80,158,35,40,193,11,28,192,249,80,158,41,41,194,27,248,80,158, -43,35,197,28,248,80,158,43,32,193,249,80,158,44,33,248,80,158,45,34,195, -27,248,80,158,46,35,196,28,248,80,158,46,37,193,248,80,158,46,38,193,11, -11,11,11,11,28,192,27,248,22,51,194,27,248,22,77,195,27,248,22,86,196, -27,248,22,89,197,27,248,22,88,198,27,249,22,208,83,160,41,39,43,45,249, -22,1,22,64,250,22,2,22,58,248,22,215,27,83,160,41,40,50,45,250,22, -208,83,160,41,41,53,45,23,16,195,248,22,215,27,83,160,41,42,50,45,250, -22,208,83,160,41,43,53,45,23,15,195,27,28,248,80,158,43,37,194,248,80, -158,43,38,194,11,28,192,249,80,158,44,42,205,27,250,22,60,200,201,198,27, -83,160,41,44,46,45,91,159,33,11,90,161,33,32,11,83,160,38,32,33,11, -247,248,22,8,89,162,32,33,40,9,226,16,2,3,1,250,22,31,89,162,32, -32,36,9,225,6,3,7,90,161,33,33,10,247,22,252,174,2,248,22,252,174, -2,89,162,32,33,36,9,224,3,1,248,193,89,162,32,32,36,9,224,2,3, -28,248,22,252,171,2,193,248,22,252,176,2,193,249,80,158,35,43,21,96,1, -22,119,105,116,104,45,99,111,110,116,105,110,117,97,116,105,111,110,45,109,97, -114,107,252,6,1,2,21,96,2,19,95,1,27,99,111,110,116,105,110,117,97, -116,105,111,110,45,109,97,114,107,45,115,101,116,45,102,105,114,115,116,252,7, -1,11,2,21,63,112,47,118,252,8,1,2,69,97,2,72,9,65,101,120,112, -114,49,252,9,1,64,101,120,112,114,252,10,1,2,69,83,160,41,45,35,45, -89,162,32,32,54,9,225,6,5,4,27,250,22,208,83,160,41,46,38,45,250, -22,208,83,160,41,47,41,45,251,22,58,83,160,41,48,45,45,83,160,41,49, -45,45,250,22,208,83,160,41,50,48,45,250,22,60,83,160,41,51,51,45,83, -160,41,52,51,45,248,22,79,23,18,83,160,41,53,48,45,250,22,208,83,160, -41,54,48,45,251,22,60,83,160,41,55,52,45,83,160,41,56,52,45,248,22, -77,23,19,248,22,51,23,19,83,160,41,57,48,45,83,160,41,58,41,45,197, -89,162,32,32,33,9,223,0,192,89,162,32,32,34,9,223,3,248,22,252,174, -2,208,248,80,158,43,44,83,160,41,59,43,45,250,22,252,31,2,11,6,10, -10,98,97,100,32,115,121,110,116,97,120,197,32,20,96,158,16,13,2,77,2, -80,2,82,2,84,2,88,2,92,2,94,2,218,2,219,2,86,2,96,2,99, -2,220,16,28,18,98,2,102,8,80,36,35,34,16,4,8,79,11,63,115,116, -120,252,11,1,3,1,7,101,110,118,51,54,57,54,252,12,1,18,16,2,95, -2,151,8,81,93,8,252,98,9,95,9,8,252,98,9,2,100,18,100,2,152, -8,84,36,35,34,8,79,16,8,8,83,11,3,1,4,103,52,53,57,252,13, -1,3,1,4,103,52,54,48,252,14,1,3,1,4,103,52,54,49,252,15,1, -3,1,7,101,110,118,51,55,48,51,252,16,1,2,252,16,1,2,252,16,1, -16,8,8,82,11,2,156,2,252,9,1,2,252,10,1,3,1,7,101,110,118, -51,55,48,52,252,17,1,2,252,17,1,2,252,17,1,18,158,2,158,8,84, -18,158,2,72,8,84,18,158,9,8,84,18,158,2,158,8,84,18,100,2,102, -8,87,36,35,34,8,79,16,12,8,86,11,3,1,4,103,52,53,52,252,18, -1,3,1,4,103,52,53,53,252,19,1,3,1,4,103,52,53,54,252,20,1, -3,1,4,103,52,53,55,252,21,1,3,1,4,103,52,53,56,252,22,1,3, -1,7,101,110,118,51,55,50,49,252,23,1,2,252,23,1,2,252,23,1,2, -252,23,1,2,252,23,1,16,12,8,85,11,2,156,65,112,97,114,97,109,252, -24,1,63,118,97,108,252,25,1,2,252,9,1,2,252,10,1,3,1,7,101, -110,118,51,55,50,50,252,26,1,2,252,26,1,2,252,26,1,2,252,26,1, -2,252,26,1,18,16,2,95,2,151,8,88,93,8,252,101,9,95,9,8,252, -101,9,2,100,18,158,2,152,8,87,18,16,2,95,2,151,8,89,93,8,252, -102,9,95,9,8,252,102,9,2,100,18,158,2,152,8,87,18,16,2,95,2, -151,8,90,93,8,252,105,9,95,9,8,252,105,9,2,100,18,16,2,99,2, -69,8,95,93,8,252,105,9,16,6,8,94,11,2,174,2,175,3,1,7,101, -110,118,51,55,51,57,252,27,1,2,252,27,1,16,4,8,93,11,2,185,3, -1,7,101,110,118,51,55,52,48,252,28,1,16,4,8,92,11,2,187,3,1, -7,101,110,118,51,55,52,49,252,29,1,16,4,8,91,11,2,189,3,1,7, -101,110,118,51,55,52,51,252,30,1,95,9,8,252,105,9,2,100,18,102,2, -152,8,98,36,35,34,8,79,8,86,8,85,16,4,8,97,11,3,1,4,103, -52,54,52,252,31,1,3,1,7,101,110,118,51,55,51,53,252,32,1,16,4, -8,96,11,2,252,8,1,3,1,7,101,110,118,51,55,51,54,252,33,1,18, -158,2,158,8,98,18,158,2,252,6,1,8,98,18,158,2,21,8,98,18,158, -2,158,8,98,18,158,2,19,8,98,18,158,95,158,2,252,7,1,8,98,158, -11,8,98,158,2,21,8,98,8,98,18,158,2,158,8,98,18,158,2,158,8, -98,18,158,2,72,8,98,18,158,9,8,98,18,158,2,158,8,98,18,158,2, -158,8,98,18,16,2,158,94,98,2,252,8,1,8,102,93,8,252,100,9,16, -4,8,101,11,3,1,8,119,115,116,109,112,52,54,50,252,34,1,3,1,7, -101,110,118,51,55,50,57,252,35,1,16,4,8,100,11,3,1,4,103,52,54, -51,252,36,1,3,1,7,101,110,118,51,55,53,48,252,37,1,16,4,8,99, -11,2,252,253,0,3,1,7,101,110,118,51,55,53,49,252,38,1,158,2,69, -8,102,8,102,95,9,8,252,100,9,2,125,11,16,5,93,2,56,89,162,32, -33,8,36,9,223,0,27,249,22,208,83,160,41,32,35,39,196,27,28,248,80, -158,35,32,194,249,80,158,36,33,248,80,158,37,34,196,27,248,80,158,38,35, -197,28,248,80,158,38,32,193,249,80,158,39,33,248,80,158,40,34,195,27,248, -80,158,41,35,196,28,248,80,158,41,32,193,249,80,158,42,33,248,80,158,43, -34,195,27,248,80,158,44,35,196,28,248,80,158,44,36,193,248,80,158,44,37, -193,11,11,11,11,28,192,27,248,22,51,194,27,248,22,77,195,27,248,22,86, -196,27,248,22,87,197,249,80,158,40,38,201,27,250,22,60,198,199,200,27,83, -160,41,33,42,39,250,22,208,83,160,41,34,45,39,250,22,208,83,160,41,35, -48,39,251,22,58,83,160,41,36,52,39,83,160,41,37,52,39,250,22,208,83, -160,41,38,55,39,249,22,58,83,160,41,39,57,39,250,22,208,83,160,41,40, -8,28,39,250,22,60,83,160,41,41,8,31,39,248,22,79,23,23,83,160,41, -42,8,31,39,83,160,41,43,8,28,39,83,160,41,44,55,39,250,22,208,83, -160,41,45,55,39,250,22,58,83,160,41,46,58,39,83,160,41,47,58,39,250, -22,208,83,160,41,48,8,29,39,251,22,60,83,160,41,49,8,33,39,83,160, -41,50,8,33,39,248,22,77,23,25,248,22,51,23,25,83,160,41,51,8,29, -39,83,160,41,52,55,39,83,160,41,53,48,39,195,250,22,252,31,2,11,6, -10,10,98,97,100,32,115,121,110,116,97,120,196,32,20,96,158,16,7,2,77, -2,80,2,82,2,84,2,92,2,94,2,96,16,22,18,98,2,102,8,104,36, -35,34,16,4,8,103,11,2,252,11,1,3,1,7,101,110,118,51,55,53,52, -252,39,1,18,16,2,95,2,151,8,105,93,8,252,118,9,95,9,8,252,118, -9,2,100,18,100,2,152,8,108,36,35,34,8,103,16,10,8,107,11,3,1, -4,103,52,54,53,252,40,1,3,1,4,103,52,54,54,252,41,1,3,1,4, -103,52,54,55,252,42,1,3,1,4,103,52,54,56,252,43,1,3,1,7,101, -110,118,51,55,54,49,252,44,1,2,252,44,1,2,252,44,1,2,252,44,1, -16,10,8,106,11,2,156,69,98,111,111,108,45,101,120,112,114,252,45,1,2, -252,9,1,2,252,10,1,3,1,7,101,110,118,51,55,54,50,252,46,1,2, -252,46,1,2,252,46,1,2,252,46,1,18,158,2,158,8,108,18,158,2,252, -6,1,8,108,18,158,2,47,8,108,18,158,2,158,8,108,18,158,76,109,97, -107,101,45,116,104,114,101,97,100,45,99,101,108,108,252,47,1,8,108,18,158, -2,158,8,108,18,158,2,113,8,108,18,16,2,103,93,158,10,8,108,8,110, -49,48,47,46,45,44,13,16,3,33,2,160,2,100,93,8,252,118,9,16,6, -8,109,11,2,174,2,175,3,1,7,101,110,118,51,55,54,56,252,48,1,2, -252,48,1,95,9,8,252,118,9,2,100,18,158,2,158,8,108,18,158,2,158, -8,108,18,158,2,158,8,108,18,158,2,0,8,108,18,158,93,158,2,51,8, -108,8,108,18,158,2,158,8,108,18,158,2,72,8,108,18,158,9,8,108,18, -158,2,158,8,108,18,158,2,158,8,108,18,158,2,158,8,108,11,16,5,93, -2,105,253,22,59,248,247,22,252,76,3,83,160,41,32,39,32,248,247,22,252, -76,3,83,160,41,33,39,32,248,247,22,252,76,3,83,160,41,34,39,32,248, -22,59,248,247,22,252,76,3,83,160,41,35,40,32,248,22,59,248,247,22,252, -76,3,83,160,41,36,40,32,10,40,20,96,158,16,0,16,5,18,158,2,35, -8,78,18,158,2,37,8,78,18,158,2,39,8,78,18,158,2,41,8,78,18, -158,2,43,8,78,11,16,5,94,2,63,2,58,27,89,162,32,33,34,62,119, -104,252,49,1,223,1,89,162,32,33,56,9,224,0,1,27,249,22,208,83,160, -41,32,36,44,197,27,28,248,80,158,36,32,194,249,80,158,37,33,248,80,158, -38,34,196,27,248,80,158,39,35,197,28,248,80,158,39,32,193,28,248,80,158, -39,36,248,80,158,40,34,194,27,248,80,158,40,35,194,28,248,80,158,40,32, -193,249,80,158,41,33,248,80,158,42,34,195,27,248,80,158,43,35,196,28,248, -80,158,43,37,193,248,80,158,43,38,193,11,11,11,11,11,28,192,27,248,22, -51,194,27,248,22,77,195,27,248,22,79,196,249,80,158,40,39,201,27,249,22, -60,197,198,27,83,160,41,33,42,44,250,22,208,83,160,41,34,45,44,250,22, -208,83,160,41,35,48,44,251,22,60,83,160,41,36,52,44,83,160,41,37,52, -44,248,22,52,204,248,22,51,204,83,160,41,38,48,44,195,27,28,248,80,158, -37,32,195,249,80,158,38,33,248,80,158,39,34,197,27,248,80,158,40,35,198, -28,248,80,158,40,32,193,27,27,248,80,158,42,34,195,28,248,80,158,42,37, -193,248,22,8,89,162,32,33,39,9,224,10,1,27,249,22,2,89,162,32,33, -44,9,224,4,5,249,80,158,35,40,28,248,80,158,36,32,197,249,80,158,37, -33,248,80,158,38,34,199,27,248,80,158,39,35,200,28,248,80,158,39,32,193, -249,80,158,40,33,248,80,158,41,34,195,248,80,158,41,36,248,80,158,42,35, -196,11,11,194,248,80,158,37,38,196,28,248,22,56,193,21,94,9,9,248,80, -158,35,41,193,11,28,192,249,80,158,42,42,194,27,248,80,158,44,35,197,28, -248,80,158,44,32,193,249,80,158,45,33,248,80,158,46,34,195,27,248,80,158, -47,35,196,28,248,80,158,47,37,193,248,80,158,47,38,193,11,11,11,11,11, -28,192,27,248,22,51,194,27,248,22,77,195,27,248,22,86,196,27,248,22,89, -197,27,248,22,88,198,27,249,22,208,83,160,41,39,44,44,28,203,83,160,41, -40,44,44,83,160,41,41,44,44,249,80,158,44,39,205,27,252,22,60,204,200, -202,203,201,27,83,160,41,42,46,44,91,159,33,11,90,161,33,32,11,83,160, -38,32,33,11,247,248,22,8,89,162,32,33,40,9,226,16,2,3,1,250,22, -31,89,162,32,32,36,9,225,6,3,7,90,161,33,33,10,247,22,252,174,2, -248,22,252,174,2,89,162,32,33,36,9,224,3,1,248,193,89,162,32,32,36, -9,224,2,3,28,248,22,252,171,2,193,248,22,252,176,2,193,249,80,158,35, -43,21,95,2,72,94,94,61,108,252,50,1,95,64,108,105,115,116,252,51,1, -95,64,99,111,110,115,252,52,1,64,112,114,101,100,252,53,1,67,104,97,110, -100,108,101,114,252,54,1,2,69,94,64,98,111,100,121,252,55,1,97,2,252, -5,1,9,2,252,9,1,2,252,10,1,2,69,95,2,72,93,94,63,98,112, -122,252,56,1,95,2,252,7,1,11,2,47,96,2,252,6,1,2,47,94,2, -252,47,1,11,93,94,67,99,97,108,108,47,101,99,252,57,1,95,2,252,5, -1,93,2,68,96,2,252,6,1,2,47,2,252,56,1,95,2,61,93,94,1, -25,99,117,114,114,101,110,116,45,101,120,99,101,112,116,105,111,110,45,104,97, -110,100,108,101,114,252,58,1,95,2,252,5,1,93,61,101,252,59,1,94,2, -68,95,2,252,5,1,9,96,2,72,64,108,111,111,112,252,60,1,93,94,2, -252,50,1,2,252,50,1,96,2,111,94,94,65,110,117,108,108,63,252,61,1, -2,252,50,1,94,65,114,97,105,115,101,252,62,1,2,252,59,1,94,94,94, -64,99,97,97,114,252,63,1,2,252,50,1,2,252,59,1,63,117,113,49,252, -64,1,94,2,177,94,2,252,60,1,94,63,99,100,114,252,65,1,2,252,50, -1,95,76,99,97,108,108,45,119,105,116,104,45,118,97,108,117,101,115,252,66, -1,2,252,55,1,95,2,252,5,1,64,97,114,103,115,252,67,1,95,2,252, -5,1,9,95,65,97,112,112,108,121,252,68,1,66,118,97,108,117,101,115,252, -69,1,2,252,67,1,83,160,41,43,35,44,89,162,32,32,8,100,9,225,6, -5,4,27,250,22,208,83,160,41,44,38,44,250,22,208,83,160,41,45,41,44, -250,22,58,83,160,41,46,44,44,250,22,208,83,160,41,47,47,44,249,22,58, -250,22,208,83,160,41,48,52,44,249,22,58,83,160,41,49,54,44,250,22,208, -83,160,41,50,57,44,249,22,50,83,160,41,51,59,44,250,22,2,89,162,33, -33,42,9,223,30,250,22,208,83,160,41,52,35,44,250,22,58,83,160,41,53, -38,44,248,22,51,200,248,22,77,200,83,160,41,54,35,44,248,22,51,23,29, -248,22,89,23,29,83,160,41,55,57,44,83,160,41,56,52,44,250,22,208,83, -160,41,57,52,44,249,22,58,83,160,41,58,54,44,250,22,208,83,160,41,59, -57,44,251,22,60,83,160,41,8,28,8,29,44,83,160,41,8,29,8,29,44, -248,22,86,23,28,248,22,88,23,28,83,160,41,8,30,57,44,83,160,41,8, -31,52,44,83,160,41,8,32,47,44,250,22,208,83,160,41,8,33,47,44,250, -22,58,83,160,41,8,34,50,44,83,160,41,8,35,50,44,250,22,208,83,160, -41,8,36,53,44,251,22,58,83,160,41,8,37,57,44,83,160,41,8,38,57, -44,83,160,41,8,39,57,44,250,22,208,83,160,41,8,40,8,28,44,248,22, -58,250,22,208,83,160,41,8,41,8,32,44,249,22,58,83,160,41,8,42,8, -34,44,250,22,208,83,160,41,8,43,8,37,44,250,22,58,83,160,41,8,44, -8,40,44,83,160,41,8,45,8,40,44,250,22,208,83,160,41,8,46,8,43, -44,251,22,58,83,160,41,8,47,8,47,44,83,160,41,8,48,8,47,44,83, -160,41,8,49,8,47,44,250,22,208,83,160,41,8,50,8,50,44,250,22,60, -83,160,41,8,51,8,53,44,250,22,208,83,160,41,8,52,8,56,44,248,22, -58,250,22,208,83,160,41,8,53,8,60,44,249,22,58,83,160,41,8,54,8, -62,44,250,22,208,83,160,41,8,55,8,65,44,250,22,58,83,160,41,8,56, -8,68,44,83,160,41,8,57,8,68,44,250,22,208,83,160,41,8,58,8,71, -44,249,22,58,83,160,41,8,59,8,73,44,250,22,208,83,160,41,8,60,8, -76,44,250,22,58,83,160,41,8,61,8,79,44,83,160,41,8,62,8,79,44, -250,22,208,83,160,41,8,63,8,82,44,251,22,58,83,160,41,8,64,8,86, -44,83,160,41,8,65,8,86,44,83,160,41,8,66,8,86,44,250,22,208,83, -160,41,8,67,8,89,44,251,22,60,83,160,41,8,68,8,93,44,83,160,41, -8,69,8,93,44,250,22,208,83,160,41,8,70,8,96,44,249,22,58,83,160, -41,8,71,8,98,44,248,22,77,23,97,83,160,41,8,72,8,96,44,83,160, -41,8,73,8,93,44,83,160,41,8,74,8,89,44,83,160,41,8,75,8,82, -44,83,160,41,8,76,8,76,44,83,160,41,8,77,8,71,44,83,160,41,8, -78,8,65,44,83,160,41,8,79,8,60,44,83,160,41,8,80,8,56,44,83, -160,41,8,81,8,53,44,83,160,41,8,82,8,50,44,83,160,41,8,83,8, -43,44,83,160,41,8,84,8,37,44,83,160,41,8,85,8,32,44,83,160,41, -8,86,8,28,44,83,160,41,8,87,53,44,83,160,41,8,88,47,44,83,160, -41,8,89,41,44,197,89,162,32,32,33,9,223,0,192,89,162,32,32,34,9, -223,3,248,22,252,174,2,208,250,22,252,31,2,11,6,10,10,98,97,100,32, -115,121,110,116,97,120,197,249,22,7,248,195,10,248,195,11,36,20,96,158,16, -12,2,77,2,80,2,82,2,84,2,88,2,92,2,94,2,96,2,218,2,219, -2,86,2,99,16,90,18,99,2,102,8,113,36,35,34,16,4,8,112,11,74, -100,105,115,97,98,108,101,45,98,114,101,97,107,63,252,70,1,3,1,7,101, -110,118,51,55,55,50,252,71,1,16,4,8,111,11,2,252,11,1,3,1,7, -101,110,118,51,55,55,51,252,72,1,18,16,2,95,2,151,8,114,93,8,252, -149,9,95,9,8,252,149,9,2,100,18,101,2,152,8,117,36,35,34,8,112, -8,111,16,8,8,116,11,3,1,4,103,52,55,52,252,73,1,3,1,4,103, -52,55,53,252,74,1,3,1,4,103,52,55,54,252,75,1,3,1,7,101,110, -118,51,55,56,48,252,76,1,2,252,76,1,2,252,76,1,16,8,8,115,11, -2,156,2,252,9,1,2,252,10,1,3,1,7,101,110,118,51,55,56,49,252, -77,1,2,252,77,1,2,252,77,1,18,158,2,158,8,117,18,158,2,72,8, -117,18,158,9,8,117,18,158,2,158,8,117,18,101,2,102,8,120,36,35,34, -8,112,8,111,16,12,8,119,11,3,1,4,103,52,54,57,252,78,1,3,1, -4,103,52,55,48,252,79,1,3,1,4,103,52,55,49,252,80,1,3,1,4, -103,52,55,50,252,81,1,3,1,4,103,52,55,51,252,82,1,3,1,7,101, -110,118,51,55,57,56,252,83,1,2,252,83,1,2,252,83,1,2,252,83,1, -2,252,83,1,16,12,8,118,11,2,156,2,252,53,1,2,252,54,1,2,252, -9,1,2,252,10,1,3,1,7,101,110,118,51,55,57,57,252,84,1,2,252, -84,1,2,252,84,1,2,252,84,1,2,252,84,1,18,158,95,158,66,98,101, -103,105,110,48,252,85,1,8,120,158,94,158,94,158,64,99,100,97,114,252,86, -1,8,120,158,2,252,50,1,8,120,8,120,158,2,252,59,1,8,120,8,120, -158,96,158,2,252,6,1,8,120,158,2,47,8,120,158,2,252,56,1,8,120, -158,93,158,2,51,8,120,8,120,8,120,8,120,18,158,96,158,2,252,6,1, -8,120,158,2,47,8,120,158,2,252,56,1,8,120,158,95,158,2,0,8,120, -158,93,158,2,51,8,120,8,120,158,94,158,94,158,2,252,86,1,8,120,158, -2,252,50,1,8,120,8,120,158,2,252,59,1,8,120,8,120,8,120,8,120, -18,16,2,95,2,151,8,121,93,8,252,158,9,95,9,8,252,158,9,2,100, -18,16,2,99,2,69,8,126,93,8,252,158,9,16,6,8,125,11,2,174,2, -175,3,1,7,101,110,118,51,56,49,55,252,87,1,2,252,87,1,16,4,8, -124,11,2,185,3,1,7,101,110,118,51,56,49,56,252,88,1,16,4,8,123, -11,2,187,3,1,7,101,110,118,51,56,49,57,252,89,1,16,4,8,122,11, -2,189,3,1,7,101,110,118,51,56,50,49,252,90,1,95,9,8,252,158,9, -2,100,18,158,2,152,8,120,18,158,2,158,8,120,18,158,2,72,8,120,18, -158,2,158,8,120,18,158,2,158,8,120,18,158,2,252,50,1,8,120,18,158, -2,158,8,120,18,158,2,252,51,1,8,120,18,158,2,158,8,120,18,158,2, -252,52,1,8,120,18,158,2,158,8,120,18,158,2,158,8,120,18,158,2,158, -8,120,18,158,2,158,8,120,18,158,2,252,55,1,8,120,18,158,2,158,8, -120,18,158,2,252,5,1,8,120,18,158,9,8,120,18,158,2,158,8,120,18, -158,2,158,8,120,18,158,2,158,8,120,18,158,2,158,8,120,18,158,2,72, -8,120,18,158,93,158,94,158,2,252,56,1,8,120,158,95,158,2,252,7,1, -8,120,158,11,8,120,158,2,47,8,120,8,120,8,120,8,120,18,158,2,158, -8,120,18,158,2,252,6,1,8,120,18,158,2,47,8,120,18,158,94,158,2, -252,47,1,8,120,158,11,8,120,8,120,18,158,2,158,8,120,18,158,2,158, -8,120,18,158,2,252,57,1,8,120,18,158,2,158,8,120,18,158,2,252,5, -1,8,120,18,158,93,158,2,68,8,120,8,120,18,158,2,158,8,120,18,158, -2,252,6,1,8,120,18,158,2,47,8,120,18,158,2,252,56,1,8,120,18, -158,2,158,8,120,18,158,2,61,8,120,18,158,2,158,8,120,18,158,2,158, -8,120,18,158,2,252,58,1,8,120,18,158,2,158,8,120,18,158,2,252,5, -1,8,120,18,158,93,158,2,252,59,1,8,120,8,120,18,158,2,158,8,120, -18,158,2,68,8,120,18,158,2,158,8,120,18,158,2,252,5,1,8,120,18, -158,9,8,120,18,158,2,158,8,120,18,158,2,72,8,120,18,158,2,252,60, -1,8,120,18,158,93,158,94,158,2,252,50,1,8,120,158,2,252,50,1,8, -120,8,120,8,120,18,158,2,158,8,120,18,158,2,111,8,120,18,158,94,158, -94,158,2,252,61,1,8,120,158,2,252,50,1,8,120,8,120,158,94,158,2, -252,62,1,8,120,158,2,252,59,1,8,120,8,120,8,120,18,158,2,158,8, -120,18,158,94,158,94,158,2,252,63,1,8,120,158,2,252,50,1,8,120,8, -120,158,2,252,59,1,8,120,8,120,18,158,2,158,8,120,18,16,2,105,93, -158,94,158,2,177,8,120,158,94,158,2,252,60,1,8,120,158,94,158,2,252, -65,1,8,120,158,2,252,50,1,8,120,8,120,8,120,8,120,8,130,49,48, -47,46,45,44,13,16,3,33,2,160,2,100,93,8,252,158,9,16,6,8,129, -11,2,174,2,175,2,252,87,1,2,252,87,1,16,4,8,128,11,2,185,2, -252,88,1,16,4,8,127,11,2,187,2,252,89,1,95,9,8,252,158,9,2, -100,18,158,2,158,8,120,18,158,2,158,8,120,18,158,2,158,8,120,18,158, -2,158,8,120,18,158,2,158,8,120,18,158,2,158,8,120,18,158,2,158,8, -120,18,16,2,158,93,158,95,158,2,252,66,1,8,120,158,2,252,55,1,8, -120,158,95,158,2,252,5,1,8,120,158,2,252,67,1,8,120,158,95,158,2, -252,5,1,8,120,158,9,8,120,158,95,158,2,252,68,1,8,120,158,2,252, -69,1,8,120,158,2,252,67,1,8,120,8,120,8,120,8,120,8,120,8,130, -95,9,8,252,158,9,2,100,18,158,2,158,8,120,18,158,2,158,8,120,18, -158,2,158,8,120,18,158,2,158,8,120,18,158,2,158,8,120,18,158,2,158, -8,120,18,158,2,158,8,120,18,158,2,158,8,120,11,16,5,93,2,59,89, -162,32,33,58,9,223,0,27,249,22,208,83,160,41,32,35,46,196,27,28,248, +62,2,63,38,50,106,16,5,93,69,99,97,115,101,45,116,101,115,116,64,89, +162,32,33,57,9,223,0,27,249,22,208,83,160,41,32,35,40,196,27,28,248, 80,158,35,32,194,249,80,158,36,33,248,80,158,37,34,196,27,248,80,158,38, -35,197,28,248,80,158,38,32,193,28,248,80,158,38,36,248,80,158,39,34,194, -27,248,80,158,39,35,194,28,248,80,158,39,32,193,27,248,80,158,40,34,194, -28,192,249,80,158,41,37,194,248,80,158,42,36,248,80,158,43,35,197,11,11, -11,11,11,28,192,27,248,22,51,194,27,248,22,52,195,27,83,160,41,33,37, -46,250,22,208,83,160,41,34,40,46,250,22,208,83,160,41,35,43,46,250,22, -60,83,160,41,36,46,46,250,22,208,83,160,41,37,49,46,248,22,58,250,22, -208,83,160,41,38,53,46,249,22,58,83,160,41,39,55,46,23,19,83,160,41, -40,53,46,83,160,41,41,49,46,83,160,41,42,46,46,83,160,41,43,43,46, -195,27,89,162,32,32,51,2,76,225,3,4,2,27,89,162,32,32,36,2,76, -223,1,250,22,252,31,2,11,6,10,10,98,97,100,32,115,121,110,116,97,120, -195,27,28,248,80,158,37,32,195,249,80,158,38,33,248,80,158,39,34,197,27, -248,80,158,40,35,198,28,248,80,158,40,32,193,27,27,248,80,158,42,34,195, -28,248,80,158,42,38,193,248,22,58,248,80,158,43,39,194,11,28,192,249,80, -158,42,37,194,27,248,80,158,44,35,197,28,248,80,158,44,32,193,27,248,80, -158,45,34,194,28,192,249,80,158,46,37,194,248,80,158,47,36,248,80,158,48, -35,197,11,11,11,11,11,28,192,27,248,22,51,194,27,248,22,77,195,27,248, -22,79,196,28,27,248,80,158,41,39,27,83,160,41,44,42,46,250,22,208,83, -160,41,45,45,46,199,195,87,94,249,22,3,89,162,32,33,39,9,224,10,9, -28,248,80,158,34,40,195,12,251,22,252,31,2,11,6,17,17,110,111,116,32, -97,110,32,105,100,101,110,116,105,102,105,101,114,196,198,194,27,248,80,158,42, -41,194,28,192,251,22,252,31,2,11,6,20,20,100,117,112,108,105,99,97,116, -101,32,105,100,101,110,116,105,102,105,101,114,204,196,12,27,249,22,208,83,160, -41,46,42,46,248,80,158,43,42,27,83,160,41,47,44,46,250,22,208,83,160, -41,48,47,46,201,195,27,28,248,80,158,42,38,194,248,80,158,42,39,194,11, -28,192,249,80,158,43,43,202,27,250,22,60,200,198,201,27,83,160,41,49,45, -46,91,159,33,11,90,161,33,32,11,83,160,38,32,33,11,247,248,22,8,89, -162,32,33,40,9,226,15,2,3,1,250,22,31,89,162,32,32,36,9,225,6, -3,7,90,161,33,33,10,247,22,252,174,2,248,22,252,174,2,89,162,32,33, -36,9,224,3,1,248,193,89,162,32,32,36,9,224,2,3,28,248,22,252,171, -2,193,248,22,252,176,2,193,249,80,158,35,44,21,96,70,108,101,116,45,118, -97,108,117,101,115,252,91,1,93,94,94,64,116,101,109,112,252,92,1,2,69, -2,252,10,1,95,64,115,101,116,33,252,93,1,62,105,100,252,94,1,2,252, -92,1,2,69,83,160,41,50,35,46,89,162,32,32,55,9,225,6,5,4,27, -250,22,208,83,160,41,51,38,46,250,22,208,83,160,41,52,41,46,250,22,60, -83,160,41,53,44,46,250,22,208,83,160,41,54,47,46,248,22,58,250,22,208, -83,160,41,55,51,46,249,22,58,248,22,77,23,20,248,22,51,23,20,83,160, -41,56,51,46,83,160,41,57,47,46,250,22,2,89,162,33,33,42,9,223,15, -250,22,208,83,160,41,58,35,46,250,22,58,83,160,41,59,38,46,248,22,51, -200,248,22,77,200,83,160,41,8,28,35,46,248,22,79,206,248,22,77,206,83, -160,41,8,29,41,46,197,89,162,32,32,33,9,223,0,192,89,162,32,32,34, -9,223,3,248,22,252,174,2,208,248,80,158,42,45,83,160,41,8,30,42,46, -247,196,247,193,27,28,248,80,158,37,32,196,249,80,158,38,33,248,80,158,39, -34,198,27,248,80,158,40,35,199,28,248,80,158,40,32,193,27,27,248,80,158, -42,34,195,28,248,80,158,42,32,193,249,80,158,43,33,248,80,158,44,34,195, -248,80,158,44,36,248,80,158,45,35,196,11,28,192,249,80,158,42,37,194,27, -248,80,158,44,35,197,28,248,80,158,44,32,193,27,248,80,158,45,34,194,28, -192,249,80,158,46,37,194,248,80,158,47,36,248,80,158,48,35,197,11,11,11, -11,11,28,192,27,248,22,51,194,27,248,22,77,195,27,248,22,79,196,28,248, -80,158,40,40,194,27,249,22,60,195,196,27,83,160,41,8,31,41,46,250,22, -208,83,160,41,8,32,44,46,250,22,208,83,160,41,8,33,47,46,250,22,58, -83,160,41,8,34,50,46,248,22,52,203,248,22,51,203,83,160,41,8,35,47, -46,195,247,196,247,193,32,20,96,158,16,14,2,77,2,80,2,82,2,84,2, -88,2,86,2,92,2,94,2,90,30,252,95,1,2,129,2,139,0,30,252,96, -1,2,125,2,141,0,2,96,2,99,2,220,16,36,18,98,2,102,8,132,36, -35,34,16,4,8,131,11,2,252,11,1,3,1,7,101,110,118,51,56,51,48, -252,97,1,18,16,2,95,2,151,8,133,93,8,252,182,9,95,9,8,252,182, -9,2,100,18,100,2,152,8,136,36,35,34,8,131,16,6,8,135,11,3,1, -4,103,52,56,54,252,98,1,3,1,4,103,52,56,55,252,99,1,3,1,7, -101,110,118,51,56,51,55,252,100,1,2,252,100,1,16,6,8,134,11,2,156, -2,252,10,1,3,1,7,101,110,118,51,56,51,56,252,101,1,2,252,101,1, -18,158,2,158,8,136,18,158,2,252,91,1,8,136,18,158,2,158,8,136,18, -158,2,158,8,136,18,158,9,8,136,18,158,2,158,8,136,18,158,2,158,8, -136,18,16,2,103,93,158,93,158,64,118,111,105,100,252,102,1,8,136,8,136, -8,138,49,48,47,46,45,44,13,16,3,33,2,160,2,100,93,8,252,182,9, -16,6,8,137,11,2,174,2,175,3,1,7,101,110,118,51,56,52,50,252,103, -1,2,252,103,1,95,9,8,252,182,9,2,100,18,158,2,158,8,136,18,16, -2,95,2,151,8,139,93,8,252,183,9,95,9,8,252,183,9,2,100,18,100, -2,152,8,142,36,35,34,8,131,16,8,8,141,11,3,1,4,103,52,56,48, -252,104,1,3,1,4,103,52,56,49,252,105,1,3,1,4,103,52,56,50,252, -106,1,3,1,7,101,110,118,51,56,53,52,252,107,1,2,252,107,1,2,252, -107,1,16,8,8,140,11,2,156,2,252,94,1,2,252,10,1,3,1,7,101, -110,118,51,56,53,53,252,108,1,2,252,108,1,2,252,108,1,18,158,2,102, -8,142,18,16,2,95,2,151,8,143,93,8,252,187,9,95,9,8,252,187,9, -2,100,18,158,2,152,8,142,18,16,2,95,2,151,8,144,93,8,252,190,9, -95,9,8,252,190,9,2,100,18,16,2,99,2,69,8,149,93,8,252,190,9, -16,6,8,148,11,2,174,2,175,3,1,7,101,110,118,51,56,55,50,252,109, -1,2,252,109,1,16,4,8,147,11,2,185,3,1,7,101,110,118,51,56,55, -51,252,110,1,16,4,8,146,11,2,187,3,1,7,101,110,118,51,56,55,52, -252,111,1,16,4,8,145,11,2,189,3,1,7,101,110,118,51,56,55,54,252, -112,1,95,9,8,252,190,9,2,100,18,102,2,152,8,154,36,35,34,8,131, -16,8,8,153,11,2,252,104,1,2,252,105,1,2,252,106,1,2,252,107,1, -2,252,107,1,2,252,107,1,16,8,8,152,11,2,156,2,252,94,1,2,252, -10,1,2,252,108,1,2,252,108,1,2,252,108,1,16,4,8,151,11,3,1, -4,103,52,57,48,252,113,1,3,1,7,101,110,118,51,56,54,56,252,114,1, -16,4,8,150,11,2,252,92,1,3,1,7,101,110,118,51,56,54,57,252,115, -1,18,158,2,158,8,154,18,158,2,252,91,1,8,154,18,158,2,158,8,154, -18,158,2,158,8,154,18,158,2,158,8,154,18,158,2,158,8,154,18,158,2, -158,8,154,18,158,2,252,93,1,8,154,18,158,2,158,8,154,18,158,2,158, -8,154,18,16,2,158,94,98,2,252,92,1,8,158,93,8,252,186,9,16,4, -8,157,11,3,1,8,119,115,116,109,112,52,56,56,252,116,1,3,1,7,101, -110,118,51,56,54,51,252,117,1,16,4,8,156,11,3,1,4,103,52,56,57, -252,118,1,3,1,7,101,110,118,51,56,56,53,252,119,1,16,4,8,155,11, -2,252,253,0,3,1,7,101,110,118,51,56,56,54,252,120,1,158,2,69,8, -158,8,158,95,9,8,252,186,9,2,125,18,16,2,95,2,151,8,159,93,8, -252,193,9,95,9,8,252,193,9,2,100,18,100,2,152,8,162,36,35,34,8, -131,16,8,8,161,11,3,1,4,103,52,56,51,252,121,1,3,1,4,103,52, -56,52,252,122,1,3,1,4,103,52,56,53,252,123,1,3,1,7,101,110,118, -51,56,57,53,252,124,1,2,252,124,1,2,252,124,1,16,8,8,160,11,2, -156,2,252,94,1,2,252,10,1,3,1,7,101,110,118,51,56,57,54,252,125, -1,2,252,125,1,2,252,125,1,18,158,2,158,8,162,18,158,2,252,93,1, -8,162,18,158,2,158,8,162,11,16,5,93,2,62,89,162,32,33,8,32,9, -223,0,27,249,22,208,83,160,41,32,35,39,196,27,28,248,80,158,35,32,194, +35,197,28,248,80,158,38,32,193,249,80,158,39,33,248,80,158,40,34,195,27, +248,80,158,41,35,196,28,248,80,158,41,32,193,27,27,248,80,158,43,34,195, +28,248,80,158,43,32,193,27,248,80,158,44,34,194,28,192,249,80,158,45,36, +194,248,80,158,46,37,248,80,158,47,35,197,11,11,28,192,249,80,158,43,36, +194,248,80,158,44,37,248,80,158,45,35,197,11,11,11,11,28,192,27,248,22, +51,194,27,248,22,77,195,27,248,22,79,196,28,248,22,40,248,22,209,194,27, +249,22,60,195,196,27,83,160,41,33,39,40,250,22,208,83,160,41,34,42,40, +250,22,208,83,160,41,35,45,40,250,22,58,83,160,41,36,48,40,248,22,52, +203,250,22,208,83,160,41,37,51,40,249,22,58,83,160,41,38,53,40,248,22, +51,23,16,83,160,41,39,51,40,83,160,41,40,45,40,195,27,249,22,60,195, +196,27,83,160,41,41,39,40,250,22,208,83,160,41,42,42,40,250,22,208,83, +160,41,43,45,40,250,22,58,83,160,41,44,48,40,248,22,52,203,250,22,208, +83,160,41,45,51,40,249,22,58,83,160,41,46,53,40,248,22,51,23,16,83, +160,41,47,51,40,83,160,41,48,45,40,195,27,28,248,80,158,36,32,195,249, +80,158,37,33,248,80,158,38,34,197,27,248,80,158,39,35,198,28,248,80,158, +39,32,193,249,80,158,40,33,248,80,158,41,34,195,27,248,80,158,42,35,196, +28,248,80,158,42,32,193,27,27,248,80,158,44,34,195,28,248,80,158,44,38, +193,248,80,158,44,39,193,11,28,192,249,80,158,44,36,194,248,80,158,45,37, +248,80,158,46,35,197,11,11,11,11,28,192,27,248,22,51,194,27,248,22,77, +195,27,248,22,79,196,27,249,22,60,195,196,27,83,160,41,49,40,40,250,22, +208,83,160,41,50,43,40,250,22,208,83,160,41,51,46,40,250,22,58,83,160, +41,52,49,40,248,22,52,203,250,22,208,83,160,41,53,52,40,249,22,58,83, +160,41,54,54,40,248,22,51,23,16,83,160,41,55,52,40,83,160,41,56,46, +40,195,250,22,252,32,2,11,6,10,10,98,97,100,32,115,121,110,116,97,120, +197,32,20,97,158,16,8,30,65,65,35,37,115,116,120,66,69,115,116,120,45, +112,97,105,114,63,67,11,30,68,2,66,67,99,111,110,115,47,35,102,69,1, +30,70,2,66,67,115,116,120,45,99,97,114,71,5,30,72,2,66,67,115,116, +120,45,99,100,114,73,6,30,74,2,66,69,97,112,112,101,110,100,47,35,102, +75,0,30,76,2,66,71,115,116,120,45,110,117,108,108,47,35,102,77,9,30, +78,2,66,69,115,116,120,45,108,105,115,116,63,79,8,30,80,2,66,69,115, +116,120,45,62,108,105,115,116,81,4,16,25,18,98,64,104,101,114,101,82,38, +97,36,10,32,11,16,106,2,54,2,2,2,29,2,2,2,58,2,2,2,59, +2,2,67,112,114,111,109,105,115,101,83,2,2,2,45,2,2,2,25,2,2, +2,63,2,2,2,53,2,2,2,35,2,2,74,45,100,101,102,105,110,101,45, +115,121,110,116,97,120,84,74,35,37,100,101,102,105,110,101,45,101,116,45,97, +108,85,2,64,2,2,2,27,2,2,67,45,100,101,102,105,110,101,86,2,85, +2,8,2,2,2,37,2,2,2,31,2,2,2,10,2,2,2,14,2,2,2, +33,2,2,2,41,2,2,64,99,111,110,100,87,66,35,37,99,111,110,100,88, +2,55,2,2,2,4,2,2,63,97,110,100,89,71,35,37,113,113,45,97,110, +100,45,111,114,90,64,119,104,101,110,91,2,85,2,62,2,2,77,100,101,102, +105,110,101,45,102,111,114,45,115,121,110,116,97,120,92,68,35,37,100,101,102, +105,110,101,93,66,117,110,108,101,115,115,94,2,85,2,60,2,2,66,108,101, +116,47,101,99,95,2,85,2,49,2,2,2,47,2,18,76,98,101,103,105,110, +45,102,111,114,45,115,121,110,116,97,120,96,2,93,2,43,2,2,62,111,114, +97,2,90,2,39,2,2,2,61,2,2,70,113,117,97,115,105,113,117,111,116, +101,98,2,90,2,6,2,2,73,100,101,102,105,110,101,45,115,121,110,116,97, +120,99,2,93,2,52,2,2,2,56,2,2,66,100,101,102,105,110,101,100,2, +93,73,100,101,102,105,110,101,45,115,116,114,117,99,116,101,2,85,1,22,98, +114,101,97,107,45,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111,110, +102,2,2,2,51,2,18,2,57,2,2,2,21,2,18,2,16,2,2,2,12, +2,2,2,19,2,18,2,23,2,2,97,35,10,33,11,16,86,70,108,101,116, +45,115,121,110,116,97,120,103,76,35,37,115,116,120,99,97,115,101,45,115,99, +104,101,109,101,104,66,115,121,110,116,97,120,105,69,35,37,115,116,120,99,97, +115,101,106,2,89,2,90,71,115,116,120,45,118,101,99,116,111,114,63,107,2, +66,72,108,101,116,45,115,121,110,116,97,120,101,115,108,2,104,2,97,2,90, +70,115,121,110,116,97,120,47,108,111,99,109,68,35,37,115,116,120,108,111,99, +110,2,71,2,66,2,75,2,66,77,117,110,115,121,110,116,97,120,45,115,112, +108,105,99,105,110,103,111,67,35,37,113,113,115,116,120,112,75,108,101,116,114, +101,99,45,115,121,110,116,97,120,101,115,113,2,104,2,73,2,66,70,115,116, +120,45,114,111,116,97,116,101,114,2,66,74,115,116,120,45,118,101,99,116,111, +114,45,114,101,102,115,2,66,2,69,2,66,2,86,2,85,71,115,116,120,45, +114,111,116,97,116,101,42,116,2,66,73,115,116,120,45,99,104,101,99,107,47, +101,115,99,117,2,66,75,115,121,110,116,97,120,45,105,100,45,114,117,108,101, +115,118,2,104,1,26,99,104,101,99,107,45,100,117,112,108,105,99,97,116,101, +45,105,100,101,110,116,105,102,105,101,114,119,2,104,75,113,117,97,115,105,115, +121,110,116,97,120,47,108,111,99,120,2,112,2,91,2,85,74,115,112,108,105, +116,45,115,116,120,45,108,105,115,116,121,2,66,72,115,121,110,116,97,120,45, +114,117,108,101,115,122,2,104,71,105,100,101,110,116,105,102,105,101,114,63,123, +2,66,2,67,2,66,68,117,110,115,121,110,116,97,120,124,2,112,69,115,116, +120,45,110,117,108,108,63,125,2,66,2,98,2,90,2,101,2,85,2,77,2, +66,2,94,2,85,72,115,121,110,116,97,120,45,99,97,115,101,42,126,2,110, +2,95,2,85,71,119,105,116,104,45,115,121,110,116,97,120,127,70,35,37,119, +105,116,104,45,115,116,120,128,71,113,117,97,115,105,115,121,110,116,97,120,129, +2,112,71,115,121,110,116,97,120,45,99,97,115,101,130,2,110,2,84,2,85, +2,79,2,66,2,81,2,66,2,87,2,88,73,108,101,116,114,101,99,45,115, +121,110,116,97,120,131,2,104,1,20,103,101,110,101,114,97,116,101,45,116,101, +109,112,111,114,97,114,105,101,115,132,2,128,96,34,8,254,1,11,16,0,16, +4,33,11,61,120,133,3,1,7,101,110,118,51,52,56,48,134,18,16,2,95, +66,115,114,99,116,97,103,135,39,93,8,252,12,9,95,9,8,252,12,9,2, +106,18,100,64,100,101,115,116,136,42,36,35,34,33,16,8,41,11,3,1,4, +103,52,49,55,137,3,1,4,103,52,49,56,138,3,1,4,103,52,49,57,139, +3,1,7,101,110,118,51,52,56,57,140,2,140,2,140,16,6,40,11,61,95, +141,61,107,142,3,1,7,101,110,118,51,52,57,48,143,2,143,18,158,63,99, +116,120,144,42,18,158,63,101,113,63,145,42,18,158,2,144,42,18,158,65,113, +117,111,116,101,146,42,18,158,2,144,42,18,158,2,144,42,18,16,2,95,2, +135,43,93,8,252,13,9,95,9,8,252,13,9,2,106,18,158,2,136,42,18, +158,2,144,42,18,158,64,101,113,118,63,147,42,18,158,2,144,42,18,158,2, +146,42,18,158,2,144,42,18,158,2,144,42,18,16,2,95,2,135,44,93,8, +252,14,9,95,9,8,252,14,9,2,106,18,100,2,136,47,36,35,34,33,16, +8,46,11,3,1,4,103,52,49,52,148,3,1,4,103,52,49,53,149,3,1, +4,103,52,49,54,150,3,1,7,101,110,118,51,53,48,50,151,2,151,2,151, +16,6,45,11,2,141,2,142,3,1,7,101,110,118,51,53,48,51,152,2,152, +18,158,2,144,47,18,158,64,109,101,109,118,153,47,18,158,2,144,47,18,158, +2,146,47,18,158,2,144,47,18,158,2,144,47,11,16,5,93,2,57,89,162, +32,33,8,28,9,223,0,27,249,22,208,83,160,41,32,35,43,196,27,28,248, +80,158,35,32,194,249,80,158,36,33,248,80,158,37,34,196,27,248,80,158,38, +35,197,28,248,80,158,38,32,193,27,248,80,158,39,34,194,28,192,249,80,158, +40,36,194,248,80,158,41,37,248,80,158,42,35,197,11,11,11,28,192,27,248, +22,51,194,27,248,22,52,195,27,83,160,41,33,37,43,250,22,208,83,160,41, +34,40,43,250,22,208,83,160,41,35,43,43,250,22,60,83,160,41,36,46,43, +202,83,160,41,37,46,43,83,160,41,38,43,43,195,27,28,248,80,158,36,32, +195,249,80,158,37,33,248,80,158,38,34,197,27,248,80,158,39,35,198,28,248, +80,158,39,32,193,249,80,158,40,33,248,80,158,41,34,195,27,248,80,158,42, +35,196,28,248,80,158,42,32,193,27,27,248,80,158,44,34,195,28,248,80,158, +44,32,193,28,27,248,80,158,45,34,194,28,248,80,158,45,38,193,28,249,22, +222,194,83,160,41,39,46,43,9,11,11,27,248,80,158,45,35,194,28,248,80, +158,45,32,193,249,80,158,46,33,248,80,158,47,34,195,27,248,80,158,48,35, +196,28,248,80,158,48,39,193,248,80,158,48,40,193,11,11,11,11,28,192,249, +80,158,44,36,194,248,80,158,45,37,248,80,158,46,35,197,11,11,11,11,28, +192,27,248,22,51,194,27,248,22,77,195,27,248,22,86,196,27,248,22,87,197, +249,80,158,41,41,202,27,250,22,60,198,199,200,27,83,160,41,40,43,43,250, +22,208,83,160,41,41,46,43,250,22,208,83,160,41,42,49,43,251,22,60,83, +160,41,43,53,43,248,22,79,204,248,22,77,204,248,22,51,204,83,160,41,44, +49,43,195,27,28,248,80,158,37,32,196,249,80,158,38,33,248,80,158,39,34, +198,27,248,80,158,40,35,199,28,248,80,158,40,32,193,249,80,158,41,33,248, +80,158,42,34,195,27,248,80,158,43,35,196,28,248,80,158,43,32,193,27,27, +248,80,158,45,34,195,28,248,80,158,45,32,193,27,27,248,80,158,47,34,195, +28,248,80,158,47,39,193,248,22,58,248,80,158,48,40,194,11,28,192,249,80, +158,47,36,194,27,248,80,158,49,35,197,28,248,80,158,49,32,193,249,80,158, +50,33,248,80,158,51,34,195,27,248,80,158,52,35,196,28,248,80,158,52,39, +193,248,80,158,52,40,193,11,11,11,11,28,192,249,80,158,45,36,194,248,80, +158,46,37,248,80,158,47,35,197,11,11,11,11,28,192,27,248,22,51,194,27, +248,22,77,195,27,248,22,86,196,27,248,22,89,197,27,248,22,88,198,249,80, +158,43,41,204,27,251,22,60,202,201,200,199,27,83,160,41,45,45,43,91,159, +33,11,90,161,33,32,11,83,160,38,32,33,11,247,248,22,8,89,162,32,33, +40,9,226,15,2,3,1,250,22,31,89,162,32,32,36,9,225,6,3,7,90, +161,33,33,10,247,22,252,175,2,248,22,252,175,2,89,162,32,33,36,9,224, +3,1,248,193,89,162,32,32,36,9,224,2,3,28,248,22,252,172,2,193,248, +22,252,177,2,193,249,80,158,35,42,21,95,62,105,102,154,95,2,64,61,118, +155,94,2,142,63,46,46,46,156,96,2,0,62,101,49,157,62,101,50,158,2, +156,83,160,41,46,35,43,89,162,32,32,52,9,225,6,5,4,27,250,22,208, +83,160,41,47,38,43,250,22,208,83,160,41,48,41,43,250,22,58,83,160,41, +49,44,43,250,22,208,83,160,41,50,47,43,250,22,58,83,160,41,51,50,43, +248,22,51,23,17,248,22,77,23,17,83,160,41,52,47,43,250,22,208,83,160, +41,53,47,43,250,22,60,83,160,41,54,50,43,248,22,86,23,17,248,22,87, +23,17,83,160,41,55,47,43,83,160,41,56,41,43,197,89,162,32,32,33,9, +223,0,192,89,162,32,32,34,9,223,3,248,22,252,175,2,208,27,28,248,80, +158,38,32,197,249,80,158,39,33,248,80,158,40,34,199,27,248,80,158,41,35, +200,28,248,80,158,41,32,193,249,80,158,42,33,248,80,158,43,34,195,27,248, +80,158,44,35,196,28,248,80,158,44,32,193,27,27,248,80,158,46,34,195,28, +248,80,158,46,32,193,27,27,248,80,158,48,34,195,28,248,80,158,48,39,193, +248,22,58,248,80,158,49,40,194,11,28,192,249,80,158,48,36,194,27,248,80, +158,50,35,197,28,248,80,158,50,32,193,249,80,158,51,33,248,80,158,52,34, +195,27,248,80,158,53,35,196,28,248,80,158,53,39,193,248,22,58,248,80,158, +54,40,194,11,11,11,11,28,192,249,80,158,46,36,194,27,248,80,158,48,35, +197,28,248,80,158,48,32,193,249,80,158,49,33,248,80,158,50,34,195,27,248, +80,158,51,35,196,28,248,80,158,51,39,193,248,80,158,51,40,193,11,11,11, +11,11,11,28,192,27,248,22,51,194,27,248,22,77,195,27,248,22,86,196,27, +248,22,89,197,27,249,22,69,199,36,27,249,22,69,200,37,27,249,22,68,201, +38,249,80,158,46,41,23,15,27,253,22,60,206,201,203,202,205,204,27,83,160, +41,57,48,43,91,159,33,11,90,161,33,32,11,83,160,38,32,33,11,247,248, +22,8,89,162,32,33,40,9,226,18,2,3,1,250,22,31,89,162,32,32,36, +9,225,6,3,7,90,161,33,33,10,247,22,252,175,2,248,22,252,175,2,89, +162,32,33,36,9,224,3,1,248,193,89,162,32,32,36,9,224,2,3,28,248, +22,252,172,2,193,248,22,252,177,2,193,249,80,158,35,42,21,95,63,108,101, +116,159,93,94,2,133,2,155,96,2,154,95,2,64,2,133,94,2,142,2,156, +96,2,0,2,157,2,158,2,156,97,2,57,2,133,62,99,49,160,62,99,50, +161,2,156,83,160,41,58,35,43,89,162,32,32,8,28,9,225,6,5,4,27, +250,22,208,83,160,41,59,38,43,250,22,208,83,160,41,8,28,41,43,250,22, +58,83,160,41,8,29,44,43,250,22,208,83,160,41,8,30,47,43,248,22,58, +250,22,208,83,160,41,8,31,51,43,249,22,58,83,160,41,8,32,53,43,248, +22,51,23,20,83,160,41,8,33,51,43,83,160,41,8,34,47,43,250,22,208, +83,160,41,8,35,47,43,251,22,58,83,160,41,8,36,51,43,250,22,208,83, +160,41,8,37,54,43,250,22,58,83,160,41,8,38,57,43,83,160,41,8,39, +57,43,249,22,69,23,25,36,83,160,41,8,40,54,43,250,22,208,83,160,41, +8,41,54,43,250,22,60,83,160,41,8,42,57,43,249,22,68,23,25,37,248, +22,86,23,24,83,160,41,8,43,54,43,250,22,208,83,160,41,8,44,54,43, +251,22,60,83,160,41,8,45,58,43,83,160,41,8,46,58,43,248,22,89,23, +25,248,22,77,23,25,83,160,41,8,47,54,43,83,160,41,8,48,47,43,83, +160,41,8,49,41,43,197,89,162,32,32,33,9,223,0,192,89,162,32,32,34, +9,223,3,248,22,252,175,2,208,27,28,248,80,158,39,32,198,249,80,158,40, +33,248,80,158,41,34,200,27,248,80,158,42,35,201,28,248,80,158,42,32,193, +27,28,248,22,205,194,193,201,249,80,158,44,33,248,80,158,45,34,196,27,248, +80,158,46,35,197,28,248,80,158,46,32,193,27,28,248,22,205,194,193,196,27, +27,248,80,158,49,34,196,28,248,80,158,49,32,193,249,80,158,50,33,248,80, +158,51,34,195,27,248,80,158,52,35,196,28,248,80,158,52,32,193,249,80,158, +53,33,248,80,158,54,34,195,27,248,80,158,55,35,196,28,248,80,158,55,39, +193,248,22,58,248,80,158,56,40,194,11,11,11,28,192,249,80,158,49,36,194, +27,248,80,158,51,35,198,250,22,208,199,195,199,11,11,11,11,28,192,27,248, +22,51,194,27,248,22,77,195,27,248,22,86,196,27,248,22,89,197,27,249,22, +69,199,36,27,249,22,68,200,37,251,22,252,32,2,11,6,33,33,98,97,100, +32,115,121,110,116,97,120,32,40,110,111,116,32,97,32,100,97,116,117,109,32, +115,101,113,117,101,110,99,101,41,23,17,199,27,28,248,80,158,40,32,199,249, +80,158,41,33,248,80,158,42,34,201,27,248,80,158,43,35,202,28,248,80,158, +43,32,193,27,28,248,22,205,194,193,202,249,80,158,45,33,248,80,158,46,34, +196,27,248,80,158,47,35,197,28,248,80,158,47,32,193,27,28,248,22,205,194, +193,196,249,80,158,49,33,248,80,158,50,34,196,27,248,80,158,51,35,197,250, +22,208,198,195,198,11,11,11,28,192,27,248,22,51,194,27,248,22,77,195,27, +248,22,86,196,27,248,22,87,197,251,22,252,32,2,11,6,52,52,98,97,100, +32,115,121,110,116,97,120,32,40,109,105,115,115,105,110,103,32,101,120,112,114, +101,115,115,105,111,110,32,97,102,116,101,114,32,100,97,116,117,109,32,115,101, +113,117,101,110,99,101,41,23,16,197,27,89,162,32,32,36,68,116,114,121,45, +110,101,120,116,162,223,7,250,22,252,32,2,11,6,10,10,98,97,100,32,115, +121,110,116,97,120,195,27,28,248,80,158,42,32,201,249,80,158,43,33,248,80, +158,44,34,203,27,248,80,158,45,35,204,250,22,208,206,195,206,11,28,192,27, +248,22,51,194,27,248,22,52,195,28,248,22,56,248,22,209,194,247,195,250,22, +252,32,2,11,6,31,31,98,97,100,32,115,121,110,116,97,120,32,40,105,108, +108,101,103,97,108,32,117,115,101,32,111,102,32,96,46,39,41,23,15,247,193, +32,20,97,158,16,11,2,65,2,68,2,70,2,72,2,74,2,76,30,163,2, +66,2,123,2,2,78,2,80,30,164,2,110,68,114,101,108,111,99,97,116,101, +165,1,30,166,2,106,1,20,101,108,108,105,112,115,105,115,45,99,111,117,110, +116,45,101,114,114,111,114,167,0,16,50,18,98,2,82,49,36,35,34,16,4, +48,11,2,133,3,1,7,101,110,118,51,53,49,48,168,18,16,2,95,2,135, +50,93,8,252,59,9,95,9,8,252,59,9,2,106,18,100,2,136,53,36,35, +34,48,16,6,52,11,3,1,4,103,52,52,56,169,3,1,4,103,52,52,57, +170,3,1,7,101,110,118,51,53,49,54,171,2,171,16,6,51,11,2,141,2, +155,3,1,7,101,110,118,51,53,49,55,172,2,172,18,158,2,144,53,18,158, +2,0,53,18,16,2,103,93,158,93,158,2,87,53,53,8,29,97,8,28,10, +32,11,16,58,2,105,29,173,11,11,2,89,2,90,2,107,2,66,2,97,2, +90,2,71,2,66,2,75,2,66,2,87,2,88,2,73,2,66,2,114,2,66, +2,115,2,66,2,69,2,66,2,86,2,85,2,116,2,66,2,117,2,66,2, +167,2,173,2,91,2,85,2,121,2,66,2,123,2,66,2,67,2,66,2,125, +2,66,2,98,2,90,2,101,2,85,2,77,2,66,2,94,2,85,2,95,2, +85,73,115,121,110,116,97,120,45,99,97,115,101,42,42,174,2,173,2,84,2, +85,2,79,2,66,2,81,2,66,97,59,10,33,11,16,70,2,89,2,90,2, +107,2,66,2,97,2,90,2,71,2,66,2,75,2,66,2,87,2,88,2,73, +2,66,2,114,2,66,2,115,2,66,2,69,2,66,2,86,2,85,2,116,2, +66,2,117,2,66,1,20,115,121,110,116,97,120,45,109,97,112,112,105,110,103, +45,100,101,112,116,104,175,64,35,37,115,99,176,72,110,111,45,101,108,108,105, +112,115,101,115,63,177,2,176,2,91,2,85,2,121,2,66,2,123,2,66,2, +67,2,66,2,125,2,66,75,115,121,110,116,97,120,45,109,97,112,112,105,110, +103,63,178,2,176,2,98,2,90,2,101,2,85,2,77,2,66,2,94,2,85, +74,103,101,116,45,109,97,116,99,104,45,118,97,114,115,179,2,176,72,109,97, +107,101,45,112,101,120,112,97,110,100,180,2,176,2,95,2,85,1,21,115,121, +110,116,97,120,45,109,97,112,112,105,110,103,45,118,97,108,118,97,114,181,2, +176,2,84,2,85,2,79,2,66,74,109,97,107,101,45,109,97,116,99,104,38, +101,110,118,182,2,176,2,81,2,66,72,115,116,120,45,109,101,109,113,45,112, +111,115,183,2,176,79,109,97,107,101,45,115,121,110,116,97,120,45,109,97,112, +112,105,110,103,184,2,176,96,58,8,254,1,11,16,0,16,4,57,11,2,133, +3,1,6,101,110,118,51,56,48,185,16,4,56,11,68,104,101,114,101,45,115, +116,120,186,3,1,6,101,110,118,51,56,50,187,16,4,55,11,2,186,2,187, +13,16,3,33,2,173,2,106,93,8,252,59,9,16,6,54,11,61,114,188,63, +115,114,99,189,3,1,7,101,110,118,51,53,50,49,190,2,190,95,9,8,252, +59,9,2,106,18,158,2,144,53,18,158,64,101,108,115,101,191,49,18,16,2, +95,2,135,8,30,93,8,252,61,9,95,9,8,252,61,9,2,106,18,100,2, +136,8,33,36,35,34,48,16,10,8,32,11,3,1,4,103,52,52,52,192,3, +1,4,103,52,52,53,193,3,1,4,103,52,52,54,194,3,1,4,103,52,52, +55,195,3,1,7,101,110,118,51,53,51,49,196,2,196,2,196,2,196,16,10, +8,31,11,2,141,2,155,2,157,2,158,3,1,7,101,110,118,51,53,51,50, +197,2,197,2,197,2,197,18,158,2,144,8,33,18,158,2,0,8,33,18,158, +2,144,8,33,18,16,2,95,2,135,8,34,93,8,252,63,9,95,9,8,252, +63,9,2,106,18,16,2,99,2,156,8,39,93,8,252,63,9,16,6,8,38, +11,2,188,2,189,3,1,7,101,110,118,51,53,53,55,198,2,198,16,4,8, +37,11,64,101,120,110,104,199,3,1,7,101,110,118,51,53,53,56,200,16,4, +8,36,11,63,101,115,99,201,3,1,7,101,110,118,51,53,53,57,202,16,4, +8,35,11,63,101,120,110,203,3,1,7,101,110,118,51,53,54,49,204,95,9, +8,252,63,9,2,106,18,100,2,136,8,42,36,35,34,48,16,12,8,41,11, +3,1,4,103,52,51,57,205,3,1,4,103,52,52,48,206,3,1,4,103,52, +52,49,207,3,1,4,103,52,52,50,208,3,1,4,103,52,52,51,209,3,1, +7,101,110,118,51,53,52,57,210,2,210,2,210,2,210,2,210,16,12,8,40, +11,2,141,2,155,2,142,2,157,2,158,3,1,7,101,110,118,51,53,53,48, +211,2,211,2,211,2,211,2,211,18,158,2,144,8,42,18,158,2,154,8,42, +18,158,2,144,8,42,18,158,2,64,8,42,18,158,2,144,8,42,18,158,2, +144,8,42,18,158,2,0,8,42,18,158,2,144,8,42,18,158,2,144,8,42, +18,16,2,95,2,135,8,43,93,8,252,66,9,95,9,8,252,66,9,2,106, +18,16,2,99,2,156,8,48,93,8,252,66,9,16,6,8,47,11,2,188,2, +189,3,1,7,101,110,118,51,53,56,57,212,2,212,16,4,8,46,11,2,199, +3,1,7,101,110,118,51,53,57,48,213,16,4,8,45,11,2,201,3,1,7, +101,110,118,51,53,57,49,214,16,4,8,44,11,2,203,3,1,7,101,110,118, +51,53,57,51,215,95,9,8,252,66,9,2,106,18,100,2,136,8,51,36,35, +34,48,16,16,8,50,11,3,1,4,103,52,51,50,216,3,1,4,103,52,51, +51,217,3,1,4,103,52,51,52,218,3,1,4,103,52,51,53,219,3,1,4, +103,52,51,54,220,3,1,4,103,52,51,55,221,3,1,4,103,52,51,56,222, +3,1,7,101,110,118,51,53,55,57,223,2,223,2,223,2,223,2,223,2,223, +2,223,16,16,8,49,11,2,141,2,155,2,142,2,157,2,158,2,160,2,161, +3,1,7,101,110,118,51,53,56,48,224,2,224,2,224,2,224,2,224,2,224, +2,224,18,158,2,144,8,51,18,158,2,159,8,51,18,158,2,144,8,51,18, +158,2,144,8,51,18,158,2,133,8,51,18,158,2,144,8,51,18,158,2,144, +8,51,18,158,2,144,8,51,18,158,2,154,8,51,18,158,2,144,8,51,18, +158,2,64,8,51,18,158,2,133,8,51,18,158,2,144,8,51,18,158,2,144, +8,51,18,158,2,0,8,51,18,158,2,144,8,51,18,158,2,144,8,51,18, +158,2,57,8,51,18,158,2,133,8,51,18,158,2,144,8,51,18,158,2,144, +8,51,18,158,2,144,8,51,11,16,5,93,2,62,89,162,32,33,8,31,9, +223,0,27,249,22,208,83,160,41,32,35,45,196,27,28,248,80,158,35,32,194, 249,80,158,36,33,248,80,158,37,34,196,27,248,80,158,38,35,197,28,248,80, -158,38,32,193,249,80,158,39,33,248,80,158,40,34,195,27,248,80,158,41,35, -196,28,248,80,158,41,32,193,249,80,158,42,33,248,80,158,43,34,195,27,248, -80,158,44,35,196,28,248,80,158,44,36,193,248,80,158,44,37,193,11,11,11, -11,28,192,27,248,22,51,194,27,248,22,77,195,27,248,22,86,196,27,248,22, -87,197,249,80,158,40,38,201,27,250,22,60,199,198,200,27,83,160,41,33,42, -39,250,22,208,83,160,41,34,45,39,250,22,208,83,160,41,35,48,39,249,22, -58,83,160,41,36,50,39,250,22,208,83,160,41,37,53,39,251,22,60,83,160, -41,38,57,39,250,22,208,83,160,41,39,8,28,39,248,22,58,248,22,79,23, -21,83,160,41,40,8,28,39,248,22,51,23,17,248,22,77,23,17,83,160,41, -41,53,39,83,160,41,42,48,39,195,250,22,252,31,2,11,6,10,10,98,97, -100,32,115,121,110,116,97,120,196,32,20,96,158,16,7,2,77,2,80,2,82, -2,84,2,92,2,94,2,96,16,11,18,98,2,102,8,164,36,35,34,16,4, -8,163,11,2,252,11,1,3,1,7,101,110,118,51,57,48,50,252,126,1,18, -16,2,95,2,151,8,165,93,8,252,203,9,95,9,8,252,203,9,2,100,18, -100,2,152,8,168,36,35,34,8,163,16,10,8,167,11,3,1,4,103,52,57, -49,252,127,1,3,1,4,103,52,57,50,252,128,1,3,1,4,103,52,57,51, -252,129,1,3,1,4,103,52,57,52,252,130,1,3,1,7,101,110,118,51,57, -48,57,252,131,1,2,252,131,1,2,252,131,1,2,252,131,1,16,10,8,166, -11,2,156,2,212,65,98,111,100,121,49,252,132,1,2,252,55,1,3,1,7, -101,110,118,51,57,49,48,252,133,1,2,252,133,1,2,252,133,1,2,252,133, -1,18,158,2,158,8,168,18,158,67,99,97,108,108,47,99,99,252,134,1,8, -168,18,158,2,158,8,168,18,158,2,252,5,1,8,168,18,158,2,158,8,168, -18,158,2,158,8,168,18,158,2,158,8,168,18,158,2,158,8,168,11,16,5, -93,2,57,89,162,32,33,51,9,223,0,27,249,22,208,83,160,41,32,35,41, -196,27,28,248,80,158,35,32,194,249,80,158,36,33,248,80,158,37,34,196,27, -248,80,158,38,35,197,28,248,80,158,38,32,193,249,80,158,39,33,248,80,158, -40,34,195,27,248,80,158,41,35,196,28,248,80,158,41,32,193,27,27,248,80, -158,43,34,195,28,248,80,158,43,36,193,248,22,58,248,80,158,44,37,194,11, -28,192,249,80,158,43,38,194,27,248,80,158,45,35,197,28,248,80,158,45,32, -193,249,80,158,46,33,248,80,158,47,34,195,27,248,80,158,48,35,196,28,248, -80,158,48,36,193,248,80,158,48,37,193,11,11,11,11,11,11,28,192,27,248, -22,51,194,27,248,22,77,195,27,248,22,86,196,27,248,22,89,197,27,248,22, -88,198,249,80,158,41,39,202,27,251,22,60,201,202,199,200,27,83,160,41,33, -43,41,91,159,33,11,90,161,33,32,11,83,160,38,32,33,11,247,248,22,8, -89,162,32,33,40,9,226,13,2,3,1,250,22,31,89,162,32,32,36,9,225, -6,3,7,90,161,33,33,10,247,22,252,174,2,248,22,252,174,2,89,162,32, -33,36,9,224,3,1,248,193,89,162,32,32,36,9,224,2,3,28,248,22,252, -171,2,193,248,22,252,176,2,193,249,80,158,35,40,21,98,2,72,9,95,2, -107,64,98,97,115,101,252,135,1,94,65,102,105,101,108,100,252,136,1,2,69, -2,252,132,1,2,252,55,1,2,69,83,160,41,34,35,41,89,162,32,32,54, -9,225,6,5,4,27,250,22,208,83,160,41,35,38,41,250,22,208,83,160,41, -36,41,41,252,22,60,83,160,41,37,46,41,83,160,41,38,46,41,250,22,208, -83,160,41,39,49,41,250,22,58,83,160,41,40,52,41,248,22,77,23,19,248, -22,51,23,19,83,160,41,41,49,41,248,22,87,205,248,22,86,205,83,160,41, -42,41,41,197,89,162,32,32,33,9,223,0,192,89,162,32,32,34,9,223,3, -248,22,252,174,2,208,250,22,252,31,2,11,6,10,10,98,97,100,32,115,121, -110,116,97,120,196,32,20,96,158,16,9,2,77,2,80,2,82,2,84,2,92, -2,94,2,86,2,96,2,99,16,11,18,98,2,102,8,170,36,35,34,16,4, -8,169,11,2,252,11,1,3,1,7,101,110,118,51,57,49,56,252,137,1,18, -16,2,95,2,151,8,171,93,8,252,216,9,95,9,8,252,216,9,2,100,18, -16,2,99,2,69,8,176,93,8,252,216,9,16,6,8,175,11,2,174,2,175, -3,1,7,101,110,118,51,57,51,54,252,138,1,2,252,138,1,16,4,8,174, -11,2,185,3,1,7,101,110,118,51,57,51,55,252,139,1,16,4,8,173,11, -2,187,3,1,7,101,110,118,51,57,51,56,252,140,1,16,4,8,172,11,2, -189,3,1,7,101,110,118,51,57,52,48,252,141,1,95,9,8,252,216,9,2, -100,18,100,2,152,8,179,36,35,34,8,169,16,12,8,178,11,3,1,4,103, -52,57,53,252,142,1,3,1,4,103,52,57,54,252,143,1,3,1,4,103,52, -57,55,252,144,1,3,1,4,103,52,57,56,252,145,1,3,1,4,103,52,57, -57,252,146,1,3,1,7,101,110,118,51,57,50,56,252,147,1,2,252,147,1, -2,252,147,1,2,252,147,1,2,252,147,1,16,12,8,177,11,2,156,2,252, -135,1,2,252,136,1,2,252,132,1,2,252,55,1,3,1,7,101,110,118,51, -57,50,57,252,148,1,2,252,148,1,2,252,148,1,2,252,148,1,2,252,148, -1,18,158,2,158,8,179,18,158,2,72,8,179,18,158,9,8,179,18,158,2, -158,8,179,18,158,2,107,8,179,18,158,2,158,8,179,18,158,2,158,8,179, -11,16,5,93,2,53,89,162,32,33,55,9,223,0,27,249,22,208,83,160,41, -32,35,46,196,27,28,248,80,158,35,32,194,249,80,158,36,33,248,80,158,37, +158,38,32,193,27,27,248,80,158,40,34,195,28,248,80,158,40,36,193,248,22, +8,89,162,32,33,39,9,224,8,1,27,249,22,2,89,162,32,33,49,9,224, +4,5,249,80,158,35,37,28,248,80,158,36,32,197,249,80,158,37,33,248,80, +158,38,34,199,27,248,80,158,39,35,200,28,248,80,158,39,32,193,27,28,248, +22,205,194,193,200,249,80,158,41,33,248,80,158,42,34,196,27,248,80,158,43, +35,197,248,22,58,250,22,208,199,196,199,11,11,194,248,80,158,37,38,196,28, +248,22,56,193,21,95,9,9,9,248,80,158,35,39,193,11,28,192,249,80,158, +40,40,194,27,248,80,158,42,35,197,28,248,80,158,42,32,193,27,27,248,80, +158,44,34,195,28,248,80,158,44,32,193,249,80,158,45,33,248,80,158,46,34, +195,27,248,80,158,47,35,196,28,248,80,158,47,36,193,248,22,58,248,80,158, +48,38,194,11,11,28,192,249,80,158,44,40,194,27,248,80,158,46,35,197,28, +248,80,158,46,36,193,248,80,158,46,38,193,11,11,11,11,11,11,28,192,27, +248,22,51,194,27,248,22,77,195,27,248,22,86,196,27,248,22,89,197,27,249, +22,69,199,36,27,249,22,69,200,37,27,249,22,68,201,38,27,249,22,208,83, +160,41,33,44,45,250,22,2,89,162,32,34,45,9,224,15,16,27,249,22,208, +83,160,41,34,36,45,198,27,248,80,158,36,41,194,28,192,196,27,28,248,80, +158,37,32,195,27,248,80,158,38,34,196,28,192,249,80,158,39,40,194,248,80, +158,40,41,248,80,158,41,35,199,11,11,28,192,192,250,22,252,32,2,11,6, +19,19,98,97,100,32,118,97,114,105,97,98,108,101,32,115,121,110,116,97,120, +198,248,22,215,27,83,160,41,35,49,45,250,22,208,83,160,41,36,52,45,23, +16,195,248,22,215,27,83,160,41,37,49,45,250,22,208,83,160,41,38,52,45, +206,195,27,28,248,80,158,44,36,194,248,80,158,44,38,194,11,28,192,27,249, +22,208,83,160,41,39,46,45,27,83,160,41,40,47,45,250,22,208,83,160,41, +41,50,45,202,195,27,248,80,158,46,41,194,28,192,249,80,158,47,42,23,16, +27,252,22,60,204,23,16,23,17,202,206,27,83,160,41,42,49,45,91,159,33, +11,90,161,33,32,11,83,160,38,32,33,11,247,248,22,8,89,162,32,33,40, +9,226,19,2,3,1,250,22,31,89,162,32,32,36,9,225,6,3,7,90,161, +33,33,10,247,22,252,175,2,248,22,252,175,2,89,162,32,33,36,9,224,3, +1,248,193,89,162,32,32,36,9,224,2,3,28,248,22,252,172,2,193,248,22, +252,177,2,193,249,80,158,35,43,21,96,2,159,66,100,111,108,111,111,112,225, +94,94,63,118,97,114,226,64,105,110,105,116,227,2,156,95,2,154,94,63,110, +111,116,228,62,101,48,229,96,2,0,61,99,230,2,156,95,2,225,64,115,116, +101,112,231,2,156,83,160,41,43,35,45,89,162,32,32,8,34,9,225,6,5, +4,27,250,22,208,83,160,41,44,38,45,250,22,208,83,160,41,45,41,45,251, +22,58,83,160,41,46,45,45,83,160,41,47,45,45,250,22,2,89,162,33,33, +41,9,223,16,250,22,208,83,160,41,48,35,45,249,22,58,248,22,51,199,248, +22,77,199,83,160,41,49,35,45,248,22,86,23,15,248,22,77,23,15,250,22, +208,83,160,41,50,48,45,250,22,58,83,160,41,51,51,45,250,22,208,83,160, +41,52,54,45,249,22,58,83,160,41,53,56,45,248,22,88,23,23,83,160,41, +54,54,45,250,22,208,83,160,41,55,54,45,249,22,50,83,160,41,56,56,45, +249,22,64,248,22,51,23,25,248,22,58,250,22,208,83,160,41,57,8,30,45, +249,22,50,83,160,41,58,8,32,45,248,22,89,23,31,83,160,41,59,8,30, +45,83,160,41,8,28,54,45,83,160,41,8,29,48,45,83,160,41,8,30,41, +45,197,89,162,32,32,33,9,223,0,192,89,162,32,32,34,9,223,3,248,22, +252,175,2,208,27,28,248,80,158,47,32,195,249,80,158,48,33,248,80,158,49, +34,197,27,248,80,158,50,35,198,28,248,80,158,50,36,193,248,80,158,50,38, +193,11,11,28,192,27,248,22,51,194,27,248,22,52,195,249,80,158,50,42,23, +19,27,254,22,60,23,17,202,23,21,23,22,203,23,15,23,19,27,83,160,41, +8,31,52,45,91,159,33,11,90,161,33,32,11,83,160,38,32,33,11,247,248, +22,8,89,162,32,33,40,9,226,22,2,3,1,250,22,31,89,162,32,32,36, +9,225,6,3,7,90,161,33,33,10,247,22,252,175,2,248,22,252,175,2,89, +162,32,33,36,9,224,3,1,248,193,89,162,32,32,36,9,224,2,3,28,248, +22,252,172,2,193,248,22,252,177,2,193,249,80,158,35,43,21,96,2,159,2, +225,94,94,2,226,2,227,2,156,96,2,154,2,229,96,2,0,2,157,2,158, +2,156,96,2,0,2,230,2,156,95,2,225,2,231,2,156,83,160,41,8,32, +35,45,89,162,32,32,8,36,9,225,6,5,4,27,250,22,208,83,160,41,8, +33,38,45,250,22,208,83,160,41,8,34,41,45,251,22,58,83,160,41,8,35, +45,45,83,160,41,8,36,45,45,250,22,2,89,162,33,33,41,9,223,16,250, +22,208,83,160,41,8,37,35,45,249,22,58,248,22,51,199,248,22,77,199,83, +160,41,8,38,35,45,248,22,89,23,15,248,22,86,23,15,250,22,208,83,160, +41,8,39,48,45,251,22,58,83,160,41,8,40,52,45,249,22,68,23,20,38, +250,22,208,83,160,41,8,41,55,45,250,22,60,83,160,41,8,42,58,45,249, +22,69,23,26,36,248,22,77,23,25,83,160,41,8,43,55,45,250,22,208,83, +160,41,8,44,55,45,249,22,50,83,160,41,8,45,57,45,249,22,64,248,22, +51,23,26,248,22,58,250,22,208,83,160,41,8,46,8,31,45,249,22,50,83, +160,41,8,47,8,33,45,249,22,69,23,33,37,83,160,41,8,48,8,31,45, +83,160,41,8,49,55,45,83,160,41,8,50,48,45,83,160,41,8,51,41,45, +197,89,162,32,32,33,9,223,0,192,89,162,32,32,34,9,223,3,248,22,252, +175,2,208,250,22,252,32,2,11,6,10,10,98,97,100,32,115,121,110,116,97, +120,197,248,80,158,44,44,83,160,41,8,52,44,45,250,22,252,32,2,11,6, +10,10,98,97,100,32,115,121,110,116,97,120,196,32,20,97,158,16,13,2,65, +2,68,2,70,2,72,2,78,30,232,2,66,2,117,7,2,80,30,233,2,66, +2,114,12,2,74,2,76,2,164,2,166,30,234,2,128,76,119,105,116,104,45, +115,121,110,116,97,120,45,102,97,105,108,235,3,16,53,18,98,2,82,8,53, +36,35,34,16,4,8,52,11,66,111,114,105,103,45,120,236,3,1,7,101,110, +118,51,54,52,52,237,18,100,2,82,8,56,36,35,34,8,52,16,16,8,55, +11,3,1,4,103,52,53,48,238,3,1,4,103,52,53,49,239,3,1,4,103, +52,53,50,240,3,1,4,103,52,53,51,241,3,1,4,103,52,53,52,242,3, +1,4,103,52,53,53,243,3,1,4,103,52,53,54,244,3,1,7,101,110,118, +51,54,54,51,245,2,245,2,245,2,245,2,245,2,245,2,245,16,16,8,54, +11,2,141,2,226,2,227,2,231,2,229,2,157,2,230,3,1,7,101,110,118, +51,54,54,52,246,2,246,2,246,2,246,2,246,2,246,2,246,18,101,2,82, +8,58,36,35,34,8,52,8,55,8,54,16,6,8,57,11,2,155,61,115,247, +3,1,7,101,110,118,51,54,55,52,248,2,248,18,16,2,95,2,135,8,59, +93,8,252,88,9,95,9,8,252,88,9,2,106,18,158,2,136,8,56,18,16, +2,95,2,135,8,60,93,8,252,89,9,95,9,8,252,89,9,2,106,18,158, +2,136,8,56,18,101,2,82,8,62,36,35,34,8,52,8,55,8,54,16,4, +8,61,11,3,1,4,103,52,54,49,249,3,1,7,101,110,118,51,54,57,53, +250,18,16,2,95,2,135,8,63,93,8,252,93,9,95,9,8,252,93,9,2, +106,18,158,2,136,8,62,18,16,2,95,2,135,8,64,93,8,252,95,9,95, +9,8,252,95,9,2,106,18,16,2,99,2,156,8,69,93,8,252,95,9,16, +6,8,68,11,2,188,2,189,3,1,7,101,110,118,51,55,48,53,251,2,251, +16,4,8,67,11,2,199,3,1,7,101,110,118,51,55,48,54,252,252,0,16, +4,8,66,11,2,201,3,1,7,101,110,118,51,55,48,55,252,253,0,16,4, +8,65,11,2,203,3,1,7,101,110,118,51,55,48,57,252,254,0,95,9,8, +252,95,9,2,106,18,158,2,136,8,62,18,158,2,144,8,62,18,158,2,159, +8,62,18,158,2,225,8,62,18,158,2,144,8,62,18,158,2,144,8,62,18, +158,2,144,8,62,18,158,2,154,8,62,18,158,2,144,8,62,18,158,2,228, +8,62,18,158,2,144,8,62,18,158,2,144,8,62,18,158,2,0,8,62,18, +158,2,144,8,62,18,158,2,225,8,62,18,158,2,144,8,62,18,158,2,144, +8,62,18,158,2,144,8,62,18,158,2,144,8,62,18,16,2,95,2,135,8, +70,93,8,252,98,9,95,9,8,252,98,9,2,106,18,16,2,99,2,156,8, +75,93,8,252,98,9,16,6,8,74,11,2,188,2,189,3,1,7,101,110,118, +51,55,50,53,252,255,0,2,252,255,0,16,4,8,73,11,2,199,3,1,7, +101,110,118,51,55,50,54,252,0,1,16,4,8,72,11,2,201,3,1,7,101, +110,118,51,55,50,55,252,1,1,16,4,8,71,11,2,203,3,1,7,101,110, +118,51,55,50,57,252,2,1,95,9,8,252,98,9,2,106,18,103,2,136,8, +78,36,35,34,8,52,8,55,8,54,8,61,16,6,8,77,11,3,1,4,103, +52,54,50,252,3,1,3,1,4,103,52,54,51,252,4,1,3,1,7,101,110, +118,51,55,50,48,252,5,1,2,252,5,1,16,4,8,76,11,2,158,3,1, +7,101,110,118,51,55,50,49,252,6,1,18,158,2,144,8,78,18,158,2,159, +8,78,18,158,2,225,8,78,18,158,2,144,8,78,18,158,2,144,8,78,18, +158,2,144,8,78,18,158,2,154,8,78,18,158,2,144,8,78,18,158,2,0, +8,78,18,158,2,144,8,78,18,158,2,144,8,78,18,158,2,0,8,78,18, +158,2,144,8,78,18,158,2,225,8,78,18,158,2,144,8,78,18,158,2,144, +8,78,18,158,2,144,8,78,18,158,2,144,8,78,18,16,2,158,94,98,2, +231,8,82,93,8,252,84,9,16,4,8,81,11,3,1,8,119,115,116,109,112, +52,53,55,252,7,1,3,1,7,101,110,118,51,54,55,51,252,8,1,16,4, +8,80,11,3,1,4,103,52,54,48,252,9,1,3,1,7,101,110,118,51,55, +51,56,252,10,1,16,4,8,79,11,65,95,101,108,115,101,252,11,1,3,1, +7,101,110,118,51,55,51,57,252,12,1,158,2,156,8,82,8,82,95,9,8, +252,84,9,2,128,11,16,5,93,2,58,89,162,32,33,56,9,223,0,27,249, +22,208,83,160,41,32,35,39,196,27,28,248,80,158,35,32,194,249,80,158,36, +33,248,80,158,37,34,196,27,248,80,158,38,35,197,28,248,80,158,38,32,193, +27,248,80,158,39,34,194,28,192,249,80,158,40,36,194,248,80,158,41,37,248, +80,158,42,35,197,11,11,11,28,192,27,248,22,51,194,27,248,22,52,195,249, +80,158,38,38,199,27,83,160,41,33,39,39,250,22,208,83,160,41,34,42,39, +250,22,208,83,160,41,35,45,39,249,22,58,83,160,41,36,47,39,250,22,208, +83,160,41,37,50,39,250,22,58,83,160,41,38,53,39,83,160,41,39,53,39, +23,17,83,160,41,40,50,39,83,160,41,41,45,39,195,250,22,252,32,2,11, +6,10,10,98,97,100,32,115,121,110,116,97,120,196,32,20,97,158,16,7,2, +65,2,68,2,70,2,72,2,74,2,76,2,164,16,10,18,98,2,82,8,84, +36,35,34,16,4,8,83,11,2,133,3,1,7,101,110,118,51,55,52,50,252, +13,1,18,16,2,95,2,135,8,85,93,8,252,108,9,95,9,8,252,108,9, +2,106,18,100,2,136,8,88,36,35,34,8,83,16,6,8,87,11,3,1,4, +103,52,54,52,252,14,1,3,1,4,103,52,54,53,252,15,1,3,1,7,101, +110,118,51,55,52,56,252,16,1,2,252,16,1,16,6,8,86,11,2,58,63, +101,120,112,252,17,1,3,1,7,101,110,118,51,55,52,57,252,18,1,2,252, +18,1,18,158,2,144,8,88,18,158,2,6,8,88,18,158,2,144,8,88,18, +158,66,108,97,109,98,100,97,252,19,1,8,88,18,158,9,8,88,18,158,2, +144,8,88,18,158,2,144,8,88,11,16,5,93,2,83,253,22,59,248,247,22, +252,77,3,83,160,41,32,39,32,248,247,22,252,77,3,83,160,41,33,39,32, +248,247,22,252,77,3,83,160,41,34,39,32,248,22,59,248,247,22,252,77,3, +83,160,41,35,40,32,248,22,59,248,247,22,252,77,3,83,160,41,36,40,32, +10,40,20,97,158,16,0,16,5,18,97,2,4,8,89,36,35,34,18,158,2, +6,8,89,18,158,2,8,8,89,18,158,2,10,8,89,18,158,2,12,8,89, +11,16,5,93,2,54,89,162,32,33,56,9,223,0,27,249,22,208,83,160,41, +32,35,45,196,27,28,248,80,158,35,32,194,249,80,158,36,33,248,80,158,37, 34,196,27,248,80,158,38,35,197,28,248,80,158,38,32,193,28,248,80,158,38, 36,248,80,158,39,34,194,27,248,80,158,39,35,194,28,248,80,158,39,32,193, 249,80,158,40,33,248,80,158,41,34,195,27,248,80,158,42,35,196,28,248,80, 158,42,37,193,248,80,158,42,38,193,11,11,11,11,11,28,192,27,248,22,51, -194,27,248,22,77,195,27,248,22,79,196,249,80,158,39,39,200,27,249,22,60, -198,197,27,83,160,41,33,41,46,250,22,208,83,160,41,34,44,46,250,22,208, -83,160,41,35,47,46,250,22,60,83,160,41,36,50,46,83,160,41,37,50,46, -202,83,160,41,38,47,46,195,27,28,248,80,158,36,32,195,249,80,158,37,33, -248,80,158,38,34,197,27,248,80,158,39,35,198,28,248,80,158,39,32,193,27, -27,248,80,158,41,34,195,28,248,80,158,41,37,193,248,22,8,89,162,32,33, -39,9,224,9,1,27,249,22,2,89,162,32,33,44,9,224,4,5,249,80,158, -35,40,28,248,80,158,36,32,197,249,80,158,37,33,248,80,158,38,34,199,27, -248,80,158,39,35,200,28,248,80,158,39,32,193,249,80,158,40,33,248,80,158, -41,34,195,248,80,158,41,36,248,80,158,42,35,196,11,11,194,248,80,158,37, -38,196,28,248,22,56,193,21,94,9,9,248,80,158,35,41,193,11,28,192,249, -80,158,41,42,194,27,248,80,158,43,35,197,28,248,80,158,43,32,193,249,80, -158,44,33,248,80,158,45,34,195,27,248,80,158,46,35,196,28,248,80,158,46, -37,193,248,80,158,46,38,193,11,11,11,11,11,28,192,27,248,22,51,194,27, -248,22,77,195,27,248,22,86,196,27,248,22,89,197,27,248,22,88,198,27,249, -22,208,83,160,41,39,43,46,248,80,158,44,43,27,83,160,41,40,45,46,250, -22,208,83,160,41,41,48,46,203,195,27,28,248,80,158,43,37,194,248,80,158, -43,38,194,11,28,192,249,80,158,44,39,205,27,252,22,60,205,203,204,202,200, -27,83,160,41,42,46,46,91,159,33,11,90,161,33,32,11,83,160,38,32,33, -11,247,248,22,8,89,162,32,33,40,9,226,16,2,3,1,250,22,31,89,162, -32,32,36,9,225,6,3,7,90,161,33,33,10,247,22,252,174,2,248,22,252, -174,2,89,162,32,33,36,9,224,3,1,248,193,89,162,32,32,36,9,224,2, -3,28,248,22,252,171,2,193,248,22,252,176,2,193,249,80,158,35,44,21,95, -2,72,94,94,63,116,109,112,252,149,1,2,252,25,1,2,69,95,2,72,93, -94,64,115,119,97,112,252,150,1,96,2,252,5,1,9,96,2,72,93,94,2, -233,2,252,149,1,95,2,252,93,1,2,252,149,1,64,110,97,109,101,252,151, -1,95,2,252,93,1,2,252,151,1,2,233,2,69,96,72,100,121,110,97,109, -105,99,45,119,105,110,100,252,152,1,2,252,150,1,97,2,252,5,1,9,2, -252,132,1,2,252,55,1,2,69,2,252,150,1,83,160,41,43,35,46,89,162, -32,32,8,40,9,225,6,5,4,27,250,22,208,83,160,41,44,38,46,250,22, -208,83,160,41,45,41,46,250,22,58,83,160,41,46,44,46,250,22,2,89,162, -33,33,41,9,223,15,250,22,208,83,160,41,47,35,46,249,22,58,248,22,51, -199,248,22,77,199,83,160,41,48,35,46,248,22,88,206,248,22,86,206,250,22, -208,83,160,41,49,47,46,250,22,58,83,160,41,50,50,46,250,22,208,83,160, -41,51,53,46,248,22,58,250,22,208,83,160,41,52,57,46,249,22,58,83,160, -41,53,59,46,250,22,208,83,160,41,54,8,30,46,250,22,60,83,160,41,55, -8,33,46,83,160,41,56,8,33,46,252,22,2,89,162,33,33,52,9,223,38, -250,22,208,83,160,41,57,35,46,251,22,58,83,160,41,58,39,46,250,22,208, -83,160,41,59,42,46,248,22,58,250,22,208,83,160,41,8,28,46,46,249,22, -58,83,160,41,8,29,48,46,248,22,51,23,18,83,160,41,8,30,46,46,83, -160,41,8,31,42,46,250,22,208,83,160,41,8,32,42,46,250,22,58,83,160, -41,8,33,45,46,248,22,51,23,15,248,22,86,23,15,83,160,41,8,34,42, -46,250,22,208,83,160,41,8,35,42,46,250,22,60,83,160,41,8,36,45,46, -248,22,86,23,15,83,160,41,8,37,45,46,83,160,41,8,38,42,46,83,160, -41,8,39,35,46,248,22,88,23,37,248,22,88,23,37,248,22,51,23,37,248, -22,51,23,37,83,160,41,8,40,8,30,46,83,160,41,8,41,57,46,83,160, -41,8,42,53,46,250,22,208,83,160,41,8,43,53,46,251,22,60,83,160,41, -8,44,57,46,83,160,41,8,45,57,46,250,22,208,83,160,41,8,46,8,28, -46,251,22,60,83,160,41,8,47,8,32,46,83,160,41,8,48,8,32,46,248, -22,77,23,31,248,22,89,23,31,83,160,41,8,49,8,28,46,83,160,41,8, -50,57,46,83,160,41,8,51,53,46,83,160,41,8,52,47,46,83,160,41,8, -53,41,46,197,89,162,32,32,33,9,223,0,192,89,162,32,32,34,9,223,3, -248,22,252,174,2,208,248,80,158,43,45,83,160,41,8,54,43,46,250,22,252, -31,2,11,6,10,10,98,97,100,32,115,121,110,116,97,120,197,32,20,96,158, -16,14,2,77,2,80,2,82,2,84,2,88,2,92,2,94,2,96,2,218,2, -219,2,86,2,252,96,1,2,99,2,220,16,55,18,98,2,102,8,181,36,35, -34,16,4,8,180,11,2,252,11,1,3,1,7,101,110,118,51,57,52,55,252, -153,1,18,16,2,95,2,151,8,182,93,8,252,235,9,95,9,8,252,235,9, -2,100,18,100,2,152,8,185,36,35,34,8,180,16,8,8,184,11,3,1,4, -103,53,48,53,252,154,1,3,1,4,103,53,48,54,252,155,1,3,1,4,103, -53,48,55,252,156,1,3,1,7,101,110,118,51,57,53,52,252,157,1,2,252, -157,1,2,252,157,1,16,8,8,183,11,2,156,2,252,132,1,2,252,55,1, -3,1,7,101,110,118,51,57,53,53,252,158,1,2,252,158,1,2,252,158,1, -18,158,2,158,8,185,18,158,2,72,8,185,18,158,9,8,185,18,158,2,158, -8,185,18,100,2,102,8,188,36,35,34,8,180,16,12,8,187,11,3,1,4, -103,53,48,48,252,159,1,3,1,4,103,53,48,49,252,160,1,3,1,4,103, -53,48,50,252,161,1,3,1,4,103,53,48,51,252,162,1,3,1,4,103,53, -48,52,252,163,1,3,1,7,101,110,118,51,57,55,50,252,164,1,2,252,164, -1,2,252,164,1,2,252,164,1,2,252,164,1,16,12,8,186,11,2,156,2, -252,151,1,2,252,25,1,2,252,132,1,2,252,55,1,3,1,7,101,110,118, -51,57,55,51,252,165,1,2,252,165,1,2,252,165,1,2,252,165,1,2,252, -165,1,18,16,2,95,2,151,8,189,93,8,252,238,9,95,9,8,252,238,9, -2,100,18,158,2,152,8,188,18,16,2,95,2,151,8,190,93,8,252,241,9, -95,9,8,252,241,9,2,100,18,16,2,99,2,69,8,195,93,8,252,241,9, -16,6,8,194,11,2,174,2,175,3,1,7,101,110,118,51,57,56,57,252,166, -1,2,252,166,1,16,4,8,193,11,2,185,3,1,7,101,110,118,51,57,57, -48,252,167,1,16,4,8,192,11,2,187,3,1,7,101,110,118,51,57,57,49, -252,168,1,16,4,8,191,11,2,189,3,1,7,101,110,118,51,57,57,51,252, -169,1,95,9,8,252,241,9,2,100,18,102,2,152,8,198,36,35,34,8,180, -8,187,8,186,16,4,8,197,11,3,1,4,103,53,49,48,252,170,1,3,1, -7,101,110,118,51,57,56,53,252,171,1,16,4,8,196,11,2,252,149,1,3, -1,7,101,110,118,51,57,56,54,252,172,1,18,158,2,158,8,198,18,158,2, -72,8,198,18,158,2,158,8,198,18,158,2,158,8,198,18,158,2,158,8,198, -18,158,2,72,8,198,18,158,2,158,8,198,18,158,2,158,8,198,18,158,2, -252,150,1,8,198,18,158,2,158,8,198,18,158,2,252,5,1,8,198,18,158, -9,8,198,18,158,2,158,8,198,18,158,2,72,8,198,18,158,2,158,8,198, -18,158,2,158,8,198,18,158,2,233,8,198,18,158,2,158,8,198,18,158,2, -158,8,198,18,158,2,158,8,198,18,158,2,252,93,1,8,198,18,158,2,158, -8,198,18,158,2,158,8,198,18,158,2,252,93,1,8,198,18,16,2,106,93, -158,2,233,8,198,8,203,49,48,47,46,45,44,13,16,3,33,2,160,2,100, -93,8,252,241,9,16,6,8,202,11,2,174,2,175,2,252,166,1,2,252,166, -1,16,4,8,201,11,2,185,2,252,167,1,16,4,8,200,11,2,187,2,252, -168,1,16,4,8,199,11,64,118,97,108,115,252,173,1,3,1,7,101,110,118, -51,57,57,57,252,174,1,95,9,8,252,241,9,2,100,18,158,2,158,8,198, -18,158,2,158,8,198,18,158,2,158,8,198,18,158,2,158,8,198,18,158,2, -158,8,198,18,158,2,158,8,198,18,158,2,252,152,1,8,198,18,158,2,252, -150,1,8,198,18,158,2,158,8,198,18,158,2,252,5,1,8,198,18,158,9, -8,198,18,158,2,158,8,198,18,16,2,105,93,158,2,252,150,1,8,198,8, -204,49,48,47,46,45,44,13,16,3,33,2,160,2,100,93,8,252,241,9,8, -202,8,201,8,200,95,9,8,252,241,9,2,100,18,158,2,158,8,198,18,158, -2,158,8,198,18,158,2,158,8,198,18,16,2,158,94,98,2,252,149,1,8, -208,93,8,252,237,9,16,4,8,207,11,3,1,8,119,115,116,109,112,53,48, -56,252,175,1,3,1,7,101,110,118,51,57,56,48,252,176,1,16,4,8,206, -11,3,1,4,103,53,48,57,252,177,1,3,1,7,101,110,118,52,48,48,52, -252,178,1,16,4,8,205,11,2,252,253,0,3,1,7,101,110,118,52,48,48, -53,252,179,1,158,2,69,8,208,8,208,95,9,8,252,237,9,2,125,11,16, -5,93,2,60,89,162,32,33,8,43,9,223,0,27,249,22,208,83,160,41,32, -35,39,196,27,28,248,80,158,35,32,194,249,80,158,36,33,248,80,158,37,34, -196,27,248,80,158,38,35,197,28,248,80,158,38,32,193,249,80,158,39,33,248, -80,158,40,34,195,27,248,80,158,41,35,196,28,248,80,158,41,36,193,248,80, -158,41,37,193,11,11,11,28,192,27,248,22,51,194,27,248,22,77,195,27,248, -22,79,196,249,80,158,39,38,200,27,249,22,60,197,198,27,83,160,41,33,41, -39,250,22,208,83,160,41,34,44,39,250,22,208,83,160,41,35,47,39,250,22, -60,83,160,41,36,50,39,250,22,208,83,160,41,37,53,39,248,22,58,250,22, -208,83,160,41,38,57,39,249,22,58,83,160,41,39,59,39,250,22,208,83,160, -41,40,8,30,39,250,22,60,83,160,41,41,8,33,39,250,22,208,83,160,41, -42,8,36,39,251,22,60,83,160,41,43,8,40,39,83,160,41,44,8,40,39, -248,22,52,23,33,248,22,51,23,33,83,160,41,45,8,36,39,83,160,41,46, -8,33,39,83,160,41,47,8,30,39,83,160,41,48,57,39,83,160,41,49,53, -39,83,160,41,50,50,39,83,160,41,51,47,39,195,250,22,252,31,2,11,6, -10,10,98,97,100,32,115,121,110,116,97,120,196,32,20,96,158,16,7,2,77, -2,80,2,82,2,84,2,92,2,94,2,96,16,20,18,98,2,102,8,210,36, -35,34,16,4,8,209,11,2,252,11,1,3,1,7,101,110,118,52,48,48,56, -252,180,1,18,16,2,95,2,151,8,211,93,8,252,252,9,95,9,8,252,252, -9,2,100,18,100,2,152,8,214,36,35,34,8,209,16,8,8,213,11,3,1, -4,103,53,49,49,252,181,1,3,1,4,103,53,49,50,252,182,1,3,1,4, -103,53,49,51,252,183,1,3,1,7,101,110,118,52,48,49,52,252,184,1,2, -252,184,1,2,252,184,1,16,8,8,212,11,2,156,2,252,9,1,2,252,10, -1,3,1,7,101,110,118,52,48,49,53,252,185,1,2,252,185,1,2,252,185, -1,18,158,2,158,8,214,18,158,2,252,91,1,8,214,18,158,2,158,8,214, -18,158,2,158,8,214,18,158,96,158,2,66,8,214,158,63,99,112,117,252,186, -1,8,214,158,64,117,115,101,114,252,187,1,8,214,158,62,103,99,252,188,1, -8,214,8,214,18,158,2,158,8,214,18,158,70,116,105,109,101,45,97,112,112, -108,121,252,189,1,8,214,18,158,2,158,8,214,18,158,2,252,5,1,8,214, -18,158,9,8,214,18,158,2,158,8,214,18,16,2,103,93,158,64,110,117,108, -108,252,190,1,8,214,8,216,49,48,47,46,45,44,13,16,3,33,2,160,2, -100,93,8,252,252,9,16,6,8,215,11,2,174,2,175,3,1,7,101,110,118, -52,48,50,48,252,191,1,2,252,191,1,95,9,8,252,252,9,2,100,18,158, -2,158,8,214,18,158,2,158,8,214,18,158,2,158,8,214,18,16,2,158,94, -158,97,158,66,112,114,105,110,116,102,252,192,1,8,214,158,6,40,40,99,112, -117,32,116,105,109,101,58,32,126,115,32,114,101,97,108,32,116,105,109,101,58, -32,126,115,32,103,99,32,116,105,109,101,58,32,126,115,126,110,8,214,158,2, -252,186,1,8,214,158,2,252,187,1,8,214,158,2,252,188,1,8,214,8,214, -158,95,158,2,252,68,1,8,214,158,2,252,69,1,8,214,158,2,66,8,214, -8,214,8,216,95,9,8,252,252,9,2,100,18,158,2,158,8,214,11,100,83, -159,32,97,80,158,32,32,80,158,32,33,80,158,32,34,80,158,32,35,80,158, -32,36,27,247,22,252,103,2,87,94,28,28,192,248,22,252,3,2,248,22,252, -102,2,194,11,250,22,252,32,2,2,107,6,15,15,105,110,115,112,101,99,116, -111,114,32,111,114,32,35,102,195,12,91,159,37,11,90,161,37,32,11,254,22, -252,82,2,2,108,11,33,32,11,9,204,252,22,7,197,198,199,250,22,252,84, -2,203,32,61,112,252,193,1,250,22,252,85,2,204,32,2,252,193,1,83,159, -32,93,80,158,32,37,89,162,32,33,39,2,14,223,0,87,94,28,248,80,158, -33,34,194,12,250,22,252,32,2,2,14,6,7,7,112,114,111,109,105,115,101, -196,27,248,80,158,34,35,195,28,248,22,0,193,27,249,22,6,195,22,58,87, -94,28,248,22,0,248,80,158,36,35,197,249,80,158,36,36,197,194,12,249,22, -1,22,7,248,80,158,37,35,198,249,22,1,22,7,194,83,159,32,93,80,158, -32,38,89,162,32,32,36,2,16,223,0,248,80,158,33,39,249,22,19,11,80, -158,35,40,83,159,32,93,80,158,32,41,89,162,32,34,40,2,23,223,0,87, -95,28,248,22,252,212,2,194,12,252,22,252,32,2,2,23,6,16,16,112,97, -114,97,109,101,116,101,114,105,122,97,116,105,111,110,32,198,199,28,28,248,22, -0,195,249,22,34,196,32,11,12,252,22,252,32,2,2,23,6,19,19,112,114, -111,99,101,100,117,114,101,32,40,97,114,105,116,121,32,48,41,33,198,199,20, -14,159,80,158,32,40,193,247,194,83,159,32,97,80,158,32,42,80,158,32,43, -80,158,32,44,80,158,32,45,80,158,32,46,252,22,252,82,2,2,105,11,33, -32,11,83,159,32,97,80,158,32,47,80,158,32,48,80,158,32,49,80,158,32, -50,80,158,32,51,27,247,22,252,103,2,87,94,28,28,192,248,22,252,3,2, -248,22,252,102,2,194,11,250,22,252,32,2,2,107,6,15,15,105,110,115,112, -101,99,116,111,114,32,111,114,32,35,102,195,12,91,159,37,11,90,161,37,32, -11,254,22,252,82,2,2,105,11,33,32,11,9,204,252,22,7,197,198,199,250, -22,252,84,2,203,32,64,99,101,108,108,252,194,1,250,22,252,85,2,204,32, -2,252,194,1,83,159,32,93,80,158,32,52,89,162,32,32,36,2,45,223,0, -248,80,158,33,43,249,22,19,11,80,158,35,53,83,159,32,93,80,158,32,54, -89,162,32,34,40,2,49,223,0,87,95,28,248,80,158,33,44,194,12,252,22, -252,32,2,2,49,6,22,22,98,114,101,97,107,32,112,97,114,97,109,101,116, -101,114,105,122,97,116,105,111,110,32,198,199,28,28,248,22,0,195,249,22,34, -196,32,11,12,252,22,252,32,2,2,23,6,19,19,112,114,111,99,101,100,117, -114,101,32,40,97,114,105,116,121,32,48,41,33,198,199,83,158,36,20,91,94, -20,14,159,80,158,32,53,249,80,158,34,45,195,32,87,94,247,80,158,32,55, -247,194,247,80,158,32,55,96,68,35,37,107,101,114,110,101,108,252,195,1,74, -35,37,115,109,97,108,108,45,115,99,104,101,109,101,252,196,1,2,110,2,18, -96,2,252,195,1,2,78,2,129,2,131,0}; - EVAL_ONE_SIZED_STR((char *)expr, 22397); +194,27,248,22,77,195,27,248,22,79,196,27,249,22,60,195,196,27,83,160,41, +33,39,45,250,22,208,83,160,41,34,42,45,250,22,208,83,160,41,35,45,45, +251,22,60,83,160,41,36,49,45,83,160,41,37,49,45,248,22,52,204,248,22, +51,204,83,160,41,38,45,45,195,27,28,248,80,158,36,32,195,249,80,158,37, +33,248,80,158,38,34,197,27,248,80,158,39,35,198,28,248,80,158,39,32,193, +27,27,248,80,158,41,34,195,28,248,80,158,41,37,193,248,22,8,89,162,32, +33,39,9,224,9,1,27,249,22,2,89,162,32,33,44,9,224,4,5,249,80, +158,35,39,28,248,80,158,36,32,197,249,80,158,37,33,248,80,158,38,34,199, +27,248,80,158,39,35,200,28,248,80,158,39,32,193,249,80,158,40,33,248,80, +158,41,34,195,248,80,158,41,36,248,80,158,42,35,196,11,11,194,248,80,158, +37,38,196,28,248,22,56,193,21,94,9,9,248,80,158,35,40,193,11,28,192, +249,80,158,41,41,194,27,248,80,158,43,35,197,28,248,80,158,43,32,193,249, +80,158,44,33,248,80,158,45,34,195,27,248,80,158,46,35,196,28,248,80,158, +46,37,193,248,80,158,46,38,193,11,11,11,11,11,28,192,27,248,22,51,194, +27,248,22,77,195,27,248,22,86,196,27,248,22,89,197,27,248,22,88,198,27, +249,22,208,83,160,41,39,43,45,249,22,1,22,64,250,22,2,22,58,248,22, +215,27,83,160,41,40,50,45,250,22,208,83,160,41,41,53,45,23,16,195,248, +22,215,27,83,160,41,42,50,45,250,22,208,83,160,41,43,53,45,23,15,195, +27,28,248,80,158,43,37,194,248,80,158,43,38,194,11,28,192,249,80,158,44, +42,205,27,250,22,60,201,198,200,27,83,160,41,44,46,45,91,159,33,11,90, +161,33,32,11,83,160,38,32,33,11,247,248,22,8,89,162,32,33,40,9,226, +16,2,3,1,250,22,31,89,162,32,32,36,9,225,6,3,7,90,161,33,33, +10,247,22,252,175,2,248,22,252,175,2,89,162,32,33,36,9,224,3,1,248, +193,89,162,32,32,36,9,224,2,3,28,248,22,252,172,2,193,248,22,252,177, +2,193,249,80,158,35,43,21,96,1,22,119,105,116,104,45,99,111,110,116,105, +110,117,97,116,105,111,110,45,109,97,114,107,252,20,1,2,21,96,2,19,95, +1,27,99,111,110,116,105,110,117,97,116,105,111,110,45,109,97,114,107,45,115, +101,116,45,102,105,114,115,116,252,21,1,11,2,21,63,112,47,118,252,22,1, +2,156,97,2,159,9,65,101,120,112,114,49,252,23,1,64,101,120,112,114,252, +24,1,2,156,83,160,41,45,35,45,89,162,32,32,54,9,225,6,5,4,27, +250,22,208,83,160,41,46,38,45,250,22,208,83,160,41,47,41,45,251,22,58, +83,160,41,48,45,45,83,160,41,49,45,45,250,22,208,83,160,41,50,48,45, +250,22,60,83,160,41,51,51,45,83,160,41,52,51,45,248,22,77,23,18,83, +160,41,53,48,45,250,22,208,83,160,41,54,48,45,251,22,60,83,160,41,55, +52,45,83,160,41,56,52,45,248,22,51,23,19,248,22,79,23,19,83,160,41, +57,48,45,83,160,41,58,41,45,197,89,162,32,32,33,9,223,0,192,89,162, +32,32,34,9,223,3,248,22,252,175,2,208,248,80,158,43,44,83,160,41,59, +43,45,250,22,252,32,2,11,6,10,10,98,97,100,32,115,121,110,116,97,120, +197,32,20,97,158,16,13,2,65,2,68,2,70,2,72,2,76,2,78,2,80, +2,232,2,233,2,74,2,164,2,166,2,234,16,28,18,98,2,82,8,91,36, +35,34,16,4,8,90,11,63,115,116,120,252,25,1,3,1,7,101,110,118,51, +55,53,54,252,26,1,18,16,2,95,2,135,8,92,93,8,252,138,9,95,9, +8,252,138,9,2,106,18,100,2,136,8,95,36,35,34,8,90,16,8,8,94, +11,3,1,4,103,52,55,49,252,27,1,3,1,4,103,52,55,50,252,28,1, +3,1,4,103,52,55,51,252,29,1,3,1,7,101,110,118,51,55,54,51,252, +30,1,2,252,30,1,2,252,30,1,16,8,8,93,11,2,141,2,252,23,1, +2,252,24,1,3,1,7,101,110,118,51,55,54,52,252,31,1,2,252,31,1, +2,252,31,1,18,158,2,144,8,95,18,158,2,159,8,95,18,158,9,8,95, +18,158,2,144,8,95,18,100,2,82,8,98,36,35,34,8,90,16,12,8,97, +11,3,1,4,103,52,54,54,252,32,1,3,1,4,103,52,54,55,252,33,1, +3,1,4,103,52,54,56,252,34,1,3,1,4,103,52,54,57,252,35,1,3, +1,4,103,52,55,48,252,36,1,3,1,7,101,110,118,51,55,56,49,252,37, +1,2,252,37,1,2,252,37,1,2,252,37,1,2,252,37,1,16,12,8,96, +11,2,141,65,112,97,114,97,109,252,38,1,63,118,97,108,252,39,1,2,252, +23,1,2,252,24,1,3,1,7,101,110,118,51,55,56,50,252,40,1,2,252, +40,1,2,252,40,1,2,252,40,1,2,252,40,1,18,16,2,95,2,135,8, +99,93,8,252,141,9,95,9,8,252,141,9,2,106,18,158,2,136,8,98,18, +16,2,95,2,135,8,100,93,8,252,142,9,95,9,8,252,142,9,2,106,18, +158,2,136,8,98,18,16,2,95,2,135,8,101,93,8,252,145,9,95,9,8, +252,145,9,2,106,18,16,2,99,2,156,8,106,93,8,252,145,9,16,6,8, +105,11,2,188,2,189,3,1,7,101,110,118,51,55,57,57,252,41,1,2,252, +41,1,16,4,8,104,11,2,199,3,1,7,101,110,118,51,56,48,48,252,42, +1,16,4,8,103,11,2,201,3,1,7,101,110,118,51,56,48,49,252,43,1, +16,4,8,102,11,2,203,3,1,7,101,110,118,51,56,48,51,252,44,1,95, +9,8,252,145,9,2,106,18,102,2,136,8,109,36,35,34,8,90,8,97,8, +96,16,4,8,108,11,3,1,4,103,52,55,54,252,45,1,3,1,7,101,110, +118,51,55,57,53,252,46,1,16,4,8,107,11,2,252,22,1,3,1,7,101, +110,118,51,55,57,54,252,47,1,18,158,2,144,8,109,18,158,2,252,20,1, +8,109,18,158,2,21,8,109,18,158,2,144,8,109,18,158,2,19,8,109,18, +158,95,158,2,252,21,1,8,109,158,11,8,109,158,2,21,8,109,8,109,18, +158,2,144,8,109,18,158,2,144,8,109,18,158,2,159,8,109,18,158,9,8, +109,18,158,2,144,8,109,18,158,2,144,8,109,18,16,2,158,94,98,2,252, +22,1,8,113,93,8,252,140,9,16,4,8,112,11,3,1,8,119,115,116,109, +112,52,55,52,252,48,1,3,1,7,101,110,118,51,55,56,57,252,49,1,16, +4,8,111,11,3,1,4,103,52,55,53,252,50,1,3,1,7,101,110,118,51, +56,49,48,252,51,1,16,4,8,110,11,2,252,11,1,3,1,7,101,110,118, +51,56,49,49,252,52,1,158,2,156,8,113,8,113,95,9,8,252,140,9,2, +128,11,16,5,93,2,63,89,162,32,33,8,36,9,223,0,27,249,22,208,83, +160,41,32,35,39,196,27,28,248,80,158,35,32,194,249,80,158,36,33,248,80, +158,37,34,196,27,248,80,158,38,35,197,28,248,80,158,38,32,193,249,80,158, +39,33,248,80,158,40,34,195,27,248,80,158,41,35,196,28,248,80,158,41,32, +193,249,80,158,42,33,248,80,158,43,34,195,27,248,80,158,44,35,196,28,248, +80,158,44,36,193,248,80,158,44,37,193,11,11,11,11,28,192,27,248,22,51, +194,27,248,22,77,195,27,248,22,86,196,27,248,22,87,197,249,80,158,40,38, +201,27,250,22,60,199,200,198,27,83,160,41,33,42,39,250,22,208,83,160,41, +34,45,39,250,22,208,83,160,41,35,48,39,251,22,58,83,160,41,36,52,39, +83,160,41,37,52,39,250,22,208,83,160,41,38,55,39,249,22,58,83,160,41, +39,57,39,250,22,208,83,160,41,40,8,28,39,250,22,60,83,160,41,41,8, +31,39,248,22,77,23,23,83,160,41,42,8,31,39,83,160,41,43,8,28,39, +83,160,41,44,55,39,250,22,208,83,160,41,45,55,39,250,22,58,83,160,41, +46,58,39,83,160,41,47,58,39,250,22,208,83,160,41,48,8,29,39,251,22, +60,83,160,41,49,8,33,39,83,160,41,50,8,33,39,248,22,51,23,25,248, +22,79,23,25,83,160,41,51,8,29,39,83,160,41,52,55,39,83,160,41,53, +48,39,195,250,22,252,32,2,11,6,10,10,98,97,100,32,115,121,110,116,97, +120,196,32,20,97,158,16,7,2,65,2,68,2,70,2,72,2,78,2,80,2, +164,16,22,18,98,2,82,8,115,36,35,34,16,4,8,114,11,2,252,25,1, +3,1,7,101,110,118,51,56,49,52,252,53,1,18,16,2,95,2,135,8,116, +93,8,252,158,9,95,9,8,252,158,9,2,106,18,100,2,136,8,119,36,35, +34,8,114,16,10,8,118,11,3,1,4,103,52,55,55,252,54,1,3,1,4, +103,52,55,56,252,55,1,3,1,4,103,52,55,57,252,56,1,3,1,4,103, +52,56,48,252,57,1,3,1,7,101,110,118,51,56,50,49,252,58,1,2,252, +58,1,2,252,58,1,2,252,58,1,16,10,8,117,11,2,141,69,98,111,111, +108,45,101,120,112,114,252,59,1,2,252,23,1,2,252,24,1,3,1,7,101, +110,118,51,56,50,50,252,60,1,2,252,60,1,2,252,60,1,2,252,60,1, +18,158,2,144,8,119,18,158,2,252,20,1,8,119,18,158,2,47,8,119,18, +158,2,144,8,119,18,158,76,109,97,107,101,45,116,104,114,101,97,100,45,99, +101,108,108,252,61,1,8,119,18,158,2,144,8,119,18,158,2,89,8,119,18, +16,2,103,93,158,10,8,119,8,121,8,28,59,58,57,56,55,13,16,3,33, +2,173,2,106,93,8,252,158,9,16,6,8,120,11,2,188,2,189,3,1,7, +101,110,118,51,56,50,56,252,62,1,2,252,62,1,95,9,8,252,158,9,2, +106,18,158,2,144,8,119,18,158,2,144,8,119,18,158,2,144,8,119,18,158, +2,0,8,119,18,158,93,158,2,51,8,119,8,119,18,158,2,144,8,119,18, +158,2,159,8,119,18,158,9,8,119,18,158,2,144,8,119,18,158,2,144,8, +119,18,158,2,144,8,119,11,16,5,93,2,102,253,22,59,248,247,22,252,77, +3,83,160,41,32,39,32,248,247,22,252,77,3,83,160,41,33,39,32,248,247, +22,252,77,3,83,160,41,34,39,32,248,22,59,248,247,22,252,77,3,83,160, +41,35,40,32,248,22,59,248,247,22,252,77,3,83,160,41,36,40,32,10,40, +20,97,158,16,0,16,5,18,158,2,35,8,89,18,158,2,37,8,89,18,158, +2,39,8,89,18,158,2,41,8,89,18,158,2,43,8,89,11,16,5,94,2, +59,2,53,27,89,162,32,33,34,62,119,104,252,63,1,223,1,89,162,32,33, +56,9,224,0,1,27,249,22,208,83,160,41,32,36,44,197,27,28,248,80,158, +36,32,194,249,80,158,37,33,248,80,158,38,34,196,27,248,80,158,39,35,197, +28,248,80,158,39,32,193,28,248,80,158,39,36,248,80,158,40,34,194,27,248, +80,158,40,35,194,28,248,80,158,40,32,193,249,80,158,41,33,248,80,158,42, +34,195,27,248,80,158,43,35,196,28,248,80,158,43,37,193,248,80,158,43,38, +193,11,11,11,11,11,28,192,27,248,22,51,194,27,248,22,77,195,27,248,22, +79,196,249,80,158,40,39,201,27,249,22,60,197,198,27,83,160,41,33,42,44, +250,22,208,83,160,41,34,45,44,250,22,208,83,160,41,35,48,44,251,22,60, +83,160,41,36,52,44,83,160,41,37,52,44,248,22,52,204,248,22,51,204,83, +160,41,38,48,44,195,27,28,248,80,158,37,32,195,249,80,158,38,33,248,80, +158,39,34,197,27,248,80,158,40,35,198,28,248,80,158,40,32,193,27,27,248, +80,158,42,34,195,28,248,80,158,42,37,193,248,22,8,89,162,32,33,39,9, +224,10,1,27,249,22,2,89,162,32,33,44,9,224,4,5,249,80,158,35,40, +28,248,80,158,36,32,197,249,80,158,37,33,248,80,158,38,34,199,27,248,80, +158,39,35,200,28,248,80,158,39,32,193,249,80,158,40,33,248,80,158,41,34, +195,248,80,158,41,36,248,80,158,42,35,196,11,11,194,248,80,158,37,38,196, +28,248,22,56,193,21,94,9,9,248,80,158,35,41,193,11,28,192,249,80,158, +42,42,194,27,248,80,158,44,35,197,28,248,80,158,44,32,193,249,80,158,45, +33,248,80,158,46,34,195,27,248,80,158,47,35,196,28,248,80,158,47,37,193, +248,80,158,47,38,193,11,11,11,11,11,28,192,27,248,22,51,194,27,248,22, +77,195,27,248,22,86,196,27,248,22,89,197,27,248,22,88,198,27,249,22,208, +83,160,41,39,44,44,28,203,83,160,41,40,44,44,83,160,41,41,44,44,249, +80,158,44,39,205,27,252,22,60,203,204,201,202,200,27,83,160,41,42,46,44, +91,159,33,11,90,161,33,32,11,83,160,38,32,33,11,247,248,22,8,89,162, +32,33,40,9,226,16,2,3,1,250,22,31,89,162,32,32,36,9,225,6,3, +7,90,161,33,33,10,247,22,252,175,2,248,22,252,175,2,89,162,32,33,36, +9,224,3,1,248,193,89,162,32,32,36,9,224,2,3,28,248,22,252,172,2, +193,248,22,252,177,2,193,249,80,158,35,43,21,95,2,159,94,94,61,108,252, +64,1,95,64,108,105,115,116,252,65,1,95,64,99,111,110,115,252,66,1,64, +112,114,101,100,252,67,1,67,104,97,110,100,108,101,114,252,68,1,2,156,94, +64,98,111,100,121,252,69,1,97,2,252,19,1,9,2,252,23,1,2,252,24, +1,2,156,95,2,159,93,94,63,98,112,122,252,70,1,95,2,252,21,1,11, +2,47,96,2,252,20,1,2,47,94,2,252,61,1,11,93,94,67,99,97,108, +108,47,101,99,252,71,1,95,2,252,19,1,93,2,142,96,2,252,20,1,2, +47,2,252,70,1,95,2,54,93,94,1,25,99,117,114,114,101,110,116,45,101, +120,99,101,112,116,105,111,110,45,104,97,110,100,108,101,114,252,72,1,95,2, +252,19,1,93,61,101,252,73,1,94,2,142,95,2,252,19,1,9,96,2,159, +64,108,111,111,112,252,74,1,93,94,2,252,64,1,2,252,64,1,96,2,87, +94,94,65,110,117,108,108,63,252,75,1,2,252,64,1,94,65,114,97,105,115, +101,252,76,1,2,252,73,1,94,94,94,64,99,97,97,114,252,77,1,2,252, +64,1,2,252,73,1,63,117,113,49,252,78,1,94,2,191,94,2,252,74,1, +94,63,99,100,114,252,79,1,2,252,64,1,95,76,99,97,108,108,45,119,105, +116,104,45,118,97,108,117,101,115,252,80,1,2,252,69,1,95,2,252,19,1, +64,97,114,103,115,252,81,1,95,2,252,19,1,9,95,65,97,112,112,108,121, +252,82,1,66,118,97,108,117,101,115,252,83,1,2,252,81,1,83,160,41,43, +35,44,89,162,32,32,8,100,9,225,6,5,4,27,250,22,208,83,160,41,44, +38,44,250,22,208,83,160,41,45,41,44,250,22,58,83,160,41,46,44,44,250, +22,208,83,160,41,47,47,44,249,22,58,250,22,208,83,160,41,48,52,44,249, +22,58,83,160,41,49,54,44,250,22,208,83,160,41,50,57,44,249,22,50,83, +160,41,51,59,44,250,22,2,89,162,33,33,42,9,223,30,250,22,208,83,160, +41,52,35,44,250,22,58,83,160,41,53,38,44,248,22,51,200,248,22,77,200, +83,160,41,54,35,44,248,22,77,23,29,248,22,51,23,29,83,160,41,55,57, +44,83,160,41,56,52,44,250,22,208,83,160,41,57,52,44,249,22,58,83,160, +41,58,54,44,250,22,208,83,160,41,59,57,44,251,22,60,83,160,41,8,28, +8,29,44,83,160,41,8,29,8,29,44,248,22,89,23,28,248,22,86,23,28, +83,160,41,8,30,57,44,83,160,41,8,31,52,44,83,160,41,8,32,47,44, +250,22,208,83,160,41,8,33,47,44,250,22,58,83,160,41,8,34,50,44,83, +160,41,8,35,50,44,250,22,208,83,160,41,8,36,53,44,251,22,58,83,160, +41,8,37,57,44,83,160,41,8,38,57,44,83,160,41,8,39,57,44,250,22, +208,83,160,41,8,40,8,28,44,248,22,58,250,22,208,83,160,41,8,41,8, +32,44,249,22,58,83,160,41,8,42,8,34,44,250,22,208,83,160,41,8,43, +8,37,44,250,22,58,83,160,41,8,44,8,40,44,83,160,41,8,45,8,40, +44,250,22,208,83,160,41,8,46,8,43,44,251,22,58,83,160,41,8,47,8, +47,44,83,160,41,8,48,8,47,44,83,160,41,8,49,8,47,44,250,22,208, +83,160,41,8,50,8,50,44,250,22,60,83,160,41,8,51,8,53,44,250,22, +208,83,160,41,8,52,8,56,44,248,22,58,250,22,208,83,160,41,8,53,8, +60,44,249,22,58,83,160,41,8,54,8,62,44,250,22,208,83,160,41,8,55, +8,65,44,250,22,58,83,160,41,8,56,8,68,44,83,160,41,8,57,8,68, +44,250,22,208,83,160,41,8,58,8,71,44,249,22,58,83,160,41,8,59,8, +73,44,250,22,208,83,160,41,8,60,8,76,44,250,22,58,83,160,41,8,61, +8,79,44,83,160,41,8,62,8,79,44,250,22,208,83,160,41,8,63,8,82, +44,251,22,58,83,160,41,8,64,8,86,44,83,160,41,8,65,8,86,44,83, +160,41,8,66,8,86,44,250,22,208,83,160,41,8,67,8,89,44,251,22,60, +83,160,41,8,68,8,93,44,83,160,41,8,69,8,93,44,250,22,208,83,160, +41,8,70,8,96,44,249,22,58,83,160,41,8,71,8,98,44,248,22,88,23, +97,83,160,41,8,72,8,96,44,83,160,41,8,73,8,93,44,83,160,41,8, +74,8,89,44,83,160,41,8,75,8,82,44,83,160,41,8,76,8,76,44,83, +160,41,8,77,8,71,44,83,160,41,8,78,8,65,44,83,160,41,8,79,8, +60,44,83,160,41,8,80,8,56,44,83,160,41,8,81,8,53,44,83,160,41, +8,82,8,50,44,83,160,41,8,83,8,43,44,83,160,41,8,84,8,37,44, +83,160,41,8,85,8,32,44,83,160,41,8,86,8,28,44,83,160,41,8,87, +53,44,83,160,41,8,88,47,44,83,160,41,8,89,41,44,197,89,162,32,32, +33,9,223,0,192,89,162,32,32,34,9,223,3,248,22,252,175,2,208,250,22, +252,32,2,11,6,10,10,98,97,100,32,115,121,110,116,97,120,197,249,22,7, +248,195,10,248,195,11,36,20,97,158,16,12,2,65,2,68,2,70,2,72,2, +76,2,78,2,80,2,164,2,232,2,233,2,74,2,166,16,90,18,99,2,82, +8,124,36,35,34,16,4,8,123,11,74,100,105,115,97,98,108,101,45,98,114, +101,97,107,63,252,84,1,3,1,7,101,110,118,51,56,51,50,252,85,1,16, +4,8,122,11,2,252,25,1,3,1,7,101,110,118,51,56,51,51,252,86,1, +18,16,2,95,2,135,8,125,93,8,252,189,9,95,9,8,252,189,9,2,106, +18,101,2,136,8,128,36,35,34,8,123,8,122,16,8,8,127,11,3,1,4, +103,52,56,54,252,87,1,3,1,4,103,52,56,55,252,88,1,3,1,4,103, +52,56,56,252,89,1,3,1,7,101,110,118,51,56,52,48,252,90,1,2,252, +90,1,2,252,90,1,16,8,8,126,11,2,141,2,252,23,1,2,252,24,1, +3,1,7,101,110,118,51,56,52,49,252,91,1,2,252,91,1,2,252,91,1, +18,158,2,144,8,128,18,158,2,159,8,128,18,158,9,8,128,18,158,2,144, +8,128,18,101,2,82,8,131,36,35,34,8,123,8,122,16,12,8,130,11,3, +1,4,103,52,56,49,252,92,1,3,1,4,103,52,56,50,252,93,1,3,1, +4,103,52,56,51,252,94,1,3,1,4,103,52,56,52,252,95,1,3,1,4, +103,52,56,53,252,96,1,3,1,7,101,110,118,51,56,53,56,252,97,1,2, +252,97,1,2,252,97,1,2,252,97,1,2,252,97,1,16,12,8,129,11,2, +141,2,252,67,1,2,252,68,1,2,252,23,1,2,252,24,1,3,1,7,101, +110,118,51,56,53,57,252,98,1,2,252,98,1,2,252,98,1,2,252,98,1, +2,252,98,1,18,158,95,158,66,98,101,103,105,110,48,252,99,1,8,131,158, +94,158,94,158,64,99,100,97,114,252,100,1,8,131,158,2,252,64,1,8,131, +8,131,158,2,252,73,1,8,131,8,131,158,96,158,2,252,20,1,8,131,158, +2,47,8,131,158,2,252,70,1,8,131,158,93,158,2,51,8,131,8,131,8, +131,8,131,18,158,96,158,2,252,20,1,8,131,158,2,47,8,131,158,2,252, +70,1,8,131,158,95,158,2,0,8,131,158,93,158,2,51,8,131,8,131,158, +94,158,94,158,2,252,100,1,8,131,158,2,252,64,1,8,131,8,131,158,2, +252,73,1,8,131,8,131,8,131,8,131,18,16,2,95,2,135,8,132,93,8, +252,198,9,95,9,8,252,198,9,2,106,18,16,2,99,2,156,8,137,93,8, +252,198,9,16,6,8,136,11,2,188,2,189,3,1,7,101,110,118,51,56,55, +55,252,101,1,2,252,101,1,16,4,8,135,11,2,199,3,1,7,101,110,118, +51,56,55,56,252,102,1,16,4,8,134,11,2,201,3,1,7,101,110,118,51, +56,55,57,252,103,1,16,4,8,133,11,2,203,3,1,7,101,110,118,51,56, +56,49,252,104,1,95,9,8,252,198,9,2,106,18,158,2,136,8,131,18,158, +2,144,8,131,18,158,2,159,8,131,18,158,2,144,8,131,18,158,2,144,8, +131,18,158,2,252,64,1,8,131,18,158,2,144,8,131,18,158,2,252,65,1, +8,131,18,158,2,144,8,131,18,158,2,252,66,1,8,131,18,158,2,144,8, +131,18,158,2,144,8,131,18,158,2,144,8,131,18,158,2,144,8,131,18,158, +2,252,69,1,8,131,18,158,2,144,8,131,18,158,2,252,19,1,8,131,18, +158,9,8,131,18,158,2,144,8,131,18,158,2,144,8,131,18,158,2,144,8, +131,18,158,2,144,8,131,18,158,2,159,8,131,18,158,93,158,94,158,2,252, +70,1,8,131,158,95,158,2,252,21,1,8,131,158,11,8,131,158,2,47,8, +131,8,131,8,131,8,131,18,158,2,144,8,131,18,158,2,252,20,1,8,131, +18,158,2,47,8,131,18,158,94,158,2,252,61,1,8,131,158,11,8,131,8, +131,18,158,2,144,8,131,18,158,2,144,8,131,18,158,2,252,71,1,8,131, +18,158,2,144,8,131,18,158,2,252,19,1,8,131,18,158,93,158,2,142,8, +131,8,131,18,158,2,144,8,131,18,158,2,252,20,1,8,131,18,158,2,47, +8,131,18,158,2,252,70,1,8,131,18,158,2,144,8,131,18,158,2,54,8, +131,18,158,2,144,8,131,18,158,2,144,8,131,18,158,2,252,72,1,8,131, +18,158,2,144,8,131,18,158,2,252,19,1,8,131,18,158,93,158,2,252,73, +1,8,131,8,131,18,158,2,144,8,131,18,158,2,142,8,131,18,158,2,144, +8,131,18,158,2,252,19,1,8,131,18,158,9,8,131,18,158,2,144,8,131, +18,158,2,159,8,131,18,158,2,252,74,1,8,131,18,158,93,158,94,158,2, +252,64,1,8,131,158,2,252,64,1,8,131,8,131,8,131,18,158,2,144,8, +131,18,158,2,87,8,131,18,158,94,158,94,158,2,252,75,1,8,131,158,2, +252,64,1,8,131,8,131,158,94,158,2,252,76,1,8,131,158,2,252,73,1, +8,131,8,131,8,131,18,158,2,144,8,131,18,158,94,158,94,158,2,252,77, +1,8,131,158,2,252,64,1,8,131,8,131,158,2,252,73,1,8,131,8,131, +18,158,2,144,8,131,18,16,2,105,93,158,94,158,2,191,8,131,158,94,158, +2,252,74,1,8,131,158,94,158,2,252,79,1,8,131,158,2,252,64,1,8, +131,8,131,8,131,8,131,8,141,8,28,59,58,57,56,55,13,16,3,33,2, +173,2,106,93,8,252,198,9,16,6,8,140,11,2,188,2,189,2,252,101,1, +2,252,101,1,16,4,8,139,11,2,199,2,252,102,1,16,4,8,138,11,2, +201,2,252,103,1,95,9,8,252,198,9,2,106,18,158,2,144,8,131,18,158, +2,144,8,131,18,158,2,144,8,131,18,158,2,144,8,131,18,158,2,144,8, +131,18,158,2,144,8,131,18,158,2,144,8,131,18,16,2,158,93,158,95,158, +2,252,80,1,8,131,158,2,252,69,1,8,131,158,95,158,2,252,19,1,8, +131,158,2,252,81,1,8,131,158,95,158,2,252,19,1,8,131,158,9,8,131, +158,95,158,2,252,82,1,8,131,158,2,252,83,1,8,131,158,2,252,81,1, +8,131,8,131,8,131,8,131,8,131,8,141,95,9,8,252,198,9,2,106,18, +158,2,144,8,131,18,158,2,144,8,131,18,158,2,144,8,131,18,158,2,144, +8,131,18,158,2,144,8,131,18,158,2,144,8,131,18,158,2,144,8,131,18, +158,2,144,8,131,11,16,5,93,2,55,89,162,32,33,58,9,223,0,27,249, +22,208,83,160,41,32,35,46,196,27,28,248,80,158,35,32,194,249,80,158,36, +33,248,80,158,37,34,196,27,248,80,158,38,35,197,28,248,80,158,38,32,193, +28,248,80,158,38,36,248,80,158,39,34,194,27,248,80,158,39,35,194,28,248, +80,158,39,32,193,27,248,80,158,40,34,194,28,192,249,80,158,41,37,194,248, +80,158,42,36,248,80,158,43,35,197,11,11,11,11,11,28,192,27,248,22,51, +194,27,248,22,52,195,27,83,160,41,33,37,46,250,22,208,83,160,41,34,40, +46,250,22,208,83,160,41,35,43,46,250,22,60,83,160,41,36,46,46,250,22, +208,83,160,41,37,49,46,248,22,58,250,22,208,83,160,41,38,53,46,249,22, +58,83,160,41,39,55,46,23,19,83,160,41,40,53,46,83,160,41,41,49,46, +83,160,41,42,46,46,83,160,41,43,43,46,195,27,89,162,32,32,51,2,162, +225,3,4,2,27,89,162,32,32,36,2,162,223,1,250,22,252,32,2,11,6, +10,10,98,97,100,32,115,121,110,116,97,120,195,27,28,248,80,158,37,32,195, +249,80,158,38,33,248,80,158,39,34,197,27,248,80,158,40,35,198,28,248,80, +158,40,32,193,27,27,248,80,158,42,34,195,28,248,80,158,42,38,193,248,22, +58,248,80,158,43,39,194,11,28,192,249,80,158,42,37,194,27,248,80,158,44, +35,197,28,248,80,158,44,32,193,27,248,80,158,45,34,194,28,192,249,80,158, +46,37,194,248,80,158,47,36,248,80,158,48,35,197,11,11,11,11,11,28,192, +27,248,22,51,194,27,248,22,77,195,27,248,22,79,196,28,27,248,80,158,41, +39,27,83,160,41,44,42,46,250,22,208,83,160,41,45,45,46,199,195,87,94, +249,22,3,89,162,32,33,39,9,224,10,9,28,248,80,158,34,40,195,12,251, +22,252,32,2,11,6,17,17,110,111,116,32,97,110,32,105,100,101,110,116,105, +102,105,101,114,196,198,194,27,248,80,158,42,41,194,28,192,251,22,252,32,2, +11,6,20,20,100,117,112,108,105,99,97,116,101,32,105,100,101,110,116,105,102, +105,101,114,204,196,12,27,249,22,208,83,160,41,46,42,46,248,80,158,43,42, +27,83,160,41,47,44,46,250,22,208,83,160,41,48,47,46,201,195,27,28,248, +80,158,42,38,194,248,80,158,42,39,194,11,28,192,249,80,158,43,43,202,27, +250,22,60,200,198,201,27,83,160,41,49,45,46,91,159,33,11,90,161,33,32, +11,83,160,38,32,33,11,247,248,22,8,89,162,32,33,40,9,226,15,2,3, +1,250,22,31,89,162,32,32,36,9,225,6,3,7,90,161,33,33,10,247,22, +252,175,2,248,22,252,175,2,89,162,32,33,36,9,224,3,1,248,193,89,162, +32,32,36,9,224,2,3,28,248,22,252,172,2,193,248,22,252,177,2,193,249, +80,158,35,44,21,96,70,108,101,116,45,118,97,108,117,101,115,252,105,1,93, +94,94,64,116,101,109,112,252,106,1,2,156,2,252,24,1,95,64,115,101,116, +33,252,107,1,62,105,100,252,108,1,2,252,106,1,2,156,83,160,41,50,35, +46,89,162,32,32,55,9,225,6,5,4,27,250,22,208,83,160,41,51,38,46, +250,22,208,83,160,41,52,41,46,250,22,60,83,160,41,53,44,46,250,22,208, +83,160,41,54,47,46,248,22,58,250,22,208,83,160,41,55,51,46,249,22,58, +248,22,77,23,20,248,22,51,23,20,83,160,41,56,51,46,83,160,41,57,47, +46,250,22,2,89,162,33,33,42,9,223,15,250,22,208,83,160,41,58,35,46, +250,22,58,83,160,41,59,38,46,248,22,51,200,248,22,77,200,83,160,41,8, +28,35,46,248,22,79,206,248,22,77,206,83,160,41,8,29,41,46,197,89,162, +32,32,33,9,223,0,192,89,162,32,32,34,9,223,3,248,22,252,175,2,208, +248,80,158,42,45,83,160,41,8,30,42,46,247,196,247,193,27,28,248,80,158, +37,32,196,249,80,158,38,33,248,80,158,39,34,198,27,248,80,158,40,35,199, +28,248,80,158,40,32,193,27,27,248,80,158,42,34,195,28,248,80,158,42,32, +193,249,80,158,43,33,248,80,158,44,34,195,248,80,158,44,36,248,80,158,45, +35,196,11,28,192,249,80,158,42,37,194,27,248,80,158,44,35,197,28,248,80, +158,44,32,193,27,248,80,158,45,34,194,28,192,249,80,158,46,37,194,248,80, +158,47,36,248,80,158,48,35,197,11,11,11,11,11,28,192,27,248,22,51,194, +27,248,22,77,195,27,248,22,79,196,28,248,80,158,40,40,194,27,249,22,60, +195,196,27,83,160,41,8,31,41,46,250,22,208,83,160,41,8,32,44,46,250, +22,208,83,160,41,8,33,47,46,250,22,58,83,160,41,8,34,50,46,248,22, +52,203,248,22,51,203,83,160,41,8,35,47,46,195,247,196,247,193,32,20,97, +158,16,14,2,65,2,68,2,70,2,72,2,76,2,74,2,78,2,80,2,163, +30,252,109,1,2,104,2,119,0,30,252,110,1,2,128,2,132,0,2,164,2, +166,2,234,16,36,18,98,2,82,8,143,36,35,34,16,4,8,142,11,2,252, +25,1,3,1,7,101,110,118,51,56,57,48,252,111,1,18,16,2,95,2,135, +8,144,93,8,252,222,9,95,9,8,252,222,9,2,106,18,100,2,136,8,147, +36,35,34,8,142,16,6,8,146,11,3,1,4,103,52,57,56,252,112,1,3, +1,4,103,52,57,57,252,113,1,3,1,7,101,110,118,51,56,57,55,252,114, +1,2,252,114,1,16,6,8,145,11,2,141,2,252,24,1,3,1,7,101,110, +118,51,56,57,56,252,115,1,2,252,115,1,18,158,2,144,8,147,18,158,2, +252,105,1,8,147,18,158,2,144,8,147,18,158,2,144,8,147,18,158,9,8, +147,18,158,2,144,8,147,18,158,2,144,8,147,18,16,2,103,93,158,93,158, +64,118,111,105,100,252,116,1,8,147,8,147,8,149,8,28,59,58,57,56,55, +13,16,3,33,2,173,2,106,93,8,252,222,9,16,6,8,148,11,2,188,2, +189,3,1,7,101,110,118,51,57,48,50,252,117,1,2,252,117,1,95,9,8, +252,222,9,2,106,18,158,2,144,8,147,18,16,2,95,2,135,8,150,93,8, +252,223,9,95,9,8,252,223,9,2,106,18,100,2,136,8,153,36,35,34,8, +142,16,8,8,152,11,3,1,4,103,52,57,50,252,118,1,3,1,4,103,52, +57,51,252,119,1,3,1,4,103,52,57,52,252,120,1,3,1,7,101,110,118, +51,57,49,52,252,121,1,2,252,121,1,2,252,121,1,16,8,8,151,11,2, +141,2,252,108,1,2,252,24,1,3,1,7,101,110,118,51,57,49,53,252,122, +1,2,252,122,1,2,252,122,1,18,158,2,82,8,153,18,16,2,95,2,135, +8,154,93,8,252,227,9,95,9,8,252,227,9,2,106,18,158,2,136,8,153, +18,16,2,95,2,135,8,155,93,8,252,230,9,95,9,8,252,230,9,2,106, +18,16,2,99,2,156,8,160,93,8,252,230,9,16,6,8,159,11,2,188,2, +189,3,1,7,101,110,118,51,57,51,50,252,123,1,2,252,123,1,16,4,8, +158,11,2,199,3,1,7,101,110,118,51,57,51,51,252,124,1,16,4,8,157, +11,2,201,3,1,7,101,110,118,51,57,51,52,252,125,1,16,4,8,156,11, +2,203,3,1,7,101,110,118,51,57,51,54,252,126,1,95,9,8,252,230,9, +2,106,18,102,2,136,8,165,36,35,34,8,142,16,8,8,164,11,2,252,118, +1,2,252,119,1,2,252,120,1,2,252,121,1,2,252,121,1,2,252,121,1, +16,8,8,163,11,2,141,2,252,108,1,2,252,24,1,2,252,122,1,2,252, +122,1,2,252,122,1,16,4,8,162,11,3,1,4,103,53,48,50,252,127,1, +3,1,7,101,110,118,51,57,50,56,252,128,1,16,4,8,161,11,2,252,106, +1,3,1,7,101,110,118,51,57,50,57,252,129,1,18,158,2,144,8,165,18, +158,2,252,105,1,8,165,18,158,2,144,8,165,18,158,2,144,8,165,18,158, +2,144,8,165,18,158,2,144,8,165,18,158,2,144,8,165,18,158,2,252,107, +1,8,165,18,158,2,144,8,165,18,158,2,144,8,165,18,16,2,158,94,98, +2,252,106,1,8,169,93,8,252,226,9,16,4,8,168,11,3,1,8,119,115, +116,109,112,53,48,48,252,130,1,3,1,7,101,110,118,51,57,50,51,252,131, +1,16,4,8,167,11,3,1,4,103,53,48,49,252,132,1,3,1,7,101,110, +118,51,57,52,53,252,133,1,16,4,8,166,11,2,252,11,1,3,1,7,101, +110,118,51,57,52,54,252,134,1,158,2,156,8,169,8,169,95,9,8,252,226, +9,2,128,18,16,2,95,2,135,8,170,93,8,252,233,9,95,9,8,252,233, +9,2,106,18,100,2,136,8,173,36,35,34,8,142,16,8,8,172,11,3,1, +4,103,52,57,53,252,135,1,3,1,4,103,52,57,54,252,136,1,3,1,4, +103,52,57,55,252,137,1,3,1,7,101,110,118,51,57,53,53,252,138,1,2, +252,138,1,2,252,138,1,16,8,8,171,11,2,141,2,252,108,1,2,252,24, +1,3,1,7,101,110,118,51,57,53,54,252,139,1,2,252,139,1,2,252,139, +1,18,158,2,144,8,173,18,158,2,252,107,1,8,173,18,158,2,144,8,173, +11,16,5,93,2,61,89,162,32,33,8,32,9,223,0,27,249,22,208,83,160, +41,32,35,39,196,27,28,248,80,158,35,32,194,249,80,158,36,33,248,80,158, +37,34,196,27,248,80,158,38,35,197,28,248,80,158,38,32,193,249,80,158,39, +33,248,80,158,40,34,195,27,248,80,158,41,35,196,28,248,80,158,41,32,193, +249,80,158,42,33,248,80,158,43,34,195,27,248,80,158,44,35,196,28,248,80, +158,44,36,193,248,80,158,44,37,193,11,11,11,11,28,192,27,248,22,51,194, +27,248,22,77,195,27,248,22,86,196,27,248,22,87,197,249,80,158,40,38,201, +27,250,22,60,198,199,200,27,83,160,41,33,42,39,250,22,208,83,160,41,34, +45,39,250,22,208,83,160,41,35,48,39,249,22,58,83,160,41,36,50,39,250, +22,208,83,160,41,37,53,39,251,22,60,83,160,41,38,57,39,250,22,208,83, +160,41,39,8,28,39,248,22,58,248,22,79,23,21,83,160,41,40,8,28,39, +248,22,77,23,17,248,22,51,23,17,83,160,41,41,53,39,83,160,41,42,48, +39,195,250,22,252,32,2,11,6,10,10,98,97,100,32,115,121,110,116,97,120, +196,32,20,97,158,16,7,2,65,2,68,2,70,2,72,2,78,2,80,2,164, +16,11,18,98,2,82,8,175,36,35,34,16,4,8,174,11,2,252,25,1,3, +1,7,101,110,118,51,57,54,50,252,140,1,18,16,2,95,2,135,8,176,93, +8,252,243,9,95,9,8,252,243,9,2,106,18,100,2,136,8,179,36,35,34, +8,174,16,10,8,178,11,3,1,4,103,53,48,51,252,141,1,3,1,4,103, +53,48,52,252,142,1,3,1,4,103,53,48,53,252,143,1,3,1,4,103,53, +48,54,252,144,1,3,1,7,101,110,118,51,57,54,57,252,145,1,2,252,145, +1,2,252,145,1,2,252,145,1,16,10,8,177,11,2,141,2,226,65,98,111, +100,121,49,252,146,1,2,252,69,1,3,1,7,101,110,118,51,57,55,48,252, +147,1,2,252,147,1,2,252,147,1,2,252,147,1,18,158,2,144,8,179,18, +158,67,99,97,108,108,47,99,99,252,148,1,8,179,18,158,2,144,8,179,18, +158,2,252,19,1,8,179,18,158,2,144,8,179,18,158,2,144,8,179,18,158, +2,144,8,179,18,158,2,144,8,179,11,16,5,93,2,52,89,162,32,33,51, +9,223,0,27,249,22,208,83,160,41,32,35,41,196,27,28,248,80,158,35,32, +194,249,80,158,36,33,248,80,158,37,34,196,27,248,80,158,38,35,197,28,248, +80,158,38,32,193,249,80,158,39,33,248,80,158,40,34,195,27,248,80,158,41, +35,196,28,248,80,158,41,32,193,27,27,248,80,158,43,34,195,28,248,80,158, +43,36,193,248,22,58,248,80,158,44,37,194,11,28,192,249,80,158,43,38,194, +27,248,80,158,45,35,197,28,248,80,158,45,32,193,249,80,158,46,33,248,80, +158,47,34,195,27,248,80,158,48,35,196,28,248,80,158,48,36,193,248,80,158, +48,37,193,11,11,11,11,11,11,28,192,27,248,22,51,194,27,248,22,77,195, +27,248,22,86,196,27,248,22,89,197,27,248,22,88,198,249,80,158,41,39,202, +27,251,22,60,202,200,199,201,27,83,160,41,33,43,41,91,159,33,11,90,161, +33,32,11,83,160,38,32,33,11,247,248,22,8,89,162,32,33,40,9,226,13, +2,3,1,250,22,31,89,162,32,32,36,9,225,6,3,7,90,161,33,33,10, +247,22,252,175,2,248,22,252,175,2,89,162,32,33,36,9,224,3,1,248,193, +89,162,32,32,36,9,224,2,3,28,248,22,252,172,2,193,248,22,252,177,2, +193,249,80,158,35,40,21,98,2,159,9,95,2,101,64,98,97,115,101,252,149, +1,94,65,102,105,101,108,100,252,150,1,2,156,2,252,146,1,2,252,69,1, +2,156,83,160,41,34,35,41,89,162,32,32,54,9,225,6,5,4,27,250,22, +208,83,160,41,35,38,41,250,22,208,83,160,41,36,41,41,252,22,60,83,160, +41,37,46,41,83,160,41,38,46,41,250,22,208,83,160,41,39,49,41,250,22, +58,83,160,41,40,52,41,248,22,51,23,19,248,22,87,23,19,83,160,41,41, +49,41,248,22,77,205,248,22,86,205,83,160,41,42,41,41,197,89,162,32,32, +33,9,223,0,192,89,162,32,32,34,9,223,3,248,22,252,175,2,208,250,22, +252,32,2,11,6,10,10,98,97,100,32,115,121,110,116,97,120,196,32,20,97, +158,16,9,2,65,2,68,2,70,2,72,2,78,2,80,2,74,2,164,2,166, +16,11,18,98,2,82,8,181,36,35,34,16,4,8,180,11,2,252,25,1,3, +1,7,101,110,118,51,57,55,56,252,151,1,18,16,2,95,2,135,8,182,93, +8,252,0,10,95,9,8,252,0,10,2,106,18,16,2,99,2,156,8,187,93, +8,252,0,10,16,6,8,186,11,2,188,2,189,3,1,7,101,110,118,51,57, +57,54,252,152,1,2,252,152,1,16,4,8,185,11,2,199,3,1,7,101,110, +118,51,57,57,55,252,153,1,16,4,8,184,11,2,201,3,1,7,101,110,118, +51,57,57,56,252,154,1,16,4,8,183,11,2,203,3,1,7,101,110,118,52, +48,48,48,252,155,1,95,9,8,252,0,10,2,106,18,100,2,136,8,190,36, +35,34,8,180,16,12,8,189,11,3,1,4,103,53,48,55,252,156,1,3,1, +4,103,53,48,56,252,157,1,3,1,4,103,53,48,57,252,158,1,3,1,4, +103,53,49,48,252,159,1,3,1,4,103,53,49,49,252,160,1,3,1,7,101, +110,118,51,57,56,56,252,161,1,2,252,161,1,2,252,161,1,2,252,161,1, +2,252,161,1,16,12,8,188,11,2,141,2,252,149,1,2,252,150,1,2,252, +146,1,2,252,69,1,3,1,7,101,110,118,51,57,56,57,252,162,1,2,252, +162,1,2,252,162,1,2,252,162,1,2,252,162,1,18,158,2,144,8,190,18, +158,2,159,8,190,18,158,9,8,190,18,158,2,144,8,190,18,158,2,101,8, +190,18,158,2,144,8,190,18,158,2,144,8,190,11,16,5,93,2,60,89,162, +32,33,55,9,223,0,27,249,22,208,83,160,41,32,35,46,196,27,28,248,80, +158,35,32,194,249,80,158,36,33,248,80,158,37,34,196,27,248,80,158,38,35, +197,28,248,80,158,38,32,193,28,248,80,158,38,36,248,80,158,39,34,194,27, +248,80,158,39,35,194,28,248,80,158,39,32,193,249,80,158,40,33,248,80,158, +41,34,195,27,248,80,158,42,35,196,28,248,80,158,42,37,193,248,80,158,42, +38,193,11,11,11,11,11,28,192,27,248,22,51,194,27,248,22,77,195,27,248, +22,79,196,249,80,158,39,39,200,27,249,22,60,197,198,27,83,160,41,33,41, +46,250,22,208,83,160,41,34,44,46,250,22,208,83,160,41,35,47,46,251,22, +60,83,160,41,36,51,46,83,160,41,37,51,46,248,22,52,204,248,22,51,204, +83,160,41,38,47,46,195,27,28,248,80,158,36,32,195,249,80,158,37,33,248, +80,158,38,34,197,27,248,80,158,39,35,198,28,248,80,158,39,32,193,27,27, +248,80,158,41,34,195,28,248,80,158,41,37,193,248,22,8,89,162,32,33,39, +9,224,9,1,27,249,22,2,89,162,32,33,44,9,224,4,5,249,80,158,35, +40,28,248,80,158,36,32,197,249,80,158,37,33,248,80,158,38,34,199,27,248, +80,158,39,35,200,28,248,80,158,39,32,193,249,80,158,40,33,248,80,158,41, +34,195,248,80,158,41,36,248,80,158,42,35,196,11,11,194,248,80,158,37,38, +196,28,248,22,56,193,21,94,9,9,248,80,158,35,41,193,11,28,192,249,80, +158,41,42,194,27,248,80,158,43,35,197,28,248,80,158,43,32,193,249,80,158, +44,33,248,80,158,45,34,195,27,248,80,158,46,35,196,28,248,80,158,46,37, +193,248,80,158,46,38,193,11,11,11,11,11,28,192,27,248,22,51,194,27,248, +22,77,195,27,248,22,86,196,27,248,22,89,197,27,248,22,88,198,27,249,22, +208,83,160,41,39,43,46,248,80,158,44,43,27,83,160,41,40,45,46,250,22, +208,83,160,41,41,48,46,203,195,27,28,248,80,158,43,37,194,248,80,158,43, +38,194,11,28,192,249,80,158,44,39,205,27,252,22,60,203,204,205,200,202,27, +83,160,41,42,46,46,91,159,33,11,90,161,33,32,11,83,160,38,32,33,11, +247,248,22,8,89,162,32,33,40,9,226,16,2,3,1,250,22,31,89,162,32, +32,36,9,225,6,3,7,90,161,33,33,10,247,22,252,175,2,248,22,252,175, +2,89,162,32,33,36,9,224,3,1,248,193,89,162,32,32,36,9,224,2,3, +28,248,22,252,172,2,193,248,22,252,177,2,193,249,80,158,35,44,21,95,2, +159,94,94,63,116,109,112,252,163,1,2,252,39,1,2,156,95,2,159,93,94, +64,115,119,97,112,252,164,1,96,2,252,19,1,9,96,2,159,93,94,2,247, +2,252,163,1,95,2,252,107,1,2,252,163,1,64,110,97,109,101,252,165,1, +95,2,252,107,1,2,252,165,1,2,247,2,156,96,72,100,121,110,97,109,105, +99,45,119,105,110,100,252,166,1,2,252,164,1,97,2,252,19,1,9,2,252, +146,1,2,252,69,1,2,156,2,252,164,1,83,160,41,43,35,46,89,162,32, +32,8,40,9,225,6,5,4,27,250,22,208,83,160,41,44,38,46,250,22,208, +83,160,41,45,41,46,250,22,58,83,160,41,46,44,46,250,22,2,89,162,33, +33,41,9,223,15,250,22,208,83,160,41,47,35,46,249,22,58,248,22,51,199, +248,22,77,199,83,160,41,48,35,46,248,22,89,206,248,22,77,206,250,22,208, +83,160,41,49,47,46,250,22,58,83,160,41,50,50,46,250,22,208,83,160,41, +51,53,46,248,22,58,250,22,208,83,160,41,52,57,46,249,22,58,83,160,41, +53,59,46,250,22,208,83,160,41,54,8,30,46,250,22,60,83,160,41,55,8, +33,46,83,160,41,56,8,33,46,252,22,2,89,162,33,33,52,9,223,38,250, +22,208,83,160,41,57,35,46,251,22,58,83,160,41,58,39,46,250,22,208,83, +160,41,59,42,46,248,22,58,250,22,208,83,160,41,8,28,46,46,249,22,58, +83,160,41,8,29,48,46,248,22,51,23,18,83,160,41,8,30,46,46,83,160, +41,8,31,42,46,250,22,208,83,160,41,8,32,42,46,250,22,58,83,160,41, +8,33,45,46,248,22,51,23,15,248,22,86,23,15,83,160,41,8,34,42,46, +250,22,208,83,160,41,8,35,42,46,250,22,60,83,160,41,8,36,45,46,248, +22,86,23,15,83,160,41,8,37,45,46,83,160,41,8,38,42,46,83,160,41, +8,39,35,46,248,22,89,23,37,248,22,89,23,37,248,22,86,23,37,248,22, +86,23,37,83,160,41,8,40,8,30,46,83,160,41,8,41,57,46,83,160,41, +8,42,53,46,250,22,208,83,160,41,8,43,53,46,251,22,60,83,160,41,8, +44,57,46,83,160,41,8,45,57,46,250,22,208,83,160,41,8,46,8,28,46, +251,22,60,83,160,41,8,47,8,32,46,83,160,41,8,48,8,32,46,248,22, +51,23,31,248,22,88,23,31,83,160,41,8,49,8,28,46,83,160,41,8,50, +57,46,83,160,41,8,51,53,46,83,160,41,8,52,47,46,83,160,41,8,53, +41,46,197,89,162,32,32,33,9,223,0,192,89,162,32,32,34,9,223,3,248, +22,252,175,2,208,248,80,158,43,45,83,160,41,8,54,43,46,250,22,252,32, +2,11,6,10,10,98,97,100,32,115,121,110,116,97,120,197,32,20,97,158,16, +14,2,65,2,68,2,70,2,72,2,76,2,78,2,80,2,164,2,232,2,233, +2,74,2,252,110,1,2,166,2,234,16,55,18,98,2,82,8,192,36,35,34, +16,4,8,191,11,2,252,25,1,3,1,7,101,110,118,52,48,48,55,252,167, +1,18,16,2,95,2,135,8,193,93,8,252,19,10,95,9,8,252,19,10,2, +106,18,100,2,136,8,196,36,35,34,8,191,16,8,8,195,11,3,1,4,103, +53,49,55,252,168,1,3,1,4,103,53,49,56,252,169,1,3,1,4,103,53, +49,57,252,170,1,3,1,7,101,110,118,52,48,49,52,252,171,1,2,252,171, +1,2,252,171,1,16,8,8,194,11,2,141,2,252,146,1,2,252,69,1,3, +1,7,101,110,118,52,48,49,53,252,172,1,2,252,172,1,2,252,172,1,18, +158,2,144,8,196,18,158,2,159,8,196,18,158,9,8,196,18,158,2,144,8, +196,18,100,2,82,8,199,36,35,34,8,191,16,12,8,198,11,3,1,4,103, +53,49,50,252,173,1,3,1,4,103,53,49,51,252,174,1,3,1,4,103,53, +49,52,252,175,1,3,1,4,103,53,49,53,252,176,1,3,1,4,103,53,49, +54,252,177,1,3,1,7,101,110,118,52,48,51,50,252,178,1,2,252,178,1, +2,252,178,1,2,252,178,1,2,252,178,1,16,12,8,197,11,2,141,2,252, +165,1,2,252,39,1,2,252,146,1,2,252,69,1,3,1,7,101,110,118,52, +48,51,51,252,179,1,2,252,179,1,2,252,179,1,2,252,179,1,2,252,179, +1,18,16,2,95,2,135,8,200,93,8,252,22,10,95,9,8,252,22,10,2, +106,18,158,2,136,8,199,18,16,2,95,2,135,8,201,93,8,252,25,10,95, +9,8,252,25,10,2,106,18,16,2,99,2,156,8,206,93,8,252,25,10,16, +6,8,205,11,2,188,2,189,3,1,7,101,110,118,52,48,52,57,252,180,1, +2,252,180,1,16,4,8,204,11,2,199,3,1,7,101,110,118,52,48,53,48, +252,181,1,16,4,8,203,11,2,201,3,1,7,101,110,118,52,48,53,49,252, +182,1,16,4,8,202,11,2,203,3,1,7,101,110,118,52,48,53,51,252,183, +1,95,9,8,252,25,10,2,106,18,102,2,136,8,209,36,35,34,8,191,8, +198,8,197,16,4,8,208,11,3,1,4,103,53,50,50,252,184,1,3,1,7, +101,110,118,52,48,52,53,252,185,1,16,4,8,207,11,2,252,163,1,3,1, +7,101,110,118,52,48,52,54,252,186,1,18,158,2,144,8,209,18,158,2,159, +8,209,18,158,2,144,8,209,18,158,2,144,8,209,18,158,2,144,8,209,18, +158,2,159,8,209,18,158,2,144,8,209,18,158,2,144,8,209,18,158,2,252, +164,1,8,209,18,158,2,144,8,209,18,158,2,252,19,1,8,209,18,158,9, +8,209,18,158,2,144,8,209,18,158,2,159,8,209,18,158,2,144,8,209,18, +158,2,144,8,209,18,158,2,247,8,209,18,158,2,144,8,209,18,158,2,144, +8,209,18,158,2,144,8,209,18,158,2,252,107,1,8,209,18,158,2,144,8, +209,18,158,2,144,8,209,18,158,2,252,107,1,8,209,18,16,2,106,93,158, +2,247,8,209,8,214,8,28,59,58,57,56,55,13,16,3,33,2,173,2,106, +93,8,252,25,10,16,6,8,213,11,2,188,2,189,2,252,180,1,2,252,180, +1,16,4,8,212,11,2,199,2,252,181,1,16,4,8,211,11,2,201,2,252, +182,1,16,4,8,210,11,64,118,97,108,115,252,187,1,3,1,7,101,110,118, +52,48,53,57,252,188,1,95,9,8,252,25,10,2,106,18,158,2,144,8,209, +18,158,2,144,8,209,18,158,2,144,8,209,18,158,2,144,8,209,18,158,2, +144,8,209,18,158,2,144,8,209,18,158,2,252,166,1,8,209,18,158,2,252, +164,1,8,209,18,158,2,144,8,209,18,158,2,252,19,1,8,209,18,158,9, +8,209,18,158,2,144,8,209,18,16,2,105,93,158,2,252,164,1,8,209,8, +215,8,28,59,58,57,56,55,13,16,3,33,2,173,2,106,93,8,252,25,10, +8,213,8,212,8,211,95,9,8,252,25,10,2,106,18,158,2,144,8,209,18, +158,2,144,8,209,18,158,2,144,8,209,18,16,2,158,94,98,2,252,163,1, +8,219,93,8,252,21,10,16,4,8,218,11,3,1,8,119,115,116,109,112,53, +50,48,252,189,1,3,1,7,101,110,118,52,48,52,48,252,190,1,16,4,8, +217,11,3,1,4,103,53,50,49,252,191,1,3,1,7,101,110,118,52,48,54, +52,252,192,1,16,4,8,216,11,2,252,11,1,3,1,7,101,110,118,52,48, +54,53,252,193,1,158,2,156,8,219,8,219,95,9,8,252,21,10,2,128,11, +16,5,93,2,56,89,162,32,33,8,41,9,223,0,27,249,22,208,83,160,41, +32,35,39,196,27,28,248,80,158,35,32,194,249,80,158,36,33,248,80,158,37, +34,196,27,248,80,158,38,35,197,28,248,80,158,38,32,193,249,80,158,39,33, +248,80,158,40,34,195,27,248,80,158,41,35,196,28,248,80,158,41,36,193,248, +80,158,41,37,193,11,11,11,28,192,27,248,22,51,194,27,248,22,77,195,27, +248,22,79,196,249,80,158,39,38,200,27,249,22,60,198,197,27,83,160,41,33, +41,39,250,22,208,83,160,41,34,44,39,250,22,208,83,160,41,35,47,39,250, +22,60,83,160,41,36,50,39,250,22,208,83,160,41,37,53,39,248,22,58,250, +22,208,83,160,41,38,57,39,249,22,58,83,160,41,39,59,39,250,22,208,83, +160,41,40,8,30,39,250,22,60,83,160,41,41,8,33,39,250,22,208,83,160, +41,42,8,36,39,250,22,60,83,160,41,43,8,39,39,83,160,41,44,8,39, +39,23,31,83,160,41,45,8,36,39,83,160,41,46,8,33,39,83,160,41,47, +8,30,39,83,160,41,48,57,39,83,160,41,49,53,39,83,160,41,50,50,39, +83,160,41,51,47,39,195,250,22,252,32,2,11,6,10,10,98,97,100,32,115, +121,110,116,97,120,196,32,20,97,158,16,7,2,65,2,68,2,70,2,72,2, +78,2,80,2,164,16,20,18,98,2,82,8,221,36,35,34,16,4,8,220,11, +2,252,25,1,3,1,7,101,110,118,52,48,54,56,252,194,1,18,16,2,95, +2,135,8,222,93,8,252,36,10,95,9,8,252,36,10,2,106,18,100,2,136, +8,225,36,35,34,8,220,16,8,8,224,11,3,1,4,103,53,50,51,252,195, +1,3,1,4,103,53,50,52,252,196,1,3,1,4,103,53,50,53,252,197,1, +3,1,7,101,110,118,52,48,55,52,252,198,1,2,252,198,1,2,252,198,1, +16,8,8,223,11,2,141,2,252,23,1,2,252,24,1,3,1,7,101,110,118, +52,48,55,53,252,199,1,2,252,199,1,2,252,199,1,18,158,2,144,8,225, +18,158,2,252,105,1,8,225,18,158,2,144,8,225,18,158,2,144,8,225,18, +158,96,158,2,155,8,225,158,63,99,112,117,252,200,1,8,225,158,64,117,115, +101,114,252,201,1,8,225,158,62,103,99,252,202,1,8,225,8,225,18,158,2, +144,8,225,18,158,70,116,105,109,101,45,97,112,112,108,121,252,203,1,8,225, +18,158,2,144,8,225,18,158,2,252,19,1,8,225,18,158,9,8,225,18,158, +2,144,8,225,18,16,2,103,93,158,64,110,117,108,108,252,204,1,8,225,8, +227,8,28,59,58,57,56,55,13,16,3,33,2,173,2,106,93,8,252,36,10, +16,6,8,226,11,2,188,2,189,3,1,7,101,110,118,52,48,56,48,252,205, +1,2,252,205,1,95,9,8,252,36,10,2,106,18,158,2,144,8,225,18,158, +2,144,8,225,18,158,2,144,8,225,18,16,2,158,94,158,97,158,66,112,114, +105,110,116,102,252,206,1,8,225,158,6,40,40,99,112,117,32,116,105,109,101, +58,32,126,115,32,114,101,97,108,32,116,105,109,101,58,32,126,115,32,103,99, +32,116,105,109,101,58,32,126,115,126,110,8,225,158,2,252,200,1,8,225,158, +2,252,201,1,8,225,158,2,252,202,1,8,225,8,225,158,95,158,2,252,82, +1,8,225,158,2,252,83,1,8,225,158,2,155,8,225,8,225,8,227,95,9, +8,252,36,10,2,106,18,158,2,144,8,225,11,100,83,159,32,97,80,158,32, +32,80,158,32,33,80,158,32,34,80,158,32,35,80,158,32,36,27,247,22,252, +104,2,87,94,28,28,192,248,22,252,3,2,248,22,252,103,2,194,11,250,22, +252,33,2,2,101,6,15,15,105,110,115,112,101,99,116,111,114,32,111,114,32, +35,102,195,12,91,159,37,11,90,161,37,32,11,254,22,252,83,2,2,83,11, +33,32,11,9,204,252,22,7,197,198,199,250,22,252,85,2,203,32,61,112,252, +207,1,250,22,252,86,2,204,32,2,252,207,1,83,159,32,93,80,158,32,37, +89,162,32,33,39,2,14,223,0,87,94,28,248,80,158,33,34,194,12,250,22, +252,33,2,2,14,6,7,7,112,114,111,109,105,115,101,196,27,248,80,158,34, +35,195,28,248,22,0,193,27,249,22,6,195,22,58,87,94,28,248,22,0,248, +80,158,36,35,197,249,80,158,36,36,197,194,12,249,22,1,22,7,248,80,158, +37,35,198,249,22,1,22,7,194,83,159,32,93,80,158,32,38,89,162,32,32, +36,2,16,223,0,248,80,158,33,39,249,22,19,11,80,158,35,40,83,159,32, +93,80,158,32,41,89,162,32,34,40,2,23,223,0,87,95,28,248,22,252,213, +2,194,12,252,22,252,33,2,2,23,6,16,16,112,97,114,97,109,101,116,101, +114,105,122,97,116,105,111,110,32,198,199,28,28,248,22,0,195,249,22,34,196, +32,11,12,252,22,252,33,2,2,23,6,19,19,112,114,111,99,101,100,117,114, +101,32,40,97,114,105,116,121,32,48,41,33,198,199,20,14,159,80,158,32,40, +193,247,194,83,159,32,97,80,158,32,42,80,158,32,43,80,158,32,44,80,158, +32,45,80,158,32,46,252,22,252,83,2,2,102,11,33,32,11,83,159,32,97, +80,158,32,47,80,158,32,48,80,158,32,49,80,158,32,50,80,158,32,51,27, +247,22,252,104,2,87,94,28,28,192,248,22,252,3,2,248,22,252,103,2,194, +11,250,22,252,33,2,2,101,6,15,15,105,110,115,112,101,99,116,111,114,32, +111,114,32,35,102,195,12,91,159,37,11,90,161,37,32,11,254,22,252,83,2, +2,102,11,33,32,11,9,204,252,22,7,197,198,199,250,22,252,85,2,203,32, +64,99,101,108,108,252,208,1,250,22,252,86,2,204,32,2,252,208,1,83,159, +32,93,80,158,32,52,89,162,32,32,36,2,45,223,0,248,80,158,33,43,249, +22,19,11,80,158,35,53,83,159,32,93,80,158,32,54,89,162,32,34,40,2, +49,223,0,87,95,28,248,80,158,33,44,194,12,252,22,252,33,2,2,49,6, +22,22,98,114,101,97,107,32,112,97,114,97,109,101,116,101,114,105,122,97,116, +105,111,110,32,198,199,28,28,248,22,0,195,249,22,34,196,32,11,12,252,22, +252,33,2,2,23,6,19,19,112,114,111,99,101,100,117,114,101,32,40,97,114, +105,116,121,32,48,41,33,198,199,83,158,36,20,92,94,20,14,159,80,158,32, +53,249,80,158,34,45,195,32,87,94,247,80,158,32,55,247,194,247,80,158,32, +55,96,68,35,37,107,101,114,110,101,108,252,209,1,74,35,37,115,109,97,108, +108,45,115,99,104,101,109,101,252,210,1,2,93,2,18,96,2,252,209,1,2, +66,2,104,2,112,0}; + EVAL_ONE_SIZED_STR((char *)expr, 23273); } { - static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,48,46,51,252,216,1,252,141,53,159,32,20,96,158,16,1, -20,23,65,98,101,103,105,110,0,16,0,83,158,39,20,93,114,66,35,37,109, -105,115,99,1,29,2,11,11,10,10,10,44,80,158,32,32,20,96,158,16,47, + static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,49,46,52,252,216,1,252,141,53,159,32,20,97,158,16,1, +20,23,65,98,101,103,105,110,0,16,0,83,158,39,20,94,114,66,35,37,109, +105,115,99,1,29,2,11,11,10,10,10,44,80,158,32,32,20,97,158,16,47, 30,3,2,2,72,112,97,116,104,45,115,116,114,105,110,103,63,4,254,1,30, 5,2,2,70,45,114,101,58,115,117,102,102,105,120,6,254,1,30,7,2,2, 79,112,97,116,104,45,114,101,112,108,97,99,101,45,115,117,102,102,105,120,8, @@ -3434,182 +3475,182 @@ 248,80,158,41,37,193,11,11,11,28,192,27,248,22,51,194,27,248,22,77,195, 27,248,22,79,196,27,249,22,208,83,160,41,33,40,38,249,22,208,203,247,22, 47,27,249,22,208,83,160,41,34,41,38,249,22,208,204,247,22,47,27,249,22, -208,83,160,41,35,42,38,249,22,208,205,247,22,47,27,252,22,60,202,199,198, -200,201,27,83,160,41,36,42,38,250,22,208,83,160,41,37,45,38,250,22,208, +208,83,160,41,35,42,38,249,22,208,205,247,22,47,27,252,22,60,200,199,201, +202,198,27,83,160,41,36,42,38,250,22,208,83,160,41,37,45,38,250,22,208, 83,160,41,38,48,38,250,22,58,83,160,41,39,51,38,250,22,208,83,160,41, -40,54,38,248,22,58,250,22,208,83,160,41,41,58,38,249,22,50,248,22,89, +40,54,38,248,22,58,250,22,208,83,160,41,41,58,38,249,22,50,248,22,51, 23,20,83,160,41,42,8,28,38,83,160,41,43,58,38,83,160,41,44,54,38, 250,22,208,83,160,41,45,54,38,251,22,58,83,160,41,46,58,38,250,22,208, 83,160,41,47,8,29,38,248,22,58,250,22,208,83,160,41,48,8,33,38,249, 22,58,248,22,77,23,27,250,22,208,83,160,41,49,8,38,38,250,22,58,83, -160,41,50,8,41,38,248,22,51,23,33,250,22,208,83,160,41,51,8,44,38, +160,41,50,8,41,38,248,22,89,23,33,250,22,208,83,160,41,51,8,44,38, 250,22,58,83,160,41,52,8,47,38,250,22,208,83,160,41,53,8,50,38,248, -22,58,250,22,208,83,160,41,54,8,54,38,249,22,58,248,22,86,23,48,250, +22,58,250,22,208,83,160,41,54,8,54,38,249,22,58,248,22,88,23,48,250, 22,208,83,160,41,55,8,59,38,249,22,58,83,160,41,56,8,61,38,248,22, -89,23,53,83,160,41,57,8,59,38,83,160,41,58,8,54,38,83,160,41,59, +51,23,53,83,160,41,57,8,59,38,83,160,41,58,8,54,38,83,160,41,59, 8,50,38,250,22,208,83,160,41,8,28,8,50,38,251,22,60,83,160,41,8, -29,8,54,38,83,160,41,8,30,8,54,38,248,22,86,23,46,248,22,88,23, +29,8,54,38,83,160,41,8,30,8,54,38,248,22,88,23,46,248,22,86,23, 46,83,160,41,8,31,8,50,38,83,160,41,8,32,8,44,38,83,160,41,8, 33,8,38,38,83,160,41,8,34,8,33,38,83,160,41,8,35,8,29,38,250, 22,208,83,160,41,8,36,8,29,38,250,22,58,83,160,41,8,37,8,32,38, -248,22,89,23,24,250,22,208,83,160,41,8,38,8,35,38,249,22,58,83,160, +248,22,51,23,24,250,22,208,83,160,41,8,38,8,35,38,249,22,58,83,160, 41,8,39,8,37,38,248,22,77,23,29,83,160,41,8,40,8,35,38,83,160, 41,8,41,8,29,38,248,22,77,23,18,83,160,41,8,42,54,38,83,160,41, -8,43,48,38,195,250,22,252,31,2,11,6,10,10,98,97,100,32,115,121,110, -116,97,120,196,32,20,96,158,16,6,30,99,65,35,37,115,116,120,100,69,115, +8,43,48,38,195,250,22,252,32,2,11,6,10,10,98,97,100,32,115,121,110, +116,97,120,196,32,20,97,158,16,6,30,99,65,35,37,115,116,120,100,69,115, 116,120,45,112,97,105,114,63,101,11,30,102,2,100,67,99,111,110,115,47,35, 102,103,1,30,104,2,100,67,115,116,120,45,99,97,114,105,5,30,106,2,100, 67,115,116,120,45,99,100,114,107,6,30,108,2,100,69,115,116,120,45,108,105, 115,116,63,109,8,30,110,2,100,69,115,116,120,45,62,108,105,115,116,111,4, -16,44,18,98,64,104,101,114,101,112,38,97,36,10,32,11,16,162,74,119,105, -116,104,45,104,97,110,100,108,101,114,115,42,113,73,35,37,109,111,114,101,45, -115,99,104,101,109,101,114,66,108,101,116,47,101,99,115,74,35,37,100,101,102, -105,110,101,45,101,116,45,97,108,116,2,69,2,2,2,87,2,2,1,30,110, -101,119,45,109,101,109,116,114,97,99,101,45,116,114,97,99,107,105,110,103,45, -102,117,110,99,116,105,111,110,117,70,35,37,109,101,109,116,114,97,99,101,118, -1,30,99,117,114,114,101,110,116,45,98,114,101,97,107,45,112,97,114,97,109, -101,116,101,114,105,122,97,116,105,111,110,119,2,114,2,32,2,2,2,95,2, -2,74,45,100,101,102,105,110,101,45,115,121,110,116,97,120,120,2,116,2,79, -2,2,1,31,117,110,105,111,110,101,100,45,109,101,109,116,114,97,99,101,45, -116,114,97,99,107,105,110,103,45,118,97,108,117,101,121,2,118,65,100,101,108, -97,121,122,2,114,2,18,2,2,2,16,2,2,2,65,2,2,2,81,2,2, -2,4,2,2,2,24,2,2,2,34,2,2,2,77,2,2,2,12,2,2,2, -67,2,2,2,38,2,2,2,22,2,2,2,71,2,2,68,112,114,111,109,105, -115,101,63,123,2,114,2,98,2,2,78,112,97,114,97,109,101,116,101,114,105, -122,101,45,98,114,101,97,107,124,2,114,62,111,114,125,71,35,37,113,113,45, -97,110,100,45,111,114,126,2,30,2,2,65,102,111,114,99,101,127,2,114,66, -108,101,116,47,99,99,128,2,114,64,99,111,110,100,129,66,35,37,99,111,110, -100,130,2,49,2,2,2,47,2,2,2,93,2,2,1,32,99,97,108,108,45, -119,105,116,104,45,98,114,101,97,107,45,112,97,114,97,109,101,116,101,114,105, -122,97,116,105,111,110,131,2,114,2,26,2,2,71,115,101,116,33,45,118,97, -108,117,101,115,132,2,114,2,8,2,2,2,53,2,2,70,108,101,116,45,115, -116,114,117,99,116,133,2,114,63,97,110,100,134,2,126,66,100,101,102,105,110, -101,135,68,35,37,100,101,102,105,110,101,136,2,40,2,2,69,102,108,117,105, -100,45,108,101,116,137,2,114,73,100,101,102,105,110,101,45,115,121,110,116,97, -120,138,2,136,2,10,2,2,2,36,2,2,2,20,2,2,70,113,117,97,115, -105,113,117,111,116,101,139,2,126,2,6,2,2,2,83,2,2,2,91,2,2, -2,75,2,2,2,55,2,2,2,14,2,2,2,85,2,2,73,100,101,102,105, -110,101,45,115,116,114,117,99,116,140,2,116,2,61,2,2,2,51,2,2,2, -57,2,2,67,45,100,101,102,105,110,101,141,2,116,2,89,2,2,2,59,2, -2,2,97,2,2,72,112,97,114,97,109,101,116,101,114,105,122,101,142,2,114, -2,28,2,2,77,100,101,102,105,110,101,45,102,111,114,45,115,121,110,116,97, -120,143,2,136,2,63,2,2,62,100,111,144,2,114,2,73,2,2,1,24,99, -117,114,114,101,110,116,45,112,97,114,97,109,101,116,101,114,105,122,97,116,105, -111,110,145,2,114,76,98,101,103,105,110,45,102,111,114,45,115,121,110,116,97, -120,146,2,136,64,116,105,109,101,147,2,114,64,119,104,101,110,148,2,116,73, -119,105,116,104,45,104,97,110,100,108,101,114,115,149,2,114,64,99,97,115,101, -150,2,114,1,30,109,101,109,111,114,121,45,116,114,97,99,101,45,99,111,110, -116,105,110,117,97,116,105,111,110,45,109,97,114,107,151,2,118,66,117,110,108, -101,115,115,152,2,116,1,26,99,97,108,108,45,119,105,116,104,45,112,97,114, +16,44,18,98,64,104,101,114,101,112,38,97,36,10,32,11,16,162,72,112,97, +114,97,109,101,116,101,114,105,122,101,113,73,35,37,109,111,114,101,45,115,99, +104,101,109,101,114,2,18,2,2,2,69,2,2,2,83,2,2,1,30,110,101, +119,45,109,101,109,116,114,97,99,101,45,116,114,97,99,107,105,110,103,45,102, +117,110,99,116,105,111,110,115,70,35,37,109,101,109,116,114,97,99,101,116,2, +53,2,2,2,61,2,2,1,30,99,117,114,114,101,110,116,45,98,114,101,97, +107,45,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111,110,117,2,114, +73,119,105,116,104,45,104,97,110,100,108,101,114,115,118,2,114,2,24,2,2, +65,100,101,108,97,121,119,2,114,2,59,2,2,1,31,117,110,105,111,110,101, +100,45,109,101,109,116,114,97,99,101,45,116,114,97,99,107,105,110,103,45,118, +97,108,117,101,120,2,116,78,112,97,114,97,109,101,116,101,114,105,122,101,45, +98,114,101,97,107,121,2,114,74,119,105,116,104,45,104,97,110,100,108,101,114, +115,42,122,2,114,74,45,100,101,102,105,110,101,45,115,121,110,116,97,120,123, +74,35,37,100,101,102,105,110,101,45,101,116,45,97,108,124,2,63,2,2,2, +12,2,2,67,45,100,101,102,105,110,101,125,2,124,68,112,114,111,109,105,115, +101,63,126,2,114,2,71,2,2,2,65,2,2,2,77,2,2,2,8,2,2, +2,20,2,2,65,102,111,114,99,101,127,2,114,2,93,2,2,64,99,111,110, +100,128,66,35,37,99,111,110,100,129,71,115,101,116,33,45,118,97,108,117,101, +115,130,2,114,63,97,110,100,131,71,35,37,113,113,45,97,110,100,45,111,114, +132,64,119,104,101,110,133,2,124,70,108,101,116,45,115,116,114,117,99,116,134, +2,114,77,100,101,102,105,110,101,45,102,111,114,45,115,121,110,116,97,120,135, +68,35,37,100,101,102,105,110,101,136,2,30,2,2,66,117,110,108,101,115,115, +137,2,124,69,102,108,117,105,100,45,108,101,116,138,2,114,66,108,101,116,47, +101,99,139,2,124,2,36,2,2,1,32,99,97,108,108,45,119,105,116,104,45, +98,114,101,97,107,45,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111, +110,140,2,114,2,26,2,2,76,98,101,103,105,110,45,102,111,114,45,115,121, +110,116,97,120,141,2,136,2,98,2,2,2,51,2,2,2,10,2,2,2,40, +2,2,62,111,114,142,2,132,2,49,2,2,2,97,2,2,2,85,2,2,66, +108,101,116,47,99,99,143,2,114,70,113,117,97,115,105,113,117,111,116,101,144, +2,132,2,67,2,2,2,89,2,2,2,16,2,2,2,38,2,2,2,34,2, +2,73,100,101,102,105,110,101,45,115,121,110,116,97,120,145,2,136,2,22,2, +2,64,116,105,109,101,146,2,114,2,95,2,2,2,87,2,2,2,91,2,2, +2,57,2,2,2,28,2,2,66,100,101,102,105,110,101,147,2,136,73,100,101, +102,105,110,101,45,115,116,114,117,99,116,148,2,124,2,6,2,2,2,73,2, +2,2,47,2,2,64,99,97,115,101,149,2,114,2,4,2,2,2,75,2,2, +62,100,111,150,2,114,1,24,99,117,114,114,101,110,116,45,112,97,114,97,109, +101,116,101,114,105,122,97,116,105,111,110,151,2,114,2,32,2,2,2,55,2, +2,2,79,2,2,2,14,2,2,1,30,109,101,109,111,114,121,45,116,114,97, +99,101,45,99,111,110,116,105,110,117,97,116,105,111,110,45,109,97,114,107,152, +2,116,2,81,2,2,1,26,99,97,108,108,45,119,105,116,104,45,112,97,114, 97,109,101,116,101,114,105,122,97,116,105,111,110,153,2,114,97,35,10,33,11, -16,78,72,115,121,110,116,97,120,45,99,97,115,101,42,154,68,35,37,115,116, -120,108,111,99,155,71,119,105,116,104,45,115,121,110,116,97,120,156,70,35,37, -119,105,116,104,45,115,116,120,157,66,115,121,110,116,97,120,158,69,35,37,115, -116,120,99,97,115,101,159,71,115,116,120,45,118,101,99,116,111,114,63,160,2, -100,70,108,101,116,45,115,121,110,116,97,120,161,76,35,37,115,116,120,99,97, -115,101,45,115,99,104,101,109,101,162,2,125,2,126,2,105,2,100,74,115,116, -120,45,118,101,99,116,111,114,45,114,101,102,163,2,100,73,108,101,116,114,101, -99,45,115,121,110,116,97,120,164,2,162,2,107,2,100,70,115,121,110,116,97, -120,47,108,111,99,165,2,155,70,115,116,120,45,114,111,116,97,116,101,166,2, -100,2,109,2,100,2,103,2,100,71,115,116,120,45,114,111,116,97,116,101,42, -167,2,100,2,134,2,126,74,115,112,108,105,116,45,115,116,120,45,108,105,115, -116,168,2,100,72,108,101,116,45,115,121,110,116,97,120,101,115,169,2,162,1, -26,99,104,101,99,107,45,100,117,112,108,105,99,97,116,101,45,105,100,101,110, -116,105,102,105,101,114,170,2,162,2,120,2,116,71,105,100,101,110,116,105,102, -105,101,114,63,171,2,100,1,20,103,101,110,101,114,97,116,101,45,116,101,109, -112,111,114,97,114,105,101,115,172,2,157,2,140,2,116,69,115,116,120,45,110, -117,108,108,63,173,2,100,2,139,2,126,2,129,2,130,71,115,116,120,45,110, -117,108,108,47,35,102,174,2,100,72,115,121,110,116,97,120,45,114,117,108,101, -115,175,2,162,2,141,2,116,69,97,112,112,101,110,100,47,35,102,176,2,100, -2,148,2,116,75,115,121,110,116,97,120,45,105,100,45,114,117,108,101,115,177, -2,162,75,108,101,116,114,101,99,45,115,121,110,116,97,120,101,115,178,2,162, -2,115,2,116,2,152,2,116,73,115,116,120,45,99,104,101,99,107,47,101,115, -99,179,2,100,2,111,2,100,2,101,2,100,71,115,121,110,116,97,120,45,99, -97,115,101,180,2,155,96,34,8,254,1,11,16,0,16,4,33,11,61,120,181, -3,1,7,101,110,118,52,48,52,53,182,18,100,2,112,41,36,35,34,33,16, -8,40,11,3,1,4,103,53,49,52,183,3,1,4,103,53,49,53,184,3,1, -4,103,53,49,54,185,3,1,7,101,110,118,52,48,53,49,186,2,186,2,186, +16,78,70,108,101,116,45,115,121,110,116,97,120,154,76,35,37,115,116,120,99, +97,115,101,45,115,99,104,101,109,101,155,66,115,121,110,116,97,120,156,69,35, +37,115,116,120,99,97,115,101,157,2,131,2,132,71,115,116,120,45,118,101,99, +116,111,114,63,158,2,100,72,108,101,116,45,115,121,110,116,97,120,101,115,159, +2,155,2,142,2,132,70,115,121,110,116,97,120,47,108,111,99,160,68,35,37, +115,116,120,108,111,99,161,2,105,2,100,69,97,112,112,101,110,100,47,35,102, +162,2,100,75,108,101,116,114,101,99,45,115,121,110,116,97,120,101,115,163,2, +155,2,107,2,100,70,115,116,120,45,114,111,116,97,116,101,164,2,100,74,115, +116,120,45,118,101,99,116,111,114,45,114,101,102,165,2,100,2,103,2,100,2, +125,2,124,71,115,116,120,45,114,111,116,97,116,101,42,166,2,100,73,115,116, +120,45,99,104,101,99,107,47,101,115,99,167,2,100,75,115,121,110,116,97,120, +45,105,100,45,114,117,108,101,115,168,2,155,1,26,99,104,101,99,107,45,100, +117,112,108,105,99,97,116,101,45,105,100,101,110,116,105,102,105,101,114,169,2, +155,2,133,2,124,74,115,112,108,105,116,45,115,116,120,45,108,105,115,116,170, +2,100,72,115,121,110,116,97,120,45,114,117,108,101,115,171,2,155,71,105,100, +101,110,116,105,102,105,101,114,63,172,2,100,2,101,2,100,69,115,116,120,45, +110,117,108,108,63,173,2,100,2,144,2,132,2,148,2,124,71,115,116,120,45, +110,117,108,108,47,35,102,174,2,100,2,137,2,124,72,115,121,110,116,97,120, +45,99,97,115,101,42,175,2,161,2,139,2,124,71,119,105,116,104,45,115,121, +110,116,97,120,176,70,35,37,119,105,116,104,45,115,116,120,177,71,115,121,110, +116,97,120,45,99,97,115,101,178,2,161,2,123,2,124,2,109,2,100,2,111, +2,100,2,128,2,129,73,108,101,116,114,101,99,45,115,121,110,116,97,120,179, +2,155,1,20,103,101,110,101,114,97,116,101,45,116,101,109,112,111,114,97,114, +105,101,115,180,2,177,96,34,8,254,1,11,16,0,16,4,33,11,61,120,181, +3,1,7,101,110,118,52,49,48,53,182,18,100,2,112,41,36,35,34,33,16, +8,40,11,3,1,4,103,53,50,54,183,3,1,4,103,53,50,55,184,3,1, +4,103,53,50,56,185,3,1,7,101,110,118,52,49,49,49,186,2,186,2,186, 16,8,39,11,61,95,187,64,97,114,103,115,188,64,98,111,100,121,189,3,1, -7,101,110,118,52,48,53,50,190,2,190,2,190,18,158,2,112,41,18,158,2, -112,41,18,16,2,95,66,115,114,99,116,97,103,191,42,93,8,252,45,10,95, -9,8,252,45,10,2,159,18,106,64,100,101,115,116,192,49,36,35,34,33,40, -39,16,4,48,11,3,1,4,103,53,50,49,193,3,1,7,101,110,118,52,48, -54,52,194,16,4,47,11,68,99,111,110,116,109,97,114,107,195,3,1,7,101, -110,118,52,48,54,53,196,16,4,46,11,3,1,4,103,53,50,51,197,3,1, -7,101,110,118,52,48,55,52,198,16,4,45,11,64,102,117,110,99,199,3,1, -7,101,110,118,52,48,55,53,200,16,4,44,11,3,1,4,103,53,50,53,201, -3,1,7,101,110,118,52,48,56,52,202,16,4,43,11,67,110,101,119,109,97, -114,107,203,3,1,7,101,110,118,52,48,56,53,204,18,158,63,99,116,120,205, +7,101,110,118,52,49,49,50,190,2,190,2,190,18,158,2,112,41,18,158,2, +112,41,18,16,2,95,66,115,114,99,116,97,103,191,42,93,8,252,85,10,95, +9,8,252,85,10,2,157,18,106,64,100,101,115,116,192,49,36,35,34,33,40, +39,16,4,48,11,3,1,4,103,53,51,51,193,3,1,7,101,110,118,52,49, +50,52,194,16,4,47,11,68,99,111,110,116,109,97,114,107,195,3,1,7,101, +110,118,52,49,50,53,196,16,4,46,11,3,1,4,103,53,51,53,197,3,1, +7,101,110,118,52,49,51,52,198,16,4,45,11,64,102,117,110,99,199,3,1, +7,101,110,118,52,49,51,53,200,16,4,44,11,3,1,4,103,53,51,55,201, +3,1,7,101,110,118,52,49,52,52,202,16,4,43,11,67,110,101,119,109,97, +114,107,203,3,1,7,101,110,118,52,49,52,53,204,18,158,63,99,116,120,205, 49,18,158,63,108,101,116,206,49,18,158,2,205,49,18,158,2,205,49,18,16, -2,103,93,158,11,49,57,97,56,10,32,11,16,58,73,115,121,110,116,97,120, -45,99,97,115,101,42,42,207,29,208,11,11,2,158,2,208,2,160,2,100,2, -141,2,116,2,105,2,100,2,163,2,100,2,107,2,100,2,166,2,100,2,179, -2,100,2,103,2,100,2,167,2,100,2,134,2,126,2,168,2,100,1,20,101, -108,108,105,112,115,105,115,45,99,111,117,110,116,45,101,114,114,111,114,209,2, -208,2,125,2,126,2,171,2,100,2,140,2,116,2,173,2,100,2,139,2,126, -2,129,2,130,2,174,2,100,2,152,2,116,2,176,2,100,2,148,2,116,2, -115,2,116,2,109,2,100,2,120,2,116,2,111,2,100,2,101,2,100,97,55, -10,33,11,16,70,75,115,121,110,116,97,120,45,109,97,112,112,105,110,103,63, -210,64,35,37,115,99,211,2,160,2,100,2,141,2,116,2,105,2,100,2,163, -2,100,74,103,101,116,45,109,97,116,99,104,45,118,97,114,115,212,2,211,2, -107,2,100,2,166,2,100,2,179,2,100,2,103,2,100,72,110,111,45,101,108, -108,105,112,115,101,115,63,213,2,211,2,167,2,100,2,134,2,126,2,168,2, -100,72,115,116,120,45,109,101,109,113,45,112,111,115,214,2,211,1,21,115,121, -110,116,97,120,45,109,97,112,112,105,110,103,45,118,97,108,118,97,114,215,2, -211,2,125,2,126,2,171,2,100,74,109,97,107,101,45,109,97,116,99,104,38, -101,110,118,216,2,211,2,140,2,116,1,20,115,121,110,116,97,120,45,109,97, -112,112,105,110,103,45,100,101,112,116,104,217,2,211,79,109,97,107,101,45,115, -121,110,116,97,120,45,109,97,112,112,105,110,103,218,2,211,2,173,2,100,2, -139,2,126,2,129,2,130,2,174,2,100,2,152,2,116,72,109,97,107,101,45, -112,101,120,112,97,110,100,219,2,211,2,176,2,100,2,148,2,116,2,115,2, -116,2,109,2,100,2,120,2,116,2,111,2,100,2,101,2,100,96,54,8,254, +2,103,93,158,11,49,57,97,56,10,32,11,16,58,2,156,29,207,11,11,2, +131,2,132,2,158,2,100,2,142,2,132,2,105,2,100,2,162,2,100,2,128, +2,129,2,107,2,100,2,164,2,100,2,165,2,100,2,103,2,100,2,125,2, +124,2,166,2,100,2,167,2,100,1,20,101,108,108,105,112,115,105,115,45,99, +111,117,110,116,45,101,114,114,111,114,208,2,207,2,133,2,124,2,170,2,100, +2,172,2,100,2,101,2,100,2,173,2,100,2,144,2,132,2,148,2,124,2, +174,2,100,2,137,2,124,2,139,2,124,73,115,121,110,116,97,120,45,99,97, +115,101,42,42,209,2,207,2,123,2,124,2,109,2,100,2,111,2,100,97,55, +10,33,11,16,70,2,131,2,132,2,158,2,100,2,142,2,132,2,105,2,100, +2,162,2,100,2,128,2,129,2,107,2,100,2,164,2,100,2,165,2,100,2, +103,2,100,2,125,2,124,2,166,2,100,2,167,2,100,1,20,115,121,110,116, +97,120,45,109,97,112,112,105,110,103,45,100,101,112,116,104,210,64,35,37,115, +99,211,72,110,111,45,101,108,108,105,112,115,101,115,63,212,2,211,2,133,2, +124,2,170,2,100,2,172,2,100,2,101,2,100,2,173,2,100,75,115,121,110, +116,97,120,45,109,97,112,112,105,110,103,63,213,2,211,2,144,2,132,2,148, +2,124,2,174,2,100,2,137,2,124,74,103,101,116,45,109,97,116,99,104,45, +118,97,114,115,214,2,211,72,109,97,107,101,45,112,101,120,112,97,110,100,215, +2,211,2,139,2,124,1,21,115,121,110,116,97,120,45,109,97,112,112,105,110, +103,45,118,97,108,118,97,114,216,2,211,2,123,2,124,2,109,2,100,74,109, +97,107,101,45,109,97,116,99,104,38,101,110,118,217,2,211,2,111,2,100,72, +115,116,120,45,109,101,109,113,45,112,111,115,218,2,211,79,109,97,107,101,45, +115,121,110,116,97,120,45,109,97,112,112,105,110,103,219,2,211,96,54,8,254, 1,11,16,0,16,4,53,11,2,181,3,1,6,101,110,118,51,56,48,220,16, 4,52,11,68,104,101,114,101,45,115,116,120,221,3,1,6,101,110,118,51,56, -50,222,16,4,51,11,2,221,2,222,13,16,3,33,2,208,2,159,93,8,252, -45,10,16,6,50,11,61,114,223,63,115,114,99,224,3,1,7,101,110,118,52, -48,56,56,225,2,225,95,9,8,252,45,10,2,159,18,158,2,205,49,18,158, +50,222,16,4,51,11,2,221,2,222,13,16,3,33,2,207,2,157,93,8,252, +85,10,16,6,50,11,61,114,223,63,115,114,99,224,3,1,7,101,110,118,52, +49,52,56,225,2,225,95,9,8,252,85,10,2,157,18,158,2,205,49,18,158, 2,205,49,18,158,2,205,49,18,158,2,206,49,18,158,2,205,49,18,158,2, 205,49,18,158,2,205,49,18,158,66,108,97,109,98,100,97,226,49,18,158,2, 205,49,18,158,2,206,49,18,158,2,205,49,18,158,2,205,49,18,158,2,205, -49,18,158,2,121,49,18,158,2,205,49,18,158,2,205,49,18,158,2,205,49, +49,18,158,2,120,49,18,158,2,205,49,18,158,2,205,49,18,158,2,205,49, 18,158,2,205,49,18,158,1,22,119,105,116,104,45,99,111,110,116,105,110,117, -97,116,105,111,110,45,109,97,114,107,227,49,18,158,2,151,49,18,158,2,205, +97,116,105,111,110,45,109,97,114,107,227,49,18,158,2,152,49,18,158,2,205, 49,18,158,2,205,49,18,158,2,205,49,18,158,2,205,49,18,158,2,205,49, 18,158,2,205,49,18,158,64,115,101,116,33,228,49,18,158,2,205,49,18,158, -2,117,49,18,158,2,205,49,18,158,2,205,49,18,158,2,205,49,18,158,2, +2,115,49,18,158,2,205,49,18,158,2,205,49,18,158,2,205,49,18,158,2, 205,49,11,134,83,159,32,93,80,158,32,32,89,162,32,33,36,2,4,222,27, -248,22,252,13,3,194,28,192,192,28,248,22,252,135,1,194,27,248,22,252,26, -3,195,28,192,192,248,22,252,27,3,195,11,83,159,32,93,80,158,32,33,248, -22,252,50,3,5,12,40,91,46,93,91,94,46,93,42,124,41,36,83,159,32, +248,22,252,14,3,194,28,192,192,28,248,22,252,135,1,194,27,248,22,252,27, +3,195,28,192,192,248,22,252,28,3,195,11,83,159,32,93,80,158,32,33,248, +22,252,51,3,5,12,40,91,46,93,91,94,46,93,42,124,41,36,83,159,32, 93,80,158,32,34,89,162,32,34,45,2,8,223,0,87,95,28,248,80,158,33, -32,194,12,252,22,252,32,2,2,8,6,25,25,112,97,116,104,32,111,114,32, +32,194,12,252,22,252,33,2,2,8,6,25,25,112,97,116,104,32,111,114,32, 118,97,108,105,100,45,112,97,116,104,32,115,116,114,105,110,103,32,198,199,28, -27,248,22,252,135,1,196,28,192,192,248,22,252,183,1,196,12,252,22,252,32, +27,248,22,252,135,1,196,28,192,192,248,22,252,183,1,196,12,252,22,252,33, 2,2,8,6,21,21,115,116,114,105,110,103,32,111,114,32,98,121,116,101,32, 115,116,114,105,110,103,33,198,199,91,159,35,11,90,161,35,32,11,248,22,252, -25,3,197,87,94,28,192,12,250,22,252,33,2,2,8,6,36,36,99,97,110, +26,3,197,87,94,28,192,12,250,22,252,34,2,2,8,6,36,36,99,97,110, 110,111,116,32,97,100,100,32,97,32,115,117,102,102,105,120,32,116,111,32,97, -32,114,111,111,116,32,112,97,116,104,58,32,199,27,248,22,252,17,3,250,22, -252,58,3,80,158,40,33,248,22,252,15,3,199,28,248,22,252,135,1,203,249, -22,252,207,1,204,8,63,202,28,248,22,252,13,3,194,249,22,252,24,3,195, +32,114,111,111,116,32,112,97,116,104,58,32,199,27,248,22,252,18,3,250,22, +252,59,3,80,158,40,33,248,22,252,16,3,199,28,248,22,252,135,1,203,249, +22,252,207,1,204,8,63,202,28,248,22,252,14,3,194,249,22,252,25,3,195, 194,192,83,159,32,93,80,158,32,35,249,22,252,137,1,7,92,7,92,83,159, 32,93,80,158,32,36,89,162,32,33,43,2,12,223,0,87,94,28,248,80,158, -33,32,194,12,250,22,252,32,2,76,110,111,114,109,97,108,45,112,97,116,104, +33,32,194,12,250,22,252,33,2,76,110,111,114,109,97,108,45,112,97,116,104, 45,99,97,115,101,229,6,25,25,112,97,116,104,32,111,114,32,118,97,108,105, 100,45,112,97,116,104,32,115,116,114,105,110,103,196,28,249,22,252,5,2,247, 22,252,214,1,67,119,105,110,100,111,119,115,230,27,28,248,22,252,135,1,195, -194,248,22,252,14,3,195,28,249,22,252,53,3,0,21,35,114,120,34,94,91, +194,248,22,252,15,3,195,28,249,22,252,54,3,0,21,35,114,120,34,94,91, 92,92,93,91,92,92,93,91,63,93,91,92,92,93,34,194,28,248,22,252,135, -1,195,248,22,252,16,3,195,194,27,248,22,252,170,1,194,248,22,252,16,3, -250,22,252,59,3,0,6,35,114,120,34,47,34,28,249,22,252,53,3,0,22, +1,195,248,22,252,17,3,195,194,27,248,22,252,170,1,194,248,22,252,17,3, +250,22,252,60,3,0,6,35,114,120,34,47,34,28,249,22,252,54,3,0,22, 35,114,120,34,91,47,92,92,93,91,46,32,93,43,91,47,92,92,93,42,36, -34,198,196,250,22,252,59,3,0,19,35,114,120,34,91,32,46,93,43,40,91, +34,198,196,250,22,252,60,3,0,19,35,114,120,34,91,32,46,93,43,40,91, 47,92,92,93,42,41,36,34,199,6,2,2,92,49,80,158,38,35,28,249,22, -252,5,2,247,22,252,214,1,65,109,97,99,111,115,231,248,22,252,16,3,248, -22,252,170,1,28,248,22,252,135,1,196,195,248,22,252,14,3,196,28,248,22, -252,135,1,194,248,22,252,16,3,194,193,83,159,32,93,80,158,32,37,91,159, +252,5,2,247,22,252,214,1,65,109,97,99,111,115,231,248,22,252,17,3,248, +22,252,170,1,28,248,22,252,135,1,196,195,248,22,252,15,3,196,28,248,22, +252,135,1,194,248,22,252,17,3,194,193,83,159,32,93,80,158,32,37,91,159, 34,11,90,161,33,33,11,89,162,32,33,36,65,99,104,101,99,107,232,222,28, -248,22,129,193,12,250,22,252,32,2,2,14,6,4,4,114,101,97,108,195,20, +248,22,129,193,12,250,22,252,33,2,2,14,6,4,4,114,101,97,108,195,20, 12,95,33,89,162,32,34,43,2,14,224,0,1,87,95,248,193,195,248,193,196, 27,248,22,175,197,27,249,22,172,198,195,27,249,22,171,199,196,28,249,22,180, 199,199,28,250,22,183,196,32,195,28,248,22,132,198,32,0,3,48,46,48,28, @@ -3623,8 +3664,8 @@ 11,83,160,38,32,33,11,90,161,33,35,11,89,162,32,32,33,1,24,114,101, 112,45,101,114,114,111,114,45,101,115,99,97,112,101,45,104,97,110,100,108,101, 114,234,223,1,247,207,250,22,31,89,162,32,32,36,9,225,6,5,3,90,161, -33,32,10,247,22,252,36,2,90,161,33,33,10,247,22,252,25,2,87,94,248, -22,252,36,2,195,248,22,252,25,2,11,89,162,32,32,35,9,224,5,4,248, +33,32,10,247,22,252,37,2,90,161,33,33,10,247,22,252,25,2,87,94,248, +22,252,37,2,195,248,22,252,25,2,11,89,162,32,32,35,9,224,5,4,248, 22,8,89,162,32,33,36,9,224,2,1,247,91,159,33,11,20,12,95,33,192, 89,162,32,32,37,64,108,111,111,112,235,226,2,1,3,0,87,94,248,22,8, 89,162,32,33,39,9,225,4,3,2,250,22,31,89,162,32,32,36,9,225,5, @@ -3634,114 +3675,114 @@ 205,194,248,22,252,24,2,194,193,89,162,33,33,35,9,222,249,22,3,247,22, 38,194,89,162,32,32,35,9,224,5,4,90,161,33,33,10,247,22,252,25,2, 87,94,248,22,252,25,2,11,90,161,33,32,10,11,12,247,192,89,162,32,32, -36,9,225,5,4,3,87,95,248,22,252,36,2,208,248,22,252,25,2,210,90, +36,9,225,5,4,3,87,95,248,22,252,37,2,208,248,22,252,25,2,210,90, 161,33,33,10,11,90,161,33,32,10,11,12,83,159,32,93,80,158,32,39,89, 162,32,33,44,2,18,223,0,87,94,28,248,80,158,33,32,194,12,250,22,252, -32,2,2,18,6,25,25,112,97,116,104,32,111,114,32,115,116,114,105,110,103, +33,2,2,18,6,25,25,112,97,116,104,32,111,114,32,115,116,114,105,110,103, 32,40,115,97,110,115,32,110,117,108,41,196,91,159,35,11,90,161,35,32,11, -248,22,252,25,3,197,28,194,248,22,252,176,2,249,22,252,150,2,248,22,252, +248,22,252,26,3,197,28,194,248,22,252,177,2,249,22,252,151,2,248,22,252, 164,1,249,22,252,179,1,6,36,36,108,111,97,100,47,99,100,58,32,99,97, 110,110,111,116,32,111,112,101,110,32,97,32,100,105,114,101,99,116,111,114,121, 58,32,126,115,202,247,22,15,28,248,22,252,183,1,193,87,94,28,248,22,252, -19,3,193,12,248,22,252,176,2,249,22,252,150,2,248,22,252,164,1,250,22, +20,3,193,12,248,22,252,177,2,249,22,252,151,2,248,22,252,164,1,250,22, 252,179,1,6,65,65,108,111,97,100,47,99,100,58,32,100,105,114,101,99,116, 111,114,121,32,111,102,32,126,115,32,100,111,101,115,32,110,111,116,32,101,120, 105,115,116,32,40,99,117,114,114,101,110,116,32,100,105,114,101,99,116,111,114, -121,32,105,115,32,126,115,41,203,247,22,252,43,3,247,22,15,27,247,22,252, -43,3,250,22,31,89,162,32,32,34,9,223,4,248,22,252,43,3,193,89,162, +121,32,105,115,32,126,115,41,203,247,22,252,44,3,247,22,15,27,247,22,252, +44,3,250,22,31,89,162,32,32,34,9,223,4,248,22,252,44,3,193,89,162, 32,32,34,9,223,5,248,22,252,87,1,193,89,162,32,32,34,9,223,3,248, -22,252,43,3,193,248,22,252,87,1,197,83,159,32,93,80,158,32,40,89,162, -32,35,40,2,20,223,0,87,94,28,248,80,158,33,32,196,12,250,22,252,32, +22,252,44,3,193,248,22,252,87,1,197,83,159,32,93,80,158,32,40,89,162, +32,35,40,2,20,223,0,87,94,28,248,80,158,33,32,196,12,250,22,252,33, 2,197,6,25,25,112,97,116,104,32,111,114,32,115,116,114,105,110,103,32,40, -115,97,110,115,32,110,117,108,41,198,28,248,22,252,28,3,196,248,194,196,27, -247,22,252,89,1,248,195,28,193,249,22,252,29,3,199,195,197,83,159,32,93, +115,97,110,115,32,110,117,108,41,198,28,248,22,252,29,3,196,248,194,196,27, +247,22,252,89,1,248,195,28,193,249,22,252,30,3,199,195,197,83,159,32,93, 80,158,32,41,89,162,32,33,37,2,22,223,0,250,80,158,35,40,22,252,87, 1,2,22,196,83,159,32,93,80,158,32,42,89,162,32,33,37,2,24,223,0, -250,80,158,35,40,22,252,46,3,2,24,196,83,159,32,93,80,158,32,43,27, -248,22,252,50,3,248,22,252,206,1,27,27,247,22,252,214,1,28,249,22,71, +250,80,158,35,40,22,252,47,3,2,24,196,83,159,32,93,80,158,32,43,27, +248,22,252,51,3,248,22,252,206,1,27,27,247,22,252,214,1,28,249,22,71, 194,21,96,64,117,110,105,120,236,64,98,101,111,115,237,65,111,115,107,105,116, 238,66,109,97,99,111,115,120,239,6,1,1,58,28,249,22,71,194,21,94,2, 230,2,231,6,1,1,59,12,250,22,252,179,1,6,14,14,40,91,94,126,97, 93,42,41,126,97,40,46,42,41,195,195,27,89,162,32,35,38,69,99,111,110, 115,45,112,97,116,104,240,222,28,249,22,252,189,1,195,5,0,249,22,64,194, -196,249,22,50,248,22,252,17,3,196,196,89,162,32,34,39,2,26,224,0,1, +196,249,22,50,248,22,252,18,3,196,196,89,162,32,34,39,2,26,224,0,1, 87,95,28,27,248,22,252,183,1,196,28,192,192,248,22,252,135,1,196,12,250, -22,252,32,2,2,26,6,21,21,98,121,116,101,32,115,116,114,105,110,103,32, +22,252,33,2,2,26,6,21,21,98,121,116,101,32,115,116,114,105,110,103,32, 111,114,32,115,116,114,105,110,103,197,28,28,248,22,57,196,249,22,4,22,252, -13,3,197,11,12,250,22,252,32,2,2,26,6,13,13,108,105,115,116,32,111, +14,3,197,11,12,250,22,252,33,2,2,26,6,13,13,108,105,115,116,32,111, 102,32,112,97,116,104,115,198,248,91,159,33,11,20,12,95,33,192,89,162,32, -33,43,2,235,226,3,2,5,0,27,249,22,252,52,3,197,199,28,192,250,199, +33,43,2,235,226,3,2,5,0,27,249,22,252,53,3,197,199,28,192,250,199, 197,248,22,77,196,248,197,248,22,86,197,250,199,197,200,9,28,248,22,252,135, 1,196,248,22,252,206,1,196,195,83,159,32,93,80,158,32,44,89,162,32,34, -42,2,28,223,0,87,95,28,248,80,158,33,32,194,12,250,22,252,32,2,2, +42,2,28,223,0,87,95,28,248,80,158,33,32,194,12,250,22,252,33,2,2, 28,6,25,25,112,97,116,104,32,111,114,32,115,116,114,105,110,103,32,40,115, 97,110,115,32,110,117,108,41,196,28,27,248,22,252,3,2,196,28,192,192,28, -248,80,158,34,32,196,248,22,252,26,3,196,11,12,250,22,252,32,2,2,28, +248,80,158,34,32,196,248,22,252,27,3,196,11,12,250,22,252,33,2,2,28, 6,29,29,35,102,32,111,114,32,114,101,108,97,116,105,118,101,32,112,97,116, 104,32,111,114,32,115,116,114,105,110,103,197,91,159,33,11,20,12,95,33,28, -28,248,22,252,26,3,195,91,159,35,11,90,161,35,32,11,248,22,252,25,3, +28,248,22,252,27,3,195,91,159,35,11,90,161,35,32,11,248,22,252,26,3, 198,249,22,252,5,2,194,68,114,101,108,97,116,105,118,101,241,11,27,248,22, 252,212,1,6,4,4,80,65,84,72,27,89,162,32,33,36,67,119,105,110,45, 97,100,100,242,222,28,249,22,252,5,2,247,22,252,214,1,2,230,249,22,50, -248,22,252,17,3,5,1,46,194,192,248,91,159,33,11,20,12,95,33,192,89, -162,32,33,40,2,235,225,6,4,0,28,248,22,56,196,11,27,248,22,252,29, -3,248,22,51,198,27,249,22,252,24,3,195,198,28,248,22,252,18,3,193,248, +248,22,252,18,3,5,1,46,194,192,248,91,159,33,11,20,12,95,33,192,89, +162,32,33,40,2,235,225,6,4,0,28,248,22,56,196,11,27,248,22,252,30, +3,248,22,51,198,27,249,22,252,25,3,195,198,28,248,22,252,19,3,193,248, 196,193,248,195,248,22,52,199,28,194,248,194,249,80,158,39,43,197,9,9,27, -248,22,252,29,3,196,28,248,22,252,18,3,193,248,194,193,11,89,162,32,33, +248,22,252,30,3,196,28,248,22,252,19,3,193,248,194,193,11,89,162,32,33, 43,70,102,111,117,110,100,45,101,120,101,99,243,224,3,0,28,193,91,159,35, -11,90,161,35,32,11,248,22,252,25,3,198,28,248,22,252,13,3,193,27,249, -22,252,24,3,195,199,28,27,248,22,252,19,3,194,28,192,192,248,22,252,18, -3,194,192,27,248,22,252,30,3,200,28,249,22,252,7,2,194,201,11,28,248, -22,252,26,3,193,248,198,249,22,252,24,3,197,195,248,198,193,11,194,83,159, +11,90,161,35,32,11,248,22,252,26,3,198,28,248,22,252,14,3,193,27,249, +22,252,25,3,195,199,28,27,248,22,252,20,3,194,28,192,192,248,22,252,19, +3,194,192,27,248,22,252,31,3,200,28,249,22,252,7,2,194,201,11,28,248, +22,252,27,3,193,248,198,249,22,252,25,3,197,195,248,198,193,11,194,83,159, 32,93,80,158,32,45,89,162,32,34,42,2,30,223,0,87,94,28,248,80,158, -33,32,195,12,250,22,252,32,2,196,6,25,25,112,97,116,104,32,111,114,32, +33,32,195,12,250,22,252,33,2,196,6,25,25,112,97,116,104,32,111,114,32, 118,97,108,105,100,45,112,97,116,104,32,115,116,114,105,110,103,197,28,248,22, -252,26,3,195,12,248,22,252,176,2,249,22,252,120,2,248,22,252,164,1,250, +252,27,3,195,12,248,22,252,177,2,249,22,252,121,2,248,22,252,164,1,250, 22,252,179,1,6,29,29,126,97,58,32,105,110,118,97,108,105,100,32,114,101, 108,97,116,105,118,101,32,112,97,116,104,58,32,126,115,200,201,247,22,15,83, 159,32,93,80,158,32,46,89,162,32,35,38,2,32,223,0,87,94,249,80,158, 34,45,195,196,249,22,3,89,162,32,33,37,9,224,2,3,249,80,158,35,45, 194,196,197,83,159,32,93,80,158,32,47,89,162,32,35,38,2,34,222,27,247, -22,252,44,3,248,91,159,33,11,20,12,95,33,192,89,162,32,33,49,65,99, -108,111,111,112,244,227,5,4,3,2,0,28,248,22,56,198,248,22,252,176,2, -249,22,252,150,2,248,22,252,164,1,251,22,252,179,1,6,42,42,126,97,58, +22,252,45,3,248,91,159,33,11,20,12,95,33,192,89,162,32,33,49,65,99, +108,111,111,112,244,227,5,4,3,2,0,28,248,22,56,198,248,22,252,177,2, +249,22,252,151,2,248,22,252,164,1,251,22,252,179,1,6,42,42,126,97,58, 32,99,111,108,108,101,99,116,105,111,110,32,110,111,116,32,102,111,117,110,100, 58,32,126,115,32,105,110,32,97,110,121,32,111,102,58,32,126,115,202,28,248, -22,56,205,203,250,22,1,22,252,24,3,206,23,15,201,247,22,15,27,249,22, -252,24,3,248,22,51,201,198,28,248,22,252,19,3,193,27,250,22,1,22,252, -24,3,196,201,28,248,22,252,19,3,193,192,248,195,248,22,52,201,248,194,248, +22,56,205,203,250,22,1,22,252,25,3,206,23,15,201,247,22,15,27,249,22, +252,25,3,248,22,51,201,198,28,248,22,252,20,3,193,27,250,22,1,22,252, +25,3,196,201,28,248,22,252,20,3,193,192,248,195,248,22,52,201,248,194,248, 22,52,200,193,83,159,32,93,80,158,32,48,27,247,22,252,214,1,28,249,22, -71,194,21,93,2,230,5,4,46,100,108,108,28,249,22,71,194,21,94,2,239, +252,5,2,194,2,230,5,4,46,100,108,108,28,249,22,71,194,21,94,2,239, 2,231,5,6,46,100,121,108,105,98,5,3,46,115,111,83,159,32,93,80,158, -32,49,249,80,158,34,34,248,22,252,17,3,5,10,95,108,111,97,100,101,114, -46,115,115,80,158,34,48,83,159,32,93,80,158,32,50,249,22,252,210,2,27, -27,89,162,32,33,36,67,114,101,115,111,108,118,101,245,222,28,248,22,252,28, -3,193,192,27,247,22,252,89,1,28,192,249,22,252,29,3,195,194,193,27,89, +32,49,249,80,158,34,34,248,22,252,18,3,5,10,95,108,111,97,100,101,114, +46,115,115,80,158,34,48,83,159,32,93,80,158,32,50,249,22,252,211,2,27, +27,89,162,32,33,36,67,114,101,115,111,108,118,101,245,222,28,248,22,252,29, +3,193,192,27,247,22,252,89,1,28,192,249,22,252,30,3,195,194,193,27,89, 162,32,34,36,67,100,97,116,101,45,111,102,246,222,249,22,5,89,162,32,33, -39,9,223,2,27,248,194,195,27,250,22,252,38,3,196,11,89,162,40,32,32, +39,9,223,2,27,248,194,195,27,250,22,252,39,3,196,11,89,162,40,32,32, 9,222,11,28,192,249,22,50,195,194,11,195,27,89,162,32,35,41,67,100,97, 116,101,62,61,63,247,223,1,28,194,27,249,195,197,196,27,28,197,11,193,28, 192,192,28,193,28,197,28,249,22,184,248,22,52,196,248,22,52,200,193,11,11, 11,11,89,162,32,34,8,33,1,25,100,101,102,97,117,108,116,45,108,111,97, 100,47,117,115,101,45,99,111,109,112,105,108,101,100,248,226,6,0,1,2,87, -94,28,248,80,158,36,32,197,12,250,22,252,32,2,2,49,6,25,25,112,97, +94,28,248,80,158,36,32,197,12,250,22,252,33,2,2,49,6,25,25,112,97, 116,104,32,111,114,32,118,97,108,105,100,45,112,97,116,104,32,115,116,114,105, 110,103,199,91,159,38,11,90,161,33,32,11,248,199,203,90,161,35,33,11,248, -22,252,25,3,193,90,161,33,36,11,28,249,22,252,5,2,195,2,241,64,115, -97,109,101,249,193,90,161,33,37,11,247,22,252,45,3,27,89,162,32,34,36, +22,252,26,3,193,90,161,33,36,11,28,249,22,252,5,2,195,2,241,64,115, +97,109,101,249,193,90,161,33,37,11,247,22,252,46,3,27,89,162,32,34,36, 66,103,101,116,45,115,111,250,224,10,5,89,162,32,33,44,9,226,1,0,3, -2,252,22,252,24,3,199,201,6,6,6,110,97,116,105,118,101,247,22,252,215, +2,252,22,252,25,3,199,201,6,6,6,110,97,116,105,118,101,247,22,252,215, 1,28,198,249,80,158,42,34,199,80,158,42,48,197,27,89,162,32,33,41,62, -122,111,251,225,11,6,4,250,22,252,24,3,196,198,249,80,158,39,34,197,5, +122,111,251,225,11,6,4,250,22,252,25,3,196,198,249,80,158,39,34,197,5, 3,46,122,111,27,249,196,199,10,27,249,197,80,158,47,49,11,27,249,206,89, 162,32,33,34,9,223,7,192,204,27,89,162,32,33,40,68,119,105,116,104,45, 100,105,114,252,252,0,224,15,10,20,14,159,80,158,33,51,250,80,158,36,52, -249,22,19,11,80,158,38,51,22,252,89,1,28,248,22,252,13,3,196,195,247, -22,252,43,3,247,194,27,27,250,23,19,23,16,199,198,28,192,27,248,22,252, -46,3,248,22,51,195,91,159,34,11,90,161,34,32,11,248,195,248,22,41,248, -22,252,205,1,248,22,252,15,3,249,80,158,58,34,23,19,5,0,28,192,87, -94,28,23,22,28,249,22,252,5,2,195,23,24,12,248,22,252,176,2,249,22, -252,117,2,248,22,252,164,1,251,22,252,179,1,6,81,81,108,111,97,100,45, +249,22,19,11,80,158,38,51,22,252,89,1,28,248,22,252,14,3,196,195,247, +22,252,44,3,247,194,27,27,250,23,19,23,16,199,198,28,192,27,248,22,252, +47,3,248,22,51,195,91,159,34,11,90,161,34,32,11,248,195,248,22,41,248, +22,252,205,1,248,22,252,16,3,249,80,158,58,34,23,19,5,0,28,192,87, +94,28,23,22,28,249,22,252,5,2,195,23,24,12,248,22,252,177,2,249,22, +252,118,2,248,22,252,164,1,251,22,252,179,1,6,81,81,108,111,97,100,45, 101,120,116,101,110,115,105,111,110,58,32,101,120,112,101,99,116,101,100,32,109, 111,100,117,108,101,32,100,101,99,108,97,114,97,116,105,111,110,32,102,111,114, 32,96,126,97,39,44,32,102,111,117,110,100,32,126,97,32,116,104,114,111,117, @@ -3749,20 +3790,20 @@ 1,6,27,27,109,111,100,117,108,101,32,100,101,99,108,97,114,97,116,105,111, 110,32,102,111,114,32,96,126,97,39,203,6,4,4,110,111,110,101,248,22,51, 204,247,22,15,12,192,11,11,28,192,248,194,193,27,250,23,19,23,16,200,198, -28,192,248,195,89,162,32,32,37,9,224,20,1,249,247,22,252,47,3,248,22, +28,192,248,195,89,162,32,32,37,9,224,20,1,249,247,22,252,48,3,248,22, 51,195,195,27,250,23,20,23,17,202,199,28,192,248,196,89,162,32,32,37,9, 224,21,1,249,247,22,252,88,1,248,22,51,195,195,248,196,89,162,32,32,36, 9,224,21,10,249,247,22,252,88,1,194,195,192,89,162,32,33,36,9,222,87, -94,28,28,248,22,0,193,249,22,34,194,34,11,12,250,22,252,32,2,2,40, +94,28,28,248,22,0,193,249,22,34,194,34,11,12,250,22,252,33,2,2,40, 6,19,19,112,114,111,99,101,100,117,114,101,32,40,97,114,105,116,121,32,50, 41,195,192,83,159,32,93,80,158,32,53,89,162,33,34,38,2,47,223,0,87, 94,250,80,158,35,46,2,47,196,197,250,80,158,35,47,2,47,196,197,83,159, 32,93,80,158,32,54,89,162,32,33,36,2,49,223,0,249,247,80,158,34,50, -195,11,248,22,252,247,2,89,162,32,33,33,1,20,100,101,102,97,117,108,116, +195,11,248,22,252,248,2,89,162,32,33,33,1,20,100,101,102,97,117,108,116, 45,114,101,97,100,101,114,45,103,117,97,114,100,252,253,0,222,192,83,159,32, -93,80,158,32,55,248,22,252,50,3,5,11,40,46,43,63,41,47,43,40,46, -42,41,83,159,32,93,80,158,32,56,248,22,252,50,3,5,2,94,44,83,159, -32,93,80,158,32,57,248,22,252,50,3,5,39,94,91,45,97,45,122,65,45, +93,80,158,32,55,248,22,252,51,3,5,11,40,46,43,63,41,47,43,40,46, +42,41,83,159,32,93,80,158,32,56,248,22,252,51,3,5,2,94,44,83,159, +32,93,80,158,32,57,248,22,252,51,3,5,39,94,91,45,97,45,122,65,45, 90,48,45,57,95,46,32,93,43,40,47,43,91,45,97,45,122,65,45,90,48, 45,57,95,46,32,93,43,41,42,36,83,159,32,93,80,158,32,58,248,22,109, 64,119,101,97,107,252,254,0,83,159,32,93,80,158,32,59,249,22,109,2,252, @@ -3774,131 +3815,131 @@ 114,101,115,111,108,118,101,114,252,0,1,225,2,3,0,28,28,248,22,49,196, 249,22,252,5,2,248,22,51,198,66,112,108,97,110,101,116,252,1,1,11,87, 94,28,207,12,20,14,159,80,158,34,51,250,80,158,37,52,249,22,19,11,80, -158,39,51,22,252,201,2,196,90,161,33,32,10,249,22,234,21,95,63,108,105, +158,39,51,22,252,202,2,196,90,161,33,32,10,249,22,234,21,95,63,108,105, 98,252,2,1,6,11,11,114,101,115,111,108,118,101,114,46,115,115,6,6,6, 112,108,97,110,101,116,1,27,112,108,97,110,101,116,45,109,111,100,117,108,101, 45,110,97,109,101,45,114,101,115,111,108,118,101,114,252,3,1,12,250,210,198, 199,200,28,195,27,89,162,32,32,45,67,103,101,116,45,100,105,114,252,4,1, 224,3,5,27,28,193,28,249,22,252,5,2,195,80,158,36,8,29,80,158,34, -8,30,27,248,22,252,208,1,248,22,43,196,28,249,22,252,53,3,80,158,37, -56,194,91,159,35,11,90,161,35,32,11,248,22,252,25,3,248,22,252,17,3, +8,30,27,248,22,252,208,1,248,22,43,196,28,249,22,252,54,3,80,158,37, +56,194,91,159,35,11,90,161,35,32,11,248,22,252,26,3,248,22,252,18,3, 250,22,252,192,1,200,33,248,22,252,186,1,201,87,95,83,160,34,11,80,158, 38,8,29,197,83,160,34,11,80,158,38,8,30,192,192,11,11,28,192,192,27, -247,22,252,89,1,28,192,192,247,22,252,43,3,27,28,248,22,252,135,1,198, +247,22,252,89,1,28,192,192,247,22,252,44,3,27,28,248,22,252,135,1,198, 27,247,194,27,250,22,115,80,158,41,59,249,22,50,204,198,89,162,40,32,32, -9,222,11,28,192,192,27,248,22,252,206,1,201,28,249,22,252,53,3,80,158, +9,222,11,28,192,192,27,248,22,252,206,1,201,28,249,22,252,54,3,80,158, 41,57,194,249,91,159,33,11,20,12,95,33,192,89,162,32,34,44,2,235,224, -10,0,27,249,22,252,52,3,80,158,36,55,198,28,192,249,195,249,22,252,24, +10,0,27,249,22,252,53,3,80,158,36,55,198,28,192,249,195,249,22,252,25, 3,199,27,248,22,77,198,28,249,22,252,189,1,194,5,1,46,2,249,28,249, -22,252,189,1,194,5,2,46,46,62,117,112,252,5,1,248,22,252,17,3,193, -248,22,86,195,249,22,252,24,3,197,248,22,252,17,3,199,196,194,248,22,58, +22,252,189,1,194,5,2,46,46,62,117,112,252,5,1,248,22,252,18,3,193, +248,22,86,195,249,22,252,25,3,197,248,22,252,18,3,199,196,194,248,22,58, 249,22,252,158,1,6,72,72,32,40,114,101,108,97,116,105,118,101,32,115,116, 114,105,110,103,32,102,111,114,109,32,109,117,115,116,32,99,111,110,116,97,105, 110,32,111,110,108,121,32,97,45,122,44,32,65,45,90,44,32,48,45,57,44, 32,45,44,32,95,44,32,46,44,32,47,44,32,97,110,100,32,6,37,37,115, 112,97,99,101,44,32,119,105,116,104,32,110,111,32,108,101,97,100,105,110,103, -32,111,114,32,116,114,97,105,108,105,110,103,32,47,41,28,248,22,252,13,3, -198,28,248,22,252,27,3,198,197,248,22,58,6,25,25,40,97,32,112,97,116, +32,111,114,32,116,114,97,105,108,105,110,103,32,47,41,28,248,22,252,14,3, +198,28,248,22,252,28,3,198,197,248,22,58,6,25,25,40,97,32,112,97,116, 104,32,109,117,115,116,32,98,101,32,97,98,115,111,108,117,116,101,41,28,27, 248,22,252,3,2,248,22,49,200,28,192,192,248,22,252,3,2,248,22,57,200, 11,28,249,22,252,5,2,248,22,51,200,2,252,2,1,250,22,115,80,158,39, -59,249,22,50,202,247,22,252,44,3,89,162,32,32,40,9,224,7,8,27,27, +59,249,22,50,202,247,22,252,45,3,89,162,32,32,40,9,224,7,8,27,27, 248,22,63,195,28,249,22,180,194,34,248,22,58,6,5,5,109,122,108,105,98, 28,249,22,182,194,34,248,22,79,195,11,28,192,28,249,22,4,89,162,32,33, -34,9,222,28,248,22,252,135,1,193,248,22,252,26,3,193,11,194,28,248,22, -252,135,1,248,22,77,195,28,248,22,252,26,3,248,22,77,195,27,250,80,158, -38,47,2,252,0,1,248,22,51,197,248,22,52,197,249,22,252,24,3,194,248, +34,9,222,28,248,22,252,135,1,193,248,22,252,27,3,193,11,194,28,248,22, +252,135,1,248,22,77,195,28,248,22,252,27,3,248,22,77,195,27,250,80,158, +38,47,2,252,0,1,248,22,51,197,248,22,52,197,249,22,252,25,3,194,248, 22,77,197,11,11,11,11,28,249,22,252,5,2,248,22,51,200,64,102,105,108, 101,252,6,1,28,249,22,180,248,22,63,200,34,27,248,22,77,199,28,248,22, -252,135,1,193,28,248,80,158,38,32,193,249,22,252,29,3,194,247,196,11,11, -11,11,87,94,28,27,248,22,252,13,3,194,28,192,192,248,22,252,217,1,194, -12,28,199,250,22,252,31,2,67,114,101,113,117,105,114,101,252,7,1,249,22, +252,135,1,193,28,248,80,158,38,32,193,249,22,252,30,3,194,247,196,11,11, +11,11,87,94,28,27,248,22,252,14,3,194,28,192,192,248,22,252,217,1,194, +12,28,199,250,22,252,32,2,67,114,101,113,117,105,114,101,252,7,1,249,22, 252,179,1,6,17,17,98,97,100,32,109,111,100,117,108,101,32,112,97,116,104, -126,97,28,197,248,22,51,198,6,0,0,202,250,22,252,32,2,2,252,0,1, +126,97,28,197,248,22,51,198,6,0,0,202,250,22,252,33,2,2,252,0,1, 249,22,252,179,1,6,13,13,109,111,100,117,108,101,32,112,97,116,104,126,97, 28,197,248,22,51,198,6,0,0,200,27,28,248,22,252,217,1,194,249,22,252, -222,1,195,32,248,22,252,31,3,248,22,252,32,3,195,27,28,248,22,252,217, +222,1,195,32,248,22,252,32,3,248,22,252,33,3,195,27,28,248,22,252,217, 1,195,249,22,252,222,1,196,33,248,80,158,39,36,194,91,159,35,11,90,161, 35,32,11,28,248,22,252,217,1,198,250,22,7,67,105,103,110,111,114,101,100, -252,8,1,249,22,252,222,1,202,34,2,252,8,1,248,22,252,25,3,197,27, +252,8,1,249,22,252,222,1,202,34,2,252,8,1,248,22,252,26,3,197,27, 28,248,22,252,217,1,199,249,22,252,222,1,200,35,249,80,158,44,34,196,5, 0,27,28,248,22,252,217,1,200,249,22,252,222,1,201,36,249,22,252,179,1, -6,3,3,44,126,97,248,22,252,205,1,248,22,252,15,3,248,80,158,48,36, +6,3,3,44,126,97,248,22,252,205,1,248,22,252,16,3,248,80,158,48,36, 199,27,28,248,22,252,217,1,201,249,22,252,222,1,202,37,248,22,41,249,22, -252,158,1,196,248,22,252,205,1,248,22,252,15,3,199,27,28,248,22,252,217, -1,202,249,22,252,222,1,203,38,27,249,22,252,52,3,80,158,48,33,248,22, -252,15,3,201,28,192,248,22,51,193,10,27,250,22,115,80,158,49,58,248,22, -252,67,3,247,22,252,201,2,89,162,32,32,38,9,223,17,27,247,22,109,87, -94,250,22,114,80,158,36,58,248,22,252,67,3,247,22,252,201,2,195,192,87, +252,158,1,196,248,22,252,205,1,248,22,252,16,3,199,27,28,248,22,252,217, +1,202,249,22,252,222,1,203,38,27,249,22,252,53,3,80,158,48,33,248,22, +252,16,3,201,28,192,248,22,51,193,10,27,250,22,115,80,158,49,58,248,22, +252,68,3,247,22,252,202,2,89,162,32,32,38,9,223,17,27,247,22,109,87, +94,250,22,114,80,158,36,58,248,22,252,68,3,247,22,252,202,2,195,192,87, 95,27,250,22,115,196,198,89,162,40,32,32,9,222,11,87,94,28,192,28,27, -248,22,40,194,28,192,192,249,22,252,7,2,197,195,12,252,22,252,29,2,2, +248,22,40,194,28,192,192,249,22,252,7,2,197,195,12,252,22,252,30,2,2, 252,0,1,6,71,71,109,111,100,117,108,101,32,112,114,101,118,105,111,117,115, 108,121,32,108,111,97,100,101,100,32,119,105,116,104,32,115,117,102,102,105,120, 32,126,115,44,32,99,97,110,110,111,116,32,108,111,97,100,32,119,105,116,104, 32,115,117,102,102,105,120,32,126,115,58,32,126,101,28,249,22,252,5,2,10, 199,6,0,0,197,28,249,22,252,5,2,10,201,6,0,0,199,23,15,12,28, -192,12,87,95,27,249,22,17,247,22,15,80,158,50,8,28,27,247,22,252,201, +192,12,87,95,27,249,22,17,247,22,15,80,158,50,8,28,27,247,22,252,202, 2,249,22,3,89,162,32,33,46,9,226,13,14,2,3,28,28,249,22,252,7, -2,248,22,52,199,197,249,22,252,5,2,248,22,51,199,195,11,251,22,252,29, +2,248,22,52,199,197,249,22,252,5,2,248,22,51,199,195,11,251,22,252,30, 2,2,252,0,1,6,26,26,99,121,99,108,101,32,105,110,32,108,111,97,100, 105,110,103,32,97,116,32,126,101,58,32,126,101,198,249,22,2,22,52,248,22, 66,249,22,50,205,201,12,195,27,248,22,41,198,20,14,159,80,158,48,8,28, -249,22,50,247,22,252,201,2,204,20,14,159,80,158,48,51,250,80,158,51,52, +249,22,50,247,22,252,202,2,204,20,14,159,80,158,48,51,250,80,158,51,52, 249,22,19,11,80,158,53,51,22,233,195,249,247,80,158,50,50,205,248,22,41, -248,22,252,205,1,248,22,252,15,3,203,250,22,114,196,198,197,28,28,248,22, +248,22,252,205,1,248,22,252,16,3,203,250,22,114,196,198,197,28,28,248,22, 252,217,1,203,11,27,248,22,252,135,1,23,17,28,192,192,28,248,22,49,23, 17,249,22,252,5,2,248,22,51,23,19,2,252,2,1,11,250,22,114,80,158, 49,59,28,248,22,252,135,1,23,19,249,22,50,23,20,247,23,16,249,22,50, -23,20,247,22,252,44,3,254,22,252,219,1,23,19,23,18,23,16,206,205,204, +23,20,247,22,252,45,3,254,22,252,219,1,23,19,23,18,23,16,206,205,204, 203,12,194,87,94,28,207,250,210,198,199,200,12,27,250,22,115,80,158,38,58, -248,22,252,67,3,247,22,252,201,2,89,162,32,32,38,9,223,6,27,247,22, -109,87,94,250,22,114,80,158,36,58,248,22,252,67,3,247,22,252,201,2,195, +248,22,252,68,3,247,22,252,202,2,89,162,32,32,38,9,223,6,27,247,22, +109,87,94,250,22,114,80,158,36,58,248,22,252,68,3,247,22,252,202,2,195, 192,250,22,114,195,200,66,97,116,116,97,99,104,252,9,1,208,83,159,32,93, 80,158,32,8,32,89,162,32,32,45,2,69,223,0,249,80,158,34,43,27,248, 22,252,212,1,6,11,11,80,76,84,67,79,76,76,69,67,84,83,28,192,192, -6,0,0,249,22,50,250,22,252,24,3,248,22,252,42,3,69,97,100,100,111, +6,0,0,249,22,50,250,22,252,25,3,248,22,252,43,3,69,97,100,100,111, 110,45,100,105,114,252,10,1,247,22,252,210,1,6,8,8,99,111,108,108,101, 99,116,115,27,249,22,5,89,162,32,33,36,9,222,27,247,193,28,192,28,248, -22,252,19,3,193,248,22,58,248,22,252,31,3,194,11,11,252,22,58,89,162, +22,252,20,3,193,248,22,58,248,22,252,32,3,194,11,11,252,22,58,89,162, 32,32,35,9,222,27,248,22,252,212,1,6,7,7,80,76,84,72,79,77,69, -28,192,249,22,252,24,3,194,6,8,8,99,111,108,108,101,99,116,115,11,89, -162,32,32,36,9,223,12,249,80,158,34,44,248,22,252,42,3,69,101,120,101, +28,192,249,22,252,25,3,194,6,8,8,99,111,108,108,101,99,116,115,11,89, +162,32,32,36,9,223,12,249,80,158,34,44,248,22,252,43,3,69,101,120,101, 99,45,102,105,108,101,252,11,1,6,8,8,99,111,108,108,101,99,116,115,89, -162,32,32,37,9,223,12,249,80,158,34,44,248,22,252,42,3,2,252,11,1, -249,22,252,24,3,2,252,5,1,6,8,8,99,111,108,108,101,99,116,115,89, -162,32,32,38,9,223,12,249,80,158,34,44,248,22,252,42,3,2,252,11,1, -250,22,252,24,3,2,252,5,1,2,252,5,1,6,8,8,99,111,108,108,101, -99,116,115,89,162,32,32,39,9,223,12,249,80,158,34,44,248,22,252,42,3, -2,252,11,1,251,22,252,24,3,2,252,5,1,2,252,5,1,2,252,5,1, +162,32,32,37,9,223,12,249,80,158,34,44,248,22,252,43,3,2,252,11,1, +249,22,252,25,3,2,252,5,1,6,8,8,99,111,108,108,101,99,116,115,89, +162,32,32,38,9,223,12,249,80,158,34,44,248,22,252,43,3,2,252,11,1, +250,22,252,25,3,2,252,5,1,2,252,5,1,6,8,8,99,111,108,108,101, +99,116,115,89,162,32,32,39,9,223,12,249,80,158,34,44,248,22,252,43,3, +2,252,11,1,251,22,252,25,3,2,252,5,1,2,252,5,1,2,252,5,1, 6,8,8,99,111,108,108,101,99,116,115,28,192,192,9,83,159,32,93,80,158, 32,8,33,89,162,32,33,35,2,71,222,27,248,22,252,3,1,194,28,192,192, 248,22,252,4,1,194,83,159,32,97,80,158,32,8,34,80,158,32,8,35,80, -158,32,8,36,80,158,32,8,37,80,158,32,8,38,26,9,22,252,82,2,63, -101,118,116,252,12,1,11,33,32,11,248,22,58,249,22,50,22,252,81,2,32, -247,22,252,103,2,11,21,93,32,83,159,32,93,80,158,32,8,39,89,162,32, +158,32,8,36,80,158,32,8,37,80,158,32,8,38,26,9,22,252,83,2,63, +101,118,116,252,12,1,11,33,32,11,248,22,58,249,22,50,22,252,82,2,32, +247,22,252,104,2,11,21,93,32,83,159,32,93,80,158,32,8,39,89,162,32, 33,37,2,83,223,0,87,94,28,28,248,22,0,194,249,22,34,195,32,11,12, -250,22,252,32,2,2,83,6,19,19,112,114,111,99,101,100,117,114,101,32,40, +250,22,252,33,2,2,83,6,19,19,112,114,111,99,101,100,117,114,101,32,40, 97,114,105,116,121,32,48,41,196,248,80,158,33,8,35,89,162,32,33,34,9, 223,2,247,192,83,159,32,93,80,158,32,8,40,89,162,32,33,36,2,85,222, -87,94,28,248,22,252,242,2,193,12,250,22,252,32,2,2,85,6,7,7,99, -104,97,110,110,101,108,195,248,22,252,228,2,193,83,159,32,93,80,158,32,8, -41,89,162,32,33,36,2,87,222,87,94,28,248,22,252,242,2,193,12,250,22, -252,32,2,2,87,6,7,7,99,104,97,110,110,101,108,195,249,22,252,229,2, +87,94,28,248,22,252,243,2,193,12,250,22,252,33,2,2,85,6,7,7,99, +104,97,110,110,101,108,195,248,22,252,229,2,193,83,159,32,93,80,158,32,8, +41,89,162,32,33,36,2,87,222,87,94,28,248,22,252,243,2,193,12,250,22, +252,33,2,2,87,6,7,7,99,104,97,110,110,101,108,195,249,22,252,230,2, 32,194,83,159,32,93,80,158,32,8,42,89,162,32,34,37,2,89,222,87,94, -28,248,22,252,242,2,193,12,250,22,252,32,2,2,89,6,7,7,99,104,97, -110,110,101,108,195,28,248,22,252,228,2,249,22,252,241,2,195,196,12,11,83, -159,32,93,80,158,32,8,43,89,162,32,32,32,2,91,222,247,22,252,201,2, +28,248,22,252,243,2,193,12,250,22,252,33,2,2,89,6,7,7,99,104,97, +110,110,101,108,195,28,248,22,252,229,2,249,22,252,242,2,195,196,12,11,83, +159,32,93,80,158,32,8,43,89,162,32,32,32,2,91,222,247,22,252,202,2, 83,159,32,93,80,158,32,8,44,89,162,32,33,37,2,93,223,0,87,94,28, -249,22,180,195,37,12,250,22,252,32,2,2,93,6,1,1,53,196,248,80,158, +249,22,180,195,37,12,250,22,252,33,2,2,93,6,1,1,53,196,248,80,158, 33,8,45,11,83,159,32,93,80,158,32,8,46,89,162,32,33,37,2,97,223, -0,87,94,28,249,22,180,195,37,12,250,22,252,32,2,2,97,6,1,1,53, +0,87,94,28,249,22,180,195,37,12,250,22,252,33,2,2,97,6,1,1,53, 196,248,80,158,33,8,45,10,83,159,32,93,80,158,32,8,45,89,162,32,33, -41,2,95,223,0,27,248,22,252,179,2,65,101,109,112,116,121,252,13,1,27, -247,22,252,179,2,87,94,20,14,159,80,158,34,51,250,80,158,37,52,249,22, -19,11,80,158,39,51,22,252,201,2,196,87,96,249,22,238,194,66,35,37,114, +41,2,95,223,0,27,248,22,252,180,2,65,101,109,112,116,121,252,13,1,27, +247,22,252,180,2,87,94,20,14,159,80,158,34,51,250,80,158,37,52,249,22, +19,11,80,158,39,51,22,252,202,2,196,87,96,249,22,238,194,66,35,37,114, 53,114,115,252,14,1,248,22,236,2,252,14,1,248,22,237,21,95,64,111,110, -108,121,252,15,1,68,109,122,115,99,104,101,109,101,252,16,1,2,175,28,195, -12,249,22,3,89,162,32,33,37,9,222,249,22,252,64,3,194,249,22,234,2, +108,121,252,15,1,68,109,122,115,99,104,101,109,101,252,16,1,2,171,28,195, +12,249,22,3,89,162,32,33,37,9,222,249,22,252,65,3,194,249,22,234,2, 252,16,1,196,21,15,203,63,99,97,114,252,17,1,63,99,100,114,252,18,1, 64,99,97,97,114,252,19,1,64,99,97,100,114,252,20,1,64,99,100,97,114, 252,21,1,64,99,100,100,114,252,22,1,65,99,97,97,97,114,252,23,1,65, @@ -4015,70 +4056,70 @@ 115,252,210,1,66,118,97,108,117,101,115,252,211,1,64,101,118,97,108,252,212, 1,2,71,2,93,2,97,2,91,72,100,121,110,97,109,105,99,45,119,105,110, 100,252,213,1,9,193,97,68,35,37,107,101,114,110,101,108,252,214,1,2,114, -74,35,37,115,109,97,108,108,45,115,99,104,101,109,101,252,215,1,2,118,2, -136,95,2,252,214,1,2,100,2,162,0}; +74,35,37,115,109,97,108,108,45,115,99,104,101,109,101,252,215,1,2,116,2, +136,95,2,252,214,1,2,100,2,155,0}; EVAL_ONE_SIZED_STR((char *)expr, 13723); } { - static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,48,46,51,66,252,59,4,159,32,20,96,158,16,1,20,23, -65,98,101,103,105,110,0,16,0,83,158,39,20,93,114,72,35,37,115,116,120, + static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,49,46,52,66,252,59,4,159,32,20,97,158,16,1,20,23, +65,98,101,103,105,110,0,16,0,83,158,39,20,94,114,72,35,37,115,116,120, 109,122,45,98,111,100,121,1,29,2,11,11,18,95,11,35,97,33,10,32,11, -16,58,71,119,105,116,104,45,115,121,110,116,97,120,3,70,35,37,119,105,116, -104,45,115,116,120,4,66,115,121,110,116,97,120,5,69,35,37,115,116,120,99, -97,115,101,6,77,100,101,102,105,110,101,45,102,111,114,45,115,121,110,116,97, -120,7,68,35,37,100,101,102,105,110,101,8,74,45,100,101,102,105,110,101,45, -115,121,110,116,97,120,9,74,35,37,100,101,102,105,110,101,45,101,116,45,97, -108,10,1,20,103,101,110,101,114,97,116,101,45,116,101,109,112,111,114,97,114, -105,101,115,11,2,4,1,26,99,104,101,99,107,45,100,117,112,108,105,99,97, -116,101,45,105,100,101,110,116,105,102,105,101,114,12,76,35,37,115,116,120,99, -97,115,101,45,115,99,104,101,109,101,13,70,115,121,110,116,97,120,47,108,111, -99,14,68,35,37,115,116,120,108,111,99,15,66,100,101,102,105,110,101,16,2, -8,63,97,110,100,17,71,35,37,113,113,45,97,110,100,45,111,114,18,66,108, -101,116,47,101,99,19,2,10,70,108,101,116,45,115,121,110,116,97,120,20,2, -13,62,111,114,21,2,18,1,20,35,37,112,108,97,105,110,45,109,111,100,117, -108,101,45,98,101,103,105,110,22,158,68,35,37,107,101,114,110,101,108,23,74, -35,37,109,111,100,117,108,101,45,98,101,103,105,110,24,73,100,101,102,105,110, -101,45,115,116,114,117,99,116,25,2,10,73,100,101,102,105,110,101,45,115,121, -110,116,97,120,26,2,8,72,108,101,116,45,115,121,110,116,97,120,101,115,27, -2,13,70,113,117,97,115,105,113,117,111,116,101,28,2,18,64,99,111,110,100, -29,66,35,37,99,111,110,100,30,72,115,121,110,116,97,120,45,99,97,115,101, -42,31,2,15,72,115,121,110,116,97,120,45,114,117,108,101,115,32,2,13,64, -119,104,101,110,33,2,10,75,115,121,110,116,97,120,45,105,100,45,114,117,108, -101,115,34,2,13,75,108,101,116,114,101,99,45,115,121,110,116,97,120,101,115, -35,2,13,73,108,101,116,114,101,99,45,115,121,110,116,97,120,36,2,13,66, -117,110,108,101,115,115,37,2,10,76,98,101,103,105,110,45,102,111,114,45,115, -121,110,116,97,120,38,2,8,67,45,100,101,102,105,110,101,39,2,10,1,28, -109,122,115,99,104,101,109,101,45,105,110,45,115,116,120,45,109,111,100,117,108, -101,45,98,101,103,105,110,40,2,2,71,115,121,110,116,97,120,45,99,97,115, -101,41,2,15,10,10,32,80,158,32,32,20,96,158,16,0,16,0,11,11,16, +16,58,70,108,101,116,45,115,121,110,116,97,120,3,76,35,37,115,116,120,99, +97,115,101,45,115,99,104,101,109,101,4,66,115,121,110,116,97,120,5,69,35, +37,115,116,120,99,97,115,101,6,63,97,110,100,7,71,35,37,113,113,45,97, +110,100,45,111,114,8,62,111,114,9,2,8,72,115,121,110,116,97,120,45,99, +97,115,101,42,10,68,35,37,115,116,120,108,111,99,11,75,108,101,116,114,101, +99,45,115,121,110,116,97,120,101,115,12,2,4,71,115,121,110,116,97,120,45, +99,97,115,101,13,2,11,66,100,101,102,105,110,101,14,68,35,37,100,101,102, +105,110,101,15,73,108,101,116,114,101,99,45,115,121,110,116,97,120,16,2,4, +72,108,101,116,45,115,121,110,116,97,120,101,115,17,2,4,64,119,104,101,110, +18,74,35,37,100,101,102,105,110,101,45,101,116,45,97,108,19,64,99,111,110, +100,20,66,35,37,99,111,110,100,21,1,20,35,37,112,108,97,105,110,45,109, +111,100,117,108,101,45,98,101,103,105,110,22,158,68,35,37,107,101,114,110,101, +108,23,74,35,37,109,111,100,117,108,101,45,98,101,103,105,110,24,72,115,121, +110,116,97,120,45,114,117,108,101,115,25,2,4,74,45,100,101,102,105,110,101, +45,115,121,110,116,97,120,26,2,19,77,100,101,102,105,110,101,45,102,111,114, +45,115,121,110,116,97,120,27,2,15,75,115,121,110,116,97,120,45,105,100,45, +114,117,108,101,115,28,2,4,70,113,117,97,115,105,113,117,111,116,101,29,2, +8,73,100,101,102,105,110,101,45,115,116,114,117,99,116,30,2,19,66,117,110, +108,101,115,115,31,2,19,70,115,121,110,116,97,120,47,108,111,99,32,2,11, +76,98,101,103,105,110,45,102,111,114,45,115,121,110,116,97,120,33,2,15,66, +108,101,116,47,101,99,34,2,19,71,119,105,116,104,45,115,121,110,116,97,120, +35,70,35,37,119,105,116,104,45,115,116,120,36,73,100,101,102,105,110,101,45, +115,121,110,116,97,120,37,2,15,1,26,99,104,101,99,107,45,100,117,112,108, +105,99,97,116,101,45,105,100,101,110,116,105,102,105,101,114,38,2,4,67,45, +100,101,102,105,110,101,39,2,19,1,28,109,122,115,99,104,101,109,101,45,105, +110,45,115,116,120,45,109,111,100,117,108,101,45,98,101,103,105,110,40,2,2, +1,20,103,101,110,101,114,97,116,101,45,116,101,109,112,111,114,97,114,105,101, +115,41,2,36,10,10,32,80,158,32,32,20,97,158,16,0,16,0,11,11,16, 0,32,11,16,1,2,40,16,1,11,16,1,2,40,32,33,93,16,5,93,2, 40,89,162,32,33,44,9,223,0,28,248,80,158,33,32,194,250,22,208,83,160, 41,32,35,34,250,22,60,83,160,41,33,38,34,249,22,208,201,249,22,58,83, 160,41,34,42,34,68,109,122,115,99,104,101,109,101,42,248,80,158,39,33,200, -196,250,22,252,31,2,11,6,10,10,98,97,100,32,115,121,110,116,97,120,196, -32,20,96,158,16,2,30,43,65,35,37,115,116,120,44,69,115,116,120,45,112, +196,250,22,252,32,2,11,6,10,10,98,97,100,32,115,121,110,116,97,120,196, +32,20,97,158,16,2,30,43,65,35,37,115,116,120,44,69,115,116,120,45,112, 97,105,114,63,45,11,30,46,2,44,67,115,116,120,45,99,100,114,47,6,16, 3,18,98,64,104,101,114,101,48,39,33,97,38,10,33,11,16,32,70,115,116, -120,45,114,111,116,97,116,101,49,2,44,2,45,2,44,73,115,116,120,45,99, -104,101,99,107,47,101,115,99,50,2,44,71,115,116,120,45,114,111,116,97,116, -101,42,51,2,44,69,115,116,120,45,108,105,115,116,63,52,2,44,74,115,112, -108,105,116,45,115,116,120,45,108,105,115,116,53,2,44,69,97,112,112,101,110, -100,47,35,102,54,2,44,69,115,116,120,45,62,108,105,115,116,55,2,44,67, -115,116,120,45,99,97,114,56,2,44,71,105,100,101,110,116,105,102,105,101,114, -63,57,2,44,2,47,2,44,71,115,116,120,45,118,101,99,116,111,114,63,58, -2,44,69,115,116,120,45,110,117,108,108,63,59,2,44,67,99,111,110,115,47, -35,102,60,2,44,71,115,116,120,45,110,117,108,108,47,35,102,61,2,44,74, -115,116,120,45,118,101,99,116,111,114,45,114,101,102,62,2,44,96,37,8,254, +120,45,114,111,116,97,116,101,49,2,44,2,45,2,44,74,115,116,120,45,118, +101,99,116,111,114,45,114,101,102,50,2,44,71,115,116,120,45,114,111,116,97, +116,101,42,51,2,44,69,115,116,120,45,108,105,115,116,63,52,2,44,73,115, +116,120,45,99,104,101,99,107,47,101,115,99,53,2,44,69,115,116,120,45,62, +108,105,115,116,54,2,44,74,115,112,108,105,116,45,115,116,120,45,108,105,115, +116,55,2,44,67,115,116,120,45,99,97,114,56,2,44,71,105,100,101,110,116, +105,102,105,101,114,63,57,2,44,2,47,2,44,71,115,116,120,45,118,101,99, +116,111,114,63,58,2,44,69,115,116,120,45,110,117,108,108,63,59,2,44,67, +99,111,110,115,47,35,102,60,2,44,69,97,112,112,101,110,100,47,35,102,61, +2,44,71,115,116,120,45,110,117,108,108,47,35,102,62,2,44,96,37,8,254, 1,11,16,0,16,4,36,11,63,115,116,120,63,3,1,7,101,110,118,52,51, -51,57,64,18,158,2,22,39,18,158,78,114,101,113,117,105,114,101,45,102,111, -114,45,115,121,110,116,97,120,65,39,11,9,95,2,23,2,13,2,8,94,2, +57,57,64,18,158,2,22,39,18,158,78,114,101,113,117,105,114,101,45,102,111, +114,45,115,121,110,116,97,120,65,39,11,9,95,2,23,2,4,2,15,94,2, 23,2,44,0}; EVAL_ONE_SIZED_STR((char *)expr, 1095); } { - static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,48,46,51,91,252,159,6,159,32,20,96,158,16,1,20,23, -65,98,101,103,105,110,0,16,0,83,158,39,20,93,114,68,109,122,115,99,104, -101,109,101,1,29,2,11,11,10,10,10,32,80,158,32,32,20,96,158,16,0, + static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,49,46,52,91,252,159,6,159,32,20,97,158,16,1,20,23, +65,98,101,103,105,110,0,16,0,83,158,39,20,94,114,68,109,122,115,99,104, +101,109,101,1,29,2,11,11,10,10,10,32,80,158,32,32,20,97,158,16,0, 16,0,74,35,37,109,111,100,117,108,101,45,98,101,103,105,110,3,10,16,0, 32,11,16,73,1,32,99,97,108,108,45,119,105,116,104,45,98,114,101,97,107, 45,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111,110,4,1,26,99, @@ -4110,79 +4151,79 @@ 71,114,97,116,105,111,110,97,108,105,122,101,32,1,20,114,101,97,100,45,101, 118,97,108,45,112,114,105,110,116,45,108,111,111,112,33,1,25,115,99,104,101, 109,101,45,114,101,112,111,114,116,45,101,110,118,105,114,111,110,109,101,110,116, -34,73,119,105,116,104,45,104,97,110,100,108,101,114,115,35,74,119,105,116,104, -45,104,97,110,100,108,101,114,115,42,36,72,115,121,110,116,97,120,45,99,97, -115,101,42,37,64,99,97,115,101,38,73,100,101,102,105,110,101,45,115,121,110, -116,97,120,39,64,116,105,109,101,40,77,117,110,115,121,110,116,97,120,45,115, -112,108,105,99,105,110,103,41,66,108,101,116,47,99,99,42,70,108,101,116,45, -115,116,114,117,99,116,43,71,119,105,116,104,45,115,121,110,116,97,120,44,79, -109,101,109,111,114,121,45,116,114,97,99,101,45,108,97,109,98,100,97,45,71, -115,121,110,116,97,120,45,99,97,115,101,46,64,99,111,110,100,47,70,115,121, -110,116,97,120,47,108,111,99,48,66,100,101,102,105,110,101,49,66,115,121,110, -116,97,120,50,65,100,101,108,97,121,51,70,113,117,97,115,105,113,117,111,116, -101,52,69,102,108,117,105,100,45,108,101,116,53,70,108,101,116,45,115,121,110, -116,97,120,54,64,119,104,101,110,55,66,117,110,108,101,115,115,56,66,108,101, -116,47,101,99,57,1,28,109,122,115,99,104,101,109,101,45,105,110,45,115,116, -120,45,109,111,100,117,108,101,45,98,101,103,105,110,58,62,100,111,59,63,97, -110,100,60,62,111,114,61,77,100,101,102,105,110,101,45,102,111,114,45,115,121, -110,116,97,120,62,76,98,101,103,105,110,45,102,111,114,45,115,121,110,116,97, -120,63,78,112,97,114,97,109,101,116,101,114,105,122,101,45,98,114,101,97,107, -64,71,115,101,116,33,45,118,97,108,117,101,115,65,73,100,101,102,105,110,101, -45,115,116,114,117,99,116,66,68,117,110,115,121,110,116,97,120,67,71,113,117, -97,115,105,115,121,110,116,97,120,68,2,3,75,113,117,97,115,105,115,121,110, -116,97,120,47,108,111,99,69,75,108,101,116,114,101,99,45,115,121,110,116,97, -120,101,115,70,73,108,101,116,114,101,99,45,115,121,110,116,97,120,71,72,108, -101,116,45,115,121,110,116,97,120,101,115,72,72,115,121,110,116,97,120,45,114, -117,108,101,115,73,75,115,121,110,116,97,120,45,105,100,45,114,117,108,101,115, -74,72,112,97,114,97,109,101,116,101,114,105,122,101,75,16,73,73,35,37,109, +34,72,112,97,114,97,109,101,116,101,114,105,122,101,35,73,119,105,116,104,45, +104,97,110,100,108,101,114,115,36,74,119,105,116,104,45,104,97,110,100,108,101, +114,115,42,37,66,117,110,108,101,115,115,38,62,100,111,39,77,117,110,115,121, +110,116,97,120,45,115,112,108,105,99,105,110,103,40,70,115,121,110,116,97,120, +47,108,111,99,41,64,99,97,115,101,42,69,102,108,117,105,100,45,108,101,116, +43,64,99,111,110,100,44,71,115,101,116,33,45,118,97,108,117,101,115,45,64, +119,104,101,110,46,66,108,101,116,47,101,99,47,66,115,121,110,116,97,120,48, +66,108,101,116,47,99,99,49,70,113,117,97,115,105,113,117,111,116,101,50,64, +116,105,109,101,51,78,112,97,114,97,109,101,116,101,114,105,122,101,45,98,114, +101,97,107,52,65,100,101,108,97,121,53,71,119,105,116,104,45,115,121,110,116, +97,120,54,1,28,109,122,115,99,104,101,109,101,45,105,110,45,115,116,120,45, +109,111,100,117,108,101,45,98,101,103,105,110,55,71,115,121,110,116,97,120,45, +99,97,115,101,56,63,97,110,100,57,62,111,114,58,70,108,101,116,45,115,121, +110,116,97,120,59,68,117,110,115,121,110,116,97,120,60,73,100,101,102,105,110, +101,45,115,116,114,117,99,116,61,71,113,117,97,115,105,115,121,110,116,97,120, +62,70,108,101,116,45,115,116,114,117,99,116,63,66,100,101,102,105,110,101,64, +72,115,121,110,116,97,120,45,99,97,115,101,42,65,2,3,75,113,117,97,115, +105,115,121,110,116,97,120,47,108,111,99,66,75,108,101,116,114,101,99,45,115, +121,110,116,97,120,101,115,67,79,109,101,109,111,114,121,45,116,114,97,99,101, +45,108,97,109,98,100,97,68,73,108,101,116,114,101,99,45,115,121,110,116,97, +120,69,72,108,101,116,45,115,121,110,116,97,120,101,115,70,77,100,101,102,105, +110,101,45,102,111,114,45,115,121,110,116,97,120,71,72,115,121,110,116,97,120, +45,114,117,108,101,115,72,75,115,121,110,116,97,120,45,105,100,45,114,117,108, +101,115,73,73,100,101,102,105,110,101,45,115,121,110,116,97,120,74,76,98,101, +103,105,110,45,102,111,114,45,115,121,110,116,97,120,75,16,73,73,35,37,109, 111,114,101,45,115,99,104,101,109,101,76,2,76,66,35,37,109,105,115,99,77, 2,77,2,77,76,35,37,115,116,120,99,97,115,101,45,115,99,104,101,109,101, 78,2,77,2,76,2,77,2,76,2,77,2,77,2,76,70,35,37,119,105,116, 104,45,115,116,120,79,2,77,65,35,37,115,116,120,80,2,77,2,77,2,77, 2,77,2,77,2,77,2,77,2,77,2,77,2,77,2,77,2,76,2,77,2, -77,2,77,2,76,2,76,68,35,37,115,116,120,108,111,99,81,2,76,68,35, -37,100,101,102,105,110,101,82,2,76,67,35,37,113,113,115,116,120,83,2,76, -2,76,2,79,2,77,2,81,66,35,37,99,111,110,100,84,2,81,2,82,69, -35,37,115,116,120,99,97,115,101,85,2,76,71,35,37,113,113,45,97,110,100, -45,111,114,86,2,76,2,78,74,35,37,100,101,102,105,110,101,45,101,116,45, -97,108,87,2,87,2,87,72,35,37,115,116,120,109,122,45,98,111,100,121,88, -2,76,2,86,2,86,2,82,2,82,2,76,2,76,2,87,2,83,2,83,68, -35,37,107,101,114,110,101,108,89,2,83,2,78,2,78,2,78,2,78,2,78, -2,76,16,73,2,4,2,5,2,6,2,7,2,8,2,9,2,10,2,11,2, +77,2,77,2,76,2,76,2,76,74,35,37,100,101,102,105,110,101,45,101,116, +45,97,108,81,2,76,67,35,37,113,113,115,116,120,82,68,35,37,115,116,120, +108,111,99,83,2,76,2,76,66,35,37,99,111,110,100,84,2,76,2,81,2, +81,69,35,37,115,116,120,99,97,115,101,85,2,76,71,35,37,113,113,45,97, +110,100,45,111,114,86,2,76,2,76,2,76,2,79,72,35,37,115,116,120,109, +122,45,98,111,100,121,87,2,83,2,86,2,86,2,78,2,82,2,81,2,82, +2,76,68,35,37,100,101,102,105,110,101,88,2,83,68,35,37,107,101,114,110, +101,108,89,2,82,2,78,2,77,2,78,2,78,2,88,2,78,2,78,2,88, +2,88,16,73,2,4,2,5,2,6,2,7,2,8,2,9,2,10,2,11,2, 12,2,13,2,14,2,15,2,16,2,17,2,18,2,19,2,20,2,21,2,22, 2,23,2,24,2,25,2,26,2,27,2,28,2,29,2,30,2,31,2,32,2, 33,2,34,2,35,2,36,2,37,2,38,2,39,2,40,2,41,2,42,2,43, 2,44,2,45,2,46,2,47,2,48,2,49,2,50,2,51,2,52,2,53,2, -54,2,55,2,56,2,57,2,3,2,59,2,60,2,61,2,62,2,63,2,64, -2,65,2,66,2,67,2,68,1,20,35,37,112,108,97,105,110,45,109,111,100, -117,108,101,45,98,101,103,105,110,90,2,69,2,70,2,71,2,72,2,73,2, +54,2,3,2,56,2,57,2,58,2,59,2,60,2,61,2,62,2,63,2,64, +2,65,1,20,35,37,112,108,97,105,110,45,109,111,100,117,108,101,45,98,101, +103,105,110,90,2,66,2,67,2,68,2,69,2,70,2,71,2,72,2,73,2, 74,2,75,8,31,8,73,9,9,100,2,89,2,76,2,77,2,78,2,80,2, -88,2,83,2,82,9,0}; +87,2,82,2,88,9,0}; EVAL_ONE_SIZED_STR((char *)expr, 1707); } { - static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,48,46,51,203,252,106,23,159,32,20,96,158,16,1,20,23, -65,98,101,103,105,110,0,16,0,83,158,39,20,93,114,66,35,37,114,53,114, -115,1,29,2,11,11,10,10,10,33,80,158,32,32,20,96,158,16,1,30,3, + static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,49,46,52,203,252,106,23,159,32,20,97,158,16,1,20,23, +65,98,101,103,105,110,0,16,0,83,158,39,20,94,114,66,35,37,114,53,114, +115,1,29,2,11,11,10,10,10,33,80,158,32,32,20,97,158,16,1,30,3, 2,2,69,117,110,100,101,102,105,110,101,100,4,254,1,16,0,11,11,16,1, -2,4,33,11,16,24,65,35,37,116,111,112,5,66,108,97,109,98,100,97,6, -62,111,114,7,63,108,101,116,8,64,99,97,115,101,9,64,108,101,116,42,10, -65,100,101,108,97,121,11,71,114,53,114,115,58,108,101,116,114,101,99,12,2, -0,63,97,110,100,13,73,108,101,116,114,101,99,45,115,121,110,116,97,120,14, -65,113,117,111,116,101,15,70,108,101,116,45,115,121,110,116,97,120,16,62,105, -102,17,66,100,101,102,105,110,101,18,73,100,101,102,105,110,101,45,115,121,110, -116,97,120,19,67,117,110,113,117,111,116,101,20,70,113,117,97,115,105,113,117, -111,116,101,21,64,99,111,110,100,22,64,115,101,116,33,23,76,117,110,113,117, -111,116,101,45,115,112,108,105,99,105,110,103,24,62,100,111,25,65,35,37,97, -112,112,26,67,35,37,100,97,116,117,109,27,16,24,68,35,37,107,101,114,110, -101,108,28,2,28,71,35,37,113,113,45,97,110,100,45,111,114,29,2,28,73, -35,37,109,111,114,101,45,115,99,104,101,109,101,30,2,28,2,30,11,2,28, -2,29,76,35,37,115,116,120,99,97,115,101,45,115,99,104,101,109,101,31,2, -28,2,31,2,28,68,35,37,100,101,102,105,110,101,32,2,32,2,28,2,29, -66,35,37,99,111,110,100,33,2,28,2,28,2,30,2,28,2,28,16,24,2, -5,2,6,2,7,2,8,2,9,2,10,2,11,66,108,101,116,114,101,99,34, -2,0,2,13,2,14,2,15,2,16,2,17,2,18,2,19,2,20,2,21,2, -22,2,23,2,24,2,25,2,26,2,27,32,56,93,16,5,93,2,12,89,162, +2,4,33,11,16,24,65,100,101,108,97,121,5,63,97,110,100,6,62,111,114, +7,63,108,101,116,8,64,108,101,116,42,9,71,114,53,114,115,58,108,101,116, +114,101,99,10,73,108,101,116,114,101,99,45,115,121,110,116,97,120,11,66,108, +97,109,98,100,97,12,66,100,101,102,105,110,101,13,62,100,111,14,62,105,102, +15,64,99,97,115,101,16,64,99,111,110,100,17,2,0,70,108,101,116,45,115, +121,110,116,97,120,18,65,35,37,116,111,112,19,67,117,110,113,117,111,116,101, +20,70,113,117,97,115,105,113,117,111,116,101,21,64,115,101,116,33,22,76,117, +110,113,117,111,116,101,45,115,112,108,105,99,105,110,103,23,65,113,117,111,116, +101,24,73,100,101,102,105,110,101,45,115,121,110,116,97,120,25,65,35,37,97, +112,112,26,67,35,37,100,97,116,117,109,27,16,24,73,35,37,109,111,114,101, +45,115,99,104,101,109,101,28,71,35,37,113,113,45,97,110,100,45,111,114,29, +2,29,68,35,37,107,101,114,110,101,108,30,2,30,11,76,35,37,115,116,120, +99,97,115,101,45,115,99,104,101,109,101,31,2,30,68,35,37,100,101,102,105, +110,101,32,2,28,2,30,2,28,66,35,37,99,111,110,100,33,2,30,2,31, +2,30,2,30,2,29,2,30,2,30,2,30,2,32,2,30,2,30,16,24,2, +5,2,6,2,7,2,8,2,9,66,108,101,116,114,101,99,34,2,11,2,12, +2,13,2,14,2,15,2,16,2,17,2,0,2,18,2,19,2,20,2,21,2, +22,2,23,2,24,2,25,2,26,2,27,32,56,93,16,5,93,2,10,89,162, 32,33,56,9,223,0,27,28,248,80,158,34,32,195,249,80,158,35,33,248,80, 158,36,34,197,27,248,80,158,37,35,198,28,248,80,158,37,32,193,27,27,248, 80,158,39,34,195,28,248,80,158,39,36,193,248,22,8,89,162,32,33,39,9, @@ -4193,22 +4234,22 @@ 28,248,22,56,193,21,94,9,9,248,80,158,35,40,193,11,28,192,249,80,158, 39,41,194,27,248,80,158,41,35,197,28,248,80,158,41,36,193,248,80,158,41, 39,193,11,11,11,11,28,192,27,248,22,51,194,27,248,22,77,195,27,248,22, -86,196,27,248,22,87,197,249,80,158,39,42,200,27,250,22,60,199,200,198,27, +86,196,27,248,22,87,197,249,80,158,39,42,200,27,250,22,60,198,199,200,27, 83,160,41,32,41,44,91,159,33,11,90,161,33,32,11,83,160,38,32,33,11, 247,248,22,8,89,162,32,33,40,9,226,11,2,3,1,250,22,31,89,162,32, -32,36,9,225,6,3,7,90,161,33,33,10,247,22,252,174,2,248,22,252,174, +32,36,9,225,6,3,7,90,161,33,33,10,247,22,252,175,2,248,22,252,175, 2,89,162,32,33,36,9,224,3,1,248,193,89,162,32,32,36,9,224,2,3, -28,248,22,252,171,2,193,248,22,252,176,2,193,249,80,158,35,43,21,99,2, -12,6,19,19,103,101,110,101,114,97,116,101,95,116,101,109,112,95,110,97,109, +28,248,22,252,172,2,193,248,22,252,177,2,193,249,80,158,35,43,21,99,2, +10,6,19,19,103,101,110,101,114,97,116,101,95,116,101,109,112,95,110,97,109, 101,115,94,64,118,97,114,49,35,63,46,46,46,36,9,94,94,2,35,65,105, 110,105,116,49,37,2,36,64,98,111,100,121,38,2,36,83,160,41,33,35,44, 89,162,32,32,52,9,225,6,5,4,27,250,22,208,83,160,41,34,38,44,250, 22,208,83,160,41,35,41,44,253,22,60,83,160,41,36,47,44,83,160,41,37, -47,44,248,22,77,206,83,160,41,38,47,44,250,22,2,89,162,33,33,41,9, +47,44,248,22,79,206,83,160,41,38,47,44,250,22,2,89,162,33,33,41,9, 223,18,250,22,208,83,160,41,39,35,44,249,22,58,248,22,51,199,248,22,77, -199,83,160,41,40,35,44,248,22,77,23,17,248,22,51,23,17,248,22,79,206, +199,83,160,41,40,35,44,248,22,79,23,17,248,22,77,23,17,248,22,51,206, 83,160,41,41,41,44,197,89,162,32,32,33,9,223,0,192,89,162,32,32,34, -9,223,3,248,22,252,174,2,208,27,28,248,80,158,35,32,196,249,80,158,36, +9,223,3,248,22,252,175,2,208,27,28,248,80,158,35,32,196,249,80,158,36, 33,248,80,158,37,34,198,27,248,80,158,38,35,199,28,248,80,158,38,32,193, 28,27,248,80,158,39,34,194,28,249,22,252,7,2,6,19,19,103,101,110,101, 114,97,116,101,95,116,101,109,112,95,110,97,109,101,115,248,22,209,195,9,11, @@ -4225,28 +4266,28 @@ 11,28,192,249,80,158,46,41,194,27,248,80,158,48,35,197,28,248,80,158,48, 36,193,248,80,158,48,39,193,11,11,11,11,11,11,11,11,11,11,28,192,27, 248,22,51,194,27,248,22,77,195,27,248,22,86,196,27,248,22,89,197,27,248, -22,88,198,249,80,158,41,42,202,27,251,22,60,200,202,201,199,27,83,160,41, +22,88,198,249,80,158,41,42,202,27,251,22,60,202,199,201,200,27,83,160,41, 42,43,44,91,159,33,11,90,161,33,32,11,83,160,38,32,33,11,247,248,22, 8,89,162,32,33,40,9,226,13,2,3,1,250,22,31,89,162,32,32,36,9, -225,6,3,7,90,161,33,33,10,247,22,252,174,2,248,22,252,174,2,89,162, +225,6,3,7,90,161,33,33,10,247,22,252,175,2,248,22,252,175,2,89,162, 32,33,36,9,224,3,1,248,193,89,162,32,32,36,9,224,2,3,28,248,22, -252,171,2,193,248,22,252,176,2,193,249,80,158,35,43,21,95,2,8,94,94, +252,172,2,193,248,22,252,177,2,193,249,80,158,35,43,21,95,2,8,94,94, 2,35,2,4,2,36,97,2,8,94,94,65,116,101,109,112,49,39,2,37,2, -36,95,2,23,2,35,2,39,2,36,96,2,8,9,2,38,2,36,83,160,41, +36,95,2,22,2,35,2,39,2,36,96,2,8,9,2,38,2,36,83,160,41, 43,35,44,89,162,32,32,8,29,9,225,6,5,4,27,250,22,208,83,160,41, 44,38,44,250,22,208,83,160,41,45,41,44,250,22,58,83,160,41,46,44,44, 249,22,2,89,162,33,33,41,9,223,14,250,22,208,83,160,41,47,35,44,249, 22,50,248,22,51,199,83,160,41,48,37,44,83,160,41,49,35,44,248,22,86, 205,250,22,208,83,160,41,50,47,44,250,22,60,83,160,41,51,50,44,250,22, 2,89,162,33,33,41,9,223,21,250,22,208,83,160,41,52,35,44,249,22,58, -248,22,51,199,248,22,77,199,83,160,41,53,35,44,248,22,77,23,20,248,22, -51,23,20,249,22,64,250,22,2,89,162,33,33,42,9,223,23,250,22,208,83, +248,22,51,199,248,22,77,199,83,160,41,53,35,44,248,22,51,23,20,248,22, +87,23,20,249,22,64,250,22,2,89,162,33,33,42,9,223,23,250,22,208,83, 160,41,54,35,44,250,22,58,83,160,41,55,38,44,248,22,51,200,248,22,77, -200,83,160,41,56,35,44,248,22,86,23,22,248,22,77,23,22,248,22,58,250, +200,83,160,41,56,35,44,248,22,86,23,22,248,22,51,23,22,248,22,58,250, 22,208,83,160,41,57,56,44,250,22,60,83,160,41,58,59,44,83,160,41,59, -59,44,248,22,87,23,26,83,160,41,8,28,56,44,83,160,41,8,29,47,44, +59,44,248,22,77,23,26,83,160,41,8,28,56,44,83,160,41,8,29,47,44, 83,160,41,8,30,41,44,197,89,162,32,32,33,9,223,0,192,89,162,32,32, -34,9,223,3,248,22,252,174,2,208,27,28,248,80,158,36,32,197,249,80,158, +34,9,223,3,248,22,252,175,2,208,27,28,248,80,158,36,32,197,249,80,158, 37,33,248,80,158,38,34,199,27,248,80,158,39,35,200,28,248,80,158,39,32, 193,28,27,248,80,158,40,34,194,28,249,22,252,7,2,6,19,19,103,101,110, 101,114,97,116,101,95,116,101,109,112,95,110,97,109,101,115,248,22,209,195,9, @@ -4266,25 +4307,25 @@ 197,28,248,80,158,52,36,193,248,80,158,52,39,193,11,11,11,11,11,11,11, 11,11,11,28,192,27,248,22,51,194,27,248,22,77,195,27,248,22,86,196,27, 248,22,89,197,27,249,22,69,199,36,27,249,22,69,200,37,27,249,22,68,201, -38,249,80,158,44,42,205,27,252,22,60,201,202,203,200,204,27,83,160,41,8, +38,249,80,158,44,42,205,27,252,22,60,204,200,203,202,201,27,83,160,41,8, 31,46,44,91,159,33,11,90,161,33,32,11,83,160,38,32,33,11,247,248,22, 8,89,162,32,33,40,9,226,16,2,3,1,250,22,31,89,162,32,32,36,9, -225,6,3,7,90,161,33,33,10,247,22,252,174,2,248,22,252,174,2,89,162, +225,6,3,7,90,161,33,33,10,247,22,252,175,2,248,22,252,175,2,89,162, 32,33,36,9,224,3,1,248,193,89,162,32,32,36,9,224,2,3,28,248,22, -252,171,2,193,248,22,252,176,2,193,249,80,158,35,43,21,99,2,12,6,19, +252,172,2,193,248,22,252,177,2,193,249,80,158,35,43,21,99,2,10,6,19, 19,103,101,110,101,114,97,116,101,95,116,101,109,112,95,110,97,109,101,115,94, 61,121,40,2,36,95,67,110,101,119,116,101,109,112,41,64,116,101,109,112,42, 2,36,94,94,2,35,2,37,2,36,2,38,2,36,83,160,41,8,32,35,44, 89,162,32,32,54,9,225,6,5,4,27,250,22,208,83,160,41,8,33,38,44, 250,22,208,83,160,41,8,34,41,44,253,22,60,83,160,41,8,35,47,44,83, -160,41,8,36,47,44,248,22,88,206,250,22,208,83,160,41,8,37,50,44,249, +160,41,8,36,47,44,248,22,51,206,250,22,208,83,160,41,8,37,50,44,249, 22,50,83,160,41,8,38,52,44,248,22,86,23,19,83,160,41,8,39,50,44, 250,22,2,89,162,33,33,41,9,223,18,250,22,208,83,160,41,8,40,35,44, -249,22,58,248,22,51,199,248,22,77,199,83,160,41,8,41,35,44,248,22,77, -23,17,248,22,51,23,17,248,22,89,206,83,160,41,8,42,41,44,197,89,162, -32,32,33,9,223,0,192,89,162,32,32,34,9,223,3,248,22,252,174,2,208, -250,22,252,31,2,11,6,10,10,98,97,100,32,115,121,110,116,97,120,199,32, -20,96,158,16,12,30,43,65,35,37,115,116,120,44,69,115,116,120,45,112,97, +249,22,58,248,22,51,199,248,22,77,199,83,160,41,8,41,35,44,248,22,89, +23,17,248,22,88,23,17,248,22,77,206,83,160,41,8,42,41,44,197,89,162, +32,32,33,9,223,0,192,89,162,32,32,34,9,223,3,248,22,252,175,2,208, +250,22,252,32,2,11,6,10,10,98,97,100,32,115,121,110,116,97,120,199,32, +20,97,158,16,12,30,43,65,35,37,115,116,120,44,69,115,116,120,45,112,97, 105,114,63,45,11,30,46,2,44,67,99,111,110,115,47,35,102,47,1,30,48, 2,44,67,115,116,120,45,99,97,114,49,5,30,50,2,44,67,115,116,120,45, 99,100,114,51,6,30,52,2,44,69,115,116,120,45,108,105,115,116,63,53,8, @@ -4295,154 +4336,154 @@ 102,63,0,30,64,68,35,37,115,116,120,108,111,99,65,68,114,101,108,111,99, 97,116,101,66,1,30,67,69,35,37,115,116,120,99,97,115,101,68,1,20,101, 108,108,105,112,115,105,115,45,99,111,117,110,116,45,101,114,114,111,114,69,0, -16,43,18,16,2,95,66,115,114,99,116,97,103,70,34,93,8,252,32,11,95, -9,8,252,32,11,2,68,18,16,2,99,2,36,39,93,8,252,32,11,16,6, -38,11,61,114,71,63,115,114,99,72,3,1,7,101,110,118,52,51,54,48,73, -2,73,16,4,37,11,64,101,120,110,104,74,3,1,7,101,110,118,52,51,54, -49,75,16,4,36,11,63,101,115,99,76,3,1,7,101,110,118,52,51,54,50, -77,16,4,35,11,63,101,120,110,78,3,1,7,101,110,118,52,51,54,52,79, -95,9,8,252,32,11,2,68,18,99,64,100,101,115,116,80,45,97,44,10,32, -11,16,150,74,119,105,116,104,45,104,97,110,100,108,101,114,115,42,81,2,30, -66,108,101,116,47,101,99,82,74,35,37,100,101,102,105,110,101,45,101,116,45, -97,108,83,65,112,111,114,116,63,84,66,35,37,109,105,115,99,85,75,99,104, -97,110,110,101,108,45,116,114,121,45,103,101,116,86,2,85,1,30,99,117,114, -114,101,110,116,45,98,114,101,97,107,45,112,97,114,97,109,101,116,101,114,105, -122,97,116,105,111,110,87,2,30,75,115,121,110,116,97,120,45,105,100,45,114, -117,108,101,115,88,2,31,74,35,37,109,111,100,117,108,101,45,98,101,103,105, -110,89,158,72,35,37,115,116,120,109,122,45,98,111,100,121,90,1,28,109,122, -115,99,104,101,109,101,45,105,110,45,115,116,120,45,109,111,100,117,108,101,45, -98,101,103,105,110,91,72,115,121,110,116,97,120,45,99,97,115,101,42,92,2, -65,67,108,111,97,100,47,99,100,93,2,85,1,20,114,101,97,100,45,101,118, -97,108,45,112,114,105,110,116,45,108,111,111,112,94,2,85,1,20,103,101,110, -101,114,97,116,101,45,116,101,109,112,111,114,97,114,105,101,115,95,70,35,37, -119,105,116,104,45,115,116,120,96,72,112,97,116,104,45,115,116,114,105,110,103, -63,97,2,85,2,12,2,2,71,105,100,101,110,116,105,102,105,101,114,63,98, -2,44,1,23,108,111,97,100,45,114,101,108,97,116,105,118,101,45,101,120,116, -101,110,115,105,111,110,99,2,85,69,103,117,97,114,100,45,101,118,116,100,2, -85,75,108,101,116,114,101,99,45,115,121,110,116,97,120,101,115,101,2,31,64, -116,105,109,101,102,2,30,2,13,2,29,2,14,2,31,68,112,114,111,109,105, -115,101,63,103,2,30,71,115,121,110,116,97,120,45,99,97,115,101,104,2,65, -78,112,97,114,97,109,101,116,101,114,105,122,101,45,98,114,101,97,107,105,2, -30,2,18,2,32,76,110,111,114,109,97,108,45,99,97,115,101,45,112,97,116, -104,106,2,85,65,102,111,114,99,101,107,2,30,66,108,101,116,47,99,99,108, -2,30,2,22,2,33,75,99,111,108,108,101,99,116,105,111,110,45,112,97,116, -104,109,2,85,70,115,121,110,116,97,120,47,108,111,99,110,2,65,1,32,99, -97,108,108,45,119,105,116,104,45,98,114,101,97,107,45,112,97,114,97,109,101, -116,101,114,105,122,97,116,105,111,110,111,2,30,1,27,112,97,116,104,45,108, -105,115,116,45,115,116,114,105,110,103,45,62,112,97,116,104,45,108,105,115,116, -112,2,85,71,115,101,116,33,45,118,97,108,117,101,115,113,2,30,79,112,97, -116,104,45,114,101,112,108,97,99,101,45,115,117,102,102,105,120,114,2,85,79, -109,101,109,111,114,121,45,116,114,97,99,101,45,108,97,109,98,100,97,115,2, -85,1,23,105,110,116,101,114,97,99,116,105,111,110,45,101,110,118,105,114,111, -110,109,101,110,116,116,2,85,70,108,101,116,45,115,116,114,117,99,116,117,2, -30,2,16,2,31,1,29,102,105,110,100,45,108,105,98,114,97,114,121,45,99, -111,108,108,101,99,116,105,111,110,45,112,97,116,104,115,118,2,85,77,117,110, -115,121,110,116,97,120,45,115,112,108,105,99,105,110,103,119,67,35,37,113,113, -115,116,120,120,1,25,99,117,114,114,101,110,116,45,108,111,97,100,47,117,115, -101,45,99,111,109,112,105,108,101,100,121,2,85,69,102,108,117,105,100,45,108, -101,116,122,2,30,66,115,121,110,116,97,120,123,2,68,2,19,2,32,73,108, -111,97,100,45,114,101,108,97,116,105,118,101,124,2,85,71,114,97,116,105,111, -110,97,108,105,122,101,125,2,85,71,99,104,97,110,110,101,108,45,103,101,116, -126,2,85,77,108,111,97,100,47,117,115,101,45,99,111,109,112,105,108,101,100, -127,2,85,2,21,2,29,2,9,2,30,68,117,110,115,121,110,116,97,120,128, -2,120,72,115,121,110,116,97,120,45,114,117,108,101,115,129,2,31,71,113,117, -97,115,105,115,121,110,116,97,120,130,2,120,1,25,115,99,104,101,109,101,45, -114,101,112,111,114,116,45,101,110,118,105,114,111,110,109,101,110,116,131,2,85, -1,20,35,37,112,108,97,105,110,45,109,111,100,117,108,101,45,98,101,103,105, -110,132,158,2,28,2,89,73,100,101,102,105,110,101,45,115,116,114,117,99,116, -133,2,83,1,20,102,105,110,100,45,101,120,101,99,117,116,97,98,108,101,45, -112,97,116,104,134,2,85,71,99,104,97,110,110,101,108,45,112,117,116,135,2, -85,75,113,117,97,115,105,115,121,110,116,97,120,47,108,111,99,136,2,120,1, -26,99,104,101,99,107,45,100,117,112,108,105,99,97,116,101,45,105,100,101,110, -116,105,102,105,101,114,137,2,31,72,112,97,114,97,109,101,116,101,114,105,122, -101,138,2,30,2,11,2,30,77,100,101,102,105,110,101,45,102,111,114,45,115, -121,110,116,97,120,139,2,32,76,110,117,108,108,45,101,110,118,105,114,111,110, -109,101,110,116,140,2,85,2,25,2,30,76,98,101,103,105,110,45,102,111,114, -45,115,121,110,116,97,120,141,2,32,71,119,105,116,104,45,115,121,110,116,97, -120,142,2,96,1,24,99,117,114,114,101,110,116,45,112,97,114,97,109,101,116, -101,114,105,122,97,116,105,111,110,143,2,30,2,7,2,29,72,108,101,116,45, -115,121,110,116,97,120,101,115,144,2,31,64,119,104,101,110,145,2,83,73,119, -105,116,104,45,104,97,110,100,108,101,114,115,146,2,30,2,4,2,2,66,117, -110,108,101,115,115,147,2,83,1,26,99,97,108,108,45,119,105,116,104,45,112, -97,114,97,109,101,116,101,114,105,122,97,116,105,111,110,148,2,30,97,43,10, -33,11,16,146,2,81,2,30,2,82,2,83,2,84,2,85,2,86,2,85,2, -87,2,30,2,88,2,31,2,89,158,2,90,2,91,2,92,2,65,2,93,2, -85,2,94,2,85,2,95,2,96,2,97,2,85,2,98,2,44,2,99,2,85, -2,100,2,85,2,101,2,31,2,102,2,30,2,13,2,29,2,14,2,31,2, -103,2,30,2,104,2,65,2,105,2,30,2,18,2,32,2,106,2,85,2,107, -2,30,2,108,2,30,2,22,2,33,2,109,2,85,2,110,2,65,2,111,2, -30,2,112,2,85,2,113,2,30,2,114,2,85,2,115,2,85,2,116,2,85, -2,117,2,30,2,16,2,31,2,118,2,85,2,119,2,120,2,121,2,85,2, -122,2,30,2,123,2,68,2,19,2,32,2,124,2,85,2,125,2,85,2,126, -2,85,2,127,2,85,2,21,2,29,2,9,2,30,2,128,2,120,2,129,2, -31,2,130,2,120,2,131,2,85,2,132,158,2,28,2,89,2,133,2,83,2, -134,2,85,2,135,2,85,2,136,2,120,2,137,2,31,2,138,2,30,2,11, -2,30,2,139,2,32,2,140,2,85,2,25,2,30,2,141,2,32,2,142,2, -96,2,143,2,30,2,7,2,29,2,144,2,31,2,145,2,83,2,146,2,30, -2,147,2,83,2,148,2,30,96,42,8,254,1,11,16,0,16,8,41,11,3, -1,4,103,53,52,51,149,3,1,4,103,53,52,52,150,3,1,4,103,53,52, -53,151,3,1,7,101,110,118,52,51,53,51,152,2,152,2,152,16,8,40,11, -2,35,2,37,2,38,3,1,7,101,110,118,52,51,53,52,153,2,153,2,153, -18,158,63,99,116,120,154,45,18,158,2,12,45,18,158,6,19,19,103,101,110, +16,43,18,16,2,95,66,115,114,99,116,97,103,70,34,93,8,252,76,11,95, +9,8,252,76,11,2,68,18,16,2,99,2,36,39,93,8,252,76,11,16,6, +38,11,61,114,71,63,115,114,99,72,3,1,7,101,110,118,52,52,50,48,73, +2,73,16,4,37,11,64,101,120,110,104,74,3,1,7,101,110,118,52,52,50, +49,75,16,4,36,11,63,101,115,99,76,3,1,7,101,110,118,52,52,50,50, +77,16,4,35,11,63,101,120,110,78,3,1,7,101,110,118,52,52,50,52,79, +95,9,8,252,76,11,2,68,18,99,64,100,101,115,116,80,45,97,44,10,32, +11,16,150,72,112,97,114,97,109,101,116,101,114,105,122,101,81,2,28,67,108, +111,97,100,47,99,100,82,66,35,37,109,105,115,99,83,69,103,117,97,114,100, +45,101,118,116,84,2,83,1,20,103,101,110,101,114,97,116,101,45,116,101,109, +112,111,114,97,114,105,101,115,85,70,35,37,119,105,116,104,45,115,116,120,86, +71,99,104,97,110,110,101,108,45,103,101,116,87,2,83,2,5,2,28,2,18, +2,31,73,119,105,116,104,45,104,97,110,100,108,101,114,115,88,2,28,1,30, +99,117,114,114,101,110,116,45,98,114,101,97,107,45,112,97,114,97,109,101,116, +101,114,105,122,97,116,105,111,110,89,2,28,74,35,37,109,111,100,117,108,101, +45,98,101,103,105,110,90,158,72,35,37,115,116,120,109,122,45,98,111,100,121, +91,1,28,109,122,115,99,104,101,109,101,45,105,110,45,115,116,120,45,109,111, +100,117,108,101,45,98,101,103,105,110,92,78,112,97,114,97,109,101,116,101,114, +105,122,101,45,98,114,101,97,107,93,2,28,74,119,105,116,104,45,104,97,110, +100,108,101,114,115,42,94,2,28,76,110,117,108,108,45,101,110,118,105,114,111, +110,109,101,110,116,95,2,83,1,23,105,110,116,101,114,97,99,116,105,111,110, +45,101,110,118,105,114,111,110,109,101,110,116,96,2,83,76,110,111,114,109,97, +108,45,99,97,115,101,45,112,97,116,104,97,2,83,71,99,104,97,110,110,101, +108,45,112,117,116,98,2,83,73,100,101,102,105,110,101,45,115,116,114,117,99, +116,99,74,35,37,100,101,102,105,110,101,45,101,116,45,97,108,100,65,112,111, +114,116,63,101,2,83,1,20,35,37,112,108,97,105,110,45,109,111,100,117,108, +101,45,98,101,103,105,110,102,158,2,30,2,90,79,112,97,116,104,45,114,101, +112,108,97,99,101,45,115,117,102,102,105,120,103,2,83,71,119,105,116,104,45, +115,121,110,116,97,120,104,2,86,65,102,111,114,99,101,105,2,28,2,17,2, +33,71,115,101,116,33,45,118,97,108,117,101,115,106,2,28,2,6,2,29,64, +119,104,101,110,107,2,100,70,108,101,116,45,115,116,114,117,99,116,108,2,28, +77,100,101,102,105,110,101,45,102,111,114,45,115,121,110,116,97,120,109,2,32, +66,117,110,108,101,115,115,110,2,100,69,102,108,117,105,100,45,108,101,116,111, +2,28,66,108,101,116,47,101,99,112,2,100,75,99,111,108,108,101,99,116,105, +111,110,45,112,97,116,104,113,2,83,75,108,101,116,114,101,99,45,115,121,110, +116,97,120,101,115,114,2,31,72,115,121,110,116,97,120,45,99,97,115,101,42, +115,2,65,1,32,99,97,108,108,45,119,105,116,104,45,98,114,101,97,107,45, +112,97,114,97,109,101,116,101,114,105,122,97,116,105,111,110,116,2,28,1,27, +112,97,116,104,45,108,105,115,116,45,115,116,114,105,110,103,45,62,112,97,116, +104,45,108,105,115,116,117,2,83,70,115,121,110,116,97,120,47,108,111,99,118, +2,65,76,98,101,103,105,110,45,102,111,114,45,115,121,110,116,97,120,119,2, +32,79,109,101,109,111,114,121,45,116,114,97,99,101,45,108,97,109,98,100,97, +120,2,83,2,4,2,2,72,108,101,116,45,115,121,110,116,97,120,101,115,121, +2,31,77,117,110,115,121,110,116,97,120,45,115,112,108,105,99,105,110,103,122, +67,35,37,113,113,115,116,120,123,71,105,100,101,110,116,105,102,105,101,114,63, +124,2,44,1,29,102,105,110,100,45,108,105,98,114,97,114,121,45,99,111,108, +108,101,99,116,105,111,110,45,112,97,116,104,115,125,2,83,2,7,2,29,1, +25,115,99,104,101,109,101,45,114,101,112,111,114,116,45,101,110,118,105,114,111, +110,109,101,110,116,126,2,83,72,115,121,110,116,97,120,45,114,117,108,101,115, +127,2,31,75,113,117,97,115,105,115,121,110,116,97,120,47,108,111,99,128,2, +123,66,108,101,116,47,99,99,129,2,28,2,21,2,29,2,10,2,2,1,25, +99,117,114,114,101,110,116,45,108,111,97,100,47,117,115,101,45,99,111,109,112, +105,108,101,100,130,2,83,68,117,110,115,121,110,116,97,120,131,2,123,1,20, +114,101,97,100,45,101,118,97,108,45,112,114,105,110,116,45,108,111,111,112,132, +2,83,71,113,117,97,115,105,115,121,110,116,97,120,133,2,123,2,25,2,32, +2,11,2,31,1,23,108,111,97,100,45,114,101,108,97,116,105,118,101,45,101, +120,116,101,110,115,105,111,110,134,2,83,64,116,105,109,101,135,2,28,1,20, +102,105,110,100,45,101,120,101,99,117,116,97,98,108,101,45,112,97,116,104,136, +2,83,2,13,2,32,68,112,114,111,109,105,115,101,63,137,2,28,73,108,111, +97,100,45,114,101,108,97,116,105,118,101,138,2,83,1,26,99,104,101,99,107, +45,100,117,112,108,105,99,97,116,101,45,105,100,101,110,116,105,102,105,101,114, +139,2,31,66,115,121,110,116,97,120,140,2,68,2,16,2,28,1,24,99,117, +114,114,101,110,116,45,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111, +110,141,2,28,75,99,104,97,110,110,101,108,45,116,114,121,45,103,101,116,142, +2,83,2,14,2,28,72,112,97,116,104,45,115,116,114,105,110,103,63,143,2, +83,77,108,111,97,100,47,117,115,101,45,99,111,109,112,105,108,101,100,144,2, +83,75,115,121,110,116,97,120,45,105,100,45,114,117,108,101,115,145,2,31,71, +114,97,116,105,111,110,97,108,105,122,101,146,2,83,71,115,121,110,116,97,120, +45,99,97,115,101,147,2,65,1,26,99,97,108,108,45,119,105,116,104,45,112, +97,114,97,109,101,116,101,114,105,122,97,116,105,111,110,148,2,28,97,43,10, +33,11,16,146,2,81,2,28,2,82,2,83,2,84,2,83,2,85,2,86,2, +87,2,83,2,5,2,28,2,18,2,31,2,88,2,28,2,89,2,28,2,90, +158,2,91,2,92,2,93,2,28,2,94,2,28,2,95,2,83,2,96,2,83, +2,97,2,83,2,98,2,83,2,99,2,100,2,101,2,83,2,102,158,2,30, +2,90,2,103,2,83,2,104,2,86,2,105,2,28,2,17,2,33,2,106,2, +28,2,6,2,29,2,107,2,100,2,108,2,28,2,109,2,32,2,110,2,100, +2,111,2,28,2,112,2,100,2,113,2,83,2,114,2,31,2,115,2,65,2, +116,2,28,2,117,2,83,2,118,2,65,2,119,2,32,2,120,2,83,2,121, +2,31,2,122,2,123,2,124,2,44,2,125,2,83,2,7,2,29,2,126,2, +83,2,127,2,31,2,128,2,123,2,129,2,28,2,21,2,29,2,130,2,83, +2,131,2,123,2,132,2,83,2,133,2,123,2,25,2,32,2,11,2,31,2, +134,2,83,2,135,2,28,2,136,2,83,2,13,2,32,2,137,2,28,2,138, +2,83,2,139,2,31,2,140,2,68,2,16,2,28,2,141,2,28,2,142,2, +83,2,14,2,28,2,143,2,83,2,144,2,83,2,145,2,31,2,146,2,83, +2,147,2,65,2,148,2,28,96,42,8,254,1,11,16,0,16,8,41,11,3, +1,4,103,53,53,53,149,3,1,4,103,53,53,54,150,3,1,4,103,53,53, +55,151,3,1,7,101,110,118,52,52,49,51,152,2,152,2,152,16,8,40,11, +2,35,2,37,2,38,3,1,7,101,110,118,52,52,49,52,153,2,153,2,153, +18,158,63,99,116,120,154,45,18,158,2,10,45,18,158,6,19,19,103,101,110, 101,114,97,116,101,95,116,101,109,112,95,110,97,109,101,115,45,18,158,9,45, 18,158,2,154,45,18,158,2,154,45,18,158,2,154,45,18,16,2,95,2,70, -46,93,8,252,36,11,95,9,8,252,36,11,2,68,18,16,2,99,2,36,51, -93,8,252,36,11,16,6,50,11,2,71,2,72,3,1,7,101,110,118,52,51, -57,54,155,2,155,16,4,49,11,2,74,3,1,7,101,110,118,52,51,57,55, -156,16,4,48,11,2,76,3,1,7,101,110,118,52,51,57,56,157,16,4,47, -11,2,78,3,1,7,101,110,118,52,52,48,48,158,95,9,8,252,36,11,2, -68,18,99,2,80,54,44,43,42,16,10,53,11,3,1,4,103,53,51,56,159, -3,1,4,103,53,51,57,160,3,1,4,103,53,52,48,161,3,1,4,103,53, -52,49,162,3,1,7,101,110,118,52,51,56,56,163,2,163,2,163,2,163,16, -10,52,11,2,39,2,35,2,37,2,38,3,1,7,101,110,118,52,51,56,57, +46,93,8,252,80,11,95,9,8,252,80,11,2,68,18,16,2,99,2,36,51, +93,8,252,80,11,16,6,50,11,2,71,2,72,3,1,7,101,110,118,52,52, +53,54,155,2,155,16,4,49,11,2,74,3,1,7,101,110,118,52,52,53,55, +156,16,4,48,11,2,76,3,1,7,101,110,118,52,52,53,56,157,16,4,47, +11,2,78,3,1,7,101,110,118,52,52,54,48,158,95,9,8,252,80,11,2, +68,18,99,2,80,54,44,43,42,16,10,53,11,3,1,4,103,53,53,48,159, +3,1,4,103,53,53,49,160,3,1,4,103,53,53,50,161,3,1,4,103,53, +53,51,162,3,1,7,101,110,118,52,52,52,56,163,2,163,2,163,2,163,16, +10,52,11,2,39,2,35,2,37,2,38,3,1,7,101,110,118,52,52,52,57, 164,2,164,2,164,2,164,18,158,2,154,54,18,158,2,8,54,18,158,2,154, -54,18,16,2,106,93,158,2,4,54,8,33,97,8,32,10,32,11,16,58,73, -115,121,110,116,97,120,45,99,97,115,101,42,42,165,29,166,11,11,2,123,2, -166,71,115,116,120,45,118,101,99,116,111,114,63,167,2,44,67,45,100,101,102, -105,110,101,168,2,83,2,49,2,44,74,115,116,120,45,118,101,99,116,111,114, -45,114,101,102,169,2,44,2,51,2,44,2,61,2,44,2,55,2,44,2,47, -2,44,71,115,116,120,45,114,111,116,97,116,101,42,170,2,44,2,13,2,29, -74,115,112,108,105,116,45,115,116,120,45,108,105,115,116,171,2,44,2,69,2, -166,2,7,2,29,2,98,2,44,2,133,2,83,69,115,116,120,45,110,117,108, -108,63,172,2,44,2,21,2,29,2,22,2,33,2,57,2,44,2,147,2,83, -2,63,2,44,2,145,2,83,2,82,2,83,2,53,2,44,74,45,100,101,102, -105,110,101,45,115,121,110,116,97,120,173,2,83,2,59,2,44,2,45,2,44, -97,8,31,10,33,11,16,70,75,115,121,110,116,97,120,45,109,97,112,112,105, -110,103,63,174,64,35,37,115,99,175,2,167,2,44,2,168,2,83,2,49,2, -44,2,169,2,44,74,103,101,116,45,109,97,116,99,104,45,118,97,114,115,176, -2,175,2,51,2,44,2,61,2,44,2,55,2,44,2,47,2,44,72,110,111, -45,101,108,108,105,112,115,101,115,63,177,2,175,2,170,2,44,2,13,2,29, -2,171,2,44,72,115,116,120,45,109,101,109,113,45,112,111,115,178,2,175,1, -21,115,121,110,116,97,120,45,109,97,112,112,105,110,103,45,118,97,108,118,97, -114,179,2,175,2,7,2,29,2,98,2,44,74,109,97,107,101,45,109,97,116, -99,104,38,101,110,118,180,2,175,2,133,2,83,1,20,115,121,110,116,97,120, -45,109,97,112,112,105,110,103,45,100,101,112,116,104,181,2,175,79,109,97,107, -101,45,115,121,110,116,97,120,45,109,97,112,112,105,110,103,182,2,175,2,172, -2,44,2,21,2,29,2,22,2,33,2,57,2,44,2,147,2,83,72,109,97, -107,101,45,112,101,120,112,97,110,100,183,2,175,2,63,2,44,2,145,2,83, -2,82,2,83,2,53,2,44,2,173,2,83,2,59,2,44,2,45,2,44,96, +54,18,16,2,106,93,158,2,4,54,8,33,97,8,32,10,32,11,16,58,2, +140,29,165,11,11,2,6,2,29,71,115,116,120,45,118,101,99,116,111,114,63, +166,2,44,2,7,2,29,2,49,2,44,2,63,2,44,2,17,2,33,2,51, +2,44,2,61,2,44,74,115,116,120,45,118,101,99,116,111,114,45,114,101,102, +167,2,44,2,47,2,44,67,45,100,101,102,105,110,101,168,2,100,71,115,116, +120,45,114,111,116,97,116,101,42,169,2,44,2,55,2,44,2,69,2,165,2, +107,2,100,74,115,112,108,105,116,45,115,116,120,45,108,105,115,116,170,2,44, +2,124,2,44,2,45,2,44,69,115,116,120,45,110,117,108,108,63,171,2,44, +2,21,2,29,2,99,2,100,2,57,2,44,2,110,2,100,2,112,2,100,73, +115,121,110,116,97,120,45,99,97,115,101,42,42,172,2,165,74,45,100,101,102, +105,110,101,45,115,121,110,116,97,120,173,2,100,2,53,2,44,2,59,2,44, +97,8,31,10,33,11,16,70,2,6,2,29,2,166,2,44,2,7,2,29,2, +49,2,44,2,63,2,44,2,17,2,33,2,51,2,44,2,61,2,44,2,167, +2,44,2,47,2,44,2,168,2,100,2,169,2,44,2,55,2,44,1,20,115, +121,110,116,97,120,45,109,97,112,112,105,110,103,45,100,101,112,116,104,174,64, +35,37,115,99,175,72,110,111,45,101,108,108,105,112,115,101,115,63,176,2,175, +2,107,2,100,2,170,2,44,2,124,2,44,2,45,2,44,2,171,2,44,75, +115,121,110,116,97,120,45,109,97,112,112,105,110,103,63,177,2,175,2,21,2, +29,2,99,2,100,2,57,2,44,2,110,2,100,74,103,101,116,45,109,97,116, +99,104,45,118,97,114,115,178,2,175,72,109,97,107,101,45,112,101,120,112,97, +110,100,179,2,175,2,112,2,100,1,21,115,121,110,116,97,120,45,109,97,112, +112,105,110,103,45,118,97,108,118,97,114,180,2,175,2,173,2,100,2,53,2, +44,74,109,97,107,101,45,109,97,116,99,104,38,101,110,118,181,2,175,2,59, +2,44,72,115,116,120,45,109,101,109,113,45,112,111,115,182,2,175,79,109,97, +107,101,45,115,121,110,116,97,120,45,109,97,112,112,105,110,103,183,2,175,96, 8,30,8,254,1,11,16,0,16,4,8,29,11,61,120,184,3,1,6,101,110, 118,51,56,48,185,16,4,8,28,11,68,104,101,114,101,45,115,116,120,186,3, 1,6,101,110,118,51,56,50,187,16,4,59,11,2,186,2,187,13,16,3,33, -2,166,2,68,93,8,252,36,11,16,6,58,11,2,71,2,72,2,155,2,155, +2,165,2,68,93,8,252,80,11,16,6,58,11,2,71,2,72,2,155,2,155, 16,4,57,11,2,74,2,156,16,4,56,11,2,76,2,157,16,4,55,11,64, -118,97,108,115,188,3,1,7,101,110,118,52,52,48,52,189,95,9,8,252,36, +118,97,108,115,188,3,1,7,101,110,118,52,52,54,52,189,95,9,8,252,80, 11,2,68,18,158,2,154,54,18,158,2,154,54,18,158,2,8,54,18,158,2, -154,54,18,158,2,154,54,18,158,2,154,54,18,158,2,23,54,18,158,2,154, +154,54,18,158,2,154,54,18,158,2,154,54,18,158,2,22,54,18,158,2,154, 54,18,158,2,154,54,18,158,2,8,54,18,158,9,54,18,158,2,154,54,18, -158,2,154,54,18,158,2,154,54,18,16,2,95,2,70,8,34,93,8,252,41, -11,95,9,8,252,41,11,2,68,18,16,2,99,2,36,8,39,93,8,252,41, -11,16,6,8,38,11,2,71,2,72,3,1,7,101,110,118,52,52,52,49,190, -2,190,16,4,8,37,11,2,74,3,1,7,101,110,118,52,52,52,50,191,16, -4,8,36,11,2,76,3,1,7,101,110,118,52,52,52,51,192,16,4,8,35, -11,2,78,3,1,7,101,110,118,52,52,52,53,193,95,9,8,252,41,11,2, -68,18,99,2,80,8,42,44,43,42,16,14,8,41,11,3,1,4,103,53,51, -49,194,3,1,4,103,53,51,50,195,3,1,4,103,53,51,51,196,3,1,4, -103,53,51,52,197,3,1,4,103,53,51,53,198,3,1,4,103,53,51,54,199, -3,1,7,101,110,118,52,52,51,49,200,2,200,2,200,2,200,2,200,2,200, +158,2,154,54,18,158,2,154,54,18,16,2,95,2,70,8,34,93,8,252,85, +11,95,9,8,252,85,11,2,68,18,16,2,99,2,36,8,39,93,8,252,85, +11,16,6,8,38,11,2,71,2,72,3,1,7,101,110,118,52,53,48,49,190, +2,190,16,4,8,37,11,2,74,3,1,7,101,110,118,52,53,48,50,191,16, +4,8,36,11,2,76,3,1,7,101,110,118,52,53,48,51,192,16,4,8,35, +11,2,78,3,1,7,101,110,118,52,53,48,53,193,95,9,8,252,85,11,2, +68,18,99,2,80,8,42,44,43,42,16,14,8,41,11,3,1,4,103,53,52, +51,194,3,1,4,103,53,52,52,195,3,1,4,103,53,52,53,196,3,1,4, +103,53,52,54,197,3,1,4,103,53,52,55,198,3,1,4,103,53,52,56,199, +3,1,7,101,110,118,52,52,57,49,200,2,200,2,200,2,200,2,200,2,200, 16,14,8,40,11,2,184,2,40,2,42,2,35,2,37,2,38,3,1,7,101, -110,118,52,52,51,50,201,2,201,2,201,2,201,2,201,2,201,18,158,2,154, -8,42,18,158,2,12,8,42,18,158,6,19,19,103,101,110,101,114,97,116,101, +110,118,52,52,57,50,201,2,201,2,201,2,201,2,201,2,201,18,158,2,154, +8,42,18,158,2,10,8,42,18,158,6,19,19,103,101,110,101,114,97,116,101, 95,116,101,109,112,95,110,97,109,101,115,8,42,18,158,2,154,8,42,18,158, 2,41,8,42,18,158,2,154,8,42,18,158,2,154,8,42,18,158,2,154,8, 42,18,158,2,154,8,42,11,93,83,159,32,93,80,158,32,32,91,159,33,10, @@ -4451,7 +4492,7 @@ EVAL_ONE_SIZED_STR((char *)expr, 6006); } { - static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,48,46,51,5,93,159,32,20,96,158,16,1,20,23,65,98, + static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,49,46,52,5,93,159,32,20,97,158,16,1,20,23,65,98, 101,103,105,110,0,16,0,83,160,40,80,158,32,32,32,18,158,94,96,67,114, 101,113,117,105,114,101,1,34,10,11,158,95,158,64,111,110,108,121,2,34,158, 68,109,122,115,99,104,101,109,101,3,34,158,1,22,110,97,109,101,115,112,97, @@ -4459,16 +4500,16 @@ EVAL_ONE_SIZED_STR((char *)expr, 103); } { - static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,48,46,51,3,73,159,33,20,96,158,16,1,20,23,65,98, + static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,49,46,52,3,73,159,33,20,97,158,16,1,20,23,65,98, 101,103,105,110,0,16,0,87,94,248,22,240,68,109,122,115,99,104,101,109,101, 1,83,160,40,80,158,32,32,33,18,158,94,96,78,114,101,113,117,105,114,101, 45,102,111,114,45,115,121,110,116,97,120,2,34,10,11,158,2,1,34,34,0}; EVAL_ONE_SIZED_STR((char *)expr, 83); } { - static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,48,46,51,2,66,159,36,20,96,158,16,0,16,0,248,22, + static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,5,51,48,49,46,52,2,66,159,36,20,97,158,16,0,16,0,248,22, 232,248,249,22,234,66,35,37,109,105,115,99,0,1,34,109,97,107,101,45,115, 116,97,110,100,97,114,100,45,109,111,100,117,108,101,45,110,97,109,101,45,114, -101,115,111,108,118,101,114,1,247,22,252,201,2,0}; +101,115,111,108,118,101,114,1,247,22,252,202,2,0}; EVAL_ONE_SIZED_STR((char *)expr, 76); } diff --git a/src/mzscheme/src/env.c b/src/mzscheme/src/env.c index 8c93a51f6f..5eee4a0653 100644 --- a/src/mzscheme/src/env.c +++ b/src/mzscheme/src/env.c @@ -314,6 +314,8 @@ Scheme_Env *scheme_basic_env() scheme_init_thread_memory(); #endif + scheme_init_getenv(); /* checks PLTNOJIT */ + scheme_make_thread(); #ifdef TIME_STARTUP_PROCESS @@ -342,7 +344,6 @@ Scheme_Env *scheme_basic_env() scheme_starting_up = 0; - scheme_init_getenv(); #ifdef TIME_STARTUP_PROCESS printf("done @ %ld\n#endif\n", scheme_get_process_milliseconds()); #endif @@ -2600,6 +2601,7 @@ Resolve_Prefix *scheme_resolve_prefix(int phase, Comp_Prefix *cp, int simplify) Resolve_Info *scheme_resolve_info_create(Resolve_Prefix *rp) { Resolve_Info *naya; + Scheme_Object *b; naya = MALLOC_ONE_RT(Resolve_Info); #ifdef MZTAG_REQUIRED @@ -2610,6 +2612,9 @@ Resolve_Info *scheme_resolve_info_create(Resolve_Prefix *rp) naya->next = NULL; naya->toplevel_pos = -1; + b = scheme_get_param(scheme_current_config(), MZCONFIG_USE_JIT); + naya->use_jit = SCHEME_TRUEP(b); + return naya; } @@ -2626,6 +2631,7 @@ Resolve_Info *scheme_resolve_info_extend(Resolve_Info *info, int size, int oldsi #endif naya->prefix = info->prefix; naya->next = info; + naya->use_jit = info->use_jit; naya->size = size; naya->oldsize = oldsize; naya->count = mapc; diff --git a/src/mzscheme/src/error.c b/src/mzscheme/src/error.c index 5366c2edfa..e9c90491f7 100644 --- a/src/mzscheme/src/error.c +++ b/src/mzscheme/src/error.c @@ -939,7 +939,7 @@ void scheme_wrong_count_m(const char *name, int minc, int maxc, p->tail_buffer = tb; } - /* minc = 1 -> name is really a case-lambda proc */ + /* minc = 1 -> name is really a case-lambda or native proc */ if (minc == -1) { /* Check for is_method in case-lambda */ @@ -954,6 +954,26 @@ void scheme_wrong_count_m(const char *name, int minc, int maxc, /* See note in schpriv.h about the IS_METHOD hack */ is_method = 1; } +#ifdef MZ_USE_JIT + } else if (SAME_TYPE(SCHEME_TYPE((Scheme_Object *)name), scheme_native_closure_type)) { + Scheme_Object *pa; + pa = scheme_get_native_arity((Scheme_Object *)name); + if (SCHEME_BOXP(pa)) { + pa = SCHEME_BOX_VAL(pa); + is_method = 1; + } + if (SCHEME_INTP(pa)) { + minc = SCHEME_INT_VAL(pa); + if (minc < 0) { + minc = (-minc) - 1; + maxc = -1; + } else + maxc = minc; + name = scheme_get_proc_name((Scheme_Object *)name, NULL, 1); + } else { + /* complex; use "no matching case" msg */ + } +#endif } } diff --git a/src/mzscheme/src/eval.c b/src/mzscheme/src/eval.c index 7af739feca..d5407c7034 100644 --- a/src/mzscheme/src/eval.c +++ b/src/mzscheme/src/eval.c @@ -127,6 +127,9 @@ volatile int scheme_fuel_counter; int scheme_stack_grows_up; +int scheme_startup_use_jit = 1; +void scheme_set_startup_use_jit(int v) { scheme_startup_use_jit = v; } + static Scheme_Object *app_symbol; static Scheme_Object *datum_symbol; static Scheme_Object *top_symbol; @@ -167,6 +170,7 @@ static Scheme_Object *expand_stx_to_top_form(int argc, Scheme_Object **argv); static Scheme_Object *top_introduce_stx(int argc, Scheme_Object **argv); static Scheme_Object *allow_set_undefined(int argc, Scheme_Object **argv); +static Scheme_Object *use_jit(int argc, Scheme_Object **argv); static Scheme_Object *app_syntax(Scheme_Object *form, Scheme_Comp_Env *env, Scheme_Compile_Info *rec, int drec); static Scheme_Object *app_expand(Scheme_Object *form, Scheme_Comp_Env *env, Scheme_Expand_Info *erec, int drec); @@ -429,6 +433,12 @@ scheme_init_eval (Scheme_Env *env) MZCONFIG_ALLOW_SET_UNDEFINED), env); + scheme_add_global_constant("eval-jit-enabled", + scheme_register_parameter(use_jit, + "eval-jit-enabled", + MZCONFIG_USE_JIT), + env); + REGISTER_SO(app_symbol); REGISTER_SO(datum_symbol); REGISTER_SO(top_symbol); @@ -613,6 +623,7 @@ void *scheme_enlarge_runstack(long size, void *(*k)()) Scheme_Thread *p = scheme_current_thread; Scheme_Saved_Stack *saved; void *v; + int cont_count; saved = MALLOC_ONE_RT(Scheme_Saved_Stack); @@ -629,16 +640,31 @@ void *scheme_enlarge_runstack(long size, void *(*k)()) size = SCHEME_STACK_SIZE; p->runstack_saved = saved; + if (p->spare_runstack && (size <= p->spare_runstack_size)) { + size = p->spare_runstack_size; + MZ_RUNSTACK_START = p->spare_runstack; + p->spare_runstack = NULL; + } else { + MZ_RUNSTACK_START = scheme_malloc_allow_interior(sizeof(Scheme_Object*) * size); + } p->runstack_size = size; - MZ_RUNSTACK_START = scheme_malloc_allow_interior(sizeof(Scheme_Object*) * size); MZ_RUNSTACK = MZ_RUNSTACK_START + size; + cont_count = scheme_cont_capture_count; + v = k(); /* If `k' escapes, the escape handler will restore the stack pointers. */ p = scheme_current_thread; /* might have changed! */ + if (cont_count == scheme_cont_capture_count) { + if (!p->spare_runstack || (p->runstack_size > p->spare_runstack_size)) { + p->spare_runstack = MZ_RUNSTACK_START; + p->spare_runstack_size = p->runstack_size; + } + } + p->runstack_saved = saved->prev; MZ_RUNSTACK = saved->runstack; MZ_RUNSTACK_START = saved->runstack_start; @@ -1343,10 +1369,34 @@ static Scheme_Object *link_toplevel(Scheme_Object *expr, Scheme_Env *env, } } +static Scheme_Object *resolve_k() +{ + Scheme_Thread *p = scheme_current_thread; + Scheme_Object *expr = (Scheme_Object *)p->ku.k.p1; + Resolve_Info *info = (Resolve_Info *)p->ku.k.p2; + + p->ku.k.p1 = NULL; + p->ku.k.p2 = NULL; + + return scheme_resolve_expr(expr, info); +} + Scheme_Object *scheme_resolve_expr(Scheme_Object *expr, Resolve_Info *info) { Scheme_Type type = SCHEME_TYPE(expr); +#ifdef DO_STACK_CHECK +# include "mzstkchk.h" + { + Scheme_Thread *p = scheme_current_thread; + + p->ku.k.p1 = (void *)expr; + p->ku.k.p2 = (void *)info; + + return scheme_handle_stack_overflow(resolve_k); + } +#endif + switch (type) { case scheme_local_type: { @@ -1429,6 +1479,326 @@ Scheme_Object *scheme_resolve_list(Scheme_Object *expr, Resolve_Info *info) return first; } +/*========================================================================*/ +/* JIT */ +/*========================================================================*/ + +#ifdef MZ_USE_JIT + +static Scheme_Object *jit_application(Scheme_Object *o) +{ + Scheme_Object *orig, *naya = NULL; + Scheme_App_Rec *app, *app2; + int i, n, size; + + app = (Scheme_App_Rec *)o; + n = app->num_args + 1; + + for (i = 0; i < n; i++) { + orig = app->args[i]; + naya = scheme_jit_expr(orig); + if (!SAME_OBJ(orig, naya)) + break; + } + + if (i >= n) + return o; + + size = (sizeof(Scheme_App_Rec) + + ((n - 1) * sizeof(Scheme_Object *)) + + n * sizeof(char)); + app2 = (Scheme_App_Rec *)scheme_malloc_tagged(size); + memcpy(app2, app, size); + app2->args[i] = naya; + + for (i++; i < n; i++) { + orig = app2->args[i]; + naya = scheme_jit_expr(orig); + app2->args[i] = naya; + } + + return (Scheme_Object *)app2; +} + +static Scheme_Object *jit_application2(Scheme_Object *o) +{ + Scheme_App2_Rec *app; + Scheme_Object *nrator, *nrand; + + app = (Scheme_App2_Rec *)o; + + nrator = scheme_jit_expr(app->rator); + nrand = scheme_jit_expr(app->rand); + + if (SAME_OBJ(nrator, app->rator) + && SAME_OBJ(nrand, app->rand)) + return o; + + app = MALLOC_ONE_TAGGED(Scheme_App2_Rec); + memcpy(app, o, sizeof(Scheme_App2_Rec)); + app->rator = nrator; + app->rand = nrand; + + return (Scheme_Object *)app; +} + +static Scheme_Object *jit_application3(Scheme_Object *o) +{ + Scheme_App3_Rec *app; + Scheme_Object *nrator, *nrand1, *nrand2; + + app = (Scheme_App3_Rec *)o; + + nrator = scheme_jit_expr(app->rator); + nrand1 = scheme_jit_expr(app->rand1); + nrand2 = scheme_jit_expr(app->rand2); + + if (SAME_OBJ(nrator, app->rator) + && SAME_OBJ(nrand1, app->rand1) + && SAME_OBJ(nrand2, app->rand2)) + return o; + + app = MALLOC_ONE_TAGGED(Scheme_App3_Rec); + memcpy(app, o, sizeof(Scheme_App3_Rec)); + app->rator = nrator; + app->rand1 = nrand1; + app->rand2 = nrand2; + + return (Scheme_Object *)app; +} + +static Scheme_Object *jit_sequence(Scheme_Object *o) +{ + Scheme_Object *orig, *naya = NULL; + Scheme_Sequence *seq, *seq2; + int i, n, size; + + seq = (Scheme_Sequence *)o; + n = seq->count; + + for (i = 0; i < n; i++) { + orig = seq->array[i]; + naya = scheme_jit_expr(orig); + if (!SAME_OBJ(orig, naya)) + break; + } + + if (i >= n) + return o; + + size = (sizeof(Scheme_Sequence) + + ((n - 1) * sizeof(Scheme_Object *))); + seq2 = (Scheme_Sequence *)scheme_malloc_tagged(size); + memcpy(seq2, seq, size); + seq2->array[i] = naya; + + for (i++; i < n; i++) { + orig = seq2->array[i]; + naya = scheme_jit_expr(orig); + seq2->array[i] = naya; + } + + return (Scheme_Object *)seq2; +} + +static Scheme_Object *jit_branch(Scheme_Object *o) +{ + Scheme_Branch_Rec *b; + Scheme_Object *t, *tb, *fb; + + b = (Scheme_Branch_Rec *)o; + + t = scheme_jit_expr(b->test); + tb = scheme_jit_expr(b->tbranch); + fb = scheme_jit_expr(b->fbranch); + + if (SAME_OBJ(t, b->test) + && SAME_OBJ(tb, b->tbranch) + && SAME_OBJ(fb, b->fbranch)) + return o; + + b = MALLOC_ONE_TAGGED(Scheme_Branch_Rec); + memcpy(b, o, sizeof(Scheme_Branch_Rec)); + b->test = t; + b->tbranch = tb; + b->fbranch = fb; + + return (Scheme_Object *)b; +} + +static Scheme_Object *jit_let_value(Scheme_Object *o) +{ + Scheme_Let_Value *lv = (Scheme_Let_Value *)o; + Scheme_Object *body, *rhs; + + rhs = scheme_jit_expr(lv->value); + body = scheme_jit_expr(lv->body); + + if (SAME_OBJ(rhs, lv->value) + && SAME_OBJ(body, lv->body)) + return o; + + lv = MALLOC_ONE_TAGGED(Scheme_Let_Value); + memcpy(lv, o, sizeof(Scheme_Let_Value)); + lv->value = rhs; + lv->body = body; + + return (Scheme_Object *)lv; +} + +static Scheme_Object *jit_let_one(Scheme_Object *o) +{ + Scheme_Let_One *lo = (Scheme_Let_One *)o; + Scheme_Object *body, *rhs; + + rhs = scheme_jit_expr(lo->value); + body = scheme_jit_expr(lo->body); + + if (SAME_OBJ(rhs, lo->value) + && SAME_OBJ(body, lo->body)) + return o; + + lo = MALLOC_ONE_TAGGED(Scheme_Let_One); + memcpy(lo, o, sizeof(Scheme_Let_One)); + lo->value = rhs; + lo->body = body; + + return (Scheme_Object *)lo; +} + +static Scheme_Object *jit_let_void(Scheme_Object *o) +{ + Scheme_Let_Void *lv = (Scheme_Let_Void *)o; + Scheme_Object *body; + + body = scheme_jit_expr(lv->body); + + if (SAME_OBJ(body, lv->body)) + return o; + + lv = MALLOC_ONE_TAGGED(Scheme_Let_Void); + memcpy(lv, o, sizeof(Scheme_Let_Void)); + lv->body = body; + + return (Scheme_Object *)lv; +} + +static Scheme_Object *jit_letrec(Scheme_Object *o) +{ + Scheme_Letrec *lr = (Scheme_Letrec *)o, *lr2; + Scheme_Object **procs, **procs2, *v; + int i, count; + + count = lr->count; + + lr2 = MALLOC_ONE_TAGGED(Scheme_Letrec); + memcpy(lr2, lr, sizeof(Scheme_Letrec)); + + procs = lr->procs; + procs2 = MALLOC_N(Scheme_Object *, count); + lr2->procs = procs2; + + for (i = 0; i < count; i++) { + v = scheme_jit_expr(procs[i]); + procs2[i] = v; + } + + v = scheme_jit_expr(lr->body); + lr2->body = v; + + return (Scheme_Object *)lr2; +} + +static Scheme_Object *jit_wcm(Scheme_Object *o) +{ + Scheme_With_Continuation_Mark *wcm = (Scheme_With_Continuation_Mark *)o; + Scheme_Object *k, *v, *b; + + k = scheme_jit_expr(wcm->key); + v = scheme_jit_expr(wcm->val); + b = scheme_jit_expr(wcm->body); + if (SAME_OBJ(wcm->key, k) + && SAME_OBJ(wcm->val, v) + && SAME_OBJ(wcm->body, b)) + return o; + + wcm = MALLOC_ONE_TAGGED(Scheme_With_Continuation_Mark); + memcpy(wcm, o, sizeof(Scheme_With_Continuation_Mark)); + + wcm->key = k; + wcm->val = v; + wcm->body = b; + + return (Scheme_Object *)wcm; +} + +Scheme_Object *scheme_jit_expr(Scheme_Object *expr) +{ + Scheme_Type type = SCHEME_TYPE(expr); + + switch (type) { + case scheme_syntax_type: + { + Scheme_Syntax_Jitter f; + Scheme_Object *orig, *naya; + + f = scheme_syntax_jitters[SCHEME_PINT_VAL(expr)]; + orig = SCHEME_IPTR_VAL(expr); + naya = f(orig); + if (SAME_OBJ(orig, naya)) + return expr; + + return scheme_make_syntax_resolved(SCHEME_PINT_VAL(expr), naya); + } + case scheme_application_type: + return jit_application(expr); + case scheme_application2_type: + return jit_application2(expr); + case scheme_application3_type: + return jit_application3(expr); + case scheme_sequence_type: + return jit_sequence(expr); + case scheme_branch_type: + return jit_branch(expr); + case scheme_with_cont_mark_type: + return jit_wcm(expr); + case scheme_unclosed_procedure_type: + return scheme_jit_closure(expr); + case scheme_let_value_type: + return jit_let_value(expr); + case scheme_let_void_type: + return jit_let_void(expr); + case scheme_letrec_type: + return jit_letrec(expr); + case scheme_let_one_type: + return jit_let_one(expr); + case scheme_closure_type: + { + Scheme_Closure *c = (Scheme_Closure *)expr; + if (ZERO_SIZED_CLOSUREP(c)) { + /* JIT the closure body, producing a native closure: */ + return scheme_jit_closure((Scheme_Object *)c->code); + } else + return expr; + } + case scheme_case_closure_type: + { + return scheme_unclose_case_lambda(expr, 1); + } + default: + return expr; + } +} + +#else + +Scheme_Object *scheme_jit_expr(Scheme_Object *expr) +{ + return expr; +} + +#endif + /*========================================================================*/ /* compilation info management */ /*========================================================================*/ @@ -1694,7 +2064,6 @@ static void *compile_k(void) } } - tl_queue = scheme_null; insp = scheme_get_param(scheme_current_config(), MZCONFIG_CODE_INSPECTOR); @@ -1745,7 +2114,7 @@ static void *compile_k(void) o = call_compile_handler(form, 1); top = (Scheme_Compilation_Top *)o; } else { - /* We want to simply compile form, but we have to loop in case + /* We want to simply compile `form', but we have to loop in case an expression is lifted in the process of compiling: */ int max_let_depth = 0; Scheme_Object *l, *prev_o = NULL; @@ -3269,6 +3638,38 @@ Scheme_Object *_scheme_apply_closed_prim(Scheme_Object *rator, #include "schapp.inc" } + +#ifdef MZ_USE_JIT +Scheme_Object *_scheme_apply_from_native(Scheme_Object *rator, + int argc, + Scheme_Object **argv) +{ +#define PRIM_CHECK_VALUE 1 +#define PRIM_CHECK_MULTI 1 +#include "schnapp.inc" +} + +Scheme_Object *_scheme_apply_multi_from_native(Scheme_Object *rator, + int argc, + Scheme_Object **argv) +{ +#define PRIM_CHECK_VALUE 1 +#define PRIM_CHECK_MULTI 0 +#include "schnapp.inc" +} + +Scheme_Object *_scheme_tail_apply_from_native(Scheme_Object *rator, + int argc, + Scheme_Object **argv) +{ + /* It's ok to call primitive and closed primitives directly, + since they implement further tail by trampolining. */ +#define PRIM_CHECK_VALUE 0 +#define PRIM_CHECK_MULTI 0 +#include "schnapp.inc" +} +#endif + Scheme_Object *scheme_check_one_value(Scheme_Object *v) { if (v == SCHEME_MULTIPLE_VALUES) @@ -3446,23 +3847,26 @@ scheme_do_eval(Scheme_Object *obj, int num_rands, Scheme_Object **rands, if (type == scheme_prim_type) { GC_CAN_IGNORE Scheme_Primitive_Proc *prim; - if (rands == p->tail_buffer) { - if (num_rands < TAIL_COPY_THRESHOLD) { - int i; - Scheme_Object **quick_rands; +#define VACATE_TAIL_BUFFER_USE_RUNSTACK() \ + if (rands == p->tail_buffer) { \ + if (num_rands < TAIL_COPY_THRESHOLD) { \ + int i; \ + Scheme_Object **quick_rands; \ + \ + quick_rands = PUSH_RUNSTACK(p, RUNSTACK, num_rands); \ + RUNSTACK_CHANGED(); \ + \ + for (i = num_rands; i--; ) { \ + quick_rands[i] = rands[i]; \ + } \ + rands = quick_rands; \ + } else { \ + UPDATE_THREAD_RSPTR_FOR_GC(); \ + make_tail_buffer_safe(); \ + } \ + } - quick_rands = PUSH_RUNSTACK(p, RUNSTACK, num_rands); - RUNSTACK_CHANGED(); - - for (i = num_rands; i--; ) { - quick_rands[i] = rands[i]; - } - rands = quick_rands; - } else { - UPDATE_THREAD_RSPTR_FOR_GC(); - make_tail_buffer_safe(); - } - } + VACATE_TAIL_BUFFER_USE_RUNSTACK(); UPDATE_THREAD_RSPTR(); @@ -3485,7 +3889,7 @@ scheme_do_eval(Scheme_Object *obj, int num_rands, Scheme_Object **rands, int i, has_rest, num_params; DO_CHECK_FOR_BREAK(p, UPDATE_THREAD_RSPTR_FOR_GC(); if (rands == p->tail_buffer) make_tail_buffer_safe();); - + data = SCHEME_COMPILED_CLOS_CODE(obj); if ((RUNSTACK - RUNSTACK_START) < data->max_let_depth) { @@ -3600,7 +4004,7 @@ scheme_do_eval(Scheme_Object *obj, int num_rands, Scheme_Object **rands, } else { if (num_rands) { if (has_rest) { - /* 0 params and hash_rest => (lambda args E) where args is not in E, + /* 0 params and has_rest => (lambda args E) where args is not in E, so accept any number of arguments and ignore them. */ } else { @@ -3665,24 +4069,8 @@ scheme_do_eval(Scheme_Object *obj, int num_rands, Scheme_Object **rands, GC_CAN_IGNORE Scheme_Closed_Primitive_Proc *prim; DO_CHECK_FOR_BREAK(p, UPDATE_THREAD_RSPTR_FOR_GC(); if (rands == p->tail_buffer) make_tail_buffer_safe();); - - if (rands == p->tail_buffer) { - if (num_rands < TAIL_COPY_THRESHOLD) { - int i; - Scheme_Object **quick_rands; - quick_rands = PUSH_RUNSTACK(p, RUNSTACK, num_rands); - RUNSTACK_CHANGED(); - - for (i = num_rands; i--; ) { - quick_rands[i] = rands[i]; - } - rands = quick_rands; - } else { - UPDATE_THREAD_RSPTR_FOR_GC(); - make_tail_buffer_safe(); - } - } + VACATE_TAIL_BUFFER_USE_RUNSTACK(); UPDATE_THREAD_RSPTR(); @@ -3722,6 +4110,42 @@ scheme_do_eval(Scheme_Object *obj, int num_rands, Scheme_Object **rands, scheme_wrong_count((char *)seq, -1, -1, num_rands, rands); return NULL; /* Doesn't get here. */ +#ifdef MZ_USE_JIT + } else if (type == scheme_native_closure_type) { + GC_CAN_IGNORE Scheme_Native_Closure_Data *data; + + VACATE_TAIL_BUFFER_USE_RUNSTACK(); + + UPDATE_THREAD_RSPTR(); + + DO_CHECK_FOR_BREAK(p, ); + + if (!scheme_native_arity_check(obj, num_rands)) { + scheme_wrong_count_m((const char *)obj, -1, -1, + num_rands, rands, 0); + return NULL; + } + + data = ((Scheme_Native_Closure *)obj)->code; + + /* Enlarge the runstack? This max_let_depth is in bytes instead of words. */ + if (data->max_let_depth > ((unsigned long)RUNSTACK - (unsigned long)RUNSTACK_START)) { + p->ku.k.p1 = (void *)obj; + p->ku.k.i1 = num_rands; + p->ku.k.p2 = (void *)rands; + p->ku.k.i2 = -1; + + MZ_CONT_MARK_POS -= 2; + v = (Scheme_Object *)scheme_enlarge_runstack(data->max_let_depth / sizeof(void *), + (void *(*)(void))do_eval_k); + MZ_CONT_MARK_POS += 2; + goto returnv; + } + + v = data->code(obj, num_rands, rands); + + DEBUG_CHECK_TYPE(v); +#endif } else if (type == scheme_cont_type) { Scheme_Cont *c; Scheme_Dynamic_Wind *dw, *common; @@ -3771,7 +4195,7 @@ scheme_do_eval(Scheme_Object *obj, int num_rands, Scheme_Object **rands, } c->common = common; - /* For dynamaic-winds after `common' in this + /* For dynamic-winds after `common' in this continuation, execute the post-thunks */ for (dw = p->dw; dw != common; dw = dw->prev) { if (dw->post) { @@ -3827,6 +4251,7 @@ scheme_do_eval(Scheme_Object *obj, int num_rands, Scheme_Object **rands, p->cjs.u.val = value; p->cjs.jumping_to_continuation = (Scheme_Escaping_Cont *)obj; scheme_longjmp(MZTHREADELEM(p, error_buf), 1); + return NULL; } else if (type == scheme_proc_struct_type) { int is_method; @@ -4298,18 +4723,28 @@ scheme_do_eval(Scheme_Object *obj, int num_rands, Scheme_Object **rands, /* Close them: */ i = l->count; while (i--) { - GC_CAN_IGNORE Scheme_Closure *closure; - GC_CAN_IGNORE Scheme_Closure_Data *data; + GC_CAN_IGNORE Scheme_Object *clos; GC_CAN_IGNORE Scheme_Object **dest; GC_CAN_IGNORE mzshort *map; + GC_CAN_IGNORE Scheme_Closure_Data *data; int j; - closure = (Scheme_Closure *)stack[i]; - data = (Scheme_Closure_Data *)a[i]; + clos = stack[i]; +#ifdef MZ_USE_JIT + if (SAME_TYPE(_SCHEME_TYPE(clos), scheme_closure_type)) { + dest = ((Scheme_Closure *)clos)->vals; + } else { + dest = ((Scheme_Native_Closure *)clos)->vals; + } +#else + dest = ((Scheme_Closure *)clos)->vals; +#endif + + data = (Scheme_Closure_Data *)a[i]; + map = data->closure_map; j = data->closure_size; - dest = closure->vals; /* Beware - dest points to the middle of a block */ @@ -4446,7 +4881,7 @@ static void *eval_k(void) Scheme_Thread *p = scheme_current_thread; Scheme_Object *v, **save_runstack; Scheme_Env *env; - int isexpr, multi; + int isexpr, multi, use_jit; v = (Scheme_Object *)p->ku.k.p1; env = (Scheme_Env *)p->ku.k.p2; @@ -4455,7 +4890,15 @@ static void *eval_k(void) multi = p->ku.k.i1; isexpr = p->ku.k.i2; + { + Scheme_Object *b; + b = scheme_get_param(scheme_current_config(), MZCONFIG_USE_JIT); + use_jit = SCHEME_TRUEP(b); + } + if (isexpr) { + if (use_jit) + v = scheme_jit_expr(v); if (multi) v = _scheme_eval_linked_expr_multi_wp(v, p); else @@ -4475,6 +4918,9 @@ static void *eval_k(void) v = top->code; + if (use_jit) + v = scheme_jit_expr(v); + save_runstack = scheme_push_prefix(env, top->prefix, NULL, NULL, 0, env->phase); if (multi) @@ -5145,6 +5591,14 @@ static Scheme_Object *allow_set_undefined(int argc, Scheme_Object **argv) -1, NULL, NULL, 1); } +static Scheme_Object *use_jit(int argc, Scheme_Object **argv) +{ + return scheme_param_config("eval-jit-enabled", + scheme_make_integer(MZCONFIG_USE_JIT), + argc, argv, + -1, NULL, NULL, 1); +} + static Scheme_Object * enable_break(int argc, Scheme_Object *argv[]) { diff --git a/src/mzscheme/src/fun.c b/src/mzscheme/src/fun.c index 241f035ac0..a4b872bcbf 100644 --- a/src/mzscheme/src/fun.c +++ b/src/mzscheme/src/fun.c @@ -123,8 +123,6 @@ Scheme_Object *scheme_values(int argc, Scheme_Object *argv[]); static Scheme_Object *current_print(int argc, Scheme_Object **argv); static Scheme_Object *current_prompt_read(int, Scheme_Object **); -static Scheme_Object *get_or_check_arity(Scheme_Object *p, long a); - static Scheme_Object *write_compiled_closure(Scheme_Object *obj); static Scheme_Object *read_compiled_closure(Scheme_Object *obj); @@ -431,7 +429,7 @@ Scheme_Object * scheme_make_prim_w_everything(Scheme_Prim *fun, int eternal, const char *name, mzshort mina, mzshort maxa, - short folding, + int flags, mzshort minr, mzshort maxr) { Scheme_Primitive_Proc *prim; @@ -449,7 +447,7 @@ scheme_make_prim_w_everything(Scheme_Prim *fun, int eternal, prim->name = name; prim->mina = mina; prim->maxa = maxa; - prim->pp.flags = ((folding ? SCHEME_PRIM_IS_FOLDING : 0) + prim->pp.flags = (flags | (scheme_defining_primitives ? SCHEME_PRIM_IS_PRIMITIVE : 0) | (hasr ? SCHEME_PRIM_IS_MULTI_RESULT : 0)); @@ -485,7 +483,22 @@ scheme_make_folding_prim(Scheme_Prim *fun, const char *name, short folding) { return scheme_make_prim_w_everything(fun, 1, name, mina, maxa, - folding, 1, 1); + (folding + ? (SCHEME_PRIM_IS_FOLDING + | SCHEME_PRIM_IS_NONCM) + : 0), + 1, 1); +} + +Scheme_Object * +scheme_make_noncm_prim(Scheme_Prim *fun, const char *name, + mzshort mina, mzshort maxa) +{ + /* A non-cm primitive leaves the mark stack unchanged when it returns, + and it can't return multiple values. */ + return scheme_make_prim_w_everything(fun, 1, name, mina, maxa, + SCHEME_PRIM_IS_NONCM, + 1, 1); } Scheme_Object * @@ -577,11 +590,34 @@ scheme_make_closure(Scheme_Thread *p, Scheme_Object *code, int close) { Scheme_Closure_Data *data; Scheme_Closure *closure; - Scheme_Object **runstack, **dest; - mzshort *map; + GC_CAN_IGNORE Scheme_Object **runstack; + GC_CAN_IGNORE Scheme_Object **dest; + GC_CAN_IGNORE mzshort *map; int i; data = (Scheme_Closure_Data *)code; + +#ifdef MZ_USE_JIT + if (data->native_code) { + Scheme_Object *nc; + + nc = scheme_make_native_closure(data->native_code); + + if (close) { + runstack = MZ_RUNSTACK; + dest = ((Scheme_Native_Closure *)nc)->vals; + map = data->closure_map; + i = data->closure_size; + + /* Copy data into the closure: */ + while (i--) { + dest[i] = runstack[map[i]]; + } + } + + return nc; + } +#endif i = data->closure_size; @@ -613,6 +649,32 @@ scheme_make_closure(Scheme_Thread *p, Scheme_Object *code, int close) return (Scheme_Object *)closure; } +Scheme_Object *scheme_jit_closure(Scheme_Object *code) +{ + Scheme_Closure_Data *data = (Scheme_Closure_Data *)code; + +#ifdef MZ_USE_JIT + if (!data->native_code) { + Scheme_Native_Closure_Data *ndata; + + data = MALLOC_ONE_TAGGED(Scheme_Closure_Data); + memcpy(data, code, sizeof(Scheme_Closure_Data)); + + ndata = scheme_generate_lambda(data, 1, NULL); + data->native_code = ndata; + + /* If it's zero-sized, then create closure now */ + if (!data->closure_size) { + return scheme_make_native_closure(ndata); + } + + return (Scheme_Object *)data; + } +#endif + + return code; +} + /* Closure_Info is used to store extra closure information before a closure mapping is resolved. */ typedef struct { @@ -722,9 +784,9 @@ scheme_resolve_closure_compilation(Scheme_Object *_data, Resolve_Info *info) if (SCHEME_TYPE(data->code) > _scheme_compiled_values_types_) SCHEME_CLOSURE_DATA_FLAGS(data) |= CLOS_FOLDABLE; + /* If the closure is empty, create the closure now */ if (!data->closure_size) - /* If the closure is empty, go ahead and finalize closure */ - return scheme_make_closure(NULL, (Scheme_Object *)data, 0); + return scheme_make_closure(NULL, (Scheme_Object *)data, 1); else return (Scheme_Object *)data; } @@ -1204,16 +1266,15 @@ void scheme_clear_cc_ok() /* procedure application evaluation */ /*========================================================================*/ -Scheme_Object * -scheme_force_value(Scheme_Object *obj) - /* Called where _scheme_apply() or _scheme_value() might return a - a tail-call-waiting trampoline token. */ +static Scheme_Object * +force_values(Scheme_Object *obj, int multi_ok) + /* Called where _scheme_apply() or _scheme_value() might return a + a tail-call-waiting trampoline token. */ { if (SAME_OBJ(obj, SCHEME_TAIL_CALL_WAITING)) { Scheme_Thread *p = scheme_current_thread; - Scheme_Object *v; - /* Watch out for use for use of tail buffer: */ + /* Watch out for use of tail buffer: */ if (p->ku.apply.tail_rands == p->tail_buffer) { GC_CAN_IGNORE Scheme_Object **tb; p->tail_buffer = NULL; /* so args aren't zeroed */ @@ -1221,19 +1282,38 @@ scheme_force_value(Scheme_Object *obj) p->tail_buffer = tb; } - v = _scheme_apply_multi(p->ku.apply.tail_rator, - p->ku.apply.tail_num_rands, - p->ku.apply.tail_rands); - return v; + if (multi_ok) + return _scheme_apply_multi(p->ku.apply.tail_rator, + p->ku.apply.tail_num_rands, + p->ku.apply.tail_rands); + else + return _scheme_apply(p->ku.apply.tail_rator, + p->ku.apply.tail_num_rands, + p->ku.apply.tail_rands); } else if (SAME_OBJ(obj, SCHEME_EVAL_WAITING)) { Scheme_Thread *p = scheme_current_thread; - return _scheme_eval_linked_expr_multi(p->ku.eval.wait_expr); + if (multi_ok) + return _scheme_eval_linked_expr_multi(p->ku.eval.wait_expr); + else + return _scheme_eval_linked_expr(p->ku.eval.wait_expr); } else if (obj) return obj; else return scheme_void; } +Scheme_Object * +scheme_force_value(Scheme_Object *obj) +{ + return force_values(obj, 1); +} + +Scheme_Object * +scheme_force_one_value(Scheme_Object *obj) +{ + return force_values(obj, 0); +} + static void *apply_k(void) { Scheme_Thread *p = scheme_current_thread; @@ -1590,7 +1670,7 @@ Scheme_Object *scheme_make_arity(mzshort mina, mzshort maxa) } } -static Scheme_Object *get_or_check_arity(Scheme_Object *p, long a) +Scheme_Object *scheme_get_or_check_arity(Scheme_Object *p, long a) /* a == -1 => get arity a == -2 => check for allowing varargs */ { @@ -1724,6 +1804,103 @@ static Scheme_Object *get_or_check_arity(Scheme_Object *p, long a) drop++; SCHEME_USE_FUEL(1); goto top; +#ifdef MZ_USE_JIT + } else if (type == scheme_native_closure_type) { + if (a < 0) { + Scheme_Object *pa; + + pa = scheme_get_native_arity(p); + + if (SCHEME_BOXP(pa)) { + /* Is a method; pa already corrects for it */ + pa = SCHEME_BOX_VAL(pa); + } + + if (SCHEME_STRUCTP(pa)) { + /* This happens when a non-case-lambda is not yet JITted. + It's an arity-at-least record. Convert it to the + negative-int encoding. */ + int v; + pa = ((Scheme_Structure *)pa)->slots[0]; + v = -(SCHEME_INT_VAL(pa) + 1); + pa = scheme_make_integer(v); + } + + if (SCHEME_INTP(pa)) { + mina = SCHEME_INT_VAL(pa); + if (mina < 0) { + if (a == -2) { + /* Yes, varargs */ + return scheme_true; + } + mina = (-mina) - 1; + maxa = -1; + } else { + if (a == -2) { + /* No varargs */ + return scheme_false; + } + maxa = mina; + } + } else { + if (a == -2) { + /* Check for varargs */ + Scheme_Object *a; + while (!SCHEME_NULLP(pa)) { + a = SCHEME_CAR(pa); + if (SCHEME_STRUCTP(a)) + return scheme_true; + pa = SCHEME_CDR(pa); + } + return scheme_false; + } else { + if (drop) { + /* Need to adjust elements (e.g., because this + procedure is a struct's apply handler) */ + Scheme_Object *first = scheme_null, *last = NULL, *a; + int v; + while (SCHEME_PAIRP(pa)) { + a = SCHEME_CAR(pa); + if (SCHEME_INTP(a)) { + v = SCHEME_INT_VAL(a); + if (v < drop) + a = NULL; + else { + v -= drop; + a = scheme_make_integer(v); + } + } else { + /* arity-at-least */ + a = ((Scheme_Structure *)a)->slots[0]; + v = SCHEME_INT_VAL(a); + if (v >= drop) { + a = scheme_make_arity(v - drop, -1); + } else { + a = scheme_make_arity(0, -1); + } + } + if (a) { + a = scheme_make_pair(a, scheme_null); + if (last) + SCHEME_CDR(last) = a; + else + first = a; + last = a; + } + pa = SCHEME_CDR(pa); + } + return first; + } + return pa; + } + } + } else { + if (scheme_native_arity_check(p, a + drop)) + return scheme_true; + else + return scheme_false; + } +#endif } else { Scheme_Closure_Data *data; @@ -1772,7 +1949,7 @@ int scheme_check_proc_arity2(const char *where, int a, if (false_ok && SCHEME_FALSEP(p)) return 1; - if (!SCHEME_PROCP(p) || SCHEME_FALSEP(get_or_check_arity(p, a))) { + if (!SCHEME_PROCP(p) || SCHEME_FALSEP(scheme_get_or_check_arity(p, a))) { if (where) { char buffer[60]; @@ -1925,12 +2102,21 @@ const char *scheme_get_proc_name(Scheme_Object *p, int *len, int for_error) goto top; } } else { - Scheme_Closure_Data *data; + Scheme_Object *name; - data = SCHEME_COMPILED_CLOS_CODE(p); - if (data->name) { - Scheme_Object *name; - name = data->name; + if (type == scheme_closure_type) { + name = SCHEME_COMPILED_CLOS_CODE(p)->name; + } else { + /* Native closure: */ + name = ((Scheme_Native_Closure *)p)->code->u2.name; + if (name && SAME_TYPE(SCHEME_TYPE(name), scheme_unclosed_procedure_type)) { + /* Not yet jitted. Use `name' as the other alternaive of + the union: */ + name = ((Scheme_Closure_Data *)name)->name; + } + } + + if (name) { if (SCHEME_VECTORP(name)) name = SCHEME_VEC_ELS(name)[0]; if (for_error < 0) { @@ -2031,7 +2217,7 @@ static Scheme_Object *object_name(int argc, Scheme_Object **argv) Scheme_Object *scheme_arity(Scheme_Object *p) { - return get_or_check_arity(p, -1); + return scheme_get_or_check_arity(p, -1); } static Scheme_Object *procedure_arity(int argc, Scheme_Object *argv[]) @@ -2039,7 +2225,7 @@ static Scheme_Object *procedure_arity(int argc, Scheme_Object *argv[]) if (!SCHEME_PROCP(argv[0])) scheme_wrong_type("procedure-arity", "procedure", 0, argc, argv); - return get_or_check_arity(argv[0], -1); + return scheme_get_or_check_arity(argv[0], -1); } static Scheme_Object *procedure_arity_includes(int argc, Scheme_Object *argv[]) @@ -2051,7 +2237,7 @@ static Scheme_Object *procedure_arity_includes(int argc, Scheme_Object *argv[]) n = scheme_extract_index("procedure-arity-includes?", 1, argc, argv, -2, 0); - return get_or_check_arity(argv[0], n); + return scheme_get_or_check_arity(argv[0], n); } static Scheme_Object * @@ -2076,7 +2262,7 @@ apply(int argc, Scheme_Object *argv[]) } num_rands += (argc - 2); - if (num_rands > p->tail_buffer_size) { + if (1 || num_rands > p->tail_buffer_size) { rand_vec = MALLOC_N(Scheme_Object *, num_rands); /* num_rands might be very big, so don't install it as the tail buffer */ } else @@ -2140,7 +2326,7 @@ do_map(int argc, Scheme_Object *argv[], char *name, int make_result, } } - if (SCHEME_FALSEP(get_or_check_arity(argv[0], argc - 1))) { + if (SCHEME_FALSEP(scheme_get_or_check_arity(argv[0], argc - 1))) { char *s; long aelen; @@ -2969,7 +3155,7 @@ static Scheme_Object *continuation_marks(Scheme_Thread *p, Scheme_Cont *cont = (Scheme_Cont *)_cont; Scheme_Cont_Mark_Chain *first = NULL, *last = NULL; Scheme_Cont_Mark_Set *set; - Scheme_Object *cache; + Scheme_Object *cache, *nt; long findpos; long cmpos; @@ -3043,10 +3229,17 @@ static Scheme_Object *continuation_marks(Scheme_Thread *p, if (just_chain) return (Scheme_Object *)first; +#ifdef MZ_USE_JIT + nt = scheme_native_stack_trace(); +#else + nt = NULL; +#endif + set = MALLOC_ONE_TAGGED(Scheme_Cont_Mark_Set); set->so.type = scheme_cont_mark_set_type; set->chain = first; set->cmpos = cmpos; + set->native_stack_trace = nt; return (Scheme_Object *)set; } @@ -3193,10 +3386,14 @@ scheme_get_stack_trace(Scheme_Object *mark_set) Scheme_Object *l, *n, *m, *name, *loc; Scheme_Object *a[2]; - a[0] = mark_set; - a[1] = scheme_stack_dump_key; + l = ((Scheme_Cont_Mark_Set *)mark_set)->native_stack_trace; - l = extract_cc_marks(2, a); + if (!l) { + a[0] = mark_set; + a[1] = scheme_stack_dump_key; + + l = extract_cc_marks(2, a); + } /* Filter out NULLs */ while (SCHEME_PAIRP(l) && !SCHEME_CAR(l)) { @@ -3932,7 +4129,7 @@ static Scheme_Object *time_apply(int argc, Scheme_Object *argv[]) num_rands++; } - if (SCHEME_FALSEP(get_or_check_arity(argv[0], num_rands))) { + if (SCHEME_FALSEP(scheme_get_or_check_arity(argv[0], num_rands))) { char *s; long aelen; @@ -4176,8 +4373,8 @@ static Scheme_Object *read_compiled_closure(Scheme_Object *obj) if (SCHEME_TYPE(data->code) > _scheme_values_types_) SCHEME_CLOSURE_DATA_FLAGS(data) |= CLOS_FOLDABLE; + /* If the closure is empty, create the closure now */ if (!data->closure_size) - /* If the closure is empty, go ahead and finalize */ return scheme_make_closure(NULL, (Scheme_Object *)data, 0); else return (Scheme_Object *)data; diff --git a/src/mzscheme/src/jit.c b/src/mzscheme/src/jit.c new file mode 100644 index 0000000000..e7880c706a --- /dev/null +++ b/src/mzscheme/src/jit.c @@ -0,0 +1,3595 @@ +/* + MzScheme + Copyright (c) 2006 PLT Scheme Inc. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "schpriv.h" +#include "schmach.h" + +#ifdef MZ_USE_JIT + +#ifdef __APPLE__ +# define _CALL_DARWIN +#endif + +#include "lightning/lightning.h" + +#define JIT_LOG_WORD_SIZE 2 +#define WORDS_TO_BYTES(x) ((x) << JIT_LOG_WORD_SIZE) +#define JIT_WORD_SIZE (1 << JIT_LOG_WORD_SIZE) + +#define JIT_NOT_RET JIT_R1 +#if JIT_NOT_RET == JIT_RET +Fix me! See use. +#endif + +#define MAX_SHARED_CALL_RANDS 25 +static void *shared_tail_code[2][MAX_SHARED_CALL_RANDS]; +static void *shared_non_tail_code[2][MAX_SHARED_CALL_RANDS][2]; + +#define MAX_SHARED_ARITY_CHECK 25 +static void *shared_arity_check[MAX_SHARED_ARITY_CHECK][2][2]; + +static void *jump_to_native_code; +static void *bad_result_arity_code; +static void *unbound_global_code; +static void *quote_syntax_code; +static void *call_original_code; +static void *call_original_reversed_code; +static void *call_original_single_code; +static void *bad_car_code, *bad_cdr_code; +static void *on_demand_jit_code; +static void *on_demand_jit_arity_code; +static void *get_stack_pointer_code; +static void *stack_cache_pop_code; + +typedef struct { + jit_state js; + unsigned long limit; + int extra_pushed, max_extra_pushed; + int depth, max_depth; + int *mappings; /* low bit indicates mode: orig pushed (0) or new pushed (1); + new pushed can be native; zero marks a save point */ + int num_mappings, mappings_size; + int retained; + int need_set_rs; + void **retain_start; +} mz_jit_state; + +typedef int (*Native_Check_Arity_Proc)(Scheme_Object *o, int argc); +typedef Scheme_Object *(*Native_Get_Arity_Proc)(Scheme_Object *o); +static Native_Check_Arity_Proc check_arity_code; +static Native_Get_Arity_Proc get_arity_code; + +static int generate_non_tail(Scheme_Object *obj, mz_jit_state *jitter, int multi_ok, int need_ends); +static int generate(Scheme_Object *obj, mz_jit_state *jitter, int tail_ok, int multi_ok); +static void *generate_top_simple_arity_check(int num_params, int has_rest, int is_method, int permanent); +static void generate_top_case_lambda_dispatch(Scheme_Case_Lambda *c, Scheme_Native_Closure_Data *ndata, + int is_method); +static void on_demand(); +static int generate_non_tail_mark_pos_prefix(mz_jit_state *jitter); +static void generate_non_tail_mark_pos_suffix(mz_jit_state *jitter); + +/* Tracking statistics: */ +#if 0 +# define NUM_CATEGORIES 23 +int jit_sizes[NUM_CATEGORIES]; +int jit_counts[NUM_CATEGORIES]; +int jit_code_size; +# define START_JIT_DATA() void *__pos = jit_get_ip().ptr; unsigned long __total = 0 +# define END_JIT_DATA(where) if (jitter->retain_start) { \ + jit_sizes[where] += __total + ((unsigned long)jit_get_ip().ptr - (unsigned long)__pos); \ + jit_counts[where]++; } +# define PAUSE_JIT_DATA() __total += ((unsigned long)jit_get_ip().ptr - (unsigned long)__pos) +# define RESUME_JIT_DATA() __pos = jit_get_ip().ptr +# define RECORD_CODE_SIZE(s) jit_code_size += s +#else +# define START_JIT_DATA() /* empty */ +# define END_JIT_DATA(where) /* empty */ +# define PAUSE_JIT_DATA() /* empty */ +# define RESUME_JIT_DATA() /* empty */ +# define RECORD_CODE_SIZE(s) /* empty */ +#endif + +typedef struct { + Scheme_Native_Closure_Data nc; + Scheme_Native_Closure_Data *case_lam; +} Scheme_Native_Closure_Data_Plus_Case; + +/* This structure must be 4 words: */ +typedef struct { + void *orig_return_address; + void *stack_frame; + Scheme_Object *cache; + void *filler; +} Stack_Cache_Elem; + +#define STACK_CACHE_SIZE 32 +static Stack_Cache_Elem stack_cache_stack[STACK_CACHE_SIZE]; +int stack_cache_stack_pos = 0; + +#include "codetab.inc" + +/*========================================================================*/ +/* JIT buffer */ +/*========================================================================*/ + +#define _jit (jitter->js) +#define PAST_LIMIT() ((unsigned long)jit_get_ip().ptr > jitter->limit) +#define CHECK_LIMIT() if (PAST_LIMIT()) return 0; + +#define JIT_CACHE_SIZE_LIMIT 65536 +#define JIT_BUFFER_INIT_SIZE 256 + +#define JIT_INIT_MAPPINGS_SIZE 32 + +static void *jit_buffer_cache; +static long jit_buffer_cache_size; +static int jit_buffer_cache_registered; + +typedef int (*Generate_Proc)(mz_jit_state *j, void *data); + +static void *get_end_pointer(mz_jit_state *jitter) +{ + return jit_get_ip().ptr; +} + +static void mz_retain_it(mz_jit_state *jitter, void *v) +{ + if (jitter->retain_start) { + jitter->retain_start[jitter->retained] = v; + } + jitter->retained++; +} + +static void *generate_one(mz_jit_state *old_jitter, + Generate_Proc generate, + void *data, + int gcable, + void *save_ptr) +{ + mz_jit_state _jitter; + mz_jit_state *jitter = &_jitter; + void *buffer; + int mappings_buffer[JIT_INIT_MAPPINGS_SIZE]; + int *mappings = mappings_buffer; + long size = JIT_BUFFER_INIT_SIZE, known_size = 0, size_pre_retained = 0, num_retained = 0, padding; + int mappings_size = JIT_INIT_MAPPINGS_SIZE; + int ok, max_extra_pushed = 0; + + if (!jit_buffer_cache_registered) { + jit_buffer_cache_registered = 1; + REGISTER_SO(jit_buffer_cache); + REGISTER_SO(stack_cache_stack); + /* printf("zap!\n"); */ + } + + while (1) { + memset(jitter, 0, sizeof(_jitter)); +#ifdef MZ_USE_JIT_PPC + _jitl.long_jumps = 1; +#endif + padding = 100; + if (known_size) { + size_pre_retained = known_size; + size = size_pre_retained + WORDS_TO_BYTES(num_retained); + padding = 0; + if (gcable) { + buffer = scheme_malloc(size); + } else { + buffer = malloc(size); + } + RECORD_CODE_SIZE(size); + } else if (old_jitter) { + /* this is a recursive generate, so use leftover space in + old_jitter's buffer */ + buffer = get_end_pointer(old_jitter); + size = (old_jitter->limit - (unsigned long)buffer); + if (size < JIT_BUFFER_INIT_SIZE) { + old_jitter = NULL; + buffer = NULL; + size = JIT_BUFFER_INIT_SIZE; + } else { + size_pre_retained = size; + } + } else + buffer = NULL; + + if (!buffer) { + if (jit_buffer_cache && (jit_buffer_cache_size >= size)) { + buffer = jit_buffer_cache; + size = jit_buffer_cache_size; + jit_buffer_cache = NULL; + } else { + buffer = scheme_malloc(size); + } + size_pre_retained = size; + } + + (void)jit_set_ip(buffer).ptr; + jitter->limit = (unsigned long)buffer + size_pre_retained - padding; + if (known_size) + jitter->retain_start = (void *)jitter->limit; + else + jitter->retain_start = NULL; + + jitter->mappings = mappings; + jitter->num_mappings = 0; + jitter->mappings_size = mappings_size; + mappings[0] = 0; + jitter->max_extra_pushed = max_extra_pushed; + + ok = generate(jitter, data); + + if (save_ptr) { + mz_retain_it(jitter, save_ptr); + } + + jitter->limit += padding; + if (PAST_LIMIT() || (jitter->retain_start + && (jitter->retained > num_retained))) { + scheme_console_printf("JIT buffer overflow!!\n"); + abort(); + } + + mappings_size = jitter->mappings_size; + mappings = jitter->mappings; + max_extra_pushed = jitter->max_extra_pushed; + + if (ok) { + /* That was big enough: */ + if (known_size) { + /* That was in the permanent area, so return: */ + jit_flush_code(buffer, jit_get_ip().ptr); + return buffer; + } else { + /* Allocate permanent area and jit again: */ + known_size = ((unsigned long)jit_get_ip().ptr) - (unsigned long)buffer; + if (known_size & 0x3) { + known_size += (4 - (known_size & 0x3)); + } + num_retained = jitter->retained; + /* Keep this buffer? Don't if it's too big, or if it's + a part of old_jitter, or if there's already a bigger + cache. */ + if ((jit_buffer_cache_size < JIT_CACHE_SIZE_LIMIT) + && !old_jitter + && (!jit_buffer_cache + || (jit_buffer_cache_size > size))) { + jit_buffer_cache = buffer; + jit_buffer_cache_size = size; + } + } + /* looping to try again... */ + } else { + /* Need more room to try again: */ + size = size * 2; + old_jitter = NULL; + } + } +} + +/*========================================================================*/ +/* run time */ +/*========================================================================*/ + +static +#ifndef NO_INLINE_KEYWORD +MSC_IZE(inline) +#endif + Scheme_Object *do_make_native_closure(Scheme_Native_Closure_Data *code, int size) +{ + Scheme_Native_Closure *o; + + o = (Scheme_Native_Closure *)scheme_malloc_tagged(sizeof(Scheme_Native_Closure) + + ((size - 1) * sizeof(Scheme_Object *))); + o->so.type = scheme_native_closure_type; + o->code = code; + + return (Scheme_Object *)o; +} + +Scheme_Object *scheme_make_native_closure(Scheme_Native_Closure_Data *code) +{ + return do_make_native_closure(code, code->closure_size); +} + +Scheme_Object *scheme_make_native_case_closure(Scheme_Native_Closure_Data *code) +{ + return do_make_native_closure(code, -(code->closure_size + 1)); +} + +static void box_multiple_array_element(int pos) +{ + Scheme_Thread *p = scheme_current_thread; + Scheme_Object **naya, **a; + int i; + + naya = MALLOC_N(Scheme_Object *, p->ku.multiple.count); + a = p->ku.multiple.array; + + for (i = p->ku.multiple.count; i--; ) { + naya[i] = a[i]; + } + { + Scheme_Object *eb; + eb = scheme_make_envunbox(naya[pos]); + naya[pos] = eb; + } + + p->ku.multiple.array = naya; +} + +static void thread_block() +{ + scheme_thread_block(0); + scheme_current_thread->ran_some = 1; +} + +/*========================================================================*/ +/* code-gen utils */ +/*========================================================================*/ + +#define JIT_RUNSTACK JIT_V0 +#define JIT_RUNSTACK_BASE JIT_V2 + +#ifdef MZ_USE_JIT_PPC +# define JIT_STACK 1 +# define JIT_STACK_FRAME 1 +#else +# define JIT_STACK JIT_SP +# define JIT_STACK_FRAME JIT_FP +#endif + +#define JIT_UPDATE_THREAD_RSPTR() jit_sti_p(&MZ_RUNSTACK, JIT_RUNSTACK) +#define JIT_UPDATE_THREAD_RSPTR_IF_NEEDED() \ + if (jitter->need_set_rs) { \ + JIT_UPDATE_THREAD_RSPTR(); \ + jitter->need_set_rs = 0; \ + } +#define JIT_UPDATE_THREAD_RSPTR_FOR_BRANCH_IF_NEEDED() \ + if (jitter->need_set_rs) { \ + JIT_UPDATE_THREAD_RSPTR(); \ + } + +static void new_mapping(mz_jit_state *jitter) +{ + jitter->num_mappings++; + if (jitter->num_mappings >= jitter->mappings_size) { + int *a; + a = (int *)scheme_malloc_atomic(jitter->mappings_size * 2 * sizeof(int)); + memcpy(a, jitter->mappings, jitter->mappings_size * sizeof(int)); + jitter->mappings = a; + jitter->mappings_size *= 2; + } + jitter->mappings[jitter->num_mappings] = 0; +} + +static void mz_pushr_p_it(mz_jit_state *jitter, int reg) +{ + int v; + + jitter->extra_pushed++; + if (jitter->extra_pushed > jitter->max_extra_pushed) + jitter->max_extra_pushed = jitter->extra_pushed; + + if (!(jitter->mappings[jitter->num_mappings] & 0x1) + || (jitter->mappings[jitter->num_mappings] < 0)) { + new_mapping(jitter); + } + v = (jitter->mappings[jitter->num_mappings]) >> 1; + v++; + jitter->mappings[jitter->num_mappings] = ((v << 1) | 0x1); + + jit_subi_p(JIT_RUNSTACK, JIT_RUNSTACK, WORDS_TO_BYTES(1)); + jit_str_p(JIT_RUNSTACK, reg); + + jitter->need_set_rs = 1; +} + +static void mz_popr_p_it(mz_jit_state *jitter, int reg) +{ + int v; + + jitter->extra_pushed--; + + v = jitter->mappings[jitter->num_mappings] >> 1; + v--; + if (!v) + --jitter->num_mappings; + else + jitter->mappings[jitter->num_mappings] = ((v << 1) | 0x1); + + jit_ldr_p(reg, JIT_RUNSTACK); + jit_addi_p(JIT_RUNSTACK, JIT_RUNSTACK, WORDS_TO_BYTES(1)); + + jitter->need_set_rs = 1; +} + +static void mz_runstack_skipped(mz_jit_state *jitter, int n) +{ + int v; + + if (!(jitter->mappings[jitter->num_mappings] & 0x1) + || (jitter->mappings[jitter->num_mappings] > 0)) { + new_mapping(jitter); + } + v = (jitter->mappings[jitter->num_mappings]) >> 1; + v -= n; + jitter->mappings[jitter->num_mappings] = ((v << 1) | 0x1); +} + +static void mz_runstack_unskipped(mz_jit_state *jitter, int n) +{ + int v; + + v = (jitter->mappings[jitter->num_mappings]) >> 1; + v += n; + if (!v) + --jitter->num_mappings; + else + jitter->mappings[jitter->num_mappings] = ((v << 1) | 0x1); +} + +static void mz_runstack_pushed(mz_jit_state *jitter, int n) +{ + jitter->depth += n; + if (jitter->depth > jitter->max_depth) + jitter->max_depth = jitter->depth; + if (!jitter->mappings[jitter->num_mappings] + || (jitter->mappings[jitter->num_mappings] & 0x1)) { + new_mapping(jitter); + } + jitter->mappings[jitter->num_mappings] += (n << 1); + jitter->need_set_rs = 1; +} + +static void mz_runstack_popped(mz_jit_state *jitter, int n) +{ + int v; + jitter->depth -= n; + v = (jitter->mappings[jitter->num_mappings]) >> 1; + v -= n; + if (!v) + --jitter->num_mappings; + else + jitter->mappings[jitter->num_mappings] = (v << 1); + jitter->need_set_rs = 1; +} + +static void mz_runstack_saved(mz_jit_state *jitter) +{ + new_mapping(jitter); + /* 0 slot means "saved here" */ +} + +static int mz_runstack_restored(mz_jit_state *jitter) +{ + /* pop down to 0 slot */ + int amt = 0, c; + while ((c = jitter->mappings[jitter->num_mappings])) { + if (c & 0x1) { + c >>= 1; + if (c > 0) + amt += c; + } else + amt += (c >> 1); + --jitter->num_mappings; + } + --jitter->num_mappings; + if (amt) + jitter->need_set_rs = 1; + jitter->depth -= amt; + return amt; +} + +static int mz_remap_it(mz_jit_state *jitter, int i) +{ + int j = i, p = jitter->num_mappings, c; + while (p && (j >= 0)) { + c = jitter->mappings[p]; + if (c & 0x1) { + c >>= 1; + i += c; + if (c < 0) + j += c; + } else { + j -= (c >> 1); + } + --p; + } + return i; +} + +#define mz_pushr_p(x) mz_pushr_p_it(jitter, x) +#define mz_popr_p(x) mz_popr_p_it(jitter, x) + +#define mz_prepare(x) jit_prepare(x) +#define mz_finish(x) jit_finish(x) +#define mz_finishr(x) jit_finishr(x) + +#define mz_retain(x) mz_retain_it(jitter, x) +#define mz_remap(x) mz_remap_it(jitter, x) + +#ifdef MZ_USE_JIT_PPC +/* JIT_LOCAL1 and JIT_LOCAL2 are offsets in the stack frame. + We use the last two slots reserved for parameters to calless, + because we never call with more than 6 arguments. */ +# define JIT_LOCAL1 56 +# define JIT_LOCAL2 60 +# define JIT_LOCAL3 64 +# define mz_push_local_p(x, l) jit_stxi_p(l, 1, x) +# define mz_pop_local_p(x, l) jit_ldxi_p(x, 1, l) +# define mz_patch_branch_at(a, v) (_jitl.long_jumps ? (void)jit_patch_movei(a-4, a-3, v) : (void)jit_patch_branch(a-1, v)) +# define mz_patch_ucbranch_at(a, v) (_jitl.long_jumps ? (void)jit_patch_movei(a-4, a-3, v) : (void)jit_patch_ucbranch(a-1, v)) +# 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_prolog(x) (MFLRr(x), mz_push_local_p(x, JIT_LOCAL2)) +# define mz_epilog(x) (mz_pop_local_p(x, JIT_LOCAL2), jit_jmpr(x)) +#else +# define mz_push_local_p(x, l) jit_pushr_p(x) +# define mz_pop_local_p(x, l) jit_popr_p(x) +# 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_patch_branch(a) jit_patch(a) +# define mz_patch_ucbranch(a) jit_patch(a) +# define mz_prolog(x) /* empty */ +# define mz_epilog(x) RET_() +#endif + +#ifdef MZ_USE_JIT_PPC +# define __START_SHORT_JUMPS__(cond) if (cond) { _jitl.long_jumps = 0; } +# define __END_SHORT_JUMPS__(cond) if (cond) { _jitl.long_jumps = 1; } +#else +# define __START_SHORT_JUMPS__(cond) /* empty */ +# define __END_SHORT_JUMPS__(cond) /* empty */ +#endif + +/* Note: Things like + + refm = jit_jmpi(jit_forward()); + jit_patch_at(refm, jump_to_native_code); + + appear in the code because the generated instructions can depend on + the actual value supplied to jit_jmpi, and it can depend on the + relative location between the instruction address and the actual + value. Using jit_patch ensures that the generated instructions + always have the same size. */ + +/*========================================================================*/ +/* bytecode properties */ +/*========================================================================*/ + +#ifdef MZ_USE_JIT_PPC +static int is_short(Scheme_Object *obj, int fuel) +{ + if (fuel <= 0) + return fuel; + + switch (SCHEME_TYPE(obj)) { + case scheme_application_type: + { + Scheme_App_Rec *app = (Scheme_App_Rec *)obj; + int i; + + fuel -= app->num_args; + for (i = app->num_args + 1; i--; ) { + fuel = is_short(app->args[i], fuel); + } + return fuel; + } + case scheme_application2_type: + { + Scheme_App2_Rec *app = (Scheme_App2_Rec *)obj; + fuel -= 2; + fuel = is_short(app->rator, fuel); + return is_short(app->rand, fuel); + } + case scheme_application3_type: + { + Scheme_App3_Rec *app = (Scheme_App3_Rec *)obj; + fuel -= 3; + fuel = is_short(app->rator, fuel); + fuel = is_short(app->rand1, fuel); + return is_short(app->rand2, fuel); + } + case scheme_sequence_type: + { + Scheme_Sequence *seq = (Scheme_Sequence *)obj; + int i; + + fuel -= seq->count; + for (i = seq->count; i--; ) { + fuel = is_short(seq->array[i], fuel); + } + return fuel; + } + break; + case scheme_branch_type: + { + Scheme_Branch_Rec *branch = (Scheme_Branch_Rec *)obj; + fuel -= 3; + fuel = is_short(branch->test, fuel); + fuel = is_short(branch->tbranch, fuel); + return is_short(branch->fbranch, fuel); + } + case scheme_toplevel_type: + case scheme_local_type: + case scheme_local_unbox_type: + case scheme_unclosed_procedure_type: + default: + return fuel - 1; + break; + } +} +#endif + +static int inlined_unary_prim(Scheme_Object *o, Scheme_Object *_app) +{ + return (SAME_OBJ(o, scheme_not_prim) + || SAME_OBJ(o, scheme_null_p_prim) + || SAME_OBJ(o, scheme_pair_p_prim) + || SAME_OBJ(o, scheme_car_prim) + || SAME_OBJ(o, scheme_cdr_prim) + || SAME_OBJ(o, scheme_add1_prim) + || SAME_OBJ(o, scheme_sub1_prim)); +} + +static int inlined_binary_prim(Scheme_Object *o, Scheme_Object *_app) +{ + if (SAME_OBJ(o, scheme_plus_prim)) { + Scheme_App3_Rec *app = (Scheme_App3_Rec *)_app; + if (SCHEME_INTP(app->rand1) + || SCHEME_INTP(app->rand2)) + return 1; + } + + if (SAME_OBJ(o, scheme_minus_prim)) { + Scheme_App3_Rec *app = (Scheme_App3_Rec *)_app; + if (SCHEME_INTP(app->rand2)) + return 1; + } + + return (SAME_OBJ(o, scheme_eq_prim)); +} + +static int is_noncm(Scheme_Object *a) +{ + if (SCHEME_PRIMP(a)) { + if (((Scheme_Prim_Proc_Header *)a)->flags & SCHEME_PRIM_IS_NONCM) + return 1; + } + return 0; +} + +#define INIT_SIMPLE_DEPTH 10 + +static int is_simple(Scheme_Object *obj, int depth, int just_markless) +{ + /* Return 1 if evaluating `obj' doesn't change the runstack or cont-mark stack --- + or, if just_markless is 1, doesn't use the cont-mark stack. + If a form doesn't itself change/use the stack, then check all + expressions in tail position, up to some depth. The conservative + answer is always 0. */ + Scheme_Type type; + + type = SCHEME_TYPE(obj); + + switch (type) { + case scheme_syntax_type: + { + int t; + t = SCHEME_PINT_VAL(obj); + return ((t == CASE_LAMBDA_EXPD) + || (t == QUOTE_SYNTAX_EXPD)); + } + break; + + case scheme_branch_type: + if (depth) { + Scheme_Branch_Rec *b = (Scheme_Branch_Rec *)obj; + return (is_simple(b->tbranch, depth - 1, just_markless) + && is_simple(b->fbranch, depth - 1, just_markless)); + } + break; + + case scheme_let_value_type: + if (depth) { + return is_simple(((Scheme_Let_Value *)obj)->body, depth - 1, just_markless); + } + break; + case scheme_let_one_type: + if (just_markless && depth) { + return is_simple(((Scheme_Let_One *)obj)->body, depth - 1, just_markless); + } + break; + case scheme_let_void_type: + if (just_markless && depth) { + return is_simple(((Scheme_Let_Void *)obj)->body, depth - 1, just_markless); + } + break; + case scheme_letrec_type: + if (just_markless && depth) { + return is_simple(((Scheme_Letrec *)obj)->body, depth - 1, just_markless); + } + break; + + case scheme_application_type: + if (just_markless) { + return is_noncm(((Scheme_App_Rec *)obj)->args[0]); + } + break; + case scheme_application2_type: + if (inlined_unary_prim(((Scheme_App2_Rec *)obj)->rator, obj)) + return 1; + else if (just_markless) { + return is_noncm(((Scheme_App2_Rec *)obj)->rator); + } + break; + case scheme_application3_type: + if (inlined_binary_prim(((Scheme_App2_Rec *)obj)->rator, obj)) + return 1; + else if (just_markless) { + return is_noncm(((Scheme_App3_Rec *)obj)->rator); + } + break; + + case scheme_toplevel_type: + case scheme_local_type: + case scheme_local_unbox_type: + case scheme_unclosed_procedure_type: + return 1; + break; + } + + return (type > _scheme_values_types_); +} + +/*========================================================================*/ +/* application codegen */ +/*========================================================================*/ + +static int generate_direct_prim_tail_call(mz_jit_state *jitter, int num_rands) +{ + /* JIT_V1 must have the target function pointer. + Also, scheme_current_runstack must be up-to-date... + unless num-rands == 1, in which case JIT_R0 must + have the argument. */ + if (num_rands == 1) { + jit_subi_p(JIT_RUNSTACK, JIT_RUNSTACK, WORDS_TO_BYTES(1)); + jit_str_p(JIT_RUNSTACK, JIT_R0); + JIT_UPDATE_THREAD_RSPTR(); + } + jit_movi_i(JIT_R1, num_rands); + mz_prepare(2); + CHECK_LIMIT(); + jit_pusharg_p(JIT_RUNSTACK); + jit_pusharg_i(JIT_R1); + mz_finishr(JIT_V1); + CHECK_LIMIT(); + /* Pop saved runstack val and return: */ + mz_pop_local_p(JIT_NOT_RET, JIT_LOCAL1); + jit_sti_p(&scheme_current_runstack, JIT_NOT_RET); + jit_ret(); + + return 1; +} + +static int generate_tail_call(mz_jit_state *jitter, int num_rands, int need_set_rs) +{ + int i; + GC_CAN_IGNORE jit_insn *ref, *ref2, *ref4, *ref5; + + __START_SHORT_JUMPS__(num_rands < 100); + + /* First, try fast direct jump to native code: */ + ref = jit_bmsi_ul(jit_forward(), JIT_V1, 0x1); + jit_ldr_s(JIT_R1, JIT_V1); + ref2 = jit_bnei_p(jit_forward(), JIT_R1, scheme_native_closure_type); + CHECK_LIMIT(); + /* Right kind of function. Extract data and check stack depth: */ + jit_ldxi_p(JIT_R0, JIT_V1, &((Scheme_Native_Closure *)0x0)->code); + jit_ldxi_i(JIT_R2, JIT_R0, &((Scheme_Native_Closure_Data *)0x0)->max_let_depth); + jit_ldi_p(JIT_R1, &MZ_RUNSTACK_START); + jit_subr_ul(JIT_R1, JIT_RUNSTACK, JIT_R1); + ref4 = jit_bltr_ul(jit_forward(), JIT_R1, JIT_R2); + CHECK_LIMIT(); + + /* Fast jump ok (proc will check argc). + At this point, JIT_V1 and JIT_R0 are set up. */ + + /* Check for thread swap: */ + (void)jit_movi_p(JIT_R1, &scheme_fuel_counter); + jit_ldr_i(JIT_R1, JIT_R1); + ref5 = jit_bgti_i(jit_forward(), JIT_R1, 0); + if (need_set_rs) { + JIT_UPDATE_THREAD_RSPTR(); + } + /* FIXME 3m: need to move JIT_V1 and JIT_R0 to GC-visible place */ + mz_push_local_p(JIT_R0, JIT_LOCAL2); + (void)jit_calli(thread_block); + mz_pop_local_p(JIT_R0, JIT_LOCAL2); + mz_patch_branch(ref5); + + /* Copy args to runstack base: */ + jit_subi_p(JIT_R2, JIT_RUNSTACK_BASE, WORDS_TO_BYTES(num_rands)); + for (i = num_rands; i--; ) { + jit_ldxi_p(JIT_R1, JIT_RUNSTACK, WORDS_TO_BYTES(i)); + jit_stxi_p(WORDS_TO_BYTES(i), JIT_R2, JIT_R1); + CHECK_LIMIT(); + } + jit_movr_p(JIT_RUNSTACK, JIT_R2); + + /* Extract function and data: */ + jit_movr_p(JIT_R2, JIT_V1); + jit_ldxi_p(JIT_V1, JIT_R0, &((Scheme_Native_Closure_Data *)0x0)->arity_code); + /* Set up arguments; JIT_RUNSTACK and JIT_RUNSTACK_BASE must also be ready */ + jit_movr_p(JIT_R0, JIT_R2); + jit_movi_i(JIT_R1, num_rands); + jit_movr_p(JIT_R2, JIT_RUNSTACK); + /* Now jump: */ + jit_jmpr(JIT_V1); + CHECK_LIMIT(); + + /* The slow way: */ + /* JIT_R0, JIT_V1, and JIT_RUNSTACK must be intact! */ + mz_patch_branch(ref); + mz_patch_branch(ref2); + mz_patch_branch(ref4); + CHECK_LIMIT(); + if (need_set_rs) { + JIT_UPDATE_THREAD_RSPTR(); + } + jit_movi_i(JIT_R0, num_rands); + mz_prepare(3); + CHECK_LIMIT(); + jit_pusharg_p(JIT_RUNSTACK); + jit_pusharg_i(JIT_R0); + jit_pusharg_p(JIT_V1); + (void)mz_finish(_scheme_tail_apply_from_native); + /* Pop saved runstack val and return: */ + mz_pop_local_p(JIT_NOT_RET, JIT_LOCAL1); + jit_sti_p(&scheme_current_runstack, JIT_NOT_RET); + jit_ret(); + + __END_SHORT_JUMPS__(num_rands < 100); + + return 1; +} + +static int generate_direct_prim_non_tail_call(mz_jit_state *jitter, int num_rands, int multi_ok, int pop_and_jump) +{ + /* See generate_prim_non_tail_call for assumptions. */ + + if (pop_and_jump) { + mz_prolog(JIT_R1); + } + + if (num_rands == 1) { + jit_subi_p(JIT_RUNSTACK, JIT_RUNSTACK, WORDS_TO_BYTES(1)); + jit_str_p(JIT_RUNSTACK, JIT_R0); + JIT_UPDATE_THREAD_RSPTR(); + } + + jit_movi_i(JIT_R1, num_rands); + mz_prepare(2); + CHECK_LIMIT(); + jit_pusharg_p(JIT_RUNSTACK); + jit_pusharg_i(JIT_R1); + mz_finishr(JIT_V1); + CHECK_LIMIT(); + jit_retval(JIT_R0); +#if 0 + /* No need to check for multi values or tail-call, because + we only use this for noncm primitives. */ + jit_insn *ref; + if (!multi_ok) { + jit_insn *refm; + refm = jit_beqi_p(jit_forward(), JIT_R0, SCHEME_MULTIPLE_VALUES); + mz_patch_branch_at(refm, bad_result_arity_code); + } + ref = jit_bnei_p(jit_forward(), JIT_R0, SCHEME_TAIL_CALL_WAITING); + CHECK_LIMIT(); + mz_prepare(1); + jit_pusharg_p(JIT_R0); + if (multi_ok) { + (void)mz_finish(scheme_force_value); + } else { + (void)mz_finish(scheme_force_one_value); + } + jit_retval(JIT_R0); + mz_patch_branch(ref); +#endif + + if (num_rands == 1) { + jit_addi_p(JIT_RUNSTACK, JIT_RUNSTACK, WORDS_TO_BYTES(1)); + } + + if (pop_and_jump) { + mz_epilog(JIT_V1); + } + + return 1; +} + +static int generate_non_tail_call(mz_jit_state *jitter, int num_rands, int need_set_rs, int multi_ok, int pop_and_jump) +{ + /* Non-tail call: */ + GC_CAN_IGNORE jit_insn *ref, *ref2, *ref4, *ref5, *ref6, *ref7, *ref8, *ref9; + GC_CAN_IGNORE jit_insn *ref10; + + __START_SHORT_JUMPS__(num_rands < 100); + + if (pop_and_jump) { + mz_prolog(JIT_R1); + } + + /* Check for inlined prim types */ + ref = jit_bmsi_ul(jit_forward(), JIT_V1, 0x1); + jit_ldr_s(JIT_R1, JIT_V1); + ref2 = jit_bnei_i(jit_forward(), JIT_R1, scheme_native_closure_type); + CHECK_LIMIT(); + + /* Before inlined native, check max let depth */ + jit_ldxi_p(JIT_R0, JIT_V1, &((Scheme_Native_Closure *)0x0)->code); + jit_ldxi_i(JIT_R2, JIT_R0, &((Scheme_Native_Closure_Data *)0x0)->max_let_depth); + jit_ldi_p(JIT_R1, &MZ_RUNSTACK_START); + jit_subr_ul(JIT_R1, JIT_RUNSTACK, JIT_R1); + ref4 = jit_bltr_ul(jit_forward(), JIT_R1, JIT_R2); + CHECK_LIMIT(); + + /* Before inlined native, check stack depth: */ + (void)jit_movi_p(JIT_R1, &scheme_stack_boundary); + jit_ldr_i(JIT_R1, JIT_R1); + ref9 = jit_bltr_ul(jit_forward(), JIT_STACK, JIT_R1); + CHECK_LIMIT(); + + /* Fast inlined-native jump ok (proc will check argc); */ + /* extract function and data: */ + mz_prepare(3); + jit_pusharg_p(JIT_RUNSTACK); + jit_movi_i(JIT_R1, num_rands); + jit_pusharg_i(JIT_R1); + jit_pusharg_p(JIT_V1); + (void)mz_finish(jump_to_native_code); + CHECK_LIMIT(); + jit_retval(JIT_R0); + if (!multi_ok) { + jit_insn *refm; + __END_SHORT_JUMPS__(num_rands < 100); + refm = jit_beqi_p(jit_forward(), JIT_R0, SCHEME_MULTIPLE_VALUES); + mz_patch_branch_at(refm, bad_result_arity_code); + __START_SHORT_JUMPS__(num_rands < 100); + } + ref6 = jit_bnei_p(jit_forward(), JIT_R0, SCHEME_TAIL_CALL_WAITING); + if (need_set_rs) { + JIT_UPDATE_THREAD_RSPTR(); + } + mz_prepare(1); + jit_pusharg_p(JIT_R0); + if (multi_ok) { + (void)mz_finish(scheme_force_value); + } else { + (void)mz_finish(scheme_force_one_value); + } + ref5 = jit_jmpi(jit_forward()); + CHECK_LIMIT(); + + /* Maybe it's a prim? */ + mz_patch_branch(ref2); + ref2 = jit_bnei_i(jit_forward(), JIT_R1, scheme_prim_type); + /* It's a prim. Arity check... fast path when exactly equal to min, only: */ + jit_ldxi_i(JIT_R0, JIT_V1, &((Scheme_Primitive_Proc *)0x0)->mina); + ref7 = jit_bnei_i(jit_forward(), JIT_R0, num_rands); + /* Fast prim application */ + jit_ldxi_p(JIT_V1, JIT_V1, &((Scheme_Primitive_Proc *)0x0)->prim_val); + if (need_set_rs) { + JIT_UPDATE_THREAD_RSPTR(); + } + mz_prepare(2); + jit_pusharg_p(JIT_RUNSTACK); + jit_pusharg_i(JIT_R0); + (void)mz_finishr(JIT_V1); + CHECK_LIMIT(); + jit_retval(JIT_R0); + if (!multi_ok) { + jit_insn *refm; + __END_SHORT_JUMPS__(num_rands < 100); + refm = jit_beqi_p(jit_forward(), JIT_R0, SCHEME_MULTIPLE_VALUES); + mz_patch_branch_at(refm, bad_result_arity_code); + __START_SHORT_JUMPS__(num_rands < 100); + } + ref10 = jit_bnei_p(jit_forward(), JIT_R0, SCHEME_TAIL_CALL_WAITING); + mz_prepare(1); + jit_pusharg_p(JIT_R0); + if (multi_ok) { + (void)mz_finish(scheme_force_value); + } else { + (void)mz_finish(scheme_force_one_value); + } + CHECK_LIMIT(); + ref8 = jit_jmpi(jit_forward()); + + /* The slow way: */ + mz_patch_branch(ref); + mz_patch_branch(ref2); + mz_patch_branch(ref4); + mz_patch_branch(ref7); + mz_patch_branch(ref9); + if (need_set_rs) { + JIT_UPDATE_THREAD_RSPTR(); + } + jit_movi_i(JIT_R0, num_rands); + mz_prepare(3); + CHECK_LIMIT(); + jit_pusharg_p(JIT_RUNSTACK); + jit_pusharg_i(JIT_R0); + jit_pusharg_p(JIT_V1); + if (multi_ok) { + (void)mz_finish(_scheme_apply_multi_from_native); + } else { + (void)mz_finish(_scheme_apply_from_native); + } + mz_patch_ucbranch(ref5); + mz_patch_ucbranch(ref8); + jit_retval(JIT_R0); + mz_patch_branch(ref6); + mz_patch_branch(ref10); + if (pop_and_jump) { + mz_epilog(JIT_V1); + } + + __END_SHORT_JUMPS__(num_rands < 100); + + return 1; +} + +typedef struct { + int num_rands; + mz_jit_state *old_jitter; + int multi_ok; + int is_tail; + int direct_prim; +} Generate_Call_Data; + +int do_generate_shared_call(mz_jit_state *jitter, void *_data) +{ + Generate_Call_Data *data = (Generate_Call_Data *)_data; + +#ifdef MZ_USE_JIT_PPC + jitter->js.jitl.nbArgs = data->old_jitter->js.jitl.nbArgs; +#endif + + if (data->is_tail) { + if (data->direct_prim) + return generate_direct_prim_tail_call(jitter, data->num_rands); + else + return generate_tail_call(jitter, data->num_rands, 1); + } else { + int ok; + void *code, *code_end; + + code = jit_get_ip().ptr; + + if (data->direct_prim) + ok = generate_direct_prim_non_tail_call(jitter, data->num_rands, data->multi_ok, 1); + else + ok = generate_non_tail_call(jitter, data->num_rands, 1, data->multi_ok, 1); + + code_end = jit_get_ip().ptr; + if (jitter->retain_start) + add_symbol((unsigned long)code, (unsigned long)code_end - 1, scheme_false, 0); + + return ok; + } +} + +static void *generate_shared_call(int num_rands, mz_jit_state *old_jitter, int multi_ok, int is_tail, + int direct_prim) +{ + Generate_Call_Data data; + + data.num_rands = num_rands; + data.old_jitter = old_jitter; + data.multi_ok = multi_ok; + data.is_tail = is_tail; + data.direct_prim = direct_prim; + + return generate_one(old_jitter, do_generate_shared_call, &data, 0, NULL); +} + +static int generate_app(Scheme_App_Rec *app, Scheme_Object **alt_rands, int num_rands, + mz_jit_state *jitter, int is_tail, int multi_ok) +{ + int i, direct_prim = 0, need_non_tail = 0, offset; + Scheme_Object *rator, *v; + int reorder_ok = 0; + START_JIT_DATA(); + + rator = (alt_rands ? alt_rands[0] : app->args[0]); + + if (SCHEME_PRIMP(rator)) { + if ((num_rands >= ((Scheme_Primitive_Proc *)rator)->mina) + && ((num_rands <= ((Scheme_Primitive_Proc *)rator)->maxa) + || (((Scheme_Primitive_Proc *)rator)->maxa < 0)) + && is_noncm(rator)) + direct_prim = 1; + } else { + Scheme_Type t; + t = SCHEME_TYPE(rator); + if ((t == scheme_local_type) || (t > _scheme_values_types_)) { + /* We can re-order evaluation. */ + reorder_ok = 1; + } + } + + if (num_rands) { + if (!direct_prim || (num_rands > 1)) { + jit_subi_p(JIT_RUNSTACK, JIT_RUNSTACK, WORDS_TO_BYTES(num_rands)); + mz_runstack_pushed(jitter, num_rands); + } else { + mz_runstack_skipped(jitter, 1); + } + } + + for (i = 0; i <= num_rands; i++) { + v = (alt_rands ? alt_rands[i] : app->args[i]); + if (!is_simple(v, INIT_SIMPLE_DEPTH, 1)) { + need_non_tail = 1; + break; + } + } + + if (need_non_tail) { + offset = generate_non_tail_mark_pos_prefix(jitter); + CHECK_LIMIT(); + } else + offset = 0; + + if (!direct_prim && !reorder_ok) { + generate_non_tail(rator, jitter, 0, !need_non_tail); + CHECK_LIMIT(); + + if (num_rands) { + /* Save rator where GC can see it */ + jit_stxi_p(WORDS_TO_BYTES(num_rands - 1 + offset), JIT_RUNSTACK, JIT_R0); + } else { + jit_movr_p(JIT_V1, JIT_R0); + } + } + + for (i = 0; i < num_rands; i++) { + PAUSE_JIT_DATA(); + generate_non_tail(alt_rands ? alt_rands[i+1] : app->args[i+1], jitter, 0, !need_non_tail); + RESUME_JIT_DATA(); + CHECK_LIMIT(); + if ((i == num_rands - 1) && !direct_prim && !reorder_ok) { + /* Move rator back to register: */ + jit_ldxi_p(JIT_V1, JIT_RUNSTACK, WORDS_TO_BYTES(i + offset)); + } + if (!direct_prim || (num_rands > 1)) { + jit_stxi_p(WORDS_TO_BYTES(i + offset), JIT_RUNSTACK, JIT_R0); + } + } + + if (need_non_tail) { + /* Uses JIT_R2: */ + generate_non_tail_mark_pos_suffix(jitter); + CHECK_LIMIT(); + } + + if (direct_prim) { + (void)jit_movi_p(JIT_V1, ((Scheme_Primitive_Proc *)rator)->prim_val); + if (num_rands == 1) { + mz_runstack_unskipped(jitter, 1); + } else { + JIT_UPDATE_THREAD_RSPTR_IF_NEEDED(); + } + } + + if (reorder_ok) { + generate(rator, jitter, 0, 0); + CHECK_LIMIT(); + jit_movr_p(JIT_V1, JIT_R0); + } + + END_JIT_DATA(20); + + if (num_rands >= MAX_SHARED_CALL_RANDS) { + if (is_tail) { + if (direct_prim) + generate_direct_prim_tail_call(jitter, num_rands); + else + generate_tail_call(jitter, num_rands, jitter->need_set_rs); + } else { + if (direct_prim) + generate_direct_prim_non_tail_call(jitter, num_rands, multi_ok, 0); + else + generate_non_tail_call(jitter, num_rands, jitter->need_set_rs, multi_ok, 0); + } + } else { + /* Jump to code to implement a tail call for num_rands arguments */ + void *code; + int dp = (direct_prim ? 1 : 0); + if (is_tail) { + jit_insn *refm; + if (!shared_tail_code[dp][num_rands]) { + code = generate_shared_call(num_rands, jitter, multi_ok, is_tail, direct_prim); + shared_tail_code[dp][num_rands] = code; + } + code = shared_tail_code[dp][num_rands]; + refm = jit_jmpi(jit_forward()); + mz_patch_ucbranch_at(refm, code); + } else { + int mo = (multi_ok ? 1 : 0); + + if (!shared_non_tail_code[dp][num_rands][mo]) { + code = generate_shared_call(num_rands, jitter, multi_ok, is_tail, direct_prim); + shared_non_tail_code[dp][num_rands][mo] = code; + } + code = shared_non_tail_code[dp][num_rands][mo]; + + (void)jit_calli(code); + + /* Whether we call a prim, a native, or something else, + scheme_current_runstack is up-to-date. */ + jitter->need_set_rs = 0; + } + } + + END_JIT_DATA(need_non_tail ? 22 : 4); + + return is_tail ? 2 : 1; +} + +static int generate_add(mz_jit_state *jitter, Scheme_Object *v, long delta, int orig_args, + Scheme_Object *orig_prim, int single, int negate, int reversed) +{ + GC_CAN_IGNORE jit_insn *ref, *ref2, *ref3; + + mz_runstack_skipped(jitter, orig_args); + + generate_non_tail(v, jitter, 0, 1); + CHECK_LIMIT(); + + mz_runstack_unskipped(jitter, orig_args); + + __START_SHORT_JUMPS__(1); + + jit_movr_p(JIT_R1, JIT_R0); /* save it in case of overflow... */ + ref = jit_bmci_ul(jit_forward(), JIT_R0, 0x1); + ref3 = jit_boaddi_i(jit_forward(), JIT_R0, delta << 1); + ref2 = jit_jmpi(jit_forward()); + CHECK_LIMIT(); + + /* Fixnum fast path failed; call original primitive */ + mz_patch_branch(ref); + mz_patch_branch(ref3); + __END_SHORT_JUMPS__(1); + if (negate) + delta = -delta; + if (!single) { + (void)jit_movi_p(JIT_R0, scheme_make_integer(delta)); + } + (void)jit_movi_p(JIT_R2, ((Scheme_Primitive_Proc *)orig_prim)->prim_val); + if (single) { + (void)jit_calli(call_original_single_code); + } else if (reversed) { + (void)jit_calli(call_original_reversed_code); + } else { + (void)jit_calli(call_original_code); + } + + __START_SHORT_JUMPS__(1); + mz_patch_ucbranch(ref2); + __END_SHORT_JUMPS__(1); + + return 1; +} + +static int generate_inlined_unary(mz_jit_state *jitter, Scheme_App2_Rec *app, int is_tail, int multi_ok) +{ + Scheme_Object *rator = app->rator; + + if (SAME_OBJ(rator, scheme_not_prim) + || SAME_OBJ(rator, scheme_null_p_prim)) { + GC_CAN_IGNORE jit_insn *ref, *ref2; + Scheme_Object *cnst; + + if (SAME_OBJ(rator, scheme_not_prim)) { + cnst = scheme_false; + } else { + cnst = scheme_null; + } + + mz_runstack_skipped(jitter, 1); + + generate_non_tail(app->rand, jitter, 0, 1); + CHECK_LIMIT(); + + mz_runstack_unskipped(jitter, 1); + + __START_SHORT_JUMPS__(1); + + ref = jit_beqi_p(jit_forward(), JIT_R0, cnst); + (void)jit_movi_p(JIT_R0, scheme_false); + ref2 = jit_jmpi(jit_forward()); + mz_patch_branch(ref); + (void)jit_movi_p(JIT_R0, scheme_true); + mz_patch_ucbranch(ref2); + + __END_SHORT_JUMPS__(1); + + return 1; + } else if (SAME_OBJ(rator, scheme_pair_p_prim)) { + GC_CAN_IGNORE jit_insn *ref, *ref2, *ref3; + Scheme_Type ty; + + ty = scheme_pair_type; + + mz_runstack_skipped(jitter, 1); + + generate_non_tail(app->rand, jitter, 0, 1); + CHECK_LIMIT(); + + mz_runstack_unskipped(jitter, 1); + + __START_SHORT_JUMPS__(1); + + ref = jit_bmsi_ul(jit_forward(), JIT_R0, 0x1); + jit_ldxi_s(JIT_R0, JIT_R0, &((Scheme_Object *)0x0)->type); + ref3 = jit_bnei_p(jit_forward(), JIT_R0, ty); + (void)jit_movi_p(JIT_R0, scheme_true); + ref2 = jit_jmpi(jit_forward()); + mz_patch_branch(ref); + mz_patch_branch(ref3); + (void)jit_movi_p(JIT_R0, scheme_false); + mz_patch_ucbranch(ref2); + + __END_SHORT_JUMPS__(1); + + return 1; + } else if (SAME_OBJ(rator, scheme_car_prim) + || SAME_OBJ(rator, scheme_cdr_prim)) { + GC_CAN_IGNORE jit_insn *ref, *ref2, *ref3; + int is_car; + + is_car = SAME_OBJ(rator, scheme_car_prim); + + mz_runstack_skipped(jitter, 1); + + generate_non_tail(app->rand, jitter, 0, 1); + CHECK_LIMIT(); + + mz_runstack_unskipped(jitter, 1); + + __START_SHORT_JUMPS__(1); + + ref = jit_bmsi_ul(jit_forward(), JIT_R0, 0x1); + jit_ldxi_s(JIT_R1, JIT_R0, &((Scheme_Object *)0x0)->type); + ref3 = jit_bnei_p(jit_forward(), JIT_R1, scheme_pair_type); + if (is_car) { + (void)jit_ldxi_p(JIT_R0, JIT_R0, &((Scheme_Simple_Object *)0x0)->u.pair_val.car); + } else { + (void)jit_ldxi_p(JIT_R0, JIT_R0, &((Scheme_Simple_Object *)0x0)->u.pair_val.cdr); + } + ref2 = jit_jmpi(jit_forward()); + mz_patch_branch(ref); + mz_patch_branch(ref3); + __END_SHORT_JUMPS__(1); + + if (is_car) { + (void)jit_jmpi(bad_car_code); + } else { + (void)jit_jmpi(bad_cdr_code); + } + + __START_SHORT_JUMPS__(1); + mz_patch_ucbranch(ref2); + __END_SHORT_JUMPS__(1); + + return 1; + } else if (SAME_OBJ(rator, scheme_add1_prim)) { + generate_add(jitter, app->rand, 1, 1, rator, 1, 0, 0); + return 1; + } else if (SAME_OBJ(rator, scheme_sub1_prim)) { + generate_add(jitter, app->rand, -1, 1, rator, 1, 0, 0); + return 1; + } + + return 0; +} + +static int generate_inlined_binary(mz_jit_state *jitter, Scheme_App3_Rec *app, int is_tail, int multi_ok) +{ + Scheme_Object *rator = app->rator; + + if (SAME_OBJ(rator, scheme_eq_prim)) { + Scheme_Object *a1, *a2; + GC_CAN_IGNORE jit_insn *ref, *ref2; + + a1 = app->rand1; + if (SCHEME_TYPE(a1) > _scheme_values_types_) { + a2 = app->rand2; + } else { + a1 = app->rand2; + a2 = app->rand1; + } + + if (SCHEME_TYPE(a1) > _scheme_values_types_) { + /* Compare to constant: */ + mz_runstack_skipped(jitter, 2); + + generate_non_tail(a2, jitter, 0, 1); + CHECK_LIMIT(); + + mz_runstack_unskipped(jitter, 2); + + __START_SHORT_JUMPS__(1); + + mz_retain(a1); + ref = jit_beqi_p(jit_forward(), JIT_R0, a1); + (void)jit_movi_p(JIT_R0, scheme_false); + ref2 = jit_jmpi(jit_forward()); + mz_patch_branch(ref); + (void)jit_movi_p(JIT_R0, scheme_true); + mz_patch_ucbranch(ref2); + + __END_SHORT_JUMPS__(1); + } else { + /* Two complex expressions: */ + mz_runstack_skipped(jitter, 1); + + jit_subi_p(JIT_RUNSTACK, JIT_RUNSTACK, WORDS_TO_BYTES(1)); + mz_runstack_pushed(jitter, 1); + + generate_non_tail(a2, jitter, 0, 1); + CHECK_LIMIT(); + jit_str_p(JIT_RUNSTACK, JIT_R0); + generate_non_tail(a1, jitter, 0, 1); + CHECK_LIMIT(); + jit_ldr_p(JIT_R1, JIT_RUNSTACK); + + jit_addi_p(JIT_RUNSTACK, JIT_RUNSTACK, WORDS_TO_BYTES(1)); + mz_runstack_popped(jitter, 1); + + mz_runstack_unskipped(jitter, 1); + + __START_SHORT_JUMPS__(1); + + ref = jit_beqr_p(jit_forward(), JIT_R0, JIT_R1); + (void)jit_movi_p(JIT_R0, scheme_false); + ref2 = jit_jmpi(jit_forward()); + mz_patch_branch(ref); + (void)jit_movi_p(JIT_R0, scheme_true); + mz_patch_ucbranch(ref2); + + __END_SHORT_JUMPS__(1); + } + + return 1; + } else if (SAME_OBJ(rator, scheme_plus_prim) + || SAME_OBJ(rator, scheme_minus_prim)) { + Scheme_Object *c, *v; + int reversed = 0, negative = 0; + + c = app->rand1; + if (SAME_OBJ(rator, scheme_plus_prim) && SCHEME_INTP(c)) { + v = app->rand2; + } else { + c = app->rand2; + v = app->rand1; + reversed = 1; + if (SAME_OBJ(rator, scheme_minus_prim)) + negative = 1; + } + + if (SCHEME_INTP(c)) { + long delta = SCHEME_INT_VAL(c); + if (negative) { + long d2; + d2 = -delta; + delta = d2; + } + generate_add(jitter, v, delta, 2, rator, 0, negative, reversed); + + return 1; + } + } + + return 0; +} + +/*========================================================================*/ +/* lambda codegen */ +/*========================================================================*/ + +static void ensure_closure_native(Scheme_Closure_Data *data, + Scheme_Native_Closure_Data *case_lam) +{ + if (!data->native_code || SCHEME_FALSEP((Scheme_Object *)data->native_code)) { + Scheme_Native_Closure_Data *code; + code = scheme_generate_lambda(data, 0, case_lam); + data->native_code = code; + } +} + +static int generate_closure(Scheme_Closure_Data *data, + mz_jit_state *jitter) +{ + Scheme_Native_Closure_Data *code; + + ensure_closure_native(data, NULL); + code = data->native_code; + + JIT_UPDATE_THREAD_RSPTR_IF_NEEDED(); + mz_prepare(1); + mz_retain(code); + (void)jit_movi_p(JIT_R0, code); /* !! */ + jit_pusharg_p(JIT_R0); + (void)mz_finish(scheme_make_native_closure); + jit_retval(JIT_R0); + + return 1; +} + +static int generate_closure_fill(Scheme_Closure_Data *data, + mz_jit_state *jitter) +{ + /* Fill in closure */ + int j, size, pos; + mzshort *map; + size = data->closure_size; + map = data->closure_map; + jit_addi_p(JIT_R2, JIT_R0, &((Scheme_Native_Closure *)0x0)->vals); + for (j = 0; j < size; j++) { + CHECK_LIMIT(); + pos = mz_remap(map[j]); + jit_ldxi_p(JIT_R1, JIT_RUNSTACK, WORDS_TO_BYTES(pos)); + jit_stxi_p(WORDS_TO_BYTES(j), JIT_R2, JIT_R1); + } + return 1; +} + +Scheme_Native_Closure_Data *scheme_generate_case_lambda(Scheme_Case_Lambda *c) +{ + Scheme_Closure_Data *data; + Scheme_Native_Closure_Data *ndata; + Scheme_Object *name, *o; + int max_let_depth = 0, i, count, is_method = 0; + + ndata = MALLOC_ONE_RT(Scheme_Native_Closure_Data); + name = c->name; + if (name && SCHEME_BOXP(name)) { + name = SCHEME_BOX_VAL(name); + is_method = 1; + } + ndata->u2.name = name; + count = c->count; + for (i = 0; i < count; i++) { + o = c->array[i]; + if (SCHEME_PROCP(o)) + o = (Scheme_Object *)((Scheme_Closure *)o)->code; + data = (Scheme_Closure_Data *)o; + ensure_closure_native(data, ndata); + if (data->native_code->max_let_depth > max_let_depth) + max_let_depth = data->native_code->max_let_depth; + } + ndata->max_let_depth = max_let_depth; + ndata->closure_size = -(count + 1); /* Indicates case-lambda */ + + if (count) { + o = c->array[0]; + if (SCHEME_PROCP(o)) + o = (Scheme_Object *)((Scheme_Closure *)o)->code; + data = (Scheme_Closure_Data *)o; + is_method = ((SCHEME_CLOSURE_DATA_FLAGS(data) & CLOS_IS_METHOD) ? 1 : 0); + } + + generate_top_case_lambda_dispatch(c, ndata, is_method); + + return ndata; +} + +static void ensure_case_closure_native(Scheme_Case_Lambda *c) +{ + if (!c->native_code || SCHEME_FALSEP((Scheme_Object *)c->native_code)) { + Scheme_Native_Closure_Data *ndata; + ndata = scheme_generate_case_lambda(c); + c->native_code = ndata; + } +} + +static int generate_case_lambda(Scheme_Object *obj, mz_jit_state *jitter) +{ + Scheme_Case_Lambda *c = (Scheme_Case_Lambda *)obj; + Scheme_Native_Closure_Data *ndata; + Scheme_Closure_Data *data; + Scheme_Object *o; + int i, offset, count; + + ensure_case_closure_native(c); + ndata = c->native_code; + + JIT_UPDATE_THREAD_RSPTR_IF_NEEDED(); + mz_prepare(1); + mz_retain(ndata); + (void)jit_movi_p(JIT_R0, ndata); /* !! */ + jit_pusharg_p(JIT_R0); + (void)mz_finish(scheme_make_native_case_closure); + jit_retval(JIT_R1); + CHECK_LIMIT(); + + count = c->count; + + for (i = 0; i < count; i++) { + o = c->array[i]; + if (SCHEME_PROCP(o)) + o = (Scheme_Object *)((Scheme_Closure *)o)->code; + data = (Scheme_Closure_Data *)o; + mz_pushr_p(JIT_R1); /* !!!!!!! */ + generate_closure(data, jitter); + CHECK_LIMIT(); + generate_closure_fill(data, jitter); + CHECK_LIMIT(); + mz_popr_p(JIT_R1); + offset = WORDS_TO_BYTES(i) + (unsigned long)&((Scheme_Native_Closure *)0x0)->vals; + jit_stxi_p(offset, JIT_R1, JIT_R0); + CHECK_LIMIT(); + } + jit_movr_p(JIT_R0, JIT_R1); + + return 1; +} + +/*========================================================================*/ +/* non-tail codegen */ +/*========================================================================*/ + +static int generate_non_tail_mark_pos_prefix(mz_jit_state *jitter) +{ + /* This part of a non-tail setup can be done once for a sequence + of non-tail calls. In that case, pass 0 for the `mark_pos_ends' + argument to generate_non_tail(), so that it can skip this prefix + and suffix. In case this prefix needs to adjust the runstack, + the result indicates the number of pushed values. */ + jit_ldi_i(JIT_R2, &scheme_current_cont_mark_pos); + jit_addi_i(JIT_R2, JIT_R2, 2); + jit_sti_i(&scheme_current_cont_mark_pos, JIT_R2); + return 0 /* = number of pushed items */; +} + +static void generate_non_tail_mark_pos_suffix(mz_jit_state *jitter) +{ + jit_ldi_i(JIT_R2, &scheme_current_cont_mark_pos); + jit_subi_i(JIT_R2, JIT_R2, 2); + jit_sti_i(&scheme_current_cont_mark_pos, JIT_R2); +} + +static int generate_non_tail(Scheme_Object *obj, mz_jit_state *jitter, int multi_ok, int mark_pos_ends) +{ + if (is_simple(obj, INIT_SIMPLE_DEPTH, 0)) { + /* Simple; doesn't change the stack or set marks: */ + return generate(obj, jitter, 0, multi_ok); + } + + { + int amt, need_ends = 1; + START_JIT_DATA(); + + /* Might change the stack or marks: */ + if (is_simple(obj, INIT_SIMPLE_DEPTH, 1)) { + need_ends = 0; + } else { + if (mark_pos_ends) + generate_non_tail_mark_pos_prefix(jitter); + jit_ldi_p(JIT_R2, &scheme_current_cont_mark_stack); + mz_pushr_p(JIT_R2); + CHECK_LIMIT(); + } + mz_runstack_saved(jitter); + CHECK_LIMIT(); + + PAUSE_JIT_DATA(); + generate(obj, jitter, 0, multi_ok); + RESUME_JIT_DATA(); + CHECK_LIMIT(); + + amt = mz_runstack_restored(jitter); + if (amt) { + jit_addi_p(JIT_RUNSTACK, JIT_RUNSTACK, WORDS_TO_BYTES(amt)); + } + if (need_ends) { + mz_popr_p(JIT_R2); + jit_sti_p(&scheme_current_cont_mark_stack, JIT_R2); + if (mark_pos_ends) + generate_non_tail_mark_pos_suffix(jitter); + CHECK_LIMIT(); + } + + END_JIT_DATA(21); + } + + return 1; +} + +/*========================================================================*/ +/* expression codegen */ +/*========================================================================*/ + +static Scheme_Object *generate_k(void) +{ + Scheme_Thread *p = scheme_current_thread; + Scheme_Object *obj = (Scheme_Object *)p->ku.k.p1; + mz_jit_state *jitter = (mz_jit_state *)p->ku.k.p2; + int v; + + p->ku.k.p1 = NULL; + p->ku.k.p2 = NULL; + + v = generate(obj, jitter, p->ku.k.i1, p->ku.k.i2); + + return scheme_make_integer(v); +} + +static int generate(Scheme_Object *obj, mz_jit_state *jitter, int is_tail, int multi_ok) +/* result goes to JIT_R0 */ +{ + Scheme_Type type; + +#ifdef DO_STACK_CHECK +# include "mzstkchk.h" + { + Scheme_Object *ok; + Scheme_Thread *p = scheme_current_thread; + mz_jit_state *jitter_copy; + + /* 3m FIXME: need precise handling of this copy: */ + jitter_copy = (mz_jit_state *)scheme_malloc(sizeof(jitter_copy)); + memcpy(jitter_copy, jitter, sizeof(mz_jit_state)); + + p->ku.k.p1 = (void *)obj; + p->ku.k.p2 = (void *)jitter_copy; + p->ku.k.i1 = is_tail; + p->ku.k.i2 = multi_ok; + + ok = scheme_handle_stack_overflow(generate_k); + + memcpy(jitter, jitter_copy, sizeof(mz_jit_state)); + + return SCHEME_INT_VAL(ok); + } +#endif + + type = SCHEME_TYPE(obj); + switch (type) { + case scheme_toplevel_type: + { + int pos; + START_JIT_DATA(); + /* Load global array: */ + pos = mz_remap(SCHEME_TOPLEVEL_DEPTH(obj)); + jit_ldxi_p(JIT_R2, JIT_RUNSTACK, WORDS_TO_BYTES(pos)); + /* Load bucket: */ + pos = SCHEME_TOPLEVEL_POS(obj); + jit_ldxi_p(JIT_R2, JIT_R2, WORDS_TO_BYTES(pos)); + /* Extract bucket value */ + jit_ldxi_p(JIT_R0, JIT_R2, &(SCHEME_VAR_BUCKET(0x0)->val)); + CHECK_LIMIT(); + /* Is it NULL? */ + (void)jit_beqi_p(unbound_global_code, JIT_R0, 0); + END_JIT_DATA(0); + return 1; + } + case scheme_local_type: + { + int pos; + START_JIT_DATA(); + pos = mz_remap(SCHEME_LOCAL_POS(obj)); + jit_ldxi_p(JIT_R0, JIT_RUNSTACK, WORDS_TO_BYTES(pos)); + END_JIT_DATA(2); + return 1; + } + case scheme_local_unbox_type: + { + int pos; + START_JIT_DATA(); + + pos = mz_remap(SCHEME_LOCAL_POS(obj)); + jit_ldxi_p(JIT_R0, JIT_RUNSTACK, WORDS_TO_BYTES(pos)); + jit_ldr_p(JIT_R0, JIT_R0); + + END_JIT_DATA(3); + return 1; + } + case scheme_syntax_type: + { + int pos; + pos = SCHEME_PINT_VAL(obj); + switch (pos) { + case CASE_LAMBDA_EXPD: + { + START_JIT_DATA(); + /* case-lambda */ + generate_case_lambda(SCHEME_IPTR_VAL(obj), jitter); + END_JIT_DATA(5); + } + break; + case BEGIN0_EXPD: + { + Scheme_Sequence *seq; + jit_insn *ref, *ref2; + int i; + START_JIT_DATA(); + + seq = (Scheme_Sequence *)SCHEME_IPTR_VAL(obj); + + /* Evaluate first expression, and for consistency with bytecode + evaluation, allow multiple values. */ + generate_non_tail(seq->array[0], jitter, 1, 1); + CHECK_LIMIT(); + + /* Save value(s) */ + jit_movr_p(JIT_V1, JIT_R0); + mz_pushr_p(JIT_V1); + mz_pushr_p(JIT_V1); + mz_pushr_p(JIT_V1); /* !!!!!!!! */ + __START_SHORT_JUMPS__(1); + ref = jit_bnei_p(jit_forward(), JIT_R0, SCHEME_MULTIPLE_VALUES); + CHECK_LIMIT(); + /* Save away multiple values */ + mz_popr_p(JIT_V1); + mz_popr_p(JIT_V1); + mz_popr_p(JIT_V1); + jit_ldi_p(JIT_R0, &scheme_current_thread); + CHECK_LIMIT(); + jit_ldxi_i(JIT_V1, JIT_R0, &((Scheme_Thread *)0x0)->ku.multiple.count); + jit_lshi_i(JIT_V1, JIT_V1, 0x1); + jit_ori_i(JIT_V1, JIT_V1, 0x1); + mz_pushr_p(JIT_V1); + jit_ldxi_p(JIT_V1, JIT_R0, &((Scheme_Thread *)0x0)->ku.multiple.array); + mz_pushr_p(JIT_V1); /* !!!!!!!! */ + CHECK_LIMIT(); + (void)jit_movi_p(JIT_R1, 0x0); + mz_pushr_p(JIT_R1); /* pushing 0 indicates that multi-array follows */ + /* If multi-value array is values buffer, zero out values buffer */ + jit_ldxi_i(JIT_R2, JIT_R0, &((Scheme_Thread *)0x0)->values_buffer); + ref2 = jit_bner_p(jit_forward(), JIT_V1, JIT_R2); + jit_stxi_i(&((Scheme_Thread *)0x0)->values_buffer, JIT_R0, JIT_R1); + CHECK_LIMIT(); + + /* evaluate remaining expressions */ + mz_patch_branch(ref); + mz_patch_branch(ref2); + __END_SHORT_JUMPS__(1); + for (i = 1; i < seq->count; i++) { + generate_non_tail(seq->array[i], jitter, 1, 1); + CHECK_LIMIT(); + } + + /* Restore values, if necessary */ + mz_popr_p(JIT_R0); + mz_popr_p(JIT_R1); + mz_popr_p(JIT_R2); + CHECK_LIMIT(); + __START_SHORT_JUMPS__(1); + ref = jit_bnei_p(jit_forward(), JIT_R0, 0x0); + CHECK_LIMIT(); + jit_ldi_p(JIT_R0, &scheme_current_thread); + jit_stxi_p(&((Scheme_Thread *)0x0)->ku.multiple.array, JIT_R0, JIT_R1); + jit_rshi_ul(JIT_R2, JIT_R2, 0x1); + jit_stxi_p(&((Scheme_Thread *)0x0)->ku.multiple.count, JIT_R0, JIT_R2); + (void)jit_movi_p(JIT_R0, SCHEME_MULTIPLE_VALUES); + + mz_patch_branch(ref); + __END_SHORT_JUMPS__(1); + + END_JIT_DATA(6); + } + break; + case SET_EXPD: + { + Scheme_Object *p, *v; + int pos, set_undef; + START_JIT_DATA(); + + p = SCHEME_IPTR_VAL(obj); + v = SCHEME_CAR(p); + set_undef = SCHEME_TRUEP(v); + p = SCHEME_CDR(p); + v = SCHEME_CAR(p); + p = SCHEME_CDR(p); + + generate_non_tail(p, jitter, 0, 1); + CHECK_LIMIT(); + + /* Load global+stx array: */ + pos = mz_remap(SCHEME_TOPLEVEL_DEPTH(v)); + jit_ldxi_p(JIT_R2, JIT_RUNSTACK, WORDS_TO_BYTES(pos)); + /* Try already-renamed stx: */ + pos = SCHEME_TOPLEVEL_POS(v); + jit_ldxi_p(JIT_R2, JIT_R2, WORDS_TO_BYTES(pos)); + CHECK_LIMIT(); + + /* R0 has values, R2 has pos */ + JIT_UPDATE_THREAD_RSPTR_IF_NEEDED(); + mz_prepare(4); + (void)jit_movi_i(JIT_R1, set_undef); + jit_pusharg_p(JIT_R1); + jit_pusharg_p(JIT_R0); + jit_pusharg_p(JIT_R2); + CHECK_LIMIT(); + (void)jit_movi_i(JIT_R1, "set!"); + jit_pusharg_p(JIT_R1); + (void)mz_finish(scheme_set_global_bucket); + CHECK_LIMIT(); + (void)jit_movi_p(JIT_R0, scheme_void); + END_JIT_DATA(7); + } + break; + case BOXENV_EXPD: + { + Scheme_Object *p, *v; + int pos; + START_JIT_DATA(); + + JIT_UPDATE_THREAD_RSPTR_IF_NEEDED(); + + p = (Scheme_Object *)SCHEME_IPTR_VAL(obj); + v = SCHEME_CAR(p); + pos = mz_remap(SCHEME_INT_VAL(v)); + p = SCHEME_CDR(p); + + jit_ldxi_p(JIT_R2, JIT_RUNSTACK, WORDS_TO_BYTES(pos)); + mz_prepare(1); + jit_pusharg_p(JIT_R2); + (void)mz_finish(scheme_make_envunbox); + jit_retval(JIT_R0); + jit_stxi_p(WORDS_TO_BYTES(pos), JIT_RUNSTACK, JIT_R0); + CHECK_LIMIT(); + + generate(p, jitter, is_tail, multi_ok); + + END_JIT_DATA(8); + } + break; + case BOXVAL_EXPD: + { + Scheme_Object *p, *v; + int pos, cnt; + START_JIT_DATA(); + + p = (Scheme_Object *)SCHEME_IPTR_VAL(obj); + v = SCHEME_CAR(p); + pos = SCHEME_INT_VAL(v); + p = SCHEME_CDR(p); + v = SCHEME_CAR(p); + cnt = SCHEME_INT_VAL(v); + p = SCHEME_CDR(p); + + /* cnt is expected number of returns, and it will be + consistent with multi_ok; do something only if the actual + count is the same as cnt */ + + generate_non_tail(p, jitter, cnt != 1, 1); + CHECK_LIMIT(); + + JIT_UPDATE_THREAD_RSPTR_IF_NEEDED(); + + if (cnt != 1) { + jit_insn *ref, *ref2, *ref3; + + __START_SHORT_JUMPS__(1); + ref = jit_bnei_p(jit_forward(), JIT_R0, SCHEME_MULTIPLE_VALUES); + /* Handle multiple values: */ + jit_ldi_p(JIT_R2, &scheme_current_thread); + jit_ldxi_i(JIT_R1, JIT_R2, &((Scheme_Thread *)0x0)->ku.multiple.count); + ref3 = jit_bnei_p(jit_forward(), JIT_R1, cnt); + CHECK_LIMIT(); + /* Received results match expected results */ + (void)jit_movi_i(JIT_R0, pos); + mz_prepare(1); + jit_pusharg_p(JIT_R0); + (void)mz_finish(box_multiple_array_element); + CHECK_LIMIT(); + (void)jit_movi_p(JIT_R0, SCHEME_MULTIPLE_VALUES); + + /* Jump over single-value handling: */ + ref2 = jit_jmpi(jit_forward()); + CHECK_LIMIT(); + + /* Handle single value: */ + mz_patch_branch(ref); + mz_prepare(1); + jit_pusharg_p(JIT_R0); + (void)mz_finish(scheme_make_envunbox); + CHECK_LIMIT(); + jit_retval(JIT_R0); + mz_patch_ucbranch(ref2); + mz_patch_branch(ref3); + CHECK_LIMIT(); + __END_SHORT_JUMPS__(1); + } else { + mz_prepare(1); + jit_pusharg_p(JIT_R0); + (void)mz_finish(scheme_make_envunbox); + jit_retval(JIT_R0); + } + + END_JIT_DATA(9); + } + break; + case QUOTE_SYNTAX_EXPD: + { + int i, c, p; + START_JIT_DATA(); + + obj = SCHEME_IPTR_VAL(obj); + i = SCHEME_INT_VAL(SCHEME_CAR(obj)); + c = mz_remap(SCHEME_INT_VAL(SCHEME_CADR(obj))); + p = SCHEME_INT_VAL(SCHEME_CDDR(obj)); + + jit_movi_i(JIT_R0, WORDS_TO_BYTES(c)); + jit_movi_i(JIT_R1, WORDS_TO_BYTES(i + p + 1)); + jit_movi_i(JIT_R2, WORDS_TO_BYTES(p)); + (void)jit_calli(quote_syntax_code); + + END_JIT_DATA(10); + } + break; + default: + { + JIT_UPDATE_THREAD_RSPTR_IF_NEEDED(); + obj = SCHEME_IPTR_VAL(obj); + (void)jit_movi_p(JIT_R2, obj); /* !! */ + CHECK_LIMIT(); + mz_prepare(1); + jit_pusharg_p(JIT_R2); + (void)mz_finish(scheme_syntax_executers[pos]); + CHECK_LIMIT(); + jit_retval(JIT_R0); + } + } + return 1; + } + case scheme_application_type: + { + Scheme_App_Rec *app = (Scheme_App_Rec *)obj; + + return generate_app(app, NULL, app->num_args, jitter, is_tail, multi_ok); + } + case scheme_application2_type: + { + Scheme_App2_Rec *app = (Scheme_App2_Rec *)obj; + Scheme_Object *args[2]; + int r; + + r = generate_inlined_unary(jitter, app, is_tail, multi_ok); + if (r) + return r; + + CHECK_LIMIT(); + + args[0] = app->rator; + args[1] = app->rand; + + return generate_app(NULL, args, 1, jitter, is_tail, multi_ok); + } + case scheme_application3_type: + { + Scheme_App3_Rec *app = (Scheme_App3_Rec *)obj; + Scheme_Object *args[3]; + int r; + + r = generate_inlined_binary(jitter, app, is_tail, multi_ok); + if (r) + return r; + + CHECK_LIMIT(); + + args[0] = app->rator; + args[1] = app->rand1; + args[2] = app->rand2; + + return generate_app(NULL, args, 2, jitter, is_tail, multi_ok); + } + case scheme_sequence_type: + { + Scheme_Sequence *seq = (Scheme_Sequence *)obj; + int cnt = seq->count, i; + START_JIT_DATA(); + + for (i = 0; i < cnt - 1; i++) { + generate_non_tail(seq->array[i], jitter, 1, 1); + CHECK_LIMIT(); + } + + END_JIT_DATA(11); + + return generate(seq->array[cnt - 1], jitter, is_tail, multi_ok); + } + case scheme_branch_type: + { + Scheme_Branch_Rec *branch = (Scheme_Branch_Rec *)obj; + jit_insn *ref, *ref2; + int nsrs, nsrs1, g1, g2, amt; + START_JIT_DATA(); +#ifdef MZ_USE_JIT_PPC + int then_short_ok, else_short_ok; + /* It's possible that the code for a then + or else branch will be so large that we might + need a long jump. Conservatively analyze the + `then' and `else' expressions. */ + then_short_ok = (is_short(branch->tbranch, 32) > 0); + else_short_ok = (is_short(branch->fbranch, 32) > 0); +#endif + + generate_non_tail(branch->test, jitter, 0, 1); + CHECK_LIMIT(); + __START_SHORT_JUMPS__(then_short_ok); + ref = jit_beqi_p(jit_forward(), JIT_R0, scheme_false); + __END_SHORT_JUMPS__(then_short_ok); + + /* True branch */ + mz_runstack_saved(jitter); + nsrs = jitter->need_set_rs; + PAUSE_JIT_DATA(); + g1 = generate(branch->tbranch, jitter, is_tail, multi_ok); + RESUME_JIT_DATA(); + CHECK_LIMIT(); + amt = mz_runstack_restored(jitter); + if (g1 != 2) { + if (amt && !is_tail) { + jit_addi_p(JIT_RUNSTACK, JIT_RUNSTACK, WORDS_TO_BYTES(amt)); + } + __START_SHORT_JUMPS__(else_short_ok); + ref2 = jit_jmpi(jit_forward()); + __END_SHORT_JUMPS__(else_short_ok); + nsrs1 = jitter->need_set_rs; + } else { + ref2 = 0; + nsrs1 = 0; + } + jitter->need_set_rs = nsrs; + + /* False branch */ + mz_runstack_saved(jitter); + __START_SHORT_JUMPS__(then_short_ok); + mz_patch_branch(ref); + __END_SHORT_JUMPS__(then_short_ok); + PAUSE_JIT_DATA(); + g2 = generate(branch->fbranch, jitter, is_tail, multi_ok); + RESUME_JIT_DATA(); + CHECK_LIMIT(); + amt = mz_runstack_restored(jitter); + if (g2 != 2) { + if (amt && !is_tail) { + jit_addi_p(JIT_RUNSTACK, JIT_RUNSTACK, WORDS_TO_BYTES(amt)); + } + } else { + jitter->need_set_rs = 0; + } + if (g1 != 2) { + __START_SHORT_JUMPS__(else_short_ok); + mz_patch_ucbranch(ref2); + __END_SHORT_JUMPS__(else_short_ok); + } + + END_JIT_DATA(12); + + /* Return result */ + + if ((g1 == 2) && (g2 == 2)) + return 2; + + if (nsrs1) + jitter->need_set_rs = 1; + + return 1; + } + case scheme_unclosed_procedure_type: + { + Scheme_Closure_Data *data = (Scheme_Closure_Data *)obj; + START_JIT_DATA(); + + /* Allocate closure */ + generate_closure(data, jitter); + CHECK_LIMIT(); + + generate_closure_fill(data, jitter); + + END_JIT_DATA(13); + return 0; + } + case scheme_let_value_type: + { + Scheme_Let_Value *lv = (Scheme_Let_Value *)obj; + int ab = SCHEME_LET_AUTOBOX(lv), i, pos; + START_JIT_DATA(); + + if (lv->count == 1) { + /* Expect one result: */ + generate_non_tail(lv->value, jitter, 0, 1); + if (ab) { + pos = mz_remap(lv->position); + jit_ldxi_p(JIT_R2, JIT_RUNSTACK, WORDS_TO_BYTES(pos)); + jit_str_p(JIT_R2, JIT_R0); + } else { + pos = mz_remap(lv->position); + jit_stxi_p(WORDS_TO_BYTES(pos), JIT_RUNSTACK, JIT_R0); + } + CHECK_LIMIT(); + } else { + /* Expect multiple results: */ + jit_insn *ref, *ref2, *ref3; + + generate_non_tail(lv->value, jitter, 1, 1); + CHECK_LIMIT(); + + __START_SHORT_JUMPS__(1); + + /* Did we get multiple results? If not, go to error: */ + ref = jit_bnei_p(jit_forward(), JIT_R0, SCHEME_MULTIPLE_VALUES); + /* Load count and result array: */ + jit_ldi_p(JIT_R2, &scheme_current_thread); + jit_ldxi_i(JIT_R1, JIT_R2, &((Scheme_Thread *)0x0)->ku.multiple.count); + jit_ldxi_i(JIT_R2, JIT_R2, &((Scheme_Thread *)0x0)->ku.multiple.array); + CHECK_LIMIT(); + /* If we got the expected count, jump to installing values: */ + ref2 = jit_beqi_i(jit_forward(), JIT_R1, lv->count); + /* Otherwise, jump to error: */ + ref3 = jit_jmpi(jit_forward()); + CHECK_LIMIT(); + + /* Jump here when we didn't get multiple values. Set count to 1 + and "array" to single value: */ + mz_patch_branch(ref); + jit_movi_i(JIT_R1, 1); + jit_movr_i(JIT_R2, JIT_R0); + CHECK_LIMIT(); + + /* Error starts here: */ + mz_patch_ucbranch(ref3); + JIT_UPDATE_THREAD_RSPTR_FOR_BRANCH_IF_NEEDED(); + mz_prepare(5); + (void)jit_movi_p(JIT_V1, "lexical binding"); + jit_pusharg_p(JIT_V1); + jit_pusharg_p(JIT_R2); + jit_pusharg_i(JIT_R1); + CHECK_LIMIT(); + jit_movi_i(JIT_V1, lv->count); + jit_pusharg_i(JIT_V1); + (void)jit_movi_p(JIT_V1, NULL); + jit_pusharg_i(JIT_V1); + (void)mz_finish(scheme_wrong_return_arity); + CHECK_LIMIT(); + + /* Continue with expected values; R2 has value array: */ + mz_patch_branch(ref2); + __END_SHORT_JUMPS__(1); + for (i = 0; i < lv->count; i++) { + jit_ldxi_p(JIT_R1, JIT_R2, WORDS_TO_BYTES(i)); + if (ab) { + pos = mz_remap(lv->position + i); + jit_ldxi_p(JIT_R0, JIT_RUNSTACK, WORDS_TO_BYTES(pos)); + jit_str_p(JIT_R0, JIT_R1); + } else { + pos = mz_remap(lv->position + i); + jit_stxi_p(WORDS_TO_BYTES(pos), JIT_RUNSTACK, JIT_R1); + } + CHECK_LIMIT(); + } + } + + END_JIT_DATA(14); + + return generate(lv->body, jitter, is_tail, multi_ok); + } + case scheme_let_void_type: + { + Scheme_Let_Void *lv = (Scheme_Let_Void *)obj; + int c = lv->count; + START_JIT_DATA(); + + jit_subi_p(JIT_RUNSTACK, JIT_RUNSTACK, WORDS_TO_BYTES(c)); + mz_runstack_pushed(jitter, c); + + if (SCHEME_LET_AUTOBOX(lv)) { + int i; + JIT_UPDATE_THREAD_RSPTR_IF_NEEDED(); + for (i = 0; i < c; i++) { + CHECK_LIMIT(); + (void)jit_movi_p(JIT_R0, scheme_undefined); + mz_prepare(1); + jit_pusharg_p(JIT_R0); + (void)mz_finish(scheme_make_envunbox); + jit_retval(JIT_R0); + jit_stxi_p(WORDS_TO_BYTES(i), JIT_RUNSTACK, JIT_R0); + } + } + CHECK_LIMIT(); + + END_JIT_DATA(15); + + return generate(lv->body, jitter, is_tail, multi_ok); + } + case scheme_letrec_type: + { + Scheme_Letrec *l = (Scheme_Letrec *)obj; + int i; + START_JIT_DATA(); + + /* Create unfinished closures */ + for (i = 0; i < l->count; i++) { + generate_closure((Scheme_Closure_Data *)l->procs[i], jitter); + CHECK_LIMIT(); + jit_stxi_p(WORDS_TO_BYTES(i), JIT_RUNSTACK, JIT_R0); + } + + /* Close them: */ + for (i = l->count; i--; ) { + if (i != l->count - 1) { + /* Last one we created is still in JIT_R0: */ + jit_ldxi_p(JIT_R0, JIT_RUNSTACK, WORDS_TO_BYTES(i)); + } + generate_closure_fill((Scheme_Closure_Data *)l->procs[i], jitter); + CHECK_LIMIT(); + } + + END_JIT_DATA(16); + + return generate(l->body, jitter, is_tail, multi_ok); + } + case scheme_let_one_type: + { + Scheme_Let_One *lv = (Scheme_Let_One *)obj; + START_JIT_DATA(); + + jit_subi_p(JIT_RUNSTACK, JIT_RUNSTACK, WORDS_TO_BYTES(1)); + mz_runstack_pushed(jitter, 1); + + PAUSE_JIT_DATA(); + generate_non_tail(lv->value, jitter, 0, 1); + RESUME_JIT_DATA(); + CHECK_LIMIT(); + jit_str_p(JIT_RUNSTACK, JIT_R0); + + END_JIT_DATA(17); + + return generate(lv->body, jitter, is_tail, multi_ok); + } + case scheme_with_cont_mark_type: + { + Scheme_With_Continuation_Mark *wcm = (Scheme_With_Continuation_Mark *)obj; + START_JIT_DATA(); + + /* Key: */ + generate_non_tail(wcm->key, jitter, 0, 1); + CHECK_LIMIT(); + if (SCHEME_TYPE(obj) > _scheme_values_types_) { + /* No need to push mark onto value stack: */ + jit_movr_p(JIT_V1, JIT_R0); + generate_non_tail(wcm->val, jitter, 0, 1); + } else { + mz_pushr_p(JIT_R0); /* !!!!!!! */ + generate_non_tail(wcm->val, jitter, 0, 1); + CHECK_LIMIT(); + mz_popr_p(JIT_V1); + } + + JIT_UPDATE_THREAD_RSPTR_IF_NEEDED(); + + mz_prepare(2); + jit_pusharg_p(JIT_R0); + jit_pusharg_p(JIT_V1); + (void)mz_finish(scheme_set_cont_mark); + CHECK_LIMIT(); + + END_JIT_DATA(18); + + return generate(wcm->body, jitter, is_tail, multi_ok); + } + default: + { + Scheme_Type type = SCHEME_TYPE(obj); + START_JIT_DATA(); + + /* Avoid compiling closures multiple times: */ + if (jitter->retain_start) { + if (type == scheme_closure_type) { + /* Empty closure? If so, compile the code and get a native closure: */ + Scheme_Closure *c = (Scheme_Closure *)obj; + if (ZERO_SIZED_CLOSUREP(c)) + obj = scheme_jit_closure((Scheme_Object *)c->code); + } else if (type == scheme_case_closure_type) { + /* Empty case closure? Turn in into a JITted empty case closure. */ + obj = scheme_unclose_case_lambda(obj, 1); + } + } + + if (!SCHEME_INTP(obj) + && !SAME_OBJ(obj, scheme_true) + && !SAME_OBJ(obj, scheme_false) + && !SAME_OBJ(obj, scheme_void) + && !SAME_OBJ(obj, scheme_null)) { + mz_retain(obj); + } + (void)jit_movi_p(JIT_R0, obj); /* !! */ + + END_JIT_DATA(19); + return 1; + } + } +} + +/*========================================================================*/ +/* procedure codegen */ +/*========================================================================*/ + +static void generate_function_prolog(mz_jit_state *jitter, void *code, int max_let_depth) +{ + int in; + START_JIT_DATA(); + + jit_prolog(3); + + in = jit_arg_p(); + jit_getarg_p(JIT_R0, in); /* closure */ + in = jit_arg_i(); + jit_getarg_i(JIT_R1, in); /* argc */ + in = jit_arg_p(); + jit_getarg_p(JIT_R2, in); /* argv */ + + jit_ldi_p(JIT_RUNSTACK, &MZ_RUNSTACK); + + END_JIT_DATA(1); +} + +static int generate_function_getarg(mz_jit_state *jitter, int has_rest, int num_params) +{ + int i, cnt; + jit_insn *ref; + int set_ref; + + mz_push_local_p(JIT_RUNSTACK, JIT_LOCAL1); + + /* If rands == runstack and there are no rest args, set runstack + base to runstack + rands (and don't copy rands), otherwise set + base to runstack and proceed normally. Implement this by + optimisitcally assuming rands == runstack, so that there's just + one jump. Skip this optimization when the procedure has + rest args, because we'll have to copy anyway. */ + if (!has_rest && num_params) { + jit_lshi_i(JIT_RUNSTACK_BASE, JIT_R1, JIT_LOG_WORD_SIZE); + jit_addr_p(JIT_RUNSTACK_BASE, JIT_R2, JIT_RUNSTACK_BASE); + __START_SHORT_JUMPS__(num_params < 100); + ref = jit_beqr_p(jit_forward(), JIT_RUNSTACK, JIT_R2); + __END_SHORT_JUMPS__(num_params < 100); + set_ref = 1; + } else { + ref = 0; + set_ref = 0; + } + jit_movr_p(JIT_RUNSTACK_BASE, JIT_RUNSTACK); + + /* Make stack room for arguments: */ + cnt = num_params; + if (cnt) { + CHECK_LIMIT(); + jit_subi_p(JIT_RUNSTACK, JIT_RUNSTACK, WORDS_TO_BYTES(cnt)); + if (has_rest) + --cnt; + } + + /* Extract arguments to runstack: */ + for (i = cnt; i--; ) { + jit_ldxi_p(JIT_V1, JIT_R2, WORDS_TO_BYTES(i)); + jit_stxi_p(WORDS_TO_BYTES(i), JIT_RUNSTACK, JIT_V1); + CHECK_LIMIT(); + } + + if (set_ref) { + __START_SHORT_JUMPS__(num_params < 100); + mz_patch_branch(ref); + __END_SHORT_JUMPS__(num_params < 100); + } + + return cnt; +} + +static int do_generate_common(mz_jit_state *jitter, void *_data) +{ + int in, i; + GC_CAN_IGNORE jit_insn *ref, *ref2; + + /* *** jump_to_native_code *** */ + /* Called as a function: */ + jump_to_native_code = jit_get_ip().ptr; + jit_prolog(3); + in = jit_arg_p(); + jit_getarg_p(JIT_R0, in); /* closure */ + in = jit_arg_p(); + jit_getarg_i(JIT_R1, in); /* argc */ + in = jit_arg_p(); + jit_getarg_i(JIT_R2, in); /* argv */ + CHECK_LIMIT(); + jit_movr_p(JIT_RUNSTACK, JIT_R2); + jit_movr_p(JIT_RUNSTACK_BASE, JIT_R2); + mz_push_local_p(JIT_RUNSTACK, JIT_LOCAL1); + jit_ldxi_p(JIT_V1, JIT_R0, &((Scheme_Native_Closure *)0x0)->code); + jit_ldxi_p(JIT_V1, JIT_V1, &((Scheme_Native_Closure_Data *)0x0)->arity_code); + jit_jmpr(JIT_V1); + CHECK_LIMIT(); + + /* *** check_arity_code *** */ + /* Called as a function: */ + check_arity_code = (Native_Check_Arity_Proc)jit_get_ip().ptr; + jit_prolog(2); + in = jit_arg_p(); + jit_getarg_p(JIT_R0, in); /* closure */ + in = jit_arg_p(); + jit_getarg_i(JIT_R2, in); /* argc */ + jit_movi_i(JIT_R1, -1); + jit_ldxi_p(JIT_V1, JIT_R0, &((Scheme_Native_Closure *)0x0)->code); + jit_ldxi_i(JIT_V1, JIT_V1, &((Scheme_Native_Closure_Data *)0x0)->arity_code); + jit_jmpr(JIT_V1); + CHECK_LIMIT(); + + /* *** check_arity_code *** */ + /* Called as a function: */ + get_arity_code = (Native_Get_Arity_Proc)jit_get_ip().ptr; + jit_prolog(1); + in = jit_arg_p(); + jit_getarg_p(JIT_R0, in); /* closure */ + jit_movi_i(JIT_R1, -1); + jit_movi_i(JIT_R2, 0x0); + jit_ldxi_p(JIT_V1, JIT_R0, &((Scheme_Native_Closure *)0x0)->code); + jit_ldxi_i(JIT_V1, JIT_V1, &((Scheme_Native_Closure_Data *)0x0)->arity_code); + jit_jmpr(JIT_V1); + CHECK_LIMIT(); + + /* *** bad_result_arity_code *** */ + /* Jumped-to from non-tail contexts */ + bad_result_arity_code = (Native_Get_Arity_Proc)jit_get_ip().ptr; + jit_ldi_p(JIT_R2, &scheme_current_thread); + jit_ldxi_i(JIT_R1, JIT_R2, &((Scheme_Thread *)0x0)->ku.multiple.count); + jit_ldxi_i(JIT_R2, JIT_R2, &((Scheme_Thread *)0x0)->ku.multiple.array); + CHECK_LIMIT(); + mz_prepare(5); + (void)jit_movi_p(JIT_V1, NULL); + jit_pusharg_p(JIT_V1); + jit_pusharg_p(JIT_R2); + jit_pusharg_i(JIT_R1); + CHECK_LIMIT(); + jit_movi_i(JIT_V1, 1); + jit_pusharg_i(JIT_V1); + (void)jit_movi_p(JIT_V1, NULL); + jit_pusharg_i(JIT_V1); + (void)mz_finish(scheme_wrong_return_arity); + CHECK_LIMIT(); + + /* *** unbound_global_code *** */ + unbound_global_code = jit_get_ip().ptr; + JIT_UPDATE_THREAD_RSPTR(); + mz_prepare(1); + jit_pusharg_p(JIT_R2); + (void)mz_finish(scheme_unbound_global); + CHECK_LIMIT(); + + /* *** quote_syntax_code *** */ + /* R0 is WORDS_TO_BYTES(c), R1 is WORDS_TO_BYTES(i+p+1), R2 is WORDS_TO_BYTES(p) */ + quote_syntax_code = jit_get_ip().ptr; + mz_prolog(JIT_V1); + __START_SHORT_JUMPS__(1); + /* Load global array: */ + jit_ldxr_p(JIT_V1, JIT_RUNSTACK, JIT_R0); + /* Load syntax object: */ + jit_ldxr_p(JIT_R0, JIT_V1, JIT_R1); + /* Is it null? */ + ref = jit_bnei_p(jit_forward(), JIT_R0, 0x0); + CHECK_LIMIT(); + /* Syntax object is NULL, so we need to create it. */ + jit_ldxr_p(JIT_R0, JIT_V1, JIT_R2); /* put element at p in R0 */ + /* Save global array: */ + mz_push_local_p(JIT_V1, JIT_LOCAL3); + /* Compute i in JIT_V1: */ + jit_subr_p(JIT_V1, JIT_R1, JIT_R2); + jit_subi_p(JIT_V1, JIT_V1, WORDS_TO_BYTES(1)); + CHECK_LIMIT(); + /* Load car & cdr of elements at p: */ + jit_ldxi_p(JIT_R2, JIT_R0, &SCHEME_CAR((Scheme_Object *)0x0)); + jit_ldxi_p(JIT_R0, JIT_R0, &SCHEME_CDR((Scheme_Object *)0x0)); + jit_ldxr_p(JIT_R0, JIT_R0, JIT_V1); + /* Move R1 to V1 to save it: */ + jit_movr_p(JIT_V1, JIT_R1); + /* Call scheme_add_rename: */ + JIT_UPDATE_THREAD_RSPTR(); + CHECK_LIMIT(); + mz_prepare(2); + jit_pusharg_p(JIT_R2); + jit_pusharg_p(JIT_R0); + (void)mz_finish(scheme_add_rename); + CHECK_LIMIT(); + jit_retval(JIT_R0); + /* Restore global array into JIT_R1, and put computed element at i+p+1: */ + mz_pop_local_p(JIT_R1, JIT_LOCAL3); + jit_stxr_p(JIT_V1, JIT_R1, JIT_R0); + mz_patch_branch(ref); + __END_SHORT_JUMPS__(1); + mz_epilog(JIT_V1); + + /* *** bad_{car,cdr}_code *** */ + /* Non-pair is in R0 */ + for (i = 0; i < 2; i++) { + if (!i) { + bad_car_code = jit_get_ip().ptr; + } else { + bad_cdr_code = jit_get_ip().ptr; + } + jit_subi_p(JIT_RUNSTACK, JIT_RUNSTACK, WORDS_TO_BYTES(1)); + jit_str_p(JIT_RUNSTACK, JIT_R0); + JIT_UPDATE_THREAD_RSPTR(); + CHECK_LIMIT(); + jit_movi_i(JIT_R1, 1); + jit_prepare(2); + jit_pusharg_p(JIT_RUNSTACK); + jit_pusharg_i(JIT_R1); + if (!i) { + (void)jit_finish(((Scheme_Primitive_Proc *)scheme_car_prim)->prim_val); + } else { + (void)jit_finish(((Scheme_Primitive_Proc *)scheme_cdr_prim)->prim_val); + } + CHECK_LIMIT(); + } + + /* *** call_original_[{reversed,single}_]code *** */ + /* R0 is constant arg, R1 is arg, R2 is code pointer */ + { + int cnt; + for (i = 0; i < 3; i++) { + if (!i) { + call_original_code = jit_get_ip().ptr; + cnt = 2; + } else if (i == 1) { + call_original_reversed_code = jit_get_ip().ptr; + cnt = 2; + } else { + call_original_single_code = jit_get_ip().ptr; + cnt = 1; + } + + mz_prolog(JIT_V1); + jit_subi_p(JIT_RUNSTACK, JIT_RUNSTACK, WORDS_TO_BYTES(cnt)); + if (!i) { + jit_str_p(JIT_RUNSTACK, JIT_R0); + jit_stxi_p(WORDS_TO_BYTES(1), JIT_RUNSTACK, JIT_R1); + } else if (i == 1) { + jit_str_p(JIT_RUNSTACK, JIT_R1); + jit_stxi_p(WORDS_TO_BYTES(1), JIT_RUNSTACK, JIT_R0); + } else { + jit_str_p(JIT_RUNSTACK, JIT_R1); + } + CHECK_LIMIT(); + JIT_UPDATE_THREAD_RSPTR(); + jit_movi_i(JIT_R1, cnt); + CHECK_LIMIT(); + mz_prepare(2); + jit_pusharg_p(JIT_RUNSTACK); + jit_pusharg_p(JIT_R1); + (void)mz_finishr(JIT_R2); + CHECK_LIMIT(); + jit_retval(JIT_R0); + jit_addi_p(JIT_RUNSTACK, JIT_RUNSTACK, WORDS_TO_BYTES(cnt)); + JIT_UPDATE_THREAD_RSPTR(); + mz_epilog(JIT_V1); + CHECK_LIMIT(); + } + } + + /* *** on_demand_jit_[arity_]code *** */ + /* 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 */ + on_demand_jit_code = jit_get_ip().ptr; + jit_prolog(3); + in = jit_arg_p(); + jit_getarg_p(JIT_R0, in); /* closure */ + in = jit_arg_i(); + jit_getarg_i(JIT_R1, in); /* argc */ + in = jit_arg_p(); + jit_getarg_p(JIT_R2, in); /* argv */ + CHECK_LIMIT(); + jit_ldi_p(JIT_RUNSTACK, &MZ_RUNSTACK); + mz_push_local_p(JIT_RUNSTACK, JIT_LOCAL1); + on_demand_jit_arity_code = jit_get_ip().ptr; /* <<<- arity variant starts here */ + jit_subi_p(JIT_RUNSTACK, JIT_RUNSTACK, WORDS_TO_BYTES(3)); + jit_str_p(JIT_RUNSTACK, JIT_R0); + jit_lshi_ul(JIT_R1, JIT_R1, 0x1); + jit_ori_ul(JIT_R1, JIT_R1, 0x1); + CHECK_LIMIT(); + jit_stxi_p(WORDS_TO_BYTES(1), JIT_RUNSTACK, JIT_R1); + jit_stxi_p(WORDS_TO_BYTES(2), JIT_RUNSTACK, JIT_R2); + JIT_UPDATE_THREAD_RSPTR(); + (void)jit_calli(on_demand); + CHECK_LIMIT(); + /* Restore registers and runstack, and jump to arity checking + of newly-created code when argv == runstack (i.e., a tail call): */ + jit_ldr_p(JIT_R0, JIT_RUNSTACK); + jit_ldxi_p(JIT_R1, JIT_RUNSTACK, WORDS_TO_BYTES(1)); + jit_rshi_ul(JIT_R1, JIT_R1, 0x1); + jit_ldxi_p(JIT_R2, JIT_RUNSTACK, WORDS_TO_BYTES(2)); + jit_addi_p(JIT_RUNSTACK, JIT_RUNSTACK, WORDS_TO_BYTES(3)); + CHECK_LIMIT(); + ref = jit_bner_p(jit_forward(), JIT_RUNSTACK, JIT_R2); + /* Also, check that the runstack is big enough with the revised + max_let_depth. We can use JIT_V2 here because RUNSTACK_BASE isnot + yet ready: */ + jit_ldxi_p(JIT_V1, JIT_R0, &((Scheme_Native_Closure *)0x0)->code); + jit_ldxi_i(JIT_V1, JIT_V1, &((Scheme_Native_Closure_Data *)0x0)->max_let_depth); + jit_ldi_p(JIT_V2, &MZ_RUNSTACK_START); + jit_subr_ul(JIT_V2, JIT_RUNSTACK, JIT_V2); + ref2 = jit_bltr_ul(jit_forward(), JIT_V2, JIT_V1); + CHECK_LIMIT(); + /* This is the tail-call fast path: */ + jit_ldxi_p(JIT_V1, JIT_R0, &((Scheme_Native_Closure *)0x0)->code); + jit_ldxi_p(JIT_V1, JIT_V1, &((Scheme_Native_Closure_Data *)0x0)->arity_code); + /* Set runstack base to end of arguments on runstack: */ + jit_movr_p(JIT_RUNSTACK_BASE, JIT_R1); + jit_lshi_ul(JIT_RUNSTACK_BASE, JIT_RUNSTACK_BASE, JIT_LOG_WORD_SIZE); + jit_addr_p(JIT_RUNSTACK_BASE, JIT_RUNSTACK_BASE, JIT_RUNSTACK); + jit_jmpr(JIT_V1); + CHECK_LIMIT(); + /* Slower path (non-tail) when argv != runstack. To simulate + a tail call, we must decrement the cont-mark pos. */ + mz_patch_branch(ref); + mz_patch_branch(ref2); + jit_ldi_i(JIT_V1, &scheme_current_cont_mark_pos); + jit_subi_i(JIT_V1, JIT_V1, 2); + jit_sti_i(&scheme_current_cont_mark_pos, JIT_V1); + CHECK_LIMIT(); + mz_prepare(3); + jit_pusharg_p(JIT_R2); + jit_pusharg_p(JIT_R1); + jit_pusharg_p(JIT_R0); + (void)jit_finish(_scheme_apply_multi_from_native); + CHECK_LIMIT(); + jit_ldi_i(JIT_NOT_RET, &scheme_current_cont_mark_pos); + jit_addi_i(JIT_NOT_RET, JIT_NOT_RET, 2); + jit_sti_i(&scheme_current_cont_mark_pos, JIT_NOT_RET); + mz_pop_local_p(JIT_NOT_RET, JIT_LOCAL1); + jit_ret(); + CHECK_LIMIT(); + + /* *** get_stack_pointer_code *** */ + get_stack_pointer_code = jit_get_ip().ptr; + jit_leaf(0); + jit_movr_p(JIT_R0, JIT_STACK_FRAME); + /* Get frame pointer of caller... */ +#ifdef MZ_USE_JIT_PPC + jit_ldr_p(JIT_R0, JIT_R0); +#endif +#ifdef MZ_USE_JIT_I386 + jit_ldr_p(JIT_R0, JIT_R0); +#endif + jit_movr_p(JIT_RET, JIT_R0); + jit_ret(); + CHECK_LIMIT(); + + /* *** stack_cache_pop_code *** */ + stack_cache_pop_code = jit_get_ip().ptr; + jit_movr_p(JIT_R0, JIT_RET); + /* Decrement stack_cache_stack_pos */ + jit_ldi_i(JIT_R1, &stack_cache_stack_pos); + jit_subi_i(JIT_R2, JIT_R1, 1); + jit_sti_p(&stack_cache_stack_pos, JIT_R2); + CHECK_LIMIT(); + /* Extract old return address and jump to it */ + jit_lshi_i(JIT_R1, JIT_R1, (JIT_LOG_WORD_SIZE + 2)); + jit_addi_i(JIT_R1, JIT_R1, (int)&((Stack_Cache_Elem *)0x0)->orig_return_address); + (void)jit_movi_p(JIT_R2, &stack_cache_stack); + jit_ldxr_p(JIT_R2, JIT_R2, JIT_R1); + jit_movr_p(JIT_RET, JIT_R0); + jit_jmpr(JIT_R2); + CHECK_LIMIT(); + + return 1; +} + +typedef struct { + Scheme_Closure_Data *data; + void *code, *tail_code, *code_end; + int max_extra, max_depth; +} Generate_Closure_Data; + +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 *code, *tail_code, *code_end; + int i, r, cnt; + + code = jit_get_ip().ptr; + + generate_function_prolog(jitter, code, + /* max_extra_pushed may be wrong the first time around, + but it will be right the last time around */ + WORDS_TO_BYTES(data->max_let_depth + jitter->max_extra_pushed)); + CHECK_LIMIT(); + + cnt = generate_function_getarg(jitter, + (SCHEME_CLOSURE_DATA_FLAGS(data) & CLOS_HAS_REST), + data->num_params); + CHECK_LIMIT(); + + /* A tail call starts here. Caller must ensure that the + stack is big enough, right number of arguments, closure + is in R0. */ + tail_code = jit_get_ip().ptr; + + /* 0 params and has_rest => (lambda args E) where args is not in E, + so accept any number of arguments and ignore them. */ + + if ((SCHEME_CLOSURE_DATA_FLAGS(data) & CLOS_HAS_REST) + && data->num_params) { + /* If runstack == argv and argc == cnt, then we didn't + copy args down, and we need to make room for scheme_null. */ + jit_insn *ref, *ref2, *ref3; + + CHECK_LIMIT(); + + __START_SHORT_JUMPS__(cnt < 100); + + ref = jit_bner_p(jit_forward(), JIT_RUNSTACK, JIT_R2); + ref3 = jit_bgti_p(jit_forward(), JIT_R1, cnt); + jit_subi_p(JIT_RUNSTACK, JIT_RUNSTACK, WORDS_TO_BYTES(cnt+1)); + for (i = cnt; i--; ) { + jit_ldxi_p(JIT_V1, JIT_R2, WORDS_TO_BYTES(i)); + jit_stxi_p(WORDS_TO_BYTES(i), JIT_RUNSTACK, JIT_V1); + CHECK_LIMIT(); + } + (void)jit_movi_p(JIT_V1, scheme_null); + jit_stxi_p(WORDS_TO_BYTES(cnt), JIT_RUNSTACK, JIT_V1); + ref2 = jit_jmpi(jit_forward()); + CHECK_LIMIT(); + + /* Build a list for extra arguments: */ + mz_patch_branch(ref); + mz_patch_branch(ref3); + if (data->closure_size) + mz_pushr_p(JIT_R0); + JIT_UPDATE_THREAD_RSPTR(); + CHECK_LIMIT(); + mz_prepare(3); + jit_movi_i(JIT_V1, cnt); + jit_pusharg_i(JIT_V1); + jit_pusharg_p(JIT_R2); + jit_pusharg_i(JIT_R1); + CHECK_LIMIT(); + (void)mz_finish(scheme_build_list_offset); + jit_retval(JIT_V1); + if (data->closure_size) + mz_popr_p(JIT_R0); + jit_stxi_p(WORDS_TO_BYTES(cnt), JIT_RUNSTACK, JIT_V1); + mz_patch_ucbranch(ref2); /* jump here if we copied and produced null */ + CHECK_LIMIT(); + + __END_SHORT_JUMPS__(cnt < 100); + } + + /* Extract closure to runstack: */ + cnt = data->closure_size; + if (cnt) { + jit_subi_p(JIT_RUNSTACK, JIT_RUNSTACK, WORDS_TO_BYTES(cnt)); + + for (i = cnt; i--; ) { + int pos; + pos = WORDS_TO_BYTES(i) + (long)&((Scheme_Native_Closure *)0x0)->vals; + jit_ldxi_p(JIT_R1, JIT_R0, pos); + jit_stxi_p(WORDS_TO_BYTES(i), JIT_RUNSTACK, JIT_R1); + CHECK_LIMIT(); + } + } + + /* Generate code for the body: */ + jitter->need_set_rs = 1; + r = generate(data->code, jitter, 1, 1); + /* Result is in JIT_R0 */ + + CHECK_LIMIT(); + + /* r == 2 => tail call performed */ + if (r != 2) { + mz_pop_local_p(JIT_RUNSTACK, JIT_LOCAL1); + jit_sti_p(&MZ_RUNSTACK, JIT_RUNSTACK); + jit_movr_p(JIT_RET, JIT_R0); + jit_ret(); + } + + code_end = jit_get_ip().ptr; + + gdata->code = code; + gdata->tail_code = tail_code; + gdata->max_extra = jitter->max_extra_pushed; + gdata->max_depth = jitter->max_depth; + gdata->code_end = code_end; + + return 1; +} + +static void on_demand_generate_top(Scheme_Native_Closure_Data *ndata) +{ + Scheme_Closure_Data *data; + Generate_Closure_Data gdata; + void *code, *tail_code, *arity_code; + int has_rest, is_method, num_params, max_depth; + + data = ndata->u2.orig_code; + + gdata.data = data; + + generate_one(NULL, do_generate_closure, &gdata, 1, data->name); + + if (gdata.max_depth > data->max_let_depth) { + scheme_console_printf("Bad max depth!\n"); + abort(); + } + + code = gdata.code; + tail_code = gdata.tail_code; + + if (data->name) { + add_symbol((unsigned long)code, (unsigned long)gdata.code_end - 1, data->name, 1); + } + + has_rest = ((SCHEME_CLOSURE_DATA_FLAGS(data) & CLOS_HAS_REST) ? 1 : 0); + is_method = ((SCHEME_CLOSURE_DATA_FLAGS(data) & CLOS_IS_METHOD) ? 1 : 0); + num_params = data->num_params; + if (num_params && has_rest) + --num_params; + + if (num_params < MAX_SHARED_ARITY_CHECK) { + arity_code = shared_arity_check[num_params][has_rest][is_method]; + if (!arity_code) { + arity_code = generate_top_simple_arity_check(num_params, has_rest, is_method, 1); + shared_arity_check[num_params][has_rest][is_method] = arity_code; + } + } else + arity_code = generate_top_simple_arity_check(num_params, has_rest, is_method, 0); + + max_depth = WORDS_TO_BYTES(data->max_let_depth + gdata.max_extra); + + /* max_let_depth is used for flags by generate_top: */ + if (ndata->max_let_depth & 0x1) { + data->code = NULL; + } + if (ndata->max_let_depth & 0x2) { + Scheme_Native_Closure_Data *case_lam; + case_lam = ((Scheme_Native_Closure_Data_Plus_Case *)ndata)->case_lam; + if (case_lam->max_let_depth < max_depth) + case_lam->max_let_depth = max_depth; + } + + ndata->code = code; + ndata->u.tail_code = tail_code; + ndata->arity_code = arity_code; + ndata->u2.name = data->name; + /* Let-depth is in bytes instead of words: */ + ndata->max_let_depth = max_depth; +} + +static void on_demand() +{ + /* On runstack: closure (nearest), argc, argv (deepest) */ + Scheme_Object *c, *argc, **argv; + Scheme_Native_Closure_Data *ndata; + + c = MZ_RUNSTACK[0]; + argc = MZ_RUNSTACK[1]; + argv = (Scheme_Object **)MZ_RUNSTACK[2]; + + ndata = ((Scheme_Native_Closure *)c)->code; + on_demand_generate_top(ndata); +} + +Scheme_Native_Closure_Data *scheme_generate_lambda(Scheme_Closure_Data *data, int clear_code_after_jit, + Scheme_Native_Closure_Data *case_lam) +{ + Scheme_Native_Closure_Data *ndata; + + if (!jump_to_native_code) { + /* Create shared code used for stack-overflow handling, etc.: */ + generate_one(NULL, do_generate_common, NULL, 0, NULL); + } + + if (!case_lam) { + ndata = MALLOC_ONE_RT(Scheme_Native_Closure_Data); + } else { + Scheme_Native_Closure_Data_Plus_Case *ndatap; + ndatap = MALLOC_ONE_RT(Scheme_Native_Closure_Data_Plus_Case); + ndatap->case_lam = case_lam; + ndata = (Scheme_Native_Closure_Data *)ndatap; + } + ndata->code = on_demand_jit_code; + ndata->u.tail_code = on_demand_jit_arity_code; + ndata->arity_code = on_demand_jit_arity_code; + ndata->u2.orig_code = data; + ndata->closure_size = data->closure_size; + ndata->max_let_depth = 0x4 | (case_lam ? 0x2 : 0) | (clear_code_after_jit ? 0x1 : 0); + +#if 0 + /* Compile immediately: */ + on_demand_generate_top(ndata); +#endif + + return ndata; +} + +static int generate_simple_arity_check(mz_jit_state *jitter, int num_params, int has_rest, int is_method) +{ + /* JIT_R0 is closure */ + /* JIT_R1 is argc */ + /* JIT_R2 is argv */ + /* If arity matches, JIT_RUNSTACK and JIT_RUNSTACK_BASE should be preserved */ + /* That leaves just JIT_V1 to use if airty is ok. */ + + jit_insn *ref, *ref2; + + __START_SHORT_JUMPS__(1); + + if (!has_rest) + ref = jit_bnei_i(jit_forward(), JIT_R1, num_params); + else + ref = jit_blti_i(jit_forward(), JIT_R1, num_params); + + jit_ldxi_p(JIT_V1, JIT_R0, &((Scheme_Native_Closure *)0x0)->code); + jit_ldxi_i(JIT_V1, JIT_V1, &((Scheme_Native_Closure_Data *)0x0)->u.tail_code); + jit_jmpr(JIT_V1); + CHECK_LIMIT(); + + /* Failed */ + mz_patch_branch(ref); + + /* If argc is negative, this was really a request for arity checking or reporting */ + ref = jit_blti_i(jit_forward(), JIT_R1, 0x0); + + /* Not negative, so report run-time arity mismatch */ + mz_prepare(5); + jit_pusharg_p(JIT_R2); + jit_pusharg_p(JIT_R1); + jit_movi_i(JIT_V1, -1); + CHECK_LIMIT(); + jit_pusharg_i(JIT_V1); + jit_pusharg_i(JIT_V1); + jit_pusharg_p(JIT_R0); + (void)mz_finish(scheme_wrong_count); + CHECK_LIMIT(); + + /* Arity check or reporting. If argv is NULL, it's a reporting request */ + mz_patch_branch(ref); + ref = jit_beqi_i(jit_forward(), JIT_R2, 0x0); + + /* Arity check --- try again with argv cast to argc: */ + jit_subi_i(JIT_R2, JIT_R2, 1); + if (!has_rest) + ref2 = jit_bnei_i(jit_forward(), JIT_R2, num_params); + else + ref2 = jit_blti_i(jit_forward(), JIT_R2, num_params); + CHECK_LIMIT(); + jit_movi_i(JIT_RET, 1); + jit_ret(); + mz_patch_branch(ref2); + jit_movi_i(JIT_RET, 0); + jit_ret(); + CHECK_LIMIT(); + + /* Finally, we know that it was an arity-report request */ + mz_patch_branch(ref); + if (!has_rest) + (void)jit_movi_p(JIT_R0, scheme_make_integer(num_params)); + else + (void)jit_movi_p(JIT_R0, scheme_make_integer(-(num_params+1))); + CHECK_LIMIT(); + if (is_method) { + mz_prepare(1); + jit_pusharg_p(JIT_R0); + (void)mz_finish(scheme_box); + jit_ret(); + } else { + jit_movr_p(JIT_RET, JIT_R0); + jit_ret(); + } + + __END_SHORT_JUMPS__(1); + + return 1; +} + +typedef struct { + int num_params; + int has_rest; + int is_method; +} Generate_Arity_Check_Data; + +static int do_generate_top_simple_arity_check(mz_jit_state *jitter, void *_data) +{ + Generate_Arity_Check_Data *data = (Generate_Arity_Check_Data *)_data; + +#ifdef MZ_USE_JIT_PPC + jitter->js.jitl.nbArgs = 2; /* matches check_arity_code prolog */ +#endif + + return generate_simple_arity_check(jitter, data->num_params, data->has_rest, data->is_method); +} + +static void *generate_top_simple_arity_check(int num_params, int has_rest, int is_method, int permanent) +{ + Generate_Arity_Check_Data data; + + data.num_params = num_params; + data.has_rest = has_rest; + data.is_method = is_method; + + return generate_one(NULL, do_generate_top_simple_arity_check, &data, !permanent, NULL); +} + +int generate_case_lambda_dispatch(mz_jit_state *jitter, Scheme_Case_Lambda *c, Scheme_Native_Closure_Data *ndata, + int do_getarg) +{ + /* See top of generate_simple_arity_check for register info. */ + Scheme_Closure_Data *data; + Scheme_Object *o; + int i, cnt, has_rest, offset, num_params; + jit_insn *ref = NULL; + + cnt = c->count; + for (i = 0; i < cnt; i++) { + /* Check arity for this case: */ + o = c->array[i]; + if (SCHEME_PROCP(o)) + o = (Scheme_Object *)((Scheme_Closure *)o)->code; + data = (Scheme_Closure_Data *)o; + + num_params = data->num_params; + has_rest = ((SCHEME_CLOSURE_DATA_FLAGS(data) & CLOS_HAS_REST) ? 1 : 0); + if (has_rest && num_params) + --num_params; + + /* Check for arity match - not needed in getarg mode if this + is the last case, since the arity check as already done. */ + if (!do_getarg || (i < cnt - 1)) { + if (!has_rest) + ref = jit_bnei_i(jit_forward(), JIT_R1, num_params); + else + ref = jit_blti_i(jit_forward(), JIT_R1, num_params); + } + + /* Function-argument handling for this case: */ + if (do_getarg) { + generate_function_getarg(jitter, has_rest, num_params + (has_rest ? 1 : 0)); + CHECK_LIMIT(); + } + + /* Jump to tail-code location of the selected branch: */ + offset = WORDS_TO_BYTES(i) + (unsigned long)&((Scheme_Native_Closure *)0x0)->vals; + jit_ldxi_p(JIT_R0, JIT_R0, offset); + jit_ldxi_p(JIT_V1, JIT_R0, &((Scheme_Native_Closure *)0x0)->code); + jit_ldxi_i(JIT_V1, JIT_V1, &((Scheme_Native_Closure_Data *)0x0)->u.tail_code); + jit_jmpr(JIT_V1); + CHECK_LIMIT(); + + if (!do_getarg || (i < cnt - 1)) { + mz_patch_branch(ref); + } + /* Try the next one... */ + } + + if (!do_getarg) { + /* Report run-time arity mismatch */ + JIT_UPDATE_THREAD_RSPTR(); + mz_prepare(5); + jit_pusharg_p(JIT_R2); + jit_pusharg_p(JIT_R1); + jit_movi_i(JIT_V1, -1); + CHECK_LIMIT(); + jit_pusharg_i(JIT_V1); + jit_pusharg_i(JIT_V1); + jit_pusharg_p(JIT_R0); + (void)mz_finish(scheme_wrong_count); + CHECK_LIMIT(); + } + + return 1; +} + +typedef struct { + Scheme_Case_Lambda *c; + Scheme_Native_Closure_Data *ndata; + int is_method; +} Generate_Case_Dispatch_Data; + +static int do_generate_case_lambda_dispatch(mz_jit_state *jitter, void *_data) +{ + Generate_Case_Dispatch_Data *data = (Generate_Case_Dispatch_Data *)_data; + void *code, *arity_code; + + code = jit_get_ip().ptr; + + generate_function_prolog(jitter, 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; + if (generate_case_lambda_dispatch(jitter, data->c, data->ndata, 0)) { + data->ndata->code = code; + data->ndata->arity_code = arity_code; + + return 1; + } + } + + return 0; +} + +static void generate_top_case_lambda_dispatch(Scheme_Case_Lambda *c, Scheme_Native_Closure_Data *ndata, int is_method) +{ + Generate_Case_Dispatch_Data gdata; + Scheme_Closure_Data *data; + Scheme_Object *o; + int i, cnt, num_params, has_rest; + mzshort *arities; + + gdata.c = c; + gdata.ndata = ndata; + gdata.is_method = is_method; + + generate_one(NULL, do_generate_case_lambda_dispatch, &gdata, 1, NULL); + + /* Generate arity table used by scheme_native_arity_check + and scheme_get_native_arity: */ + + cnt = c->count; + arities = (mzshort *)scheme_malloc_atomic(sizeof(mzshort) * (cnt + 1)); + arities[cnt] = is_method; + for (i = 0; i < cnt; i++) { + o = c->array[i]; + if (SCHEME_PROCP(o)) + o = (Scheme_Object *)((Scheme_Closure *)o)->code; + data = (Scheme_Closure_Data *)o; + num_params = data->num_params; + has_rest = ((SCHEME_CLOSURE_DATA_FLAGS(data) & CLOS_HAS_REST) ? 1 : 0); + if (has_rest && num_params) + --num_params; + + if (!has_rest) + arities[i] = num_params; + else + arities[i] = -(num_params+1); + } + ndata->u.arities = arities; +} + +/*========================================================================*/ +/* native arity queries */ +/*========================================================================*/ + +int scheme_native_arity_check(Scheme_Object *closure, int argc) +{ + int cnt; + + cnt = ((Scheme_Native_Closure *)closure)->code->closure_size; + if (cnt < 0) { + /* Case-lambda */ + int i; + mzshort *arities, v; + + arities = ((Scheme_Native_Closure *)closure)->code->u.arities; + cnt = -(cnt + 1); + for (i = 0; i < cnt; i++) { + v = arities[i]; + if (v < 0) { + v = -(v + 1); + if (argc >= v) + return 1; + } else if (argc == v) + return 1; + } + return 0; + } + + if (((Scheme_Native_Closure *)closure)->code->code == on_demand_jit_code) { + Scheme_Closure c; + c.so.type = scheme_closure_type; + c.code = ((Scheme_Native_Closure *)closure)->code->u2.orig_code; + return SCHEME_TRUEP(scheme_get_or_check_arity((Scheme_Object *)&c, argc)); + } + + return check_arity_code(closure, argc + 1); +} + +Scheme_Object *scheme_get_native_arity(Scheme_Object *closure) +{ + int cnt; + + cnt = ((Scheme_Native_Closure *)closure)->code->closure_size; + if (cnt < 0) { + /* Case-lambda */ + Scheme_Object *l = scheme_null, *a; + int i, has_rest, is_method; + mzshort *arities, v; + + arities = ((Scheme_Native_Closure *)closure)->code->u.arities; + cnt = -(cnt + 1); + is_method = arities[cnt]; + for (i = cnt; i--; ) { + v = arities[i]; + if (v < 0) { + v = -(v + 1); + has_rest = 1; + } else + has_rest = 0; + if (is_method && v) + --v; + a = scheme_make_arity(v, has_rest ? -1 : v); + l = scheme_make_pair(a, l); + } + if (is_method) + l = scheme_box(l); + return l; + } + + if (((Scheme_Native_Closure *)closure)->code->code == on_demand_jit_code) { + Scheme_Closure c; + c.so.type = scheme_closure_type; + c.code = ((Scheme_Native_Closure *)closure)->code->u2.orig_code; + return scheme_get_or_check_arity((Scheme_Object *)&c, -1); + } + + return get_arity_code(closure); +} + +/*========================================================================*/ +/* stack trace */ +/*========================================================================*/ + +typedef void *(*Get_Stack_Proc)(); + +#ifdef MZ_USE_JIT_PPC +# ifdef _CALL_DARWIN +# define RETURN_ADDRESS_OFFSET 2 +# else +# define RETURN_ADDRESS_OFFSET 1 +# endif +#endif +#ifdef MZ_USE_JIT_I386 +# define RETURN_ADDRESS_OFFSET 1 +#endif + +#define CACHE_STACK_MIN_TRIGGER 1024 + +#define USE_STACK_CHECK 0 + +#if USE_STACK_CHECK +static void check_stack(void) +{ + void *p, *q; + unsigned long stack_end; + int pos = stack_cache_stack_pos; + Get_Stack_Proc gs; + + gs = (Get_Stack_Proc)get_stack_pointer_code; + p = gs(); + + stack_end = (unsigned long)(scheme_current_thread->next + ? scheme_current_thread->stack_start + : scheme_current_thread->o_start); + + while (STK_COMP((unsigned long)p, stack_end)) { + q = ((void **)p)[RETURN_ADDRESS_OFFSET]; + + if (q == stack_cache_pop_code) { + if (!pos) + *(long *)0x0 = 1; + else { + if (stack_cache_stack[pos].stack_frame != (void *)(((void **)p) + RETURN_ADDRESS_OFFSET)) { + *(long *)0X0 = 1; + } + --pos; + } + } + + q = *(void **)p; + if (STK_COMP((unsigned long)q, (unsigned long)p)) + break; + p = q; + } +} +#endif + +unsigned long scheme_approx_sp() +{ + unsigned long p; + p = (unsigned long)&p; + return p; +} + +Scheme_Object *scheme_native_stack_trace(void) +{ + void *p, *q; + unsigned long stack_end, stack_start, halfway; + Get_Stack_Proc gs; + Scheme_Object *name, *last = NULL, *first = NULL, *tail; + int set_next_push = 0, prev_had_name = 0; + + if (!get_stack_pointer_code) + return NULL; + +#if USE_STACK_CHECK + check_stack(); +#endif + + gs = (Get_Stack_Proc)get_stack_pointer_code; + p = gs(); + stack_start = scheme_approx_sp(); + + if (stack_cache_stack_pos) { + stack_end = (unsigned long)stack_cache_stack[stack_cache_stack_pos].stack_frame; + stack_end -= (RETURN_ADDRESS_OFFSET << JIT_LOG_WORD_SIZE); + tail = stack_cache_stack[stack_cache_stack_pos].cache; + } else { + stack_end = (unsigned long)(scheme_current_thread->next + ? scheme_current_thread->stack_start + : scheme_current_thread->o_start); + tail = scheme_null; + } + + halfway = STK_DIFF(stack_end, (unsigned long)p) / 2; + if (halfway < CACHE_STACK_MIN_TRIGGER) + halfway = stack_end; + else { +#ifdef STACK_GROWS_DOWN + halfway += (unsigned long)p; +#else + halfway += stack_end; +#endif + } + + while (STK_COMP((unsigned long)p, stack_end) + && STK_COMP(stack_start, (unsigned long)p)) { + q = ((void **)p)[RETURN_ADDRESS_OFFSET]; + + name = find_symbol((unsigned long)q); + if (SCHEME_FALSEP(name)) { + /* Code uses special calling convention */ +#ifdef MZ_USE_JIT_PPC + /* JIT_LOCAL2 has the next return address */ + q = ((void **)p)[JIT_LOCAL2 >> JIT_LOG_WORD_SIZE]; +#endif +#ifdef MZ_USE_JIT_I386 + /* 2nd push onto local stack of return-address proc + has the next return address */ + q = *(void **)p; + q = ((void **)q)[-5]; +#endif + name = find_symbol((unsigned long)q); + } + + if (name) { + name = scheme_make_pair(name, scheme_null); + if (last) + SCHEME_CDR(last) = name; + else + first = name; + last = name; + if (set_next_push) { + stack_cache_stack[stack_cache_stack_pos].cache = name; + set_next_push = 0; + } + } + + /* Cache the result halfway up the stack, if possible. Only cache + on frames where the previous frame had a return address with a + name, because an arbitrary frame's return address on the stack + might not be used (depending on how the C compiler optimized the + cdode); any frame whose procedure has a name is JITted code, so + it will use the return address from the stack. */ + if (STK_COMP((unsigned long)halfway, (unsigned long)p) + && prev_had_name) { + int pos; + + if (stack_cache_stack_pos >= (STACK_CACHE_SIZE - 1)) { + /* Make room on the stack */ + void **z; + z = (void **)stack_cache_stack[stack_cache_stack_pos].stack_frame; + *z = stack_cache_stack[stack_cache_stack_pos].orig_return_address; + --stack_cache_stack_pos; + } + + if (((void **)p)[RETURN_ADDRESS_OFFSET] == stack_cache_pop_code) { + *(long *)0x0 = 1; + } + + pos = ++stack_cache_stack_pos; + stack_cache_stack[pos].orig_return_address = ((void **)p)[RETURN_ADDRESS_OFFSET]; + stack_cache_stack[pos].stack_frame = (void *)(((void **)p) + RETURN_ADDRESS_OFFSET); + stack_cache_stack[pos].cache = tail; + set_next_push = 1; + ((void **)p)[RETURN_ADDRESS_OFFSET] = stack_cache_pop_code; + + halfway = stack_end; + } + + prev_had_name = !!name; + + q = *(void **)p; + if (STK_COMP((unsigned long)q, (unsigned long)p)) + break; + p = q; + } + + if (last) + SCHEME_CDR(last) = tail; + else + first = tail; + + if (SCHEME_NULLP(first)) + return NULL; + + return first; +} + +void scheme_flush_stack_cache() +{ + void **p; + + while (stack_cache_stack_pos) { + p = (void **)stack_cache_stack[stack_cache_stack_pos].stack_frame; + *p = stack_cache_stack[stack_cache_stack_pos].orig_return_address; + --stack_cache_stack_pos; + } +} + +void scheme_jit_longjmp(mz_jit_jmp_buf b, int v) +{ + unsigned long limit; + void **p; + + limit = (unsigned long)b->stack_frame; + + while (stack_cache_stack_pos + && STK_COMP((unsigned long)stack_cache_stack[stack_cache_stack_pos].stack_frame, + limit)) { + p = (void **)stack_cache_stack[stack_cache_stack_pos].stack_frame; + *p = stack_cache_stack[stack_cache_stack_pos].orig_return_address; + --stack_cache_stack_pos; + } + + scheme_mz_longjmp(b->jb, v); +} + +void scheme_jit_setjmp_prepare(mz_jit_jmp_buf b) +{ + void *p; + p = &p; + b->stack_frame = p; +} + +void scheme_clean_native_symtab(void) +{ + clear_symbols_for_collected(); +} + +#endif /* MZ_USE_JIT */ diff --git a/src/mzscheme/src/lightning/README b/src/mzscheme/src/lightning/README new file mode 100644 index 0000000000..d8010e542d --- /dev/null +++ b/src/mzscheme/src/lightning/README @@ -0,0 +1,10 @@ + +This version of lightning version 1.2 is slightly modified for +MzScheme. + +For PowerPC, branches can be generated in long-jump mode, so that +patched addresses are not limited to a 2^16 or 2^26 difference from +the current program counter. + +For PowerPC, arguments are extracted directly from the original +registers by getarg. diff --git a/src/mzscheme/src/lightning/i386/asm-common.h b/src/mzscheme/src/lightning/i386/asm-common.h new file mode 100644 index 0000000000..42c8814a91 --- /dev/null +++ b/src/mzscheme/src/lightning/i386/asm-common.h @@ -0,0 +1,197 @@ +/******************************** -*- 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 2.1, 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, 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + ***********************************************************************/ + + +#ifndef __lightning_asm_common_h +#define __lightning_asm_common_h_ + + +#ifndef _ASM_SAFETY +#define JITFAIL(MSG) 0 +#else +#if defined __GNUC__ && (__GNUC__ == 3 ? __GNUC_MINOR__ >= 2 : __GNUC__ > 3) +#define JITFAIL(MSG) jit_fail(MSG, __FILE__, __LINE__, __func__) +#else +#define JITFAIL(MSG) jit_fail(MSG, __FILE__, __LINE__, __FUNCTION__) +#endif +#endif + +#if defined __GNUC__ && (__GNUC__ == 3 ? __GNUC_MINOR__ >= 2 : __GNUC__ > 3) +#define JITSORRY(MSG) jit_fail("sorry, unimplemented: " MSG, __FILE__, __LINE__, __func__) +#else +#define JITSORRY(MSG) jit_fail("sorry, unimplemented: " MSG, __FILE__, __LINE__, __FUNCTION__) +#endif + +#ifdef __GNUC__ +#define JIT_UNUSED __attribute__((unused)) +#else +#define JIT_UNUSED +#endif + + +/* 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 + +typedef char _sc; +typedef unsigned char _uc; +typedef unsigned short _us; +typedef unsigned int _ui; +typedef long _sl; +typedef unsigned long _ul; + +#define _jit_UC(X) ((_uc )(X)) +#define _jit_US(X) ((_us )(X)) +#define _jit_UI(X) ((_ui )(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 _PSL(X) ((_sl *)(X)) +# define _PUL(X) ((_ul *)(X)) + +#define _jit_B(B) _jit_UL(((*_jit.x.uc_pc++)= _jit_UC((B)& 0xff))) +#define _jit_W(W) _jit_UL(((*_jit.x.us_pc++)= _jit_US((W)&0xffff))) +#define _jit_I(I) _jit_UL(((*_jit.x.ui_pc++)= _jit_UI((I) ))) +#define _jit_L(L) _jit_UL(((*_jit.x.ul_pc++)= _jit_UL((L) ))) +#define _jit_I_noinc(I) _jit_UL(((*_jit.x.ui_pc)= _jit_UI((I) ))) + +#define _MASK(N) ((unsigned)((1<<(N)))-1) +#define _siP(N,I) (!((((unsigned)(I))^(((unsigned)(I))<<1))&~_MASK(N))) +#define _uiP(N,I) (!(((unsigned)(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 _u8P(I) _uiP(8,I) +#define _u16P(I) _uiP(16,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) +#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) + +#endif /* __lightning_asm_common_h */ diff --git a/src/mzscheme/src/lightning/i386/asm.h b/src/mzscheme/src/lightning/i386/asm.h new file mode 100644 index 0000000000..fcc364c05b --- /dev/null +++ b/src/mzscheme/src/lightning/i386/asm.h @@ -0,0 +1,1062 @@ +/******************************** -*- C -*- **************************** + * + * Run-time assembler for the i386 + * + ***********************************************************************/ + + +/*********************************************************************** + * + * Copyright 1999, 2000, 2001, 2002 Ian Piumarta + * + * 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 2.1, 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, 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + ***********************************************************************/ + + + + +#ifndef __lightning_asm_h +#define __lightning_asm_h + +/* OPCODE + i = immediate operand + * + r = register operand + * + m = memory operand (disp,base,index,scale) + * + sr/sm = a star preceding a register or memory + */ + + +typedef _uc jit_insn; + +#ifndef LIGHTNING_DEBUG +#define _b00 0 +#define _b01 1 +#define _b10 2 +#define _b11 3 + +#define _b000 0 +#define _b001 1 +#define _b010 2 +#define _b011 3 +#define _b100 4 +#define _b101 5 +#define _b110 6 +#define _b111 7 + +/*** REGISTERS ***/ /* [size,,number] */ + + +#define _AL 0x10 +#define _CL 0x11 +#define _DL 0x12 +#define _BL 0x13 +#define _AH 0x14 +#define _CH 0x15 +#define _DH 0x16 +#define _BH 0x17 + +#define _AX 0x20 +#define _CX 0x21 +#define _DX 0x22 +#define _BX 0x23 +#define _SP 0x24 +#define _BP 0x25 +#define _SI 0x26 +#define _DI 0x27 + +#define _EAX 0x40 +#define _ECX 0x41 +#define _EDX 0x42 +#define _EBX 0x43 +#define _ESP 0x44 +#define _EBP 0x45 +#define _ESI 0x46 +#define _EDI 0x47 + +#define _ST0 0 +#define _ST1 1 +#define _ST2 2 +#define _ST3 3 +#define _ST4 4 +#define _ST5 5 +#define _ST6 6 +#define _ST7 7 + +#define _rS(R) ((R)>>4) +#define _rN(R) ((R)&0x7) +#define _r0P(R) ((R)==0) + +#ifndef _ASM_SAFETY +#define _r1(R) _rN(R) +#define _r2(R) _rN(R) +#define _r4(R) _rN(R) +#else +#define _r1(R) ((_rS(R)==1) ? _rN(R) : JITFAIL( "8-bit register required")) +#define _r2(R) ((_rS(R)==2) ? _rN(R) : JITFAIL("16-bit register required")) +#define _r4(R) ((_rS(R)==4) ? _rN(R) : JITFAIL("32-bit register required")) +#endif + +/*** ASSEMBLER ***/ + +#define _OFF4(D) (_jit_UL(D) - _jit_UL(_jit.x.pc)) +#define _CKD8(D) _ck_d(8, ((_uc) _OFF4(D)) ) + +#define _D8(D) (_jit_B(0), ((*(_PUC(_jit.x.pc)-1))= _CKD8(D))) +#define _D32(D) (_jit_L(0), ((*(_PUL(_jit.x.pc)-1))= _OFF4(D))) + +#ifndef _ASM_SAFETY +# define _M(M) (M) +# define _r(R) (R) +# define _m(M) (M) +# define _s(S) (S) +# define _i(I) (I) +# define _b(B) (B) +# define _noESP(I,OK) (OK) +#else +# define _M(M) (((M)>3) ? JITFAIL("internal error: mod = " #M) : (M)) +# define _r(R) (((R)>7) ? JITFAIL("internal error: reg = " #R) : (R)) +# define _m(M) (((M)>7) ? JITFAIL("internal error: r/m = " #M) : (M)) +# define _s(S) (((S)>3) ? JITFAIL("internal error: memory scale = " #S) : (S)) +# define _i(I) (((I)>7) ? JITFAIL("internal error: memory index = " #I) : (I)) +# define _b(B) (((B)>7) ? JITFAIL("internal error: memory base = " #B) : (B)) +# define _noESP(I,OK) (((I)==_ESP) ? JITFAIL("illegal index register: %esp") : (OK)) +#endif + +#define _Mrm(Md,R,M) _jit_B((_M(Md)<<6)|(_r(R)<<3)|_m(M)) +#define _SIB(Sc,I, B) _jit_B((_s(Sc)<<6)|(_i(I)<<3)|_b(B)) + +#define _SCL(S) ((((S)==1) ? _b00 : \ + (((S)==2) ? _b01 : \ + (((S)==4) ? _b10 : \ + (((S)==8) ? _b11 : JITFAIL("illegal scale: " #S)))))) + +/* memory subformats - urgh! */ + +#define _r_D( R, D ) (_Mrm(_b00,_rN(R),_b101 ) ,_jit_L((long)(D))) +#define _r_0B( R, B ) (_Mrm(_b00,_rN(R),_r4(B)) ) +#define _r_0BIS(R, B,I,S) (_Mrm(_b00,_rN(R),_b100 ),_SIB(_SCL(S),_r4(I),_r4(B)) ) +#define _r_1B( R, D,B ) (_Mrm(_b01,_rN(R),_r4(B)) ,_jit_B((long)(D))) +#define _r_1BIS(R, D,B,I,S) (_Mrm(_b01,_rN(R),_b100 ),_SIB(_SCL(S),_r4(I),_r4(B)),_jit_B((long)(D))) +#define _r_4B( R, D,B ) (_Mrm(_b10,_rN(R),_r4(B)) ,_jit_L((long)(D))) +#define _r_4IS( R, D,I,S) (_Mrm(_b00,_rN(R),_b100 ),_SIB(_SCL(S),_r4(I),_b101 ),_jit_L((long)(D))) +#define _r_4BIS(R, D,B,I,S) (_Mrm(_b10,_rN(R),_b100 ),_SIB(_SCL(S),_r4(I),_r4(B)),_jit_L((long)(D))) + +#define _r_DB( R, D,B ) ((_s0P(D) && (B != _EBP) ? _r_0B (R, B ) : (_s8P(D) ? _r_1B( R,D,B ) : _r_4B( R,D,B )))) +#define _r_DBIS(R, D,B,I,S) ((_s0P(D) ? _r_0BIS(R, B,I,S) : (_s8P(D) ? _r_1BIS(R,D,B,I,S) : _r_4BIS(R,D,B,I,S)))) + +#define _r_X( R, D,B,I,S) (_r0P(I) ? (_r0P(B) ? _r_D (R,D ) : \ + (_ESP==(B) ? _r_DBIS(R,D,_ESP,_ESP,1) : \ + _r_DB (R,D, B ))) : \ + (_r0P(B) ? _r_4IS (R,D, I,S) : \ + (((I)!=_ESP) ? _r_DBIS(R,D, B, I,S) : \ + JITFAIL("illegal index register: %esp")))) + + +/* instruction formats */ + +/* _format Opcd ModR/M dN(rB,rI,Sc) imm... */ + +#define _d16() ( _jit_B(0x66 ) ) +#define _O( OP ) ( _jit_B( OP ) ) +#define _Or( OP,R ) ( _jit_B( (OP)|_r(R)) ) +#define _OO( OP ) ( _jit_B((OP)>>8), _jit_B( (OP) ) ) +#define _OOr( OP,R ) ( _jit_B((OP)>>8), _jit_B( (OP)|_r(R)) ) +#define _Os( OP,B ) ( _s8P(B) ? _jit_B(((OP)|_b10)) : _jit_B(OP) ) +#define _sW( W ) ( _s8P(W) ? _jit_B(W):_jit_W(W) ) +#define _sL( L ) ( _s8P(L) ? _jit_B(L):_jit_L(L) ) +#define _O_W( OP ,W ) ( _O ( OP ) ,_jit_W(W) ) +#define _O_D8( OP ,D ) ( _O ( OP ) ,_D8(D) ) +#define _O_D32( OP ,D ) ( _O ( OP ) ,_D32(D) ) +#define _OO_D32( OP ,D ) ( _OO ( OP ) ,_D32(D) ) +#define _Os_sW( OP ,W ) ( _Os ( OP,W) ,_sW(W) ) +#define _Os_sL( OP ,L ) ( _Os ( OP,L) ,_sL(L) ) +#define _O_W_B( OP ,W,B) ( _O ( OP ) ,_jit_W(W),_jit_B(B)) +#define _Or_B( OP,R ,B ) ( _Or ( OP,R) ,_jit_B(B) ) +#define _Or_W( OP,R ,W ) ( _Or ( OP,R) ,_jit_W(W) ) +#define _Or_L( OP,R ,L ) ( _Or ( OP,R) ,_jit_L(L) ) +#define _O_Mrm( OP ,MO,R,M ) ( _O ( OP ),_Mrm(MO,R,M ) ) +#define _OO_Mrm( OP ,MO,R,M ) ( _OO ( OP ),_Mrm(MO,R,M ) ) +#define _O_Mrm_B( OP ,MO,R,M ,B ) ( _O ( OP ),_Mrm(MO,R,M ) ,_jit_B(B) ) +#define _O_Mrm_W( OP ,MO,R,M ,W ) ( _O ( OP ),_Mrm(MO,R,M ) ,_jit_W(W) ) +#define _O_Mrm_L( OP ,MO,R,M ,L ) ( _O ( OP ),_Mrm(MO,R,M ) ,_jit_L(L) ) +#define _OO_Mrm_B( OP ,MO,R,M ,B ) ( _OO ( OP ),_Mrm(MO,R,M ) ,_jit_B(B) ) +#define _Os_Mrm_sW(OP ,MO,R,M ,W ) ( _Os ( OP,W),_Mrm(MO,R,M ),_sW(W) ) +#define _Os_Mrm_sL(OP ,MO,R,M ,L ) ( _Os ( OP,L),_Mrm(MO,R,M ),_sL(L) ) +#define _O_r_X( OP ,R ,MD,MB,MI,MS ) ( _O ( OP ),_r_X( R ,MD,MB,MI,MS) ) +#define _OO_r_X( OP ,R ,MD,MB,MI,MS ) ( _OO ( OP ),_r_X( R ,MD,MB,MI,MS) ) +#define _O_r_X_B( OP ,R ,MD,MB,MI,MS,B ) ( _O ( OP ),_r_X( R ,MD,MB,MI,MS) ,_jit_B(B) ) +#define _O_r_X_W( OP ,R ,MD,MB,MI,MS,W ) ( _O ( OP ),_r_X( R ,MD,MB,MI,MS) ,_jit_W(W) ) +#define _O_r_X_L( OP ,R ,MD,MB,MI,MS,L ) ( _O ( OP ),_r_X( R ,MD,MB,MI,MS) ,_jit_L(L) ) +#define _OO_r_X_B( OP ,R ,MD,MB,MI,MS,B ) ( _OO ( OP ),_r_X( R ,MD,MB,MI,MS) ,_jit_B(B) ) +#define _Os_r_X_sW(OP ,R ,MD,MB,MI,MS,W ) ( _Os ( OP,W),_r_X( R ,MD,MB,MI,MS),_sW(W) ) +#define _Os_r_X_sL(OP ,R ,MD,MB,MI,MS,L ) ( _Os ( OP,L),_r_X( R ,MD,MB,MI,MS),_sL(L) ) +#define _O_X_B( OP ,MD,MB,MI,MS,B ) ( _O_r_X_B( OP ,0 ,MD,MB,MI,MS ,B) ) +#define _O_X_W( OP ,MD,MB,MI,MS,W ) ( _O_r_X_W( OP ,0 ,MD,MB,MI,MS ,W) ) +#define _O_X_L( OP ,MD,MB,MI,MS,L ) ( _O_r_X_L( OP ,0 ,MD,MB,MI,MS ,L) ) +#define _wO( OP ) (_d16(), _O( OP ) ) +#define _wOr( OP,R ) (_d16(), _Or( OP,R ) ) +#define _wOr_W( OP,R ,W ) (_d16(), _Or_W( OP,R ,W) ) +#define _wOs_sW( OP ,W ) (_d16(), _Os_sW( OP ,W) ) +#define _wO_Mrm( OP ,MO,R,M ) (_d16(), _O_Mrm( OP ,MO,R,M ) ) +#define _wOO_Mrm( OP ,MO,R,M ) (_d16(),_OO_Mrm( OP ,MO,R,M ) ) +#define _wO_Mrm_B( OP ,MO,R,M ,B ) (_d16(), _O_Mrm_B( OP ,MO,R,M ,B) ) +#define _wOO_Mrm_B( OP ,MO,R,M ,B ) (_d16(),_OO_Mrm_B( OP ,MO,R,M ,B) ) +#define _wO_Mrm_W( OP ,MO,R,M ,W ) (_d16(), _O_Mrm_W( OP ,MO,R,M ,W) ) +#define _wOs_Mrm_sW(OP ,MO,R,M ,W ) (_d16(), _Os_Mrm_sW(OP ,MO,R,M ,W) ) +#define _wO_X_W( OP ,MD,MB,MI,MS,W ) (_d16(), _O_X_W( OP ,MD,MB,MI,MS ,W) ) +#define _wO_r_X( OP ,R ,MD,MB,MI,MS ) (_d16(), _O_r_X( OP ,R ,MD,MB,MI,MS ) ) +#define _wOO_r_X( OP ,R ,MD,MB,MI,MS ) (_d16(),_OO_r_X( OP ,R ,MD,MB,MI,MS ) ) +#define _wO_r_X_B( OP ,R ,MD,MB,MI,MS,B ) (_d16(), _O_r_X_B( OP ,R ,MD,MB,MI,MS ,B) ) +#define _wOO_r_X_B( OP ,R ,MD,MB,MI,MS,B ) (_d16(),_OO_r_X_B( OP ,R ,MD,MB,MI,MS ,B) ) +#define _wO_r_X_W( OP ,R ,MD,MB,MI,MS,W ) (_d16(), _O_r_X_W( OP ,R ,MD,MB,MI,MS ,W) ) +#define _wOs_r_X_sW(OP ,R ,MD,MB,MI,MS,W ) (_d16(), _Os_r_X_sW(OP ,R ,MD,MB,MI,MS ,W) ) + +/* +++ fully-qualified intrinsic instructions */ + +/* _format Opcd ,Mod ,r ,m ,mem=dsp+sib ,imm... */ + +#define ADCBrr(RS, RD) _O_Mrm (0x10 ,_b11,_r1(RS),_r1(RD) ) +#define ADCBmr(MD, MB, MI, MS, RD) _O_r_X (0x12 ,_r1(RD) ,MD,MB,MI,MS ) +#define ADCBrm(RS, MD, MB, MI, MS) _O_r_X (0x10 ,_r1(RS) ,MD,MB,MI,MS ) +#define ADCBir(IM, RD) _O_Mrm_B (0x80 ,_b11,_b010 ,_r1(RD) ,_su8(IM)) +#define ADCBim(IM, MD, MB, MI, MS) _O_r_X_B (0x80 ,_b010 ,MD,MB,MI,MS ,_su8(IM)) + +#define ADCWrr(RS, RD) _wO_Mrm (0x11 ,_b11,_r2(RS),_r2(RD) ) +#define ADCWmr(MD, MB, MI, MS, RD) _wO_r_X (0x13 ,_r2(RD) ,MD,MB,MI,MS ) +#define ADCWrm(RS, MD, MB, MI, MS) _wO_r_X (0x11 ,_r2(RS) ,MD,MB,MI,MS ) +#define ADCWir(IM, RD) _wOs_Mrm_sW (0x81 ,_b11,_b010 ,_r2(RD) ,_su16(IM)) +#define ADCWim(IM, MD, MB, MI, MS) _wOs_r_X_sW (0x81 ,_b010 ,MD,MB,MI,MS ,_su16(IM)) + +#define ADCLrr(RS, RD) _O_Mrm (0x11 ,_b11,_r4(RS),_r4(RD) ) +#define ADCLmr(MD, MB, MI, MS, RD) _O_r_X (0x13 ,_r4(RD) ,MD,MB,MI,MS ) +#define ADCLrm(RS, MD, MB, MI, MS) _O_r_X (0x11 ,_r4(RS) ,MD,MB,MI,MS ) +#define ADCLir(IM, RD) _Os_Mrm_sL (0x81 ,_b11,_b010 ,_r4(RD) ,IM ) +#define ADCLim(IM, MD, MB, MI, MS) _Os_r_X_sL (0x81 ,_b010 ,MD,MB,MI,MS ,IM ) + + +#define ADDBrr(RS, RD) _O_Mrm (0x00 ,_b11,_r1(RS),_r1(RD) ) +#define ADDBmr(MD, MB, MI, MS, RD) _O_r_X (0x02 ,_r1(RD) ,MD,MB,MI,MS ) +#define ADDBrm(RS, MD, MB, MI, MS) _O_r_X (0x00 ,_r1(RS) ,MD,MB,MI,MS ) +#define ADDBir(IM, RD) _O_Mrm_B (0x80 ,_b11,_b000 ,_r1(RD) ,_su8(IM)) +#define ADDBim(IM, MD, MB, MI, MS) _O_r_X_B (0x80 ,_b000 ,MD,MB,MI,MS ,_su8(IM)) + +#define ADDWrr(RS, RD) _wO_Mrm (0x01 ,_b11,_r2(RS),_r2(RD) ) +#define ADDWmr(MD, MB, MI, MS, RD) _wO_r_X (0x03 ,_r2(RD) ,MD,MB,MI,MS ) +#define ADDWrm(RS, MD, MB, MI, MS) _wO_r_X (0x01 ,_r2(RS) ,MD,MB,MI,MS ) +#define ADDWir(IM, RD) _wOs_Mrm_sW (0x81 ,_b11,_b000 ,_r2(RD) ,_su16(IM)) +#define ADDWim(IM, MD, MB, MI, MS) _wOs_r_X_sW (0x81 ,_b000 ,MD,MB,MI,MS ,_su16(IM)) + +#define ADDLrr(RS, RD) _O_Mrm (0x01 ,_b11,_r4(RS),_r4(RD) ) +#define ADDLmr(MD, MB, MI, MS, RD) _O_r_X (0x03 ,_r4(RD) ,MD,MB,MI,MS ) +#define ADDLrm(RS, MD, MB, MI, MS) _O_r_X (0x01 ,_r4(RS) ,MD,MB,MI,MS ) +#define ADDLir(IM, RD) _Os_Mrm_sL (0x81 ,_b11,_b000 ,_r4(RD) ,IM ) +#define ADDLim(IM, MD, MB, MI, MS) _Os_r_X_sL (0x81 ,_b000 ,MD,MB,MI,MS ,IM ) + + +#define ANDBrr(RS, RD) _O_Mrm (0x20 ,_b11,_r1(RS),_r1(RD) ) +#define ANDBmr(MD, MB, MI, MS, RD) _O_r_X (0x22 ,_r1(RD) ,MD,MB,MI,MS ) +#define ANDBrm(RS, MD, MB, MI, MS) _O_r_X (0x20 ,_r1(RS) ,MD,MB,MI,MS ) +#define ANDBir(IM, RD) _O_Mrm_B (0x80 ,_b11,_b100 ,_r1(RD) ,_su8(IM)) +#define ANDBim(IM, MD, MB, MI, MS) _O_r_X_B (0x80 ,_b100 ,MD,MB,MI,MS ,_su8(IM)) + +#define ANDWrr(RS, RD) _wO_Mrm (0x21 ,_b11,_r2(RS),_r2(RD) ) +#define ANDWmr(MD, MB, MI, MS, RD) _wO_r_X (0x23 ,_r2(RD) ,MD,MB,MI,MS ) +#define ANDWrm(RS, MD, MB, MI, MS) _wO_r_X (0x21 ,_r2(RS) ,MD,MB,MI,MS ) +#define ANDWir(IM, RD) _wOs_Mrm_sW (0x81 ,_b11,_b100 ,_r2(RD) ,_su16(IM)) +#define ANDWim(IM, MD, MB, MI, MS) _wOs_r_X_sW (0x81 ,_b100 ,MD,MB,MI,MS ,_su16(IM)) + +#define ANDLrr(RS, RD) _O_Mrm (0x21 ,_b11,_r4(RS),_r4(RD) ) +#define ANDLmr(MD, MB, MI, MS, RD) _O_r_X (0x23 ,_r4(RD) ,MD,MB,MI,MS ) +#define ANDLrm(RS, MD, MB, MI, MS) _O_r_X (0x21 ,_r4(RS) ,MD,MB,MI,MS ) +#define ANDLir(IM, RD) _Os_Mrm_sL (0x81 ,_b11,_b100 ,_r4(RD) ,IM ) +#define ANDLim(IM, MD, MB, MI, MS) _Os_r_X_sL (0x81 ,_b100 ,MD,MB,MI,MS ,IM ) + + +#define BSWAPLr(R) _OOr (0x0fc8,_r4(R) ) + + +#define BTWir(IM,RD) _wOO_Mrm_B (0x0fba ,_b11,_b100 ,_r2(RD) ,_u8(IM)) +#define BTWim(IM,MD,MB,MI,MS) _wOO_r_X_B (0x0fba ,_b100 ,MD,MB,MI,MS ,_u8(IM)) +#define BTWrr(RS,RD) _wOO_Mrm (0x0fa3 ,_b11,_r2(RS),_r2(RD) ) +#define BTWrm(RS,MD,MB,MI,MS) _wOO_r_X (0x0fa3 ,_r2(RS) ,MD,MB,MI,MS ) + +#define BTLir(IM,RD) _OO_Mrm_B (0x0fba ,_b11,_b100 ,_r4(RD) ,_u8(IM)) +#define BTLim(IM,MD,MB,MI,MS) _OO_r_X_B (0x0fba ,_b100 ,MD,MB,MI,MS ,_u8(IM)) +#define BTLrr(RS,RD) _OO_Mrm (0x0fa3 ,_b11,_r4(RS),_r4(RD) ) +#define BTLrm(RS,MD,MB,MI,MS) _OO_r_X (0x0fa3 ,_r4(RS) ,MD,MB,MI,MS ) + + +#define BTCWir(IM,RD) _wOO_Mrm_B (0x0fba ,_b11,_b111 ,_r2(RD) ,_u8(IM)) +#define BTCWim(IM,MD,MB,MI,MS) _wOO_r_X_B (0x0fba ,_b111 ,MD,MB,MI,MS ,_u8(IM)) +#define BTCWrr(RS,RD) _wOO_Mrm (0x0fbb ,_b11,_r2(RS),_r2(RD) ) +#define BTCWrm(RS,MD,MB,MI,MS) _wOO_r_X (0x0fbb ,_r2(RS) ,MD,MB,MI,MS ) + +#define BTCLir(IM,RD) _OO_Mrm_B (0x0fba ,_b11,_b111 ,_r4(RD) ,_u8(IM)) +#define BTCLim(IM,MD,MB,MI,MS) _OO_r_X_B (0x0fba ,_b111 ,MD,MB,MI,MS ,_u8(IM)) +#define BTCLrr(RS,RD) _OO_Mrm (0x0fbb ,_b11,_r4(RS),_r4(RD) ) +#define BTCLrm(RS,MD,MB,MI,MS) _OO_r_X (0x0fbb ,_r4(RS) ,MD,MB,MI,MS ) + + +#define BTRWir(IM,RD) _wOO_Mrm_B (0x0fba ,_b11,_b110 ,_r2(RD) ,_u8(IM)) +#define BTRWim(IM,MD,MB,MI,MS) _wOO_r_X_B (0x0fba ,_b110 ,MD,MB,MI,MS ,_u8(IM)) +#define BTRWrr(RS,RD) _wOO_Mrm (0x0fb3 ,_b11,_r2(RS),_r2(RD) ) +#define BTRWrm(RS,MD,MB,MI,MS) _wOO_r_X (0x0fb3 ,_r2(RS) ,MD,MB,MI,MS ) + +#define BTRLir(IM,RD) _OO_Mrm_B (0x0fba ,_b11,_b110 ,_r4(RD) ,_u8(IM)) +#define BTRLim(IM,MD,MB,MI,MS) _OO_r_X_B (0x0fba ,_b110 ,MD,MB,MI,MS ,_u8(IM)) +#define BTRLrr(RS,RD) _OO_Mrm (0x0fb3 ,_b11,_r4(RS),_r4(RD) ) +#define BTRLrm(RS,MD,MB,MI,MS) _OO_r_X (0x0fb3 ,_r4(RS) ,MD,MB,MI,MS ) + + +#define BTSWir(IM,RD) _wOO_Mrm_B (0x0fba ,_b11,_b101 ,_r2(RD) ,_u8(IM)) +#define BTSWim(IM,MD,MB,MI,MS) _wOO_r_X_B (0x0fba ,_b101 ,MD,MB,MI,MS ,_u8(IM)) +#define BTSWrr(RS,RD) _wOO_Mrm (0x0fab ,_b11,_r2(RS),_r2(RD) ) +#define BTSWrm(RS,MD,MB,MI,MS) _wOO_r_X (0x0fab ,_r2(RS) ,MD,MB,MI,MS ) + +#define BTSLir(IM,RD) _OO_Mrm_B (0x0fba ,_b11,_b101 ,_r4(RD) ,_u8(IM)) +#define BTSLim(IM,MD,MB,MI,MS) _OO_r_X_B (0x0fba ,_b101 ,MD,MB,MI,MS ,_u8(IM)) +#define BTSLrr(RS,RD) _OO_Mrm (0x0fab ,_b11,_r4(RS),_r4(RD) ) +#define BTSLrm(RS,MD,MB,MI,MS) _OO_r_X (0x0fab ,_r4(RS) ,MD,MB,MI,MS ) + + +#define CALLm(D,B,I,S) ((_r0P(B) && _r0P(I)) ? _O_D32 (0xe8 ,(int)(D) ) : \ + JITFAIL("illegal mode in direct jump")) + +#define CALLsr(R) _O_Mrm (0xff ,_b11,_b010,_r4(R) ) + +#define CALLsm(D,B,I,S) _O_r_X (0xff ,_b010 ,(int)(D),B,I,S ) + +#define CBW_() _O (0x98 ) +#define CLC_() _O (0xf8 ) +#define CLTD_() _O (0x99 ) +#define CMC_() _O (0xf5 ) + + +#define CMPBrr(RS, RD) _O_Mrm (0x38 ,_b11,_r1(RS),_r1(RD) ) +#define CMPBmr(MD, MB, MI, MS, RD) _O_r_X (0x3a ,_r1(RD) ,MD,MB,MI,MS ) +#define CMPBrm(RS, MD, MB, MI, MS) _O_r_X (0x38 ,_r1(RS) ,MD,MB,MI,MS ) +#define CMPBir(IM, RD) _O_Mrm_B (0x80 ,_b11,_b111 ,_r1(RD) ,_su8(IM)) +#define CMPBim(IM, MD, MB, MI, MS) _O_r_X_B (0x80 ,_b111 ,MD,MB,MI,MS ,_su8(IM)) + +#define CMPWrr(RS, RD) _wO_Mrm (0x39 ,_b11,_r2(RS),_r2(RD) ) +#define CMPWmr(MD, MB, MI, MS, RD) _wO_r_X (0x3b ,_r2(RD) ,MD,MB,MI,MS ) +#define CMPWrm(RS, MD, MB, MI, MS) _wO_r_X (0x39 ,_r2(RS) ,MD,MB,MI,MS ) +#define CMPWir(IM, RD) _wOs_Mrm_sW (0x81 ,_b11,_b111 ,_r2(RD) ,_su16(IM)) +#define CMPWim(IM, MD, MB, MI, MS) _wOs_r_X_sW (0x81 ,_b111 ,MD,MB,MI,MS ,_su16(IM)) + +#define CMPLrr(RS, RD) _O_Mrm (0x39 ,_b11,_r4(RS),_r4(RD) ) +#define CMPLmr(MD, MB, MI, MS, RD) _O_r_X (0x3b ,_r4(RD) ,MD,MB,MI,MS ) +#define CMPLrm(RS, MD, MB, MI, MS) _O_r_X (0x39 ,_r4(RS) ,MD,MB,MI,MS ) +#define CMPLir(IM, RD) _O_Mrm_L (0x81 ,_b11,_b111 ,_r4(RD) ,IM ) +#define CMPLim(IM, MD, MB, MI, MS) _O_r_X_L (0x81 ,_b111 ,MD,MB,MI,MS ,IM ) + + +#define CWD_() _O (0x99 ) + + +#define CMPXCHGBrr(RS,RD) _OO_Mrm (0x0fb0 ,_b11,_r1(RS),_r1(RD) ) +#define CMPXCHGBrm(RS,MD,MB,MI,MS) _OO_r_X (0x0fb0 ,_r1(RS) ,MD,MB,MI,MS ) + +#define CMPXCHGWrr(RS,RD) _wOO_Mrm (0x0fb1 ,_b11,_r2(RS),_r2(RD) ) +#define CMPXCHGWrm(RS,MD,MB,MI,MS) _wOO_r_X (0x0fb1 ,_r2(RS) ,MD,MB,MI,MS ) + +#define CMPXCHGLrr(RS,RD) _OO_Mrm (0x0fb1 ,_b11,_r4(RS),_r4(RD) ) +#define CMPXCHGLrm(RS,MD,MB,MI,MS) _OO_r_X (0x0fb1 ,_r4(RS) ,MD,MB,MI,MS ) + + +#define DECBr(RD) _O_Mrm (0xfe ,_b11,_b001 ,_r1(RD) ) +#define DECBm(MD,MB,MI,MS) _O_r_X (0xfe ,_b001 ,MD,MB,MI,MS ) + +#define DECWr(RD) _wOr (0x48,_r2(RD) ) +#define DECWm(MD,MB,MI,MS) _wO_r_X (0xff ,_b001 ,MD,MB,MI,MS ) + +#define DECLr(RD) _Or (0x48,_r4(RD) ) +#define DECLm(MD,MB,MI,MS) _O_r_X (0xff ,_b001 ,MD,MB,MI,MS ) + + +#define DIVBr(RS) _O_Mrm (0xf6 ,_b11,_b110 ,_r1(RS) ) +#define DIVBm(MD,MB,MI,MS) _O_r_X (0xf6 ,_b110 ,MD,MB,MI,MS ) + +#define DIVWr(RS) _wO_Mrm (0xf7 ,_b11,_b110 ,_r2(RS) ) +#define DIVWm(MD,MB,MI,MS) _wO_r_X (0xf7 ,_b110 ,MD,MB,MI,MS ) + +#define DIVLr(RS) _O_Mrm (0xf7 ,_b11,_b110 ,_r4(RS) ) +#define DIVLm(MD,MB,MI,MS) _O_r_X (0xf7 ,_b110 ,MD,MB,MI,MS ) + + +#define ENTERii(W, B) _O_W_B (0xc8 ,_su16(W),_su8(B)) +#define HLT_() _O (0xf4 ) + + +#define IDIVBr(RS) _O_Mrm (0xf6 ,_b11,_b111 ,_r1(RS) ) +#define IDIVBm(MD,MB,MI,MS) _O_r_X (0xf6 ,_b111 ,MD,MB,MI,MS ) + +#define IDIVWr(RS) _wO_Mrm (0xf7 ,_b11,_b111 ,_r2(RS) ) +#define IDIVWm(MD,MB,MI,MS) _wO_r_X (0xf7 ,_b111 ,MD,MB,MI,MS ) + +#define IDIVLr(RS) _O_Mrm (0xf7 ,_b11,_b111 ,_r4(RS) ) +#define IDIVLm(MD,MB,MI,MS) _O_r_X (0xf7 ,_b111 ,MD,MB,MI,MS ) + +#define IMULBr(RS) _O_Mrm (0xf6 ,_b11,_b101 ,_r1(RS) ) +#define IMULBm(MD,MB,MI,MS) _O_r_X (0xf6 ,_b101 ,MD,MB,MI,MS ) + +#define IMULWr(RS) _wO_Mrm (0xf7 ,_b11,_b101 ,_r2(RS) ) +#define IMULWm(MD,MB,MI,MS) _wO_r_X (0xf7 ,_b101 ,MD,MB,MI,MS ) + +#define IMULLr(RS) _O_Mrm (0xf7 ,_b11,_b101 ,_r4(RS) ) +#define IMULLm(MD,MB,MI,MS) _O_r_X (0xf7 ,_b101 ,MD,MB,MI,MS ) + + +#define IMULWrr(RS,RD) _wOO_Mrm (0x0faf ,_b11,_r2(RS),_r2(RD) ) +#define IMULWmr(MD,MB,MI,MS,RD) _wOO_r_X (0x0faf ,_r2(RD) ,MD,MB,MI,MS ) +#define IMULWirr(IM,RS,RD) _wOs_Mrm_sW (0x69 ,_b11,_r2(RS),_r2(RD) ,_su16(IM) ) +#define IMULWimr(IM,MD,MB,MI,MS,RD) _wOs_r_X_sW (0x69 ,_r2(RD) ,MD,MB,MI,MS ,_su16(IM) ) + +#define IMULLir(IM,RD) _Os_Mrm_sL (0x69 ,_b11,_r4(RD),_r4(RD) ,IM ) +#define IMULLrr(RS,RD) _OO_Mrm (0x0faf ,_b11,_r4(RD),_r4(RS) ) +#define IMULLmr(MD,MB,MI,MS,RD) _OO_r_X (0x0faf ,_r4(RD) ,MD,MB,MI,MS ) +#define IMULLirr(IM,RS,RD) _Os_Mrm_sL (0x69 ,_b11,_r4(RS),_r4(RD) ,IM ) +#define IMULLimr(IM,MD,MB,MI,MS,RD) _Os_r_X_sL (0x69 ,_r4(RD) ,MD,MB,MI,MS ,IM ) + + +#define INCBr(RD) _O_Mrm (0xfe ,_b11,_b000 ,_r1(RD) ) +#define INCBm(MD,MB,MI,MS) _O_r_X (0xfe ,_b000 ,MD,MB,MI,MS ) + +#define INCWr(RD) _wOr (0x40,_r2(RD) ) +#define INCWm(MD,MB,MI,MS) _wO_r_X (0xff ,_b000 ,MD,MB,MI,MS ) + +#define INCLr(RD) _Or (0x40,_r4(RD) ) +#define INCLm(MD,MB,MI,MS) _O_r_X (0xff ,_b000 ,MD,MB,MI,MS ) + + +#define INVD_() _OO (0x0f08 ) +#define INVLPGm(MD, MB, MI, MS) _OO_r_X (0x0f01 ,_b111 ,MD,MB,MI,MS ) + + +#define JCCSim(CC,D,B,I,S) ((_r0P(B) && _r0P(I)) ? _O_D8 (0x70|(CC) ,(int)(D) ) : \ + JITFAIL("illegal mode in conditional jump")) + +#define JOSm(D,B,I,S) JCCSim(0x0,D,B,I,S) +#define JNOSm(D,B,I,S) JCCSim(0x1,D,B,I,S) +#define JBSm(D,B,I,S) JCCSim(0x2,D,B,I,S) +#define JNAESm(D,B,I,S) JCCSim(0x2,D,B,I,S) +#define JNBSm(D,B,I,S) JCCSim(0x3,D,B,I,S) +#define JAESm(D,B,I,S) JCCSim(0x3,D,B,I,S) +#define JESm(D,B,I,S) JCCSim(0x4,D,B,I,S) +#define JZSm(D,B,I,S) JCCSim(0x4,D,B,I,S) +#define JNESm(D,B,I,S) JCCSim(0x5,D,B,I,S) +#define JNZSm(D,B,I,S) JCCSim(0x5,D,B,I,S) +#define JBESm(D,B,I,S) JCCSim(0x6,D,B,I,S) +#define JNASm(D,B,I,S) JCCSim(0x6,D,B,I,S) +#define JNBESm(D,B,I,S) JCCSim(0x7,D,B,I,S) +#define JASm(D,B,I,S) JCCSim(0x7,D,B,I,S) +#define JSSm(D,B,I,S) JCCSim(0x8,D,B,I,S) +#define JNSSm(D,B,I,S) JCCSim(0x9,D,B,I,S) +#define JPSm(D,B,I,S) JCCSim(0xa,D,B,I,S) +#define JPESm(D,B,I,S) JCCSim(0xa,D,B,I,S) +#define JNPSm(D,B,I,S) JCCSim(0xb,D,B,I,S) +#define JPOSm(D,B,I,S) JCCSim(0xb,D,B,I,S) +#define JLSm(D,B,I,S) JCCSim(0xc,D,B,I,S) +#define JNGESm(D,B,I,S) JCCSim(0xc,D,B,I,S) +#define JNLSm(D,B,I,S) JCCSim(0xd,D,B,I,S) +#define JGESm(D,B,I,S) JCCSim(0xd,D,B,I,S) +#define JLESm(D,B,I,S) JCCSim(0xe,D,B,I,S) +#define JNGSm(D,B,I,S) JCCSim(0xe,D,B,I,S) +#define JNLESm(D,B,I,S) JCCSim(0xf,D,B,I,S) +#define JGSm(D,B,I,S) JCCSim(0xf,D,B,I,S) + +#define JCCim(CC,D,B,I,S) ((_r0P(B) && _r0P(I)) ? _OO_D32 (0x0f80|(CC) ,(int)(D) ) : \ + JITFAIL("illegal mode in conditional jump")) + +#define JOm(D,B,I,S) JCCim(0x0,D,B,I,S) +#define JNOm(D,B,I,S) JCCim(0x1,D,B,I,S) +#define JBm(D,B,I,S) JCCim(0x2,D,B,I,S) +#define JNAEm(D,B,I,S) JCCim(0x2,D,B,I,S) +#define JNBm(D,B,I,S) JCCim(0x3,D,B,I,S) +#define JAEm(D,B,I,S) JCCim(0x3,D,B,I,S) +#define JEm(D,B,I,S) JCCim(0x4,D,B,I,S) +#define JZm(D,B,I,S) JCCim(0x4,D,B,I,S) +#define JNEm(D,B,I,S) JCCim(0x5,D,B,I,S) +#define JNZm(D,B,I,S) JCCim(0x5,D,B,I,S) +#define JBEm(D,B,I,S) JCCim(0x6,D,B,I,S) +#define JNAm(D,B,I,S) JCCim(0x6,D,B,I,S) +#define JNBEm(D,B,I,S) JCCim(0x7,D,B,I,S) +#define JAm(D,B,I,S) JCCim(0x7,D,B,I,S) +#define JSm(D,B,I,S) JCCim(0x8,D,B,I,S) +#define JNSm(D,B,I,S) JCCim(0x9,D,B,I,S) +#define JPm(D,B,I,S) JCCim(0xa,D,B,I,S) +#define JPEm(D,B,I,S) JCCim(0xa,D,B,I,S) +#define JNPm(D,B,I,S) JCCim(0xb,D,B,I,S) +#define JPOm(D,B,I,S) JCCim(0xb,D,B,I,S) +#define JLm(D,B,I,S) JCCim(0xc,D,B,I,S) +#define JNGEm(D,B,I,S) JCCim(0xc,D,B,I,S) +#define JNLm(D,B,I,S) JCCim(0xd,D,B,I,S) +#define JGEm(D,B,I,S) JCCim(0xd,D,B,I,S) +#define JLEm(D,B,I,S) JCCim(0xe,D,B,I,S) +#define JNGm(D,B,I,S) JCCim(0xe,D,B,I,S) +#define JNLEm(D,B,I,S) JCCim(0xf,D,B,I,S) +#define JGm(D,B,I,S) JCCim(0xf,D,B,I,S) + + +#define JMPSm(D,B,I,S) ((_r0P(B) && _r0P(I)) ? _O_D8 (0xeb ,(int)(D) ) : \ + JITFAIL("illegal mode in short jump")) + +#define JMPm(D,B,I,S) ((_r0P(B) && _r0P(I)) ? _O_D32 (0xe9 ,(int)(D) ) : \ + JITFAIL("illegal mode in direct jump")) + +#define JMPsr(R) _O_Mrm (0xff ,_b11,_b100,_r4(R) ) + +#define JMPsm(D,B,I,S) _O_r_X (0xff ,_b100 ,(int)(D),B,I,S ) + + +#define LAHF_() _O (0x9f ) +#define LEALmr(MD, MB, MI, MS, RD) _O_r_X (0x8d ,_r4(RD) ,MD,MB,MI,MS ) +#define LEAVE_() _O (0xc9 ) + + +#define LMSWr(RS) _OO_Mrm (0x0f01 ,_b11,_b110,_r4(RS) ) +#define LMSWm(MD,MB,MI,MS) _OO_r_X (0x0f01 ,_b110 ,MD,MB,MI,MS ) + +#define LOOPm(MD,MB,MI,MS) ((_r0P(MB) && _r0P(MI)) ? _O_D8 (0xe2 ,MD ) : \ + JITFAIL("illegal mode in loop")) + +#define LOOPEm(MD,MB,MI,MS) ((_r0P(MB) && _r0P(MI)) ? _O_D8 (0xe1 ,MD ) : \ + JITFAIL("illegal mode in loope")) + +#define LOOPZm(MD,MB,MI,MS) ((_r0P(MB) && _r0P(MI)) ? _O_D8 (0xe1 ,MD ) : \ + JITFAIL("illegal mode in loopz")) + +#define LOOPNEm(MD,MB,MI,MS) ((_r0P(MB) && _r0P(MI)) ? _O_D8 (0xe0 ,MD ) : \ + JITFAIL("illegal mode in loopne")) + +#define LOOPNZm(MD,MB,MI,MS) ((_r0P(MB) && _r0P(MI)) ? _O_D8 (0xe0 ,MD ) : \ + JITFAIL("illegal mode in loopnz")) + + +#define MOVBrr(RS, RD) _O_Mrm (0x80 ,_b11,_r1(RS),_r1(RD) ) +#define MOVBmr(MD, MB, MI, MS, RD) _O_r_X (0x8a ,_r1(RD) ,MD,MB,MI,MS ) +#define MOVBrm(RS, MD, MB, MI, MS) _O_r_X (0x88 ,_r1(RS) ,MD,MB,MI,MS ) +#define MOVBir(IM, R) _Or_B (0xb0,_r1(R) ,_su8(IM)) +#define MOVBim(IM, MD, MB, MI, MS) _O_X_B (0xc6 ,MD,MB,MI,MS ,_su8(IM)) + +#define MOVWrr(RS, RD) _wO_Mrm (0x89 ,_b11,_r2(RS),_r2(RD) ) +#define MOVWmr(MD, MB, MI, MS, RD) _wO_r_X (0x8b ,_r2(RD) ,MD,MB,MI,MS ) +#define MOVWrm(RS, MD, MB, MI, MS) _wO_r_X (0x89 ,_r2(RS) ,MD,MB,MI,MS ) +#define MOVWir(IM, R) _wOr_W (0xb8,_r2(R) ,_su16(IM)) +#define MOVWim(IM, MD, MB, MI, MS) _wO_X_W (0xc7 ,MD,MB,MI,MS ,_su16(IM)) + +#define MOVLrr(RS, RD) _O_Mrm (0x89 ,_b11,_r4(RS),_r4(RD) ) +#define MOVLmr(MD, MB, MI, MS, RD) _O_r_X (0x8b ,_r4(RD) ,MD,MB,MI,MS ) +#define MOVLrm(RS, MD, MB, MI, MS) _O_r_X (0x89 ,_r4(RS) ,MD,MB,MI,MS ) +#define MOVLir(IM, R) _Or_L (0xb8,_r4(R) ,IM ) +#define MOVLim(IM, MD, MB, MI, MS) _O_X_L (0xc7 ,MD,MB,MI,MS ,IM ) + +#define MOVZBLrr(RS, RD) _OO_Mrm (0x0fb6 ,_b11,_r1(RD),_r1(RS) ) +#define MOVZBLmr(MD, MB, MI, MS, RD) _OO_r_X (0x0fb6 ,_r1(RD) ,MD,MB,MI,MS ) +#define MOVZBWrr(RS, RD) _wOO_Mrm (0x0fb6 ,_b11,_r2(RD),_r2(RS) ) +#define MOVZBWmr(MD, MB, MI, MS, RD) _wOO_r_X (0x0fb6 ,_r2(RD) ,MD,MB,MI,MS ) +#define MOVZWLrr(RS, RD) _OO_Mrm (0x0fb7 ,_b11,_r1(RD),_r1(RS) ) +#define MOVZWLmr(MD, MB, MI, MS, RD) _OO_r_X (0x0fb7 ,_r1(RD) ,MD,MB,MI,MS ) + +#define MOVSBLrr(RS, RD) _OO_Mrm (0x0fbe ,_b11,_r1(RD),_r1(RS) ) +#define MOVSBLmr(MD, MB, MI, MS, RD) _OO_r_X (0x0fbe ,_r1(RD) ,MD,MB,MI,MS ) +#define MOVSBWrr(RS, RD) _wOO_Mrm (0x0fbe ,_b11,_r2(RD),_r2(RS) ) +#define MOVSBWmr(MD, MB, MI, MS, RD) _wOO_r_X (0x0fbe ,_r2(RD) ,MD,MB,MI,MS ) +#define MOVSWLrr(RS, RD) _OO_Mrm (0x0fbf ,_b11,_r1(RD),_r1(RS) ) +#define MOVSWLmr(MD, MB, MI, MS, RD) _OO_r_X (0x0fbf ,_r1(RD) ,MD,MB,MI,MS ) + + +#define MULBr(RS) _O_Mrm (0xf6 ,_b11,_b100 ,_r1(RS) ) +#define MULBm(MD,MB,MI,MS) _O_r_X (0xf6 ,_b100 ,MD,MB,MI,MS ) + +#define MULWr(RS) _wO_Mrm (0xf7 ,_b11,_b100 ,_r2(RS) ) +#define MULWm(MD,MB,MI,MS) _wO_r_X (0xf7 ,_b100 ,MD,MB,MI,MS ) + +#define MULLr(RS) _O_Mrm (0xf7 ,_b11,_b100 ,_r4(RS) ) +#define MULLm(MD,MB,MI,MS) _O_r_X (0xf7 ,_b100 ,MD,MB,MI,MS ) + + +#define NEGBr(RD) _O_Mrm (0xf6 ,_b11,_b011 ,_r1(RD) ) +#define NEGBm(MD,MB,MI,MS) _O_r_X (0xf6 ,_b011 ,MD,MB,MI,MS ) + +#define NEGWr(RD) _wO_Mrm (0xf7 ,_b11,_b011 ,_r2(RD) ) +#define NEGWm(MD,MB,MI,MS) _wO_r_X (0xf7 ,_b011 ,MD,MB,MI,MS ) + +#define NEGLr(RD) _O_Mrm (0xf7 ,_b11,_b011 ,_r4(RD) ) +#define NEGLm(MD,MB,MI,MS) _O_r_X (0xf7 ,_b011 ,MD,MB,MI,MS ) + + +#define NOP_() _O (0x90 ) + + +#define NOTBr(RD) _O_Mrm (0xf6 ,_b11,_b010 ,_r1(RD) ) +#define NOTBm(MD,MB,MI,MS) _O_r_X (0xf6 ,_b010 ,MD,MB,MI,MS ) + +#define NOTWr(RD) _wO_Mrm (0xf7 ,_b11,_b010 ,_r2(RD) ) +#define NOTWm(MD,MB,MI,MS) _wO_r_X (0xf7 ,_b010 ,MD,MB,MI,MS ) + +#define NOTLr(RD) _O_Mrm (0xf7 ,_b11,_b010 ,_r4(RD) ) +#define NOTLm(MD,MB,MI,MS) _O_r_X (0xf7 ,_b010 ,MD,MB,MI,MS ) + + +#define ORBrr(RS, RD) _O_Mrm (0x08 ,_b11,_r1(RS),_r1(RD) ) +#define ORBmr(MD, MB, MI, MS, RD) _O_r_X (0x0a ,_r1(RD) ,MD,MB,MI,MS ) +#define ORBrm(RS, MD, MB, MI, MS) _O_r_X (0x08 ,_r1(RS) ,MD,MB,MI,MS ) +#define ORBir(IM, RD) _O_Mrm_B (0x80 ,_b11,_b001 ,_r1(RD) ,_su8(IM)) +#define ORBim(IM, MD, MB, MI, MS) _O_r_X_B (0x80 ,_b001 ,MD,MB,MI,MS ,_su8(IM)) + +#define ORWrr(RS, RD) _wO_Mrm (0x09 ,_b11,_r2(RS),_r2(RD) ) +#define ORWmr(MD, MB, MI, MS, RD) _wO_r_X (0x0b ,_r2(RD) ,MD,MB,MI,MS ) +#define ORWrm(RS, MD, MB, MI, MS) _wO_r_X (0x09 ,_r2(RS) ,MD,MB,MI,MS ) +#define ORWir(IM, RD) _wOs_Mrm_sW (0x81 ,_b11,_b001 ,_r2(RD) ,_su16(IM)) +#define ORWim(IM, MD, MB, MI, MS) _wOs_r_X_sW (0x81 ,_b001 ,MD,MB,MI,MS ,_su16(IM)) + +#define ORLrr(RS, RD) _O_Mrm (0x09 ,_b11,_r4(RS),_r4(RD) ) +#define ORLmr(MD, MB, MI, MS, RD) _O_r_X (0x0b ,_r4(RD) ,MD,MB,MI,MS ) +#define ORLrm(RS, MD, MB, MI, MS) _O_r_X (0x09 ,_r4(RS) ,MD,MB,MI,MS ) +#define ORLir(IM, RD) _Os_Mrm_sL (0x81 ,_b11,_b001 ,_r4(RD) ,IM ) +#define ORLim(IM, MD, MB, MI, MS) _Os_r_X_sL (0x81 ,_b001 ,MD,MB,MI,MS ,IM ) + + +#define POPWr(RD) _wOr (0x58,_r2(RD) ) +#define POPWm(MD,MB,MI,MS) _wO_r_X (0x8f ,_b000 ,MD,MB,MI,MS ) + +#define POPLr(RD) _Or (0x58,_r4(RD) ) +#define POPLm(MD,MB,MI,MS) _O_r_X (0x8f ,_b000 ,MD,MB,MI,MS ) + + +#define POPA_() _wO (0x61 ) +#define POPAD_() _O (0x61 ) + +#define POPF_() _wO (0x9d ) +#define POPFD_() _O (0x9d ) + + +#define PUSHWr(R) _wOr (0x50,_r2(R) ) +#define PUSHWm(MD,MB,MI,MS) _wO_r_X (0xff, ,_b110 ,MD,MB,MI,MS ) +#define PUSHWi(IM) _wOs_sW (0x68 ,IM ) + +#define PUSHLr(R) _Or (0x50,_r4(R) ) +#define PUSHLm(MD,MB,MI,MS) _O_r_X (0xff ,_b110 ,MD,MB,MI,MS ) +#define PUSHLi(IM) _Os_sL (0x68 ,IM ) + + +#define PUSHA_() _wO (0x60 ) +#define PUSHAD_() _O (0x60 ) + +#define PUSHF_() _O (0x9c ) +#define PUSHFD_() _wO (0x9c ) + +#define RET_() _O (0xc3 ) +#define RETi(IM) _O_W (0xc2 ,_su16(IM)) + + +#define ROLBir(IM,RD) (((IM)==1) ? _O_Mrm (0xd0 ,_b11,_b000,_r1(RD) ) : \ + _O_Mrm_B (0xc0 ,_b11,_b000,_r1(RD) ,_u8(IM) ) ) +#define ROLBim(IM,MD,MB,MS,MI) (((IM)==1) ? _O_r_X (0xd0 ,_b000 ,MD,MB,MI,MS ) : \ + _O_r_X_B (0xc0 ,_b000 ,MD,MB,MI,MS ,_u8(IM) ) ) +#define ROLBrr(RS,RD) (((RS)==_CL) ? _O_Mrm (0xd2 ,_b11,_b000,_r1(RD) ) : \ + JITFAIL ("source register must be CL" ) ) +#define ROLBrm(RS,MD,MB,MS,MI) (((RS)==_CL) ? _O_r_X (0xd2 ,_b000 ,MD,MB,MI,MS ) : \ + JITFAIL ("source register must be CL" ) ) + +#define ROLWir(IM,RD) (((IM)==1) ? _wO_Mrm (0xd1 ,_b11,_b000,_r2(RD) ) : \ + _wO_Mrm_B (0xc1 ,_b11,_b000,_r2(RD) ,_u8(IM) ) ) +#define ROLWim(IM,MD,MB,MS,MI) (((IM)==1) ? _wO_r_X (0xd1 ,_b000 ,MD,MB,MI,MS ) : \ + _wO_r_X_B (0xc1 ,_b000 ,MD,MB,MI,MS ,_u8(IM) ) ) +#define ROLWrr(RS,RD) (((RS)==_CL) ? _wO_Mrm (0xd3 ,_b11,_b000,_r2(RD) ) : \ + JITFAIL ("source register must be CL" ) ) +#define ROLWrm(RS,MD,MB,MS,MI) (((RS)==_CL) ? _wO_r_X (0xd3 ,_b000 ,MD,MB,MI,MS ) : \ + JITFAIL ("source register must be CL" ) ) + +#define ROLLir(IM,RD) (((IM)==1) ? _O_Mrm (0xd1 ,_b11,_b000,_r4(RD) ) : \ + _O_Mrm_B (0xc1 ,_b11,_b000,_r4(RD) ,_u8(IM) ) ) +#define ROLLim(IM,MD,MB,MS,MI) (((IM)==1) ? _O_r_X (0xd1 ,_b000 ,MD,MB,MI,MS ) : \ + _O_r_X_B (0xc1 ,_b000 ,MD,MB,MI,MS ,_u8(IM) ) ) +#define ROLLrr(RS,RD) (((RS)==_CL) ? _O_Mrm (0xd3 ,_b11,_b000,_r4(RD) ) : \ + JITFAIL ("source register must be CL" ) ) +#define ROLLrm(RS,MD,MB,MS,MI) (((RS)==_CL) ? _O_r_X (0xd3 ,_b000 ,MD,MB,MI,MS ) : \ + JITFAIL ("source register must be CL" ) ) + + +#define RORBir(IM,RD) (((IM)==1) ? _O_Mrm (0xd0 ,_b11,_b001,_r1(RD) ) : \ + _O_Mrm_B (0xc0 ,_b11,_b001,_r1(RD) ,_u8(IM) ) ) +#define RORBim(IM,MD,MB,MS,MI) (((IM)==1) ? _O_r_X (0xd0 ,_b001 ,MD,MB,MI,MS ) : \ + _O_r_X_B (0xc0 ,_b001 ,MD,MB,MI,MS ,_u8(IM) ) ) +#define RORBrr(RS,RD) (((RS)==_CL) ? _O_Mrm (0xd2 ,_b11,_b001,_r1(RD) ) : \ + JITFAIL ("source register must be CL" ) ) +#define RORBrm(RS,MD,MB,MS,MI) (((RS)==_CL) ? _O_r_X (0xd2 ,_b001 ,MD,MB,MI,MS ) : \ + JITFAIL ("source register must be CL" ) ) + +#define RORWir(IM,RD) (((IM)==1) ? _wO_Mrm (0xd1 ,_b11,_b001,_r2(RD) ) : \ + _wO_Mrm_B (0xc1 ,_b11,_b001,_r2(RD) ,_u8(IM) ) ) +#define RORWim(IM,MD,MB,MS,MI) (((IM)==1) ? _wO_r_X (0xd1 ,_b001 ,MD,MB,MI,MS ) : \ + _wO_r_X_B (0xc1 ,_b001 ,MD,MB,MI,MS ,_u8(IM) ) ) +#define RORWrr(RS,RD) (((RS)==_CL) ? _wO_Mrm (0xd3 ,_b11,_b001,_r2(RD) ) : \ + JITFAIL ("source register must be CL" ) ) +#define RORWrm(RS,MD,MB,MS,MI) (((RS)==_CL) ? _wO_r_X (0xd3 ,_b001 ,MD,MB,MI,MS ) : \ + JITFAIL ("source register must be CL" ) ) + +#define RORLir(IM,RD) (((IM)==1) ? _O_Mrm (0xd1 ,_b11,_b001,_r4(RD) ) : \ + _O_Mrm_B (0xc1 ,_b11,_b001,_r4(RD) ,_u8(IM) ) ) +#define RORLim(IM,MD,MB,MS,MI) (((IM)==1) ? _O_r_X (0xd1 ,_b001 ,MD,MB,MI,MS ) : \ + _O_r_X_B (0xc1 ,_b001 ,MD,MB,MI,MS ,_u8(IM) ) ) +#define RORLrr(RS,RD) (((RS)==_CL) ? _O_Mrm (0xd3 ,_b11,_b001,_r4(RD) ) : \ + JITFAIL ("source register must be CL" ) ) +#define RORLrm(RS,MD,MB,MS,MI) (((RS)==_CL) ? _O_r_X (0xd3 ,_b001 ,MD,MB,MI,MS ) : \ + JITFAIL ("source register must be CL" ) ) + + +#define SAHF_() _O (0x9e ) + + +#define SALBir SHLBir +#define SALBim SHLBim +#define SALBrr SHLBrr +#define SALBrm SHLBrm +#define SALWir SHLWir +#define SALWim SHLWim +#define SALWrr SHLWrr +#define SALWrm SHLWrm +#define SALLir SHLLir +#define SALLim SHLLim +#define SALLrr SHLLrr +#define SALLrm SHLLrm + + +#define SARBir(IM,RD) (((IM)==1) ? _O_Mrm (0xd0 ,_b11,_b111,_r1(RD) ) : \ + _O_Mrm_B (0xc0 ,_b11,_b111,_r1(RD) ,_u8(IM) ) ) +#define SARBim(IM,MD,MB,MS,MI) (((IM)==1) ? _O_r_X (0xd0 ,_b111 ,MD,MB,MI,MS ) : \ + _O_r_X_B (0xc0 ,_b111 ,MD,MB,MI,MS ,_u8(IM) ) ) +#define SARBrr(RS,RD) (((RS)==_CL) ? _O_Mrm (0xd2 ,_b11,_b111,_r1(RD) ) : \ + JITFAIL ("source register must be CL" ) ) +#define SARBrm(RS,MD,MB,MS,MI) (((RS)==_CL) ? _O_r_X (0xd2 ,_b111 ,MD,MB,MI,MS ) : \ + JITFAIL ("source register must be CL" ) ) + +#define SARWir(IM,RD) (((IM)==1) ? _wO_Mrm (0xd1 ,_b11,_b111,_r2(RD) ) : \ + _wO_Mrm_B (0xc1 ,_b11,_b111,_r2(RD) ,_u8(IM) ) ) +#define SARWim(IM,MD,MB,MS,MI) (((IM)==1) ? _wO_r_X (0xd1 ,_b111 ,MD,MB,MI,MS ) : \ + _wO_r_X_B (0xc1 ,_b111 ,MD,MB,MI,MS ,_u8(IM) ) ) +#define SARWrr(RS,RD) (((RS)==_CL) ? _wO_Mrm (0xd3 ,_b11,_b111,_r2(RD) ) : \ + JITFAIL ("source register must be CL" ) ) +#define SARWrm(RS,MD,MB,MS,MI) (((RS)==_CL) ? _wO_r_X (0xd3 ,_b111 ,MD,MB,MI,MS ) : \ + JITFAIL ("source register must be CL" ) ) + +#define SARLir(IM,RD) (((IM)==1) ? _O_Mrm (0xd1 ,_b11,_b111,_r4(RD) ) : \ + _O_Mrm_B (0xc1 ,_b11,_b111,_r4(RD) ,_u8(IM) ) ) +#define SARLim(IM,MD,MB,MS,MI) (((IM)==1) ? _O_r_X (0xd1 ,_b111 ,MD,MB,MI,MS ) : \ + _O_r_X_B (0xc1 ,_b111 ,MD,MB,MI,MS ,_u8(IM) ) ) +#define SARLrr(RS,RD) (((RS)==_CL) ? _O_Mrm (0xd3 ,_b11,_b111,_r4(RD) ) : \ + JITFAIL ("source register must be CL" ) ) +#define SARLrm(RS,MD,MB,MS,MI) (((RS)==_CL) ? _O_r_X (0xd3 ,_b111 ,MD,MB,MI,MS ) : \ + JITFAIL ("source register must be CL" ) ) + + +#define SBBBrr(RS, RD) _O_Mrm (0x18 ,_b11,_r1(RS),_r1(RD) ) +#define SBBBmr(MD, MB, MI, MS, RD) _O_r_X (0x1a ,_r1(RD) ,MD,MB,MI,MS ) +#define SBBBrm(RS, MD, MB, MI, MS) _O_r_X (0x18 ,_r1(RS) ,MD,MB,MI,MS ) +#define SBBBir(IM, RD) _O_Mrm_B (0x80 ,_b11,_b011 ,_r1(RD) ,_su8(IM)) +#define SBBBim(IM, MD, MB, MI, MS) _O_r_X_B (0x80 ,_b011 ,MD,MB,MI,MS ,_su8(IM)) + +#define SBBWrr(RS, RD) _wO_Mrm (0x19 ,_b11,_r2(RS),_r2(RD) ) +#define SBBWmr(MD, MB, MI, MS, RD) _wO_r_X (0x1b ,_r2(RD) ,MD,MB,MI,MS ) +#define SBBWrm(RS, MD, MB, MI, MS) _wO_r_X (0x19 ,_r2(RS) ,MD,MB,MI,MS ) +#define SBBWir(IM, RD) _wOs_Mrm_sW (0x81 ,_b11,_b011 ,_r2(RD) ,_su16(IM)) +#define SBBWim(IM, MD, MB, MI, MS) _wOs_r_X_sW (0x81 ,_b011 ,MD,MB,MI,MS ,_su16(IM)) + +#define SBBLrr(RS, RD) _O_Mrm (0x19 ,_b11,_r4(RS),_r4(RD) ) +#define SBBLmr(MD, MB, MI, MS, RD) _O_r_X (0x1b ,_r4(RD) ,MD,MB,MI,MS ) +#define SBBLrm(RS, MD, MB, MI, MS) _O_r_X (0x19 ,_r4(RS) ,MD,MB,MI,MS ) +#define SBBLir(IM, RD) _Os_Mrm_sL (0x81 ,_b11,_b011 ,_r4(RD) ,IM ) +#define SBBLim(IM, MD, MB, MI, MS) _Os_r_X_sL (0x81 ,_b011 ,MD,MB,MI,MS ,IM ) + + +#define SETCCir(CC,RD) _OO_Mrm (0x0f90|(CC) ,_b11,_b000,_r1(RD) ) + +#define SETOr(RD) SETCCir(0x0,RD) +#define SETNOr(RD) SETCCir(0x1,RD) +#define SETBr(RD) SETCCir(0x2,RD) +#define SETNAEr(RD) SETCCir(0x2,RD) +#define SETNBr(RD) SETCCir(0x3,RD) +#define SETAEr(RD) SETCCir(0x3,RD) +#define SETEr(RD) SETCCir(0x4,RD) +#define SETZr(RD) SETCCir(0x4,RD) +#define SETNEr(RD) SETCCir(0x5,RD) +#define SETNZr(RD) SETCCir(0x5,RD) +#define SETBEr(RD) SETCCir(0x6,RD) +#define SETNAr(RD) SETCCir(0x6,RD) +#define SETNBEr(RD) SETCCir(0x7,RD) +#define SETAr(RD) SETCCir(0x7,RD) +#define SETSr(RD) SETCCir(0x8,RD) +#define SETNSr(RD) SETCCir(0x9,RD) +#define SETPr(RD) SETCCir(0xa,RD) +#define SETPEr(RD) SETCCir(0xa,RD) +#define SETNPr(RD) SETCCir(0xb,RD) +#define SETPOr(RD) SETCCir(0xb,RD) +#define SETLr(RD) SETCCir(0xc,RD) +#define SETNGEr(RD) SETCCir(0xc,RD) +#define SETNLr(RD) SETCCir(0xd,RD) +#define SETGEr(RD) SETCCir(0xd,RD) +#define SETLEr(RD) SETCCir(0xe,RD) +#define SETNGr(RD) SETCCir(0xe,RD) +#define SETNLEr(RD) SETCCir(0xf,RD) +#define SETGr(RD) SETCCir(0xf,RD) + +#define SETCCim(CC,MD,MB,MI,MS) _OO_r_X (0x0f90|(CC) ,_b000 ,MD,MB,MI,MS ) + +#define SETOm(D,B,I,S) SETCCim(0x0,D,B,I,S) +#define SETNOm(D,B,I,S) SETCCim(0x1,D,B,I,S) +#define SETBm(D,B,I,S) SETCCim(0x2,D,B,I,S) +#define SETNAEm(D,B,I,S) SETCCim(0x2,D,B,I,S) +#define SETNBm(D,B,I,S) SETCCim(0x3,D,B,I,S) +#define SETAEm(D,B,I,S) SETCCim(0x3,D,B,I,S) +#define SETEm(D,B,I,S) SETCCim(0x4,D,B,I,S) +#define SETZm(D,B,I,S) SETCCim(0x4,D,B,I,S) +#define SETNEm(D,B,I,S) SETCCim(0x5,D,B,I,S) +#define SETNZm(D,B,I,S) SETCCim(0x5,D,B,I,S) +#define SETBEm(D,B,I,S) SETCCim(0x6,D,B,I,S) +#define SETNAm(D,B,I,S) SETCCim(0x6,D,B,I,S) +#define SETNBEm(D,B,I,S) SETCCim(0x7,D,B,I,S) +#define SETAm(D,B,I,S) SETCCim(0x7,D,B,I,S) +#define SETSm(D,B,I,S) SETCCim(0x8,D,B,I,S) +#define SETNSm(D,B,I,S) SETCCim(0x9,D,B,I,S) +#define SETPm(D,B,I,S) SETCCim(0xa,D,B,I,S) +#define SETPEm(D,B,I,S) SETCCim(0xa,D,B,I,S) +#define SETNPm(D,B,I,S) SETCCim(0xb,D,B,I,S) +#define SETPOm(D,B,I,S) SETCCim(0xb,D,B,I,S) +#define SETLm(D,B,I,S) SETCCim(0xc,D,B,I,S) +#define SETNGEm(D,B,I,S) SETCCim(0xc,D,B,I,S) +#define SETNLm(D,B,I,S) SETCCim(0xd,D,B,I,S) +#define SETGEm(D,B,I,S) SETCCim(0xd,D,B,I,S) +#define SETLEm(D,B,I,S) SETCCim(0xe,D,B,I,S) +#define SETNGm(D,B,I,S) SETCCim(0xe,D,B,I,S) +#define SETNLEm(D,B,I,S) SETCCim(0xf,D,B,I,S) +#define SETGm(D,B,I,S) SETCCim(0xf,D,B,I,S) + + +#define SHLBir(IM,RD) (((IM)==1) ? _O_Mrm (0xd0 ,_b11,_b100,_r1(RD) ) : \ + _O_Mrm_B (0xc0 ,_b11,_b100,_r1(RD) ,_u8(IM) ) ) +#define SHLBim(IM,MD,MB,MS,MI) (((IM)==1) ? _O_r_X (0xd0 ,_b100 ,MD,MB,MI,MS ) : \ + _O_r_X_B (0xc0 ,_b100 ,MD,MB,MI,MS ,_u8(IM) ) ) +#define SHLBrr(RS,RD) (((RS)==_CL) ? _O_Mrm (0xd2 ,_b11,_b100,_r1(RD) ) : \ + JITFAIL ("source register must be CL" ) ) +#define SHLBrm(RS,MD,MB,MS,MI) (((RS)==_CL) ? _O_r_X (0xd2 ,_b100 ,MD,MB,MI,MS ) : \ + JITFAIL ("source register must be CL" ) ) + +#define SHLWir(IM,RD) (((IM)==1) ? _wO_Mrm (0xd1 ,_b11,_b100,_r2(RD) ) : \ + _wO_Mrm_B (0xc1 ,_b11,_b100,_r2(RD) ,_u8(IM) ) ) +#define SHLWim(IM,MD,MB,MS,MI) (((IM)==1) ? _wO_r_X (0xd1 ,_b100 ,MD,MB,MI,MS ) : \ + _wO_r_X_B (0xc1 ,_b100 ,MD,MB,MI,MS ,_u8(IM) ) ) +#define SHLWrr(RS,RD) (((RS)==_CL) ? _wO_Mrm (0xd3 ,_b11,_b100,_r2(RD) ) : \ + JITFAIL ("source register must be CL" ) ) +#define SHLWrm(RS,MD,MB,MS,MI) (((RS)==_CL) ? _wO_r_X (0xd3 ,_b100 ,MD,MB,MI,MS ) : \ + JITFAIL ("source register must be CL" ) ) + +#define SHLLir(IM,RD) (((IM)==1) ? _O_Mrm (0xd1 ,_b11,_b100,_r4(RD) ) : \ + _O_Mrm_B (0xc1 ,_b11,_b100,_r4(RD) ,_u8(IM) ) ) +#define SHLLim(IM,MD,MB,MS,MI) (((IM)==1) ? _O_r_X (0xd1 ,_b100 ,MD,MB,MI,MS ) : \ + _O_r_X_B (0xc1 ,_b100 ,MD,MB,MI,MS ,_u8(IM) ) ) +#define SHLLrr(RS,RD) (((RS)==_CL) ? _O_Mrm (0xd3 ,_b11,_b100,_r4(RD) ) : \ + JITFAIL ("source register must be CL" ) ) +#define SHLLrm(RS,MD,MB,MS,MI) (((RS)==_CL) ? _O_r_X (0xd3 ,_b100 ,MD,MB,MI,MS ) : \ + JITFAIL ("source register must be CL" ) ) + + +#define SHRBir(IM,RD) (((IM)==1) ? _O_Mrm (0xd0 ,_b11,_b101,_r1(RD) ) : \ + _O_Mrm_B (0xc0 ,_b11,_b101,_r1(RD) ,_u8(IM) ) ) +#define SHRBim(IM,MD,MB,MS,MI) (((IM)==1) ? _O_r_X (0xd0 ,_b101 ,MD,MB,MI,MS ) : \ + _O_r_X_B (0xc0 ,_b101 ,MD,MB,MI,MS ,_u8(IM) ) ) +#define SHRBrr(RS,RD) (((RS)==_CL) ? _O_Mrm (0xd2 ,_b11,_b101,_r1(RD) ) : \ + JITFAIL ("source register must be CL" ) ) +#define SHRBrm(RS,MD,MB,MS,MI) (((RS)==_CL) ? _O_r_X (0xd2 ,_b101 ,MD,MB,MI,MS ) : \ + JITFAIL ("source register must be CL" ) ) + +#define SHRWir(IM,RD) (((IM)==1) ? _wO_Mrm (0xd1 ,_b11,_b101,_r2(RD) ) : \ + _wO_Mrm_B (0xc1 ,_b11,_b101,_r2(RD) ,_u8(IM) ) ) +#define SHRWim(IM,MD,MB,MS,MI) (((IM)==1) ? _wO_r_X (0xd1 ,_b101 ,MD,MB,MI,MS ) : \ + _wO_r_X_B (0xc1 ,_b101 ,MD,MB,MI,MS ,_u8(IM) ) ) +#define SHRWrr(RS,RD) (((RS)==_CL) ? _wO_Mrm (0xd3 ,_b11,_b101,_r2(RD) ) : \ + JITFAIL ("source register must be CL" ) ) +#define SHRWrm(RS,MD,MB,MS,MI) (((RS)==_CL) ? _wO_r_X (0xd3 ,_b101 ,MD,MB,MI,MS ) : \ + JITFAIL ("source register must be CL" ) ) + +#define SHRLir(IM,RD) (((IM)==1) ? _O_Mrm (0xd1 ,_b11,_b101,_r4(RD) ) : \ + _O_Mrm_B (0xc1 ,_b11,_b101,_r4(RD) ,_u8(IM) ) ) +#define SHRLim(IM,MD,MB,MS,MI) (((IM)==1) ? _O_r_X (0xd1 ,_b101 ,MD,MB,MI,MS ) : \ + _O_r_X_B (0xc1 ,_b101 ,MD,MB,MI,MS ,_u8(IM) ) ) +#define SHRLrr(RS,RD) (((RS)==_CL) ? _O_Mrm (0xd3 ,_b11,_b101,_r4(RD) ) : \ + JITFAIL ("source register must be CL" ) ) +#define SHRLrm(RS,MD,MB,MS,MI) (((RS)==_CL) ? _O_r_X (0xd3 ,_b101 ,MD,MB,MI,MS ) : \ + JITFAIL ("source register must be CL" ) ) + + +#define STC_() _O (0xf9 ) + + +#define SUBBrr(RS, RD) _O_Mrm (0x28 ,_b11,_r1(RS),_r1(RD) ) +#define SUBBmr(MD, MB, MI, MS, RD) _O_r_X (0x2a ,_r1(RD) ,MD,MB,MI,MS ) +#define SUBBrm(RS, MD, MB, MI, MS) _O_r_X (0x28 ,_r1(RS) ,MD,MB,MI,MS ) +#define SUBBir(IM, RD) _O_Mrm_B (0x80 ,_b11,_b101 ,_r1(RD) ,_su8(IM)) +#define SUBBim(IM, MD, MB, MI, MS) _O_r_X_B (0x80 ,_b101 ,MD,MB,MI,MS ,_su8(IM)) + +#define SUBWrr(RS, RD) _wO_Mrm (0x29 ,_b11,_r2(RS),_r2(RD) ) +#define SUBWmr(MD, MB, MI, MS, RD) _wO_r_X (0x2b ,_r2(RD) ,MD,MB,MI,MS ) +#define SUBWrm(RS, MD, MB, MI, MS) _wO_r_X (0x29 ,_r2(RS) ,MD,MB,MI,MS ) +#define SUBWir(IM, RD) _wOs_Mrm_sW (0x81 ,_b11,_b101 ,_r2(RD) ,_su16(IM)) +#define SUBWim(IM, MD, MB, MI, MS) _wOs_r_X_sW (0x81 ,_b101 ,MD,MB,MI,MS ,_su16(IM)) + +#define SUBLrr(RS, RD) _O_Mrm (0x29 ,_b11,_r4(RS),_r4(RD) ) +#define SUBLmr(MD, MB, MI, MS, RD) _O_r_X (0x2b ,_r4(RD) ,MD,MB,MI,MS ) +#define SUBLrm(RS, MD, MB, MI, MS) _O_r_X (0x29 ,_r4(RS) ,MD,MB,MI,MS ) +#define SUBLir(IM, RD) _Os_Mrm_sL (0x81 ,_b11,_b101 ,_r4(RD) ,IM ) +#define SUBLim(IM, MD, MB, MI, MS) _Os_r_X_sL (0x81 ,_b101 ,MD,MB,MI,MS ,IM ) + + +#define TESTBrr(RS, RD) _O_Mrm (0x84 ,_b11,_r1(RS),_r1(RD) ) +#define TESTBrm(RS, MD, MB, MI, MS) _O_r_X (0x84 ,_r1(RS) ,MD,MB,MI,MS ) +#define TESTBir(IM, RD) _O_Mrm_B (0xf6 ,_b11,_b000 ,_r1(RD) ,_u8(IM)) +#define TESTBim(IM, MD, MB, MI, MS) _O_r_X_B (0xf6 ,_b000 ,MD,MB,MI,MS ,_u8(IM)) + +#define TESTWrr(RS, RD) _wO_Mrm (0x85 ,_b11,_r2(RS),_r2(RD) ) +#define TESTWrm(RS, MD, MB, MI, MS) _wO_r_X (0x85 ,_r2(RS) ,MD,MB,MI,MS ) +#define TESTWir(IM, RD) _wO_Mrm_W (0xf7 ,_b11,_b000 ,_r2(RD) ,_u16(IM)) +#define TESTWim(IM, MD, MB, MI, MS) _wO_r_X_W (0xf7 ,_b000 ,MD,MB,MI,MS ,_u16(IM)) + +#define TESTLrr(RS, RD) _O_Mrm (0x85 ,_b11,_r4(RS),_r4(RD) ) +#define TESTLrm(RS, MD, MB, MI, MS) _O_r_X (0x85 ,_r4(RS) ,MD,MB,MI,MS ) +#define TESTLir(IM, RD) _O_Mrm_L (0xf7 ,_b11,_b000 ,_r4(RD) ,IM ) +#define TESTLim(IM, MD, MB, MI, MS) _O_r_X_L (0xf7 ,_b000 ,MD,MB,MI,MS ,IM ) + + +#define XADDBrr(RS,RD) _OO_Mrm (0x0fc0 ,_b11,_r1(RS),_r1(RD) ) +#define XADDBrm(RS,MD,MB,MI,MS) _OO_r_X (0x0fc0 ,_r1(RS) ,MD,MB,MI,MS ) + +#define XADDWrr(RS,RD) _wOO_Mrm (0x0fc1 ,_b11,_r2(RS),_r2(RD) ) +#define XADDWrm(RS,MD,MB,MI,MS) _wOO_r_X (0x0fc1 ,_r2(RS) ,MD,MB,MI,MS ) + +#define XADDLrr(RS,RD) _OO_Mrm (0x0fc1 ,_b11,_r4(RS),_r4(RD) ) +#define XADDLrm(RS,MD,MB,MI,MS) _OO_r_X (0x0fc1 ,_r4(RS) ,MD,MB,MI,MS ) + + +#define XCHGBrr(RS,RD) _O_Mrm (0x86 ,_b11,_r1(RS),_r1(RD) ) +#define XCHGBrm(RS,MD,MB,MI,MS) _O_r_X (0x86 ,_r1(RS) ,MD,MB,MI,MS ) + +#define XCHGWrr(RS,RD) _wO_Mrm (0x87 ,_b11,_r2(RS),_r2(RD) ) +#define XCHGWrm(RS,MD,MB,MI,MS) _wO_r_X (0x87 ,_r2(RS) ,MD,MB,MI,MS ) + +#define XCHGLrr(RS,RD) _O_Mrm (0x87 ,_b11,_r4(RS),_r4(RD) ) +#define XCHGLrm(RS,MD,MB,MI,MS) _O_r_X (0x87 ,_r4(RS) ,MD,MB,MI,MS ) + + +#define XORBrr(RS, RD) _O_Mrm (0x30 ,_b11,_r1(RS),_r1(RD) ) +#define XORBmr(MD, MB, MI, MS, RD) _O_r_X (0x32 ,_r1(RD) ,MD,MB,MI,MS ) +#define XORBrm(RS, MD, MB, MI, MS) _O_r_X (0x30 ,_r1(RS) ,MD,MB,MI,MS ) +#define XORBir(IM, RD) _O_Mrm_B (0x80 ,_b11,_b110 ,_r1(RD) ,_su8(IM)) +#define XORBim(IM, MD, MB, MI, MS) _O_r_X_B (0x80 ,_b110 ,MD,MB,MI,MS ,_su8(IM)) + +#define XORWrr(RS, RD) _wO_Mrm (0x31 ,_b11,_r2(RS),_r2(RD) ) +#define XORWmr(MD, MB, MI, MS, RD) _wO_r_X (0x33 ,_r2(RD) ,MD,MB,MI,MS ) +#define XORWrm(RS, MD, MB, MI, MS) _wO_r_X (0x31 ,_r2(RS) ,MD,MB,MI,MS ) +#define XORWir(IM, RD) _wOs_Mrm_sW (0x81 ,_b11,_b110 ,_r2(RD) ,_su16(IM)) +#define XORWim(IM, MD, MB, MI, MS) _wOs_r_X_sW (0x81 ,_b110 ,MD,MB,MI,MS ,_su16(IM)) + +#define XORLrr(RS, RD) _O_Mrm (0x31 ,_b11,_r4(RS),_r4(RD) ) +#define XORLmr(MD, MB, MI, MS, RD) _O_r_X (0x33 ,_r4(RD) ,MD,MB,MI,MS ) +#define XORLrm(RS, MD, MB, MI, MS) _O_r_X (0x31 ,_r4(RS) ,MD,MB,MI,MS ) +#define XORLir(IM, RD) _Os_Mrm_sL (0x81 ,_b11,_b110 ,_r4(RD) ,IM ) +#define XORLim(IM, MD, MB, MI, MS) _Os_r_X_sL (0x81 ,_b110 ,MD,MB,MI,MS ,IM ) + +/* x87 instructions -- yay, we found a use for octal constants :-) */ + +#define ESCmi(D,B,I,S,OP) _O_r_X(0xd8|(OP >> 3), (OP & 7), D,B,I,S) +#define ESCri(RD,OP) _O_Mrm(0xd8|(OP >> 3), _b11, (OP & 7), RD) + +#define ESCrri(RS,RD,OP) ((RS) == _ST0 ? ESCri(RD,(OP|040)) \ + : (RD) == _ST0 ? ESCri(RS,OP) \ + : JITFAIL ("coprocessor instruction without st0")) + +#define FLDSm(D,B,I,S) ESCmi(D,B,I,S,010) /* fld m32real */ +#define FILDLm(D,B,I,S) ESCmi(D,B,I,S,030) /* fild m32int */ +#define FLDLm(D,B,I,S) ESCmi(D,B,I,S,050) /* fld m64real */ +#define FILDWm(D,B,I,S) ESCmi(D,B,I,S,070) /* fild m16int */ +#define FSTSm(D,B,I,S) ESCmi(D,B,I,S,012) /* fst m32real */ +#define FISTLm(D,B,I,S) ESCmi(D,B,I,S,032) /* fist m32int */ +#define FSTLm(D,B,I,S) ESCmi(D,B,I,S,052) /* fst m64real */ +#define FISTWm(D,B,I,S) ESCmi(D,B,I,S,072) /* fist m16int */ +#define FSTPSm(D,B,I,S) ESCmi(D,B,I,S,013) /* fstp m32real */ +#define FISTPLm(D,B,I,S) ESCmi(D,B,I,S,033) /* fistp m32int */ +#define FSTPLm(D,B,I,S) ESCmi(D,B,I,S,053) /* fstp m64real */ +#define FISTPWm(D,B,I,S) ESCmi(D,B,I,S,073) /* fistp m16int */ +#define FLDTm(D,B,I,S) ESCmi(D,B,I,S,035) /* fld m80real */ +#define FILDQm(D,B,I,S) ESCmi(D,B,I,S,075) /* fild m64int */ +#define FSTPTm(D,B,I,S) ESCmi(D,B,I,S,037) /* fstp m80real */ +#define FISTPQm(D,B,I,S) ESCmi(D,B,I,S,077) /* fistp m64int */ + +#define FADDrr(RS,RD) ESCrri(RS,RD,000) +#define FMULrr(RS,RD) ESCrri(RS,RD,001) +#define FSUBrr(RS,RD) ESCrri(RS,RD,004) +#define FSUBRrr(RS,RD) ESCrri(RS,RD,005) +#define FDIVrr(RS,RD) ESCrri(RS,RD,006) +#define FDIVRrr(RS,RD) ESCrri(RS,RD,007) + +#define FLDr(RD) ESCri(RD,010) +#define FXCHr(RD) ESCri(RD,011) +#define FFREEr(RD) ESCri(RD,050) +#define FSTr(RD) ESCri(RD,052) +#define FSTPr(RD) ESCri(RD,053) +#define FCOMr(RD) ESCri(RD,002) +#define FCOMPr(RD) ESCri(RD,003) +#define FCOMIr(RD) ESCri(RD,036) +#define FCOMIPr(RD) ESCri(RD,076) +#define FUCOMr(RD) ESCri(RD,054) +#define FUCOMPr(RD) ESCri(RD,055) +#define FUCOMIr(RD) ESCri(RD,035) +#define FUCOMIPr(RD) ESCri(RD,075) +#define FADDPr(RD) ESCri(RD,060) +#define FMULPr(RD) ESCri(RD,061) +#define FSUBPr(RD) ESCri(RD,064) +#define FSUBRPr(RD) ESCri(RD,065) +#define FDIVPr(RD) ESCri(RD,066) +#define FDIVRPr(RD) ESCri(RD,067) + +#define FNSTSWr(RD) ((RD == _AX || RD == _EAX) ? _OO (0xdfe0) \ + : JITFAIL ("AX or EAX expected")) +/* N byte NOPs */ +#define NOPi(N) ((( (N) >= 8) ? (_jit_B(0x8d),_jit_B(0xb4),_jit_B(0x26),_jit_L(0x00),_jit_B(0x90)) : (void) 0), \ + (( ((N)&7) == 7) ? (_jit_B(0x8d),_jit_B(0xb4),_jit_B(0x26),_jit_L(0x00)) : \ + ( ((N)&7) == 6) ? (_jit_B(0x8d),_jit_B(0xb6),_jit_L(0x00)) : \ + ( ((N)&7) == 5) ? (_jit_B(0x90),_jit_B(0x8d),_jit_B(0x74),_jit_B(0x26),_jit_B(0x00)) : \ +/* leal 0(,%esi), %esi */ ( ((N)&7) == 4) ? (_jit_B(0x8d),_jit_B(0x74),_jit_B(0x26),_jit_B(0x00)) : \ +/* leal (,%esi), %esi */ ( ((N)&7) == 3) ? (_jit_B(0x8d),_jit_B(0x76),_jit_B(0x00)) : \ +/* movl %esi, %esi */ ( ((N)&7) == 2) ? (_jit_B(0x89),_jit_B(0xf6)) : \ + ( ((N)&7) == 1) ? (_jit_B(0x90)) : \ + ( ((N)&7) == 0) ? 0 : \ + JITFAIL(".align argument too large"))) + + +/*** References: */ +/* */ +/* [1] "Intel Architecture Software Developer's Manual Volume 1: Basic Architecture", */ +/* Intel Corporation 1997. */ +/* */ +/* [2] "Intel Architecture Software Developer's Manual Volume 2: Instruction Set Reference", */ +/* Intel Corporation 1997. */ + +#endif +#endif /* __lightning_asm_h */ + diff --git a/src/mzscheme/src/lightning/i386/core-common.h b/src/mzscheme/src/lightning/i386/core-common.h new file mode 100644 index 0000000000..456778b58b --- /dev/null +++ b/src/mzscheme/src/lightning/i386/core-common.h @@ -0,0 +1,626 @@ +/******************************** -*- 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 2.1, 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, 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + ***********************************************************************/ + + +#ifndef __lightning_core_common_h +#define __lightning_core_common_h_ + +typedef struct { + union { + jit_insn *pc; + _uc *uc_pc; + _us *us_pc; + _ui *ui_pc; + _ul *ul_pc; + } x; + struct jit_fp *fp; + struct jit_local_state jitl; +} jit_state; + +#if 0 +# ifdef jit_init +static jit_state _jit = jit_init (); +# else +static jit_state _jit; +# endif +#endif + +#define JIT_NOREG (-1) +#define JIT_R0 JIT_R(0) +#define JIT_R1 JIT_R(1) +#define JIT_R2 JIT_R(2) +#define JIT_V0 JIT_V(0) +#define JIT_V1 JIT_V(1) +#define JIT_V2 JIT_V(2) + +#define _jitl _jit.jitl + +#define jit_get_ip() (*(jit_code *) &_jit.x.pc) +#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_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 */ +#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_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_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_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)) +#define jit_movi_ui(d, rs) jit_movi_i((d), (rs)) +#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_subci_ui(d, rs, is) jit_subci_i((d), (rs), (is)) +#define jit_subcr_ui(d, s1, s2) jit_subcr_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)) +#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)) + +#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_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_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_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)) +#define jit_movi_ul(d, rs) jit_movi_l((d), (rs)) +#define jit_movr_ul(d, rs) jit_movr_l((d), (rs)) +#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_subci_ul(d, rs, is) jit_subci_l((d), (rs), (is)) +#define jit_subcr_ul(d, s1, s2) jit_subcr_l((d), (s1), (s2)) +#define jit_subxi_ui(d, rs, is) jit_subxi_i((d), (rs), (is)) +#define jit_subxi_ul(d, rs, is) jit_subxi_l((d), (rs), (is)) +#define jit_subxr_ui(d, s1, s2) jit_subxr_i((d), (s1), (s2)) +#define jit_subxr_ul(d, s1, s2) jit_subxr_i((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)) +#define jit_movr_p(d, rs) jit_movr_ul((d), (rs)) +#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.x.pc) +#endif + +#define jit_patch(pv) jit_patch_at ((pv), (_jit.x.pc)) + +#ifndef jit_addci_i +#define jit_addci_i(d, rs, is) jit_addi_i((d), (rs), (is)) +#define jit_addcr_i(d, s1, s2) jit_addr_i((d), (s1), (s2)) +#define jit_addci_l(d, rs, is) jit_addi_l((d), (rs), (is)) +#define jit_addcr_l(d, s1, s2) jit_addr_l((d), (s1), (s2)) +#endif + +#ifndef jit_subcr_i +#define jit_subcr_i(d, s1, s2) jit_subr_i((d), (s1), (s2)) +#endif + +/* 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)) +# define jit_negr_l(d, rs) jit_subr_l((d), JIT_RZERO, (rs)) +# 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 */ + +/* 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 + +/* Common 'shortcut' implementations */ +#define jit_subi_i(d, rs, is) jit_addi_i((d), (rs), -(is)) +#define jit_subi_l(d, rs, is) jit_addi_l((d), (rs), -(is)) +#define jit_subci_i(d, rs, is) jit_addci_i((d), (rs), -(is)) +#define jit_subci_l(d, rs, is) jit_addci_l((d), (rs), -(is)) +#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)) +#define jit_rsbr_i(d, s1, s2) jit_subr_i((d), (s2), (s1)) +#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 */ +#define jit_notr_c(d, rs) jit_xori_c((d), (rs), 255) +#define jit_notr_uc(d, rs) jit_xori_c((d), (rs), 255) +#define jit_notr_s(d, rs) jit_xori_s((d), (rs), 65535) +#define jit_notr_us(d, rs) jit_xori_s((d), (rs), 65535) +#define jit_notr_i(d, rs) jit_xori_i((d), (rs), ~0) +#define jit_notr_ui(d, rs) jit_xori_i((d), (rs), ~0) +#define jit_notr_l(d, rs) jit_xori_l((d), (rs), ~0L) +#define jit_notr_ul(d, rs) jit_xori_l((d), (rs), ~0L) + +#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 + +#ifdef jit_addi_l /* sizeof(long) != sizeof(int) */ +#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 + +#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) + +/* 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)) +#define jit_ldi_ul(rd, is) jit_ldxi_ul((rd), JIT_RZERO, (is)) +#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)) +#define jit_ldr_ul(rd, rs) jit_ldxr_ul((rd), JIT_RZERO, (rs)) +#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)) +#define jit_ldxi_p(rd, rs, is) jit_ldxi_l((rd), (rs), (is)) + + +/* 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), (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), (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), (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), (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), (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), (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), (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), (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), (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), (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), (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), (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_FP +#define jit_getarg_c(reg, ofs) jit_extr_c_i ((reg), (ofs)) +#define jit_getarg_i(reg, ofs) jit_movr_i ((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_i ((reg), (ofs)) +#define jit_getarg_uc(reg, ofs) jit_extr_uc_ui((reg), (ofs)) +#define jit_getarg_ui(reg, ofs) jit_movr_ui ((reg), (ofs)) +#define jit_getarg_ul(reg, ofs) jit_extr_uc_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_FP, (ofs)); +#define jit_getarg_uc(reg, ofs) jit_ldxi_uc((reg), JIT_FP, (ofs)); +#define jit_getarg_s(reg, ofs) jit_ldxi_s((reg), JIT_FP, (ofs)); +#define jit_getarg_us(reg, ofs) jit_ldxi_us((reg), JIT_FP, (ofs)); +#define jit_getarg_i(reg, ofs) jit_ldxi_i((reg), JIT_FP, (ofs)); +#define jit_getarg_ui(reg, ofs) jit_ldxi_ui((reg), JIT_FP, (ofs)); +#define jit_getarg_l(reg, ofs) jit_ldxi_l((reg), JIT_FP, (ofs)); +#define jit_getarg_ul(reg, ofs) jit_ldxi_ul((reg), JIT_FP, (ofs)); +#define jit_getarg_p(reg, ofs) jit_ldxi_p((reg), JIT_FP, (ofs)); +#endif +#endif + + +/* Common definitions when sizeof(long) = sizeof(int) */ +#ifndef jit_addi_l +#define JIT_LONG_IS_INT + +/* 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_addci_l(d, rs, is) jit_addci_i((d), (rs), (is)) +#define jit_addcr_l(d, s1, s2) jit_addcr_i((d), (s1), (s2)) +#define jit_addxi_l(d, rs, is) jit_addxi_i((d), (rs), (is)) +#define jit_addxr_l(d, s1, s2) jit_addxr_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)) +#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_subcr_l(d, s1, s2) jit_subcr_i((d), (s1), (s2)) +#define jit_subxi_l(d, rs, is) jit_subxi_i((d), (rs), (is)) +#define jit_subxr_l(d, s1, s2) jit_subxr_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)) + +#ifndef jit_rsbi_l +#define jit_rsbi_l(d, rs, is) jit_rsbi_i((d), (rs), (is)) +#endif + +#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)) + +/* 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)) +#define jit_ldr_ul(d, rs) jit_ldr_ui((d), (rs)) +#define jit_ldi_ul(d, is) jit_ldi_ui((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)) +#define jit_ldxr_ui(d, s1, s2) jit_ldxr_i((d), (s1), (s2)) +#define jit_ldxi_ui(d, rs, is) jit_ldxi_i((d), (rs), (is)) +#define jit_ldxr_ul(d, s1, s2) jit_ldxr_ui((d), (s1), (s2)) +#define jit_ldxi_ul(d, rs, is) jit_ldxi_ui((d), (rs), (is)) + + +/* 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 + +#endif /* __lightning_core_common_h_ */ diff --git a/src/mzscheme/src/lightning/i386/core.h b/src/mzscheme/src/lightning/i386/core.h new file mode 100644 index 0000000000..bd05b91432 --- /dev/null +++ b/src/mzscheme/src/lightning/i386/core.h @@ -0,0 +1,413 @@ +/******************************** -*- C -*- **************************** + * + * Platform-independent layer (i386 version) + * + ***********************************************************************/ + + +/*********************************************************************** + * + * 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 2.1, 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, 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + ***********************************************************************/ + + + +#ifndef __lightning_core_h +#define __lightning_core_h + +#define JIT_FP _EBP +#define JIT_SP _ESP +#define JIT_RET _EAX + +#define JIT_R_NUM 3 +#define JIT_V_NUM 3 +#define JIT_R(i) (_EAX + (i)) +#define JIT_V(i) ((i) == 0 ? _EBX : _ESI + (i) - 1) + +struct jit_local_state { + int framesize; + int argssize; +}; + +/* 3-parameter operation */ +#define jit_opr_(d, s1, s2, op1d, op2d) \ + ( (s2 == d) ? op1d : \ + ( ((s1 == d) ? (void)0 : (void)MOVLrr(s1, d)), op2d ) \ + ) + +/* 3-parameter operation, with immediate */ +#define jit_op_(d, s1, op2d) \ + ((s1 == d) ? op2d : (MOVLrr(s1, d), op2d)) \ + +/* 3-parameter operation, optimizable */ +#define jit_opo_(d, s1, s2, op1d, op2d, op12d) \ + ((s2 == d) ? op2d : \ + ((s1 == d) ? op1d : op12d)) + +/* 3-parameter operation, optimizable, with immediate */ +#define jit_opi_(d, rs, opdi, opdri) \ + ((rs == d) ? opdi : opdri) + +/* An operand is forced into a register */ +#define jit_replace(rd, rs, forced, op) \ + ((rd == forced) ? JITSORRY("Register conflict for " # op) : \ + (rs == forced) ? op : (PUSHLr(forced), MOVLrr(rs, forced), op, POPLr(forced))) + +/* For LT, LE, ... */ +#define jit_replace8(d, op) \ + (jit_check8(d) \ + ? (MOVLir(0, d), op(d)) \ + : (PUSHLr(_EAX), MOVLir(0, _EAX), op(_EAX), MOVLrr(_EAX, (d)), POPLr(_EAX))) + +#define jit_bool_r(d, s1, s2, op) \ + (CMPLrr(s2, s1), jit_replace8(d, op)) + +#define jit_bool_i(d, rs, is, op) \ + (CMPLir(is, rs), jit_replace8(d, op)) + +/* When CMP with 0 can be replaced with TEST */ +#define jit_bool_i0(d, rs, is, op, op0) \ + ((is) != 0 \ + ? (CMPLir(is, rs), jit_replace8(d, op)) \ + : (TESTLrr(rs, rs), jit_replace8(d, op0))) + +/* For BLT, BLE, ... */ +#define jit_bra_r(s1, s2, op) (CMPLrr(s2, s1), op, _jit.x.pc) +#define jit_bra_i(rs, is, op) (CMPLir(is, rs), op, _jit.x.pc) + +/* When CMP with 0 can be replaced with TEST */ +#define jit_bra_i0(rs, is, op, op0) \ + ( (is) == 0 ? (TESTLrr(rs, rs), op0, _jit.x.pc) : (CMPLir(is, rs), op, _jit.x.pc)) + +/* Used to implement ldc, stc, ... */ +#define jit_check8(rs) ( (rs) <= _EBX ) +#define jit_reg8(rs) ( ((rs) == _SI || (rs) == _DI) ? _AL : ((rs) & _BH) | _AL ) +#define jit_reg16(rs) ( ((rs) & _BH) | _AX ) + +/* In jit_replace below, _EBX is dummy */ +#define jit_movbrm(rs, dd, db, di, ds) \ + (jit_check8(rs) \ + ? MOVBrm(jit_reg8(rs), dd, db, di, ds) \ + : jit_replace(_EBX, rs, _EAX, MOVBrm(_AL, dd, db, di, ds))) + +/* Reduce arguments of XOR/OR/TEST */ +#define jit_reduce_(op) op +#define jit_reduce(op, is, rs) \ + (_u8P(is) && jit_check8(rs) ? jit_reduce_(op##Bir(is, jit_reg8(rs))) : \ + (_u16P(is) ? jit_reduce_(op##Wir(is, jit_reg16(rs))) : \ + jit_reduce_(op##Lir(is, rs)) )) + +/* Helper macros for MUL/DIV/IDIV */ +#define jit_might(d, s1, op) \ + ((s1 == d) ? 0 : op) + +#define jit_mulr_ui_(s1, s2) jit_opr_(_EAX, s1, s2, MULLr(s1), MULLr(s2)) +#define jit_mulr_i_(s1, s2) jit_opr_(_EAX, s1, s2, IMULLr(s1), IMULLr(s2)) + + +#define jit_muli_i_(is, rs) \ + (MOVLir(is, rs == _EAX ? _EDX : _EAX), \ + IMULLr(rs == _EAX ? _EDX : rs)) + +#define jit_muli_ui_(is, rs) \ + (MOVLir(is, rs == _EAX ? _EDX : _EAX), \ + IMULLr(rs == _EAX ? _EDX : rs)) + +#define jit_divi_i_(result, d, rs, is) \ + (jit_might (d, _EAX, PUSHLr(_EAX)), \ + jit_might (d, _ECX, PUSHLr(_ECX)), \ + jit_might (d, _EDX, PUSHLr(_EDX)), \ + jit_might (rs, _EAX, MOVLrr(rs, _EAX)), \ + jit_might (rs, _EDX, MOVLrr(rs, _EDX)), \ + MOVLir(is, _ECX), \ + SARLir(31, _EDX), \ + IDIVLr(_ECX), \ + jit_might(d, result, MOVLrr(result, d)), \ + jit_might(d, _EDX, POPLr(_EDX)), \ + jit_might(d, _ECX, POPLr(_ECX)), \ + jit_might(d, _EAX, POPLr(_EAX))) + +#define jit_divr_i_(result, d, s1, s2) \ + (jit_might (d, _EAX, PUSHLr(_EAX)), \ + jit_might (d, _ECX, PUSHLr(_ECX)), \ + jit_might (d, _EDX, PUSHLr(_EDX)), \ + ((s1 == _ECX) ? PUSHLr(_ECX) : 0), \ + jit_might (s2, _ECX, MOVLrr(s2, _ECX)), \ + ((s1 == _ECX) ? POPLr(_EDX) : \ + jit_might (s1, _EDX, MOVLrr(s1, _EDX))), \ + MOVLrr(_EDX, _EAX), \ + SARLir(31, _EDX), \ + IDIVLr(_ECX), \ + jit_might(d, result, MOVLrr(result, d)), \ + jit_might(d, _EDX, POPLr(_EDX)), \ + jit_might(d, _ECX, POPLr(_ECX)), \ + jit_might(d, _EAX, POPLr(_EAX))) + +#define jit_divi_ui_(result, d, rs, is) \ + (jit_might (d, _EAX, PUSHLr(_EAX)), \ + jit_might (d, _ECX, PUSHLr(_ECX)), \ + jit_might (d, _EDX, PUSHLr(_EDX)), \ + jit_might (rs, _EAX, MOVLrr(rs, _EAX)), \ + MOVLir(is, _ECX), \ + XORLrr(_EDX, _EDX), \ + DIVLr(_ECX), \ + jit_might(d, result, MOVLrr(result, d)), \ + jit_might(d, _EDX, POPLr(_EDX)), \ + jit_might(d, _ECX, POPLr(_ECX)), \ + jit_might(d, _EAX, POPLr(_EAX))) + +#define jit_divr_ui_(result, d, s1, s2) \ + (jit_might (d, _EAX, PUSHLr(_EAX)), \ + jit_might (d, _ECX, PUSHLr(_ECX)), \ + jit_might (d, _EDX, PUSHLr(_EDX)), \ + ((s1 == _ECX) ? PUSHLr(_ECX) : 0), \ + jit_might (s2, _ECX, MOVLrr(s2, _ECX)), \ + ((s1 == _ECX) ? POPLr(_EAX) : \ + jit_might (s1, _EAX, MOVLrr(s1, _EAX))), \ + XORLrr(_EDX, _EDX), \ + DIVLr(_ECX), \ + jit_might(d, result, MOVLrr(result, d)), \ + jit_might(d, _EDX, POPLr(_EDX)), \ + jit_might(d, _ECX, POPLr(_ECX)), \ + jit_might(d, _EAX, POPLr(_EAX))) + + +/* ALU */ +#define jit_addi_i(d, rs, is) jit_opi_((d), (rs), ADDLir((is), (d)), LEALmr((is), (rs), 0, 0, (d)) ) +#define jit_addr_i(d, s1, s2) jit_opo_((d), (s1), (s2), ADDLrr((s2), (d)), ADDLrr((s1), (d)), LEALmr(0, (s1), (s2), 1, (d)) ) +#define jit_addci_i(d, rs, is) jit_op_ ((d), (rs), ADDLir((is), (d)) ) +#define jit_addcr_i(d, s1, s2) jit_opr_((d), (s1), (s2), ADDLrr((s1), (d)), ADDLrr((s2), (d)) ) +#define jit_addxi_i(d, rs, is) jit_op_ ((d), (rs), ADCLir((is), (d)) ) +#define jit_addxr_i(d, s1, s2) jit_opr_((d), (s1), (s2), ADCLrr((s1), (d)), ADCLrr((s2), (d)) ) +#define jit_andi_i(d, rs, is) jit_op_ ((d), (rs), ANDLir((is), (d)) ) +#define jit_andr_i(d, s1, s2) jit_opr_((d), (s1), (s2), ANDLrr((s1), (d)), ANDLrr((s2), (d)) ) +#define jit_orr_i(d, s1, s2) jit_opr_((d), (s1), (s2), ORLrr((s1), (d)), ORLrr((s2), (d)) ) +#define jit_subr_i(d, s1, s2) jit_opr_((d), (s1), (s2), (SUBLrr((s1), (d)), NEGLr(d)), SUBLrr((s2), (d)) ) +#define jit_subcr_i(d, s1, s2) jit_subr_i((d), (s1), (s2)) +#define jit_subxr_i(d, s1, s2) jit_opr_((d), (s1), (s2), SBBLrr((s1), (d)), SBBLrr((s2), (d)) ) +#define jit_subxi_i(d, rs, is) jit_op_ ((d), (rs), SBBLir((is), (d)) ) +#define jit_xorr_i(d, s1, s2) jit_opr_((d), (s1), (s2), XORLrr((s1), (d)), XORLrr((s2), (d)) ) + +/* These can sometimes use byte or word versions! */ +#define jit_ori_i(d, rs, is) jit_op_ ((d), (rs), jit_reduce(OR, (is), (d)) ) +#define jit_xori_i(d, rs, is) jit_op_ ((d), (rs), jit_reduce(XOR, (is), (d)) ) + +#define jit_muli_i(d, rs, is) jit_op_ ((d), (rs), IMULLir((is), (d)) ) +#define jit_mulr_i(d, s1, s2) jit_opr_((d), (s1), (s2), IMULLrr((s1), (d)), IMULLrr((s2), (d)) ) + +/* As far as low bits are concerned, signed and unsigned multiplies are + exactly the same. */ +#define jit_muli_ui(d, rs, is) jit_op_ ((d), (rs), IMULLir((is), (d)) ) +#define jit_mulr_ui(d, s1, s2) jit_opr_((d), (s1), (s2), IMULLrr((s1), (d)), IMULLrr((s2), (d)) ) + +#define jit_hmuli_i(d, rs, is) \ + ((d) == _EDX ? ( PUSHLr(_EAX), jit_muli_i_((is), (rs)), POPLr(_EAX) ) : \ + ((d) == _EAX ? (PUSHLr(_EDX), jit_muli_i_((is), (rs)), MOVLrr(_EDX, _EAX), POPLr(_EDX) ) : \ + (PUSHLr(_EDX), PUSHLr(_EAX), jit_muli_i_((is), (rs)), MOVLrr(_EDX, (d)), POPLr(_EAX), POPLr(_EDX) ))) + +#define jit_hmulr_i(d, s1, s2) \ + ((d) == _EDX ? ( PUSHLr(_EAX), jit_mulr_i_((s1), (s2)), POPLr(_EAX) ) : \ + ((d) == _EAX ? (PUSHLr(_EDX), jit_mulr_i_((s1), (s2)), MOVLrr(_EDX, _EAX), POPLr(_EDX) ) : \ + (PUSHLr(_EDX), PUSHLr(_EAX), jit_mulr_i_((s1), (s2)), MOVLrr(_EDX, (d)), POPLr(_EAX), POPLr(_EDX) ))) + +#define jit_hmuli_ui(d, rs, is) \ + ((d) == _EDX ? ( PUSHLr(_EAX), jit_muli_ui_((is), (rs)), POPLr(_EAX) ) : \ + ((d) == _EAX ? (PUSHLr(_EDX), jit_muli_ui_((is), (rs)), MOVLrr(_EDX, _EAX), POPLr(_EDX) ) : \ + (PUSHLr(_EDX), PUSHLr(_EAX), jit_muli_ui_((is), (rs)), MOVLrr(_EDX, (d)), POPLr(_EAX), POPLr(_EDX) ))) + +#define jit_hmulr_ui(d, s1, s2) \ + ((d) == _EDX ? ( PUSHLr(_EAX), jit_mulr_ui_((s1), (s2)), POPLr(_EAX) ) : \ + ((d) == _EAX ? (PUSHLr(_EDX), jit_mulr_ui_((s1), (s2)), MOVLrr(_EDX, _EAX), POPLr(_EDX) ) : \ + (PUSHLr(_EDX), PUSHLr(_EAX), jit_mulr_ui_((s1), (s2)), MOVLrr(_EDX, (d)), POPLr(_EAX), POPLr(_EDX) ))) + +#define jit_divi_i(d, rs, is) jit_divi_i_(_EAX, (d), (rs), (is)) +#define jit_divi_ui(d, rs, is) jit_divi_ui_(_EAX, (d), (rs), (is)) +#define jit_modi_i(d, rs, is) jit_divi_i_(_EDX, (d), (rs), (is)) +#define jit_modi_ui(d, rs, is) jit_divi_ui_(_EDX, (d), (rs), (is)) +#define jit_divr_i(d, s1, s2) jit_divr_i_(_EAX, (d), (s1), (s2)) +#define jit_divr_ui(d, s1, s2) jit_divr_ui_(_EAX, (d), (s1), (s2)) +#define jit_modr_i(d, s1, s2) jit_divr_i_(_EDX, (d), (s1), (s2)) +#define jit_modr_ui(d, s1, s2) jit_divr_ui_(_EDX, (d), (s1), (s2)) + + +/* Shifts */ +#define jit_lshi_i(d, rs, is) ((is) <= 3 ? LEALmr(0, 0, (rs), 1 << (is), (d)) : jit_op_ ((d), (rs), SHLLir((is), (d)) )) +#define jit_rshi_i(d, rs, is) jit_op_ ((d), (rs), SARLir((is), (d)) ) +#define jit_rshi_ui(d, rs, is) jit_op_ ((d), (rs), SHRLir((is), (d)) ) +#define jit_lshr_i(d, r1, r2) jit_replace((r1), (r2), _ECX, jit_op_ ((d), (r1), SHLLrr(_CL, (d)) )) +#define jit_rshr_i(d, r1, r2) jit_replace((r1), (r2), _ECX, jit_op_ ((d), (r1), SARLrr(_CL, (d)) )) +#define jit_rshr_ui(d, r1, r2) jit_replace((r1), (r2), _ECX, jit_op_ ((d), (r1), SHRLrr(_CL, (d)) )) + +/* Stack */ +#define jit_pushr_i(rs) PUSHLr(rs) +#define jit_popr_i(rs) POPLr(rs) +#define jit_prolog(n) (_jitl.framesize = 8, PUSHLr(_EBP), MOVLrr(_ESP, _EBP), PUSHLr(_EBX), PUSHLr(_ESI), PUSHLr(_EDI)) + +/* The += allows for stack pollution */ + +#define jit_prepare_i(ni) (_jitl.argssize += (ni)) +#define jit_prepare_f(nf) (_jitl.argssize += (nf)) +#define jit_prepare_d(nd) (_jitl.argssize += 2 * (nd)) +#define jit_pusharg_i(rs) PUSHLr(rs) +#define jit_finish(sub) ((void)jit_calli((sub)), ADDLir(4 * _jitl.argssize, JIT_SP), _jitl.argssize = 0) +#define jit_finishr(reg) (jit_callr((reg)), ADDLir(4 * _jitl.argssize, JIT_SP), _jitl.argssize = 0) +#define jit_retval_i(rd) ((void)jit_movr_i ((rd), _EAX)) + +#define jit_arg_c() ((_jitl.framesize += sizeof(int)) - sizeof(int)) +#define jit_arg_uc() ((_jitl.framesize += sizeof(int)) - sizeof(int)) +#define jit_arg_s() ((_jitl.framesize += sizeof(int)) - sizeof(int)) +#define jit_arg_us() ((_jitl.framesize += sizeof(int)) - sizeof(int)) +#define jit_arg_i() ((_jitl.framesize += sizeof(int)) - sizeof(int)) +#define jit_arg_ui() ((_jitl.framesize += sizeof(int)) - sizeof(int)) +#define jit_arg_l() ((_jitl.framesize += sizeof(long)) - sizeof(long)) +#define jit_arg_ul() ((_jitl.framesize += sizeof(long)) - sizeof(long)) +#define jit_arg_p() ((_jitl.framesize += sizeof(long)) - sizeof(long)) + +#define jit_arg_f() ((_jitl.framesize += sizeof(float)) - sizeof(float)) +#define jit_arg_d() ((_jitl.framesize += sizeof(double)) - sizeof(double)) + +/* Unary */ +#define jit_negr_i(d, rs) jit_opi_((d), (rs), NEGLr(d), (XORLrr((d), (d)), SUBLrr((rs), (d))) ) +#define jit_negr_l(d, rs) jit_opi_((d), (rs), NEGLr(d), (XORLrr((d), (d)), SUBLrr((rs), (d))) ) + +#define jit_movr_i(d, rs) ((void)((rs) == (d) ? 0 : MOVLrr((rs), (d)))) +#define jit_movi_i(d, is) ((is) ? MOVLir((is), (d)) : XORLrr ((d), (d)) ) +#define jit_movi_p(d, is) (MOVLir((is), (d)), _jit.x.pc) +#define jit_patch_movi(pa,pv) (*_PSL((pa) - 4) = _jit_SL((pv))) + +#define jit_ntoh_ui(d, rs) jit_op_((d), (rs), BSWAPLr(d)) +#define jit_ntoh_us(d, rs) jit_op_((d), (rs), RORWir(8, d)) + +/* Boolean */ +#define jit_ltr_i(d, s1, s2) jit_bool_r((d), (s1), (s2), SETLr ) +#define jit_ler_i(d, s1, s2) jit_bool_r((d), (s1), (s2), SETLEr ) +#define jit_gtr_i(d, s1, s2) jit_bool_r((d), (s1), (s2), SETGr ) +#define jit_ger_i(d, s1, s2) jit_bool_r((d), (s1), (s2), SETGEr ) +#define jit_eqr_i(d, s1, s2) jit_bool_r((d), (s1), (s2), SETEr ) +#define jit_ner_i(d, s1, s2) jit_bool_r((d), (s1), (s2), SETNEr ) +#define jit_ltr_ui(d, s1, s2) jit_bool_r((d), (s1), (s2), SETBr ) +#define jit_ler_ui(d, s1, s2) jit_bool_r((d), (s1), (s2), SETBEr ) +#define jit_gtr_ui(d, s1, s2) jit_bool_r((d), (s1), (s2), SETAr ) +#define jit_ger_ui(d, s1, s2) jit_bool_r((d), (s1), (s2), SETAEr ) + +#define jit_lti_i(d, rs, is) jit_bool_i0((d), (rs), (is), SETLr, SETSr ) +#define jit_lei_i(d, rs, is) jit_bool_i ((d), (rs), (is), SETLEr ) +#define jit_gti_i(d, rs, is) jit_bool_i ((d), (rs), (is), SETGr ) +#define jit_gei_i(d, rs, is) jit_bool_i0((d), (rs), (is), SETGEr, SETNSr ) +#define jit_eqi_i(d, rs, is) jit_bool_i0((d), (rs), (is), SETEr, SETEr ) +#define jit_nei_i(d, rs, is) jit_bool_i0((d), (rs), (is), SETNEr, SETNEr ) +#define jit_lti_ui(d, rs, is) jit_bool_i ((d), (rs), (is), SETBr ) +#define jit_lei_ui(d, rs, is) jit_bool_i0((d), (rs), (is), SETBEr, SETEr ) +#define jit_gti_ui(d, rs, is) jit_bool_i0((d), (rs), (is), SETAr, SETNEr ) +#define jit_gei_ui(d, rs, is) jit_bool_i0((d), (rs), (is), SETAEr, INCLr ) + +/* Jump */ +#define jit_bltr_i(label, s1, s2) jit_bra_r((s1), (s2), JLm(label, 0,0,0) ) +#define jit_bler_i(label, s1, s2) jit_bra_r((s1), (s2), JLEm(label,0,0,0) ) +#define jit_bgtr_i(label, s1, s2) jit_bra_r((s1), (s2), JGm(label, 0,0,0) ) +#define jit_bger_i(label, s1, s2) jit_bra_r((s1), (s2), JGEm(label,0,0,0) ) +#define jit_beqr_i(label, s1, s2) jit_bra_r((s1), (s2), JEm(label, 0,0,0) ) +#define jit_bner_i(label, s1, s2) jit_bra_r((s1), (s2), JNEm(label,0,0,0) ) +#define jit_bltr_ui(label, s1, s2) jit_bra_r((s1), (s2), JBm(label, 0,0,0) ) +#define jit_bler_ui(label, s1, s2) jit_bra_r((s1), (s2), JBEm(label,0,0,0) ) +#define jit_bgtr_ui(label, s1, s2) jit_bra_r((s1), (s2), JAm(label, 0,0,0) ) +#define jit_bger_ui(label, s1, s2) jit_bra_r((s1), (s2), JAEm(label,0,0,0) ) +#define jit_bmsr_i(label, s1, s2) (TESTLrr((s1), (s2)), JNZm(label,0,0,0), _jit.x.pc) +#define jit_bmcr_i(label, s1, s2) (TESTLrr((s1), (s2)), JZm(label,0,0,0), _jit.x.pc) +#define jit_boaddr_i(label, s1, s2) (ADDLrr((s2), (s1)), JOm(label,0,0,0), _jit.x.pc) +#define jit_bosubr_i(label, s1, s2) (SUBLrr((s2), (s1)), JOm(label,0,0,0), _jit.x.pc) +#define jit_boaddr_ui(label, s1, s2) (ADDLrr((s2), (s1)), JCm(label,0,0,0), _jit.x.pc) +#define jit_bosubr_ui(label, s1, s2) (SUBLrr((s2), (s1)), JCm(label,0,0,0), _jit.x.pc) + +#define jit_blti_i(label, rs, is) jit_bra_i0((rs), (is), JLm(label, 0,0,0), JSm(label, 0,0,0) ) +#define jit_blei_i(label, rs, is) jit_bra_i ((rs), (is), JLEm(label,0,0,0) ) +#define jit_bgti_i(label, rs, is) jit_bra_i ((rs), (is), JGm(label, 0,0,0) ) +#define jit_bgei_i(label, rs, is) jit_bra_i0((rs), (is), JGEm(label,0,0,0), JNSm(label,0,0,0) ) +#define jit_beqi_i(label, rs, is) jit_bra_i0((rs), (is), JEm(label, 0,0,0), JEm(label, 0,0,0) ) +#define jit_bnei_i(label, rs, is) jit_bra_i0((rs), (is), JNEm(label,0,0,0), JNEm(label,0,0,0) ) +#define jit_blti_ui(label, rs, is) jit_bra_i ((rs), (is), JBm(label, 0,0,0) ) +#define jit_blei_ui(label, rs, is) jit_bra_i0((rs), (is), JBEm(label,0,0,0), JEm(label, 0,0,0) ) +#define jit_bgti_ui(label, rs, is) jit_bra_i0((rs), (is), JAm(label, 0,0,0), JNEm(label,0,0,0) ) +#define jit_bgei_ui(label, rs, is) jit_bra_i ((rs), (is), JAEm(label,0,0,0) ) +#define jit_boaddi_i(label, rs, is) (ADDLir((is), (rs)), JOm(label,0,0,0), _jit.x.pc) +#define jit_bosubi_i(label, rs, is) (SUBLir((is), (rs)), JOm(label,0,0,0), _jit.x.pc) +#define jit_boaddi_ui(label, rs, is) (ADDLir((is), (rs)), JCm(label,0,0,0), _jit.x.pc) +#define jit_bosubi_ui(label, rs, is) (SUBLir((is), (rs)), JCm(label,0,0,0), _jit.x.pc) + +#define jit_bmsi_i(label, rs, is) (jit_reduce(TEST, (is), (rs)), JNZm(label,0,0,0), _jit.x.pc) +#define jit_bmci_i(label, rs, is) (jit_reduce(TEST, (is), (rs)), JZm(label,0,0,0), _jit.x.pc) + +#define jit_jmpi(label) (JMPm( ((unsigned long) (label)), 0, 0, 0), _jit.x.pc) +#define jit_calli(label) (CALLm( ((unsigned long) (label)), 0, 0, 0), _jit.x.pc) +#define jit_callr(reg) (CALLsr(reg)) +#define jit_jmpr(reg) JMPsr(reg) +#define jit_patch_at(jump_pc,v) (*_PSL((jump_pc) - 4) = _jit_SL((jit_insn *)(v) - (jump_pc))) +#define jit_ret() (POPLr(_EDI), POPLr(_ESI), POPLr(_EBX), POPLr(_EBP), RET_()) + +/* Memory */ +#define jit_ldi_c(d, is) MOVSBLmr((is), 0, 0, 0, (d)) +#define jit_ldr_c(d, rs) MOVSBLmr(0, (rs), 0, 0, (d)) +#define jit_ldxr_c(d, s1, s2) MOVSBLmr(0, (s1), (s2), 1, (d)) +#define jit_ldxi_c(d, rs, is) MOVSBLmr((is), (rs), 0, 0, (d)) + +#define jit_ldi_uc(d, is) MOVZBLmr((is), 0, 0, 0, (d)) +#define jit_ldr_uc(d, rs) MOVZBLmr(0, (rs), 0, 0, (d)) +#define jit_ldxr_uc(d, s1, s2) MOVZBLmr(0, (s1), (s2), 1, (d)) +#define jit_ldxi_uc(d, rs, is) MOVZBLmr((is), (rs), 0, 0, (d)) + +#define jit_sti_c(id, rs) jit_movbrm((rs), (id), 0, 0, 0) +#define jit_str_c(rd, rs) jit_movbrm((rs), 0, (rd), 0, 0) +#define jit_stxr_c(d1, d2, rs) jit_movbrm((rs), 0, (d1), (d2), 1) +#define jit_stxi_c(id, rd, rs) jit_movbrm((rs), (id), (rd), 0, 0) + +#define jit_ldi_s(d, is) MOVSWLmr((is), 0, 0, 0, (d)) +#define jit_ldr_s(d, rs) MOVSWLmr(0, (rs), 0, 0, (d)) +#define jit_ldxr_s(d, s1, s2) MOVSWLmr(0, (s1), (s2), 1, (d)) +#define jit_ldxi_s(d, rs, is) MOVSWLmr((is), (rs), 0, 0, (d)) + +#define jit_ldi_us(d, is) MOVZWLmr((is), 0, 0, 0, (d)) +#define jit_ldr_us(d, rs) MOVZWLmr(0, (rs), 0, 0, (d)) +#define jit_ldxr_us(d, s1, s2) MOVZWLmr(0, (s1), (s2), 1, (d)) +#define jit_ldxi_us(d, rs, is) MOVZWLmr((is), (rs), 0, 0, (d)) + +#define jit_sti_s(id, rs) MOVWrm(jit_reg16(rs), (id), 0, 0, 0) +#define jit_str_s(rd, rs) MOVWrm(jit_reg16(rs), 0, (rd), 0, 0) +#define jit_stxr_s(d1, d2, rs) MOVWrm(jit_reg16(rs), 0, (d1), (d2), 1) +#define jit_stxi_s(id, rd, rs) MOVWrm(jit_reg16(rs), (id), (rd), 0, 0) + +#define jit_ldi_i(d, is) MOVLmr((is), 0, 0, 0, (d)) +#define jit_ldr_i(d, rs) MOVLmr(0, (rs), 0, 0, (d)) +#define jit_ldxr_i(d, s1, s2) MOVLmr(0, (s1), (s2), 1, (d)) +#define jit_ldxi_i(d, rs, is) MOVLmr((is), (rs), 0, 0, (d)) + +#define jit_sti_i(id, rs) MOVLrm((rs), (id), 0, 0, 0) +#define jit_str_i(rd, rs) MOVLrm((rs), 0, (rd), 0, 0) +#define jit_stxr_i(d1, d2, rs) MOVLrm((rs), 0, (d1), (d2), 1) +#define jit_stxi_i(id, rd, rs) MOVLrm((rs), (id), (rd), 0, 0) + +/* Extra */ +#define jit_nop() NOP_() + +#define _jit_alignment(pc, n) (((pc ^ _MASK(4)) + 1) & _MASK(n)) +#define jit_align(n) NOPi(_jit_alignment(_jit_UL(_jit.x.pc), (n))) + +#endif /* __lightning_core_h */ diff --git a/src/mzscheme/src/lightning/i386/fp-common.h b/src/mzscheme/src/lightning/i386/fp-common.h new file mode 100644 index 0000000000..907fdc4d95 --- /dev/null +++ b/src/mzscheme/src/lightning/i386/fp-common.h @@ -0,0 +1,86 @@ +/******************************** -*- 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 2.1, 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, 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, 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) +#define jit_abs_f(rd,rs) jit_abs_d(rd,rs) +#define jit_negr_f(rd,rs) jit_negr_d(rd,rs) +#define jit_sqrt_f(rd,rs) jit_sqrt_d(rd,rs) +#define jit_extr_f_d(rs, rd) +#define jit_extr_d_f(rs, rd) +#define jit_extr_i_f(rd, rs) jit_extr_i_d(rd, rs) +#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) +#define jit_ltr_f(d, s1, s2) jit_ltr_d(d, s1, s2) +#define jit_ler_f(d, s1, s2) jit_ler_d(d, s1, s2) +#define jit_eqr_f(d, s1, s2) jit_eqr_d(d, s1, s2) +#define jit_ner_f(d, s1, s2) jit_ner_d(d, s1, s2) +#define jit_ger_f(d, s1, s2) jit_ger_d(d, s1, s2) +#define jit_gtr_f(d, s1, s2) jit_gtr_d(d, s1, s2) +#define jit_unltr_f(d, s1, s2) jit_unltr_d(d, s1, s2) +#define jit_unler_f(d, s1, s2) jit_unler_d(d, s1, s2) +#define jit_uneqr_f(d, s1, s2) jit_uneqr_d(d, s1, s2) +#define jit_ltgtr_f(d, s1, s2) jit_ltgtr_d(d, s1, s2) +#define jit_unger_f(d, s1, s2) jit_unger_d(d, s1, s2) +#define jit_ungtr_f(d, s1, s2) jit_ungtr_d(d, s1, s2) +#define jit_ordr_f(d, s1, s2) jit_ordr_d(d, s1, s2) +#define jit_unordr_f(d, s1, s2) jit_unordr_d(d, s1, s2) +#define jit_retval_f(rs) jit_retval_d(rs) +#endif diff --git a/src/mzscheme/src/lightning/i386/fp.h b/src/mzscheme/src/lightning/i386/fp.h new file mode 100644 index 0000000000..0d27255635 --- /dev/null +++ b/src/mzscheme/src/lightning/i386/fp.h @@ -0,0 +1,347 @@ +/******************************** -*- C -*- **************************** + * + * Run-time assembler & support macros for the i386 math coprocessor + * + ***********************************************************************/ + + +/*********************************************************************** + * + * Copyright 2000, 2001, 2002, 2004 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 2.1, 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, 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + ***********************************************************************/ + + +#ifndef __lightning_asm_fp_h +#define __lightning_asm_fp_h + +/* We really must map the x87 stack onto a flat register file. In practice, + we can provide something sensible and make it work on the x86 using the + stack like a file of eight registers. + + We use six or seven registers so as to have some freedom + for floor, ceil, round, (and log, tan, atn and exp). + + Not hard at all, basically play with FXCH. FXCH is mostly free, + so the generated code is not bad. Of course we special case when one + of the operands turns out to be ST0. + + Here are the macros that actually do the trick. */ + +#define JIT_FPR_NUM 6 +#define JIT_FPR(i) (i) + +#define jit_fxch(rs, op) (((rs) != 0 ? FXCHr(rs) : 0), \ + op, ((rs) != 0 ? FXCHr(rs) : 0)) + +#define jit_fp_unary(rd, s1, op) \ + ((rd) == (s1) ? jit_fxch ((rd), op) \ + : (rd) == 0 ? (FSTPr (0), FLDr ((s1)-1), op) \ + : (FLDr ((s1)), op, FSTPr ((rd)))) + +#define jit_fp_binary(rd, s1, s2, op, opr) \ + ((rd) == (s1) ? \ + ((s2) == 0 ? opr(0, (rd)) \ + : (s2) == (s1) ? jit_fxch((rd), op(0, 0)) \ + : jit_fxch((rd), op((s2), 0))) \ + : (rd) == (s2) ? jit_fxch((s1), opr(0, (rd) == 0 ? (s1) : (rd))) \ + : (FLDr (s1), op(0, (s2)+1), FSTPr((rd)+1))) + +#define jit_addr_d(rd,s1,s2) jit_fp_binary((rd),(s1),(s2),FADDrr,FADDrr) +#define jit_subr_d(rd,s1,s2) jit_fp_binary((rd),(s1),(s2),FSUBrr,FSUBRrr) +#define jit_mulr_d(rd,s1,s2) jit_fp_binary((rd),(s1),(s2),FMULrr,FMULrr) +#define jit_divr_d(rd,s1,s2) jit_fp_binary((rd),(s1),(s2),FDIVrr,FDIVRrr) + +#define jit_abs_d(rd,rs) jit_fp_unary ((rd), (rs), _OO (0xd9e1)) +#define jit_negr_d(rd,rs) jit_fp_unary ((rd), (rs), _OO (0xd9e0)) +#define jit_sqrt_d(rd,rs) jit_fp_unary ((rd), (rs), _OO (0xd9fa)) + +/* - moves: + + move FPR0 to FPR3 + FST ST3 + + move FPR3 to FPR0 + FXCH ST3 + FST ST3 + + move FPR3 to FPR1 + FLD ST1 + FST ST4 Stack is rotated, so FPRn becomes STn+1 */ + +#define jit_movr_d(rd,s1) \ + ((s1) == (rd) ? 0 \ + : (s1) == 0 ? FSTr ((rd)) \ + : (rd) == 0 ? (FXCHr ((s1)), FSTr ((s1))) \ + : (FLDr ((s1)), FSTr ((rd)+1))) + +/* - loads: + + load into FPR0 + FSTP ST0 + FLD [FUBAR] + + load into FPR3 + FSTP ST3 Save old st0 into destination register + FLD [FUBAR] + FXCH ST3 Get back old st0 + + (and similarly for immediates, using the stack) */ + +#define jit_movi_f(rd,immf) \ + (_O (0x68), \ + *((float *) _jit.x.pc) = (float) immf, \ + _jit.x.uc_pc += sizeof (float), \ + jit_ldr_f((rd), _ESP), \ + ADDLir(4, _ESP)) + +union jit_double_imm { + double d; + int i[2]; +}; + +#define jit_movi_d(rd,immd) \ + (_O (0x68), \ + _jit.x.uc_pc[4] = 0x68, \ + ((union jit_double_imm *) (_jit.x.uc_pc + 5))->d = (double) immd, \ + *((int *) _jit.x.uc_pc) = ((union jit_double_imm *) (_jit.x.uc_pc + 5))->i[1], \ + _jit.x.uc_pc += 9, \ + jit_ldr_d((rd), _ESP), \ + ADDLir(8, _ESP)) + +#define jit_ldi_f(rd, is) \ + ((rd) == 0 ? (FSTPr (0), FLDSm((is), 0, 0, 0)) \ + : (FLDSm((is), 0, 0, 0), FSTPr ((rd) + 1))) + +#define jit_ldi_d(rd, is) \ + ((rd) == 0 ? (FSTPr (0), FLDLm((is), 0, 0, 0)) \ + : (FLDLm((is), 0, 0, 0), FSTPr ((rd) + 1))) + +#define jit_ldr_f(rd, rs) \ + ((rd) == 0 ? (FSTPr (0), FLDSm(0, (rs), 0, 0)) \ + : (FLDSm(0, (rs), 0, 0), FSTPr ((rd) + 1))) + +#define jit_ldr_d(rd, rs) \ + ((rd) == 0 ? (FSTPr (0), FLDLm(0, (rs), 0, 0)) \ + : (FLDLm(0, (rs), 0, 0), FSTPr ((rd) + 1))) + +#define jit_ldxi_f(rd, rs, is) \ + ((rd) == 0 ? (FSTPr (0), FLDSm((is), (rs), 0, 0)) \ + : (FLDSm((is), (rs), 0, 0), FSTPr ((rd) + 1))) + +#define jit_ldxi_d(rd, rs, is) \ + ((rd) == 0 ? (FSTPr (0), FLDLm((is), (rs), 0, 0)) \ + : (FLDLm((is), (rs), 0, 0), FSTPr ((rd) + 1))) + +#define jit_ldxr_f(rd, s1, s2) \ + ((rd) == 0 ? (FSTPr (0), FLDSm(0, (s1), (s2), 1)) \ + : (FLDSm(0, (s1), (s2), 1), FSTPr ((rd) + 1))) + +#define jit_ldxr_d(rd, s1, s2) \ + ((rd) == 0 ? (FSTPr (0), FLDLm(0, (s1), (s2), 1)) \ + : (FLDLm(0, (s1), (s2), 1), FSTPr ((rd) + 1))) + +#define jit_extr_i_d(rd, rs) (PUSHLr((rs)), \ + ((rd) == 0 ? (FSTPr (0), FILDLm(0, _ESP, 0, 0)) \ + : (FILDLm(0, _ESP, 0, 0), FSTPr ((rd) + 1))), \ + POPLr((rs))) + +#define jit_stxi_f(id, rd, rs) jit_fxch ((rs), FSTSm((id), (rd), 0, 0)) +#define jit_stxr_f(d1, d2, rs) jit_fxch ((rs), FSTSm(0, (d1), (d2), 1)) +#define jit_stxi_d(id, rd, rs) jit_fxch ((rs), FSTLm((id), (rd), 0, 0)) +#define jit_stxr_d(d1, d2, rs) jit_fxch ((rs), FSTLm(0, (d1), (d2), 1)) +#define jit_sti_f(id, rs) jit_fxch ((rs), FSTSm((id), 0, 0, 0)) +#define jit_str_f(rd, rs) jit_fxch ((rs), FSTSm(0, (rd), 0, 0)) +#define jit_sti_d(id, rs) jit_fxch ((rs), FSTLm((id), 0, 0, 0)) +#define jit_str_d(rd, rs) jit_fxch ((rs), FSTLm(0, (rd), 0, 0)) + +/* Assume round to near mode */ +#define jit_floorr_d_i(rd, rs) \ + (FLDr (rs), jit_floor2((rd), ((rd) == _EDX ? _EAX : _EDX))) + +#define jit_ceilr_d_i(rd, rs) \ + (FLDr (rs), jit_ceil2((rd), ((rd) == _EDX ? _EAX : _EDX))) + +#define jit_truncr_d_i(rd, rs) \ + (FLDr (rs), jit_trunc2((rd), ((rd) == _EDX ? _EAX : _EDX))) + +#define jit_calc_diff(ofs) \ + FISTLm(ofs, _ESP, 0, 0), \ + FILDLm(ofs, _ESP, 0, 0), \ + FSUBRPr(1), \ + FSTPSm(4+ofs, _ESP, 0, 0) \ + +/* The real meat */ +#define jit_floor2(rd, aux) \ + (PUSHLr(aux), \ + SUBLir(8, _ESP), \ + jit_calc_diff(0), \ + POPLr(rd), /* floor in rd */ \ + POPLr(aux), /* x-round(x) in aux */ \ + ADDLir(0x7FFFFFFF, aux), /* carry if x-round(x) < -0 */ \ + SBBLir(0, rd), /* subtract 1 if carry */ \ + POPLr(aux)) + +#define jit_ceil2(rd, aux) \ + (PUSHLr(aux), \ + SUBLir(8, _ESP), \ + jit_calc_diff(0), \ + POPLr(rd), /* floor in rd */ \ + POPLr(aux), /* x-round(x) in aux */ \ + TESTLrr(aux, aux), \ + SETGr(jit_reg8(aux)), \ + SHRLir(1, aux), \ + ADCLir(0, rd), \ + POPLr(aux)) + +/* a mingling of the two above */ +#define jit_trunc2(rd, aux) \ + (PUSHLr(aux), \ + SUBLir(12, _ESP), \ + FSTSm(0, _ESP, 0, 0), \ + jit_calc_diff(4), \ + POPLr(aux), \ + POPLr(rd), \ + TESTLrr(aux, aux), \ + POPLr(aux), \ + JSSm(_jit.x.pc + 11, 0, 0, 0), \ + ADDLir(0x7FFFFFFF, aux), /* 6 */ \ + SBBLir(0, rd), /* 3 */ \ + JMPSm(_jit.x.pc + 10, 0, 0, 0), /* 2 */ \ + TESTLrr(aux, aux), /* 2 */ \ + SETGr(jit_reg8(aux)), /* 3 */ \ + SHRLir(1, aux), /* 2 */ \ + ADCLir(0, rd), /* 3 */ \ + POPLr(aux)) + +/* the easy one */ +#define jit_roundr_d_i(rd, rs) \ + (PUSHLr(_EAX), \ + jit_fxch ((rs), FISTPLm(0, _ESP, 0, 0)), \ + POPLr((rd))) + +#define jit_fp_test(d, s1, s2, n, _and, res) \ + (((s1) == 0 ? FUCOMr((s2)) : (FLDr((s1)), FUCOMPr((s2) + 1))), \ + ((d) != _EAX ? MOVLrr(_EAX, (d)) : 0), \ + FNSTSWr(_EAX), \ + SHRLir(n, _EAX), \ + ((_and) ? ANDLir((_and), _EAX) : MOVLir(0, _EAX)), \ + res, \ + ((d) != _EAX ? _O (0x90 + ((d) & 7)) : 0)) /* xchg */ + +#define jit_fp_btest(d, s1, s2, n, _and, cmp, res) \ + (((s1) == 0 ? FUCOMr((s2)) : (FLDr((s1)), FUCOMPr((s2) + 1))), \ + PUSHLr(_EAX), \ + FNSTSWr(_EAX), \ + SHRLir(n, _EAX), \ + ((_and) ? ANDLir ((_and), _EAX) : 0), \ + ((cmp) ? CMPLir ((cmp), _AL) : 0), \ + POPLr(_EAX), \ + res ((d), 0, 0, 0)) + +#define jit_nothing_needed(x) + +/* After FNSTSW we have 1 if <, 40 if =, 0 if >, 45 if unordered. Here + is how to map the values of the status word's high byte to the + conditions. + + < = > unord valid values condition + gt no no yes no 0 STSW & 45 == 0 + lt yes no no no 1 STSW & 45 == 1 + eq no yes no no 40 STSW & 45 == 40 + unord no no no yes 45 bit 2 == 1 + + ge no yes no no 0, 40 bit 0 == 0 + unlt yes no no yes 1, 45 bit 0 == 1 + ltgt yes no yes no 0, 1 bit 6 == 0 + uneq no yes no yes 40, 45 bit 6 == 1 + le yes yes no no 1, 40 odd parity for STSW & 41 + ungt no no yes yes 0, 45 even parity for STSW & 41 + + unle yes yes no yes 1, 40, 45 STSW & 45 != 0 + unge no yes yes yes 0, 40, 45 STSW & 45 != 1 + ne yes no yes yes 0, 1, 45 STSW & 45 != 40 + ord yes yes yes no 0, 1, 40 bit 2 == 0 + + lt, le, ungt, unge are actually computed as gt, ge, unlt, unle with + the operands swapped; it is more efficient this way. */ + +#define jit_gtr_d(d, s1, s2) jit_fp_test((d), (s1), (s2), 8, 0x45, SETZr (_AL)) +#define jit_ger_d(d, s1, s2) jit_fp_test((d), (s1), (s2), 9, 0, SBBBir (-1, _AL)) +#define jit_unler_d(d, s1, s2) jit_fp_test((d), (s1), (s2), 8, 0x45, SETNZr (_AL)) +#define jit_unltr_d(d, s1, s2) jit_fp_test((d), (s1), (s2), 9, 0, ADCBir (0, _AL)) +#define jit_ltr_d(d, s1, s2) jit_fp_test((d), (s2), (s1), 8, 0x45, SETZr (_AL)) +#define jit_ler_d(d, s1, s2) jit_fp_test((d), (s2), (s1), 9, 0, SBBBir (-1, _AL)) +#define jit_unger_d(d, s1, s2) jit_fp_test((d), (s2), (s1), 8, 0x45, SETNZr (_AL)) +#define jit_ungtr_d(d, s1, s2) jit_fp_test((d), (s2), (s1), 9, 0, ADCBir (0, _AL)) +#define jit_eqr_d(d, s1, s2) jit_fp_test((d), (s1), (s2), 8, 0x45, (CMPBir (0x40, _AL), SETEr (_AL))) +#define jit_ner_d(d, s1, s2) jit_fp_test((d), (s1), (s2), 8, 0x45, (CMPBir (0x40, _AL), SETNEr (_AL))) +#define jit_ltgtr_d(d, s1, s2) jit_fp_test((d), (s1), (s2), 15, 0, SBBBir (-1, _AL)) +#define jit_uneqr_d(d, s1, s2) jit_fp_test((d), (s1), (s2), 15, 0, ADCBir (0, _AL)) +#define jit_ordr_d(d, s1, s2) jit_fp_test((d), (s1), (s2), 11, 0, SBBBir (-1, _AL)) +#define jit_unordr_d(d, s1, s2) jit_fp_test((d), (s1), (s2), 11, 0, ADCBir (0, _AL)) + +#define jit_bgtr_d(d, s1, s2) jit_fp_btest((d), (s1), (s2), 8, 0x45, 0, JZm) +#define jit_bger_d(d, s1, s2) jit_fp_btest((d), (s1), (s2), 9, 0, 0, JNCm) +#define jit_bunler_d(d, s1, s2) jit_fp_btest((d), (s1), (s2), 8, 0x45, 0, JNZm) +#define jit_bunltr_d(d, s1, s2) jit_fp_btest((d), (s1), (s2), 9, 0, 0, JCm) +#define jit_bltr_d(d, s1, s2) jit_fp_btest((d), (s2), (s1), 8, 0x45, 0, JZm) +#define jit_bler_d(d, s1, s2) jit_fp_btest((d), (s2), (s1), 9, 0, 0, JNCm) +#define jit_bunger_d(d, s1, s2) jit_fp_btest((d), (s2), (s1), 8, 0x45, 0, JNZm) +#define jit_bungtr_d(d, s1, s2) jit_fp_btest((d), (s2), (s1), 9, 0, 0, JCm) +#define jit_beqr_d(d, s1, s2) jit_fp_btest((d), (s1), (s2), 8, 0x45, 0x40, JZm) +#define jit_bner_d(d, s1, s2) jit_fp_btest((d), (s1), (s2), 8, 0x45, 0x40, JNZm) +#define jit_bltgtr_d(d, s1, s2) jit_fp_btest((d), (s1), (s2), 15, 0, 0, JNCm) +#define jit_buneqr_d(d, s1, s2) jit_fp_btest((d), (s1), (s2), 15, 0, 0, JCm) +#define jit_bordr_d(d, s1, s2) jit_fp_btest((d), (s1), (s2), 11, 0, 0, JNCm) +#define jit_bunordr_d(d, s1, s2) jit_fp_btest((d), (s1), (s2), 11, 0, 0, JCm) + +#define jit_getarg_f(rd, ofs) jit_ldxi_f((rd), JIT_FP,(ofs)) +#define jit_getarg_d(rd, ofs) jit_ldxi_d((rd), JIT_FP,(ofs)) +#define jit_pusharg_d(rs) (jit_subi_i(JIT_SP,JIT_SP,sizeof(double)), jit_str_d(JIT_SP,(rs))) +#define jit_pusharg_f(rs) (jit_subi_i(JIT_SP,JIT_SP,sizeof(float)), jit_str_f(JIT_SP,(rs))) +#define jit_retval_d(op1) jit_movr_d(0, (op1)) + + +#if 0 +#define jit_sin() _OO(0xd9fe) /* fsin */ +#define jit_cos() _OO(0xd9ff) /* fcos */ +#define jit_tan() (_OO(0xd9f2), /* fptan */ \ + FSTPr(0)) /* fstp st */ +#define jit_atn() (_OO(0xd9e8), /* fld1 */ \ + _OO(0xd9f3)) /* fpatan */ +#define jit_exp() (_OO(0xd9ea), /* fldl2e */ \ + FMULPr(1), /* fmulp */ \ + _OO(0xd9c0), /* fld st */ \ + _OO(0xd9fc), /* frndint */ \ + _OO(0xdce9), /* fsubr */ \ + FXCHr(1), /* fxch st(1) */ \ + _OO(0xd9f0), /* f2xm1 */ \ + _OO(0xd9e8), /* fld1 */ \ + _OO(0xdec1), /* faddp */ \ + _OO(0xd9fd), /* fscale */ \ + FSTPr(1)) /* fstp st(1) */ +#define jit_log() (_OO(0xd9ed), /* fldln2 */ \ + FXCHr(1), /* fxch st(1) */ \ + _OO(0xd9f1)) /* fyl2x */ +#endif + +#endif /* __lightning_asm_h */ diff --git a/src/mzscheme/src/lightning/i386/funcs-common.h b/src/mzscheme/src/lightning/i386/funcs-common.h new file mode 100644 index 0000000000..278c544f3c --- /dev/null +++ b/src/mzscheme/src/lightning/i386/funcs-common.h @@ -0,0 +1,54 @@ +/******************************** -*- 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 2.1, 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, 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + ***********************************************************************/ + +#ifndef __lightning_funcs_common_h +#define __lightning_funcs_common_h + +#include +#include + +static int jit_fail(const char *, const char*, int, const char *) JIT_UNUSED; + +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(); +} + + +#ifndef jit_start_pfx +#define jit_start_pfx() ( (jit_insn*)0x4) +#define jit_end_pfx() ( (jit_insn*)0x0) +#endif + +#endif /* __lightning_funcs_common_h */ diff --git a/src/mzscheme/src/lightning/i386/funcs.h b/src/mzscheme/src/lightning/i386/funcs.h new file mode 100644 index 0000000000..1e247049ff --- /dev/null +++ b/src/mzscheme/src/lightning/i386/funcs.h @@ -0,0 +1,91 @@ +/******************************** -*- C -*- **************************** + * + * Platform-independent layer inline functions (i386) + * + ***********************************************************************/ + + +/*********************************************************************** + * + * 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 2.1, 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, 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + ***********************************************************************/ + + + +#ifndef __lightning_funcs_h +#define __lightning_funcs_h + +#ifdef __linux__ +#include +#include +#endif + +static void +jit_flush_code(void *dest, void *end) +{ + /* On the x86, the PROT_EXEC bits are not handled by the MMU. + However, the kernel can emulate this by setting the code + segment's limit to the end address of the highest page + whose PROT_EXEC bit is set. + + Linux kernels that do so and that disable by default the + execution of the data and stack segment are becoming more + and more common (Fedora, for example), so we implement our + jit_flush_code as an mprotect. */ +#ifdef __linux__ + static unsigned long prev_page = 0, prev_length = 0; + int page, length; +#ifdef PAGESIZE + const int page_size = PAGESIZE; +#else + static int page_size = -1; + if (page_size == -1) + page_size = sysconf (_SC_PAGESIZE); +#endif + + page = (long) dest & ~(page_size - 1); + length = ((char *) end - (char *) page + page_size - 1) & ~(page_size - 1); + + /* Simple-minded attempt at optimizing the common case where a single + chunk of memory is used to compile multiple functions. */ + if (page >= prev_page && page + length <= prev_page + prev_length) + return; + + mprotect ((void *) page, length, PROT_READ | PROT_WRITE | PROT_EXEC); + + /* See if we can extend the previously mprotect'ed memory area towards + higher addresses: the starting address remains the same as before. */ + if (page >= prev_page && page <= prev_page + prev_length) + prev_length = page + length - prev_page; + + /* See if we can extend the previously mprotect'ed memory area towards + lower addresses: the highest address remains the same as before. */ + else if (page < prev_page && page + length <= prev_page + prev_length) + prev_length += prev_page - page, prev_page = page; + + /* Nothing to do, replace the area. */ + else + prev_page = page, prev_length = length; +#endif +} + +#endif /* __lightning_funcs_h */ diff --git a/src/mzscheme/src/lightning/lightning.h b/src/mzscheme/src/lightning/lightning.h new file mode 100644 index 0000000000..0257c27d11 --- /dev/null +++ b/src/mzscheme/src/lightning/lightning.h @@ -0,0 +1,75 @@ +/******************************** -*- C -*- **************************** + * + * lightning main include file + * + ***********************************************************************/ + + +/*********************************************************************** + * + * Copyright 2000 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 2.1, 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, 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + ***********************************************************************/ + + + +#ifndef __lightning_h +#define __lightning_h + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef MZ_USE_JIT_PPC + +#include "ppc/asm-common.h" +#include "ppc/asm.h" +#include "ppc/core.h" +#include "ppc/core-common.h" +#include "ppc/funcs.h" +#include "ppc/funcs-common.h" +#include "ppc/fp.h" +#include "ppc/fp-common.h" + +#endif + +#ifdef MZ_USE_JIT_I386 + +#include "i386/asm-common.h" +#include "i386/asm.h" +#include "i386/core.h" +#include "i386/core-common.h" +#include "i386/funcs.h" +#include "i386/funcs-common.h" +#include "i386/fp.h" +#include "i386/fp-common.h" + +#endif + +#ifndef JIT_R0 +#error GNU lightning does not support the current target +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __lightning_h */ diff --git a/src/mzscheme/src/lightning/ppc/asm-common.h b/src/mzscheme/src/lightning/ppc/asm-common.h new file mode 100644 index 0000000000..42c8814a91 --- /dev/null +++ b/src/mzscheme/src/lightning/ppc/asm-common.h @@ -0,0 +1,197 @@ +/******************************** -*- 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 2.1, 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, 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + ***********************************************************************/ + + +#ifndef __lightning_asm_common_h +#define __lightning_asm_common_h_ + + +#ifndef _ASM_SAFETY +#define JITFAIL(MSG) 0 +#else +#if defined __GNUC__ && (__GNUC__ == 3 ? __GNUC_MINOR__ >= 2 : __GNUC__ > 3) +#define JITFAIL(MSG) jit_fail(MSG, __FILE__, __LINE__, __func__) +#else +#define JITFAIL(MSG) jit_fail(MSG, __FILE__, __LINE__, __FUNCTION__) +#endif +#endif + +#if defined __GNUC__ && (__GNUC__ == 3 ? __GNUC_MINOR__ >= 2 : __GNUC__ > 3) +#define JITSORRY(MSG) jit_fail("sorry, unimplemented: " MSG, __FILE__, __LINE__, __func__) +#else +#define JITSORRY(MSG) jit_fail("sorry, unimplemented: " MSG, __FILE__, __LINE__, __FUNCTION__) +#endif + +#ifdef __GNUC__ +#define JIT_UNUSED __attribute__((unused)) +#else +#define JIT_UNUSED +#endif + + +/* 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 + +typedef char _sc; +typedef unsigned char _uc; +typedef unsigned short _us; +typedef unsigned int _ui; +typedef long _sl; +typedef unsigned long _ul; + +#define _jit_UC(X) ((_uc )(X)) +#define _jit_US(X) ((_us )(X)) +#define _jit_UI(X) ((_ui )(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 _PSL(X) ((_sl *)(X)) +# define _PUL(X) ((_ul *)(X)) + +#define _jit_B(B) _jit_UL(((*_jit.x.uc_pc++)= _jit_UC((B)& 0xff))) +#define _jit_W(W) _jit_UL(((*_jit.x.us_pc++)= _jit_US((W)&0xffff))) +#define _jit_I(I) _jit_UL(((*_jit.x.ui_pc++)= _jit_UI((I) ))) +#define _jit_L(L) _jit_UL(((*_jit.x.ul_pc++)= _jit_UL((L) ))) +#define _jit_I_noinc(I) _jit_UL(((*_jit.x.ui_pc)= _jit_UI((I) ))) + +#define _MASK(N) ((unsigned)((1<<(N)))-1) +#define _siP(N,I) (!((((unsigned)(I))^(((unsigned)(I))<<1))&~_MASK(N))) +#define _uiP(N,I) (!(((unsigned)(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 _u8P(I) _uiP(8,I) +#define _u16P(I) _uiP(16,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) +#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) + +#endif /* __lightning_asm_common_h */ diff --git a/src/mzscheme/src/lightning/ppc/asm.h b/src/mzscheme/src/lightning/ppc/asm.h new file mode 100644 index 0000000000..76ee7e9331 --- /dev/null +++ b/src/mzscheme/src/lightning/ppc/asm.h @@ -0,0 +1,647 @@ +/******************************** -*- C -*- **************************** + * + * Run-time assembler for the PowerPC + * + ***********************************************************************/ + + +/*********************************************************************** + * + * Copyright 1999, 2000, 2001, 2002 Ian Piumarta + * + * 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 2.1, 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, 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + ***********************************************************************/ + +#ifndef __lightning_asm_h +#define __lightning_asm_h + +/* = [0-9]+ | (.+) -> add i, one parameter (imm) + * = r -> add r, one parameter (imm) + * = () -> add m, two parameters (imm,reg) + * = () -> add x, two parameters (reg,reg) + * + * `x' operands have two forms. For example `stwu source, rega(regb)' + * could be written as either + * STWUrx(source, rega, regb) + * or + * STWUXrrr(source, rega, regb) + */ + + + +/*** a brief NOTE about halfwords and "shifted" operands + * + * LOGICAL insns require UNSIGNED args in 0..65535, whether or not shifted + * + * ARITHMETIC insns require SIGNED args in -32768..32767, even when shifted + * + * as a special case: "lis/addis" also accepts UNSIGNED arguments in + * 0..65535 since it is often used immediately before "ori" to load a 32-bit + * constant (this is consistent with the GNU rs/6000 and PowerPC assemblers) + * + * thus: lis rD, expression@hi + * ori rD, rD, expression@lo ; load 32-bit constant + */ + +typedef unsigned int jit_insn; + +#ifndef LIGHTNING_DEBUG +#define _cr0 0 +#define _cr1 1 +#define _cr2 2 +#define _cr3 3 +#define _cr4 4 +#define _cr5 5 +#define _cr6 6 +#define _cr7 7 + +#define _lt 0 +#define _gt 1 +#define _eq 2 +#define _so 3 +#define _un 3 + +#define _d16(D) (_ck_d(16,(_jit_UL(D)-_jit_UL(_jit.x.pc))) & ~3) +#define _d26(D) (_ck_d(26,(_jit_UL(D)-_jit_UL(_jit.x.pc))) & ~3) + +/* primitive instruction forms [1, Section A.4] */ + +#define _FB( OP, BD,AA,LK ) (_jit_I_noinc((_u6(OP)<<26)| _d26(BD)| (_u1(AA)<<1)|_u1(LK)), _jit.x.pc++, 0) +#define _FBA( OP, BD,AA,LK ) _jit_I((_u6(OP)<<26)| (_u26(BD)&~3)| (_u1(AA)<<1)|_u1(LK)) +#define _BB( OP,BO,BI, BD,AA,LK ) (_jit_I_noinc((_u6(OP)<<26)|(_u5(BO)<<21)|(_u5(BI)<<16)| _d16(BD)| (_u1(AA)<<1)|_u1(LK)), _jit.x.pc++, 0) +#define _D( OP,RD,RA, DD ) _jit_I((_u6(OP)<<26)|(_u5(RD)<<21)|(_u5(RA)<<16)| _s16(DD) ) +#define _Du( OP,RD,RA, DD ) _jit_I((_u6(OP)<<26)|(_u5(RD)<<21)|(_u5(RA)<<16)| _u16(DD) ) +#define _Ds( OP,RD,RA, DD ) _jit_I((_u6(OP)<<26)|(_u5(RD)<<21)|(_u5(RA)<<16)| _su16(DD) ) +#define _X( OP,RD,RA,RB, XO,RC ) _jit_I((_u6(OP)<<26)|(_u5(RD)<<21)|(_u5(RA)<<16)|( _u5(RB)<<11)| (_u10(XO)<<1)|_u1(RC)) +#define _XL( OP,BO,BI, XO,LK ) _jit_I((_u6(OP)<<26)|(_u5(BO)<<21)|(_u5(BI)<<16)|( _u5(00)<<11)| (_u10(XO)<<1)|_u1(LK)) +#define _XFX( OP,RD, SR,XO ) _jit_I((_u6(OP)<<26)|(_u5(RD)<<21)| (_u10(SR)<<11)| (_u10(XO)<<1)|_u1(00)) +#define _XO( OP,RD,RA,RB,OE,XO,RC ) _jit_I((_u6(OP)<<26)|(_u5(RD)<<21)|(_u5(RA)<<16)|( _u5(RB)<<11)|(_u1(OE)<<10)|( _u9(XO)<<1)|_u1(RC)) +#define _M( OP,RS,RA,SH,MB,ME,RC ) _jit_I((_u6(OP)<<26)|(_u5(RS)<<21)|(_u5(RA)<<16)|( _u5(SH)<<11)|(_u5(MB)<< 6)|( _u5(ME)<<1)|_u1(RC)) + + +/* special purpose registers (form XFX) [1, Section 8.2, page 8-138] */ + +#define SPR_LR ((8<<5)|(0)) + +/* +++ intrinsic instructions */ + +#define ADDrrr(RD, RA, RB) _XO (31, RD, RA, RB, 0, 266, 0) +#define ADD_rrr(RD, RA, RB) _XO (31, RD, RA, RB, 0, 266, 1) +#define ADDCrrr(RD, RA, RB) _XO (31, RD, RA, RB, 0, 10, 0) +#define ADDC_rrr(RD, RA, RB) _XO (31, RD, RA, RB, 0, 10, 1) +#define ADDErrr(RD, RA, RB) _XO (31, RD, RA, RB, 0, 138, 0) +#define ADDE_rrr(RD, RA, RB) _XO (31, RD, RA, RB, 0, 138, 1) +#define ADDOrrr(RD, RA, RB) _XO (31, RD, RA, RB, 1, 266, 0) +#define ADDO_rrr(RD, RA, RB) _XO (31, RD, RA, RB, 1, 266, 1) +#define ADDIrri(RD, RA, IMM) _D (14, RD, RA, IMM) +#define ADDICrri(RD, RA, IMM) _D (12, RD, RA, IMM) +#define ADDIC_rri(RD, RA, IMM) _D (13, RD, RA, IMM) +#define ADDISrri(RD, RA, IMM) _Ds (15, RD, RA, IMM) + +#define ANDrrr(RA, RS, RB) _X (31, RS, RA, RB, 28, 0) +#define AND_rrr(RA, RS, RB) _X (31, RS, RA, RB, 28, 1) +#define ANDCrrr(RA, RS, RB) _X (31, RS, RA, RB, 60, 0) +#define ANDC_rrr(RA, RS, RB) _X (31, RS, RA, RB, 60, 1) +#define ANDI_rri(RA, RS, IMM) _Du (28, RS, RA, IMM) +#define ANDIS_rri(RA, RS, IMM) _Du (29, RS, RA, IMM) + +#define Bi(BD) _FB (18, BD, 0, 0) +#define BAi(BD) _FBA (18, BD, 1, 0) +#define BLi(BD) _FB (18, BD, 0, 1) +#define BLAi(BD) _FBA (18, BD, 1, 1) + +#define BCiii(BO,BI,BD) _BB (16, BO, BI, BD, 0, 0) +#define BCAiii(BO,BI,BD) _BB (16, BO, BI, BD, 1, 0) +#define BCLiii(BO,BI,BD) _BB (16, BO, BI, BD, 0, 1) +#define BCLAiii(BO,BI,BD) _BB (16, BO, BI, BD, 1, 1) + +#define BCCTRii(BO,BI) _XL (19, BO, BI, 528, 0) +#define BCCTRLii(BO,BI) _XL (19, BO, BI, 528, 1) + +#define BCLRii(BO,BI) _XL (19, BO, BI, 16, 0) +#define BCLRLii(BO,BI) _XL (19, BO, BI, 16, 1) + +#define CMPiirr(CR, LL, RA, RB) _X (31, ((CR)<<2)|(LL), RA, RB, 0, 0) +#define CMPIiiri(CR, LL, RA, IMM) _D (11, ((CR)<<2)|(LL), RA, IMM) + +#define CMPLiirr(CR, LL, RA, RB) _X (31, ((CR)<<2)|(LL), RA, RB, 32, 0) +#define CMPLIiiri(CR, LL, RA, IMM) _D (10, ((CR)<<2)|(LL), RA, IMM) + +#define CRANDiii(CRD,CRA,CRB) _X (19, CRD, CRA, CRB, 257, 0) +#define CRANDCiii(CRD,CRA,CRB) _X (19, CRD, CRA, CRB, 129, 0) +#define CREQViii(CRD,CRA,CRB) _X (19, CRD, CRA, CRB, 289, 0) +#define CRNANDiii(CRD,CRA,CRB) _X (19, CRD, CRA, CRB, 225, 0) +#define CRNORiii(CRD,CRA,CRB) _X (19, CRD, CRA, CRB, 33, 0) +#define CRORiii(CRD,CRA,CRB) _X (19, CRD, CRA, CRB, 449, 0) +#define CRORCiii(CRD,CRA,CRB) _X (19, CRD, CRA, CRB, 417, 0) +#define CRXORiii(CRD,CRA,CRB) _X (19, CRD, CRA, CRB, 193, 0) + +#define DCBSTrr(RA,RB) _X (31, 00, RA, RB, 54, 0) + +#define DIVWrrr(RD, RA, RB) _XO (31, RD, RA, RB, 0, 491, 0) +#define DIVW_rrr(RD, RA, RB) _XO (31, RD, RA, RB, 0, 491, 1) +#define DIVWOrrr(RD, RA, RB) _XO (31, RD, RA, RB, 1, 491, 0) +#define DIVWO_rrr(RD, RA, RB) _XO (31, RD, RA, RB, 1, 491, 1) + +#define DIVWUrrr(RD, RA, RB) _XO (31, RD, RA, RB, 0, 459, 0) +#define DIVWU_rrr(RD, RA, RB) _XO (31, RD, RA, RB, 0, 459, 1) +#define DIVWUOrrr(RD, RA, RB) _XO (31, RD, RA, RB, 1, 459, 0) +#define DIVWUO_rrr(RD, RA, RB) _XO (31, RD, RA, RB, 1, 459, 1) + +#define EQVrrr(Ra,RS,RB) _X (31, RS, RA, RB, 284, 0) +#define EQV_rrr(Ra,RS,RB) _X (31, RS, RA, RB, 284, 1) + +#define EXTSBrr(RA,RS) _X (31, RS, RA, 0, 954, 0) +#define EXTSB_rr(RA,RS) _X (31, RS, RA, 0, 954, 1) + +#define EXTSHrr(RA,RS) _X (31, RS, RA, 0, 922, 0) +#define EXTSH_rr(RA,RS) _X (31, RS, RA, 0, 922, 1) + +#define ICBIrr(RA,RB) _X (31, 00, RA, RB, 982, 0) + +#define ISYNC() _X (19, 00, 00, 00, 150, 0) + +#define LBZrm(RD,ID,RA) _D (34, RD, RA, ID) +#define LBZUrm(RD,ID,RA) _D (35, RD, RA, ID) +#define LBZUXrrr(RD,RA,RB) _X (31, RD, RA, RB, 119, 0) +#define LBZXrrr(RD,RA,RB) _X (31, RD, RA, RB, 87, 0) + +#define LHArm(RD,ID,RA) _D (42, RD, RA, ID) +#define LHAUrm(RD,ID,RA) _D (43, RD, RA, ID) +#define LHAUXrrr(RD,RA,RB) _X (31, RD, RA, RB, 375, 0) +#define LHAXrrr(RD,RA,RB) _X (31, RD, RA, RB, 343, 0) +#define LHBRXrrr(RD,RA,RB) _X (31, RD, RA, RB, 790, 0) + +#define LHZrm(RD,ID,RA) _D (40, RD, RA, ID) +#define LHZUrm(RD,ID,RA) _D (41, RD, RA, ID) +#define LHZUXrrr(RD,RA,RB) _X (31, RD, RA, RB, 311, 0) +#define LHZXrrr(RD,RA,RB) _X (31, RD, RA, RB, 279, 0) + +#define LMWrm(RD,ID,RA) _D (46, RD, RA, ID) + +#define LWBRXrrr(RD,RA,RB) _X (31, RD, RA, RB, 534, 0) + +#define LWZrm(RD, DISP, RA) _D (32, RD, RA, DISP) +#define LWZUrm(RD, DISP, RA) _D (33, RD, RA, DISP) +#define LWZUXrrr(RD, RA, RB) _X (31, RD, RA, RB, 56, 0) +#define LWZXrrr(RD, RA, RB) _X (31, RD, RA, RB, 23, 0) + +#define MCRFii(CD,CS) _X (19, ((CD)<<2), ((CS)<<2), 0, 0, 0) + +#define MFCRr(RD) _X (31, RD, 0, 0, 19, 0) +#define MCRXRi(RD) _XFX (31, (RD)<<2, 0, 512) + +#define MFSPRri(RD, SPR) _XFX (31, RD, (SPR)<<5, 339) +#define MTSPRir(SPR, RS) _XFX (31, RS, (SPR)<<5, 467) + +#define MULHWrrr(RD,RA,RB) _XO (31, RD, RA, RB, 0, 75, 0) +#define MULHW_rrr(RD,RA,RB) _XO (31, RD, RA, RB, 0, 75, 1) +#define MULHWUrrr(RD,RA,RB) _XO (31, RD, RA, RB, 0, 11, 0) +#define MULHWU_rrr(RD,RA,RB) _XO (31, RD, RA, RB, 0, 11, 1) + +#define MULLIrri(RD,RA,IM) _D (07, RD, RA, IM) + +#define MULLWrrr(RD,RA,RB) _XO (31, RD, RA, RB, 0, 235, 0) +#define MULLW_rrr(RD,RA,RB) _XO (31, RD, RA, RB, 0, 235, 1) +#define MULLWOrrr(RD,RA,RB) _XO (31, RD, RA, RB, 1, 235, 0) +#define MULLWO_rrr(RD,RA,RB) _XO (31, RD, RA, RB, 1, 235, 1) + +#define NANDrrr(RA,RS,RB) _X (31, RS, RA, RB, 476, 0) +#define NAND_rrr(RA,RS,RB) _X (31, RS, RA, RB, 476, 1) + +#define NEGrr(RD,RA) _XO (31, RD, RA, 0, 0, 104, 0) +#define NEG_rr(RD,RA) _XO (31, RD, RA, 0, 0, 104, 1) +#define NEGOrr(RD,RA) _XO (31, RD, RA, 0, 1, 104, 0) +#define NEGO_rr(RD,RA) _XO (31, RD, RA, 0, 1, 104, 1) + +#define NORrrr(RA,RS,RB) _X (31, RS, RA, RB, 124, 0) +#define NOR_rrr(RA,RS,RB) _X (31, RS, RA, RB, 124, 1) + +#define ORrrr(RA,RS,RB) _X (31, RS, RA, RB, 444, 0) +#define OR_rrr(RA,RS,RB) _X (31, RS, RA, RB, 444, 1) +#define ORCrrr(RA,RS,RB) _X (31, RS, RA, RB, 412, 0) +#define ORC_rrr(RA,RS,RB) _X (31, RS, RA, RB, 412, 1) +#define ORIrri(RA,RS,IM) _Du (24, RS, RA, IM) +#define ORISrri(RA,RS,IM) _Du (25, RS, RA, IM) + +#define RLWIMIrriii(RA,RS,SH,MB,ME) _M (20, RS, RA, SH, MB, ME, 0) +#define RLWIMI_rriii(RA,RS,SH,MB,ME) _M (20, RS, RA, SH, MB, ME, 1) + +#define RLWINMrriii(RA,RS,SH,MB,ME) _M (21, RS, RA, SH, MB, ME, 0) +#define RLWINM_rriii(RA,RS,SH,MB,ME) _M (21, RS, RA, SH, MB, ME, 1) + +#define RLWNMrrrii(RA,RS,RB,MB,ME) _M (23, RS, RA, RB, MB, ME, 0) +#define RLWNM_rrrii(RA,RS,RB,MB,ME) _M (23, RS, RA, RB, MB, ME, 1) + +#define SLWrrr(RA,RS,RB) _X (31, RS, RA, RB, 24, 0) +#define SLW_rrr(RA,RS,RB) _X (31, RS, RA, RB, 24, 1) + +#define SRAWrrr(RA,RS,RB) _X (31, RS, RA, RB, 792, 0) +#define SRAW_rrr(RA,RS,RB) _X (31, RS, RA, RB, 792, 1) + +#define SRAWIrri(RD, RS, SH) _X (31, RS, RD, SH, 824, 0) +#define SRAWI_rri(RD, RS, SH) _X (31, RS, RD, SH, 824, 1) + +#define SRWrrr(RA,RS,RB) _X (31, RS, RA, RB, 536, 0) +#define SRW_rrr(RA,RS,RB) _X (31, RS, RA, RB, 536, 1) + +#define STBrm(RS,ID,RA) _D (38, RS, RA, ID) +#define STBUrm(RS,ID,RA) _D (39, RS, RA, ID) +#define STBUXrrr(RS,RA,RB) _X (31, RS, RA, RB, 247, 0) +#define STBXrrr(RS,RA,RB) _X (31, RS, RA, RB, 215, 0) + +#define STHrm(RS,ID,RA) _D (44, RS, RA, ID) +#define STHUrm(RS,ID,RA) _D (45, RS, RA, ID) +#define STHBRXrrr(RS,RA,RB) _X (31, RS, RA, RB, 918, 0) +#define STHUXrrr(RS,RA,RB) _X (31, RS, RA, RB, 439, 0) +#define STHXrrr(RS,RA,RB) _X (31, RS, RA, RB, 407, 0) + +#define STMWrm(RS,ID,RA) _D (47, RS, RA, ID) + +#define STWrm(RS,ID,RA) _D (36, RS, RA, ID) +#define STWBRXrrr(RS,RA,RB) _X (31, RS, RA, RB, 662, 0) +#define STWCXrrr(RS,RA,RB) _X (31, RS, RA, RB, 150, 0) +#define STWCX_rrr(RS,RA,RB) _X (31, RS, RA, RB, 150, 1) +#define STWUrm(RS,ID,RA) _D (37, RS, RA, ID) +#define STWUXrrr(RS,RA,RB) _X (31, RS, RA, RB, 183, 0) +#define STWXrrr(RS,RA,RB) _X (31, RS, RA, RB, 151, 0) + +#define SUBFrrr(RD, RA, RB) _XO (31, RD, RA, RB, 0, 40, 0) +#define SUBF_rrr(RD, RA, RB) _XO (31, RD, RA, RB, 0, 40, 1) +#define SUBFrrr(RD, RA, RB) _XO (31, RD, RA, RB, 0, 40, 0) +#define SUBF_rrr(RD, RA, RB) _XO (31, RD, RA, RB, 0, 40, 1) +#define SUBFErrr(RD, RA, RB) _XO (31, RD, RA, RB, 1, 136, 0) +#define SUBFE_rrr(RD, RA, RB) _XO (31, RD, RA, RB, 1, 136, 1) +#define SUBFCrrr(RD, RA, RB) _XO (31, RD, RA, RB, 0, 8, 0) +#define SUBFC_rrr(RD, RA, RB) _XO (31, RD, RA, RB, 0, 8, 1) +#define SUBFCOrrr(RD, RA, RB) _XO (31, RD, RA, RB, 1, 8, 0) +#define SUBFCO_rrr(RD, RA, RB) _XO (31, RD, RA, RB, 1, 8, 1) +#define SUBFICrri(RD, RA, IMM) _D (8, RD, RA, IMM) + +#define ADDrrr(RD, RA, RB) _XO (31, RD, RA, RB, 0, 266, 0) +#define ADDOrrr(RD, RA, RB) _XO (31, RD, RA, RB, 1, 266, 0) +#define ADDIrri(RD, RA, IMM) _D (14, RD, RA, IMM) +#define ADDISrri(RD, RA, IMM) _Ds (15, RD, RA, IMM) + +#define SYNC() _X (31, 00, 00, 00, 598, 0) + +#define TWirr(TO,RA,RB) _X (31, TO, RA, RB, 4, 0) +#define TWIiri(TO,RA,IM) _D (03, TO, RA, IM) + +#define XORrrr(RA,RS,RB) _X (31, RS, RA, RB, 316, 0) +#define XOR_rrr(RA,RS,RB) _X (31, RS, RA, RB, 316, 1) +#define XORIrri(RA,RS,IM) _Du (26, RS, RA, IM) +#define XORISrri(RA,RS,IM) _Du (27, RS, RA, IM) + +/* simplified mnemonics [1, Appendix F] */ + +#define MOVEIri2(R,H,L) (LISri(R,H), (L ? ORIrri(R,R,L) : 0)) +#define MOVEIri(R,I) (_siP(16,I) ? LIri(R,I) : \ + MOVEIri2(R, _HI(I), _LO(I)) ) + +#define SUBIrri(RD,RA,IM) ADDIrri(RD,RA,-_LO((IM))) /* [1, Section F.2.1] */ +#define SUBISrri(RD,RA,IM) ADDISrri(RD,RA,-_LO((IM))) +#define SUBICrri(RD,RA,IM) ADDICrri(RD,RA,-_LO((IM))) +#define SUBIC_rri(RD,RA,IM) ADDIC_rri(RD,RA,-_LO((IM))) + +#define SUBrrr(RD,RA,RB) SUBFrrr(RD,RB,RA) /* [1, Section F.2.2] */ +#define SUBOrrr(RD,RA,RB) SUBFOrrr(RD,RB,RA) +#define SUB_rrr(RD,RA,RB) SUBF_rrr(RD,RB,RA) +#define SUBCrrr(RD,RA,RB) SUBFCrrr(RD,RB,RA) +#define SUBCOrrr(RD,RA,RB) SUBFCOrrr(RD,RB,RA) +#define SUBC_rrr(RD,RA,RB) SUBFC_rrr(RD,RB,RA) +#define SUBErrr(RD,RA,RB) SUBFErrr(RD,RB,RA) +#define SUBE_rrr(RD,RA,RB) SUBFE_rrr(RD,RB,RA) + +#define CMPWIiri(C,RA,IM) CMPIiiri(C,0,RA,IM) /* [1, Table F-2] */ +#define CMPWirr(C,RA,RB) CMPiirr(C,0,RA,RB) +#define CMPLWIiri(C,RA,IM) CMPLIiiri(C,0,RA,IM) +#define CMPLWirr(C,RA,RB) CMPLiirr(C,0,RA,RB) + +#define CMPWIri(RA,IM) CMPWIiri(0,RA,IM) /* with implicit _cr0 */ +#define CMPWrr(RA,RB) CMPWirr(0,RA,RB) +#define CMPLWIri(RA,IM) CMPLWIiri(0,RA,IM) +#define CMPLWrr(RA,RB) CMPLWirr(0,RA,RB) + +#define EXTLWIrrii(RA,RS,N,B) RLWINMrriii(RA, RS, B, 0, (N)-1) /* [1, Table F-3] */ +#define EXTRWIrrii(RA,RS,N,B) RLWINMrriii(RA, RS, (B)+(N), 32-(N), 31) +#define INSLWIrrii(RA,RS,N,B) RLWIMIrriii(RA, RS, 32-(B), B, (B)+(N)-1) +#define INSRWIrrii(RA,RS,N,B) RLWIMIrriii(RA, RS, 32-((B)+(N)), B, (B)+(N)-1) +#define ROTLWIrri(RA,RS,N) RLWINMrriii(RA, RS, N, 0, 31) +#define ROTRWIrri(RA,RS,N) RLWINMrriii(RA, RS, 32-(N), 0, 31) +#define ROTLWrrr(RA,RS,RB) RLWNMrrrii( RA, RS, RB, 0, 31) +#define SLWIrri(RA,RS,N) RLWINMrriii(RA, RS, N, 0, 31-(N)) +#define SRWIrri(RA,RS,N) RLWINMrriii(RA, RS, 32-(N), N, 31) +#define CLRLWIrri(RA,RS,N) RLWINMrriii(RA, RS, 0, N, 31) +#define CLRRWIrri(RA,RS,N) RLWINMrriii(RA, RS, 0, 0, 31-(N)) +#define CLRLSLWIrrii(RA,RS,B,N) RLWINMrriii(RA, RS, N, (B)-(N), 31-(N)) + + +/* 9 below inverts the branch condition and the branch prediction. + * This has an incestuous knowledge of JIT_AUX */ +#define BC_EXT(A, C, D) ((_siP(16, _jit_UL(D)-_jit_UL(_jit.x.pc)) && !_jitl.long_jumps) \ + ? BCiii((A), (C), (D)) \ + : (BCiii((A)^9, (C), _jit.x.pc+5), \ + LISri(JIT_AUX,_HI(D)), \ + ORIrri(JIT_AUX,JIT_AUX,_LO(D)), \ + MTLRr(JIT_AUX), BLR() )) + +#define B_EXT(D) ((_siP(16, _jit_UL(D)-_jit_UL(_jit.x.pc)) && !_jitl.long_jumps) \ + ? Bi((D)) \ + : (LISri(JIT_AUX,_HI(D)), \ + ORIrri(JIT_AUX,JIT_AUX,_LO(D)), \ + MTLRr(JIT_AUX), BLR()) ) + +#define BTii(C,D) BC_EXT(12, C, D) /* [1, Table F-5] */ +#define BFii(C,D) BC_EXT( 4, C, D) +#define BDNZi(D) BCiii(16, 0, D) +#define BDNZTii(C,D) BC_EXT( 8, C, D) +#define BDNZFii(C,D) BC_EXT( 0, C, D) +#define BDZi(D) BCiii(18, 0, D) +#define BDZTii(C,D) BC_EXT(10, C, D) +#define BDZFii(C,D) BC_EXT( 2, C, D) + +#define BCTR() BCCTRii(20, 0) /* [1, Table F-6] */ +#define BCTRL() BCCTRLii(20, 0) + +#define BLR() BCLRii(20, 0) /* [1, Table F-6] */ +#define BLRL() BCLRLii(20, 0) + + +#define BLTLRi(CR) BCLRii(12, ((CR)<<2)+0) /* [1, Table F-10] */ +#define BLELRi(CR) BCLRii( 4, ((CR)<<2)+1) +#define BEQLRi(CR) BCLRii(12, ((CR)<<2)+2) +#define BGELRi(CR) BCLRii( 4, ((CR)<<2)+0) +#define BGTLRi(CR) BCLRii(12, ((CR)<<2)+1) +#define BNLLRi(CR) BCLRii( 4, ((CR)<<2)+0) +#define BNELRi(CR) BCLRii( 4, ((CR)<<2)+2) +#define BNGLRi(CR) BCLRii( 4, ((CR)<<2)+1) +#define BSOLRi(CR) BCLRii(12, ((CR)<<2)+3) +#define BNSLRi(CR) BCLRii( 4, ((CR)<<2)+3) +#define BUNLRi(CR) BCLRii(12, ((CR)<<2)+3) +#define BNULRi(CR) BCLRii( 4, ((CR)<<2)+3) + +#define BLTLRLi(CR) BCLRLii(12, ((CR)<<2)+0) /* [1, Table F-10] */ +#define BLELRLi(CR) BCLRLii( 4, ((CR)<<2)+1) +#define BEQLRLi(CR) BCLRLii(12, ((CR)<<2)+2) +#define BGELRLi(CR) BCLRLii( 4, ((CR)<<2)+0) +#define BGTLRLi(CR) BCLRLii(12, ((CR)<<2)+1) +#define BNLLRLi(CR) BCLRLii( 4, ((CR)<<2)+0) +#define BNELRLi(CR) BCLRLii( 4, ((CR)<<2)+2) +#define BNGLRLi(CR) BCLRLii( 4, ((CR)<<2)+1) +#define BSOLRLi(CR) BCLRLii(12, ((CR)<<2)+3) +#define BNSLRLi(CR) BCLRLii( 4, ((CR)<<2)+3) +#define BUNLRLi(CR) BCLRLii(12, ((CR)<<2)+3) +#define BNULRLi(CR) BCLRLii( 4, ((CR)<<2)+3) + +#define BLTCTRi(CR) BCCTRii(12, ((CR)<<2)+0) /* [1, Table F-10] */ +#define BLECTRi(CR) BCCTRii( 4, ((CR)<<2)+1) +#define BEQCTRi(CR) BCCTRii(12, ((CR)<<2)+2) +#define BGECTRi(CR) BCCTRii( 4, ((CR)<<2)+0) +#define BGTCTRi(CR) BCCTRii(12, ((CR)<<2)+1) +#define BNLCTRi(CR) BCCTRii( 4, ((CR)<<2)+0) +#define BNECTRi(CR) BCCTRii( 4, ((CR)<<2)+2) +#define BNGCTRi(CR) BCCTRii( 4, ((CR)<<2)+1) +#define BSOCTRi(CR) BCCTRii(12, ((CR)<<2)+3) +#define BNSCTRi(CR) BCCTRii( 4, ((CR)<<2)+3) +#define BUNCTRi(CR) BCCTRii(12, ((CR)<<2)+3) +#define BNUCTRi(CR) BCCTRii( 4, ((CR)<<2)+3) + +#define BLTCTRLi(CR) BCCTRLii(12, ((CR)<<2)+0) /* [1, Table F-10] */ +#define BLECTRLi(CR) BCCTRLii( 4, ((CR)<<2)+1) +#define BEQCTRLi(CR) BCCTRLii(12, ((CR)<<2)+2) +#define BGECTRLi(CR) BCCTRLii( 4, ((CR)<<2)+0) +#define BGTCTRLi(CR) BCCTRLii(12, ((CR)<<2)+1) +#define BNLCTRLi(CR) BCCTRLii( 4, ((CR)<<2)+0) +#define BNECTRLi(CR) BCCTRLii( 4, ((CR)<<2)+2) +#define BNGCTRLi(CR) BCCTRLii( 4, ((CR)<<2)+1) +#define BSOCTRLi(CR) BCCTRLii(12, ((CR)<<2)+3) +#define BNSCTRLi(CR) BCCTRLii( 4, ((CR)<<2)+3) +#define BUNCTRLi(CR) BCCTRLii(12, ((CR)<<2)+3) +#define BNUCTRLi(CR) BCCTRLii( 4, ((CR)<<2)+3) + + +#define BLTLR() BLTLRi(0) /* with implicit _cr0 */ +#define BLELR() BLELRi(0) +#define BEQLR() BEQLRi(0) +#define BGELR() BGELRi(0) +#define BGTLR() BGTLRi(0) +#define BNLLR() BNLLRi(0) +#define BNELR() BNELRi(0) +#define BNGLR() BNGLRi(0) +#define BSOLR() BSOLRi(0) +#define BNSLR() BNSLRi(0) +#define BUNLR() BUNLRi(0) +#define BNULR() BNULRi(0) + +#define BLTLRL() BLTLRLi(0) +#define BLELRL() BLELRLi(0) +#define BEQLRL() BEQLRLi(0) +#define BGELRL() BGELRLi(0) +#define BGTLRL() BGTLRLi(0) +#define BNLLRL() BNLLRLi(0) +#define BNELRL() BNELRLi(0) +#define BNGLRL() BNGLRLi(0) +#define BSOLRL() BSOLRLi(0) +#define BNSLRL() BNSLRLi(0) +#define BUNLRL() BUNLRLi(0) +#define BNULRL() BNULRLi(0) + +#define BLTCTR() BLTCTRi(0) +#define BLECTR() BLECTRi(0) +#define BEQCTR() BEQCTRi(0) +#define BGECTR() BGECTRi(0) +#define BGTCTR() BGTCTRi(0) +#define BNLCTR() BNLCTRi(0) +#define BNECTR() BNECTRi(0) +#define BNGCTR() BNGCTRi(0) +#define BSOCTR() BSOCTRi(0) +#define BNSCTR() BNSCTRi(0) +#define BUNCTR() BUNCTRi(0) +#define BNUCTR() BNUCTRi(0) + +#define BLTCTRL() BLTCTRLi(0) +#define BLECTRL() BLECTRLi(0) +#define BEQCTRL() BEQCTRLi(0) +#define BGECTRL() BGECTRLi(0) +#define BGTCTRL() BGTCTRLi(0) +#define BNLCTRL() BNLCTRLi(0) +#define BNECTRL() BNECTRLi(0) +#define BNGCTRL() BNGCTRLi(0) +#define BSOCTRL() BSOCTRLi(0) +#define BNSCTRL() BNSCTRLi(0) +#define BUNCTRL() BUNCTRLi(0) +#define BNUCTRL() BNUCTRLi(0) + + +#define BLTii(C,D) BC_EXT(12, ((C)<<2)+0, D) /* [1, Table F-11] */ +#define BNLii(C,D) BC_EXT( 4, ((C)<<2)+0, D) +#define BGEii(C,D) BC_EXT( 4, ((C)<<2)+0, D) +#define BGTii(C,D) BC_EXT(12, ((C)<<2)+1, D) +#define BNGii(C,D) BC_EXT( 4, ((C)<<2)+1, D) +#define BLEii(C,D) BC_EXT( 4, ((C)<<2)+1, D) +#define BEQii(C,D) BC_EXT(12, ((C)<<2)+2, D) +#define BNEii(C,D) BC_EXT( 4, ((C)<<2)+2, D) +#define BSOii(C,D) BC_EXT(12, ((C)<<2)+3, D) +#define BNSii(C,D) BC_EXT( 4, ((C)<<2)+3, D) +#define BUNii(C,D) BC_EXT(12, ((C)<<2)+3, D) +#define BNUii(C,D) BC_EXT( 4, ((C)<<2)+3, D) + +#define BLTi(D) BLTii(0,D) /* with implicit _cr0 */ +#define BLEi(D) BLEii(0,D) +#define BEQi(D) BEQii(0,D) +#define BGEi(D) BGEii(0,D) +#define BGTi(D) BGTii(0,D) +#define BNLi(D) BNLii(0,D) +#define BNEi(D) BNEii(0,D) +#define BNGi(D) BNGii(0,D) +#define BSOi(D) BSOii(0,D) +#define BNSi(D) BNSii(0,D) +#define BUNi(D) BUNii(0,D) +#define BNUi(D) BNUii(0,D) + +#define BLTLii(C,D) BCLiii(12, ((C)<<2)+0, D) /* [1, Table F-??] */ +#define BLELii(C,D) BCLiii( 4, ((C)<<2)+1, D) +#define BEQLii(C,D) BCLiii(12, ((C)<<2)+2, D) +#define BGELii(C,D) BCLiii( 4, ((C)<<2)+0, D) +#define BGTLii(C,D) BCLiii(12, ((C)<<2)+1, D) +#define BNLLii(C,D) BCLiii( 4, ((C)<<2)+0, D) +#define BNELii(C,D) BCLiii( 4, ((C)<<2)+2, D) +#define BNGLii(C,D) BCLiii( 4, ((C)<<2)+1, D) +#define BSOLii(C,D) BCLiii(12, ((C)<<2)+3, D) +#define BNSLii(C,D) BCLiii( 4, ((C)<<2)+3, D) +#define BUNLii(C,D) BCLiii(12, ((C)<<2)+3, D) +#define BNULii(C,D) BCLiii( 4, ((C)<<2)+3, D) + +#define BLTLi(D) BLTLii(0,D) /* with implicit _cr0 */ +#define BLELi(D) BLELii(0,D) +#define BEQLi(D) BEQLii(0,D) +#define BGELi(D) BGELii(0,D) +#define BGTLi(D) BGTLii(0,D) +#define BNLLi(D) BNLLii(0,D) +#define BNELi(D) BNELii(0,D) +#define BNGLi(D) BNGLii(0,D) +#define BSOLi(D) BSOLii(0,D) +#define BNSLi(D) BNSLii(0,D) +#define BUNLi(D) BUNLii(0,D) +#define BNULi(D) BNULii(0,D) + +/* Note: there are many tens of other simplified branches that are not (yet?) defined here */ + +#define CRSETi(BX) CREQViii(BX, BX, BX) /* [1, Table F-15] */ +#define CRCLRi(BX) CRXORiii(BX, BX, BX) +#define CRMOVEii(BX,BY) CRORiii(BX, BY, BY) +#define CRNOTii(BX,BY) CRNORiii(BX, BY, BY) + +#define MTLRr(RS) MTSPRir(8, RS) /* [1, Table F-20] */ +#define MFLRr(RD) MFSPRri(RD, 8) +#define MTCTRr(RS) MTSPRir(9, RS) +#define MFCTRr(RD) MFSPRri(RD, 9) +#define MTXERr(RS) MTSPRir(1, RS) +#define MFXERr(RD) MFSPRri(RD, 1) + +#define NOP() ORIrri(0, 0, 0) /* [1, Section F.9] */ +#define LIri(RD,IM) ADDIrri(RD, 0, IM) +#define LISri(RD,IM) ADDISrri(RD, 0, IM) +#define LArm(RD,D,RA) ADDIrri(RD, RA, D) +#define LArrr(RD,RB,RA) ADDIrrr(RD, RA, RB) +#define MRrr(RA,RS) ORrrr(RA, RS, RS) +#define NOTrr(RA,RS) NORrrr(RA, RS, RS) + +/* alternative parenthesised forms of extended indexed load/store insns */ + +#define LBZUrx(RD,RA,RB) LBZUXrrr(RD,RA,RB) +#define LBZrx(RD,RA,RB) LBZXrrr(RD,RA,RB) +#define LHAUrx(RD,RA,RB) LHAUXrrr(RD,RA,RB) +#define LHArx(RD,RA,RB) LHAXrrr(RD,RA,RB) +#define LHBRrx(RD,RA,RB) LHBRXrrr(RD,RA,RB) +#define LHZUrx(RD,RA,RB) LHZUXrrr(RD,RA,RB) +#define LHZrx(RD,RA,RB) LHZXrrr(RD,RA,RB) +#define LWBRrx(RD,RA,RB) LWBRXrrr(RD,RA,RB) +#define LWZUrx(RD, RA, RB) LWZUXrrr(RD, RA, RB) +#define LWZrx(RD, RA, RB) LWZXrrr(RD, RA, RB) +#define STBUrx(RD,RA,RB) STBUXrrr(RD,RA,RB) +#define STBrx(RD,RA,RB) STBXrrr(RD,RA,RB) +#define STHBRrx(RS,RA,RB) STHBRXrrr(RS,RA,RB) +#define STHUrx(RS,RA,RB) STHUXrrr(RS,RA,RB) +#define STHrx(RS,RA,RB) STHXrrr(RS,RA,RB) +#define STWBRrx(RS,RA,RB) STWBRXrrr(RS,RA,RB) +#define STWCrx(RS,RA,RB) STWCXrrr(RS,RA,RB) +#define STWCX_rx(RS,RA,RB) STWCX_rrr(RS,RA,RB) +#define STWUrx(RS,RA,RB) STWUXrrr(RS,RA,RB) +#define STWrx(RS,RA,RB) STWXrrr(RS,RA,RB) +#define LArx(RD,RB,RA) LArrr(RD,RB,RA) + + +#define _LO(I) (_jit_UL(I) & _MASK(16)) +#define _HI(I) (_jit_UL(I) >> (16)) + +#define _A(OP,RD,RA,RB,RC,XO,RCx) _jit_I((_u6(OP)<<26)|(_u5(RD)<<21)|(_u5(RA)<<16)|( _u5(RB)<<11)|_u5(RC)<<6|(_u5(XO)<<1)|_u1(RCx)) + +#define LFDrri(RD,RA,imm) _D(50,RD,RA,imm) +#define LFDUrri(RD,RA,imm) _D(51,RD,RA,imm) +#define LFDUxrrr(RD,RA,RB) _X(31,RD,RA,RB,631,0) +#define LFDxrrr(RD,RA,RB) _X(31,RD,RA,RB,599,0) + +#define LFSrri(RD,RA,imm) _D(48,RD,RA,imm) +#define LFSUrri(RD,RA,imm) _D(49,RD,RA,imm) +#define LFSUxrrr(RD,RA,RB) _X(31,RD,RA,RB,567,0) +#define LFSxrrr(RD,RA,RB) _X(31,RD,RA,RB,535,0) + +#define STFDrri(RS,RA,imm) _D(54,RS,RA,imm) +#define STFDUrri(RS,RA,imm) _D(55,RS,RA,imm) +#define STFDUxrrr(RS,RA,RB) _X(31,RS,RA,RB,759,0) +#define STFDxrrr(RS,RA,RB) _X(31,RS,RA,RB,727,0) + +#define STFSrri(RS,RA,imm) _D(52,RS,RA,imm) +#define STFSUrri(RS,RA,imm) _D(53,RS,RA,imm) +#define STFSUxrrr(RS,RA,RB) _X(31,RS,RA,RB,695,0) +#define STFSxrrr(RS,RA,RB) _X(31,RS,RA,RB,663,0) +#define STFIWXrrr(RS,RA,RB) _X(31,RS,RA,RB,983,0) + +#define FADDDrrr(RD,RA,RB) _A(63,RD,RA,RB,0,21,0) +#define FADDSrrr(RD,RA,RB) _A(59,RD,RA,RB,0,21,0) +#define FSUBDrrr(RD,RA,RB) _A(63,RD,RA,RB,0,20,0) +#define FSUBSrrr(RD,RA,RB) _A(59,RD,RA,RB,0,20,0) +#define FMULDrrr(RD,RA,RC) _A(63,RD,RA,0,RC,25,0) +#define FMULSrrr(RD,RA,RC) _A(59,RD,RA,0,RC,25,0) +#define FDIVDrrr(RD,RA,RB) _A(63,RD,RA,RB,0,18,0) +#define FDIVSrrr(RD,RA,RB) _A(59,RD,RA,RB,0,25,0) +#define FSQRTDrr(RD,RB) _A(63,RD,0,RB,0,22,0) +#define FSQRTSrr(RD,RB) _A(59,RD,0,RB,0,22,0) +#define FSELrrrr(RD,RA,RB,RC) _A(63,RD,RA,RB,RC,23,0) +#define FCTIWrr(RD,RB) _X(63,RD,0,RB,14,0) +#define FCTIWZrr(RD,RB) _X(63,RD,0,RB,15,0) +#define FRSPrr(RD,RB) _X(63,RD,0,RB,12,0) +#define FABSrr(RD,RB) _X(63,RD,0,RB,264,0) +#define FNABSrr(RD,RB) _X(63,RD,0,RB,136,0) +#define FNEGrr(RD,RB) _X(63,RD,0,RB,40,0) +#define FMOVErr(RD,RB) _X(63,RD,0,RB,72,0) +#define FCMPOrrr(CR,RA,RB) _X(63,_u3((CR)<<2),RA,RB,32,0) +#define FCMPUrrr(CR,RA,RB) _X(63,_u3((CR)<<2),RA,RB,0,0) +#define MTFSFIri(CR,IMM) _X(63,_u5((CR)<<2),0,_u5((IMM)<<1),134,0) + +/*** References: + * + * [1] "PowerPC Microprocessor Family: The Programming Environments For 32-Bit Microprocessors", Motorola, 1997. + */ + + +#endif +#endif /* __ccg_asm_ppc_h */ diff --git a/src/mzscheme/src/lightning/ppc/core-common.h b/src/mzscheme/src/lightning/ppc/core-common.h new file mode 100644 index 0000000000..456778b58b --- /dev/null +++ b/src/mzscheme/src/lightning/ppc/core-common.h @@ -0,0 +1,626 @@ +/******************************** -*- 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 2.1, 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, 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + ***********************************************************************/ + + +#ifndef __lightning_core_common_h +#define __lightning_core_common_h_ + +typedef struct { + union { + jit_insn *pc; + _uc *uc_pc; + _us *us_pc; + _ui *ui_pc; + _ul *ul_pc; + } x; + struct jit_fp *fp; + struct jit_local_state jitl; +} jit_state; + +#if 0 +# ifdef jit_init +static jit_state _jit = jit_init (); +# else +static jit_state _jit; +# endif +#endif + +#define JIT_NOREG (-1) +#define JIT_R0 JIT_R(0) +#define JIT_R1 JIT_R(1) +#define JIT_R2 JIT_R(2) +#define JIT_V0 JIT_V(0) +#define JIT_V1 JIT_V(1) +#define JIT_V2 JIT_V(2) + +#define _jitl _jit.jitl + +#define jit_get_ip() (*(jit_code *) &_jit.x.pc) +#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_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 */ +#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_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_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_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)) +#define jit_movi_ui(d, rs) jit_movi_i((d), (rs)) +#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_subci_ui(d, rs, is) jit_subci_i((d), (rs), (is)) +#define jit_subcr_ui(d, s1, s2) jit_subcr_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)) +#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)) + +#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_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_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_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)) +#define jit_movi_ul(d, rs) jit_movi_l((d), (rs)) +#define jit_movr_ul(d, rs) jit_movr_l((d), (rs)) +#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_subci_ul(d, rs, is) jit_subci_l((d), (rs), (is)) +#define jit_subcr_ul(d, s1, s2) jit_subcr_l((d), (s1), (s2)) +#define jit_subxi_ui(d, rs, is) jit_subxi_i((d), (rs), (is)) +#define jit_subxi_ul(d, rs, is) jit_subxi_l((d), (rs), (is)) +#define jit_subxr_ui(d, s1, s2) jit_subxr_i((d), (s1), (s2)) +#define jit_subxr_ul(d, s1, s2) jit_subxr_i((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)) +#define jit_movr_p(d, rs) jit_movr_ul((d), (rs)) +#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.x.pc) +#endif + +#define jit_patch(pv) jit_patch_at ((pv), (_jit.x.pc)) + +#ifndef jit_addci_i +#define jit_addci_i(d, rs, is) jit_addi_i((d), (rs), (is)) +#define jit_addcr_i(d, s1, s2) jit_addr_i((d), (s1), (s2)) +#define jit_addci_l(d, rs, is) jit_addi_l((d), (rs), (is)) +#define jit_addcr_l(d, s1, s2) jit_addr_l((d), (s1), (s2)) +#endif + +#ifndef jit_subcr_i +#define jit_subcr_i(d, s1, s2) jit_subr_i((d), (s1), (s2)) +#endif + +/* 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)) +# define jit_negr_l(d, rs) jit_subr_l((d), JIT_RZERO, (rs)) +# 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 */ + +/* 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 + +/* Common 'shortcut' implementations */ +#define jit_subi_i(d, rs, is) jit_addi_i((d), (rs), -(is)) +#define jit_subi_l(d, rs, is) jit_addi_l((d), (rs), -(is)) +#define jit_subci_i(d, rs, is) jit_addci_i((d), (rs), -(is)) +#define jit_subci_l(d, rs, is) jit_addci_l((d), (rs), -(is)) +#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)) +#define jit_rsbr_i(d, s1, s2) jit_subr_i((d), (s2), (s1)) +#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 */ +#define jit_notr_c(d, rs) jit_xori_c((d), (rs), 255) +#define jit_notr_uc(d, rs) jit_xori_c((d), (rs), 255) +#define jit_notr_s(d, rs) jit_xori_s((d), (rs), 65535) +#define jit_notr_us(d, rs) jit_xori_s((d), (rs), 65535) +#define jit_notr_i(d, rs) jit_xori_i((d), (rs), ~0) +#define jit_notr_ui(d, rs) jit_xori_i((d), (rs), ~0) +#define jit_notr_l(d, rs) jit_xori_l((d), (rs), ~0L) +#define jit_notr_ul(d, rs) jit_xori_l((d), (rs), ~0L) + +#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 + +#ifdef jit_addi_l /* sizeof(long) != sizeof(int) */ +#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 + +#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) + +/* 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)) +#define jit_ldi_ul(rd, is) jit_ldxi_ul((rd), JIT_RZERO, (is)) +#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)) +#define jit_ldr_ul(rd, rs) jit_ldxr_ul((rd), JIT_RZERO, (rs)) +#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)) +#define jit_ldxi_p(rd, rs, is) jit_ldxi_l((rd), (rs), (is)) + + +/* 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), (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), (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), (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), (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), (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), (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), (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), (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), (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), (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), (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), (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_FP +#define jit_getarg_c(reg, ofs) jit_extr_c_i ((reg), (ofs)) +#define jit_getarg_i(reg, ofs) jit_movr_i ((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_i ((reg), (ofs)) +#define jit_getarg_uc(reg, ofs) jit_extr_uc_ui((reg), (ofs)) +#define jit_getarg_ui(reg, ofs) jit_movr_ui ((reg), (ofs)) +#define jit_getarg_ul(reg, ofs) jit_extr_uc_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_FP, (ofs)); +#define jit_getarg_uc(reg, ofs) jit_ldxi_uc((reg), JIT_FP, (ofs)); +#define jit_getarg_s(reg, ofs) jit_ldxi_s((reg), JIT_FP, (ofs)); +#define jit_getarg_us(reg, ofs) jit_ldxi_us((reg), JIT_FP, (ofs)); +#define jit_getarg_i(reg, ofs) jit_ldxi_i((reg), JIT_FP, (ofs)); +#define jit_getarg_ui(reg, ofs) jit_ldxi_ui((reg), JIT_FP, (ofs)); +#define jit_getarg_l(reg, ofs) jit_ldxi_l((reg), JIT_FP, (ofs)); +#define jit_getarg_ul(reg, ofs) jit_ldxi_ul((reg), JIT_FP, (ofs)); +#define jit_getarg_p(reg, ofs) jit_ldxi_p((reg), JIT_FP, (ofs)); +#endif +#endif + + +/* Common definitions when sizeof(long) = sizeof(int) */ +#ifndef jit_addi_l +#define JIT_LONG_IS_INT + +/* 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_addci_l(d, rs, is) jit_addci_i((d), (rs), (is)) +#define jit_addcr_l(d, s1, s2) jit_addcr_i((d), (s1), (s2)) +#define jit_addxi_l(d, rs, is) jit_addxi_i((d), (rs), (is)) +#define jit_addxr_l(d, s1, s2) jit_addxr_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)) +#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_subcr_l(d, s1, s2) jit_subcr_i((d), (s1), (s2)) +#define jit_subxi_l(d, rs, is) jit_subxi_i((d), (rs), (is)) +#define jit_subxr_l(d, s1, s2) jit_subxr_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)) + +#ifndef jit_rsbi_l +#define jit_rsbi_l(d, rs, is) jit_rsbi_i((d), (rs), (is)) +#endif + +#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)) + +/* 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)) +#define jit_ldr_ul(d, rs) jit_ldr_ui((d), (rs)) +#define jit_ldi_ul(d, is) jit_ldi_ui((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)) +#define jit_ldxr_ui(d, s1, s2) jit_ldxr_i((d), (s1), (s2)) +#define jit_ldxi_ui(d, rs, is) jit_ldxi_i((d), (rs), (is)) +#define jit_ldxr_ul(d, s1, s2) jit_ldxr_ui((d), (s1), (s2)) +#define jit_ldxi_ul(d, rs, is) jit_ldxi_ui((d), (rs), (is)) + + +/* 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 + +#endif /* __lightning_core_common_h_ */ diff --git a/src/mzscheme/src/lightning/ppc/core.h b/src/mzscheme/src/lightning/ppc/core.h new file mode 100644 index 0000000000..b46651ec0e --- /dev/null +++ b/src/mzscheme/src/lightning/ppc/core.h @@ -0,0 +1,299 @@ +/******************************** -*- C -*- **************************** + * + * Platform-independent layer (PowerPC version) + * + ***********************************************************************/ + + +/*********************************************************************** + * + * 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 2.1, 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, 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + ***********************************************************************/ + + + + +#ifndef __lightning_core_h +#define __lightning_core_h + +struct jit_local_state { + int nextarg_puti; /* number of integer args */ + int nextarg_putf; /* number of float args */ + int nextarg_putd; /* number of double args */ + int nextarg_geti; /* Next r20-r25 reg. to be read */ + int nextarg_getd; /* The FP args are picked up from FPR1 -> FPR10 */ + int nbArgs; /* Number of arguments for the prolog */ + int long_jumps; /* 1 => patch or leave room for long jumps */ +}; + +#define JIT_SP 1 +#define JIT_RET 3 +#define JIT_R_NUM 3 +#define JIT_V_NUM 7 +#define JIT_R(i) (9+(i)) +#define JIT_V(i) (31-(i)) +#define JIT_AUX JIT_V(JIT_V_NUM) /* for 32-bit operands & shift counts */ + +#define jit_pfx_start() (_jit.jitl.trampolines) +#define jit_pfx_end() (_jit.jitl.free) + +/* If possible, use the `small' instruction (rd, rs, imm) + * else load imm into r26 and use the `big' instruction (rd, rs, r26) + */ +#define jit_chk_ims(imm, small, big) (_siP(16,(imm)) ? (small) : (MOVEIri(JIT_AUX, imm), (big)) ) +#define jit_chk_imu(imm, small, big) (_uiP(16,(imm)) ? (small) : (MOVEIri(JIT_AUX, imm), (big)) ) +#define jit_chk_imu15(imm, small, big) (_uiP(15,(imm)) ? (small) : (MOVEIri(JIT_AUX, imm), (big)) ) + +#define jit_big_ims(imm, big) (MOVEIri(JIT_AUX, imm), (big)) +#define jit_big_imu(imm, big) (MOVEIri(JIT_AUX, imm), (big)) + +/* Helper macros for branches */ +#define jit_s_brai(rs, is, jmp) (jit_chk_ims (is, CMPWIri(rs, is), CMPWrr(rs, JIT_AUX)), jmp, _jit.x.pc) +#define jit_s_brar(s1, s2, jmp) ( CMPWrr(s1, s2), jmp, _jit.x.pc) +#define jit_u_brai(rs, is, jmp) (jit_chk_imu (is, CMPLWIri(rs, is), CMPLWrr(rs, JIT_AUX)), jmp, _jit.x.pc) +#define jit_u_brar(s1, s2, jmp) ( CMPLWrr(s1, s2), jmp, _jit.x.pc) + +/* Helper macros for boolean tests. */ +#define jit_sbooli(d, rs, is, jmp) (jit_chk_ims (is, CMPWIri (rs, is), CMPWrr(rs, JIT_AUX)), MFCRr((d)), EXTRWIrrii((d), (d), 1, (jmp))) +#define jit_sboolr(d, s1, s2, jmp) ( CMPWrr (s1, s2), MFCRr((d)), EXTRWIrrii((d), (d), 1, (jmp))) +#define jit_sbooli2(d, rs, is, jmp) (jit_chk_ims (is, CMPWIri (rs, is), CMPWrr(rs, JIT_AUX)), MFCRr((d)), EXTRWIrrii((d), (d), 1, (jmp)), XORIrri((d), (d), 1)) +#define jit_sboolr2(d, s1, s2, jmp) ( CMPWrr (s1, s2), MFCRr((d)), EXTRWIrrii((d), (d), 1, (jmp)), XORIrri((d), (d), 1)) +#define jit_ubooli(d, rs, is, jmp) (jit_chk_imu (is, CMPLWIri(rs, is), CMPLWrr(rs, JIT_AUX)), MFCRr((d)), EXTRWIrrii((d), (d), 1, (jmp))) +#define jit_uboolr(d, s1, s2, jmp) ( CMPLWrr (s1, s2), MFCRr((d)), EXTRWIrrii((d), (d), 1, (jmp))) +#define jit_ubooli2(d, rs, is, jmp) (jit_chk_imu (is, CMPLWIri(rs, is), CMPLWrr(rs, JIT_AUX)), MFCRr((d)), EXTRWIrrii((d), (d), 1, (jmp)), XORIrri((d), (d), 1)) +#define jit_uboolr2(d, s1, s2, jmp) ( CMPLWrr (s1, s2), MFCRr((d)), EXTRWIrrii((d), (d), 1, (jmp)), XORIrri((d), (d), 1)) + +/* modulus with immediate + * movei r26, imm + * mtlr r31 + * divw r31, rs, r26 (or divwu) + * mullw r31, r31, r26 + * sub rs, rs, r26 + * mflr r31 + */ + +#define _jit_mod(div, rs, imm) (MOVEIri(JIT_AUX, (imm)), MTLRr(31), (div), \ + MULLWrrr(31, 31, JIT_AUX), SUBrrr((rs), (rs), JIT_AUX), \ + MFLRr(31)) + +/* Patch a movei instruction made of a LIS at lis_pc and an ORI at ori_pc. */ +#define jit_patch_movei(lis_pc, ori_pc, dest) \ + (*(lis_pc) &= ~_MASK(16), *(lis_pc) |= _HI(dest), \ + *(ori_pc) &= ~_MASK(16), *(ori_pc) |= _LO(dest)) \ + +/* Patch a branch instruction */ +#define jit_patch_branch(jump_pc,pv) \ + (*(jump_pc) &= ~_MASK(16) | 3, \ + *(jump_pc) |= (_jit_UL(pv) - _jit_UL(jump_pc)) & _MASK(16)) + +#define jit_patch_ucbranch(jump_pc,pv) \ + (*(jump_pc) &= ~_MASK(26) | 3, \ + (*(jump_pc) |= (_jit_UL((pv)) - _jit_UL(jump_pc)) & _MASK(26))) + +#define _jit_b_encoding (18 << 26) +#define _jit_blr_encoding ((19 << 26) | (20 << 21) | (00 << 16) | (00 << 11) | (16 << 1)) +#define _jit_is_ucbranch(a) (((*(a) & (63<<26)) == _jit_b_encoding)) + +#define jit_patch_at(jump_pc, value) ( \ + ((*(jump_pc - 1) & ~1) == _jit_blr_encoding) \ + ? jit_patch_movei(((jump_pc) - 4), ((jump_pc) - 3), (value)) \ + : ( _jit_is_ucbranch((jump_pc) - 1) \ + ? jit_patch_ucbranch((jump_pc) - 1, (value)) \ + : jit_patch_branch((jump_pc) - 1, (value)))) + +#define jit_patch_movi(movi_pc, val) \ + jit_patch_movei((movi_pc) - 2, (movi_pc) - 1, (val)) + +#define jit_arg_c() (_jitl.nextarg_geti++) +#define jit_arg_i() (_jitl.nextarg_geti++) +#define jit_arg_l() (_jitl.nextarg_geti++) +#define jit_arg_p() (_jitl.nextarg_geti++) +#define jit_arg_s() (_jitl.nextarg_geti++) +#define jit_arg_uc() (_jitl.nextarg_geti++) +#define jit_arg_ui() (_jitl.nextarg_geti++) +#define jit_arg_ul() (_jitl.nextarg_geti++) +#define jit_arg_us() (_jitl.nextarg_geti++) + +/* Check Mach-O-Runtime documentation: Must skip GPR(s) whenever "corresponding" FPR is used */ +#define jit_arg_f() (_jitl.nextarg_geti-- ,_jitl.nextarg_getd++) +#define jit_arg_d() (_jitl.nextarg_geti-=2,_jitl.nextarg_getd++) + +#define jit_addi_i(d, rs, is) jit_chk_ims((is), ADDICrri((d), (rs), (is)), ADDrrr((d), (rs), JIT_AUX)) +#define jit_addr_i(d, s1, s2) ADDrrr((d), (s1), (s2)) +#define jit_addci_i(d, rs, is) jit_chk_ims((is), ADDICrri((d), (rs), (is)), ADDCrrr((d), (rs), JIT_AUX)) +#define jit_addcr_i(d, s1, s2) ADDCrrr((d), (s1), (s2)) +#define jit_addxi_i(d, rs, is) (MOVEIri(JIT_AUX, (is)), ADDErrr((d), (rs), JIT_AUX)) +#define jit_addxr_i(d, s1, s2) ADDErrr((d), (s1), (s2)) +#define jit_andi_i(d, rs, is) jit_chk_imu((is), ANDI_rri((d), (rs), (is)), ANDrrr((d), (rs), JIT_AUX)) +#define jit_andr_i(d, s1, s2) ANDrrr((d), (s1), (s2)) +#define jit_bmsi_i(label, rs, is) (jit_chk_imu((is), ANDI_rri(JIT_AUX, (rs), (is)), AND_rrr(JIT_AUX, (rs), JIT_AUX)), BGTi((label)), _jit.x.pc) +#define jit_bmci_i(label, rs, is) (jit_chk_imu((is), ANDI_rri(JIT_AUX, (rs), (is)), AND_rrr(JIT_AUX, (rs), JIT_AUX)), BEQi((label)), _jit.x.pc) +#define jit_bmsr_i(label, s1, s2) ( AND_rrr(JIT_AUX, (s1), (s2)), BGTi((label)), _jit.x.pc) +#define jit_bmcr_i(label, s1, s2) ( AND_rrr(JIT_AUX, (s1), (s2)), BEQi((label)), _jit.x.pc) +#define jit_beqi_i(label, rs, is) jit_s_brai((rs), (is), BEQi((label)) ) +#define jit_beqr_i(label, s1, s2) jit_s_brar((s1), (s2), BEQi((label)) ) +#define jit_bgei_i(label, rs, is) jit_s_brai((rs), (is), BGEi((label)) ) +#define jit_bgei_ui(label, rs, is) jit_u_brai((rs), (is), BGEi((label)) ) +#define jit_bger_i(label, s1, s2) jit_s_brar((s1), (s2), BGEi((label)) ) +#define jit_bger_ui(label, s1, s2) jit_u_brar((s1), (s2), BGEi((label)) ) +#define jit_bgti_i(label, rs, is) jit_s_brai((rs), (is), BGTi((label)) ) +#define jit_bgti_ui(label, rs, is) jit_u_brai((rs), (is), BGTi((label)) ) +#define jit_bgtr_i(label, s1, s2) jit_s_brar((s1), (s2), BGTi((label)) ) +#define jit_bgtr_ui(label, s1, s2) jit_u_brar((s1), (s2), BGTi((label)) ) +#define jit_blei_i(label, rs, is) jit_s_brai((rs), (is), BLEi((label)) ) +#define jit_blei_ui(label, rs, is) jit_u_brai((rs), (is), BLEi((label)) ) +#define jit_bler_i(label, s1, s2) jit_s_brar((s1), (s2), BLEi((label)) ) +#define jit_bler_ui(label, s1, s2) jit_u_brar((s1), (s2), BLEi((label)) ) +#define jit_blti_i(label, rs, is) jit_s_brai((rs), (is), BLTi((label)) ) +#define jit_blti_ui(label, rs, is) jit_u_brai((rs), (is), BLTi((label)) ) +#define jit_bltr_i(label, s1, s2) jit_s_brar((s1), (s2), BLTi((label)) ) +#define jit_bltr_ui(label, s1, s2) jit_u_brar((s1), (s2), BLTi((label)) ) +#define jit_bnei_i(label, rs, is) jit_s_brai((rs), (is), BNEi((label)) ) +#define jit_bner_i(label, s1, s2) jit_s_brar((s1), (s2), BNEi((label)) ) +#define jit_boaddi_i(label, rs, is) (MOVEIri(JIT_AUX, (is)), ADDOrrr((rs), (rs), JIT_AUX), MCRXRi(0), BGTi((label)), _jit.x.pc) /* GT = bit 1 of XER = OV */ +#define jit_bosubi_i(label, rs, is) (MOVEIri(JIT_AUX, (is)), SUBCOrrr((rs), (rs), JIT_AUX), MCRXRi(0), BGTi((label)), _jit.x.pc) +#define jit_boaddr_i(label, s1, s2) ( ADDOrrr((s1), (s1), (s2)), MCRXRi(0), BGTi((label)), _jit.x.pc) +#define jit_bosubr_i(label, s1, s2) ( SUBCOrrr((s1), (s1), (s2)), MCRXRi(0), BGTi((label)), _jit.x.pc) +#define jit_boaddi_ui(label, rs, is) (jit_chk_ims ((is), ADDICri((rs), (rs), is), ADDCrr((rs), JIT_AUX)), MCRXRi(0), BEQi((label)), _jit.x.pc) /* EQ = bit 2 of XER = CA */ +#define jit_bosubi_ui(label, rs, is) (jit_chk_ims ((is), SUBICri((rs), (rs), is), SUBCrr((rs), JIT_AUX)), MCRXRi(0), BEQi((label)), _jit.x.pc) +#define jit_boaddr_ui(label, s1, s2) ( ADDCrr((s1), (s1), (s2)), MCRXRi(0), BEQi((label)), _jit.x.pc) +#define jit_bosubr_ui(label, s1, s2) ( SUBCrr((s1), (s1), (s2)), MCRXRi(0), BEQi((label)), _jit.x.pc) +#define jit_calli(label) ((void)jit_movi_p(JIT_AUX, (label)), MTCTRr(JIT_AUX), BCTRL(), _jitl.nextarg_puti = _jitl.nextarg_putf = _jitl.nextarg_putd = 0, _jit.x.pc) +#define jit_callr(reg) (MTCTRr(reg), BCTRL()) +#define jit_divi_i(d, rs, is) jit_big_ims((is), DIVWrrr ((d), (rs), JIT_AUX)) +#define jit_divi_ui(d, rs, is) jit_big_imu((is), DIVWUrrr((d), (rs), JIT_AUX)) +#define jit_divr_i(d, s1, s2) DIVWrrr ((d), (s1), (s2)) +#define jit_divr_ui(d, s1, s2) DIVWUrrr((d), (s1), (s2)) +#define jit_eqi_i(d, rs, is) (jit_chk_ims((is), SUBIrri(JIT_AUX, (rs), (is)), SUBrrr(JIT_AUX, (rs), JIT_AUX)), SUBFICrri((d), JIT_AUX, 0), ADDErrr((d), (d), JIT_AUX)) +#define jit_eqr_i(d, s1, s2) (SUBrrr(JIT_AUX, (s1), (s2)), SUBFICrri((d), JIT_AUX, 0), ADDErrr((d), (d), JIT_AUX)) +#define jit_extr_c_i(d, rs) EXTSBrr((d), (rs)) +#define jit_extr_s_i(d, rs) EXTSHrr((d), (rs)) +#define jit_gei_i(d, rs, is) jit_sbooli2((d), (rs), (is), _lt) +#define jit_gei_ui(d, rs, is) jit_ubooli2((d), (rs), (is), _lt) +#define jit_ger_i(d, s1, s2) jit_sboolr2((d), (s1), (s2), _lt) +#define jit_ger_ui(d, s1, s2) jit_uboolr2((d), (s1), (s2), _lt) +#define jit_gti_i(d, rs, is) jit_sbooli ((d), (rs), (is), _gt) +#define jit_gti_ui(d, rs, is) jit_ubooli ((d), (rs), (is), _gt) +#define jit_gtr_i(d, s1, s2) jit_sboolr ((d), (s1), (s2), _gt) +#define jit_gtr_ui(d, s1, s2) jit_uboolr ((d), (s1), (s2), _gt) +#define jit_hmuli_i(d, rs, is) jit_big_ims((is), MULHWrrr ((d), (rs), JIT_AUX)) +#define jit_hmuli_ui(d, rs, is) jit_big_imu((is), MULHWUrrr((d), (rs), JIT_AUX)) +#define jit_hmulr_i(d, s1, s2) MULHWrrr ((d), (s1), (s2)) +#define jit_hmulr_ui(d, s1, s2) MULHWUrrr((d), (s1), (s2)) +#define jit_jmpi(label) (B_EXT((label)), _jit.x.pc) +#define jit_jmpr(reg) (MTLRr(reg), BLR()) +#define jit_ldxi_c(d, rs, is) (jit_ldxi_uc((d), (rs), (is)), jit_extr_c_i((d), (d))) +#define jit_ldxr_c(d, s1, s2) (jit_ldxr_uc((d), (s1), (s2)), jit_extr_c_i((d), (d))) +#define jit_ldxi_i(d, rs, is) jit_chk_ims((d), LWZrm((d), (is), (rs)), LWZrx((d), JIT_AUX, (rs))) +#define jit_ldxi_s(d, rs, is) jit_chk_ims((d), LHArm((d), (is), (rs)), LHArx((d), JIT_AUX, (rs))) +#define jit_ldxi_uc(d, rs, is) jit_chk_ims((d), LBZrm((d), (is), (rs)), LBZrx((d), JIT_AUX, (rs))) +#define jit_ldxi_us(d, rs, is) jit_chk_ims((d), LHZrm((d), (is), (rs)), LHZrx((d), JIT_AUX, (rs))) +#define jit_ldxr_i(d, s1, s2) LWZrx((d), (s1), (s2)) +#define jit_ldxr_s(d, s1, s2) LHArx((d), (s1), (s2)) +#define jit_ldxr_uc(d, s1, s2) LBZrx((d), (s1), (s2)) +#define jit_ldxr_us(d, s1, s2) LHZrx((d), (s1), (s2)) +#define jit_lei_i(d, rs, is) jit_sbooli2((d), (rs), (is), _gt ) +#define jit_lei_ui(d, rs, is) jit_ubooli2((d), (rs), (is), _gt ) +#define jit_ler_i(d, s1, s2) jit_sboolr2((d), (s1), (s2), _gt ) +#define jit_ler_ui(d, s1, s2) jit_uboolr2((d), (s1), (s2), _gt ) +#define jit_lshi_i(d, rs, is) SLWIrri((d), (rs), (is)) +#define jit_lshr_i(d, s1, s2) (ANDI_rri(JIT_AUX, (s2), 31), SLWrrr ((d), (s1), JIT_AUX)) +#define jit_lti_i(d, rs, is) jit_sbooli ((d), (rs), (is), _lt ) +#define jit_lti_ui(d, rs, is) jit_ubooli ((d), (rs), (is), _lt ) +#define jit_ltr_i(d, s1, s2) jit_sboolr ((d), (s1), (s2), _lt ) +#define jit_ltr_ui(d, s1, s2) jit_uboolr ((d), (s1), (s2), _lt ) +#define jit_modi_i(d, rs, is) _jit_mod(jit_divi_i (31, (rs), JIT_AUX), (rs), (is)) +#define jit_modi_ui(d, rs, is) _jit_mod(jit_divi_ui(31, (rs), JIT_AUX), (rs), (is)) +#define jit_modr_i(d, s1, s2) (DIVWrrr(JIT_AUX, (s1), (s2)), MULLWrrr(JIT_AUX, JIT_AUX, (s2)), SUBrrr((d), (s1), JIT_AUX)) +#define jit_modr_ui(d, s1, s2) (DIVWUrrr(JIT_AUX, (s1), (s2)), MULLWrrr(JIT_AUX, JIT_AUX, (s2)), SUBrrr((d), (s1), JIT_AUX)) +#define jit_movi_i(d, is) MOVEIri((d), (is)) +#define jit_movi_p(d, is) (LISri((d), _HI((is))),ORIrri((d),(d),_LO((is))),_jit.x.pc) + +#define jit_movr_i(d, rs) MRrr((d), (rs)) +#define jit_muli_i(d, rs, is) jit_chk_ims ((is), MULLIrri((d), (rs), (is)), MULLWrrr((d), (rs), JIT_AUX)) +#define jit_muli_ui(d, rs, is) jit_chk_imu15((is), MULLIrri((d), (rs), (is)), MULLWrrr((d), (rs), JIT_AUX)) +#define jit_mulr_i(d, s1, s2) MULLWrrr((d), (s1), (s2)) +#define jit_mulr_ui(d, s1, s2) MULLWrrr((d), (s1), (s2)) +#define jit_nei_i(d, rs, is) (jit_chk_ims((is), SUBIrri(JIT_AUX, (rs), (is)), SUBrrr(JIT_AUX, (rs), JIT_AUX)), ADDICrri((d), JIT_AUX, -1), SUBFErrr((d), (d), JIT_AUX)) +#define jit_ner_i(d, s1, s2) (SUBrrr(JIT_AUX, (s1), (s2)), ADDICrri((d), JIT_AUX, -1), SUBFErrr((d), (d), JIT_AUX)) +#define jit_nop() NOP() +#define jit_ori_i(d, rs, is) jit_chk_imu((is), ORIrri((d), (rs), (is)), ORrrr((d), (rs), JIT_AUX)) +#define jit_orr_i(d, s1, s2) ORrrr((d), (s1), (s2)) +#define jit_popr_i(rs) (LWZrm((rs), 0, 1), ADDIrri(1, 1, 4)) +#define jit_prepare_i(numi) (_jitl.nextarg_puti = numi) +#define jit_prepare_f(numf) (_jitl.nextarg_putf = numf) +#define jit_prepare_d(numd) (_jitl.nextarg_putd = numd) +#define jit_prolog(n) _jit_prolog(&_jit, (n)) +#define jit_pushr_i(rs) STWUrm((rs), -4, 1) +#define jit_pusharg_i(rs) (--_jitl.nextarg_puti, MRrr((3 + _jitl.nextarg_putd * 2 + _jitl.nextarg_putf + _jitl.nextarg_puti), (rs))) +#define jit_ret() _jit_epilog(&_jit) +#define jit_retval_i(rd) MRrr((rd), 3) +#define jit_rsbi_i(d, rs, is) jit_chk_ims((is), SUBFICrri((d), (rs), (is)), SUBFCrrr((d), (rs), JIT_AUX)) +#define jit_rshi_i(d, rs, is) SRAWIrri((d), (rs), (is)) +#define jit_rshi_ui(d, rs, is) SRWIrri ((d), (rs), (is)) +#define jit_rshr_i(d, s1, s2) (ANDI_rri(JIT_AUX, (s2), 31), SRAWrrr ((d), (s1), JIT_AUX)) +#define jit_rshr_ui(d, s1, s2) (ANDI_rri(JIT_AUX, (s2), 31), SRWrrr ((d), (s1), JIT_AUX)) +#define jit_stxi_c(id, rd, rs) jit_chk_ims((id), STBrm((rs), (id), (rd)), STBrx((rs), (rd), JIT_AUX)) +#define jit_stxi_i(id, rd, rs) jit_chk_ims((id), STWrm((rs), (id), (rd)), STWrx((rs), (rd), JIT_AUX)) +#define jit_stxi_s(id, rd, rs) jit_chk_ims((id), STHrm((rs), (id), (rd)), STHrx((rs), (rd), JIT_AUX)) +#define jit_stxr_c(d1, d2, rs) STBrx((rs), (d1), (d2)) +#define jit_stxr_i(d1, d2, rs) STWrx((rs), (d1), (d2)) +#define jit_stxr_s(d1, d2, rs) STHrx((rs), (d1), (d2)) +#define jit_subr_i(d, s1, s2) SUBrrr((d), (s1), (s2)) +#define jit_subcr_i(d, s1, s2) SUBCrrr((d), (s1), (s2)) +#define jit_subxi_i(d, rs, is) jit_big_ims((is), SUBErrr((d), (rs), JIT_AUX)) +#define jit_subxr_i(d, s1, s2) SUBErrr((d), (s1), (s2)) +#define jit_xori_i(d, rs, is) jit_chk_imu((is), XORIrri((d), (rs), (is)), XORrrr((d), (rs), JIT_AUX)) +#define jit_xorr_i(d, s1, s2) XORrrr((d), (s1), (s2)) + +/* Cannot use JIT_RZERO because having 0 in a register field on the PowerPC + * does not mean `a register whose value is 0', but rather `no register at + * all' */ + +#define jit_negr_i(d, rs) jit_rsbi_i((d), (rs), 0) +#define jit_negr_l(d, rs) jit_rsbi_l((d), (rs), 0) +#define jit_ldr_c(rd, rs) jit_ldxr_c((rd), 0, (rs)) +#define jit_str_c(rd, rs) jit_stxr_c(0, (rd), (rs)) +#define jit_ldr_s(rd, rs) jit_ldxr_s((rd), 0, (rs)) +#define jit_str_s(rd, rs) jit_stxr_s(0, (rd), (rs)) +#define jit_ldr_i(rd, rs) jit_ldxr_i((rd), 0, (rs)) +#define jit_str_i(rd, rs) jit_stxr_i(0, (rd), (rs)) +#define jit_ldr_uc(rd, rs) jit_ldxr_uc((rd), 0, (rs)) +#define jit_ldr_us(rd, rs) jit_ldxr_us((rd), 0, (rs)) + +/* e.g. + * 0x01234567 _HA << 16 = 0x01230000 _LA = 0x00004567 _HA << 16 + LA = 0x01234567 + * 0x89abcdef _HA << 16 = 0x89ac0000 _LA = 0xffffcdef _HA << 16 + LA = 0x89abcdef + */ +#define _HA(addr) ((_jit_UL(addr) >> 16) + (_jit_US(_jit_UL(addr)) >> 15)) +#define _LA(addr) (_jit_UL(addr) - (_HA(addr) << 16)) + +#define jit_ldi_c(rd, is) (LISri(JIT_AUX, _HA(is)), jit_ldxi_c((rd), JIT_AUX, _LA(is))) +#define jit_sti_c(id, rs) (LISri(JIT_AUX, _HA(id)), jit_stxi_c(_LA(id), JIT_AUX, (rs))) +#define jit_ldi_s(rd, is) (LISri(JIT_AUX, _HA(is)), jit_ldxi_s((rd), JIT_AUX, _LA(is))) +#define jit_sti_s(id, rs) (LISri(JIT_AUX, _HA(id)), jit_stxi_s(_LA(id), JIT_AUX, (rs))) +#define jit_ldi_i(rd, is) (LISri(JIT_AUX, _HA(is)), jit_ldxi_i((rd), JIT_AUX, _LA(is))) +#define jit_sti_i(id, rs) (LISri(JIT_AUX, _HA(id)), jit_stxi_i(_LA(id), JIT_AUX, (rs))) +#define jit_ldi_uc(rd, is) (LISri(JIT_AUX, _HA(is)), jit_ldxi_uc((rd), JIT_AUX, _LA(is))) +#define jit_ldi_us(rd, is) (LISri(JIT_AUX, _HA(is)), jit_ldxi_us((rd), JIT_AUX, _LA(is))) + +#endif /* __lightning_core_h */ diff --git a/src/mzscheme/src/lightning/ppc/fp-common.h b/src/mzscheme/src/lightning/ppc/fp-common.h new file mode 100644 index 0000000000..907fdc4d95 --- /dev/null +++ b/src/mzscheme/src/lightning/ppc/fp-common.h @@ -0,0 +1,86 @@ +/******************************** -*- 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 2.1, 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, 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, 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) +#define jit_abs_f(rd,rs) jit_abs_d(rd,rs) +#define jit_negr_f(rd,rs) jit_negr_d(rd,rs) +#define jit_sqrt_f(rd,rs) jit_sqrt_d(rd,rs) +#define jit_extr_f_d(rs, rd) +#define jit_extr_d_f(rs, rd) +#define jit_extr_i_f(rd, rs) jit_extr_i_d(rd, rs) +#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) +#define jit_ltr_f(d, s1, s2) jit_ltr_d(d, s1, s2) +#define jit_ler_f(d, s1, s2) jit_ler_d(d, s1, s2) +#define jit_eqr_f(d, s1, s2) jit_eqr_d(d, s1, s2) +#define jit_ner_f(d, s1, s2) jit_ner_d(d, s1, s2) +#define jit_ger_f(d, s1, s2) jit_ger_d(d, s1, s2) +#define jit_gtr_f(d, s1, s2) jit_gtr_d(d, s1, s2) +#define jit_unltr_f(d, s1, s2) jit_unltr_d(d, s1, s2) +#define jit_unler_f(d, s1, s2) jit_unler_d(d, s1, s2) +#define jit_uneqr_f(d, s1, s2) jit_uneqr_d(d, s1, s2) +#define jit_ltgtr_f(d, s1, s2) jit_ltgtr_d(d, s1, s2) +#define jit_unger_f(d, s1, s2) jit_unger_d(d, s1, s2) +#define jit_ungtr_f(d, s1, s2) jit_ungtr_d(d, s1, s2) +#define jit_ordr_f(d, s1, s2) jit_ordr_d(d, s1, s2) +#define jit_unordr_f(d, s1, s2) jit_unordr_d(d, s1, s2) +#define jit_retval_f(rs) jit_retval_d(rs) +#endif diff --git a/src/mzscheme/src/lightning/ppc/fp.h b/src/mzscheme/src/lightning/ppc/fp.h new file mode 100644 index 0000000000..32541deb26 --- /dev/null +++ b/src/mzscheme/src/lightning/ppc/fp.h @@ -0,0 +1,211 @@ +/******************************** -*- C -*- **************************** + * + * Run-time assembler & support macros for the Sparc math unit + * + ***********************************************************************/ + + +/*********************************************************************** + * + * 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 2.1, 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, 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + ***********************************************************************/ + + + + +#ifndef __lightning_asm_fp_h +#define __lightning_asm_fp_h + + +#define JIT_FPR_NUM 6 +#define JIT_FPR(i) (8+(i)) + +#define JIT_FPFR 0 + +/* Make space for 1 or 2 words, store address in REG */ +#define jit_data(REG, D1) (_FBA (18, 8, 0, 1), _jit_L(D1), MFLRr(REG)) + +#define jit_addr_d(rd,s1,s2) FADDDrrr((rd),(s1),(s2)) +#define jit_subr_d(rd,s1,s2) FSUBDrrr((rd),(s1),(s2)) +#define jit_mulr_d(rd,s1,s2) FMULDrrr((rd),(s1),(s2)) +#define jit_divr_d(rd,s1,s2) FDIVDrrr((rd),(s1),(s2)) + +#define jit_addr_f(rd,s1,s2) FADDSrrr((rd),(s1),(s2)) +#define jit_subr_f(rd,s1,s2) FSUBSrrr((rd),(s1),(s2)) +#define jit_mulr_f(rd,s1,s2) FMULSrrr((rd),(s1),(s2)) +#define jit_divr_f(rd,s1,s2) FDIVSrrr((rd),(s1),(s2)) + +#define jit_movr_d(rd,rs) ( (rd) == (rs) ? 0 : FMOVErr((rd),(rs))) +#define jit_movi_d(reg0,d) do { \ + double _v = (d); \ + _FBA (18, 12, 0, 1); \ + memcpy(_jit.x.uc_pc, &_v, sizeof (double)); \ + _jit.x.uc_pc += sizeof (double); \ + MFLRr (JIT_AUX); \ + jit_ldxi_d((reg0), JIT_AUX, 0); \ + } while(0) + + +#define jit_movr_f(rd,rs) ( (rd) == (rs) ? 0 : FMOVErr((rd),(rs))) +#define jit_movi_f(reg0,f) do { \ + float _v = (f); \ + _FBA (18, 8, 0, 1); \ + memcpy(_jit.x.uc_pc, &_v, sizeof (float)); \ + _jit.x.uc_pc += sizeof (float); \ + MFLRr (JIT_AUX); \ + jit_ldxi_f((reg0), JIT_AUX, 0); \ + } while(0) + + +#define jit_abs_d(rd,rs) FABSrr((rd),(rs)) +#define jit_negr_d(rd,rs) FNEGrr((rd),(rs)) +#define jit_sqrt_d(rd,rs) FSQRTDrr((rd),(rs)) + + +#define jit_ldxi_f(reg0, rs, is) (_siP(16,(is)) ? LFSrri((reg0),(rs),(is)) : (MOVEIri(JIT_AUX,(is)),LFSxrrr((reg0),(rs),JIT_AUX))) +#define jit_ldxi_d(reg0, rs, is) (_siP(16,(is)) ? LFDrri((reg0),(rs),(is)) : (MOVEIri(JIT_AUX,(is)),LFDxrrr((reg0),(rs),JIT_AUX))) +#define jit_ldxr_f(reg0, s1, s2) LFSxrrr((reg0),(s1),(s2)) +#define jit_ldxr_d(reg0, s1, s2) LFDxrrr((reg0),(s1),(s2)) +#define jit_ldi_f(reg0, is) (_siP(16,(is)) ? LFSrri((reg0),0,(is)) : (MOVEIri(JIT_AUX,(is)),LFSrri((reg0),JIT_AUX,0))) +#define jit_ldi_d(reg0, is) (_siP(16,(is)) ? LFDrri((reg0),0,(is)) : (MOVEIri(JIT_AUX,(is)),LFDrri((reg0),JIT_AUX,0))) +#define jit_ldr_f(reg0, rs) LFSrri((reg0),(rs),0) +#define jit_ldr_d(reg0, rs) LFDrri((reg0),(rs),0) +#define jit_stxi_f(id, rd, reg0) (_siP(16,(id)) ? STFSrri((reg0),(rd),(id)) : (MOVEIri(JIT_AUX,(id)),STFSrri((reg0),(rd),JIT_AUX))) +#define jit_stxi_d(id, rd, reg0) (_siP(16,(id)) ? STFDrri((reg0),(rd),(id)) : (MOVEIri(JIT_AUX,(id)),STFDrri((reg0),(rd),JIT_AUX))) +#define jit_stxr_f(d1, d2, reg0) STFSxrrr((reg0),(d1),(d2)) +#define jit_stxr_d(d1, d2, reg0) STFDxrrr((reg0),(d1),(d2)) +#define jit_sti_f(id, reg0) (_siP(16,(id)) ? STFSrri((reg0),0,(id)) : (MOVEIri(JIT_AUX,(id)),STFSrri((reg0),JIT_AUX,0))) +#define jit_sti_d(id, reg0) (_siP(16,(id)) ? STFDrri((reg0),0,(id)) : (MOVEIri(JIT_AUX,(id)),STFDrri((reg0),JIT_AUX,0))) +#define jit_str_f(rd, reg0) STFSrri((reg0),(rd),0) +#define jit_str_d(rd, reg0) STFDrri((reg0),(rd),0) + +#define jit_fpboolr(d, s1, s2, rcbit) ( \ + FCMPOrrr(_cr0,(s1),(s2)), \ + MFCRr((d)), \ + EXTRWIrrii((d), (d), 1, (rcbit))) + +#define jit_fpboolr_neg(d, s1, s2,rcbit) ( \ + FCMPOrrr(_cr0,(s1),(s2)), \ + MFCRr((d)), \ + EXTRWIrrii((d), (d), 1, (rcbit)), \ + XORIrri((d), (d), 1)) + +#define jit_fpboolur(d, s1, s2, rcbit) ( \ + FCMPUrrr(_cr0,(s1),(s2)), \ + MFCRr((d)), \ + EXTRWIrrii((d), (d), 1, (rcbit))) + +#define jit_fpboolur_neg(d, s1, s2,rcbit) ( \ + FCMPUrrr(_cr0,(s1),(s2)), \ + MFCRr((d)), \ + EXTRWIrrii((d), (d), 1, (rcbit)), \ + XORIrri((d), (d), 1)) + +#define jit_fpboolur_or(d, s1, s2, bit1, bit2) (\ + FCMPUrrr(_cr0,(s1),(s2)), \ + CRORiii((bit1), (bit1), (bit2)), \ + MFCRr((d)), \ + EXTRWIrrii((d), (d), 1, (bit1))) + +#define jit_gtr_d(d, s1, s2) jit_fpboolr ((d),(s1),(s2),_gt) +#define jit_ger_d(d, s1, s2) jit_fpboolr_neg((d),(s1),(s2),_lt) +#define jit_ltr_d(d, s1, s2) jit_fpboolr ((d),(s1),(s2),_lt) +#define jit_ler_d(d, s1, s2) jit_fpboolr_neg((d),(s1),(s2),_gt) +#define jit_eqr_d(d, s1, s2) jit_fpboolr ((d),(s1),(s2),_eq) +#define jit_ner_d(d, s1, s2) jit_fpboolr_neg((d),(s1),(s2),_eq) +#define jit_unordr_d(d, s1, s2) jit_fpboolur ((d),(s1),(s2),_un) +#define jit_ordr_d(d, s1, s2) jit_fpboolur_neg((d),(s1),(s2),_un) +#define jit_unler_d(d, s1, s2) jit_fpboolur_neg ((d), (s1), (s2), _gt) +#define jit_unltr_d(d, s1, s2) jit_fpboolur_or ((d), (s1), (s2), _un, _lt) +#define jit_unger_d(d, s1, s2) jit_fpboolur_neg ((d), (s1), (s2), _lt) +#define jit_ungtr_d(d, s1, s2) jit_fpboolur_or ((d), (s1), (s2), _un, _gt) +#define jit_ltgtr_d(d, s1, s2) jit_fpboolur_or ((d), (s1), (s2), _gt, _lt) +#define jit_uneqr_d(d, s1, s2) jit_fpboolur_or ((d), (s1), (s2), _un, _eq) + +#define jit_fpbr(d, s1, s2, rcbit) ( \ + FCMPOrrr(_cr0,(s1),(s2)), \ + BTii ((rcbit), (d))) + +#define jit_fpbr_neg(d, s1, s2,rcbit) ( \ + FCMPOrrr(_cr0,(s1),(s2)), \ + BFii ((rcbit), (d))) + +#define jit_fpbur(d, s1, s2, rcbit) ( \ + FCMPUrrr(_cr0,(s1),(s2)), \ + BTii ((rcbit), (d))) + +#define jit_fpbur_neg(d, s1, s2,rcbit) ( \ + FCMPUrrr(_cr0,(s1),(s2)), \ + BFii ((rcbit), (d))) + +#define jit_fpbur_or(d, s1, s2, bit1, bit2) ( \ + FCMPUrrr(_cr0,(s1),(s2)), \ + CRORiii((bit1), (bit1), (bit2)), \ + BTii ((bit1), (d))) + +#define jit_bgtr_d(d, s1, s2) jit_fpbr ((d),(s1),(s2),_gt) +#define jit_bger_d(d, s1, s2) jit_fpbr_neg((d),(s1),(s2),_lt) +#define jit_bltr_d(d, s1, s2) jit_fpbr ((d),(s1),(s2),_lt) +#define jit_bler_d(d, s1, s2) jit_fpbr_neg((d),(s1),(s2),_gt) +#define jit_beqr_d(d, s1, s2) jit_fpbr ((d),(s1),(s2),_eq) +#define jit_bner_d(d, s1, s2) jit_fpbr_neg((d),(s1),(s2),_eq) +#define jit_bunordr_d(d, s1, s2) jit_fpbur ((d),(s1),(s2),_un) +#define jit_bordr_d(d, s1, s2) jit_fpbur_neg((d),(s1),(s2),_un) +#define jit_bunler_d(d, s1, s2) jit_fpbur_neg ((d), (s1), (s2), _gt) +#define jit_bunltr_d(d, s1, s2) jit_fpbur_or ((d), (s1), (s2), _un, _lt) +#define jit_bunger_d(d, s1, s2) jit_fpbur_neg ((d), (s1), (s2), _lt) +#define jit_bungtr_d(d, s1, s2) jit_fpbur_or ((d), (s1), (s2), _un, _gt) +#define jit_bltgtr_d(d, s1, s2) jit_fpbur_or ((d), (s1), (s2), _gt, _lt) +#define jit_buneqr_d(d, s1, s2) jit_fpbur_or ((d), (s1), (s2), _un, _eq) + +#define jit_getarg_f(rd, ofs) jit_movr_f((rd),(ofs)) +#define jit_getarg_d(rd, ofs) jit_movr_d((rd),(ofs)) +#define jit_pusharg_d(rs) (_jitl.nextarg_putd--,jit_movr_d((_jitl.nextarg_putf+_jitl.nextarg_putd+1), (rs))) +#define jit_pusharg_f(rs) (_jitl.nextarg_putf--,jit_movr_f((_jitl.nextarg_putf+_jitl.nextarg_putd+1), (rs))) +#define jit_retval_d(op1) jit_movr_d(1, (op1)) +#define jit_retval_f(op1) jit_movr_f(1, (op1)) + + +#define jit_floorr_d_i(rd,rs) (MTFSFIri(7,3), \ + FCTIWrr(7,(rs)), \ + MOVEIri(JIT_AUX,-4), \ + STFIWXrrr(7,JIT_SP,JIT_AUX), \ + LWZrm((rd),-4,JIT_SP)) + +#define jit_ceilr_d_i(rd,rs) (MTFSFIri(7,2), \ + FCTIWrr(7,(rs)), \ + MOVEIri(JIT_AUX,-4), \ + STFIWXrrr(7,JIT_SP,JIT_AUX), \ + LWZrm((rd),-4,JIT_SP)) + +#define jit_roundr_d_i(rd,rs) (MTFSFIri(7,0), \ + FCTIWrr(7,(rs)), \ + MOVEIri(JIT_AUX,-4), \ + STFIWXrrr(7,JIT_SP,JIT_AUX), \ + LWZrm((rd),-4,JIT_SP)) + +#define jit_truncr_d_i(rd,rs) (FCTIWZrr(7,(rs)), \ + MOVEIri(JIT_AUX,-4), \ + STFIWXrrr(7,JIT_SP,JIT_AUX), \ + LWZrm((rd),-4,JIT_SP)) + +#endif /* __lightning_asm_h */ diff --git a/src/mzscheme/src/lightning/ppc/funcs-common.h b/src/mzscheme/src/lightning/ppc/funcs-common.h new file mode 100644 index 0000000000..278c544f3c --- /dev/null +++ b/src/mzscheme/src/lightning/ppc/funcs-common.h @@ -0,0 +1,54 @@ +/******************************** -*- 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 2.1, 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, 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + ***********************************************************************/ + +#ifndef __lightning_funcs_common_h +#define __lightning_funcs_common_h + +#include +#include + +static int jit_fail(const char *, const char*, int, const char *) JIT_UNUSED; + +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(); +} + + +#ifndef jit_start_pfx +#define jit_start_pfx() ( (jit_insn*)0x4) +#define jit_end_pfx() ( (jit_insn*)0x0) +#endif + +#endif /* __lightning_funcs_common_h */ diff --git a/src/mzscheme/src/lightning/ppc/funcs.h b/src/mzscheme/src/lightning/ppc/funcs.h new file mode 100644 index 0000000000..f390705501 --- /dev/null +++ b/src/mzscheme/src/lightning/ppc/funcs.h @@ -0,0 +1,168 @@ +/******************************** -*- C -*- **************************** + * + * Platform-independent layer inline functions (PowerPC) + * + ***********************************************************************/ + + +/*********************************************************************** + * + * Copyright 2000, 2001, 2002, 2003, 2004 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 2.1, 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, 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + ***********************************************************************/ + + + +#ifndef __lightning_funcs_h +#define __lightning_funcs_h + +#if !defined(__GNUC__) && !defined(__GNUG__) +#error Go get GNU C, I do not know how to flush the cache +#error with this compiler. +#else +static void +jit_flush_code(void *start, void *end) +{ +#ifndef LIGHTNING_CROSS + register char *ddest, *idest; + + static int cache_line_size; + if (cache_line_size == 0) { + char buffer[8192]; + int i, probe; + + /* Find out the size of a cache line by zeroing one */ + memset(buffer, 0xFF, 8192); + __asm__ __volatile__ ("dcbz 0,%0" : : "r"(buffer + 4096)); + + /* Probe for the beginning of the cache line. */ + for(i = 0, probe = 4096; probe; probe >>= 1) + if (buffer[i | probe] != 0x00) + i |= probe; + + /* i is now just before the start of the cache line */ + i++; + for(cache_line_size = 1; i + cache_line_size < 8192; cache_line_size <<= 1) + if (buffer[i + cache_line_size] != 0x00) + break; + } + + start -= ((long) start) & (cache_line_size - 1); + end -= ((long) end) & (cache_line_size - 1); + + /* Force data cache write-backs */ + for (ddest = (char *) start; ddest <= (char *) end; ddest += cache_line_size) { + __asm__ __volatile__ ("dcbst 0,%0" : : "r"(ddest)); + } + __asm__ __volatile__ ("sync" : : ); + + /* Now invalidate the instruction cache */ + for (idest = (char *) start; idest <= (char *) end; idest += cache_line_size) { + __asm__ __volatile__ ("icbi 0,%0" : : "r"(idest)); + } + __asm__ __volatile__ ("isync" : : ); +#endif /* !LIGHTNING_CROSS */ +} +#endif /* __GNUC__ || __GNUG__ */ + +#define _jit (*jit) + +static void +_jit_epilog(jit_state *jit) +{ + int n = _jitl.nbArgs; + int frame_size, ofs; + int first_saved_reg = JIT_AUX - n; + int num_saved_regs = 32 - first_saved_reg; + + frame_size = 24 + 32 + 12 + num_saved_regs * 4; /* r24..r31 + args */ + frame_size += 15; /* the stack must be quad-word */ + frame_size &= ~15; /* aligned */ + +#ifdef _CALL_DARWIN + LWZrm(0, frame_size + 8, 1); /* lwz r0, x+8(r1) (ret.addr.) */ +#else + LWZrm(0, frame_size + 4, 1); /* lwz r0, x+4(r1) (ret.addr.) */ +#endif + MTLRr(0); /* mtspr LR, r0 */ + + ofs = frame_size - num_saved_regs * 4; + LMWrm(first_saved_reg, ofs, 1); /* lmw rI, ofs(r1) */ + ADDIrri(1, 1, frame_size); /* addi r1, r1, x */ + BLR(); /* blr */ +} + +/* Emit a prolog for a function. + Upon entrance to the trampoline: + - LR = address where the real code for the function lies + - R3-R8 = parameters + Upon finishing the trampoline: + - R0 = return address for the function + - R25-R20 = parameters (order is reversed, 1st argument is R25) + + The +32 in frame_size computation is to accound for the parameter area of + a function frame. The +12 is to make room for two local variables (a + MzScheme-specific change). + + On PPC the frame must have space to host the arguments of any callee. + However, as it currently stands, the argument to jit_trampoline (n) is + the number of arguments of the caller we generate. Therefore, the + callee can overwrite a part of the stack (saved register area when it + flushes its own parameter on the stack). The addition of a constant + offset = 32 is enough to hold eight 4 bytes arguments. This is less + than perfect but is a reasonable work around for now. + Better solution must be investigated. */ +static void +_jit_prolog(jit_state *jit, int n) +{ + int frame_size; + int ofs; + int first_saved_reg = JIT_AUX - n; + int num_saved_regs = 32 - first_saved_reg; + + _jitl.nextarg_geti = 3; + _jitl.nextarg_getd = 1; + _jitl.nbArgs = n; + + frame_size = 24 + 32 + 12 + num_saved_regs * 4; /* r27..r31 + args */ + frame_size += 15; /* the stack must be quad-word */ + frame_size &= ~15; /* aligned */ + + MFLRr(0); + STWUrm(1, -frame_size, 1); /* stwu r1, -x(r1) */ + + ofs = frame_size - num_saved_regs * 4; + STMWrm(first_saved_reg, ofs, 1); /* stmw rI, ofs(r1) */ +#ifdef _CALL_DARWIN + STWrm(0, frame_size + 8, 1); /* stw r0, x+8(r1) */ +#else + STWrm(0, frame_size + 4, 1); /* stw r0, x+4(r1) */ +#endif + +#if 0 + for (i = 0; i < n; i++) + MRrr(JIT_AUX-1-i, 3+i); /* save parameters below r24 */ +#endif +} + +#undef _jit + +#endif /* __lightning_funcs_h */ diff --git a/src/mzscheme/src/list.c b/src/mzscheme/src/list.c index 552710afe6..0976f5dc5b 100644 --- a/src/mzscheme/src/list.c +++ b/src/mzscheme/src/list.c @@ -26,6 +26,10 @@ /* globals */ Scheme_Object scheme_null[1]; +Scheme_Object *scheme_null_p_prim; +Scheme_Object *scheme_pair_p_prim; +Scheme_Object *scheme_car_prim; +Scheme_Object *scheme_cdr_prim; /* locals */ static Scheme_Object *pair_p_prim (int argc, Scheme_Object *argv[]); @@ -122,74 +126,72 @@ static Scheme_Object *weak_symbol, *equal_symbol; void scheme_init_list (Scheme_Env *env) { + REGISTER_SO(scheme_null_p_prim); + REGISTER_SO(scheme_pair_p_prim); + REGISTER_SO(scheme_car_prim); + REGISTER_SO(scheme_cdr_prim); + scheme_null->type = scheme_null_type; scheme_add_global_constant ("null", scheme_null, env); - scheme_add_global_constant ("pair?", - scheme_make_folding_prim(pair_p_prim, - "pair?", - 1, 1, 1), - env); + scheme_pair_p_prim = scheme_make_folding_prim(pair_p_prim, "pair?", 1, 1, 1); + scheme_add_global_constant ("pair?", scheme_pair_p_prim, env); + scheme_add_global_constant ("cons", scheme_make_prim_w_arity(cons_prim, "cons", 2, 2), env); - scheme_add_global_constant ("car", - scheme_make_prim_w_arity(car_prim, - "car", - 1, 1), - env); - scheme_add_global_constant ("cdr", - scheme_make_prim_w_arity(cdr_prim, - "cdr", - 1, 1), - env); + scheme_car_prim = scheme_make_noncm_prim(car_prim, "car", 1, 1); + scheme_add_global_constant ("car", scheme_car_prim, env); + + scheme_cdr_prim = scheme_make_noncm_prim(cdr_prim, "cdr", 1, 1); + scheme_add_global_constant ("cdr", scheme_cdr_prim, env); + scheme_add_global_constant ("set-car!", - scheme_make_prim_w_arity(set_car_prim, - "set-car!", - 2, 2), + scheme_make_noncm_prim(set_car_prim, + "set-car!", + 2, 2), env); scheme_add_global_constant ("set-cdr!", - scheme_make_prim_w_arity(set_cdr_prim, - "set-cdr!", - 2, 2), + scheme_make_noncm_prim(set_cdr_prim, + "set-cdr!", + 2, 2), env); scheme_add_global_constant ("cons-immutable", - scheme_make_prim_w_arity(cons_immutable, - "cons-immutable", - 2, 2), - env); - scheme_add_global_constant ("null?", - scheme_make_folding_prim(null_p_prim, - "null?", - 1, 1, 1), + scheme_make_noncm_prim(cons_immutable, + "cons-immutable", + 2, 2), env); + + scheme_null_p_prim = scheme_make_folding_prim(null_p_prim, "null?", 1, 1, 1); + scheme_add_global_constant ("null?", scheme_null_p_prim, env); + scheme_add_global_constant ("list?", - scheme_make_prim_w_arity(list_p_prim, - "list?", - 1, 1), + scheme_make_noncm_prim(list_p_prim, + "list?", + 1, 1), env); scheme_add_global_constant ("list", - scheme_make_prim_w_arity(list_prim, - "list", - 0, -1), + scheme_make_noncm_prim(list_prim, + "list", + 0, -1), env); scheme_add_global_constant ("list-immutable", - scheme_make_prim_w_arity(list_immutable_prim, - "list-immutable", - 0, -1), + scheme_make_noncm_prim(list_immutable_prim, + "list-immutable", + 0, -1), env); scheme_add_global_constant ("list*", - scheme_make_prim_w_arity(list_star_prim, - "list*", - 1, -1), + scheme_make_noncm_prim(list_star_prim, + "list*", + 1, -1), env); scheme_add_global_constant ("list*-immutable", - scheme_make_prim_w_arity(list_star_immutable_prim, - "list*-immutable", - 1, -1), + scheme_make_noncm_prim(list_star_immutable_prim, + "list*-immutable", + 1, -1), env); scheme_add_global_constant("immutable?", scheme_make_folding_prim(immutablep, @@ -197,221 +199,221 @@ scheme_init_list (Scheme_Env *env) 1, 1, 1), env); scheme_add_global_constant ("length", - scheme_make_prim_w_arity(length_prim, - "length", - 1, 1), + scheme_make_noncm_prim(length_prim, + "length", + 1, 1), env); scheme_add_global_constant ("append", - scheme_make_prim_w_arity(append_prim, - "append", - 0, -1), + scheme_make_noncm_prim(append_prim, + "append", + 0, -1), env); scheme_add_global_constant ("append!", - scheme_make_prim_w_arity(append_bang_prim, - "append!", - 0, -1), + scheme_make_noncm_prim(append_bang_prim, + "append!", + 0, -1), env); scheme_add_global_constant ("reverse", - scheme_make_prim_w_arity(reverse_prim, - "reverse", - 1, 1), + scheme_make_noncm_prim(reverse_prim, + "reverse", + 1, 1), env); scheme_add_global_constant ("reverse!", - scheme_make_prim_w_arity(reverse_bang_prim, - "reverse!", - 1, 1), + scheme_make_noncm_prim(reverse_bang_prim, + "reverse!", + 1, 1), env); scheme_add_global_constant ("list-tail", - scheme_make_prim_w_arity(list_tail_prim, - "list-tail", - 2, 2), + scheme_make_noncm_prim(list_tail_prim, + "list-tail", + 2, 2), env); scheme_add_global_constant ("list-ref", - scheme_make_prim_w_arity(list_ref_prim, - "list-ref", - 2, 2), + scheme_make_noncm_prim(list_ref_prim, + "list-ref", + 2, 2), env); scheme_add_global_constant ("memq", - scheme_make_prim_w_arity(memq, - "memq", - 2, 2), + scheme_make_noncm_prim(memq, + "memq", + 2, 2), env); scheme_add_global_constant ("memv", - scheme_make_prim_w_arity(memv, - "memv", - 2, 2), + scheme_make_noncm_prim(memv, + "memv", + 2, 2), env); scheme_add_global_constant ("member", - scheme_make_prim_w_arity(member, - "member", - 2, 2), + scheme_make_noncm_prim(member, + "member", + 2, 2), env); scheme_add_global_constant ("assq", - scheme_make_prim_w_arity(assq, - "assq", - 2, 2), + scheme_make_noncm_prim(assq, + "assq", + 2, 2), env); scheme_add_global_constant ("assv", - scheme_make_prim_w_arity(assv, - "assv", - 2, 2), + scheme_make_noncm_prim(assv, + "assv", + 2, 2), env); scheme_add_global_constant ("assoc", - scheme_make_prim_w_arity(assoc, - "assoc", - 2, 2), + scheme_make_noncm_prim(assoc, + "assoc", + 2, 2), env); scheme_add_global_constant ("caar", - scheme_make_prim_w_arity(caar_prim, - "caar", - 1, 1), + scheme_make_noncm_prim(caar_prim, + "caar", + 1, 1), env); scheme_add_global_constant ("cadr", - scheme_make_prim_w_arity(cadr_prim, - "cadr", - 1, 1), + scheme_make_noncm_prim(cadr_prim, + "cadr", + 1, 1), env); scheme_add_global_constant ("cdar", - scheme_make_prim_w_arity(cdar_prim, - "cdar", - 1, 1), + scheme_make_noncm_prim(cdar_prim, + "cdar", + 1, 1), env); scheme_add_global_constant ("cddr", - scheme_make_prim_w_arity(cddr_prim, - "cddr", - 1, 1), + scheme_make_noncm_prim(cddr_prim, + "cddr", + 1, 1), env); scheme_add_global_constant ("caaar", - scheme_make_prim_w_arity(caaar_prim, - "caaar", - 1, 1), + scheme_make_noncm_prim(caaar_prim, + "caaar", + 1, 1), env); scheme_add_global_constant ("caadr", - scheme_make_prim_w_arity(caadr_prim, - "caadr", - 1, 1), + scheme_make_noncm_prim(caadr_prim, + "caadr", + 1, 1), env); scheme_add_global_constant ("cadar", - scheme_make_prim_w_arity(cadar_prim, - "cadar", - 1, 1), + scheme_make_noncm_prim(cadar_prim, + "cadar", + 1, 1), env); scheme_add_global_constant ("cdaar", - scheme_make_prim_w_arity(cdaar_prim, - "cdaar", - 1, 1), + scheme_make_noncm_prim(cdaar_prim, + "cdaar", + 1, 1), env); scheme_add_global_constant ("cdadr", - scheme_make_prim_w_arity(cdadr_prim, - "cdadr", - 1, 1), + scheme_make_noncm_prim(cdadr_prim, + "cdadr", + 1, 1), env); scheme_add_global_constant ("cddar", - scheme_make_prim_w_arity(cddar_prim, - "cddar", - 1, 1), + scheme_make_noncm_prim(cddar_prim, + "cddar", + 1, 1), env); scheme_add_global_constant ("caddr", - scheme_make_prim_w_arity(caddr_prim, - "caddr", - 1, 1), + scheme_make_noncm_prim(caddr_prim, + "caddr", + 1, 1), env); scheme_add_global_constant ("cdddr", - scheme_make_prim_w_arity(cdddr_prim, - "cdddr", - 1, 1), + scheme_make_noncm_prim(cdddr_prim, + "cdddr", + 1, 1), env); scheme_add_global_constant ("cddddr", - scheme_make_prim_w_arity(cddddr_prim, - "cddddr", - 1, 1), + scheme_make_noncm_prim(cddddr_prim, + "cddddr", + 1, 1), env); scheme_add_global_constant ("cadddr", - scheme_make_prim_w_arity(cadddr_prim, - "cadddr", - 1, 1), + scheme_make_noncm_prim(cadddr_prim, + "cadddr", + 1, 1), env); scheme_add_global_constant ("cdaddr", - scheme_make_prim_w_arity(cdaddr_prim, - "cdaddr", - 1, 1), + scheme_make_noncm_prim(cdaddr_prim, + "cdaddr", + 1, 1), env); scheme_add_global_constant ("cddadr", - scheme_make_prim_w_arity(cddadr_prim, - "cddadr", - 1, 1), + scheme_make_noncm_prim(cddadr_prim, + "cddadr", + 1, 1), env); scheme_add_global_constant ("cdddar", - scheme_make_prim_w_arity(cdddar_prim, - "cdddar", - 1, 1), + scheme_make_noncm_prim(cdddar_prim, + "cdddar", + 1, 1), env); scheme_add_global_constant ("caaddr", - scheme_make_prim_w_arity(caaddr_prim, - "caaddr", - 1, 1), + scheme_make_noncm_prim(caaddr_prim, + "caaddr", + 1, 1), env); scheme_add_global_constant ("cadadr", - scheme_make_prim_w_arity(cadadr_prim, - "cadadr", - 1, 1), + scheme_make_noncm_prim(cadadr_prim, + "cadadr", + 1, 1), env); scheme_add_global_constant ("caddar", - scheme_make_prim_w_arity(caddar_prim, - "caddar", - 1, 1), + scheme_make_noncm_prim(caddar_prim, + "caddar", + 1, 1), env); scheme_add_global_constant ("cdaadr", - scheme_make_prim_w_arity(cdaadr_prim, - "cdaadr", - 1, 1), + scheme_make_noncm_prim(cdaadr_prim, + "cdaadr", + 1, 1), env); scheme_add_global_constant ("cdadar", - scheme_make_prim_w_arity(cdadar_prim, - "cdadar", - 1, 1), + scheme_make_noncm_prim(cdadar_prim, + "cdadar", + 1, 1), env); scheme_add_global_constant ("cddaar", - scheme_make_prim_w_arity(cddaar_prim, - "cddaar", - 1, 1), + scheme_make_noncm_prim(cddaar_prim, + "cddaar", + 1, 1), env); scheme_add_global_constant ("cdaaar", - scheme_make_prim_w_arity(cdaaar_prim, - "cdaaar", - 1, 1), + scheme_make_noncm_prim(cdaaar_prim, + "cdaaar", + 1, 1), env); scheme_add_global_constant ("cadaar", - scheme_make_prim_w_arity(cadaar_prim, - "cadaar", - 1, 1), + scheme_make_noncm_prim(cadaar_prim, + "cadaar", + 1, 1), env); scheme_add_global_constant ("caadar", - scheme_make_prim_w_arity(caadar_prim, - "caadar", - 1, 1), + scheme_make_noncm_prim(caadar_prim, + "caadar", + 1, 1), env); scheme_add_global_constant ("caaadr", - scheme_make_prim_w_arity(caaadr_prim, - "caaadr", - 1, 1), + scheme_make_noncm_prim(caaadr_prim, + "caaadr", + 1, 1), env); scheme_add_global_constant ("caaaar", - scheme_make_prim_w_arity(caaaar_prim, - "caaaar", - 1, 1), + scheme_make_noncm_prim(caaaar_prim, + "caaaar", + 1, 1), env); scheme_add_global_constant(BOX, - scheme_make_prim_w_arity(box, - BOX, - 1, 1), + scheme_make_noncm_prim(box, + BOX, + 1, 1), env); scheme_add_global_constant("box-immutable", - scheme_make_prim_w_arity(immutable_box, - "box-immutable", - 1, 1), + scheme_make_noncm_prim(immutable_box, + "box-immutable", + 1, 1), env); scheme_add_global_constant(BOXP, scheme_make_folding_prim(box_p, @@ -419,25 +421,25 @@ scheme_init_list (Scheme_Env *env) 1, 1, 1), env); scheme_add_global_constant(UNBOX, - scheme_make_prim_w_arity(unbox, - UNBOX, - 1, 1), + scheme_make_noncm_prim(unbox, + UNBOX, + 1, 1), env); scheme_add_global_constant(SETBOX, - scheme_make_prim_w_arity(set_box, - SETBOX, - 2, 2), + scheme_make_noncm_prim(set_box, + SETBOX, + 2, 2), env); scheme_add_global_constant("make-hash-table", - scheme_make_prim_w_arity(make_hash_table, - "make-hash-table", - 0, 2), + scheme_make_noncm_prim(make_hash_table, + "make-hash-table", + 0, 2), env); scheme_add_global_constant("make-immutable-hash-table", - scheme_make_prim_w_arity(make_immutable_hash_table, - "make-immutable-hash-table", - 1, 2), + scheme_make_noncm_prim(make_immutable_hash_table, + "make-immutable-hash-table", + 1, 2), env); scheme_add_global_constant("hash-table?", scheme_make_folding_prim(hash_table_p, @@ -445,19 +447,19 @@ scheme_init_list (Scheme_Env *env) 1, 3, 1), env); scheme_add_global_constant("hash-table-count", - scheme_make_prim_w_arity(hash_table_count, - "hash-table-count", - 1, 1), + scheme_make_noncm_prim(hash_table_count, + "hash-table-count", + 1, 1), env); scheme_add_global_constant("hash-table-copy", - scheme_make_prim_w_arity(hash_table_copy, - "hash-table-copy", - 1, 1), + scheme_make_noncm_prim(hash_table_copy, + "hash-table-copy", + 1, 1), env); scheme_add_global_constant("hash-table-put!", - scheme_make_prim_w_arity(hash_table_put, - "hash-table-put!", - 3, 3), + scheme_make_noncm_prim(hash_table_put, + "hash-table-put!", + 3, 3), env); scheme_add_global_constant("hash-table-get", scheme_make_prim_w_arity(hash_table_get, @@ -465,41 +467,41 @@ scheme_init_list (Scheme_Env *env) 2, 3), env); scheme_add_global_constant("hash-table-remove!", - scheme_make_prim_w_arity(hash_table_remove, - "hash-table-remove!", - 2, 2), + scheme_make_noncm_prim(hash_table_remove, + "hash-table-remove!", + 2, 2), env); scheme_add_global_constant("hash-table-map", - scheme_make_prim_w_arity(hash_table_map, - "hash-table-map", - 2, 2), + scheme_make_noncm_prim(hash_table_map, + "hash-table-map", + 2, 2), env); scheme_add_global_constant("hash-table-for-each", - scheme_make_prim_w_arity(hash_table_for_each, - "hash-table-for-each", - 2, 2), + scheme_make_noncm_prim(hash_table_for_each, + "hash-table-for-each", + 2, 2), env); scheme_add_global_constant("eq-hash-code", - scheme_make_prim_w_arity(eq_hash_code, - "eq-hash-code", - 1, 1), + scheme_make_noncm_prim(eq_hash_code, + "eq-hash-code", + 1, 1), env); scheme_add_global_constant("equal-hash-code", - scheme_make_prim_w_arity(equal_hash_code, - "equal-hash-code", - 1, 1), + scheme_make_noncm_prim(equal_hash_code, + "equal-hash-code", + 1, 1), env); scheme_add_global_constant("make-weak-box", - scheme_make_prim_w_arity(make_weak_box, - "make-weak-box", - 1, 1), + scheme_make_noncm_prim(make_weak_box, + "make-weak-box", + 1, 1), env); scheme_add_global_constant("weak-box-value", - scheme_make_prim_w_arity(weak_box_value, - "weak-box-value", - 1, 1), + scheme_make_noncm_prim(weak_box_value, + "weak-box-value", + 1, 1), env); scheme_add_global_constant("weak-box?", scheme_make_folding_prim(weak_boxp, @@ -508,14 +510,14 @@ scheme_init_list (Scheme_Env *env) env); scheme_add_global_constant("make-ephemeron", - scheme_make_prim_w_arity(make_ephemeron, - "make-ephemeron", - 2, 2), + scheme_make_noncm_prim(make_ephemeron, + "make-ephemeron", + 2, 2), env); scheme_add_global_constant("ephemeron-value", - scheme_make_prim_w_arity(ephemeron_value, - "ephemeron-value", - 1, 1), + scheme_make_noncm_prim(ephemeron_value, + "ephemeron-value", + 1, 1), env); scheme_add_global_constant("ephemeron?", scheme_make_folding_prim(ephemeronp, diff --git a/src/mzscheme/src/module.c b/src/mzscheme/src/module.c index 5dd3333c35..1b1391223c 100644 --- a/src/mzscheme/src/module.c +++ b/src/mzscheme/src/module.c @@ -70,6 +70,9 @@ static Scheme_Object *provide_expand(Scheme_Object *form, Scheme_Comp_Env *env, static Scheme_Object *module_execute(Scheme_Object *data); static Scheme_Object *top_level_require_execute(Scheme_Object *data); +static Scheme_Object *module_jit(Scheme_Object *data); +static Scheme_Object *top_level_require_jit(Scheme_Object *data); + static Scheme_Object *module_resolve(Scheme_Object *data, Resolve_Info *info); static Scheme_Object *top_level_require_resolve(Scheme_Object *data, Resolve_Info *info); @@ -195,10 +198,10 @@ void scheme_init_module(Scheme_Env *env) scheme_register_syntax(MODULE_EXPD, module_resolve, module_validate, - module_execute, -1); + module_execute, module_jit, -1); scheme_register_syntax(REQUIRE_EXPD, top_level_require_resolve, top_level_require_validate, - top_level_require_execute, 2); + top_level_require_execute, top_level_require_jit, 2); scheme_add_global_keyword("module", scheme_make_compiled_syntax(module_syntax, @@ -2965,6 +2968,95 @@ module_execute(Scheme_Object *data) return scheme_void; } +static Scheme_Object *rebuild_et_vec(Scheme_Object *naya, Scheme_Object *vec) +{ + Scheme_Object *vec2; + int i; + + i = SCHEME_VEC_SIZE(vec); + vec2 = scheme_make_vector(i, NULL); + while (i--) { + SCHEME_VEC_ELS(vec2)[i] = SCHEME_VEC_ELS(vec)[i]; + } + SCHEME_VEC_ELS(vec2)[1] = naya; + + return vec2; +} + +static Scheme_Object *jit_list(Scheme_Object *orig_l, int in_vec) +{ + Scheme_Object *l, *orig, *naya = NULL; + int saw; + + for (l = orig_l, saw = 0; SCHEME_PAIRP(l); l = SCHEME_CDR(l), saw++) { + orig = SCHEME_CAR(l); + if (in_vec) + orig = SCHEME_VEC_ELS(orig)[1]; + + naya = scheme_jit_expr(orig); + if (!SAME_OBJ(orig, naya)) + break; + } + + if (SCHEME_PAIRP(l)) { + Scheme_Object *first = scheme_null, *last = NULL, *pr; + for (l = orig_l; saw--; l = SCHEME_CDR(l)) { + orig = SCHEME_CAR(l); + pr = scheme_make_pair(orig, scheme_null); + if (last) + SCHEME_CDR(last) = pr; + else + first = pr; + last = pr; + } + if (in_vec) + naya = rebuild_et_vec(naya, SCHEME_CAR(l)); + pr = scheme_make_pair(naya, scheme_null); + if (last) + SCHEME_CDR(last) = pr; + else + first = pr; + last = pr; + l = SCHEME_CDR(l); + for (; SCHEME_PAIRP(l); l = SCHEME_CDR(l)) { + orig = SCHEME_CAR(l); + if (in_vec) + orig = SCHEME_VEC_ELS(orig)[1]; + naya = scheme_jit_expr(orig); + if (in_vec) { + if (!SAME_OBJ(orig, naya)) + naya = rebuild_et_vec(naya, SCHEME_CAR(l)); + else + naya = SCHEME_CAR(l); + } + pr = scheme_make_pair(naya, scheme_null); + SCHEME_CDR(last) = pr; + last = pr; + } + return first; + } else + return orig_l; +} + +static Scheme_Object *module_jit(Scheme_Object *data) +{ + Scheme_Module *m = (Scheme_Module *)data; + Scheme_Object *l1, *l2; + + l1 = jit_list(m->body, 0); + l2 = jit_list(m->et_body, 1); + + if (SAME_OBJ(l1, m->body) && SAME_OBJ(l2, m->body)) + return data; + + m = MALLOC_ONE_TAGGED(Scheme_Module); + memcpy(m, data, sizeof(Scheme_Module)); + m->body = l1; + m->et_body = l2; + + return (Scheme_Object *)m; +} + static void module_validate(Scheme_Object *data, Mz_CPort *port, char *stack, int depth, int letlimit, int delta, int num_toplevels, int num_stxes) @@ -2987,6 +3079,7 @@ static void module_validate(Scheme_Object *data, Mz_CPort *port, char *stack, if (!SCHEME_NULLP(l)) scheme_ill_formed_code(port); + /* FIXME: validate exp-time code */ } static Scheme_Object * @@ -3011,6 +3104,8 @@ module_resolve(Scheme_Object *data, Resolve_Info *rslv) SCHEME_CAR(b) = e; } + /* Exp-time body was resolved during compilation */ + return scheme_make_syntax_resolved(MODULE_EXPD, data); } @@ -3836,6 +3931,7 @@ static Scheme_Object *do_module_begin(Scheme_Object *form, Scheme_Comp_Env *env, Scheme_Compile_Info mrec; Scheme_Object *names, *l, *code, *m, *vec, *boundname; Resolve_Prefix *rp; + Resolve_Info *ri; Scheme_Comp_Env *oenv, *eenv; int count = 0; int for_stx; @@ -3922,7 +4018,8 @@ static Scheme_Object *do_module_begin(Scheme_Object *form, Scheme_Comp_Env *env, /* Simplify only in compile mode; it is too slow in expand mode. */ rp = scheme_resolve_prefix(1, eenv->prefix, rec[drec].comp); - m = scheme_resolve_expr(m, scheme_resolve_info_create(rp)); + ri = scheme_resolve_info_create(rp); + m = scheme_resolve_expr(m, ri); /* Add code with names and lexical depth to exp-time body: */ vec = scheme_make_vector(5, NULL); @@ -3932,6 +4029,9 @@ static Scheme_Object *do_module_begin(Scheme_Object *form, Scheme_Comp_Env *env, SCHEME_VEC_ELS(vec)[3] = (Scheme_Object *)rp; SCHEME_VEC_ELS(vec)[4] = (for_stx ? scheme_true : scheme_false); exp_body = scheme_make_pair(vec, exp_body); + + if (ri->use_jit) + m = scheme_jit_expr(m); eval_defmacro(names, count, m, eenv->genv, rhs_env, rp, mrec.max_let_depth, 0, (for_stx ? env->genv->exp_env->toplevel : env->genv->syntax), for_stx, @@ -5431,6 +5531,12 @@ top_level_require_execute(Scheme_Object *data) return scheme_void; } +static Scheme_Object * +top_level_require_jit(Scheme_Object *data) +{ + return data; +} + static void top_level_require_validate(Scheme_Object *data, Mz_CPort *port, char *stack, int depth, int letlimit, int delta, int num_toplevels, int num_stxes) diff --git a/src/mzscheme/src/mzmark.c b/src/mzscheme/src/mzmark.c index 6d8a5f20df..4a51609d1c 100644 --- a/src/mzscheme/src/mzmark.c +++ b/src/mzscheme/src/mzmark.c @@ -415,6 +415,9 @@ int unclosed_proc_MARK(void *p) { gcMARK(d->name); gcMARK(d->code); gcMARK(d->closure_map); +#ifdef MZ_USE_JIT + gcMARK(d->native_code); +#endif return gcBYTES_TO_WORDS(sizeof(Scheme_Closure_Data)); @@ -426,6 +429,9 @@ int unclosed_proc_FIXUP(void *p) { gcFIXUP(d->name); gcFIXUP(d->code); gcFIXUP(d->closure_map); +#ifdef MZ_USE_JIT + gcFIXUP(d->native_code); +#endif return gcBYTES_TO_WORDS(sizeof(Scheme_Closure_Data)); @@ -828,6 +834,9 @@ int case_closure_MARK(void *p) { for (i = c->count; i--; ) gcMARK(c->array[i]); gcMARK(c->name); +#ifdef MZ_USE_JIT + gcMARK(c->native_code); +#endif return gcBYTES_TO_WORDS((sizeof(Scheme_Case_Lambda) @@ -842,6 +851,9 @@ int case_closure_FIXUP(void *p) { for (i = c->count; i--; ) gcFIXUP(c->array[i]); gcFIXUP(c->name); +#ifdef MZ_USE_JIT + gcFIXUP(c->native_code); +#endif return gcBYTES_TO_WORDS((sizeof(Scheme_Case_Lambda) @@ -1623,6 +1635,7 @@ int cont_mark_set_val_SIZE(void *p) { int cont_mark_set_val_MARK(void *p) { Scheme_Cont_Mark_Set *s = (Scheme_Cont_Mark_Set *)p; gcMARK(s->chain); + gcMARK(s->native_stack_trace); return gcBYTES_TO_WORDS(sizeof(Scheme_Cont_Mark_Set)); @@ -1631,6 +1644,7 @@ int cont_mark_set_val_MARK(void *p) { int cont_mark_set_val_FIXUP(void *p) { Scheme_Cont_Mark_Set *s = (Scheme_Cont_Mark_Set *)p; gcFIXUP(s->chain); + gcFIXUP(s->native_stack_trace); return gcBYTES_TO_WORDS(sizeof(Scheme_Cont_Mark_Set)); diff --git a/src/mzscheme/src/mzmarksrc.c b/src/mzscheme/src/mzmarksrc.c index 0237e82297..c1a9e71da2 100644 --- a/src/mzscheme/src/mzmarksrc.c +++ b/src/mzscheme/src/mzmarksrc.c @@ -153,6 +153,9 @@ unclosed_proc { gcMARK(d->name); gcMARK(d->code); gcMARK(d->closure_map); +#ifdef MZ_USE_JIT + gcMARK(d->native_code); +#endif size: gcBYTES_TO_WORDS(sizeof(Scheme_Closure_Data)); @@ -311,6 +314,9 @@ case_closure { for (i = c->count; i--; ) gcMARK(c->array[i]); gcMARK(c->name); +#ifdef MZ_USE_JIT + gcMARK(c->native_code); +#endif size: gcBYTES_TO_WORDS((sizeof(Scheme_Case_Lambda) @@ -630,6 +636,7 @@ cont_mark_set_val { mark: Scheme_Cont_Mark_Set *s = (Scheme_Cont_Mark_Set *)p; gcMARK(s->chain); + gcMARK(s->native_stack_trace); size: gcBYTES_TO_WORDS(sizeof(Scheme_Cont_Mark_Set)); diff --git a/src/mzscheme/src/numarith.c b/src/mzscheme/src/numarith.c index 76e6e7e4d3..55d687f291 100644 --- a/src/mzscheme/src/numarith.c +++ b/src/mzscheme/src/numarith.c @@ -26,6 +26,11 @@ #include "nummacs.h" #include +Scheme_Object *scheme_add1_prim; +Scheme_Object *scheme_sub1_prim; +Scheme_Object *scheme_plus_prim; +Scheme_Object *scheme_minus_prim; + static Scheme_Object *plus (int argc, Scheme_Object *argv[]); static Scheme_Object *minus (int argc, Scheme_Object *argv[]); static Scheme_Object *mult (int argc, Scheme_Object *argv[]); @@ -38,26 +43,23 @@ static Scheme_Object *quotient_remainder (int argc, Scheme_Object *argv[]); void scheme_init_numarith(Scheme_Env *env) { - scheme_add_global_constant("add1", - scheme_make_folding_prim(scheme_add1, - "add1", - 1, 1, 1), - env); - scheme_add_global_constant("sub1", - scheme_make_folding_prim(scheme_sub1, - "sub1", - 1, 1, 1), - env); - scheme_add_global_constant("+", - scheme_make_folding_prim(plus, - "+", - 0, -1, 1), - env); - scheme_add_global_constant("-", - scheme_make_folding_prim(minus, - "-", - 1, -1, 1), - env); + REGISTER_SO(scheme_add1_prim); + REGISTER_SO(scheme_sub1_prim); + REGISTER_SO(scheme_plus_prim); + REGISTER_SO(scheme_minus_prim); + + scheme_add1_prim = scheme_make_folding_prim(scheme_add1, "add1", 1, 1, 1); + scheme_add_global_constant("add1", scheme_add1_prim, env); + + scheme_sub1_prim = scheme_make_folding_prim(scheme_sub1, "sub1", 1, 1, 1); + scheme_add_global_constant("sub1", scheme_sub1_prim, env); + + scheme_plus_prim = scheme_make_folding_prim(plus, "+", 0, -1, 1); + scheme_add_global_constant("+", scheme_plus_prim, env); + + scheme_minus_prim = scheme_make_folding_prim(minus, "-", 1, -1, 1); + scheme_add_global_constant("-", scheme_minus_prim, env); + scheme_add_global_constant("*", scheme_make_folding_prim(mult, "*", diff --git a/src/mzscheme/src/port.c b/src/mzscheme/src/port.c index 2dd31097b6..ed876c7293 100644 --- a/src/mzscheme/src/port.c +++ b/src/mzscheme/src/port.c @@ -2125,7 +2125,7 @@ long scheme_get_char_string(const char *who, special_is_ok = 1; got = scheme_get_byte_string_unless(who, port, s, leftover, 1, - 0, 1, + 0, 1 /* => peek */, quick_plus(peek_skip, ahead_skip), NULL); if (got > 0) { @@ -2172,11 +2172,13 @@ long scheme_get_char_string(const char *who, } } else { /* Either EOF or SPECIAL -- either one ends the leftover - sequence in an error. */ - while (leftover) { + sequence in an error. We may have more leftover chars + than we need, but they haven't been read, yet. */ + while (leftover && size) { buffer[offset++] = '?'; total_got++; --leftover; + --size; } return total_got; } diff --git a/src/mzscheme/src/portfun.c b/src/mzscheme/src/portfun.c index aec130b2bc..18698fcade 100644 --- a/src/mzscheme/src/portfun.c +++ b/src/mzscheme/src/portfun.c @@ -182,15 +182,15 @@ scheme_init_port_fun(Scheme_Env *env) module_symbol = scheme_intern_symbol("module"); - scheme_write_proc = scheme_make_prim_w_arity(sch_write, - "write", - 1, 2); - scheme_display_proc = scheme_make_prim_w_arity(display, - "display", - 1, 2); - scheme_print_proc = scheme_make_prim_w_arity(sch_print, - "print", + scheme_write_proc = scheme_make_noncm_prim(sch_write, + "write", + 1, 2); + scheme_display_proc = scheme_make_noncm_prim(display, + "display", 1, 2); + scheme_print_proc = scheme_make_noncm_prim(sch_print, + "print", + 1, 2); /* Made as a closed prim so we can get the arity right: */ default_read_handler = scheme_make_closed_prim_w_arity(sch_default_read_handler, @@ -342,214 +342,214 @@ scheme_init_port_fun(Scheme_Env *env) env); scheme_add_global_constant("read", - scheme_make_prim_w_arity(read_f, - "read", - 0, 1), + scheme_make_noncm_prim(read_f, + "read", + 0, 1), env); scheme_add_global_constant("read/recursive", - scheme_make_prim_w_arity(read_recur_f, - "read/recursive", - 0, 3), + scheme_make_noncm_prim(read_recur_f, + "read/recursive", + 0, 3), env); scheme_add_global_constant("read-syntax", - scheme_make_prim_w_arity(read_syntax_f, - "read-syntax", - 0, 2), + scheme_make_noncm_prim(read_syntax_f, + "read-syntax", + 0, 2), env); scheme_add_global_constant("read-syntax/recursive", - scheme_make_prim_w_arity(read_syntax_recur_f, - "read-syntax/recursive", - 0, 4), + scheme_make_noncm_prim(read_syntax_recur_f, + "read-syntax/recursive", + 0, 4), env); scheme_add_global_constant("read-honu", - scheme_make_prim_w_arity(read_honu_f, - "read-honu", - 0, 1), + scheme_make_noncm_prim(read_honu_f, + "read-honu", + 0, 1), env); scheme_add_global_constant("read-honu/recursive", - scheme_make_prim_w_arity(read_honu_recur_f, - "read-honu/recursive", - 0, 1), + scheme_make_noncm_prim(read_honu_recur_f, + "read-honu/recursive", + 0, 1), env); scheme_add_global_constant("read-honu-syntax", - scheme_make_prim_w_arity(read_honu_syntax_f, - "read-honu-syntax", - 0, 2), + scheme_make_noncm_prim(read_honu_syntax_f, + "read-honu-syntax", + 0, 2), env); scheme_add_global_constant("read-honu-syntax/recursive", - scheme_make_prim_w_arity(read_honu_syntax_recur_f, - "read-honu-syntax/recursive", - 0, 2), + scheme_make_noncm_prim(read_honu_syntax_recur_f, + "read-honu-syntax/recursive", + 0, 2), env); scheme_add_global_constant("read-char", - scheme_make_prim_w_arity(read_char, - "read-char", - 0, 1), + scheme_make_noncm_prim(read_char, + "read-char", + 0, 1), env); scheme_add_global_constant("read-char-or-special", - scheme_make_prim_w_arity(read_char_spec, - "read-char-or-special", - 0, 1), + scheme_make_noncm_prim(read_char_spec, + "read-char-or-special", + 0, 1), env); scheme_add_global_constant("read-byte", - scheme_make_prim_w_arity(read_byte, - "read-byte", - 0, 1), + scheme_make_noncm_prim(read_byte, + "read-byte", + 0, 1), env); scheme_add_global_constant("read-byte-or-special", - scheme_make_prim_w_arity(read_byte_spec, - "read-byte-or-special", - 0, 1), + scheme_make_noncm_prim(read_byte_spec, + "read-byte-or-special", + 0, 1), env); scheme_add_global_constant("read-bytes-line", - scheme_make_prim_w_arity(read_byte_line, - "read-bytes-line", - 0, 2), + scheme_make_noncm_prim(read_byte_line, + "read-bytes-line", + 0, 2), env); scheme_add_global_constant("read-line", - scheme_make_prim_w_arity(read_line, - "read-line", - 0, 2), + scheme_make_noncm_prim(read_line, + "read-line", + 0, 2), env); scheme_add_global_constant("read-string", - scheme_make_prim_w_arity(sch_read_string, - "read-string", - 1, 2), + scheme_make_noncm_prim(sch_read_string, + "read-string", + 1, 2), env); scheme_add_global_constant("read-string!", - scheme_make_prim_w_arity(sch_read_string_bang, - "read-string!", - 1, 4), + scheme_make_noncm_prim(sch_read_string_bang, + "read-string!", + 1, 4), env); scheme_add_global_constant("peek-string", - scheme_make_prim_w_arity(sch_peek_string, - "peek-string", - 2, 3), + scheme_make_noncm_prim(sch_peek_string, + "peek-string", + 2, 3), env); scheme_add_global_constant("peek-string!", - scheme_make_prim_w_arity(sch_peek_string_bang, - "peek-string!", - 2, 5), + scheme_make_noncm_prim(sch_peek_string_bang, + "peek-string!", + 2, 5), env); scheme_add_global_constant("read-bytes", - scheme_make_prim_w_arity(sch_read_bytes, - "read-bytes", - 1, 2), + scheme_make_noncm_prim(sch_read_bytes, + "read-bytes", + 1, 2), env); scheme_add_global_constant("read-bytes!", - scheme_make_prim_w_arity(sch_read_bytes_bang, - "read-bytes!", - 1, 4), + scheme_make_noncm_prim(sch_read_bytes_bang, + "read-bytes!", + 1, 4), env); scheme_add_global_constant("peek-bytes", - scheme_make_prim_w_arity(sch_peek_bytes, - "peek-bytes", - 2, 3), + scheme_make_noncm_prim(sch_peek_bytes, + "peek-bytes", + 2, 3), env); scheme_add_global_constant("peek-bytes!", - scheme_make_prim_w_arity(sch_peek_bytes_bang, - "peek-bytes!", - 2, 5), + scheme_make_noncm_prim(sch_peek_bytes_bang, + "peek-bytes!", + 2, 5), env); scheme_add_global_constant("read-bytes-avail!", - scheme_make_prim_w_arity(read_bytes_bang, - "read-bytes-avail!", - 1, 4), + scheme_make_noncm_prim(read_bytes_bang, + "read-bytes-avail!", + 1, 4), env); scheme_add_global_constant("read-bytes-avail!*", - scheme_make_prim_w_arity(read_bytes_bang_nonblock, - "read-bytes-avail!*", - 1, 4), + scheme_make_noncm_prim(read_bytes_bang_nonblock, + "read-bytes-avail!*", + 1, 4), env); scheme_add_global_constant("read-bytes-avail!/enable-break", - scheme_make_prim_w_arity(read_bytes_bang_break, - "read-bytes-avail!/enable-break", - 1, 4), + scheme_make_noncm_prim(read_bytes_bang_break, + "read-bytes-avail!/enable-break", + 1, 4), env); scheme_add_global_constant("peek-bytes-avail!", - scheme_make_prim_w_arity(peek_bytes_bang, - "peek-bytes-avail!", - 2, 6), + scheme_make_noncm_prim(peek_bytes_bang, + "peek-bytes-avail!", + 2, 6), env); scheme_add_global_constant("peek-bytes-avail!*", - scheme_make_prim_w_arity(peek_bytes_bang_nonblock, - "peek-bytes-avail!*", - 2, 6), + scheme_make_noncm_prim(peek_bytes_bang_nonblock, + "peek-bytes-avail!*", + 2, 6), env); scheme_add_global_constant("peek-bytes-avail!/enable-break", - scheme_make_prim_w_arity(peek_bytes_bang_break, - "peek-bytes-avail!/enable-break", - 2, 6), + scheme_make_noncm_prim(peek_bytes_bang_break, + "peek-bytes-avail!/enable-break", + 2, 6), env); scheme_add_global_constant("port-provides-progress-evts?", - scheme_make_prim_w_arity(can_provide_progress_evt, - "port-provides-progress-evts?", - 1, 1), + scheme_make_noncm_prim(can_provide_progress_evt, + "port-provides-progress-evts?", + 1, 1), env); scheme_add_global_constant("write-bytes", - scheme_make_prim_w_arity(write_bytes, - "write-bytes", - 1, 4), + scheme_make_noncm_prim(write_bytes, + "write-bytes", + 1, 4), env); scheme_add_global_constant("write-string", - scheme_make_prim_w_arity(write_string, - "write-string", - 1, 4), + scheme_make_noncm_prim(write_string, + "write-string", + 1, 4), env); scheme_add_global_constant("write-bytes-avail", - scheme_make_prim_w_arity(write_bytes_avail, - "write-bytes-avail", - 1, 4), + scheme_make_noncm_prim(write_bytes_avail, + "write-bytes-avail", + 1, 4), env); scheme_add_global_constant("write-bytes-avail*", - scheme_make_prim_w_arity(write_bytes_avail_nonblock, - "write-bytes-avail*", - 1, 4), + scheme_make_noncm_prim(write_bytes_avail_nonblock, + "write-bytes-avail*", + 1, 4), env); scheme_add_global_constant("write-bytes-avail/enable-break", - scheme_make_prim_w_arity(write_bytes_avail_break, - "write-bytes-avail/enable-break", - 1, 4), + scheme_make_noncm_prim(write_bytes_avail_break, + "write-bytes-avail/enable-break", + 1, 4), env); scheme_add_global_constant("port-writes-atomic?", - scheme_make_prim_w_arity(can_write_atomic, - "port-writes-atomic?", - 1, 1), + scheme_make_noncm_prim(can_write_atomic, + "port-writes-atomic?", + 1, 1), env); scheme_add_global_constant("port-writes-special?", - scheme_make_prim_w_arity(can_write_special, - "port-writes-special?", - 1, 1), + scheme_make_noncm_prim(can_write_special, + "port-writes-special?", + 1, 1), env); scheme_add_global_constant("write-special", - scheme_make_prim_w_arity(scheme_write_special, - "write-special", - 1, 2), + scheme_make_noncm_prim(scheme_write_special, + "write-special", + 1, 2), env); scheme_add_global_constant("write-special-avail*", - scheme_make_prim_w_arity(scheme_write_special_nonblock, - "write-special-avail*", - 1, 2), + scheme_make_noncm_prim(scheme_write_special_nonblock, + "write-special-avail*", + 1, 2), env); scheme_add_global_constant("peek-char", - scheme_make_prim_w_arity(peek_char, - "peek-char", - 0, 2), + scheme_make_noncm_prim(peek_char, + "peek-char", + 0, 2), env); scheme_add_global_constant("peek-char-or-special", - scheme_make_prim_w_arity(peek_char_spec, - "peek-char-or-special", - 0, 2), + scheme_make_noncm_prim(peek_char_spec, + "peek-char-or-special", + 0, 2), env); scheme_add_global_constant("peek-byte", - scheme_make_prim_w_arity(peek_byte, - "peek-byte", - 0, 2), + scheme_make_noncm_prim(peek_byte, + "peek-byte", + 0, 2), env); scheme_add_global_constant("peek-byte-or-special", - scheme_make_prim_w_arity(peek_byte_spec, - "peek-byte-or-special", - 0, 3), + scheme_make_noncm_prim(peek_byte_spec, + "peek-byte-or-special", + 0, 3), env); scheme_add_global_constant("eof-object?", scheme_make_folding_prim(eof_object_p, @@ -557,77 +557,77 @@ scheme_init_port_fun(Scheme_Env *env) 1, 1, 1), env); scheme_add_global_constant("byte-ready?", - scheme_make_prim_w_arity(byte_ready_p, - "byte-ready?", - 0, 1), + scheme_make_noncm_prim(byte_ready_p, + "byte-ready?", + 0, 1), env); scheme_add_global_constant("char-ready?", - scheme_make_prim_w_arity(char_ready_p, - "char-ready?", - 0, 1), + scheme_make_noncm_prim(char_ready_p, + "char-ready?", + 0, 1), env); scheme_add_global_constant("write", scheme_write_proc, env); scheme_add_global_constant("display", scheme_display_proc, env); scheme_add_global_constant("print", scheme_print_proc, env); scheme_add_global_constant("newline", - scheme_make_prim_w_arity(newline, - "newline", - 0, 1), + scheme_make_noncm_prim(newline, + "newline", + 0, 1), env); scheme_add_global_constant("write-char", - scheme_make_prim_w_arity(write_char, - "write-char", - 1, 2), + scheme_make_noncm_prim(write_char, + "write-char", + 1, 2), env); scheme_add_global_constant("write-byte", - scheme_make_prim_w_arity(write_byte, - "write-byte", - 1, 2), + scheme_make_noncm_prim(write_byte, + "write-byte", + 1, 2), env); scheme_add_global_constant("port-commit-peeked", - scheme_make_prim_w_arity(peeked_read, - "port-commit-peeked", - 3, 4), + scheme_make_noncm_prim(peeked_read, + "port-commit-peeked", + 3, 4), env); scheme_add_global_constant("port-progress-evt", - scheme_make_prim_w_arity(progress_evt, - "port-progress-evt", - 0, 1), + scheme_make_noncm_prim(progress_evt, + "port-progress-evt", + 0, 1), env); scheme_add_global_constant("write-bytes-avail-evt", - scheme_make_prim_w_arity(write_bytes_avail_evt, - "write-bytes-avail-evt", - 1, 4), + scheme_make_noncm_prim(write_bytes_avail_evt, + "write-bytes-avail-evt", + 1, 4), env); scheme_add_global_constant("write-special-evt", - scheme_make_prim_w_arity(write_special_evt, - "write-special-evt", - 2, 2), + scheme_make_noncm_prim(write_special_evt, + "write-special-evt", + 2, 2), env); scheme_add_global_constant("port-read-handler", - scheme_make_prim_w_arity(port_read_handler, - "port-read-handler", - 1, 2), + scheme_make_noncm_prim(port_read_handler, + "port-read-handler", + 1, 2), env); scheme_add_global_constant("port-display-handler", - scheme_make_prim_w_arity(port_display_handler, - "port-display-handler", - 1, 2), + scheme_make_noncm_prim(port_display_handler, + "port-display-handler", + 1, 2), env); scheme_add_global_constant("port-write-handler", - scheme_make_prim_w_arity(port_write_handler, - "port-write-handler", - 1, 2), + scheme_make_noncm_prim(port_write_handler, + "port-write-handler", + 1, 2), env); scheme_add_global_constant("port-print-handler", - scheme_make_prim_w_arity(port_print_handler, - "port-print-handler", - 1, 2), + scheme_make_noncm_prim(port_print_handler, + "port-print-handler", + 1, 2), env); scheme_add_global_constant("global-port-print-handler", scheme_register_parameter(global_port_print_handler, @@ -640,7 +640,7 @@ scheme_init_port_fun(Scheme_Env *env) "load", 1, 1, 0, -1), - env); + env); scheme_add_global_constant("current-load", scheme_register_parameter(current_load, "current-load", @@ -669,24 +669,24 @@ scheme_init_port_fun(Scheme_Env *env) env); scheme_add_global_constant("flush-output", - scheme_make_prim_w_arity(flush_output, - "flush-output", - 0, 1), + scheme_make_noncm_prim(flush_output, + "flush-output", + 0, 1), env); scheme_add_global_constant("file-position", - scheme_make_prim_w_arity(scheme_file_position, - "file-position", - 1, 2), + scheme_make_noncm_prim(scheme_file_position, + "file-position", + 1, 2), env); scheme_add_global_constant("file-stream-buffer-mode", - scheme_make_prim_w_arity(scheme_file_buffer, - "file-stream-buffer-mode", - 1, 2), + scheme_make_noncm_prim(scheme_file_buffer, + "file-stream-buffer-mode", + 1, 2), env); scheme_add_global_constant("port-file-identity", - scheme_make_prim_w_arity(scheme_file_identity, - "port-file-identity", - 1, 1), + scheme_make_noncm_prim(scheme_file_identity, + "port-file-identity", + 1, 1), env); scheme_add_global_constant("make-pipe", @@ -696,16 +696,16 @@ scheme_init_port_fun(Scheme_Env *env) 2, 2), env); scheme_add_global_constant("pipe-content-length", - scheme_make_prim_w_arity(pipe_length, - "pipe-content-length", - 1, 1), + scheme_make_noncm_prim(pipe_length, + "pipe-content-length", + 1, 1), env); scheme_add_global_constant("port-count-lines!", - scheme_make_prim_w_arity(port_count_lines, - "port-count-lines!", - 1, 1), + scheme_make_noncm_prim(port_count_lines, + "port-count-lines!", + 1, 1), env); scheme_add_global_constant("port-next-location", scheme_make_prim_w_arity2(port_next_location, diff --git a/src/mzscheme/src/print.c b/src/mzscheme/src/print.c index b268fedc89..39fd759bb1 100644 --- a/src/mzscheme/src/print.c +++ b/src/mzscheme/src/print.c @@ -123,12 +123,6 @@ static Scheme_Hash_Table *global_constants_ht; #define ssALL(x, isbox) 1 #define ssALLp(x, isbox) isbox -#ifdef MZ_PRECISE_GC -# define ZERO_SIZED(closure) !(closure->closure_size) -#else -# define ZERO_SIZED(closure) closure->zero_sized -#endif - static Scheme_Hash_Table *cache_ht; void scheme_init_print(Scheme_Env *env) @@ -1668,14 +1662,29 @@ print(Scheme_Object *obj, int notdisplay, int compact, Scheme_Hash_Table *ht, closed = 1; } - else if (SCHEME_CLOSUREP(obj)) + else if (SCHEME_CLOSUREP(obj) + || SAME_TYPE(SCHEME_TYPE(obj), scheme_native_closure_type)) { if (compact || !pp->print_unreadable) { - Scheme_Closure *closure = (Scheme_Closure *)obj; - if (compact && ZERO_SIZED(closure)) { - /* Print original code: */ - compact = print((Scheme_Object *)SCHEME_COMPILED_CLOS_CODE(closure), notdisplay, compact, ht, symtab, rnht, pp); - } else + int done = 0; + if (compact) { + if (SCHEME_TYPE(obj) == scheme_closure_type) { + Scheme_Closure *closure = (Scheme_Closure *)obj; + if (ZERO_SIZED_CLOSUREP(closure)) { + /* Print original `lambda' code: */ + compact = print((Scheme_Object *)SCHEME_COMPILED_CLOS_CODE(closure), notdisplay, compact, ht, symtab, rnht, pp); + done = 1; + } + } else if (SCHEME_TYPE(obj) == scheme_case_closure_type) { + obj = scheme_unclose_case_lambda(obj, 0); + if (!SCHEME_PROCP(obj)) { + /* Print original `case-lambda' code: */ + compact = print(obj, notdisplay, compact, ht, symtab, rnht, pp); + done = 1; + } + } + } + if (!done) cannot_print(pp, notdisplay, obj, ht, compact); } else { int len; diff --git a/src/mzscheme/src/read.c b/src/mzscheme/src/read.c index b39070e14b..57ffe50823 100644 --- a/src/mzscheme/src/read.c +++ b/src/mzscheme/src/read.c @@ -3633,6 +3633,7 @@ typedef struct CPort { unsigned char *start; unsigned long symtab_size; long base; + int flags; Scheme_Object *orig_port; Scheme_Hash_Table **ht; Scheme_Object **symtab; @@ -4580,7 +4581,7 @@ static Scheme_Object *read_compiled(Scheme_Object *port, rp->symtab_size = symtabsize; rp->ht = ht; rp->symtab = symtab; - + insp = scheme_get_param(scheme_current_config(), MZCONFIG_CODE_INSPECTOR); rp->insp = insp; diff --git a/src/mzscheme/src/schemef.h b/src/mzscheme/src/schemef.h index a327751856..525f41b540 100644 --- a/src/mzscheme/src/schemef.h +++ b/src/mzscheme/src/schemef.h @@ -275,6 +275,7 @@ MZ_EXTERN Scheme_Object *scheme_tail_eval_expr(Scheme_Object *obj); MZ_EXTERN void scheme_set_tail_buffer_size(int s); MZ_EXTERN Scheme_Object *scheme_force_value(Scheme_Object *); +MZ_EXTERN Scheme_Object *scheme_force_one_value(Scheme_Object *); MZ_EXTERN void *scheme_set_cont_mark(Scheme_Object *key, Scheme_Object *val); MZ_EXTERN void scheme_push_continuation_frame(Scheme_Cont_Frame_Data *); @@ -395,6 +396,9 @@ MZ_EXTERN Scheme_Object *scheme_make_folding_prim(Scheme_Prim *prim, const char *name, mzshort mina, mzshort maxa, short functional); +MZ_EXTERN Scheme_Object *scheme_make_noncm_prim(Scheme_Prim *prim, + const char *name, + mzshort mina, mzshort maxa); MZ_EXTERN Scheme_Object *scheme_make_noneternal_prim_w_arity(Scheme_Prim *prim, const char *name, mzshort mina, mzshort maxa); @@ -408,7 +412,7 @@ MZ_EXTERN Scheme_Object *scheme_make_folding_closed_prim(Scheme_Closed_Prim *pri MZ_EXTERN Scheme_Object *scheme_make_prim_w_everything(Scheme_Prim *fun, int eternal, const char *name, mzshort mina, mzshort maxa, - short folding, + int folding, mzshort minr, mzshort maxr); MZ_EXTERN Scheme_Object *scheme_make_closed_prim_w_everything(Scheme_Closed_Prim *fun, void *data, diff --git a/src/mzscheme/src/schemex.h b/src/mzscheme/src/schemex.h index 251db3a9ca..49c506e1cb 100644 --- a/src/mzscheme/src/schemex.h +++ b/src/mzscheme/src/schemex.h @@ -220,6 +220,7 @@ Scheme_Object *(*scheme_tail_apply_to_list)(Scheme_Object *f, Scheme_Object *l); Scheme_Object *(*scheme_tail_eval_expr)(Scheme_Object *obj); void (*scheme_set_tail_buffer_size)(int s); Scheme_Object *(*scheme_force_value)(Scheme_Object *); +Scheme_Object *(*scheme_force_one_value)(Scheme_Object *); void *(*scheme_set_cont_mark)(Scheme_Object *key, Scheme_Object *val); void (*scheme_push_continuation_frame)(Scheme_Cont_Frame_Data *); void (*scheme_pop_continuation_frame)(Scheme_Cont_Frame_Data *); @@ -319,6 +320,9 @@ Scheme_Object *(*scheme_make_folding_prim)(Scheme_Prim *prim, const char *name, mzshort mina, mzshort maxa, short functional); +Scheme_Object *(*scheme_make_noncm_prim)(Scheme_Prim *prim, + const char *name, + mzshort mina, mzshort maxa); Scheme_Object *(*scheme_make_noneternal_prim_w_arity)(Scheme_Prim *prim, const char *name, mzshort mina, mzshort maxa); @@ -332,7 +336,7 @@ Scheme_Object *(*scheme_make_folding_closed_prim)(Scheme_Closed_Prim *prim, Scheme_Object *(*scheme_make_prim_w_everything)(Scheme_Prim *fun, int eternal, const char *name, mzshort mina, mzshort maxa, - short folding, + int folding, mzshort minr, mzshort maxr); Scheme_Object *(*scheme_make_closed_prim_w_everything)(Scheme_Closed_Prim *fun, void *data, diff --git a/src/mzscheme/src/schemex.inc b/src/mzscheme/src/schemex.inc index c798fd85ed..845a17b05d 100644 --- a/src/mzscheme/src/schemex.inc +++ b/src/mzscheme/src/schemex.inc @@ -136,6 +136,7 @@ scheme_extension_table->scheme_tail_eval_expr = scheme_tail_eval_expr; scheme_extension_table->scheme_set_tail_buffer_size = scheme_set_tail_buffer_size; scheme_extension_table->scheme_force_value = scheme_force_value; + scheme_extension_table->scheme_force_one_value = scheme_force_one_value; scheme_extension_table->scheme_set_cont_mark = scheme_set_cont_mark; scheme_extension_table->scheme_push_continuation_frame = scheme_push_continuation_frame; scheme_extension_table->scheme_pop_continuation_frame = scheme_pop_continuation_frame; @@ -211,6 +212,7 @@ scheme_extension_table->scheme_make_closed_prim = scheme_make_closed_prim; scheme_extension_table->scheme_make_prim_w_arity = scheme_make_prim_w_arity; scheme_extension_table->scheme_make_folding_prim = scheme_make_folding_prim; + scheme_extension_table->scheme_make_noncm_prim = scheme_make_noncm_prim; scheme_extension_table->scheme_make_noneternal_prim_w_arity = scheme_make_noneternal_prim_w_arity; scheme_extension_table->scheme_make_closed_prim_w_arity = scheme_make_closed_prim_w_arity; scheme_extension_table->scheme_make_folding_closed_prim = scheme_make_folding_closed_prim; diff --git a/src/mzscheme/src/schemexm.h b/src/mzscheme/src/schemexm.h index 7225ee0f19..6ebe40508b 100644 --- a/src/mzscheme/src/schemexm.h +++ b/src/mzscheme/src/schemexm.h @@ -136,6 +136,7 @@ #define scheme_tail_eval_expr (scheme_extension_table->scheme_tail_eval_expr) #define scheme_set_tail_buffer_size (scheme_extension_table->scheme_set_tail_buffer_size) #define scheme_force_value (scheme_extension_table->scheme_force_value) +#define scheme_force_one_value (scheme_extension_table->scheme_force_one_value) #define scheme_set_cont_mark (scheme_extension_table->scheme_set_cont_mark) #define scheme_push_continuation_frame (scheme_extension_table->scheme_push_continuation_frame) #define scheme_pop_continuation_frame (scheme_extension_table->scheme_pop_continuation_frame) @@ -211,6 +212,7 @@ #define scheme_make_closed_prim (scheme_extension_table->scheme_make_closed_prim) #define scheme_make_prim_w_arity (scheme_extension_table->scheme_make_prim_w_arity) #define scheme_make_folding_prim (scheme_extension_table->scheme_make_folding_prim) +#define scheme_make_noncm_prim (scheme_extension_table->scheme_make_noncm_prim) #define scheme_make_noneternal_prim_w_arity (scheme_extension_table->scheme_make_noneternal_prim_w_arity) #define scheme_make_closed_prim_w_arity (scheme_extension_table->scheme_make_closed_prim_w_arity) #define scheme_make_folding_closed_prim (scheme_extension_table->scheme_make_folding_closed_prim) diff --git a/src/mzscheme/src/schmach.h b/src/mzscheme/src/schmach.h index 0c7d0b9952..2acc5afafa 100644 --- a/src/mzscheme/src/schmach.h +++ b/src/mzscheme/src/schmach.h @@ -31,11 +31,14 @@ #ifdef STACK_GROWS_UP # define STK_COMP(a,b) ((a) > (b)) +# define STK_DIFF(a, b) ((a) - (b)) #else # ifdef STACK_GROWS_DOWN # define STK_COMP(a,b) ((a) < (b)) +# define STK_DIFF(a, b) ((b) - (a)) # else # define STK_COMP(a,b) (scheme_stack_grows_up == ((a) > (b))) +# define STK_DIFF(a,b) (scheme_stack_grows_up ? ((b) - (a)) : ((a) - (b))) # endif #endif diff --git a/src/mzscheme/src/schminc.h b/src/mzscheme/src/schminc.h index 012858dc04..75c1551d26 100644 --- a/src/mzscheme/src/schminc.h +++ b/src/mzscheme/src/schminc.h @@ -13,7 +13,7 @@ #define USE_COMPILED_STARTUP 1 -#define EXPECTED_PRIM_COUNT 852 +#define EXPECTED_PRIM_COUNT 853 #ifdef MZSCHEME_SOMETHING_OMITTED # undef USE_COMPILED_STARTUP diff --git a/src/mzscheme/src/schnapp.inc b/src/mzscheme/src/schnapp.inc new file mode 100644 index 0000000000..da63da01ac --- /dev/null +++ b/src/mzscheme/src/schnapp.inc @@ -0,0 +1,70 @@ + if (!SCHEME_INTP(rator)) { + Scheme_Type t; + + t = _SCHEME_TYPE(rator); + + if (t == scheme_prim_type) { + Scheme_Object *v; + Scheme_Primitive_Proc *prim; + + prim = (Scheme_Primitive_Proc *)rator; + + if (argc < prim->mina || (argc > prim->maxa && prim->maxa >= 0)) { + scheme_wrong_count(prim->name, prim->mina, prim->maxa, argc, argv); + return NULL; /* Shouldn't get here */ + } + + v = prim->prim_val(argc, argv); + +#if PRIM_CHECK_VALUE + v = _scheme_force_value(v); +#endif + +#if PRIM_CHECK_MULTI + if (v == SCHEME_MULTIPLE_VALUES) { + scheme_wrong_return_arity(NULL, 1, scheme_multiple_count, scheme_multiple_array, NULL); + return NULL; /* Shouldn't get here */ + } +#endif + + return v; + } else if (t == scheme_closed_prim_type) { + Scheme_Object *v; + Scheme_Closed_Primitive_Proc *prim; + + prim = (Scheme_Closed_Primitive_Proc *)rator; + + if (argc < prim->mina || (argc > prim->maxa && prim->maxa >= 0)) { + scheme_wrong_count(prim->name, prim->mina, prim->maxa, argc, argv); + return NULL; /* Shouldn't get here */ + } + + v = prim->prim_val(prim->data, argc, argv); + +#if PRIM_CHECK_VALUE + v = _scheme_force_value(v); +#endif + +#if PRIM_CHECK_MULTI + if (v == SCHEME_MULTIPLE_VALUES) { + scheme_wrong_return_arity(NULL, 1, scheme_multiple_count, scheme_multiple_array, NULL); + return NULL; /* Shouldn't get here */ + } +#endif + + return v; + } + } + +#if PRIM_CHECK_MULTI + return _scheme_apply(rator, argc, argv); +#else +# ifdef PRIM_CHECK_VALUE + return _scheme_apply_multi(rator, argc, argv); +# else + return _scheme_tail_apply(rator, argc, argv); +# endif +#endif + +#undef PRIM_CHECK_VALUE +#undef PRIM_CHECK_MULTI diff --git a/src/mzscheme/src/schpriv.h b/src/mzscheme/src/schpriv.h index 774a84f7e0..c44822abf1 100644 --- a/src/mzscheme/src/schpriv.h +++ b/src/mzscheme/src/schpriv.h @@ -217,10 +217,20 @@ extern Scheme_Object *scheme_values_func; extern Scheme_Object *scheme_void_proc; extern Scheme_Object *scheme_not_prim; +extern Scheme_Object *scheme_eq_prim; +extern Scheme_Object *scheme_null_p_prim; +extern Scheme_Object *scheme_pair_p_prim; +extern Scheme_Object *scheme_car_prim; +extern Scheme_Object *scheme_cdr_prim; extern Scheme_Object *scheme_define_values_syntax, *scheme_define_syntaxes_syntax; extern Scheme_Object *scheme_lambda_syntax; extern Scheme_Object *scheme_begin_syntax; +extern Scheme_Object *scheme_add1_prim; +extern Scheme_Object *scheme_sub1_prim; +extern Scheme_Object *scheme_plus_prim; +extern Scheme_Object *scheme_minus_prim; + extern Scheme_Object *scheme_def_exit_proc; extern Scheme_Object *scheme_orig_stdout_port; @@ -782,6 +792,9 @@ typedef struct { Scheme_Object so; mzshort count; Scheme_Object *name; /* see note below */ +#ifdef MZ_USE_JIT + struct Scheme_Native_Closure_Data *native_code; /* generated by lightning */ +#endif Scheme_Object *array[1]; } Scheme_Case_Lambda; /* If count is not 0, then check array[0] for CLOS_IS_METHOD. @@ -790,6 +803,11 @@ typedef struct { #define scheme_make_prim_w_arity2(f, n, mina, maxa, minr, maxr) \ scheme_make_prim_w_everything(f, 0, n, mina, maxa, 0, minr, maxr) +Scheme_Object *scheme_unclose_case_lambda(Scheme_Object *expr, int jit); + +Scheme_Object *scheme_native_stack_trace(void); +void scheme_clean_native_symtab(void); + /*========================================================================*/ /* control flow */ /*========================================================================*/ @@ -855,6 +873,7 @@ typedef struct Scheme_Cont_Mark_Set { Scheme_Object so; struct Scheme_Cont_Mark_Chain *chain; long cmpos; + Scheme_Object *native_stack_trace; } Scheme_Cont_Mark_Set; #define SCHEME_LOG_MARK_SEGMENT_SIZE 8 @@ -1386,6 +1405,18 @@ void scheme_install_type_writer(Scheme_Type type, Scheme_Type_Writer f); Scheme_Object *scheme_make_default_readtable(); +Scheme_Object *_scheme_apply_from_native(Scheme_Object *rator, + int argc, + Scheme_Object **argv); +Scheme_Object *_scheme_apply_multi_from_native(Scheme_Object *rator, + int argc, + Scheme_Object **argv); +Scheme_Object *_scheme_tail_apply_from_native(Scheme_Object *rator, + int argc, + Scheme_Object **argv); + +void scheme_flush_stack_cache(); + /*========================================================================*/ /* compile and link */ /*========================================================================*/ @@ -1458,6 +1489,7 @@ typedef struct Resolve_Prefix typedef struct Resolve_Info { MZTAG_IF_REQUIRED + int use_jit; int size, oldsize, count, pos; Resolve_Prefix *prefix; mzshort toplevel_pos; /* -1 mean consult next */ @@ -1487,6 +1519,8 @@ typedef void (*Scheme_Syntax_Validater)(Scheme_Object *data, Mz_CPort *port, typedef struct Scheme_Object *(*Scheme_Syntax_Executer)(struct Scheme_Object *data); +typedef struct Scheme_Object *(*Scheme_Syntax_Jitter)(struct Scheme_Object *data); + typedef struct Scheme_Closure_Data { Scheme_Inclhash_Object iso; /* keyex used for flags */ @@ -1496,6 +1530,9 @@ typedef struct Scheme_Closure_Data mzshort *closure_map; /* Actually a Closure_Info* until resolved! */ Scheme_Object *code; Scheme_Object *name; +#ifdef MZ_USE_JIT + struct Scheme_Native_Closure_Data *native_code; /* generated by lightning */ +#endif } Scheme_Closure_Data; #define SCHEME_CLOSURE_DATA_FLAGS(obj) MZ_OPT_HASH_KEY(&(obj)->iso) @@ -1516,6 +1553,44 @@ typedef struct { #define SCHEME_COMPILED_CLOS_CODE(c) ((Scheme_Closure *)c)->code #define SCHEME_COMPILED_CLOS_ENV(c) ((Scheme_Closure *)c)->vals +#ifdef MZ_PRECISE_GC +# define ZERO_SIZED_CLOSUREP(closure) !(closure->closure_size) +#else +# define ZERO_SIZED_CLOSUREP(closure) closure->zero_sized +#endif + +typedef struct Scheme_Native_Closure_Data { + MZTAG_IF_REQUIRED + Scheme_Closed_Prim *code; + union { + void *tail_code; /* For non-case-lambda */ + mzshort *arities; /* For case-lambda */ + } u; + void *arity_code; + mzshort max_let_depth; + mzshort closure_size; + union { + struct Scheme_Closure_Data *orig_code; /* For not-yet-JITted non-case-lambda */ + Scheme_Object *name; + } u2; +} Scheme_Native_Closure_Data; + +#define SCHEME_NATIVE_CLOSURE_DATA_FLAGS(obj) MZ_OPT_HASH_KEY(&(obj)->iso) + +typedef struct { + Scheme_Object so; +#ifdef MZ_PRECISE_GC + int closure_size; +#else + short zero_sized; +#endif + Scheme_Native_Closure_Data *code; + Scheme_Object *vals[1]; +} Scheme_Native_Closure; + +Scheme_Native_Closure_Data *scheme_generate_lambda(Scheme_Closure_Data *obj, int drop_code, + Scheme_Native_Closure_Data *case_lam); + #define MAX_CONST_LOCAL_POS 64 extern Scheme_Object *scheme_local[MAX_CONST_LOCAL_POS][2]; @@ -1581,6 +1656,11 @@ Scheme_Object *scheme_make_closure(Scheme_Thread *p, Scheme_Object *compiled_code, int close); +Scheme_Object *scheme_make_native_closure(Scheme_Native_Closure_Data *code); +Scheme_Object *scheme_make_native_case_closure(Scheme_Native_Closure_Data *code); + +Scheme_Native_Closure_Data *scheme_generate_case_lambda(Scheme_Case_Lambda *cl); + #define scheme_add_good_binding(i,v,f) (f->values[i] = v) Scheme_Object *scheme_compiled_void(); @@ -1611,14 +1691,16 @@ int scheme_is_sub_env(Scheme_Comp_Env *stx_env, Scheme_Comp_Env *env); #define REF_EXPD 11 #define _COUNT_EXPD_ 12 -#define scheme_register_syntax(i, fr, fv, fe, pa) \ +#define scheme_register_syntax(i, fr, fv, fe, fj, pa) \ (scheme_syntax_resolvers[i] = fr, \ scheme_syntax_executers[i] = fe, \ scheme_syntax_validaters[i] = fv, \ + scheme_syntax_jitters[i] = fj, \ scheme_syntax_protect_afters[i] = pa) extern Scheme_Syntax_Resolver scheme_syntax_resolvers[_COUNT_EXPD_]; extern Scheme_Syntax_Validater scheme_syntax_validaters[_COUNT_EXPD_]; extern Scheme_Syntax_Executer scheme_syntax_executers[_COUNT_EXPD_]; +extern Scheme_Syntax_Jitter scheme_syntax_jitters[_COUNT_EXPD_]; extern int scheme_syntax_protect_afters[_COUNT_EXPD_]; Scheme_Object *scheme_protect_quote(Scheme_Object *expr); @@ -1691,6 +1773,9 @@ Scheme_Object *scheme_resolve_closure_compilation(Scheme_Object *_data, Resolve_ Scheme_App_Rec *scheme_malloc_application(int n); void scheme_finish_application(Scheme_App_Rec *app); +Scheme_Object *scheme_jit_expr(Scheme_Object *); +Scheme_Object *scheme_jit_closure(Scheme_Object *); + #define SCHEME_SYNTAX(obj) SCHEME_PTR1_VAL(obj) #define SCHEME_SYNTAX_EXP(obj) SCHEME_PTR2_VAL(obj) @@ -2071,6 +2156,10 @@ Scheme_Object *scheme_special_comment_value(Scheme_Object *o); Scheme_Object *scheme_get_stack_trace(Scheme_Object *mark_set); +Scheme_Object *scheme_get_or_check_arity(Scheme_Object *p, long a); +int scheme_native_arity_check(Scheme_Object *closure, int argc); +Scheme_Object *scheme_get_native_arity(Scheme_Object *closure); + /*========================================================================*/ /* filesystem utilities */ /*========================================================================*/ diff --git a/src/mzscheme/src/schvers.h b/src/mzscheme/src/schvers.h index a06f13bff9..d6d6cd25b7 100644 --- a/src/mzscheme/src/schvers.h +++ b/src/mzscheme/src/schvers.h @@ -8,7 +8,7 @@ #endif -#define MZSCHEME_VERSION_MAJOR 300 -#define MZSCHEME_VERSION_MINOR 3 +#define MZSCHEME_VERSION_MAJOR 301 +#define MZSCHEME_VERSION_MINOR 4 -#define MZSCHEME_VERSION "300.3" _MZ_SPECIAL_TAG +#define MZSCHEME_VERSION "301.4" _MZ_SPECIAL_TAG diff --git a/src/mzscheme/src/setjmpup.c b/src/mzscheme/src/setjmpup.c index 91da87da0e..9b56a2d4a3 100644 --- a/src/mzscheme/src/setjmpup.c +++ b/src/mzscheme/src/setjmpup.c @@ -383,6 +383,10 @@ int scheme_setjmpup_relative(Scheme_Jumpup_Buf *b, void *base, int local; long disguised_b; +#ifdef MZ_USE_JIT + scheme_flush_stack_cache(); +#endif + FLUSH_REGISTER_WINDOWS; if (STK_COMP((unsigned long)start, (unsigned long)&local)) @@ -423,6 +427,10 @@ void scheme_longjmpup(Scheme_Jumpup_Buf *b) long z; long junk[200]; +#ifdef MZ_USE_JIT + scheme_flush_stack_cache(); +#endif + uncopy_stack(STK_COMP((unsigned long)&z, DEEPPOS(b)), b, junk); } diff --git a/src/mzscheme/src/startup.inc b/src/mzscheme/src/startup.inc index 423a325c02..33b7543bd9 100644 --- a/src/mzscheme/src/startup.inc +++ b/src/mzscheme/src/startup.inc @@ -2206,6 +2206,15 @@ "(module #%more-scheme #%kernel" "(require #%small-scheme #%define #%paramz)" "(require-for-syntax #%kernel #%stx #%stxcase-scheme #%qqstx)" +"(define-syntax case-test" +"(lambda(x)" +"(syntax-case x()" +"((_ x(k))" +"(if(symbol?(syntax-e #'k))" +"(syntax(eq? x 'k))" +"(syntax(eqv? x 'k))))" +"((_ x(k ...))" +"(syntax(memv x '(k ...)))))))" "(define-syntax case" "(lambda(x)" "(syntax-case x(else)" @@ -2214,10 +2223,10 @@ "((_ v(else e1 e2 ...))" "(syntax/loc x(begin v e1 e2 ...)))" "((_ v((k ...) e1 e2 ...))" -"(syntax/loc x(if(memv v '(k ...))(begin e1 e2 ...))))" +"(syntax/loc x(if(case-test v(k ...))(begin e1 e2 ...))))" "((_ v((k ...) e1 e2 ...) c1 c2 ...)" "(syntax/loc x(let((x v))" -"(if(memv x '(k ...))" +"(if(case-test x(k ...))" "(begin e1 e2 ...)" "(case x c1 c2 ...)))))" "((_ v(bad e1 e2 ...) . rest)" diff --git a/src/mzscheme/src/startup.ss b/src/mzscheme/src/startup.ss index 2da6c43b64..cb28ca5df4 100644 --- a/src/mzscheme/src/startup.ss +++ b/src/mzscheme/src/startup.ss @@ -2577,6 +2577,16 @@ (require #%small-scheme #%define #%paramz) (require-for-syntax #%kernel #%stx #%stxcase-scheme #%qqstx) + (define-syntax case-test + (lambda (x) + (syntax-case x () + [(_ x (k)) + (if (symbol? (syntax-e #'k)) + (syntax (eq? x 'k)) + (syntax (eqv? x 'k)))] + [(_ x (k ...)) + (syntax (memv x '(k ...)))]))) + ;; From Dybvig: (define-syntax case (lambda (x) @@ -2586,10 +2596,10 @@ ((_ v (else e1 e2 ...)) (syntax/loc x (begin v e1 e2 ...))) ((_ v ((k ...) e1 e2 ...)) - (syntax/loc x (if (memv v '(k ...)) (begin e1 e2 ...)))) + (syntax/loc x (if (case-test v (k ...)) (begin e1 e2 ...)))) ((_ v ((k ...) e1 e2 ...) c1 c2 ...) (syntax/loc x (let ((x v)) - (if (memv x '(k ...)) + (if (case-test x (k ...)) (begin e1 e2 ...) (case x c1 c2 ...))))) ((_ v (bad e1 e2 ...) . rest) diff --git a/src/mzscheme/src/string.c b/src/mzscheme/src/string.c index f1cfd0f4d3..223d768a23 100644 --- a/src/mzscheme/src/string.c +++ b/src/mzscheme/src/string.c @@ -329,14 +329,14 @@ scheme_init_string (Scheme_Env *env) 1, 1, 1), env); scheme_add_global_constant("make-string", - scheme_make_prim_w_arity(make_string, - "make-string", - 1, 2), + scheme_make_noncm_prim(make_string, + "make-string", + 1, 2), env); scheme_add_global_constant("string", - scheme_make_prim_w_arity(string, - "string", - 0, -1), + scheme_make_noncm_prim(string, + "string", + 0, -1), env); scheme_add_global_constant("string-length", scheme_make_folding_prim(string_length, @@ -344,168 +344,168 @@ scheme_init_string (Scheme_Env *env) 1, 1, 1), env); scheme_add_global_constant("string-ref", - scheme_make_prim_w_arity(string_ref, - "string-ref", - 2, 2), + scheme_make_noncm_prim(string_ref, + "string-ref", + 2, 2), env); scheme_add_global_constant("string-set!", - scheme_make_prim_w_arity(string_set, - "string-set!", - 3, 3), + scheme_make_noncm_prim(string_set, + "string-set!", + 3, 3), env); scheme_add_global_constant("string=?", - scheme_make_prim_w_arity(string_eq, - "string=?", - 2, -1), + scheme_make_noncm_prim(string_eq, + "string=?", + 2, -1), env); scheme_add_global_constant("string-locale=?", - scheme_make_prim_w_arity(string_locale_eq, - "string-locale=?", - 2, -1), + scheme_make_noncm_prim(string_locale_eq, + "string-locale=?", + 2, -1), env); scheme_add_global_constant("string-ci=?", - scheme_make_prim_w_arity(string_ci_eq, - "string-ci=?", - 2, -1), + scheme_make_noncm_prim(string_ci_eq, + "string-ci=?", + 2, -1), env); scheme_add_global_constant("string-locale-ci=?", - scheme_make_prim_w_arity(string_locale_ci_eq, - "string-locale-ci=?", - 2, -1), + scheme_make_noncm_prim(string_locale_ci_eq, + "string-locale-ci=?", + 2, -1), env); scheme_add_global_constant("string?", - scheme_make_prim_w_arity(string_gt, - "string>?", - 2, -1), + scheme_make_noncm_prim(string_gt, + "string>?", + 2, -1), env); scheme_add_global_constant("string-locale>?", - scheme_make_prim_w_arity(string_locale_gt, - "string-locale>?", - 2, -1), + scheme_make_noncm_prim(string_locale_gt, + "string-locale>?", + 2, -1), env); scheme_add_global_constant("string<=?", - scheme_make_prim_w_arity(string_lt_eq, - "string<=?", - 2, -1), + scheme_make_noncm_prim(string_lt_eq, + "string<=?", + 2, -1), env); scheme_add_global_constant("string>=?", - scheme_make_prim_w_arity(string_gt_eq, - "string>=?", - 2, -1), + scheme_make_noncm_prim(string_gt_eq, + "string>=?", + 2, -1), env); scheme_add_global_constant("string-ci?", - scheme_make_prim_w_arity(string_ci_gt, - "string-ci>?", - 2, -1), + scheme_make_noncm_prim(string_ci_gt, + "string-ci>?", + 2, -1), env); scheme_add_global_constant("string-locale-ci>?", - scheme_make_prim_w_arity(string_locale_ci_gt, - "string-locale-ci>?", - 2, -1), + scheme_make_noncm_prim(string_locale_ci_gt, + "string-locale-ci>?", + 2, -1), env); scheme_add_global_constant("string-ci<=?", - scheme_make_prim_w_arity(string_ci_lt_eq, - "string-ci<=?", - 2, -1), + scheme_make_noncm_prim(string_ci_lt_eq, + "string-ci<=?", + 2, -1), env); scheme_add_global_constant("string-ci>=?", - scheme_make_prim_w_arity(string_ci_gt_eq, - "string-ci>=?", - 2, -1), + scheme_make_noncm_prim(string_ci_gt_eq, + "string-ci>=?", + 2, -1), env); scheme_add_global_constant("substring", - scheme_make_prim_w_arity(substring, - "substring", - 2, 3), + scheme_make_noncm_prim(substring, + "substring", + 2, 3), env); scheme_add_global_constant("string-append", - scheme_make_prim_w_arity(string_append, - "string-append", - 0, -1), + scheme_make_noncm_prim(string_append, + "string-append", + 0, -1), env); scheme_add_global_constant("string->list", - scheme_make_prim_w_arity(string_to_list, - "string->list", - 1, 1), + scheme_make_noncm_prim(string_to_list, + "string->list", + 1, 1), env); scheme_add_global_constant("list->string", - scheme_make_prim_w_arity(list_to_string, - "list->string", - 1, 1), + scheme_make_noncm_prim(list_to_string, + "list->string", + 1, 1), env); scheme_add_global_constant("string-copy", - scheme_make_prim_w_arity(string_copy, - "string-copy", - 1, 1), + scheme_make_noncm_prim(string_copy, + "string-copy", + 1, 1), env); scheme_add_global_constant("string-copy!", - scheme_make_prim_w_arity(string_copy_bang, - "string-copy!", - 3, 5), + scheme_make_noncm_prim(string_copy_bang, + "string-copy!", + 3, 5), env); scheme_add_global_constant("string-fill!", - scheme_make_prim_w_arity(string_fill, - "string-fill!", - 2, 2), + scheme_make_noncm_prim(string_fill, + "string-fill!", + 2, 2), env); scheme_add_global_constant("string->immutable-string", - scheme_make_prim_w_arity(string_to_immutable, - "string->immutable-string", - 1, 1), + scheme_make_noncm_prim(string_to_immutable, + "string->immutable-string", + 1, 1), env); scheme_add_global_constant("string-upcase", - scheme_make_prim_w_arity(string_upcase, - "string-upcase", - 1, 1), + scheme_make_noncm_prim(string_upcase, + "string-upcase", + 1, 1), env); scheme_add_global_constant("string-downcase", - scheme_make_prim_w_arity(string_downcase, - "string-downcase", - 1, 1), + scheme_make_noncm_prim(string_downcase, + "string-downcase", + 1, 1), env); scheme_add_global_constant("string-titlecase", - scheme_make_prim_w_arity(string_titlecase, - "string-titlecase", - 1, 1), + scheme_make_noncm_prim(string_titlecase, + "string-titlecase", + 1, 1), env); scheme_add_global_constant("string-foldcase", - scheme_make_prim_w_arity(string_foldcase, - "string-foldcase", - 1, 1), + scheme_make_noncm_prim(string_foldcase, + "string-foldcase", + 1, 1), env); scheme_add_global_constant("string-locale-upcase", - scheme_make_prim_w_arity(string_locale_upcase, - "string-locale-upcase", - 1, 1), + scheme_make_noncm_prim(string_locale_upcase, + "string-locale-upcase", + 1, 1), env); scheme_add_global_constant("string-locale-downcase", - scheme_make_prim_w_arity(string_locale_downcase, - "string-locale-downcase", - 1, 1), + scheme_make_noncm_prim(string_locale_downcase, + "string-locale-downcase", + 1, 1), env); scheme_add_global_constant("current-locale", @@ -514,20 +514,20 @@ scheme_init_string (Scheme_Env *env) MZCONFIG_LOCALE), env); scheme_add_global_constant("locale-string-encoding", - scheme_make_prim_w_arity(locale_string_encoding, - "locale-string-encoding", - 0, 0), + scheme_make_noncm_prim(locale_string_encoding, + "locale-string-encoding", + 0, 0), env); scheme_add_global_constant("system-language+country", - scheme_make_prim_w_arity(system_language_country, - "system-language+country", - 0, 0), + scheme_make_noncm_prim(system_language_country, + "system-language+country", + 0, 0), env); scheme_add_global_constant("bytes-converter?", - scheme_make_prim_w_arity(byte_converter_p, - "bytes-converter?", - 1, 1), + scheme_make_noncm_prim(byte_converter_p, + "bytes-converter?", + 1, 1), env); scheme_add_global_constant("bytes-convert", scheme_make_prim_w_arity2(byte_string_convert, @@ -542,14 +542,14 @@ scheme_init_string (Scheme_Env *env) 2, 2), env); scheme_add_global_constant("bytes-open-converter", - scheme_make_prim_w_arity(byte_string_open_converter, - "bytes-open-converter", - 2, 2), + scheme_make_noncm_prim(byte_string_open_converter, + "bytes-open-converter", + 2, 2), env); scheme_add_global_constant("bytes-close-converter", - scheme_make_prim_w_arity(byte_string_close_converter, - "bytes-close-converter", - 1, 1), + scheme_make_noncm_prim(byte_string_close_converter, + "bytes-close-converter", + 1, 1), env); scheme_add_global_constant("format", @@ -558,14 +558,14 @@ scheme_init_string (Scheme_Env *env) 1, -1, 1), env); scheme_add_global_constant("printf", - scheme_make_prim_w_arity(sch_printf, - "printf", - 1, -1), + scheme_make_noncm_prim(sch_printf, + "printf", + 1, -1), env); scheme_add_global_constant("fprintf", - scheme_make_prim_w_arity(sch_fprintf, - "fprintf", - 2, -1), + scheme_make_noncm_prim(sch_fprintf, + "fprintf", + 2, -1), env); scheme_add_global_constant("byte?", @@ -580,14 +580,14 @@ scheme_init_string (Scheme_Env *env) 1, 1, 1), env); scheme_add_global_constant("make-bytes", - scheme_make_prim_w_arity(make_byte_string, - "make-bytes", - 1, 2), + scheme_make_noncm_prim(make_byte_string, + "make-bytes", + 1, 2), env); scheme_add_global_constant("bytes", - scheme_make_prim_w_arity(byte_string, - "bytes", - 0, -1), + scheme_make_noncm_prim(byte_string, + "bytes", + 0, -1), env); scheme_add_global_constant("bytes-length", scheme_make_folding_prim(byte_string_length, @@ -595,124 +595,124 @@ scheme_init_string (Scheme_Env *env) 1, 1, 1), env); scheme_add_global_constant("bytes-ref", - scheme_make_prim_w_arity(byte_string_ref, - "bytes-ref", - 2, 2), + scheme_make_noncm_prim(byte_string_ref, + "bytes-ref", + 2, 2), env); scheme_add_global_constant("bytes-set!", - scheme_make_prim_w_arity(byte_string_set, - "bytes-set!", - 3, 3), + scheme_make_noncm_prim(byte_string_set, + "bytes-set!", + 3, 3), env); scheme_add_global_constant("bytes=?", - scheme_make_prim_w_arity(byte_string_eq, - "bytes=?", - 2, -1), + scheme_make_noncm_prim(byte_string_eq, + "bytes=?", + 2, -1), env); scheme_add_global_constant("bytes?", - scheme_make_prim_w_arity(byte_string_gt, - "bytes>?", - 2, -1), + scheme_make_noncm_prim(byte_string_gt, + "bytes>?", + 2, -1), env); scheme_add_global_constant("subbytes", - scheme_make_prim_w_arity(byte_substring, - "subbytes", - 2, 3), + scheme_make_noncm_prim(byte_substring, + "subbytes", + 2, 3), env); scheme_add_global_constant("bytes-append", - scheme_make_prim_w_arity(byte_string_append, - "bytes-append", - 0, -1), + scheme_make_noncm_prim(byte_string_append, + "bytes-append", + 0, -1), env); scheme_add_global_constant("bytes->list", - scheme_make_prim_w_arity(byte_string_to_list, - "bytes->list", - 1, 1), + scheme_make_noncm_prim(byte_string_to_list, + "bytes->list", + 1, 1), env); scheme_add_global_constant("list->bytes", - scheme_make_prim_w_arity(list_to_byte_string, - "list->bytes", - 1, 1), + scheme_make_noncm_prim(list_to_byte_string, + "list->bytes", + 1, 1), env); scheme_add_global_constant("bytes-copy", - scheme_make_prim_w_arity(byte_string_copy, - "bytes-copy", - 1, 1), + scheme_make_noncm_prim(byte_string_copy, + "bytes-copy", + 1, 1), env); scheme_add_global_constant("bytes-copy!", - scheme_make_prim_w_arity(byte_string_copy_bang, - "bytes-copy!", - 3, 5), + scheme_make_noncm_prim(byte_string_copy_bang, + "bytes-copy!", + 3, 5), env); scheme_add_global_constant("bytes-fill!", - scheme_make_prim_w_arity(byte_string_fill, - "bytes-fill!", - 2, 2), + scheme_make_noncm_prim(byte_string_fill, + "bytes-fill!", + 2, 2), env); scheme_add_global_constant("bytes->immutable-bytes", - scheme_make_prim_w_arity(byte_string_to_immutable, - "bytes->immutable-bytes", - 1, 1), + scheme_make_noncm_prim(byte_string_to_immutable, + "bytes->immutable-bytes", + 1, 1), env); scheme_add_global_constant("bytes-utf-8-index", - scheme_make_prim_w_arity(byte_string_utf8_index, - "bytes-utf-8-index", - 2, 4), + scheme_make_noncm_prim(byte_string_utf8_index, + "bytes-utf-8-index", + 2, 4), env); scheme_add_global_constant("bytes-utf-8-length", - scheme_make_prim_w_arity(byte_string_utf8_length, - "bytes-utf-8-length", - 1, 4), + scheme_make_noncm_prim(byte_string_utf8_length, + "bytes-utf-8-length", + 1, 4), env); scheme_add_global_constant("bytes-utf-8-ref", - scheme_make_prim_w_arity(byte_string_utf8_ref, - "bytes-utf-8-ref", - 2, 4), + scheme_make_noncm_prim(byte_string_utf8_ref, + "bytes-utf-8-ref", + 2, 4), env); scheme_add_global_constant("bytes->string/utf-8", - scheme_make_prim_w_arity(byte_string_to_char_string, - "bytes->string/utf-8", - 1, 4), + scheme_make_noncm_prim(byte_string_to_char_string, + "bytes->string/utf-8", + 1, 4), env); scheme_add_global_constant("bytes->string/locale", - scheme_make_prim_w_arity(byte_string_to_char_string_locale, - "bytes->string/locale", - 1, 4), + scheme_make_noncm_prim(byte_string_to_char_string_locale, + "bytes->string/locale", + 1, 4), env); scheme_add_global_constant("bytes->string/latin-1", - scheme_make_prim_w_arity(byte_string_to_char_string_latin1, - "bytes->string/latin-1", - 1, 4), + scheme_make_noncm_prim(byte_string_to_char_string_latin1, + "bytes->string/latin-1", + 1, 4), env); scheme_add_global_constant("string->bytes/utf-8", - scheme_make_prim_w_arity(char_string_to_byte_string, - "string->bytes/utf-8", - 1, 4), + scheme_make_noncm_prim(char_string_to_byte_string, + "string->bytes/utf-8", + 1, 4), env); scheme_add_global_constant("string->bytes/locale", - scheme_make_prim_w_arity(char_string_to_byte_string_locale, - "string->bytes/locale", - 1, 4), + scheme_make_noncm_prim(char_string_to_byte_string_locale, + "string->bytes/locale", + 1, 4), env); scheme_add_global_constant("string->bytes/latin-1", - scheme_make_prim_w_arity(char_string_to_byte_string_latin1, - "string->bytes/latin-1", - 1, 4), + scheme_make_noncm_prim(char_string_to_byte_string_latin1, + "string->bytes/latin-1", + 1, 4), env); scheme_add_global_constant("string-utf-8-length", - scheme_make_prim_w_arity(char_string_utf8_length, - "string-utf-8-length", - 1, 3), + scheme_make_noncm_prim(char_string_utf8_length, + "string-utf-8-length", + 1, 3), env); @@ -720,38 +720,38 @@ scheme_init_string (Scheme_Env *env) more problems than it solves... */ scheme_add_global_constant("version", - scheme_make_prim_w_arity(version, - "version", - 0, 0), + scheme_make_noncm_prim(version, + "version", + 0, 0), env); scheme_add_global_constant("banner", - scheme_make_prim_w_arity(banner, - "banner", - 0, 0), + scheme_make_noncm_prim(banner, + "banner", + 0, 0), env); scheme_add_global_constant("getenv", - scheme_make_prim_w_arity(sch_getenv, - "getenv", - 1, 1), + scheme_make_noncm_prim(sch_getenv, + "getenv", + 1, 1), env); scheme_add_global_constant("putenv", - scheme_make_prim_w_arity(sch_putenv, - "putenv", - 2, 2), + scheme_make_noncm_prim(sch_putenv, + "putenv", + 2, 2), env); /* Don't make these folding, since they're platform-specific: */ scheme_add_global_constant("system-type", - scheme_make_prim_w_arity(system_type, - "system-type", - 0, 1), + scheme_make_noncm_prim(system_type, + "system-type", + 0, 1), env); scheme_add_global_constant("system-library-subpath", - scheme_make_prim_w_arity(system_library_subpath, - "system-library-subpath", - 0, 1), + scheme_make_noncm_prim(system_library_subpath, + "system-library-subpath", + 0, 1), env); scheme_add_global_constant("current-command-line-arguments", @@ -765,45 +765,6 @@ scheme_init_string (Scheme_Env *env) #endif } -void -scheme_init_getenv(void) -{ -#ifndef GETENV_FUNCTION - FILE *f = fopen("Environment", "r"); - if (f) { - Scheme_Object *p = scheme_make_file_input_port(f); - mz_jmp_buf *savebuf, newbuf; - savebuf = scheme_current_thread->error_buf; - scheme_current_thread->error_buf = &newbuf; - if (!scheme_setjmp(newbuf)) { - while (1) { - Scheme_Object *v = scheme_read(p); - if (SCHEME_EOFP(v)) - break; - - if (SCHEME_PAIRP(v) && SCHEME_PAIRP(SCHEME_CDR(v)) - && SCHEME_NULLP(SCHEME_CDR(SCHEME_CDR(v)))) { - Scheme_Object *key = SCHEME_CAR(v); - Scheme_Object *val = SCHEME_CADR(v); - if (SCHEME_STRINGP(key) && SCHEME_STRINGP(val)) { - Scheme_Object *a[2]; - a[0] = key; - a[1] = val; - sch_putenv(2, a); - v = NULL; - } - } - - if (v) - scheme_signal_error("bad environment specification: %V", v); - } - } - scheme_current_thread->error_buf = savebuf; - scheme_close_input_port(p); - } -#endif -} - /**********************************************************************/ /* UTF-8 char constructors */ /**********************************************************************/ @@ -1940,6 +1901,53 @@ static int mzPUTENV(char *var, char *val, char *together) # define mzPUTENV(var, val, s) MSC_IZE(putenv)(s) #endif +void +scheme_init_getenv(void) +{ +#ifndef GETENV_FUNCTION + FILE *f = fopen("Environment", "r"); + if (f) { + Scheme_Object *p = scheme_make_file_input_port(f); + mz_jmp_buf *savebuf, newbuf; + savebuf = scheme_current_thread->error_buf; + scheme_current_thread->error_buf = &newbuf; + if (!scheme_setjmp(newbuf)) { + while (1) { + Scheme_Object *v = scheme_read(p); + if (SCHEME_EOFP(v)) + break; + + if (SCHEME_PAIRP(v) && SCHEME_PAIRP(SCHEME_CDR(v)) + && SCHEME_NULLP(SCHEME_CDR(SCHEME_CDR(v)))) { + Scheme_Object *key = SCHEME_CAR(v); + Scheme_Object *val = SCHEME_CADR(v); + if (SCHEME_STRINGP(key) && SCHEME_STRINGP(val)) { + Scheme_Object *a[2]; + a[0] = key; + a[1] = val; + sch_putenv(2, a); + v = NULL; + } + } + + if (v) + scheme_signal_error("bad environment specification: %V", v); + } + } + scheme_current_thread->error_buf = savebuf; + scheme_close_input_port(p); + + if (scheme_hash_get(putenv_str_table, (Scheme_Object *)"PLTNOMZJIT")) { + scheme_set_startup_use_jit(0); + } + } +#else + if (mzGETENV("PLTNOMZJIT")) { + scheme_set_startup_use_jit(0); + } +#endif +} + static Scheme_Object *sch_getenv(int argc, Scheme_Object *argv[]) { char *s; diff --git a/src/mzscheme/src/stxobj.c b/src/mzscheme/src/stxobj.c index a50b4b5179..c66117486a 100644 --- a/src/mzscheme/src/stxobj.c +++ b/src/mzscheme/src/stxobj.c @@ -364,78 +364,78 @@ void scheme_init_stx(Scheme_Env *env) env); scheme_add_global_constant("syntax-original?", - scheme_make_prim_w_arity(syntax_original_p, - "syntax-original?", - 1, 1), + scheme_make_noncm_prim(syntax_original_p, + "syntax-original?", + 1, 1), env); scheme_add_global_constant("syntax-property", - scheme_make_prim_w_arity(syntax_property, - "syntax-property", - 2, 3), + scheme_make_noncm_prim(syntax_property, + "syntax-property", + 2, 3), env); scheme_add_global_constant("syntax-property-symbol-keys", - scheme_make_prim_w_arity(syntax_property_keys, - "syntax-property-symbol-keys", - 1, 1), + scheme_make_noncm_prim(syntax_property_keys, + "syntax-property-symbol-keys", + 1, 1), env); scheme_add_global_constant("syntax-track-origin", - scheme_make_prim_w_arity(syntax_track_origin, - "syntax-track-origin", - 3, 3), + scheme_make_noncm_prim(syntax_track_origin, + "syntax-track-origin", + 3, 3), env); scheme_add_global_constant("bound-identifier=?", - scheme_make_prim_w_arity(bound_eq, - "bound-identifier=?", - 2, 2), + scheme_make_noncm_prim(bound_eq, + "bound-identifier=?", + 2, 2), env); scheme_add_global_constant("free-identifier=?", - scheme_make_prim_w_arity(free_eq, - "free-identifier=?", - 2, 2), + scheme_make_noncm_prim(free_eq, + "free-identifier=?", + 2, 2), env); scheme_add_global_constant("module-identifier=?", - scheme_make_prim_w_arity(module_eq, - "module-identifier=?", - 2, 2), + scheme_make_noncm_prim(module_eq, + "module-identifier=?", + 2, 2), env); scheme_add_global_constant("module-transformer-identifier=?", - scheme_make_prim_w_arity(module_trans_eq, - "module-transformer-identifier=?", - 2, 2), + scheme_make_noncm_prim(module_trans_eq, + "module-transformer-identifier=?", + 2, 2), env); scheme_add_global_constant("module-template-identifier=?", - scheme_make_prim_w_arity(module_templ_eq, - "module-template-identifier=?", - 2, 2), + scheme_make_noncm_prim(module_templ_eq, + "module-template-identifier=?", + 2, 2), env); scheme_add_global_constant("identifier-binding", - scheme_make_prim_w_arity(module_binding, - "identifier-binding", - 1, 1), + scheme_make_noncm_prim(module_binding, + "identifier-binding", + 1, 1), env); scheme_add_global_constant("identifier-transformer-binding", - scheme_make_prim_w_arity(module_trans_binding, - "identifier-transformer-binding", - 1, 1), + scheme_make_noncm_prim(module_trans_binding, + "identifier-transformer-binding", + 1, 1), env); scheme_add_global_constant("identifier-template-binding", - scheme_make_prim_w_arity(module_templ_binding, - "identifier-template-binding", - 1, 1), + scheme_make_noncm_prim(module_templ_binding, + "identifier-template-binding", + 1, 1), env); scheme_add_global_constant("identifier-binding-export-position", - scheme_make_prim_w_arity(module_binding_pos, - "identifier-binding-export-position", - 1, 1), + scheme_make_noncm_prim(module_binding_pos, + "identifier-binding-export-position", + 1, 1), env); scheme_add_global_constant("identifier-transformer-binding-export-position", - scheme_make_prim_w_arity(module_trans_binding_pos, - "identifier-transformer-binding-export-position", - 1, 1), + scheme_make_noncm_prim(module_trans_binding_pos, + "identifier-transformer-binding-export-position", + 1, 1), env); scheme_add_global_constant("syntax-source-module", @@ -445,9 +445,9 @@ void scheme_init_stx(Scheme_Env *env) env); scheme_add_global_constant("syntax-recertify", - scheme_make_prim_w_arity(syntax_recertify, - "syntax-recertify", - 4, 4), + scheme_make_noncm_prim(syntax_recertify, + "syntax-recertify", + 4, 4), env); REGISTER_SO(barrier_symbol); diff --git a/src/mzscheme/src/stypes.h b/src/mzscheme/src/stypes.h index 4aef7024ae..1efaa643b5 100644 --- a/src/mzscheme/src/stypes.h +++ b/src/mzscheme/src/stypes.h @@ -44,170 +44,171 @@ enum { scheme_cont_type, /* 30 */ scheme_escaping_cont_type, /* 31 */ scheme_proc_struct_type, /* 32 */ + scheme_native_closure_type, /* 33 */ /* structure types (overlaps with procs) */ - scheme_structure_type, /* 33 */ + scheme_structure_type, /* 34 */ /* basic types */ - scheme_char_type, /* 34 */ - scheme_integer_type, /* 35 */ - scheme_bignum_type, /* 36 */ - scheme_rational_type, /* 37 */ - scheme_float_type, /* 38 */ - scheme_double_type, /* 39 */ - scheme_complex_izi_type, /* 40 */ - scheme_complex_type, /* 41 */ - scheme_char_string_type, /* 42 */ - scheme_byte_string_type, /* 43 */ - scheme_path_type, /* 44 */ - scheme_symbol_type, /* 45 */ - scheme_keyword_type, /* 46 */ - scheme_null_type, /* 47 */ - scheme_pair_type, /* 48 */ - scheme_vector_type, /* 49 */ - scheme_inspector_type, /* 50 */ - scheme_input_port_type, /* 51 */ - scheme_output_port_type, /* 52 */ - scheme_eof_type, /* 53 */ - scheme_true_type, /* 54 */ - scheme_false_type, /* 55 */ - scheme_void_type, /* 56 */ - scheme_syntax_compiler_type, /* 57 */ - scheme_macro_type, /* 58 */ - scheme_box_type, /* 59 */ - scheme_thread_type, /* 60 */ - scheme_stx_offset_type, /* 61 */ - scheme_cont_mark_set_type, /* 62 */ - scheme_sema_type, /* 63 */ - scheme_hash_table_type, /* 64 */ - scheme_cpointer_type, /* 65 */ - scheme_weak_box_type, /* 66 */ - scheme_ephemeron_type, /* 67 */ - scheme_struct_type_type, /* 68 */ - scheme_module_index_type, /* 69 */ - scheme_set_macro_type, /* 70 */ - scheme_listener_type, /* 71 */ - scheme_namespace_type, /* 72 */ - scheme_config_type, /* 73 */ - scheme_stx_type, /* 74 */ - scheme_will_executor_type, /* 75 */ - scheme_custodian_type, /* 76 */ - scheme_random_state_type, /* 77 */ - scheme_regexp_type, /* 78 */ - scheme_bucket_type, /* 79 */ - scheme_bucket_table_type, /* 80 */ - scheme_subprocess_type, /* 81 */ - scheme_compilation_top_type, /* 82 */ - scheme_wrap_chunk_type, /* 83 */ - scheme_eval_waiting_type, /* 84 */ - scheme_tail_call_waiting_type, /* 85 */ - scheme_undefined_type, /* 86 */ - scheme_struct_property_type, /* 87 */ - scheme_multiple_values_type, /* 88 */ - scheme_placeholder_type, /* 89 */ - scheme_case_lambda_sequence_type, /* 90 */ - scheme_begin0_sequence_type, /* 91 */ - scheme_rename_table_type, /* 92 */ - scheme_module_type, /* 93 */ - scheme_svector_type, /* 94 */ - scheme_lazy_macro_type, /* 95 */ - scheme_resolve_prefix_type, /* 96 */ - scheme_security_guard_type, /* 97 */ - scheme_indent_type, /* 98 */ - scheme_udp_type, /* 99 */ - scheme_udp_evt_type, /* 100 */ - scheme_tcp_accept_evt_type, /* 101 */ - scheme_id_macro_type, /* 102 */ - scheme_evt_set_type, /* 103 */ - scheme_wrap_evt_type, /* 104 */ - scheme_handle_evt_type, /* 105 */ - scheme_nack_guard_evt_type, /* 106 */ - scheme_semaphore_repost_type, /* 107 */ - scheme_channel_type, /* 108 */ - scheme_channel_put_type, /* 109 */ - scheme_thread_resume_type, /* 110 */ - scheme_thread_suspend_type, /* 111 */ - scheme_thread_dead_type, /* 112 */ - scheme_poll_evt_type, /* 113 */ - scheme_nack_evt_type, /* 114 */ - scheme_module_registry_type, /* 115 */ - scheme_thread_set_type, /* 116 */ - scheme_string_converter_type, /* 117 */ - scheme_alarm_type, /* 118 */ - scheme_thread_cell_type, /* 119 */ - scheme_channel_syncer_type, /* 120 */ - scheme_special_comment_type, /* 121 */ - scheme_write_evt_type, /* 122 */ - scheme_always_evt_type, /* 123 */ - scheme_never_evt_type, /* 124 */ - scheme_progress_evt_type, /* 125 */ - scheme_certifications_type, /* 126 */ - scheme_already_comp_type, /* 127 */ - scheme_readtable_type, /* 128 */ - scheme_intdef_context_type, /* 129 */ - scheme_lexical_rib_type, /* 130 */ - scheme_thread_cell_values_type, /* 131 */ - scheme_global_ref_type, /* 132 */ - scheme_cont_mark_chain_type, /* 133 */ + scheme_char_type, /* 35 */ + scheme_integer_type, /* 36 */ + scheme_bignum_type, /* 37 */ + scheme_rational_type, /* 38 */ + scheme_float_type, /* 39 */ + scheme_double_type, /* 40 */ + scheme_complex_izi_type, /* 41 */ + scheme_complex_type, /* 42 */ + scheme_char_string_type, /* 43 */ + scheme_byte_string_type, /* 44 */ + scheme_path_type, /* 45 */ + scheme_symbol_type, /* 46 */ + scheme_keyword_type, /* 47 */ + scheme_null_type, /* 48 */ + scheme_pair_type, /* 49 */ + scheme_vector_type, /* 50 */ + scheme_inspector_type, /* 51 */ + scheme_input_port_type, /* 52 */ + scheme_output_port_type, /* 53 */ + scheme_eof_type, /* 54 */ + scheme_true_type, /* 55 */ + scheme_false_type, /* 56 */ + scheme_void_type, /* 57 */ + scheme_syntax_compiler_type, /* 58 */ + scheme_macro_type, /* 59 */ + scheme_box_type, /* 60 */ + scheme_thread_type, /* 61 */ + scheme_stx_offset_type, /* 62 */ + scheme_cont_mark_set_type, /* 63 */ + scheme_sema_type, /* 64 */ + scheme_hash_table_type, /* 65 */ + scheme_cpointer_type, /* 66 */ + scheme_weak_box_type, /* 67 */ + scheme_ephemeron_type, /* 68 */ + scheme_struct_type_type, /* 69 */ + scheme_module_index_type, /* 70 */ + scheme_set_macro_type, /* 71 */ + scheme_listener_type, /* 72 */ + scheme_namespace_type, /* 73 */ + scheme_config_type, /* 74 */ + scheme_stx_type, /* 75 */ + scheme_will_executor_type, /* 76 */ + scheme_custodian_type, /* 77 */ + scheme_random_state_type, /* 78 */ + scheme_regexp_type, /* 79 */ + scheme_bucket_type, /* 80 */ + scheme_bucket_table_type, /* 81 */ + scheme_subprocess_type, /* 82 */ + scheme_compilation_top_type, /* 83 */ + scheme_wrap_chunk_type, /* 84 */ + scheme_eval_waiting_type, /* 85 */ + scheme_tail_call_waiting_type, /* 86 */ + scheme_undefined_type, /* 87 */ + scheme_struct_property_type, /* 88 */ + scheme_multiple_values_type, /* 89 */ + scheme_placeholder_type, /* 90 */ + scheme_case_lambda_sequence_type, /* 91 */ + scheme_begin0_sequence_type, /* 92 */ + scheme_rename_table_type, /* 93 */ + scheme_module_type, /* 94 */ + scheme_svector_type, /* 95 */ + scheme_lazy_macro_type, /* 96 */ + scheme_resolve_prefix_type, /* 97 */ + scheme_security_guard_type, /* 98 */ + scheme_indent_type, /* 99 */ + scheme_udp_type, /* 100 */ + scheme_udp_evt_type, /* 101 */ + scheme_tcp_accept_evt_type, /* 102 */ + scheme_id_macro_type, /* 103 */ + scheme_evt_set_type, /* 104 */ + scheme_wrap_evt_type, /* 105 */ + scheme_handle_evt_type, /* 106 */ + scheme_nack_guard_evt_type, /* 107 */ + scheme_semaphore_repost_type, /* 108 */ + scheme_channel_type, /* 109 */ + scheme_channel_put_type, /* 110 */ + scheme_thread_resume_type, /* 111 */ + scheme_thread_suspend_type, /* 112 */ + scheme_thread_dead_type, /* 113 */ + scheme_poll_evt_type, /* 114 */ + scheme_nack_evt_type, /* 115 */ + scheme_module_registry_type, /* 116 */ + scheme_thread_set_type, /* 117 */ + scheme_string_converter_type, /* 118 */ + scheme_alarm_type, /* 119 */ + scheme_thread_cell_type, /* 120 */ + scheme_channel_syncer_type, /* 121 */ + scheme_special_comment_type, /* 122 */ + scheme_write_evt_type, /* 123 */ + scheme_always_evt_type, /* 124 */ + scheme_never_evt_type, /* 125 */ + scheme_progress_evt_type, /* 126 */ + scheme_certifications_type, /* 127 */ + scheme_already_comp_type, /* 128 */ + scheme_readtable_type, /* 129 */ + scheme_intdef_context_type, /* 130 */ + scheme_lexical_rib_type, /* 131 */ + scheme_thread_cell_values_type, /* 132 */ + scheme_global_ref_type, /* 133 */ + scheme_cont_mark_chain_type, /* 134 */ #ifdef MZTAG_REQUIRED - _scheme_last_normal_type_, /* 134 */ + _scheme_last_normal_type_, /* 135 */ - scheme_rt_comp_env, /* 135 */ - scheme_rt_constant_binding, /* 136 */ - scheme_rt_resolve_info, /* 137 */ - scheme_rt_compile_info, /* 138 */ - scheme_rt_cont_mark, /* 139 */ - scheme_rt_saved_stack, /* 140 */ - scheme_rt_reply_item, /* 141 */ - scheme_rt_closure_info, /* 142 */ - scheme_rt_overflow, /* 143 */ - scheme_rt_dyn_wind_cell, /* 144 */ - scheme_rt_dyn_wind_info, /* 145 */ - scheme_rt_dyn_wind, /* 146 */ - scheme_rt_dup_check, /* 147 */ - scheme_rt_thread_memory, /* 148 */ - scheme_rt_input_file, /* 149 */ - scheme_rt_input_fd, /* 150 */ - scheme_rt_oskit_console_input, /* 151 */ - scheme_rt_tested_input_file, /* 152 */ - scheme_rt_tested_output_file, /* 153 */ - scheme_rt_indexed_string, /* 154 */ - scheme_rt_output_file, /* 155 */ - scheme_rt_load_handler_data, /* 156 */ - scheme_rt_pipe, /* 157 */ - scheme_rt_beos_process, /* 158 */ - scheme_rt_system_child, /* 159 */ - scheme_rt_tcp, /* 160 */ - scheme_rt_write_data, /* 161 */ - scheme_rt_tcp_select_info, /* 162 */ - scheme_rt_namespace_option, /* 163 */ - scheme_rt_param_data, /* 164 */ - scheme_rt_will, /* 165 */ - scheme_rt_will_registration, /* 166 */ - scheme_rt_struct_proc_info, /* 167 */ - scheme_rt_linker_name, /* 168 */ - scheme_rt_param_map, /* 169 */ - scheme_rt_finalization, /* 170 */ - scheme_rt_finalizations, /* 171 */ - scheme_rt_cpp_object, /* 172 */ - scheme_rt_cpp_array_object, /* 173 */ - scheme_rt_stack_object, /* 174 */ - scheme_rt_preallocated_object, /* 175 */ - scheme_thread_hop_type, /* 176 */ - scheme_rt_srcloc, /* 177 */ - scheme_rt_evt, /* 178 */ - scheme_rt_syncing, /* 179 */ - scheme_rt_comp_prefix, /* 180 */ - scheme_rt_user_input, /* 181 */ - scheme_rt_user_output, /* 182 */ - scheme_rt_compact_port, /* 183 */ - scheme_rt_read_special_dw, /* 184 */ - scheme_rt_regwork, /* 185 */ - scheme_rt_buf_holder, /* 186 */ - scheme_rt_parameterization, /* 187 */ - scheme_rt_print_params, /* 188 */ - scheme_rt_read_params, /* 189 */ + scheme_rt_comp_env, /* 136 */ + scheme_rt_constant_binding, /* 137 */ + scheme_rt_resolve_info, /* 138 */ + scheme_rt_compile_info, /* 139 */ + scheme_rt_cont_mark, /* 140 */ + scheme_rt_saved_stack, /* 141 */ + scheme_rt_reply_item, /* 142 */ + scheme_rt_closure_info, /* 143 */ + scheme_rt_overflow, /* 144 */ + scheme_rt_dyn_wind_cell, /* 145 */ + scheme_rt_dyn_wind_info, /* 146 */ + scheme_rt_dyn_wind, /* 147 */ + scheme_rt_dup_check, /* 148 */ + scheme_rt_thread_memory, /* 149 */ + scheme_rt_input_file, /* 150 */ + scheme_rt_input_fd, /* 151 */ + scheme_rt_oskit_console_input, /* 152 */ + scheme_rt_tested_input_file, /* 153 */ + scheme_rt_tested_output_file, /* 154 */ + scheme_rt_indexed_string, /* 155 */ + scheme_rt_output_file, /* 156 */ + scheme_rt_load_handler_data, /* 157 */ + scheme_rt_pipe, /* 158 */ + scheme_rt_beos_process, /* 159 */ + scheme_rt_system_child, /* 160 */ + scheme_rt_tcp, /* 161 */ + scheme_rt_write_data, /* 162 */ + scheme_rt_tcp_select_info, /* 163 */ + scheme_rt_namespace_option, /* 164 */ + scheme_rt_param_data, /* 165 */ + scheme_rt_will, /* 166 */ + scheme_rt_will_registration, /* 167 */ + scheme_rt_struct_proc_info, /* 168 */ + scheme_rt_linker_name, /* 169 */ + scheme_rt_param_map, /* 170 */ + scheme_rt_finalization, /* 171 */ + scheme_rt_finalizations, /* 172 */ + scheme_rt_cpp_object, /* 173 */ + scheme_rt_cpp_array_object, /* 174 */ + scheme_rt_stack_object, /* 175 */ + scheme_rt_preallocated_object, /* 176 */ + scheme_thread_hop_type, /* 177 */ + scheme_rt_srcloc, /* 178 */ + scheme_rt_evt, /* 179 */ + scheme_rt_syncing, /* 180 */ + scheme_rt_comp_prefix, /* 181 */ + scheme_rt_user_input, /* 182 */ + scheme_rt_user_output, /* 183 */ + scheme_rt_compact_port, /* 184 */ + scheme_rt_read_special_dw, /* 185 */ + scheme_rt_regwork, /* 186 */ + scheme_rt_buf_holder, /* 187 */ + scheme_rt_parameterization, /* 188 */ + scheme_rt_print_params, /* 189 */ + scheme_rt_read_params, /* 190 */ #endif _scheme_last_type_ diff --git a/src/mzscheme/src/symbol.c b/src/mzscheme/src/symbol.c index ea1ce91259..1006c1fbd2 100644 --- a/src/mzscheme/src/symbol.c +++ b/src/mzscheme/src/symbol.c @@ -225,6 +225,9 @@ static void clean_symbol_table(void) clean_one_symbol_table(scheme_keyword_table); clean_one_symbol_table(scheme_parallel_symbol_table); scheme_clear_ephemerons(); +# ifdef MZ_USE_JIT + scheme_clean_native_symtab(); +# endif } #endif @@ -283,18 +286,18 @@ scheme_init_symbol (Scheme_Env *env) 1, 1, 1), env); scheme_add_global_constant("string->symbol", - scheme_make_prim_w_arity(string_to_symbol_prim, - "string->symbol", - 1, 1), env); + scheme_make_noncm_prim(string_to_symbol_prim, + "string->symbol", + 1, 1), env); scheme_add_global_constant("string->uninterned-symbol", - scheme_make_prim_w_arity(string_to_uninterned_symbol_prim, - "string->uninterned-symbol", - 1, 1), + scheme_make_noncm_prim(string_to_uninterned_symbol_prim, + "string->uninterned-symbol", + 1, 1), env); scheme_add_global_constant("symbol->string", - scheme_make_prim_w_arity(symbol_to_string_prim, - "symbol->string", - 1, 1), + scheme_make_noncm_prim(symbol_to_string_prim, + "symbol->string", + 1, 1), env); scheme_add_global_constant("keyword?", @@ -303,19 +306,19 @@ scheme_init_symbol (Scheme_Env *env) 1, 1, 1), env); scheme_add_global_constant("string->keyword", - scheme_make_prim_w_arity(string_to_keyword_prim, - "string->keyword", - 1, 1), env); + scheme_make_noncm_prim(string_to_keyword_prim, + "string->keyword", + 1, 1), env); scheme_add_global_constant("keyword->string", - scheme_make_prim_w_arity(keyword_to_string_prim, - "keyword->string", - 1, 1), + scheme_make_noncm_prim(keyword_to_string_prim, + "keyword->string", + 1, 1), env); scheme_add_global_constant("gensym", - scheme_make_prim_w_arity(gensym, - "gensym", - 0, 1), + scheme_make_noncm_prim(gensym, + "gensym", + 0, 1), env); } diff --git a/src/mzscheme/src/syntax.c b/src/mzscheme/src/syntax.c index e27e422dce..0854f91c7d 100644 --- a/src/mzscheme/src/syntax.c +++ b/src/mzscheme/src/syntax.c @@ -42,6 +42,7 @@ Scheme_Object scheme_undefined[1]; Scheme_Syntax_Resolver scheme_syntax_resolvers[_COUNT_EXPD_]; Scheme_Syntax_Validater scheme_syntax_validaters[_COUNT_EXPD_]; Scheme_Syntax_Executer scheme_syntax_executers[_COUNT_EXPD_]; +Scheme_Syntax_Jitter scheme_syntax_jitters[_COUNT_EXPD_]; int scheme_syntax_protect_afters[_COUNT_EXPD_]; /* locals */ @@ -132,6 +133,16 @@ static void bangboxenv_validate(Scheme_Object *data, Mz_CPort *port, char *stack static void bangboxvalue_validate(Scheme_Object *data, Mz_CPort *port, char *stack, int depth, int letlimit, int delta, int num_toplevels, int num_stxes); +static Scheme_Object *define_values_jit(Scheme_Object *data); +static Scheme_Object *ref_jit(Scheme_Object *data); +static Scheme_Object *set_jit(Scheme_Object *data); +static Scheme_Object *define_syntaxes_jit(Scheme_Object *expr); +static Scheme_Object *define_for_syntaxes_jit(Scheme_Object *expr); +static Scheme_Object *case_lambda_jit(Scheme_Object *expr); +static Scheme_Object *begin0_jit(Scheme_Object *data); +static Scheme_Object *quote_syntax_jit(Scheme_Object *data); +static Scheme_Object *bangboxvalue_jit(Scheme_Object *data); + static Scheme_Object *named_let_syntax (Scheme_Object *form, Scheme_Comp_Env *env, Scheme_Compile_Expand_Info *rec, int drec); @@ -215,35 +226,35 @@ scheme_init_syntax (Scheme_Env *env) scheme_register_syntax(DEFINE_VALUES_EXPD, define_values_resolve, define_values_validate, - define_values_execute, 1); + define_values_execute, define_values_jit, 1); scheme_register_syntax(SET_EXPD, set_resolve, set_validate, - set_execute, 2); + set_execute, set_jit, 2); scheme_register_syntax(REF_EXPD, ref_resolve, ref_validate, - ref_execute, 0); + ref_execute, ref_jit, 0); scheme_register_syntax(DEFINE_SYNTAX_EXPD, define_syntaxes_resolve, define_syntaxes_validate, - define_syntaxes_execute, 4); + define_syntaxes_execute, define_syntaxes_jit, 4); scheme_register_syntax(DEFINE_FOR_SYNTAX_EXPD, define_for_syntaxes_resolve, define_for_syntaxes_validate, - define_for_syntaxes_execute, 4); + define_for_syntaxes_execute, define_for_syntaxes_jit, 4); scheme_register_syntax(CASE_LAMBDA_EXPD, case_lambda_resolve, case_lambda_validate, - case_lambda_execute, -1); + case_lambda_execute, case_lambda_jit, -1); scheme_register_syntax(BEGIN0_EXPD, begin0_resolve, begin0_validate, - begin0_execute, -1); + begin0_execute, begin0_jit, -1); scheme_register_syntax(QUOTE_SYNTAX_EXPD, NULL, quote_syntax_validate, - quote_syntax_execute, 2); + quote_syntax_execute, quote_syntax_jit, 2); scheme_register_syntax(BOXENV_EXPD, NULL, bangboxenv_validate, - bangboxenv_execute, 1); + bangboxenv_execute, NULL, 1); scheme_register_syntax(BOXVAL_EXPD, NULL, bangboxvalue_validate, - bangboxvalue_execute, 2); + bangboxvalue_execute, bangboxvalue_jit, 2); scheme_install_type_writer(scheme_let_value_type, write_let_value); scheme_install_type_reader(scheme_let_value_type, read_let_value); @@ -722,6 +733,16 @@ define_values_execute(Scheme_Object *data) return define_execute(SCHEME_CAR(data), SCHEME_CDR(data), 0, NULL, NULL); } +static Scheme_Object *define_values_jit(Scheme_Object *data) +{ + Scheme_Object *orig = SCHEME_CDR(data), *naya; + naya = scheme_jit_expr(orig); + if (SAME_OBJ(naya, orig)) + return data; + else + return scheme_make_pair(SCHEME_CAR(data), naya); +} + static void define_values_validate(Scheme_Object *data, Mz_CPort *port, char *stack, int depth, int letlimit, int delta, int num_toplevels, int num_stxes) { @@ -1161,6 +1182,23 @@ set_execute (Scheme_Object *data) return scheme_void; } +static Scheme_Object *set_jit(Scheme_Object *data) +{ + Scheme_Object *orig_val, *naya_val; + + orig_val = SCHEME_CDR(data); + orig_val = SCHEME_CDR(orig_val); + + naya_val = scheme_jit_expr(orig_val); + + if (SAME_OBJ(naya_val, orig_val)) + return data; + else + return scheme_make_pair(SCHEME_CAR(data), + scheme_make_pair(SCHEME_CADR(data), + naya_val)); +} + static void set_validate(Scheme_Object *data, Mz_CPort *port, char *stack, int depth, int letlimit, int delta, int num_toplevels, int num_stxes) { @@ -1400,6 +1438,11 @@ ref_execute (Scheme_Object *tl) return o; } +static Scheme_Object *ref_jit(Scheme_Object *data) +{ + return data; +} + static void ref_validate(Scheme_Object *tl, Mz_CPort *port, char *stack, int depth, int letlimit, int delta, int num_toplevels, int num_stxes) { @@ -1500,11 +1543,45 @@ static Scheme_Object * case_lambda_execute(Scheme_Object *expr) { Scheme_Case_Lambda *seqin, *seqout; - int i; + int i, cnt; Scheme_Thread *p = scheme_current_thread; seqin = (Scheme_Case_Lambda *)expr; +#ifdef MZ_USE_JIT + if (seqin->native_code) { + Scheme_Native_Closure_Data *ndata; + Scheme_Native_Closure *nc, *na; + Scheme_Closure_Data *data; + Scheme_Object *val; + GC_CAN_IGNORE Scheme_Object **runstack; + GC_CAN_IGNORE mzshort *map; + int j, jcnt; + + ndata = seqin->native_code; + nc = (Scheme_Native_Closure *)scheme_make_native_case_closure(ndata); + + cnt = seqin->count; + for (i = 0; i < cnt; i++) { + val = seqin->array[i]; + if (!SCHEME_PROCP(val)) { + data = (Scheme_Closure_Data *)val; + na = (Scheme_Native_Closure *)scheme_make_native_closure(data->native_code); + runstack = MZ_RUNSTACK; + jcnt = data->closure_size; + map = data->closure_map; + for (j = 0; j < jcnt; j++) { + na->vals[j] = runstack[map[j]]; + } + val = (Scheme_Object *)na; + } + nc->vals[i] = val; + } + + return (Scheme_Object *)nc; + } +#endif + seqout = (Scheme_Case_Lambda *) scheme_malloc_tagged(sizeof(Scheme_Case_Lambda) + (seqin->count - 1) * sizeof(Scheme_Object *)); @@ -1512,7 +1589,8 @@ case_lambda_execute(Scheme_Object *expr) seqout->count = seqin->count; seqout->name = seqin->name; - for (i = 0; i < seqin->count; i++) { + cnt = seqin->count; + for (i = 0; i < cnt; i++) { if (SAME_TYPE(SCHEME_TYPE(seqin->array[i]), scheme_closure_type)) { /* An empty closure, created at compile time */ seqout->array[i] = seqin->array[i]; @@ -1526,6 +1604,76 @@ case_lambda_execute(Scheme_Object *expr) return (Scheme_Object *)seqout; } +static Scheme_Object *case_lambda_jit(Scheme_Object *expr) +{ +#ifdef MZ_USE_JIT + Scheme_Case_Lambda *seqin = (Scheme_Case_Lambda *)expr; + + if (!seqin->native_code) { + Scheme_Case_Lambda *seqout; + Scheme_Native_Closure_Data *ndata; + Scheme_Object *val; + int i, cnt, size, all_closed = 1; + + cnt = seqin->count; + + size = sizeof(Scheme_Case_Lambda) + ((cnt - 1) * sizeof(Scheme_Object *)); + + seqout = (Scheme_Case_Lambda *)scheme_malloc_tagged(size); + memcpy(seqout, seqin, size); + + for (i = 0; i < cnt; i++) { + val = seqout->array[i]; + if (SCHEME_PROCP(val)) { + /* Undo creation of empty closure */ + val = (Scheme_Object *)((Scheme_Closure *)val)->code; + seqout->array[i] = val; + } + if (((Scheme_Closure_Data *)val)->closure_size) + all_closed = 0; + } + + /* Generating the code may cause empty closures to be formed: */ + ndata = scheme_generate_case_lambda(seqout); + seqout->native_code = ndata; + + if (all_closed) { + /* Native closures do not refer back to the original bytecode, + so no need to worry about clearing the reference. */ + Scheme_Native_Closure *nc; + nc = (Scheme_Native_Closure *)scheme_make_native_case_closure(ndata); + for (i = 0; i < cnt; i++) { + val = seqout->array[i]; + if (!SCHEME_PROCP(val)) { + val = scheme_make_native_closure(((Scheme_Closure_Data *)val)->native_code); + } + nc->vals[i] = val; + } + return (Scheme_Object *)nc; + } else { + /* The case-lambda data must point to the original closure-data + record, because that's where the closure maps are kept. But + we don't need the bytecode, anymore. So clone the + closure-data record and drop the bytecode in thte clone. */ + for (i = 0; i < cnt; i++) { + val = seqout->array[i]; + if (!SCHEME_PROCP(val)) { + Scheme_Closure_Data *data; + data = MALLOC_ONE_TAGGED(Scheme_Closure_Data); + memcpy(data, val, sizeof(Scheme_Closure_Data)); + data->code = NULL; + seqout->array[i] = (Scheme_Object *)data; + } + } + } + + return (Scheme_Object *)seqout; + } +#endif + + return expr; +} + static void case_lambda_validate(Scheme_Object *data, Mz_CPort *port, char *stack, int depth, int letlimit, int delta, int num_toplevels, int num_stxes) { @@ -1540,18 +1688,65 @@ static void case_lambda_validate(Scheme_Object *data, Mz_CPort *port, char *stac static Scheme_Object * case_lambda_resolve(Scheme_Object *expr, Resolve_Info *rslv) { - int i; + int i, all_closed = 1; Scheme_Case_Lambda *seq = (Scheme_Case_Lambda *)expr; for (i = 0; i < seq->count; i++) { Scheme_Object *le; - le = scheme_resolve_expr(seq->array[i], rslv); + le = seq->array[i]; + ((Scheme_Closure_Data *)le)->name = scheme_false; /* inidcates that it's a case */ + le = scheme_resolve_expr(le, rslv); seq->array[i] = le; + if (!SCHEME_PROCP(le)) + all_closed = 0; + } + + if (all_closed) { + /* Produce closure directly */ + return case_lambda_execute(expr); } return scheme_make_syntax_resolved(CASE_LAMBDA_EXPD, expr); } +Scheme_Object *scheme_unclose_case_lambda(Scheme_Object *expr, int jit) +{ + Scheme_Case_Lambda *cl = (Scheme_Case_Lambda *)expr; + Scheme_Closure *c; + int i; + + for (i = cl->count; i--; ) { + c = (Scheme_Closure *)cl->array[i]; + if (!ZERO_SIZED_CLOSUREP(c)) { + break; + } + } + + if (i < 0) { + /* We can reconstruct a case-lambda syntactic form. */ + Scheme_Case_Lambda *cl2; + + cl2 = (Scheme_Case_Lambda *)scheme_malloc_tagged(sizeof(Scheme_Case_Lambda) + + ((cl->count - 1) * sizeof(Scheme_Object*))); + + cl2->so.type = scheme_case_lambda_sequence_type; + cl2->count = cl->count; + cl2->name = cl->name; + + for (i = cl->count; i--; ) { + c = (Scheme_Closure *)cl->array[i]; + cl2->array[i] = (Scheme_Object *)c->code; + } + + if (jit) + return case_lambda_jit((Scheme_Object *)cl2); + else + return (Scheme_Object *)cl2; + } + + return expr; +} + static void case_lambda_check_line(Scheme_Object *line, Scheme_Object *form, Scheme_Comp_Env *env) { Scheme_Object *body, *args; @@ -1816,6 +2011,21 @@ bangboxvalue_execute(Scheme_Object *data) return val; } +static Scheme_Object *bangboxvalue_jit(Scheme_Object *data) +{ + Scheme_Object *orig, *naya; + + orig = SCHEME_CDR(data); + orig = SCHEME_CDR(orig); + naya = scheme_jit_expr(orig); + if (SAME_OBJ(naya, orig)) + return data; + else + return cons(SCHEME_CAR(data), + cons(SCHEME_CADR(data), + naya)); +} + static void bangboxvalue_validate(Scheme_Object *data, Mz_CPort *port, char *stack, int depth, int letlimit, int delta, int num_toplevels, int num_stxes) { @@ -2878,6 +3088,41 @@ begin0_execute(Scheme_Object *obj) return v; } +static Scheme_Object *begin0_jit(Scheme_Object *data) +{ + Scheme_Sequence *seq = (Scheme_Sequence *)data, *seq2; + Scheme_Object *old, *naya = NULL; + int i, j, count; + + count = seq->count; + for (i = 0; i < count; i++) { + old = seq->array[i]; + naya = scheme_jit_expr(old); + if (!SAME_OBJ(old, naya)) + break; + } + + if (i >= count) + return data; + + seq2 = (Scheme_Sequence *)scheme_malloc_tagged(sizeof(Scheme_Sequence) + + (count - 1) + * sizeof(Scheme_Object *)); + seq2->so.type = scheme_begin0_sequence_type; + seq2->count = count; + for (j = 0; j < i; j++) { + seq2->array[j] = seq->array[j]; + } + seq2->array[i] = naya; + for (i++; i < count; i++) { + old = seq->array[i]; + naya = scheme_jit_expr(old); + seq2->array[i] = naya; + } + + return (Scheme_Object *)seq2; +} + static void begin0_validate(Scheme_Object *data, Mz_CPort *port, char *stack, int depth, int letlimit, int delta, int num_toplevels, int num_stxes) { @@ -3113,13 +3358,19 @@ quote_syntax_execute(Scheme_Object *obj) globs = (Scheme_Object **)MZ_RUNSTACK[c]; stx = globs[i+p+1]; if (!stx) { - stx = ((Scheme_Object **)SCHEME_CDR(globs[p]))[i]; - stx = scheme_add_rename(stx, SCHEME_CAR(globs[p])); + stx = globs[p]; + stx = scheme_add_rename(((Scheme_Object **)SCHEME_CDR(stx))[i], + SCHEME_CAR(stx)); globs[i+p+1] = stx; } return stx; } +Scheme_Object *quote_syntax_jit(Scheme_Object *data) +{ + return data; +} + static void quote_syntax_validate(Scheme_Object *obj, Mz_CPort *port, char *stack, int depth, int letlimit, int delta, int num_toplevels, int num_stxes) { @@ -3241,6 +3492,43 @@ define_for_syntaxes_execute(Scheme_Object *form) return do_define_syntaxes_execute(form, NULL, 1); } +static Scheme_Object *do_define_syntaxes_jit(Scheme_Object *expr) +{ + Scheme_Object *orig, *naya, *data = expr; + Scheme_Object *a, *ad, *add; + + a = SCHEME_CAR(data); + data = SCHEME_CDR(data); + ad = SCHEME_CAR(data); + data = SCHEME_CDR(data); + add = SCHEME_CAR(data); + data = SCHEME_CDR(data); + + orig = SCHEME_CDR(data); + + naya = scheme_jit_expr(orig); + + if (SAME_OBJ(naya, orig)) + return expr; + else { + return cons(a, + cons(ad, + cons(add, + cons(SCHEME_CAR(data), + naya)))); + } +} + +static Scheme_Object *define_syntaxes_jit(Scheme_Object *expr) +{ + return do_define_syntaxes_jit(expr); +} + +static Scheme_Object *define_for_syntaxes_jit(Scheme_Object *expr) +{ + return do_define_syntaxes_jit(expr); +} + static void do_define_syntaxes_validate(Scheme_Object *data, Mz_CPort *port, char *stack, int depth, int letlimit, int delta, int num_toplevels, int num_stxes, @@ -3536,6 +3824,7 @@ Scheme_Object *scheme_bind_syntaxes(const char *where, Scheme_Object *names, Sch Scheme_Object **results, *l; Scheme_Comp_Env *eenv; Resolve_Prefix *rp; + Resolve_Info *ri; int vc, nc, j, i; Scheme_Compile_Info mrec; @@ -3555,7 +3844,14 @@ Scheme_Object *scheme_bind_syntaxes(const char *where, Scheme_Object *names, Sch For letrec-syntaxes+values, don't simplify because it's too expensive. */ rp = scheme_resolve_prefix(eenv->genv->phase, eenv->prefix, 0); - a = scheme_resolve_expr(a, scheme_resolve_info_create(rp)); + ri = scheme_resolve_info_create(rp); + a = scheme_resolve_expr(a, ri); + + + /* To JIT: + if (ri->use_jit) a = scheme_jit_expr(a); + but it's not likely that a let-syntax-bound macro is going + to run lots of times, so JITting is probably not worth it. */ a = eval_letmacro_rhs(a, rhs_env, mrec.max_let_depth, rp, eenv->genv->phase, certs); @@ -4001,8 +4297,8 @@ static Scheme_Object *write_case_lambda(Scheme_Object *obj) static Scheme_Object *read_case_lambda(Scheme_Object *obj) { - Scheme_Object *s; - int count, i; + Scheme_Object *s, *a; + int count, i, all_closed = 1; Scheme_Case_Lambda *cl; if (!SCHEME_PAIRP(obj)) return NULL; @@ -4023,9 +4319,20 @@ static Scheme_Object *read_case_lambda(Scheme_Object *obj) s = SCHEME_CDR(obj); for (i = 0; i < count; i++, s = SCHEME_CDR(s)) { - cl->array[i] = SCHEME_CAR(s); + a = SCHEME_CAR(s); + cl->array[i] = a; + if (!SCHEME_PROCP(a)) + all_closed = 0; } - + + if (all_closed) { + /* Empty closure: produce procedure value directly. + (We assume that this was generated by a direct write of + a case-lambda data record in print.c, and that it's not + in a CASE_LAMBDA_EXPD syntax record.) */ + return case_lambda_execute((Scheme_Object *)cl); + } + return (Scheme_Object *)cl; } diff --git a/src/mzscheme/src/thread.c b/src/mzscheme/src/thread.c index 68db71da4e..cea9b52981 100644 --- a/src/mzscheme/src/thread.c +++ b/src/mzscheme/src/thread.c @@ -689,24 +689,28 @@ void scheme_init_thread(Scheme_Env *env) 1, 1, 1), env); scheme_add_global_constant("sync", - scheme_make_prim_w_arity(sch_sync, - "sync", - 1, -1), + scheme_make_prim_w_arity2(sch_sync, + "sync", + 1, -1, + 0, -1), env); scheme_add_global_constant("sync/timeout", - scheme_make_prim_w_arity(sch_sync_timeout, - "sync/timeout", - 2, -1), + scheme_make_prim_w_arity2(sch_sync_timeout, + "sync/timeout", + 2, -1, + 0, -1), env); scheme_add_global_constant("sync/enable-break", - scheme_make_prim_w_arity(sch_sync_enable_break, - "sync/enable-break", - 1, -1), + scheme_make_prim_w_arity2(sch_sync_enable_break, + "sync/enable-break", + 1, -1, + 0, -1), env); scheme_add_global_constant("sync/timeout/enable-break", - scheme_make_prim_w_arity(sch_sync_timeout_enable_break, - "sync/timeout/enable-break", - 2, -1), + scheme_make_prim_w_arity2(sch_sync_timeout_enable_break, + "sync/timeout/enable-break", + 2, -1, + 0, -1), env); scheme_add_global_constant("choice-evt", scheme_make_prim_w_arity(evts_to_evt, @@ -2126,6 +2130,7 @@ void scheme_swap_thread(Scheme_Thread *new_thread) printf("death\n"); swapping = 1; #endif + if (!swap_no_setjmp && SETJMP(scheme_current_thread)) { /* We're back! */ /* See also initial swap in in start_child() */ @@ -2163,6 +2168,7 @@ void scheme_swap_thread(Scheme_Thread *new_thread) swap_no_setjmp = 0; /* We're leaving... */ + if (scheme_current_thread->init_break_cell) { int cb; cb = can_break_param(scheme_current_thread); @@ -5867,6 +5873,8 @@ static void make_initial_config(Scheme_Thread *p) init_param(cells, paramz, MZCONFIG_HONU_MODE, scheme_false); + init_param(cells, paramz, MZCONFIG_USE_JIT, scheme_startup_use_jit ? scheme_true : scheme_false); + { Scheme_Object *s; s = scheme_make_immutable_sized_utf8_string("", 0); @@ -6516,6 +6524,8 @@ static void prepare_thread_for_GC(Scheme_Object *t) if (p->values_buffer) memset(p->values_buffer, 0, sizeof(Scheme_Object*) * p->values_buffer_size); + p->spare_runstack = NULL; + /* zero ununsed part of list stack */ scheme_clean_list_stack(p); } diff --git a/src/mzscheme/src/type.c b/src/mzscheme/src/type.c index c0169999fb..0cd3171655 100644 --- a/src/mzscheme/src/type.c +++ b/src/mzscheme/src/type.c @@ -109,6 +109,7 @@ scheme_init_type (Scheme_Env *env) set_name(scheme_prim_type, ""); set_name(scheme_closed_prim_type, ""); set_name(scheme_closure_type, ""); + set_name(scheme_native_closure_type, ""); set_name(scheme_cont_type, ""); set_name(scheme_tail_call_waiting_type, ""); set_name(scheme_null_type, ""); diff --git a/src/mzscheme/src/vector.c b/src/mzscheme/src/vector.c index 5ab72e26cb..4d4e5850c9 100644 --- a/src/mzscheme/src/vector.c +++ b/src/mzscheme/src/vector.c @@ -54,19 +54,19 @@ scheme_init_vector (Scheme_Env *env) 1, 1, 1), env); scheme_add_global_constant("make-vector", - scheme_make_prim_w_arity(make_vector, - "make-vector", - 1, 2), + scheme_make_noncm_prim(make_vector, + "make-vector", + 1, 2), env); scheme_add_global_constant("vector", - scheme_make_prim_w_arity(vector, - "vector", - 0, -1), + scheme_make_noncm_prim(vector, + "vector", + 0, -1), env); scheme_add_global_constant("vector-immutable", - scheme_make_prim_w_arity(vector_immutable, - "vector-immutable", - 0, -1), + scheme_make_noncm_prim(vector_immutable, + "vector-immutable", + 0, -1), env); scheme_add_global_constant("vector-length", scheme_make_folding_prim(vector_length, @@ -74,34 +74,34 @@ scheme_init_vector (Scheme_Env *env) 1, 1, 1), env); scheme_add_global_constant("vector-ref", - scheme_make_prim_w_arity(vector_ref, - "vector-ref", - 2, 2), + scheme_make_noncm_prim(vector_ref, + "vector-ref", + 2, 2), env); scheme_add_global_constant("vector-set!", - scheme_make_prim_w_arity(vector_set, - "vector-set!", - 3, 3), + scheme_make_noncm_prim(vector_set, + "vector-set!", + 3, 3), env); scheme_add_global_constant("vector->list", - scheme_make_prim_w_arity(vector_to_list, - "vector->list", - 1, 1), + scheme_make_noncm_prim(vector_to_list, + "vector->list", + 1, 1), env); scheme_add_global_constant("list->vector", - scheme_make_prim_w_arity(list_to_vector, - "list->vector", - 1, 1), + scheme_make_noncm_prim(list_to_vector, + "list->vector", + 1, 1), env); scheme_add_global_constant("vector-fill!", - scheme_make_prim_w_arity(vector_fill, - "vector-fill!", - 2, 2), + scheme_make_noncm_prim(vector_fill, + "vector-fill!", + 2, 2), env); scheme_add_global_constant("vector->immutable-vector", - scheme_make_prim_w_arity(vector_to_immutable, - "vector->immutable-vector", - 1, 1), + scheme_make_noncm_prim(vector_to_immutable, + "vector->immutable-vector", + 1, 1), env); } diff --git a/src/mzscheme/utils/xctocc b/src/mzscheme/utils/xctocc index 3d8cec000f..5df7c74147 100755 --- a/src/mzscheme/utils/xctocc +++ b/src/mzscheme/utils/xctocc @@ -430,7 +430,7 @@ sub ReadFields { ($methpre, $methprecall, $methpostcall, $methpost) = split('/', $methodpostmacros); - ($gluepre, $glueprecall, $gluepostcall, $gluepost) + ($gluepre, $glueprecall, $gluepostcall, $gluepost, $gluepostschemebind) = split('/', $gluepostmacros); $methpre = &Wash($methpre); @@ -442,6 +442,7 @@ sub ReadFields { $glueprecall = &Wash($glueprecall); $gluepost = &Wash($gluepost); $gluepostcall = &Wash($gluepostcall); + $gluepostschemebind = &Wash($gluepostschemebind); if ($virtualonly && ($vexception ne '')) { $exception = &Wash($vexception); @@ -1839,6 +1840,9 @@ sub PrintFunction print " WITH_REMEMBERED_STACK(objscheme_register_primpointer(p[0], &((Scheme_Class_Object *)p[0])"; print "->primdata));\n"; } + if ($gluepostschemebind ne undef) { + print " " . &ApplyMacros($gluepostschemebind) . "\n"; + } print " return scheme_void;\n"; print "}\n"; } else { diff --git a/src/worksp-vc70/libmzsch/libmzsch.vcproj b/src/worksp-vc70/libmzsch/libmzsch.vcproj index 939ddae06f..8e488cba01 100644 --- a/src/worksp-vc70/libmzsch/libmzsch.vcproj +++ b/src/worksp-vc70/libmzsch/libmzsch.vcproj @@ -209,6 +209,9 @@ + + diff --git a/src/worksp/libmzsch/libmzsch.vcproj b/src/worksp/libmzsch/libmzsch.vcproj index 3b6d1924a8..00fb52f4bd 100644 --- a/src/worksp/libmzsch/libmzsch.vcproj +++ b/src/worksp/libmzsch/libmzsch.vcproj @@ -178,6 +178,9 @@ + + diff --git a/src/wxwindow/include/msw/wx_item.h b/src/wxwindow/include/msw/wx_item.h index ff7733d506..b1f0f36f75 100644 --- a/src/wxwindow/include/msw/wx_item.h +++ b/src/wxwindow/include/msw/wx_item.h @@ -54,7 +54,7 @@ class wxItem: public wxbItem virtual Bool MSWOnDraw(DRAWITEMSTRUCT *WXUNUSED(item)) { return FALSE; }; virtual Bool MSWOnMeasure(MEASUREITEMSTRUCT *WXUNUSED(item)) { return FALSE; }; - void GetLabelExtent(const char *string, double *x, double *y); + void GetLabelExtent(const char *string, double *x, double *y, wxFont *fnt = NULL); void SetFont(wxFont *f); }; diff --git a/src/wxwindow/src/msw/wx_gbox.cxx b/src/wxwindow/src/msw/wx_gbox.cxx index e986559b14..801e7953da 100644 --- a/src/wxwindow/src/msw/wx_gbox.cxx +++ b/src/wxwindow/src/msw/wx_gbox.cxx @@ -58,7 +58,7 @@ wxGroupBox::wxGroupBox(wxPanel *panel, char *Title, long _style, wxFont *_font): double label_height = 0; int char_width, ignored; - GetTextExtent(wxStripMenuCodes(the_label), &label_width, &label_height, NULL, NULL, font); + GetLabelExtent(wxStripMenuCodes(the_label), &label_width, &label_height); wxGetCharSize((HWND)ms_handle, &char_width, &ignored, font); label_width += 3 * char_width; /* space before & after label */ width = label_width; diff --git a/src/wxwindow/src/msw/wx_item.cxx b/src/wxwindow/src/msw/wx_item.cxx index a423e27a08..31c419814a 100644 --- a/src/wxwindow/src/msw/wx_item.cxx +++ b/src/wxwindow/src/msw/wx_item.cxx @@ -539,13 +539,15 @@ int wxGetControlFontSize() return 8; } -void wxItem::GetLabelExtent(const char *string, double *x, double *y) +void wxItem::GetLabelExtent(const char *string, double *x, double *y, wxFont *fnt) { - GetTextExtent(string, x, y, NULL, NULL, font); + if (!fnt) + fnt = font; + GetTextExtent(string, x, y, NULL, NULL, fnt); if (y && ms_handle) { /* Keep min height consistent, even with substitutions */ int cx, cy; - wxGetCharSize((HWND)ms_handle, &cx, &cy, font); + wxGetCharSize((HWND)ms_handle, &cx, &cy, fnt); if (*y < cy) *y = cy; } diff --git a/src/wxwindow/src/msw/wx_lbox.cxx b/src/wxwindow/src/msw/wx_lbox.cxx index 20f49ed02a..e888e340ff 100644 --- a/src/wxwindow/src/msw/wx_lbox.cxx +++ b/src/wxwindow/src/msw/wx_lbox.cxx @@ -404,7 +404,7 @@ void wxListBox::SetSize(int x, int y, int width, int height, int sizeFlags) // Find size of label wxGetCharSize((HWND)ms_handle, &clx, &cly, label_font); GetWindowText(static_label, buf, 300); - GetTextExtent(wxStripMenuCodes(buf), &label_width, &label_height, NULL, NULL, label_font); + GetLabelExtent(wxStripMenuCodes(buf), &label_width, &label_height, label_font); // Given size is total label + edit size, find individual // control sizes on that basis. @@ -524,7 +524,7 @@ void wxListBox::SetLabel(char *label) ::ScreenToClient(cparent->handle, &point); } - GetTextExtent((LPSTR)label, &w, &h, NULL, NULL, label_font); + GetLabelExtent((LPSTR)label, &w, &h, label_font); MoveWindow(static_label, point.x, point.y, (int)(w + 10), (int)h, TRUE); SetWindowTextW(static_label, wxWIDE_STRING(label)); diff --git a/src/wxwindow/src/msw/wx_messg.cxx b/src/wxwindow/src/msw/wx_messg.cxx index e36625338a..5bac954a1c 100644 --- a/src/wxwindow/src/msw/wx_messg.cxx +++ b/src/wxwindow/src/msw/wx_messg.cxx @@ -168,7 +168,7 @@ void wxMessage::SetSize(int x, int y, int width, int height, int sizeFlags) y = currentY; GetWindowTextW((HWND)ms_handle, buf, 300); - GetTextExtent(wxStripMenuCodes(wxNARROW_STRING(buf)), ¤t_width, &cyf, NULL, NULL,font); + GetLabelExtent(wxStripMenuCodes(wxNARROW_STRING(buf)), ¤t_width, &cyf); GetSize(&ww, &hh); diff --git a/src/wxwindow/src/msw/wx_tabc.cxx b/src/wxwindow/src/msw/wx_tabc.cxx index 03b2395611..44fcef7b4f 100644 --- a/src/wxwindow/src/msw/wx_tabc.cxx +++ b/src/wxwindow/src/msw/wx_tabc.cxx @@ -66,7 +66,7 @@ wxTabChoice::wxTabChoice(wxPanel *panel, wxFunction func, char *label, wxGetCharSize(cparent->handle, &cx, &cy, font); for (i = 0; i < n; i++) { - GetTextExtent(wxStripMenuCodes(choices[i]), ¤t_width, &cyf, NULL, NULL, font); + GetLabelExtent(wxStripMenuCodes(choices[i]), ¤t_width, &cyf); if (current_width < 40) current_width = 40; total_width += current_width + cy;