diff --git a/collects/compiler/private/xform.ss b/collects/compiler/private/xform.ss index febdcd2c42..b602155fec 100644 --- a/collects/compiler/private/xform.ss +++ b/collects/compiler/private/xform.ss @@ -870,7 +870,7 @@ strlen cos sin exp pow log sqrt atan2 isnan isinf fpclass _fpclass _isnan __isfinited __isnanl __isnan __isinff __isinfl isnanf isinff __isinfd __isnanf __isnand __isinf - floor ceil round fmod fabs __maskrune _errno __errno + floor ceil round fmod modf fabs __maskrune _errno __errno isalpha isdigit isspace tolower toupper fread fwrite socket fcntl setsockopt connect send recv close __builtin_next_arg __builtin_saveregs diff --git a/collects/rnrs/arithmetic/fixnums-6.ss b/collects/rnrs/arithmetic/fixnums-6.ss index ef57bf0e5c..f8153ea7fd 100644 --- a/collects/rnrs/arithmetic/fixnums-6.ss +++ b/collects/rnrs/arithmetic/fixnums-6.ss @@ -47,8 +47,8 @@ (define-fx odd? fxodd? #f (a) nocheck) (define-fx even? fxeven? #f (a) nocheck) -(define-fx max fxmax #f (a b ...) nocheck) -(define-fx min fxmin #f (a b ...) nocheck) +(define-fx max fxmax core:fxmax (a b ...) nocheck) +(define-fx min fxmin core:fxmin (a b ...) nocheck) (define-fx + fx+ core:fx+ (a b) check) (define-fx * fx* core:fx* (a b) check) diff --git a/collects/rnrs/arithmetic/flonums-6.ss b/collects/rnrs/arithmetic/flonums-6.ss index 051c30b5c2..3988e37664 100644 --- a/collects/rnrs/arithmetic/flonums-6.ss +++ b/collects/rnrs/arithmetic/flonums-6.ss @@ -6,6 +6,7 @@ [integer? r6rs:integer?] finite? infinite? nan?) (prefix-in core: scheme/flonum) + scheme/fixnum (only-in rnrs/arithmetic/fixnums-6 fixnum?) rnrs/conditions-6 @@ -17,8 +18,7 @@ fldenominator fllog (rename-out [core:flsqrt flsqrt]) flexpt &no-infinities make-no-infinities-violation no-infinities-violation? - &no-nans make-no-nans-violation no-nans-violation? - fixnum->flonum) + &no-nans make-no-nans-violation no-nans-violation?) ;; More provided via macros (define-inliner define-fl inexact-real? "flonum") @@ -39,8 +39,8 @@ (define-fl infinite? flinfinite? #f (a) nocheck) (define-fl nan? flnan? #f (a) nocheck) -(define-fl max flmax #f (a b ...) nocheck) -(define-fl min flmin #f (a b ...) nocheck) +(define-fl max flmax core:flmax (a b ...) nocheck) +(define-fl min flmin core:flmin (a b ...) nocheck) (define-fl + fl+ core:fl+ (a b ...) nocheck) (define-fl * fl* core:fl* (a b ...) nocheck) @@ -83,30 +83,24 @@ 1.0) (raise-type-error 'fldenominator "flonum" c))) -(define-fl floor flfloor #f (a) nocheck) -(define-fl ceiling flceiling #f (a) nocheck) -(define-fl truncate fltruncate #f (a) nocheck) -(define-fl round flround #f (a) nocheck) - -(define-fl exp flexp #f (a) nocheck) +(provide (rename-out [core:flfloor flfloor] + [core:flceiling flceiling] + [core:flround flround] + [core:fltruncate fltruncate] + [core:flexp flexp])) (define fllog (case-lambda - [(v) - (unless (inexact-real? v) - (raise-type-error 'fllog "flonum" v)) - (let ([v (log v)]) - (if (inexact-real? v) - v - +nan.0))] + [(v) (core:fllog v)] [(v1 v2) (/ (fllog v1) (fllog v2))])) -(define-fl sin flsin #f (a) nocheck) -(define-fl cos flcos #f (a) nocheck) -(define-fl tan fltan #f (a) nocheck) -(define-fl asin flasin #f (a) nocheck) -(define-fl acos flacos #f (a) nocheck) +(provide (rename-out [core:flsin flsin] + [core:flcos flcos] + [core:fltan fltan] + [core:flasin flasin] + [core:flacos flacos])) + (define-fl atan flatan #f [(a) (a b)] nocheck) (define (flexpt a b) @@ -133,7 +127,4 @@ (raise-type-error 'real->flonum "real" r)) (exact->inexact r)) -(define (fixnum->flonum fx) - (if (fixnum? fx) - (exact->inexact fx) - (raise-type-error 'fixnum->flonum "fixnum" fx))) +(provide (rename-out [fx->fl fixnum->flonum])) diff --git a/collects/scheme/fixnum.ss b/collects/scheme/fixnum.ss index 5a5d70abd2..82d04197d3 100644 --- a/collects/scheme/fixnum.ss +++ b/collects/scheme/fixnum.ss @@ -4,7 +4,8 @@ (provide fx->fl fxabs fx+ fx- fx* - fxquotient fxremainder + fxquotient fxremainder fxmodulo fxand fxior fxxor fxnot fxrshift fxlshift - fx>= fx> fx= fx< fx<=) + fx>= fx> fx= fx< fx<= + fxmin fxmax) diff --git a/collects/scheme/flonum.ss b/collects/scheme/flonum.ss index db868898f5..d1c8263c60 100644 --- a/collects/scheme/flonum.ss +++ b/collects/scheme/flonum.ss @@ -2,8 +2,10 @@ (require '#%flfxnum) (provide fl+ fl- fl* fl/ - flabs flsqrt - fl= fl< fl<= fl> fl>= + flabs flsqrt flexp fllog + flsin flcos fltan flasin flacos flatan + flfloor flceiling flround fltruncate + fl= fl< fl<= fl> fl>= flmin flmax ->fl flvector? flvector make-flvector flvector-length flvector-ref flvector-set!) diff --git a/collects/scheme/unsafe/ops.ss b/collects/scheme/unsafe/ops.ss index 9338488826..e67acd1f3d 100644 --- a/collects/scheme/unsafe/ops.ss +++ b/collects/scheme/unsafe/ops.ss @@ -1,5 +1,10 @@ #lang scheme/base -(require '#%unsafe) - -(provide (all-from-out '#%unsafe)) +(require '#%unsafe + '#%flfxnum) +(provide (all-from-out '#%unsafe) + (prefix-out unsafe- + (combine-out flsin flcos fltan + flasin flacos flatan + fltruncate flround flfloor flceiling + flexp fllog))) diff --git a/collects/scribblings/reference/numbers.scrbl b/collects/scribblings/reference/numbers.scrbl index bb92c2c300..677c0adc63 100644 --- a/collects/scribblings/reference/numbers.scrbl +++ b/collects/scribblings/reference/numbers.scrbl @@ -240,13 +240,13 @@ otherwise.} @defproc[(remainder [n integer?] [m integer?]) integer?]{ Returns - @scheme[q] with the same sign as @scheme[n] such that + @scheme[_q] with the same sign as @scheme[n] such that @itemize[ - @item{@scheme[(abs q)] is between @scheme[0] (inclusive) and @scheme[(abs m)] (exclusive), and} + @item{@scheme[(abs _q)] is between @scheme[0] (inclusive) and @scheme[(abs m)] (exclusive), and} - @item{@scheme[(+ q (* m (quotient n m)))] equals @scheme[n].} + @item{@scheme[(+ _q (* m (quotient n m)))] equals @scheme[n].} ] @@ -263,13 +263,13 @@ otherwise.} @defproc[(modulo [n integer?] [m integer?]) number?]{ Returns - @scheme[q] with the same sign as @scheme[m] where + @scheme[_q] with the same sign as @scheme[m] where @itemize[ - @item{@scheme[(abs q)] is between @scheme[0] (inclusive) and @scheme[(abs m)] (exclusive), and} + @item{@scheme[(abs _q)] is between @scheme[0] (inclusive) and @scheme[(abs m)] (exclusive), and} - @item{the difference between @scheme[q] and @scheme[(- n (* m (quotient n m)))] is a multiple of @scheme[m].} + @item{the difference between @scheme[_q] and @scheme[(- n (* m (quotient n m)))] is a multiple of @scheme[m].} ] @@ -878,13 +878,11 @@ they are as safe as generic operations like @scheme[+]. @defproc[(fl* [a inexact-real?][b inexact-real?]) inexact-real?] @defproc[(fl/ [a inexact-real?][b inexact-real?]) inexact-real?] @defproc[(flabs [a inexact-real?]) inexact-real?] -@defproc[(flsqrt [a inexact-real?]) inexact-real?] )]{ -Like @scheme[+], @scheme[-], @scheme[*], @scheme[/], @scheme[abs], and -@scheme[sqrt], but constrained to consume @tech{flonums}. The result -is always a @tech{flonum}. If a negative number is provided to -@scheme[sqrt], the result is @scheme[+nan.0].} +Like @scheme[+], @scheme[-], @scheme[*], @scheme[/], and @scheme[abs], +but constrained to consume @tech{flonums}. The result is always a +@tech{flonum}.} @deftogether[( @defproc[(fl= [a inexact-real?][b inexact-real?]) boolean?] @@ -892,10 +890,43 @@ is always a @tech{flonum}. If a negative number is provided to @defproc[(fl> [a inexact-real?][b inexact-real?]) boolean?] @defproc[(fl<= [a inexact-real?][b inexact-real?]) boolean?] @defproc[(fl>= [a inexact-real?][b inexact-real?]) boolean?] +@defproc[(flmin [a inexact-real?]) inexact-real?] +@defproc[(flmax [a inexact-real?]) inexact-real?] )]{ -Like @scheme[=], @scheme[<], @scheme[>], @scheme[<=], and @scheme[>=], -but constrained to consume @tech{flonums}.} +Like @scheme[=], @scheme[<], @scheme[>], @scheme[<=], @scheme[>=], +@scheme[min], and @scheme[max], but constrained to consume +@tech{flonums}.} + +@deftogether[( +@defproc[(flround [a inexact-real?]) inexact-real?] +@defproc[(flfloor [a inexact-real?]) inexact-real?] +@defproc[(flceiling [a inexact-real?]) inexact-real?] +@defproc[(fltruncate [a inexact-real?]) inexact-real?] +)]{ + +Like @scheme[round], @scheme[floor], @scheme[ceiling], and +@scheme[truncate], but constrained to consume @tech{flonums}.} + +@deftogether[( +@defproc[(flsin [a inexact-real?]) inexact-real?] +@defproc[(flcos [a inexact-real?]) inexact-real?] +@defproc[(fltan [a inexact-real?]) inexact-real?] +@defproc[(flasin [a inexact-real?]) inexact-real?] +@defproc[(flacos [a inexact-real?]) inexact-real?] +@defproc[(flatan [a inexact-real?]) inexact-real?] +@defproc[(fllog [a inexact-real?]) inexact-real?] +@defproc[(flexp [a inexact-real?]) inexact-real?] +@defproc[(flsqrt [a inexact-real?]) inexact-real?] +)]{ + +Like @scheme[sin], @scheme[cos], @scheme[tan], @scheme[asin], +@scheme[acos], @scheme[atan], @scheme[log], @scheme[exp], and +@scheme[flsqrt], but constrained to consume and produce +@tech{flonums}. The result is @scheme[+nan.0] when a number outside +the range @scheme[-1.0] to @scheme[1.0] is given to @scheme[flasin] or +@scheme[flacos], or when a negative number is given to @scheme[fllog] +or @scheme[flsqrt].} @defproc[(->fl [a exact-integer?]) inexact-real?]{ Like @scheme[exact->inexact], but constrained to consume exact integers, @@ -985,12 +1016,14 @@ the @schememodname[scheme/fixnum] library to help debug the problems. @defproc[(fx* [a fixnum?][b fixnum?]) fixnum?] @defproc[(fxquotient [a fixnum?][b fixnum?]) fixnum?] @defproc[(fxremainder [a fixnum?][b fixnum?]) fixnum?] +@defproc[(fxmodulo [a fixnum?][b fixnum?]) fixnum?] @defproc[(fxabs [a fixnum?]) fixnum?] )]{ Safe versions of @scheme[unsafe-fx+], @scheme[unsafe-fx-], @scheme[unsafe-fx*], @scheme[unsafe-fxquotient], -@scheme[unsafe-fxremainder], and @scheme[unsafe-fxabs]. The +@scheme[unsafe-fxremainder], @scheme[unsafe-fxmodulo], and +@scheme[unsafe-fxabs]. The @exnraise[exn:fail:contract:non-fixnum-result] if the arithmetic result would not be a fixnum.} @@ -1017,10 +1050,13 @@ result would not be a fixnum.} @defproc[(fx> [a fixnum?][b fixnum?]) boolean?] @defproc[(fx<= [a fixnum?][b fixnum?]) boolean?] @defproc[(fx>= [a fixnum?][b fixnum?]) boolean?] +@defproc[(fxmin [a fixnum?][b fixnum?]) fixnum?] +@defproc[(fxmax [a fixnum?][b fixnum?]) fixnum?] )]{ -Safe versions of @scheme[unsafe-fx=], @scheme[unsafe-fx<], @scheme[unsafe-fx>], - @scheme[unsafe-fx<=], and @scheme[unsafe-fx>=].} +Safe versions of @scheme[unsafe-fx=], @scheme[unsafe-fx<], + @scheme[unsafe-fx>], @scheme[unsafe-fx<=], @scheme[unsafe-fx>=], + @scheme[unsafe-fxmin], and @scheme[unsafe-fxmax].} diff --git a/collects/scribblings/reference/unsafe.scrbl b/collects/scribblings/reference/unsafe.scrbl index 3a6877f57a..d0c581e7ef 100644 --- a/collects/scribblings/reference/unsafe.scrbl +++ b/collects/scribblings/reference/unsafe.scrbl @@ -39,15 +39,17 @@ can be prevented by adjusting the code inspector (see @defproc[(unsafe-fx* [a fixnum?][b fixnum?]) fixnum?] @defproc[(unsafe-fxquotient [a fixnum?][b fixnum?]) fixnum?] @defproc[(unsafe-fxremainder [a fixnum?][b fixnum?]) fixnum?] +@defproc[(unsafe-fxmodulo [a fixnum?][b fixnum?]) fixnum?] @defproc[(unsafe-fxabs [a fixnum?]) fixnum?] )]{ For @tech{fixnums}: Like @scheme[+], @scheme[-], @scheme[*], -@scheme[quotient], @scheme[remainder], and @scheme[abs], but constrained to consume -@tech{fixnums} and produce a @tech{fixnum} result. The mathematical -operation on @scheme[a] and @scheme[b] must be representable as a -@tech{fixnum}. In the case of @scheme[unsafe-fxquotient] and -@scheme[unsafe-fxremainder], @scheme[b] must not be @scheme[0].} +@scheme[quotient], @scheme[remainder], @scheme[modulo], and +@scheme[abs], but constrained to consume @tech{fixnums} and produce a +@tech{fixnum} result. The mathematical operation on @scheme[a] and +@scheme[b] must be representable as a @tech{fixnum}. In the case of +@scheme[unsafe-fxquotient], @scheme[unsafe-fxremainder], and +@scheme[unsafe-fxmodulo], @scheme[b] must not be @scheme[0].} @deftogether[( @@ -78,11 +80,13 @@ represent a @tech{fixnum}, and the result is effectively @defproc[(unsafe-fx> [a fixnum?][b fixnum?]) boolean?] @defproc[(unsafe-fx<= [a fixnum?][b fixnum?]) boolean?] @defproc[(unsafe-fx>= [a fixnum?][b fixnum?]) boolean?] +@defproc[(unsafe-fxmin [a fixnum?][b fixnum?]) fixnum?] +@defproc[(unsafe-fxmax [a fixnum?][b fixnum?]) fixnum?] )]{ For @tech{fixnums}: Like @scheme[=], @scheme[<], @scheme[>], -@scheme[<=], and @scheme[>=], but constrained to consume -@tech{fixnums}.} +@scheme[<=], @scheme[>=], @scheme[min], and @scheme[max], but +constrained to consume @tech{fixnums}.} @defproc[(unsafe-fx->fl [a fixnum?]) inexact-real?]{ @@ -96,11 +100,10 @@ Unchecked version of @scheme[->fl]. @defproc[(unsafe-fl* [a inexact-real?][b inexact-real?]) inexact-real?] @defproc[(unsafe-fl/ [a inexact-real?][b inexact-real?]) inexact-real?] @defproc[(unsafe-flabs [a inexact-real?]) inexact-real?] -@defproc[(unsafe-flsqrt [a inexact-real?]) inexact-real?] )]{ For @tech{flonums}: Unchecked versions of @scheme[fl+], @scheme[fl-], -@scheme[fl*], @scheme[fl/], @scheme[flabs], and @scheme[flsqrt].} +@scheme[fl*], @scheme[fl/], and @scheme[flabs].} @deftogether[( @@ -109,11 +112,45 @@ For @tech{flonums}: Unchecked versions of @scheme[fl+], @scheme[fl-], @defproc[(unsafe-fl> [a inexact-real?][b inexact-real?]) boolean?] @defproc[(unsafe-fl<= [a inexact-real?][b inexact-real?]) boolean?] @defproc[(unsafe-fl>= [a inexact-real?][b inexact-real?]) boolean?] +@defproc[(unsafe-flmin [a inexact-real?]) inexact-real?] +@defproc[(unsafe-flmax [a inexact-real?]) inexact-real?] )]{ -For @tech{flonums}: Unchecked versions of @scheme[fl=], -@scheme[fl<], @scheme[fl>], @scheme[fl<=], and @scheme[fl>=], but constrained -to consume @tech{flonums}.} +For @tech{flonums}: Unchecked versions of @scheme[fl=], @scheme[fl<], +@scheme[fl>], @scheme[fl<=], @scheme[fl>=], @scheme[flmin], and +@scheme[flmax].} + + +@deftogether[( +@defproc[(unsafe-flround [a inexact-real?]) inexact-real?] +@defproc[(unsafe-flfloor [a inexact-real?]) inexact-real?] +@defproc[(unsafe-flceiling [a inexact-real?]) inexact-real?] +@defproc[(unsafe-fltruncate [a inexact-real?]) inexact-real?] +)]{ + +For @tech{flonums}: Unchecked (potentially) versions of +@scheme[flround], @scheme[flfloor], @scheme[flceiling], and +@scheme[fltruncate]. Currently, these bindings are simply aliases for +the corresponding safe bindings.} + + +@deftogether[( +@defproc[(unsafe-flsin [a inexact-real?]) inexact-real?] +@defproc[(unsafe-flcos [a inexact-real?]) inexact-real?] +@defproc[(unsafe-fltan [a inexact-real?]) inexact-real?] +@defproc[(unsafe-flasin [a inexact-real?]) inexact-real?] +@defproc[(unsafe-flacos [a inexact-real?]) inexact-real?] +@defproc[(unsafe-flatan [a inexact-real?]) inexact-real?] +@defproc[(unsafe-fllog [a inexact-real?]) inexact-real?] +@defproc[(unsafe-flexp [a inexact-real?]) inexact-real?] +@defproc[(unsafe-flsqrt [a inexact-real?]) inexact-real?] +)]{ + +For @tech{flonums}: Unchecked (potentially) versions of +@scheme[flsin], @scheme[flcos], @scheme[fltan], @scheme[flasin], +@scheme[flacos], @scheme[flatan], @scheme[fllog], @scheme[flexp], and +@scheme[flsqrt]. Currently, some of these bindings are simply aliases +for the corresponding safe bindings.} @section{Unsafe Data Extraction} diff --git a/collects/tests/mzscheme/fixnum.ss b/collects/tests/mzscheme/fixnum.ss index 3bfdc6019d..af9484271a 100644 --- a/collects/tests/mzscheme/fixnum.ss +++ b/collects/tests/mzscheme/fixnum.ss @@ -16,6 +16,7 @@ (list fxquotient unsafe-fxquotient) (list fxremainder unsafe-fxremainder) + (list fxmodulo unsafe-fxmodulo) (list fxand unsafe-fxand) (list fxior unsafe-fxior) @@ -25,7 +26,9 @@ (list fx> unsafe-fx>) (list fx= unsafe-fx=) (list fx<= unsafe-fx<=) - (list fx< unsafe-fx<))) + (list fx< unsafe-fx<) + (list fxmin unsafe-fxmin) + (list fxmax unsafe-fxmax))) (define binary/small-second-arg-table (list (list fxlshift unsafe-fxlshift) diff --git a/collects/tests/mzscheme/number.ss b/collects/tests/mzscheme/number.ss index 94f713b1f7..61447d1713 100644 --- a/collects/tests/mzscheme/number.ss +++ b/collects/tests/mzscheme/number.ss @@ -849,6 +849,7 @@ (err/rt-test (quotient 36.0+0.0i -7)) (test 0 quotient 0 5.0) (test 0 quotient 0 -5.0) +(test (expt 2 30) quotient (- (expt 2 30)) -1) (test 1 modulo 13 4) (test 1 remainder 13 4) (test 1.0 modulo 13 4.0) @@ -893,6 +894,8 @@ (test 0 modulo 0 -5.0) (test 0 remainder 0 5.0) (test 0 remainder 0 -5.0) +(test 0 modulo (- (expt 2 30)) -1) +(test 0 remainder (- (expt 2 30)) -1) (define (divtest n1 n2) (= n1 (+ (* n2 (quotient n1 n2)) (remainder n1 n2)))) diff --git a/collects/tests/mzscheme/optimize.ss b/collects/tests/mzscheme/optimize.ss index a1f177ba2e..7bc16202c1 100644 --- a/collects/tests/mzscheme/optimize.ss +++ b/collects/tests/mzscheme/optimize.ss @@ -313,6 +313,19 @@ (un-exact 3.0 'flsqrt 9.0) (un-exact +nan.0 'flsqrt -9.0) + + (let ([test-trig + (lambda (trig fltrig) + (un (trig 1.0) fltrig 1.0) + (un +nan.0 fltrig +nan.0))]) + (test-trig sin 'flsin) + (test-trig cos 'flcos) + (test-trig tan 'fltan) + (test-trig asin 'flasin) + (test-trig acos 'flacos) + (test-trig atan 'flatan) + (test-trig log 'fllog) + (test-trig exp 'flexp)) (un 1.0 'exact->inexact 1) (un 1073741823.0 'exact->inexact (sub1 (expt 2 30))) @@ -376,6 +389,7 @@ (bin-exact 7 'quotient (* 7 (expt 2 100)) (expt 2 100)) (bin-exact 3 'fxquotient 10 3) (bin-exact -3 'fxquotient 10 -3) + (bin-exact (expt 2 30) 'quotient (- (expt 2 30)) -1) (bin-int 1 'remainder 10 3) (bin-int 1 'remainder 10 -3) @@ -384,6 +398,18 @@ (bin-exact 7 'remainder (+ 7 (expt 2 100)) (expt 2 100)) (bin-exact 1 'fxremainder 10 3) (bin-exact 1 'fxremainder 10 -3) + (bin-exact -1 'fxremainder -10 3) + (bin-exact -1 'fxremainder -10 -3) + + (bin-int 1 'modulo 10 3) + (bin-int -2 'modulo 10 -3) + (bin-int -1 'modulo -10 -3) + (bin-int 2 'modulo -10 3) + (bin-exact 7 'modulo (+ 7 (expt 2 100)) (expt 2 100)) + (bin-exact 1 'fxmodulo 10 3) + (bin-exact -2 'fxmodulo 10 -3) + (bin-exact -1 'fxmodulo -10 -3) + (bin-exact 2 'fxmodulo -10 3) (bin 3 'min 3 300) (bin -300 'min 3 -300) @@ -391,6 +417,10 @@ (tri 5 'min (lambda () 10) 5 20 void) (tri 5 'min (lambda () 5) 10 20 void) (tri 5 'min (lambda () 20) 10 5 void) + (bin-exact 3.0 'flmin 3.0 4.5) + (bin-exact 2.5 'flmin 3.0 2.5) + (bin-exact 30 'fxmin 30 45) + (bin-exact 25 'fxmin 30 25) (bin 300 'max 3 300) (bin 3 'max 3 -300) @@ -398,6 +428,10 @@ (tri 50 'max (lambda () 10) 50 20 void) (tri 50 'max (lambda () 50) 10 20 void) (tri 50 'max (lambda () 20) 10 50 void) + (bin-exact 4.5 'flmax 3.0 4.5) + (bin-exact 3.0 'flmax 3.0 2.5) + (bin-exact 45 'fxmax 30 45) + (bin-exact 30 'fxmax 30 25) (bin-exact 11 'bitwise-and 11 43) (bin-exact 0 'bitwise-and 11 32) diff --git a/collects/tests/mzscheme/unsafe.ss b/collects/tests/mzscheme/unsafe.ss index bf26096f5c..53f6083a71 100644 --- a/collects/tests/mzscheme/unsafe.ss +++ b/collects/tests/mzscheme/unsafe.ss @@ -88,6 +88,12 @@ (test-bin #t unsafe-fx>= 2 2) (test-bin #t unsafe-fx>= 2 1) + (test-bin 3 unsafe-fxmin 3 30) + (test-bin -30 unsafe-fxmin 3 -30) + + (test-bin 30 unsafe-fxmax 3 30) + (test-bin 3 unsafe-fxmax 3 -30) + (test-bin 7.9 'unsafe-fl- 10.0 2.1) (test-bin 3.7 'unsafe-fl- 1.0 -2.7) @@ -135,6 +141,15 @@ (test-un 8.0 'unsafe-fx->fl 8) (test-un -8.0 'unsafe-fx->fl -8) + (test-bin 3.7 'unsafe-flmin 3.7 4.1) + (test-bin 2.1 'unsafe-flmin 3.7 2.1) + (test-bin +nan.0 'unsafe-flmin +nan.0 2.1) + (test-bin +nan.0 'unsafe-flmin 2.1 +nan.0) + (test-bin 3.7 'unsafe-flmax 3.7 2.1) + (test-bin 4.1 'unsafe-flmax 3.7 4.1) + (test-bin +nan.0 'unsafe-flmax +nan.0 2.1) + (test-bin +nan.0 'unsafe-flmax 2.1 +nan.0) + ;; test unboxing: (test-tri 9.0 '(lambda (x y z) (unsafe-fl+ (unsafe-fl- x z) y)) 4.5 7.0 2.5) (test-tri 9.0 '(lambda (x y z) (unsafe-fl+ y (unsafe-fl- x z))) 4.5 7.0 2.5) diff --git a/doc/release-notes/mzscheme/HISTORY.txt b/doc/release-notes/mzscheme/HISTORY.txt index 2787cbd016..544b8120f4 100644 --- a/doc/release-notes/mzscheme/HISTORY.txt +++ b/doc/release-notes/mzscheme/HISTORY.txt @@ -1,3 +1,6 @@ +Version 4.2.3.10 +Added more fl and fx operations + Version 4.2.3.8 Added scheme/flonum; moved flvector operations to scheme/flonum diff --git a/src/mzscheme/src/cstartup.inc b/src/mzscheme/src/cstartup.inc index a72e10d849..a6ef54cef0 100644 --- a/src/mzscheme/src/cstartup.inc +++ b/src/mzscheme/src/cstartup.inc @@ -1,688 +1,646 @@ { - static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,50,46,51,46,57,50,0,0,0,1,0,0,3,0,12,0, -17,0,30,0,35,0,42,0,49,0,54,0,58,0,62,0,69,0,72,0,78, -0,92,0,106,0,109,0,115,0,119,0,121,0,132,0,134,0,148,0,155,0, -177,0,179,0,193,0,4,1,33,1,44,1,55,1,65,1,101,1,134,1,167, -1,226,1,36,2,114,2,180,2,185,2,205,2,96,3,116,3,167,3,233,3, -118,4,4,5,56,5,79,5,158,5,0,0,105,7,0,0,29,11,11,68,104, -101,114,101,45,115,116,120,64,108,101,116,42,72,112,97,114,97,109,101,116,101, -114,105,122,101,64,99,111,110,100,66,100,101,102,105,110,101,66,108,101,116,114, -101,99,64,119,104,101,110,63,108,101,116,63,97,110,100,66,117,110,108,101,115, -115,62,111,114,65,113,117,111,116,101,29,94,2,13,68,35,37,107,101,114,110, -101,108,11,29,94,2,13,68,35,37,112,97,114,97,109,122,11,62,105,102,65, -98,101,103,105,110,63,115,116,120,61,115,70,108,101,116,45,118,97,108,117,101, -115,61,120,73,108,101,116,114,101,99,45,118,97,108,117,101,115,66,108,97,109, -98,100,97,1,20,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111,110, -45,107,101,121,61,118,73,100,101,102,105,110,101,45,118,97,108,117,101,115,97, -35,11,8,240,131,78,0,0,95,159,2,15,35,35,159,2,14,35,35,159,2, -14,35,35,16,20,2,3,2,1,2,4,2,1,2,11,2,1,2,5,2,1, -2,7,2,1,2,8,2,1,2,9,2,1,2,10,2,1,2,6,2,1,2, -12,2,1,97,36,11,8,240,131,78,0,0,93,159,2,14,35,36,16,2,2, -2,161,2,1,36,2,2,2,1,2,2,96,11,11,8,240,131,78,0,0,16, -0,96,37,11,8,240,131,78,0,0,16,0,13,16,4,35,29,11,11,2,1, -11,18,16,2,99,64,104,101,114,101,8,31,8,30,8,29,8,28,8,27,93, -8,224,138,78,0,0,95,9,8,224,138,78,0,0,2,1,27,248,22,137,4, -195,249,22,130,4,80,158,38,35,251,22,77,2,16,248,22,92,199,12,249,22, -67,2,17,248,22,94,201,27,248,22,137,4,195,249,22,130,4,80,158,38,35, -251,22,77,2,16,248,22,92,199,249,22,67,2,17,248,22,94,201,12,27,248, + static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,52,46,50,46,51,46,49,48,50,0,0,0,1,0,0,3,0,12, +0,17,0,30,0,37,0,41,0,45,0,48,0,55,0,62,0,67,0,72,0, +78,0,92,0,106,0,109,0,115,0,119,0,121,0,132,0,134,0,148,0,155, +0,177,0,179,0,193,0,4,1,33,1,44,1,55,1,65,1,101,1,134,1, +167,1,226,1,36,2,114,2,180,2,185,2,205,2,96,3,116,3,167,3,233, +3,118,4,4,5,56,5,79,5,158,5,0,0,105,7,0,0,29,11,11,68, +104,101,114,101,45,115,116,120,64,99,111,110,100,72,112,97,114,97,109,101,116, +101,114,105,122,101,66,108,101,116,114,101,99,63,97,110,100,63,108,101,116,62, +111,114,66,100,101,102,105,110,101,66,117,110,108,101,115,115,64,108,101,116,42, +64,119,104,101,110,65,113,117,111,116,101,29,94,2,13,68,35,37,107,101,114, +110,101,108,11,29,94,2,13,68,35,37,112,97,114,97,109,122,11,62,105,102, +65,98,101,103,105,110,63,115,116,120,61,115,70,108,101,116,45,118,97,108,117, +101,115,61,120,73,108,101,116,114,101,99,45,118,97,108,117,101,115,66,108,97, +109,98,100,97,1,20,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111, +110,45,107,101,121,61,118,73,100,101,102,105,110,101,45,118,97,108,117,101,115, +97,35,11,8,240,28,79,0,0,95,159,2,15,35,35,159,2,14,35,35,159, +2,14,35,35,16,20,2,3,2,1,2,4,2,1,2,6,2,1,2,7,2, +1,2,5,2,1,2,9,2,1,2,8,2,1,2,10,2,1,2,11,2,1, +2,12,2,1,97,36,11,8,240,28,79,0,0,93,159,2,14,35,36,16,2, +2,2,161,2,1,36,2,2,2,1,2,2,96,11,11,8,240,28,79,0,0, +16,0,96,37,11,8,240,28,79,0,0,16,0,13,16,4,35,29,11,11,2, +1,11,18,16,2,99,64,104,101,114,101,8,31,8,30,8,29,8,28,8,27, +93,8,224,35,79,0,0,95,9,8,224,35,79,0,0,2,1,27,248,22,137, +4,195,249,22,130,4,80,158,38,35,251,22,77,2,16,248,22,92,199,12,249, +22,67,2,17,248,22,94,201,27,248,22,137,4,195,249,22,130,4,80,158,38, +35,251,22,77,2,16,248,22,92,199,249,22,67,2,17,248,22,94,201,12,27, +248,22,69,248,22,137,4,196,28,248,22,75,193,20,15,159,36,35,36,28,248, +22,75,248,22,69,194,248,22,68,193,249,22,130,4,80,158,38,35,251,22,77, +2,16,248,22,68,199,249,22,67,2,6,248,22,69,201,11,18,16,2,101,10, +8,31,8,30,8,29,8,28,8,27,16,4,11,11,2,18,3,1,8,101,110, +118,49,50,55,54,56,16,4,11,11,2,19,3,1,8,101,110,118,49,50,55, +54,57,93,8,224,36,79,0,0,95,9,8,224,36,79,0,0,2,1,27,248, 22,69,248,22,137,4,196,28,248,22,75,193,20,15,159,36,35,36,28,248,22, -75,248,22,69,194,248,22,68,193,249,22,130,4,80,158,38,35,251,22,77,2, -16,248,22,68,199,249,22,67,2,10,248,22,69,201,11,18,16,2,101,10,8, -31,8,30,8,29,8,28,8,27,16,4,11,11,2,18,3,1,8,101,110,118, -49,50,55,53,52,16,4,11,11,2,19,3,1,8,101,110,118,49,50,55,53, -53,93,8,224,139,78,0,0,95,9,8,224,139,78,0,0,2,1,27,248,22, -69,248,22,137,4,196,28,248,22,75,193,20,15,159,36,35,36,28,248,22,75, -248,22,69,194,248,22,68,193,249,22,130,4,80,158,38,35,250,22,77,2,20, -248,22,77,249,22,77,248,22,77,2,21,248,22,68,201,251,22,77,2,16,2, -21,2,21,249,22,67,2,12,248,22,69,204,18,16,2,101,11,8,31,8,30, -8,29,8,28,8,27,16,4,11,11,2,18,3,1,8,101,110,118,49,50,55, -53,55,16,4,11,11,2,19,3,1,8,101,110,118,49,50,55,53,56,93,8, -224,140,78,0,0,95,9,8,224,140,78,0,0,2,1,248,22,137,4,193,27, +75,248,22,69,194,248,22,68,193,249,22,130,4,80,158,38,35,250,22,77,2, +20,248,22,77,249,22,77,248,22,77,2,21,248,22,68,201,251,22,77,2,16, +2,21,2,21,249,22,67,2,8,248,22,69,204,18,16,2,101,11,8,31,8, +30,8,29,8,28,8,27,16,4,11,11,2,18,3,1,8,101,110,118,49,50, +55,55,49,16,4,11,11,2,19,3,1,8,101,110,118,49,50,55,55,50,93, +8,224,37,79,0,0,95,9,8,224,37,79,0,0,2,1,248,22,137,4,193, +27,248,22,137,4,194,249,22,67,248,22,77,248,22,68,196,248,22,69,195,27, +248,22,69,248,22,137,4,23,197,1,249,22,130,4,80,158,38,35,28,248,22, +53,248,22,131,4,248,22,68,23,198,2,27,249,22,2,32,0,89,162,8,44, +36,42,9,222,33,39,248,22,137,4,248,22,92,23,200,2,250,22,77,2,22, +248,22,77,249,22,77,248,22,77,248,22,68,23,204,2,250,22,78,2,23,249, +22,2,22,68,23,204,2,248,22,94,23,206,2,249,22,67,248,22,68,23,202, +1,249,22,2,22,92,23,200,1,250,22,78,2,20,249,22,2,32,0,89,162, +8,44,36,46,9,222,33,40,248,22,137,4,248,22,68,201,248,22,69,198,27, 248,22,137,4,194,249,22,67,248,22,77,248,22,68,196,248,22,69,195,27,248, -22,69,248,22,137,4,23,197,1,249,22,130,4,80,158,38,35,28,248,22,53, -248,22,131,4,248,22,68,23,198,2,27,249,22,2,32,0,89,162,8,44,36, -42,9,222,33,39,248,22,137,4,248,22,92,23,200,2,250,22,77,2,22,248, -22,77,249,22,77,248,22,77,248,22,68,23,204,2,250,22,78,2,23,249,22, -2,22,68,23,204,2,248,22,94,23,206,2,249,22,67,248,22,68,23,202,1, -249,22,2,22,92,23,200,1,250,22,78,2,20,249,22,2,32,0,89,162,8, -44,36,46,9,222,33,40,248,22,137,4,248,22,68,201,248,22,69,198,27,248, -22,137,4,194,249,22,67,248,22,77,248,22,68,196,248,22,69,195,27,248,22, -69,248,22,137,4,23,197,1,249,22,130,4,80,158,38,35,250,22,78,2,22, -249,22,2,32,0,89,162,8,44,36,46,9,222,33,42,248,22,137,4,248,22, -68,201,248,22,69,198,27,248,22,69,248,22,137,4,196,27,248,22,137,4,248, -22,68,195,249,22,130,4,80,158,39,35,28,248,22,75,195,250,22,78,2,20, -9,248,22,69,199,250,22,77,2,9,248,22,77,248,22,68,199,250,22,78,2, -3,248,22,69,201,248,22,69,202,27,248,22,69,248,22,137,4,23,197,1,27, -249,22,1,22,81,249,22,2,22,137,4,248,22,137,4,248,22,68,199,249,22, -130,4,80,158,39,35,251,22,77,1,22,119,105,116,104,45,99,111,110,116,105, -110,117,97,116,105,111,110,45,109,97,114,107,2,24,250,22,78,1,23,101,120, -116,101,110,100,45,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111,110, -21,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,11,2,24,201,250,22,78,2,20,9,248, -22,69,203,27,248,22,69,248,22,137,4,196,28,248,22,75,193,20,15,159,36, -35,36,249,22,130,4,80,158,38,35,27,248,22,137,4,248,22,68,197,28,249, -22,167,8,62,61,62,248,22,131,4,248,22,92,196,250,22,77,2,20,248,22, -77,249,22,77,21,93,2,25,248,22,68,199,250,22,78,2,5,249,22,77,2, -25,249,22,77,248,22,101,203,2,25,248,22,69,202,251,22,77,2,16,28,249, -22,167,8,248,22,131,4,248,22,68,200,64,101,108,115,101,10,248,22,68,197, -250,22,78,2,20,9,248,22,69,200,249,22,67,2,5,248,22,69,202,100,8, -31,8,30,8,29,8,28,8,27,16,4,11,11,2,18,3,1,8,101,110,118, -49,50,55,56,48,16,4,11,11,2,19,3,1,8,101,110,118,49,50,55,56, -49,93,8,224,141,78,0,0,18,16,2,158,94,10,64,118,111,105,100,8,47, -95,9,8,224,141,78,0,0,2,1,27,248,22,69,248,22,137,4,196,249,22, -130,4,80,158,38,35,28,248,22,53,248,22,131,4,248,22,68,197,250,22,77, -2,26,248,22,77,248,22,68,199,248,22,92,198,27,248,22,131,4,248,22,68, -197,250,22,77,2,26,248,22,77,248,22,68,197,250,22,78,2,23,248,22,69, -199,248,22,69,202,159,35,20,102,159,35,16,1,11,16,0,83,158,41,20,100, -144,69,35,37,109,105,110,45,115,116,120,2,1,11,11,11,10,35,80,158,35, -35,20,102,159,35,16,0,16,0,16,1,2,2,36,16,0,35,16,0,35,11, -11,38,35,11,11,11,16,10,2,3,2,4,2,5,2,6,2,7,2,8,2, -9,2,10,2,11,2,12,16,10,11,11,11,11,11,11,11,11,11,11,16,10, -2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,10,2,11,2,12,35, -45,36,11,11,11,16,0,16,0,16,0,35,35,11,11,11,11,16,0,16,0, -16,0,35,35,16,11,16,5,2,2,20,15,159,35,35,35,35,20,102,159,35, -16,0,16,1,33,32,10,16,5,2,11,89,162,8,44,36,52,9,223,0,33, -33,35,20,102,159,35,16,1,2,2,16,0,11,16,5,2,8,89,162,8,44, -36,52,9,223,0,33,34,35,20,102,159,35,16,1,2,2,16,0,11,16,5, -2,10,89,162,8,44,36,52,9,223,0,33,35,35,20,102,159,35,16,1,2, -2,16,1,33,36,11,16,5,2,12,89,162,8,44,36,55,9,223,0,33,37, -35,20,102,159,35,16,1,2,2,16,1,33,38,11,16,5,2,9,89,162,8, -44,36,57,9,223,0,33,41,35,20,102,159,35,16,1,2,2,16,0,11,16, -5,2,7,89,162,8,44,36,52,9,223,0,33,43,35,20,102,159,35,16,1, -2,2,16,0,11,16,5,2,3,89,162,8,44,36,53,9,223,0,33,44,35, -20,102,159,35,16,1,2,2,16,0,11,16,5,2,4,89,162,8,44,36,54, -9,223,0,33,45,35,20,102,159,35,16,1,2,2,16,0,11,16,5,2,5, -89,162,8,44,36,57,9,223,0,33,46,35,20,102,159,35,16,1,2,2,16, -1,33,48,11,16,5,2,6,89,162,8,44,36,53,9,223,0,33,49,35,20, -102,159,35,16,1,2,2,16,0,11,16,0,94,2,14,2,15,93,2,14,9, -9,35,0}; - EVAL_ONE_SIZED_STR((char *)expr, 2018); +22,69,248,22,137,4,23,197,1,249,22,130,4,80,158,38,35,250,22,78,2, +22,249,22,2,32,0,89,162,8,44,36,46,9,222,33,42,248,22,137,4,248, +22,68,201,248,22,69,198,27,248,22,69,248,22,137,4,196,27,248,22,137,4, +248,22,68,195,249,22,130,4,80,158,39,35,28,248,22,75,195,250,22,78,2, +20,9,248,22,69,199,250,22,77,2,7,248,22,77,248,22,68,199,250,22,78, +2,11,248,22,69,201,248,22,69,202,27,248,22,69,248,22,137,4,23,197,1, +27,249,22,1,22,81,249,22,2,22,137,4,248,22,137,4,248,22,68,199,249, +22,130,4,80,158,39,35,251,22,77,1,22,119,105,116,104,45,99,111,110,116, +105,110,117,97,116,105,111,110,45,109,97,114,107,2,24,250,22,78,1,23,101, +120,116,101,110,100,45,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111, +110,21,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,11,2,24,201,250,22,78,2,20,9, +248,22,69,203,27,248,22,69,248,22,137,4,196,28,248,22,75,193,20,15,159, +36,35,36,249,22,130,4,80,158,38,35,27,248,22,137,4,248,22,68,197,28, +249,22,167,8,62,61,62,248,22,131,4,248,22,92,196,250,22,77,2,20,248, +22,77,249,22,77,21,93,2,25,248,22,68,199,250,22,78,2,3,249,22,77, +2,25,249,22,77,248,22,101,203,2,25,248,22,69,202,251,22,77,2,16,28, +249,22,167,8,248,22,131,4,248,22,68,200,64,101,108,115,101,10,248,22,68, +197,250,22,78,2,20,9,248,22,69,200,249,22,67,2,3,248,22,69,202,100, +8,31,8,30,8,29,8,28,8,27,16,4,11,11,2,18,3,1,8,101,110, +118,49,50,55,57,52,16,4,11,11,2,19,3,1,8,101,110,118,49,50,55, +57,53,93,8,224,38,79,0,0,18,16,2,158,94,10,64,118,111,105,100,8, +47,95,9,8,224,38,79,0,0,2,1,27,248,22,69,248,22,137,4,196,249, +22,130,4,80,158,38,35,28,248,22,53,248,22,131,4,248,22,68,197,250,22, +77,2,26,248,22,77,248,22,68,199,248,22,92,198,27,248,22,131,4,248,22, +68,197,250,22,77,2,26,248,22,77,248,22,68,197,250,22,78,2,23,248,22, +69,199,248,22,69,202,159,35,20,102,159,35,16,1,11,16,0,83,158,41,20, +100,144,69,35,37,109,105,110,45,115,116,120,2,1,11,11,11,10,35,80,158, +35,35,20,102,159,35,16,0,16,0,16,1,2,2,36,16,0,35,16,0,35, +11,11,38,35,11,11,11,16,10,2,3,2,4,2,5,2,6,2,7,2,8, +2,9,2,10,2,11,2,12,16,10,11,11,11,11,11,11,11,11,11,11,16, +10,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,10,2,11,2,12, +35,45,36,11,11,11,16,0,16,0,16,0,35,35,11,11,11,11,16,0,16, +0,16,0,35,35,16,11,16,5,2,2,20,15,159,35,35,35,35,20,102,159, +35,16,0,16,1,33,32,10,16,5,2,10,89,162,8,44,36,52,9,223,0, +33,33,35,20,102,159,35,16,1,2,2,16,0,11,16,5,2,12,89,162,8, +44,36,52,9,223,0,33,34,35,20,102,159,35,16,1,2,2,16,0,11,16, +5,2,6,89,162,8,44,36,52,9,223,0,33,35,35,20,102,159,35,16,1, +2,2,16,1,33,36,11,16,5,2,8,89,162,8,44,36,55,9,223,0,33, +37,35,20,102,159,35,16,1,2,2,16,1,33,38,11,16,5,2,7,89,162, +8,44,36,57,9,223,0,33,41,35,20,102,159,35,16,1,2,2,16,0,11, +16,5,2,5,89,162,8,44,36,52,9,223,0,33,43,35,20,102,159,35,16, +1,2,2,16,0,11,16,5,2,11,89,162,8,44,36,53,9,223,0,33,44, +35,20,102,159,35,16,1,2,2,16,0,11,16,5,2,4,89,162,8,44,36, +54,9,223,0,33,45,35,20,102,159,35,16,1,2,2,16,0,11,16,5,2, +3,89,162,8,44,36,57,9,223,0,33,46,35,20,102,159,35,16,1,2,2, +16,1,33,48,11,16,5,2,9,89,162,8,44,36,53,9,223,0,33,49,35, +20,102,159,35,16,1,2,2,16,0,11,16,0,94,2,14,2,15,93,2,14, +9,9,35,0}; + EVAL_ONE_SIZED_STR((char *)expr, 2019); } { - static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,50,46,51,46,57,62,0,0,0,1,0,0,13,0,18,0, -35,0,50,0,68,0,84,0,94,0,112,0,132,0,148,0,166,0,197,0,226, -0,248,0,6,1,12,1,26,1,31,1,41,1,49,1,77,1,109,1,115,1, -160,1,205,1,229,1,12,2,14,2,71,2,161,3,202,3,37,5,141,5,245, -5,106,6,208,6,221,6,80,8,200,8,212,8,62,10,76,10,239,10,242,11, -242,12,249,12,1,13,9,13,134,13,147,13,196,14,42,15,64,15,77,19,90, -19,172,20,145,22,154,22,163,22,189,22,44,23,0,0,33,26,0,0,72,112, -97,116,104,45,115,116,114,105,110,103,63,64,98,115,98,115,76,110,111,114,109, -97,108,45,99,97,115,101,45,112,97,116,104,74,45,99,104,101,99,107,45,114, -101,108,112,97,116,104,77,45,99,104,101,99,107,45,99,111,108,108,101,99,116, -105,111,110,75,99,111,108,108,101,99,116,105,111,110,45,112,97,116,104,69,45, -102,105,110,100,45,99,111,108,77,99,104,101,99,107,45,115,117,102,102,105,120, -45,99,97,108,108,79,112,97,116,104,45,114,101,112,108,97,99,101,45,115,117, -102,102,105,120,75,112,97,116,104,45,97,100,100,45,115,117,102,102,105,120,77, -108,111,97,100,47,117,115,101,45,99,111,109,112,105,108,101,100,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,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,1,20,102,105,110,100,45, -101,120,101,99,117,116,97,98,108,101,45,112,97,116,104,73,101,109,98,101,100, -100,101,100,45,108,111,97,100,65,113,117,111,116,101,29,94,2,16,68,35,37, -112,97,114,97,109,122,11,64,108,111,111,112,69,101,120,101,99,45,102,105,108, -101,67,119,105,110,100,111,119,115,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,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,65,99,108,111,111,112,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,6,42,42,112,97,116, -104,32,40,102,111,114,32,97,110,121,32,115,121,115,116,101,109,41,32,111,114, -32,118,97,108,105,100,45,112,97,116,104,32,115,116,114,105,110,103,6,21,21, -115,116,114,105,110,103,32,111,114,32,98,121,116,101,32,115,116,114,105,110,103, -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,5,0,27, -20,14,159,80,158,36,50,250,80,158,39,51,249,22,27,11,80,158,41,50,22, -128,13,10,248,22,160,5,23,196,2,28,248,22,157,6,23,194,2,12,87,94, -248,22,171,8,23,194,1,248,80,159,37,53,36,195,28,248,22,75,23,195,2, -9,27,248,22,68,23,196,2,27,28,248,22,174,13,23,195,2,23,194,1,28, -248,22,173,13,23,195,2,249,22,175,13,23,196,1,250,80,158,42,48,248,22, -190,13,2,19,11,10,250,80,158,40,48,248,22,190,13,2,19,23,197,1,10, -28,23,193,2,249,22,67,248,22,177,13,249,22,175,13,23,198,1,247,22,191, -13,27,248,22,69,23,200,1,28,248,22,75,23,194,2,9,27,248,22,68,23, -195,2,27,28,248,22,174,13,23,195,2,23,194,1,28,248,22,173,13,23,195, -2,249,22,175,13,23,196,1,250,80,158,47,48,248,22,190,13,2,19,11,10, -250,80,158,45,48,248,22,190,13,2,19,23,197,1,10,28,23,193,2,249,22, -67,248,22,177,13,249,22,175,13,23,198,1,247,22,191,13,248,80,159,45,52, -36,248,22,69,23,199,1,87,94,23,193,1,248,80,159,43,52,36,248,22,69, -23,197,1,87,94,23,193,1,27,248,22,69,23,198,1,28,248,22,75,23,194, -2,9,27,248,22,68,23,195,2,27,28,248,22,174,13,23,195,2,23,194,1, -28,248,22,173,13,23,195,2,249,22,175,13,23,196,1,250,80,158,45,48,248, -22,190,13,2,19,11,10,250,80,158,43,48,248,22,190,13,2,19,23,197,1, -10,28,23,193,2,249,22,67,248,22,177,13,249,22,175,13,23,198,1,247,22, -191,13,248,80,159,43,52,36,248,22,69,23,199,1,248,80,159,41,52,36,248, -22,69,196,27,248,22,150,13,23,195,2,28,23,193,2,192,87,94,23,193,1, -28,248,22,162,6,23,195,2,27,248,22,172,13,195,28,192,192,248,22,173,13, -195,11,87,94,28,28,248,22,151,13,23,195,2,10,27,248,22,150,13,23,196, -2,28,23,193,2,192,87,94,23,193,1,28,248,22,162,6,23,196,2,27,248, -22,172,13,23,197,2,28,23,193,2,192,87,94,23,193,1,248,22,173,13,23, -197,2,11,12,250,22,135,9,76,110,111,114,109,97,108,45,112,97,116,104,45, -99,97,115,101,6,42,42,112,97,116,104,32,40,102,111,114,32,97,110,121,32, -115,121,115,116,101,109,41,32,111,114,32,118,97,108,105,100,45,112,97,116,104, -32,115,116,114,105,110,103,23,197,2,28,28,248,22,151,13,23,195,2,249,22, -167,8,248,22,152,13,23,197,2,2,20,249,22,167,8,247,22,181,7,2,20, -27,28,248,22,162,6,23,196,2,23,195,2,248,22,171,7,248,22,155,13,23, -197,2,28,249,22,139,14,0,21,35,114,120,34,94,91,92,92,93,91,92,92, -93,91,63,93,91,92,92,93,34,23,195,2,28,248,22,162,6,195,248,22,158, -13,195,194,27,248,22,137,7,23,195,1,249,22,159,13,248,22,174,7,250,22, -145,14,0,6,35,114,120,34,47,34,28,249,22,139,14,0,22,35,114,120,34, -91,47,92,92,93,91,46,32,93,43,91,47,92,92,93,42,36,34,23,201,2, -23,199,1,250,22,145,14,0,19,35,114,120,34,91,32,46,93,43,40,91,47, -92,92,93,42,41,36,34,23,202,1,6,2,2,92,49,80,159,43,36,37,2, -20,28,248,22,162,6,194,248,22,158,13,194,193,87,94,28,27,248,22,150,13, -23,196,2,28,23,193,2,192,87,94,23,193,1,28,248,22,162,6,23,196,2, -27,248,22,172,13,23,197,2,28,23,193,2,192,87,94,23,193,1,248,22,173, -13,23,197,2,11,12,250,22,135,9,23,196,2,2,21,23,197,2,28,248,22, -172,13,23,195,2,12,248,22,168,11,249,22,174,10,248,22,191,6,250,22,146, -7,2,22,23,200,1,23,201,1,247,22,23,87,94,28,27,248,22,150,13,23, -196,2,28,23,193,2,192,87,94,23,193,1,28,248,22,162,6,23,196,2,27, -248,22,172,13,23,197,2,28,23,193,2,192,87,94,23,193,1,248,22,173,13, -23,197,2,11,12,250,22,135,9,23,196,2,2,21,23,197,2,28,248,22,172, -13,23,195,2,12,248,22,168,11,249,22,174,10,248,22,191,6,250,22,146,7, -2,22,23,200,1,23,201,1,247,22,23,87,94,87,94,28,27,248,22,150,13, -23,196,2,28,23,193,2,192,87,94,23,193,1,28,248,22,162,6,23,196,2, -27,248,22,172,13,23,197,2,28,23,193,2,192,87,94,23,193,1,248,22,173, -13,23,197,2,11,12,250,22,135,9,195,2,21,23,197,2,28,248,22,172,13, -23,195,2,12,248,22,168,11,249,22,174,10,248,22,191,6,250,22,146,7,2, -22,199,23,201,1,247,22,23,249,22,3,89,162,8,44,36,49,9,223,2,33, -34,196,87,94,28,27,248,22,150,13,23,195,2,28,23,193,2,192,87,94,23, -193,1,28,248,22,162,6,23,195,2,27,248,22,172,13,23,196,2,28,23,193, -2,192,87,94,23,193,1,248,22,173,13,23,196,2,11,12,250,22,135,9,2, -6,2,21,23,196,2,28,248,22,172,13,23,194,2,12,248,22,168,11,249,22, -174,10,248,22,191,6,250,22,146,7,2,22,2,6,23,200,1,247,22,23,32, -37,89,162,8,44,39,57,2,23,222,33,38,28,248,22,75,23,197,2,87,94, -23,196,1,248,22,168,11,249,22,143,11,251,22,146,7,2,24,2,6,28,248, + static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,52,46,50,46,51,46,49,48,65,0,0,0,1,0,0,13,0,18, +0,35,0,50,0,68,0,84,0,94,0,112,0,132,0,148,0,166,0,197,0, +226,0,248,0,6,1,12,1,26,1,31,1,41,1,49,1,77,1,109,1,115, +1,160,1,205,1,229,1,12,2,69,2,159,3,200,3,17,5,103,5,189,5, +32,6,116,6,129,6,250,6,96,7,108,7,214,8,228,8,117,9,102,10,84, +11,91,11,99,11,107,11,232,11,245,11,10,12,41,12,94,12,196,12,218,12, +234,12,182,14,29,15,42,15,146,15,22,17,31,17,40,17,66,17,177,17,0, +0,167,20,0,0,72,112,97,116,104,45,115,116,114,105,110,103,63,64,98,115, +98,115,76,110,111,114,109,97,108,45,99,97,115,101,45,112,97,116,104,74,45, +99,104,101,99,107,45,114,101,108,112,97,116,104,77,45,99,104,101,99,107,45, +99,111,108,108,101,99,116,105,111,110,75,99,111,108,108,101,99,116,105,111,110, +45,112,97,116,104,69,45,102,105,110,100,45,99,111,108,77,99,104,101,99,107, +45,115,117,102,102,105,120,45,99,97,108,108,79,112,97,116,104,45,114,101,112, +108,97,99,101,45,115,117,102,102,105,120,75,112,97,116,104,45,97,100,100,45, +115,117,102,102,105,120,77,108,111,97,100,47,117,115,101,45,99,111,109,112,105, +108,101,100,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,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, +1,20,102,105,110,100,45,101,120,101,99,117,116,97,98,108,101,45,112,97,116, +104,73,101,109,98,101,100,100,101,100,45,108,111,97,100,65,113,117,111,116,101, +29,94,2,16,68,35,37,112,97,114,97,109,122,11,64,108,111,111,112,69,101, +120,101,99,45,102,105,108,101,67,119,105,110,100,111,119,115,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,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,65,99,108,111,111,112,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,6,42,42,112,97,116,104,32,40,102,111,114,32,97,110,121,32,115,121,115, +116,101,109,41,32,111,114,32,118,97,108,105,100,45,112,97,116,104,32,115,116, +114,105,110,103,6,21,21,115,116,114,105,110,103,32,111,114,32,98,121,116,101, +32,115,116,114,105,110,103,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,27,20,14,159,80,158,36,50,250,80,158,39,51,249,22,27,11, +80,158,41,50,22,128,13,10,248,22,160,5,23,196,2,28,248,22,157,6,23, +194,2,12,87,94,248,22,171,8,23,194,1,248,80,159,37,53,36,195,28,248, +22,75,23,195,2,9,27,248,22,68,23,196,2,27,28,248,22,174,13,23,195, +2,23,194,1,28,248,22,173,13,23,195,2,249,22,175,13,23,196,1,250,80, +158,42,48,248,22,190,13,2,19,11,10,250,80,158,40,48,248,22,190,13,2, +19,23,197,1,10,28,23,193,2,249,22,67,248,22,177,13,249,22,175,13,23, +198,1,247,22,191,13,27,248,22,69,23,200,1,28,248,22,75,23,194,2,9, +27,248,22,68,23,195,2,27,28,248,22,174,13,23,195,2,23,194,1,28,248, +22,173,13,23,195,2,249,22,175,13,23,196,1,250,80,158,47,48,248,22,190, +13,2,19,11,10,250,80,158,45,48,248,22,190,13,2,19,23,197,1,10,28, +23,193,2,249,22,67,248,22,177,13,249,22,175,13,23,198,1,247,22,191,13, +248,80,159,45,52,36,248,22,69,23,199,1,87,94,23,193,1,248,80,159,43, +52,36,248,22,69,23,197,1,87,94,23,193,1,27,248,22,69,23,198,1,28, +248,22,75,23,194,2,9,27,248,22,68,23,195,2,27,28,248,22,174,13,23, +195,2,23,194,1,28,248,22,173,13,23,195,2,249,22,175,13,23,196,1,250, +80,158,45,48,248,22,190,13,2,19,11,10,250,80,158,43,48,248,22,190,13, +2,19,23,197,1,10,28,23,193,2,249,22,67,248,22,177,13,249,22,175,13, +23,198,1,247,22,191,13,248,80,159,43,52,36,248,22,69,23,199,1,248,80, +159,41,52,36,248,22,69,196,27,248,22,150,13,23,195,2,28,23,193,2,192, +87,94,23,193,1,28,248,22,162,6,23,195,2,27,248,22,172,13,195,28,192, +192,248,22,173,13,195,11,87,94,28,28,248,22,151,13,23,195,2,10,28,248, +22,150,13,23,195,2,10,28,248,22,162,6,23,195,2,28,248,22,172,13,23, +195,2,10,248,22,173,13,23,195,2,11,12,250,22,135,9,76,110,111,114,109, +97,108,45,112,97,116,104,45,99,97,115,101,6,42,42,112,97,116,104,32,40, +102,111,114,32,97,110,121,32,115,121,115,116,101,109,41,32,111,114,32,118,97, +108,105,100,45,112,97,116,104,32,115,116,114,105,110,103,23,197,2,28,28,248, +22,151,13,23,195,2,249,22,167,8,248,22,152,13,23,197,2,2,20,249,22, +167,8,247,22,181,7,2,20,27,28,248,22,162,6,23,196,2,23,195,2,248, +22,171,7,248,22,155,13,23,197,2,28,249,22,139,14,0,21,35,114,120,34, +94,91,92,92,93,91,92,92,93,91,63,93,91,92,92,93,34,23,195,2,28, +248,22,162,6,195,248,22,158,13,195,194,27,248,22,137,7,23,195,1,249,22, +159,13,248,22,174,7,250,22,145,14,0,6,35,114,120,34,47,34,28,249,22, +139,14,0,22,35,114,120,34,91,47,92,92,93,91,46,32,93,43,91,47,92, +92,93,42,36,34,23,201,2,23,199,1,250,22,145,14,0,19,35,114,120,34, +91,32,46,93,43,40,91,47,92,92,93,42,41,36,34,23,202,1,6,2,2, +92,49,80,159,43,36,37,2,20,28,248,22,162,6,194,248,22,158,13,194,193, +87,94,28,28,248,22,150,13,23,195,2,10,28,248,22,162,6,23,195,2,28, +248,22,172,13,23,195,2,10,248,22,173,13,23,195,2,11,12,250,22,135,9, +23,196,2,2,21,23,197,2,28,248,22,172,13,23,195,2,12,248,22,168,11, +249,22,174,10,248,22,191,6,250,22,146,7,2,22,23,200,1,23,201,1,247, +22,23,87,94,28,28,248,22,150,13,23,195,2,10,28,248,22,162,6,23,195, +2,28,248,22,172,13,23,195,2,10,248,22,173,13,23,195,2,11,12,250,22, +135,9,23,196,2,2,21,23,197,2,28,248,22,172,13,23,195,2,12,248,22, +168,11,249,22,174,10,248,22,191,6,250,22,146,7,2,22,23,200,1,23,201, +1,247,22,23,87,94,87,94,28,28,248,22,150,13,23,195,2,10,28,248,22, +162,6,23,195,2,28,248,22,172,13,23,195,2,10,248,22,173,13,23,195,2, +11,12,250,22,135,9,195,2,21,23,197,2,28,248,22,172,13,23,195,2,12, +248,22,168,11,249,22,174,10,248,22,191,6,250,22,146,7,2,22,199,23,201, +1,247,22,23,249,22,3,89,162,8,44,36,49,9,223,2,33,33,196,87,94, +28,28,248,22,150,13,23,194,2,10,28,248,22,162,6,23,194,2,28,248,22, +172,13,23,194,2,10,248,22,173,13,23,194,2,11,12,250,22,135,9,2,6, +2,21,23,196,2,28,248,22,172,13,23,194,2,12,248,22,168,11,249,22,174, +10,248,22,191,6,250,22,146,7,2,22,2,6,23,200,1,247,22,23,32,36, +89,162,8,44,39,54,2,23,222,33,37,28,248,22,75,23,197,2,87,94,23, +196,1,248,22,168,11,249,22,143,11,251,22,146,7,2,24,2,6,28,248,22, +75,23,203,2,87,94,23,202,1,23,201,1,250,22,1,22,168,13,23,204,1, +23,205,1,23,200,1,247,22,23,27,249,22,168,13,248,22,68,23,200,2,23, +197,2,28,248,22,163,13,23,194,2,27,250,22,1,22,168,13,23,197,1,199, +28,248,22,163,13,193,192,251,2,36,198,199,200,248,22,69,202,251,2,36,197, +198,199,248,22,69,201,87,94,87,94,87,94,28,28,248,22,150,13,193,10,28, +248,22,162,6,193,28,248,22,172,13,193,10,248,22,173,13,193,11,12,250,22, +135,9,2,6,2,21,195,28,248,22,172,13,193,12,248,22,168,11,249,22,174, +10,248,22,191,6,250,22,146,7,2,22,2,6,199,247,22,23,249,22,3,32, +0,89,162,8,44,36,48,9,222,33,35,195,27,247,22,128,14,251,2,36,196, +197,198,196,32,39,89,162,43,41,58,2,23,222,33,40,28,248,22,75,23,199, +2,87,94,23,198,1,248,23,196,1,251,22,146,7,2,24,23,199,1,28,248, 22,75,23,203,2,87,94,23,202,1,23,201,1,250,22,1,22,168,13,23,204, -1,23,205,1,23,200,1,247,22,23,27,249,22,168,13,248,22,68,23,200,2, -23,197,2,28,248,22,163,13,23,194,2,27,250,22,1,22,168,13,23,197,1, -23,200,2,28,248,22,163,13,23,194,2,192,87,94,23,193,1,27,248,22,69, -23,200,1,28,248,22,75,23,194,2,87,94,23,193,1,248,22,168,11,249,22, -143,11,251,22,146,7,2,24,2,6,28,248,22,75,23,206,2,87,94,23,205, -1,23,204,1,250,22,1,22,168,13,23,207,1,23,208,1,23,203,1,247,22, -23,27,249,22,168,13,248,22,68,23,197,2,23,200,2,28,248,22,163,13,23, -194,2,27,250,22,1,22,168,13,23,197,1,202,28,248,22,163,13,193,192,251, -2,37,201,202,203,248,22,69,199,251,2,37,200,201,202,248,22,69,198,87,94, -23,193,1,27,248,22,69,23,199,1,28,248,22,75,23,194,2,87,94,23,193, -1,248,22,168,11,249,22,143,11,251,22,146,7,2,24,2,6,28,248,22,75, -23,205,2,87,94,23,204,1,23,203,1,250,22,1,22,168,13,23,206,1,23, -207,1,23,202,1,247,22,23,27,249,22,168,13,248,22,68,23,197,2,23,199, -2,28,248,22,163,13,23,194,2,27,250,22,1,22,168,13,23,197,1,201,28, -248,22,163,13,193,192,251,2,37,200,201,202,248,22,69,199,251,2,37,199,200, -201,248,22,69,198,87,94,87,94,87,94,28,27,248,22,150,13,194,28,23,193, -2,192,87,94,23,193,1,28,248,22,162,6,194,27,248,22,172,13,195,28,23, -193,2,192,87,94,23,193,1,248,22,173,13,195,11,12,250,22,135,9,2,6, -2,21,195,28,248,22,172,13,193,12,248,22,168,11,249,22,174,10,248,22,191, -6,250,22,146,7,2,22,2,6,199,247,22,23,249,22,3,32,0,89,162,8, -44,36,48,9,222,33,36,195,27,247,22,128,14,251,2,37,196,197,198,196,32, -40,89,162,43,41,58,2,23,222,33,41,28,248,22,75,23,199,2,87,94,23, -198,1,248,23,196,1,251,22,146,7,2,24,23,199,1,28,248,22,75,23,203, -2,87,94,23,202,1,23,201,1,250,22,1,22,168,13,23,204,1,23,205,1, -23,198,1,27,249,22,168,13,248,22,68,23,202,2,23,199,2,28,248,22,163, -13,23,194,2,27,250,22,1,22,168,13,23,197,1,23,202,2,28,248,22,163, -13,23,194,2,192,87,94,23,193,1,27,248,22,69,23,202,1,28,248,22,75, -23,194,2,87,94,23,193,1,248,23,199,1,251,22,146,7,2,24,23,202,1, -28,248,22,75,23,206,2,87,94,23,205,1,23,204,1,250,22,1,22,168,13, -23,207,1,23,208,1,23,201,1,27,249,22,168,13,248,22,68,23,197,2,23, -202,2,28,248,22,163,13,23,194,2,27,250,22,1,22,168,13,23,197,1,204, -28,248,22,163,13,193,192,253,2,40,203,204,205,206,23,15,248,22,69,201,253, -2,40,202,203,204,205,206,248,22,69,200,87,94,23,193,1,27,248,22,69,23, -201,1,28,248,22,75,23,194,2,87,94,23,193,1,248,23,198,1,251,22,146, -7,2,24,23,201,1,28,248,22,75,23,205,2,87,94,23,204,1,23,203,1, -250,22,1,22,168,13,23,206,1,23,207,1,23,200,1,27,249,22,168,13,248, -22,68,23,197,2,23,201,2,28,248,22,163,13,23,194,2,27,250,22,1,22, -168,13,23,197,1,203,28,248,22,163,13,193,192,253,2,40,202,203,204,205,206, -248,22,69,201,253,2,40,201,202,203,204,205,248,22,69,200,27,247,22,128,14, -253,2,40,198,199,200,201,202,198,87,95,28,28,248,22,151,13,23,194,2,10, -27,248,22,150,13,23,195,2,28,23,193,2,192,87,94,23,193,1,28,248,22, -162,6,23,195,2,27,248,22,172,13,23,196,2,28,23,193,2,192,87,94,23, -193,1,248,22,173,13,23,196,2,11,12,252,22,135,9,23,200,2,2,25,35, -23,198,2,23,199,2,28,28,248,22,162,6,23,195,2,10,248,22,150,7,23, -195,2,87,94,23,194,1,12,252,22,135,9,23,200,2,2,26,36,23,198,2, -23,199,1,91,159,38,11,90,161,38,35,11,248,22,171,13,23,197,2,87,94, -23,195,1,87,94,28,192,12,250,22,136,9,23,201,1,2,27,23,199,1,249, -22,7,194,195,91,159,37,11,90,161,37,35,11,87,95,28,28,248,22,151,13, -23,196,2,10,27,248,22,150,13,23,197,2,28,23,193,2,192,87,94,23,193, -1,28,248,22,162,6,23,197,2,27,248,22,172,13,23,198,2,28,23,193,2, -192,87,94,23,193,1,248,22,173,13,23,198,2,11,12,252,22,135,9,2,9, -2,25,35,23,200,2,23,201,2,28,28,248,22,162,6,23,197,2,10,248,22, -150,7,23,197,2,12,252,22,135,9,2,9,2,26,36,23,200,2,23,201,2, -91,159,38,11,90,161,38,35,11,248,22,171,13,23,199,2,87,94,23,195,1, -87,94,28,192,12,250,22,136,9,2,9,2,27,23,201,2,249,22,7,194,195, -27,249,22,160,13,250,22,144,14,0,20,35,114,120,35,34,40,63,58,91,46, -93,91,94,46,93,42,124,41,36,34,248,22,156,13,23,201,1,28,248,22,162, -6,23,203,2,249,22,174,7,23,204,1,8,63,23,202,1,28,248,22,151,13, -23,199,2,248,22,152,13,23,199,1,87,94,23,198,1,247,22,153,13,28,248, -22,150,13,194,249,22,168,13,195,194,192,91,159,37,11,90,161,37,35,11,87, -95,28,28,248,22,151,13,23,196,2,10,27,248,22,150,13,23,197,2,28,23, -193,2,192,87,94,23,193,1,28,248,22,162,6,23,197,2,27,248,22,172,13, -23,198,2,28,23,193,2,192,87,94,23,193,1,248,22,173,13,23,198,2,11, -12,252,22,135,9,2,10,2,25,35,23,200,2,23,201,2,28,28,248,22,162, -6,23,197,2,10,248,22,150,7,23,197,2,12,252,22,135,9,2,10,2,26, -36,23,200,2,23,201,2,91,159,38,11,90,161,38,35,11,248,22,171,13,23, -199,2,87,94,23,195,1,87,94,28,192,12,250,22,136,9,2,10,2,27,23, -201,2,249,22,7,194,195,27,249,22,160,13,249,22,160,7,250,22,145,14,0, -9,35,114,120,35,34,91,46,93,34,248,22,156,13,23,203,1,6,1,1,95, -28,248,22,162,6,23,202,2,249,22,174,7,23,203,1,8,63,23,201,1,28, -248,22,151,13,23,199,2,248,22,152,13,23,199,1,87,94,23,198,1,247,22, -153,13,28,248,22,150,13,194,249,22,168,13,195,194,192,249,247,22,129,5,194, -11,249,80,159,37,46,36,9,9,249,80,159,37,46,36,195,9,27,247,22,130, -14,249,80,158,38,47,28,23,195,2,27,248,22,179,7,6,11,11,80,76,84, -67,79,76,76,69,67,84,83,28,192,192,6,0,0,6,0,0,27,28,23,196, -1,250,22,168,13,248,22,190,13,69,97,100,100,111,110,45,100,105,114,247,22, -177,7,6,8,8,99,111,108,108,101,99,116,115,11,27,248,80,159,41,52,36, -250,22,81,23,203,1,248,22,77,248,22,190,13,72,99,111,108,108,101,99,116, -115,45,100,105,114,23,204,1,28,193,249,22,67,195,194,192,32,50,89,162,8, -44,38,58,2,18,222,33,51,27,249,22,137,14,23,197,2,23,198,2,28,23, -193,2,87,94,23,196,1,27,248,22,92,23,195,2,27,27,248,22,101,23,197, -1,27,249,22,137,14,23,201,2,23,196,2,28,23,193,2,87,94,23,194,1, -27,248,22,92,23,195,2,27,27,248,22,101,23,197,1,27,249,22,137,14,23, -205,2,23,196,2,28,23,193,2,87,94,23,194,1,27,248,22,92,23,195,2, -27,250,2,50,23,207,2,23,208,1,248,22,101,23,199,1,28,249,22,156,7, -23,196,2,2,28,249,22,81,23,206,2,194,249,22,67,248,22,159,13,23,197, -1,194,87,95,23,203,1,23,193,1,28,249,22,156,7,23,196,2,2,28,249, -22,81,23,204,2,9,249,22,67,248,22,159,13,23,197,1,9,28,249,22,156, -7,23,196,2,2,28,249,22,81,23,202,2,194,249,22,67,248,22,159,13,23, -197,1,194,87,94,23,193,1,28,249,22,156,7,23,196,2,2,28,249,22,81, -23,200,2,9,249,22,67,248,22,159,13,23,197,1,9,28,249,22,156,7,23, -196,2,2,28,249,22,81,197,194,87,94,23,196,1,249,22,67,248,22,159,13, -23,197,1,194,87,94,23,193,1,28,249,22,156,7,23,198,2,2,28,249,22, -81,195,9,87,94,23,194,1,249,22,67,248,22,159,13,23,199,1,9,87,95, -28,28,248,22,150,7,194,10,248,22,162,6,194,12,250,22,135,9,2,13,6, -21,21,98,121,116,101,32,115,116,114,105,110,103,32,111,114,32,115,116,114,105, -110,103,196,28,28,248,22,76,195,249,22,4,22,150,13,196,11,12,250,22,135, -9,2,13,6,13,13,108,105,115,116,32,111,102,32,112,97,116,104,115,197,250, -2,50,197,195,28,248,22,162,6,197,248,22,173,7,197,196,32,53,89,162,43, -38,8,26,70,102,111,117,110,100,45,101,120,101,99,222,33,54,28,23,193,2, -91,159,38,11,90,161,38,35,11,248,22,171,13,23,199,2,87,95,23,195,1, -23,194,1,27,28,23,198,2,27,248,22,176,13,23,201,2,28,249,22,169,8, -23,195,2,23,202,2,11,28,248,22,172,13,23,194,2,27,249,22,168,13,23, -198,2,23,196,1,28,23,199,2,91,159,38,11,90,161,38,35,11,248,22,171, -13,23,197,2,87,95,23,195,1,23,194,1,27,28,23,204,2,27,248,22,176, -13,23,199,2,28,249,22,169,8,23,195,2,23,200,2,11,28,248,22,172,13, -23,194,2,250,2,53,23,207,2,23,208,2,249,22,168,13,23,200,2,23,198, -1,250,2,53,23,207,2,23,208,2,23,196,1,11,28,23,193,2,192,87,94, -23,193,1,27,28,248,22,150,13,23,196,2,27,249,22,168,13,23,198,2,23, -207,2,28,28,248,22,163,13,193,10,248,22,162,13,193,192,11,11,28,23,193, -2,192,87,94,23,193,1,28,23,205,2,11,27,248,22,176,13,23,200,2,28, -249,22,169,8,23,195,2,23,201,1,11,28,248,22,172,13,23,194,2,250,2, -53,23,208,2,23,209,2,249,22,168,13,23,201,1,23,198,1,87,94,23,196, -1,250,2,53,23,208,2,23,209,2,23,196,1,192,28,23,198,2,91,159,38, +1,23,205,1,23,198,1,27,249,22,168,13,248,22,68,23,202,2,23,199,2, +28,248,22,163,13,23,194,2,27,250,22,1,22,168,13,23,197,1,23,202,2, +28,248,22,163,13,23,194,2,192,87,94,23,193,1,27,248,22,69,23,202,1, +28,248,22,75,23,194,2,87,94,23,193,1,248,23,199,1,251,22,146,7,2, +24,23,202,1,28,248,22,75,23,206,2,87,94,23,205,1,23,204,1,250,22, +1,22,168,13,23,207,1,23,208,1,23,201,1,27,249,22,168,13,248,22,68, +23,197,2,23,202,2,28,248,22,163,13,23,194,2,27,250,22,1,22,168,13, +23,197,1,204,28,248,22,163,13,193,192,253,2,39,203,204,205,206,23,15,248, +22,69,201,253,2,39,202,203,204,205,206,248,22,69,200,87,94,23,193,1,27, +248,22,69,23,201,1,28,248,22,75,23,194,2,87,94,23,193,1,248,23,198, +1,251,22,146,7,2,24,23,201,1,28,248,22,75,23,205,2,87,94,23,204, +1,23,203,1,250,22,1,22,168,13,23,206,1,23,207,1,23,200,1,27,249, +22,168,13,248,22,68,23,197,2,23,201,2,28,248,22,163,13,23,194,2,27, +250,22,1,22,168,13,23,197,1,203,28,248,22,163,13,193,192,253,2,39,202, +203,204,205,206,248,22,69,201,253,2,39,201,202,203,204,205,248,22,69,200,27, +247,22,128,14,253,2,39,198,199,200,201,202,198,87,95,28,28,248,22,151,13, +23,194,2,10,28,248,22,150,13,23,194,2,10,28,248,22,162,6,23,194,2, +28,248,22,172,13,23,194,2,10,248,22,173,13,23,194,2,11,12,252,22,135, +9,23,200,2,2,25,35,23,198,2,23,199,2,28,28,248,22,162,6,23,195, +2,10,248,22,150,7,23,195,2,87,94,23,194,1,12,252,22,135,9,23,200, +2,2,26,36,23,198,2,23,199,1,91,159,38,11,90,161,38,35,11,248,22, +171,13,23,197,2,87,94,23,195,1,87,94,28,192,12,250,22,136,9,23,201, +1,2,27,23,199,1,249,22,7,194,195,91,159,37,11,90,161,37,35,11,87, +95,28,28,248,22,151,13,23,196,2,10,28,248,22,150,13,23,196,2,10,28, +248,22,162,6,23,196,2,28,248,22,172,13,23,196,2,10,248,22,173,13,23, +196,2,11,12,252,22,135,9,2,9,2,25,35,23,200,2,23,201,2,28,28, +248,22,162,6,23,197,2,10,248,22,150,7,23,197,2,12,252,22,135,9,2, +9,2,26,36,23,200,2,23,201,2,91,159,38,11,90,161,38,35,11,248,22, +171,13,23,199,2,87,94,23,195,1,87,94,28,192,12,250,22,136,9,2,9, +2,27,23,201,2,249,22,7,194,195,27,249,22,160,13,250,22,144,14,0,20, +35,114,120,35,34,40,63,58,91,46,93,91,94,46,93,42,124,41,36,34,248, +22,156,13,23,201,1,28,248,22,162,6,23,203,2,249,22,174,7,23,204,1, +8,63,23,202,1,28,248,22,151,13,23,199,2,248,22,152,13,23,199,1,87, +94,23,198,1,247,22,153,13,28,248,22,150,13,194,249,22,168,13,195,194,192, +91,159,37,11,90,161,37,35,11,87,95,28,28,248,22,151,13,23,196,2,10, +28,248,22,150,13,23,196,2,10,28,248,22,162,6,23,196,2,28,248,22,172, +13,23,196,2,10,248,22,173,13,23,196,2,11,12,252,22,135,9,2,10,2, +25,35,23,200,2,23,201,2,28,28,248,22,162,6,23,197,2,10,248,22,150, +7,23,197,2,12,252,22,135,9,2,10,2,26,36,23,200,2,23,201,2,91, +159,38,11,90,161,38,35,11,248,22,171,13,23,199,2,87,94,23,195,1,87, +94,28,192,12,250,22,136,9,2,10,2,27,23,201,2,249,22,7,194,195,27, +249,22,160,13,249,22,160,7,250,22,145,14,0,9,35,114,120,35,34,91,46, +93,34,248,22,156,13,23,203,1,6,1,1,95,28,248,22,162,6,23,202,2, +249,22,174,7,23,203,1,8,63,23,201,1,28,248,22,151,13,23,199,2,248, +22,152,13,23,199,1,87,94,23,198,1,247,22,153,13,28,248,22,150,13,194, +249,22,168,13,195,194,192,249,247,22,129,5,194,11,249,80,159,37,46,36,9, +9,249,80,159,37,46,36,195,9,27,247,22,130,14,249,80,158,38,47,28,23, +195,2,27,248,22,179,7,6,11,11,80,76,84,67,79,76,76,69,67,84,83, +28,192,192,6,0,0,6,0,0,27,28,23,196,1,250,22,168,13,248,22,190, +13,69,97,100,100,111,110,45,100,105,114,247,22,177,7,6,8,8,99,111,108, +108,101,99,116,115,11,27,248,80,159,41,52,36,250,22,81,23,203,1,248,22, +77,248,22,190,13,72,99,111,108,108,101,99,116,115,45,100,105,114,23,204,1, +28,193,249,22,67,195,194,192,32,49,89,162,8,44,38,51,2,18,222,33,52, +32,50,89,162,8,44,38,46,69,99,111,110,115,45,112,97,116,104,222,33,51, +28,249,22,156,7,23,196,2,5,0,249,22,81,194,196,87,94,23,193,1,249, +22,67,248,22,159,13,23,197,1,196,27,249,22,137,14,23,197,2,23,198,2, +28,23,193,2,87,94,23,196,1,250,2,50,23,197,2,248,22,92,23,197,2, +250,2,49,23,200,1,23,201,1,248,22,101,23,200,1,250,2,50,196,198,9, +87,95,28,28,248,22,150,7,194,10,248,22,162,6,194,12,250,22,135,9,2, +13,6,21,21,98,121,116,101,32,115,116,114,105,110,103,32,111,114,32,115,116, +114,105,110,103,196,28,28,248,22,76,195,249,22,4,22,150,13,196,11,12,250, +22,135,9,2,13,6,13,13,108,105,115,116,32,111,102,32,112,97,116,104,115, +197,250,2,49,197,195,28,248,22,162,6,197,248,22,173,7,197,196,32,54,89, +162,8,44,38,52,70,102,111,117,110,100,45,101,120,101,99,222,33,57,32,55, +89,162,8,44,39,57,64,110,101,120,116,222,33,56,27,248,22,176,13,23,196, +2,28,249,22,169,8,23,195,2,23,197,1,11,28,248,22,172,13,23,194,2, +27,249,22,168,13,23,197,1,23,196,1,28,23,197,2,91,159,38,11,90,161, +38,35,11,248,22,171,13,23,197,2,87,95,23,195,1,23,194,1,27,28,23, +202,2,27,248,22,176,13,23,199,2,28,249,22,169,8,23,195,2,23,200,2, +11,28,248,22,172,13,23,194,2,250,2,54,23,205,2,23,206,2,249,22,168, +13,23,200,2,23,198,1,250,2,54,23,205,2,23,206,2,23,196,1,11,28, +23,193,2,192,87,94,23,193,1,27,28,248,22,150,13,23,196,2,27,249,22, +168,13,23,198,2,23,205,2,28,28,248,22,163,13,193,10,248,22,162,13,193, +192,11,11,28,23,193,2,192,87,94,23,193,1,28,23,203,2,11,27,248,22, +176,13,23,200,2,28,249,22,169,8,23,195,2,23,201,1,11,28,248,22,172, +13,23,194,2,250,2,54,23,206,1,23,207,1,249,22,168,13,23,201,1,23, +198,1,250,2,54,205,206,195,192,87,94,23,194,1,28,23,196,2,91,159,38, 11,90,161,38,35,11,248,22,171,13,23,197,2,87,95,23,195,1,23,194,1, -27,28,23,203,2,27,248,22,176,13,23,199,2,28,249,22,169,8,23,195,2, -23,200,2,11,28,248,22,172,13,23,194,2,250,2,53,23,206,2,23,207,2, -249,22,168,13,23,200,2,23,198,1,250,2,53,23,206,2,23,207,2,23,196, +27,28,23,201,2,27,248,22,176,13,23,199,2,28,249,22,169,8,23,195,2, +23,200,2,11,28,248,22,172,13,23,194,2,250,2,54,23,204,2,23,205,2, +249,22,168,13,23,200,2,23,198,1,250,2,54,23,204,2,23,205,2,23,196, 1,11,28,23,193,2,192,87,94,23,193,1,27,28,248,22,150,13,23,196,2, -27,249,22,168,13,23,198,2,23,206,2,28,28,248,22,163,13,193,10,248,22, -162,13,193,192,11,11,28,23,193,2,192,87,94,23,193,1,28,23,204,2,11, +27,249,22,168,13,23,198,2,23,204,2,28,28,248,22,163,13,193,10,248,22, +162,13,193,192,11,11,28,23,193,2,192,87,94,23,193,1,28,23,202,2,11, 27,248,22,176,13,23,200,2,28,249,22,169,8,23,195,2,23,201,1,11,28, -248,22,172,13,23,194,2,250,2,53,23,207,2,23,208,2,249,22,168,13,23, -201,1,23,198,1,87,94,23,196,1,250,2,53,23,207,2,23,208,2,23,196, -1,192,11,28,23,193,2,192,87,94,23,193,1,27,28,248,22,150,13,23,196, -2,27,249,22,168,13,23,198,2,23,201,2,28,28,248,22,163,13,193,10,248, -22,162,13,193,192,11,11,28,23,193,2,192,87,94,23,193,1,28,23,199,2, -11,27,248,22,176,13,23,202,2,28,249,22,169,8,23,195,2,23,203,1,11, -28,248,22,172,13,23,194,2,27,249,22,168,13,23,199,1,23,196,1,28,23, -200,2,91,159,38,11,90,161,38,35,11,248,22,171,13,23,197,2,87,95,23, -195,1,23,194,1,27,28,23,205,2,27,248,22,176,13,23,199,2,28,249,22, -169,8,23,195,2,23,200,2,11,28,248,22,172,13,23,194,2,250,2,53,23, -208,2,23,209,2,249,22,168,13,23,200,2,23,198,1,250,2,53,23,208,2, -23,209,2,23,196,1,11,28,23,193,2,192,87,94,23,193,1,27,28,248,22, -150,13,23,196,2,27,249,22,168,13,23,198,2,23,208,2,28,28,248,22,163, -13,193,10,248,22,162,13,193,192,11,11,28,23,193,2,192,87,94,23,193,1, -28,23,206,2,11,27,248,22,176,13,23,200,2,28,249,22,169,8,23,195,2, -23,201,1,11,28,248,22,172,13,23,194,2,250,2,53,23,209,1,23,210,1, -249,22,168,13,23,201,1,23,198,1,250,2,53,23,16,23,17,195,192,87,94, -23,196,1,28,23,199,2,91,159,38,11,90,161,38,35,11,248,22,171,13,23, -197,2,87,95,23,195,1,23,194,1,27,28,23,204,2,27,248,22,176,13,23, -199,2,28,249,22,169,8,23,195,2,23,200,2,11,28,248,22,172,13,23,194, -2,250,2,53,23,207,2,23,208,2,249,22,168,13,23,200,2,23,198,1,250, -2,53,23,207,2,23,208,2,23,196,1,11,28,23,193,2,192,87,94,23,193, -1,27,28,248,22,150,13,23,196,2,27,249,22,168,13,23,198,2,23,207,2, -28,28,248,22,163,13,193,10,248,22,162,13,193,192,11,11,28,23,193,2,192, -87,94,23,193,1,28,23,205,2,11,27,248,22,176,13,23,200,2,28,249,22, -169,8,23,195,2,23,201,1,11,28,248,22,172,13,23,194,2,250,2,53,23, -208,1,23,209,1,249,22,168,13,23,201,1,23,198,1,250,2,53,23,15,23, -16,195,192,194,32,55,89,162,43,39,8,31,2,18,222,33,56,28,248,22,75, -23,197,2,11,27,248,22,175,13,248,22,68,23,199,2,27,249,22,168,13,23, -196,1,23,197,2,28,248,22,162,13,23,194,2,250,2,53,198,199,195,87,94, -23,193,1,27,248,22,69,23,200,1,28,248,22,75,23,194,2,11,27,248,22, -175,13,248,22,68,23,196,2,27,249,22,168,13,23,196,1,23,200,2,28,248, -22,162,13,23,194,2,250,2,53,201,202,195,87,94,23,193,1,27,248,22,69, -23,197,1,28,248,22,75,23,194,2,11,27,248,22,175,13,248,22,68,23,196, -2,27,249,22,168,13,23,196,1,23,203,2,28,248,22,162,13,23,194,2,250, -2,53,204,205,195,87,94,23,193,1,27,248,22,69,23,197,1,28,248,22,75, -23,194,2,11,27,248,22,175,13,248,22,68,23,196,2,27,249,22,168,13,23, -196,1,23,206,2,28,248,22,162,13,23,194,2,250,2,53,23,15,23,16,195, -87,94,23,193,1,27,248,22,69,23,197,1,28,248,22,75,23,194,2,11,27, -248,22,175,13,248,22,68,23,196,2,27,249,22,168,13,23,196,1,23,209,2, -28,248,22,162,13,23,194,2,250,2,53,23,18,23,19,195,87,94,23,193,1, -27,248,22,69,23,197,1,28,248,22,75,23,194,2,11,27,248,22,175,13,248, -22,68,195,27,249,22,168,13,23,196,1,23,19,28,248,22,162,13,193,250,2, -53,23,21,23,22,195,251,2,55,23,21,23,22,23,23,248,22,69,199,87,95, -28,27,248,22,150,13,23,196,2,28,23,193,2,192,87,94,23,193,1,28,248, -22,162,6,23,196,2,27,248,22,172,13,23,197,2,28,23,193,2,192,87,94, -23,193,1,248,22,173,13,23,197,2,11,12,250,22,135,9,2,14,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,23,197,2,28,28,23,195,2,28,27,248,22,150,13,23,197,2, -28,23,193,2,192,87,94,23,193,1,28,248,22,162,6,23,197,2,27,248,22, -172,13,23,198,2,28,23,193,2,192,87,94,23,193,1,248,22,173,13,23,198, -2,11,248,22,172,13,23,196,2,11,10,12,250,22,135,9,2,14,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,23,198,2,28,28,248,22,172,13,23,195,2,91, -159,38,11,90,161,38,35,11,248,22,171,13,23,198,2,249,22,167,8,194,68, -114,101,108,97,116,105,118,101,11,27,248,22,179,7,6,4,4,80,65,84,72, -27,28,23,194,2,27,249,80,159,40,47,37,23,197,1,9,28,249,22,167,8, -247,22,181,7,2,20,249,22,67,248,22,159,13,5,1,46,194,192,87,94,23, -194,1,9,28,248,22,75,23,194,2,11,27,248,22,175,13,248,22,68,23,196, -2,27,249,22,168,13,23,196,1,23,200,2,28,248,22,162,13,23,194,2,250, -2,53,201,202,195,87,94,23,193,1,27,248,22,69,23,197,1,28,248,22,75, -23,194,2,11,27,248,22,175,13,248,22,68,23,196,2,27,249,22,168,13,23, -196,1,23,203,2,28,248,22,162,13,23,194,2,250,2,53,204,205,195,87,94, -23,193,1,27,248,22,69,23,197,1,28,248,22,75,23,194,2,11,27,248,22, -175,13,248,22,68,195,27,249,22,168,13,23,196,1,205,28,248,22,162,13,193, -250,2,53,23,15,23,16,195,251,2,55,23,15,23,16,23,17,248,22,69,199, -27,248,22,175,13,23,196,1,28,248,22,162,13,193,250,2,53,198,199,195,11, -250,80,159,38,48,36,196,197,11,250,80,159,38,48,36,196,11,11,87,94,249, -22,153,6,247,22,189,4,195,248,22,179,5,249,22,174,3,35,249,22,158,3, -197,198,27,28,23,197,2,87,95,23,196,1,23,195,1,23,197,1,87,94,23, -197,1,27,248,22,190,13,2,19,27,249,80,159,40,48,36,23,196,1,11,27, -27,248,22,177,3,23,200,1,28,192,192,35,27,27,248,22,177,3,23,202,1, -28,192,192,35,249,22,156,5,23,197,1,83,158,39,20,97,95,89,162,8,44, -35,47,9,224,3,2,33,60,23,195,1,23,196,1,27,248,22,141,5,23,195, -1,248,80,159,38,53,36,193,159,35,20,102,159,35,16,1,11,16,0,83,158, -41,20,100,144,67,35,37,117,116,105,108,115,29,11,11,11,11,11,10,42,80, -158,35,35,20,102,159,37,16,17,2,1,2,2,2,3,2,4,2,5,2,6, -2,7,2,8,2,9,2,10,2,11,2,12,2,13,2,14,2,15,30,2,17, -1,20,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111,110,45,107,101, -121,4,30,2,17,1,23,101,120,116,101,110,100,45,112,97,114,97,109,101,116, -101,114,105,122,97,116,105,111,110,3,16,0,16,0,35,16,0,35,16,4,2, -5,2,4,2,2,2,8,39,11,11,38,35,11,11,11,16,11,2,7,2,6, -2,15,2,14,2,12,2,11,2,3,2,10,2,13,2,9,2,1,16,11,11, -11,11,11,11,11,11,11,11,11,11,16,11,2,7,2,6,2,15,2,14,2, -12,2,11,2,3,2,10,2,13,2,9,2,1,46,46,36,11,11,11,16,0, -16,0,16,0,35,35,11,11,11,11,16,0,16,0,16,0,35,35,16,0,16, -17,83,158,35,16,2,89,162,43,36,48,2,18,223,0,33,29,80,159,35,53, -36,83,158,35,16,2,89,162,8,44,36,55,2,18,223,0,33,30,80,159,35, -52,36,83,158,35,16,2,32,0,89,162,43,36,44,2,1,222,33,31,80,159, -35,35,36,83,158,35,16,2,249,22,164,6,7,92,7,92,80,159,35,36,36, -83,158,35,16,2,89,162,43,36,53,2,3,223,0,33,32,80,159,35,37,36, -83,158,35,16,2,32,0,89,162,8,44,37,49,2,4,222,33,33,80,159,35, -38,36,83,158,35,16,2,32,0,89,162,8,44,38,50,2,5,222,33,35,80, -159,35,39,36,83,158,35,16,2,32,0,89,162,8,45,37,49,2,6,222,33, -39,80,159,35,40,36,83,158,35,16,2,32,0,89,162,43,39,51,2,7,222, -33,42,80,159,35,41,36,83,158,35,16,2,32,0,89,162,43,38,49,2,8, -222,33,43,80,159,35,42,36,83,158,35,16,2,32,0,89,162,43,37,52,2, -9,222,33,44,80,159,35,43,36,83,158,35,16,2,32,0,89,162,43,37,53, -2,10,222,33,45,80,159,35,44,36,83,158,35,16,2,32,0,89,162,43,36, -43,2,11,222,33,46,80,159,35,45,36,83,158,35,16,2,83,158,38,20,96, -96,2,12,89,162,43,35,43,9,223,0,33,47,89,162,43,36,44,9,223,0, -33,48,89,162,43,37,54,9,223,0,33,49,80,159,35,46,36,83,158,35,16, -2,27,248,22,133,14,248,22,173,7,27,28,249,22,167,8,247,22,181,7,2, -20,6,1,1,59,6,1,1,58,250,22,146,7,6,14,14,40,91,94,126,97, -93,42,41,126,97,40,46,42,41,23,196,2,23,196,1,89,162,8,44,37,47, -2,13,223,0,33,52,80,159,35,47,36,83,158,35,16,2,83,158,38,20,96, -96,2,14,89,162,43,38,59,9,223,0,33,57,89,162,43,37,46,9,223,0, -33,58,89,162,43,36,45,9,223,0,33,59,80,159,35,48,36,83,158,35,16, -2,89,162,43,38,51,2,15,223,0,33,61,80,159,35,49,36,94,29,94,2, -16,68,35,37,107,101,114,110,101,108,11,29,94,2,16,69,35,37,109,105,110, -45,115,116,120,11,9,9,9,35,0}; - EVAL_ONE_SIZED_STR((char *)expr, 6834); +248,22,172,13,23,194,2,250,2,54,23,205,1,23,206,1,249,22,168,13,23, +201,1,23,198,1,250,2,54,204,205,195,192,28,23,193,2,91,159,38,11,90, +161,38,35,11,248,22,171,13,23,199,2,87,95,23,195,1,23,194,1,27,28, +23,198,2,251,2,55,23,198,2,23,203,2,23,201,2,23,202,2,11,28,23, +193,2,192,87,94,23,193,1,27,28,248,22,150,13,195,27,249,22,168,13,197, +200,28,28,248,22,163,13,193,10,248,22,162,13,193,192,11,11,28,192,192,28, +198,11,251,2,55,198,203,201,202,194,32,58,89,162,8,44,39,54,2,18,222, +33,59,28,248,22,75,23,197,2,11,27,248,22,175,13,248,22,68,23,199,2, +27,249,22,168,13,23,196,1,23,197,2,28,248,22,162,13,23,194,2,250,2, +54,198,199,195,87,94,23,193,1,27,248,22,69,23,200,1,28,248,22,75,23, +194,2,11,27,248,22,175,13,248,22,68,195,27,249,22,168,13,23,196,1,199, +28,248,22,162,13,193,250,2,54,201,202,195,251,2,58,201,202,203,248,22,69, +199,87,95,28,28,248,22,150,13,23,195,2,10,28,248,22,162,6,23,195,2, +28,248,22,172,13,23,195,2,10,248,22,173,13,23,195,2,11,12,250,22,135, +9,2,14,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,23,197,2,28,28,23,195,2,28,28,248, +22,150,13,23,196,2,10,28,248,22,162,6,23,196,2,28,248,22,172,13,23, +196,2,10,248,22,173,13,23,196,2,11,248,22,172,13,23,196,2,11,10,12, +250,22,135,9,2,14,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,23,198,2,28, +28,248,22,172,13,23,195,2,91,159,38,11,90,161,38,35,11,248,22,171,13, +23,198,2,249,22,167,8,194,68,114,101,108,97,116,105,118,101,11,27,248,22, +179,7,6,4,4,80,65,84,72,27,28,23,194,2,27,249,80,159,40,47,37, +23,197,1,9,28,249,22,167,8,247,22,181,7,2,20,249,22,67,248,22,159, +13,5,1,46,194,192,87,94,23,194,1,9,28,248,22,75,23,194,2,11,27, +248,22,175,13,248,22,68,23,196,2,27,249,22,168,13,23,196,1,23,200,2, +28,248,22,162,13,23,194,2,250,2,54,201,202,195,87,94,23,193,1,27,248, +22,69,23,197,1,28,248,22,75,23,194,2,11,27,248,22,175,13,248,22,68, +195,27,249,22,168,13,23,196,1,202,28,248,22,162,13,193,250,2,54,204,205, +195,251,2,58,204,205,206,248,22,69,199,27,248,22,175,13,23,196,1,28,248, +22,162,13,193,250,2,54,198,199,195,11,250,80,159,38,48,36,196,197,11,250, +80,159,38,48,36,196,11,11,87,94,249,22,153,6,247,22,189,4,195,248,22, +179,5,249,22,174,3,35,249,22,158,3,197,198,27,28,23,197,2,87,95,23, +196,1,23,195,1,23,197,1,87,94,23,197,1,27,248,22,190,13,2,19,27, +249,80,159,40,48,36,23,196,1,11,27,27,248,22,177,3,23,200,1,28,192, +192,35,27,27,248,22,177,3,23,202,1,28,192,192,35,249,22,156,5,23,197, +1,83,158,39,20,97,95,89,162,8,44,35,47,9,224,3,2,33,63,23,195, +1,23,196,1,27,248,22,141,5,23,195,1,248,80,159,38,53,36,193,159,35, +20,102,159,35,16,1,11,16,0,83,158,41,20,100,144,67,35,37,117,116,105, +108,115,29,11,11,11,11,11,10,42,80,158,35,35,20,102,159,37,16,17,2, +1,2,2,2,3,2,4,2,5,2,6,2,7,2,8,2,9,2,10,2,11, +2,12,2,13,2,14,2,15,30,2,17,1,20,112,97,114,97,109,101,116,101, +114,105,122,97,116,105,111,110,45,107,101,121,4,30,2,17,1,23,101,120,116, +101,110,100,45,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111,110,3, +16,0,16,0,35,16,0,35,16,4,2,5,2,4,2,2,2,8,39,11,11, +38,35,11,11,11,16,11,2,7,2,6,2,15,2,14,2,12,2,11,2,3, +2,10,2,13,2,9,2,1,16,11,11,11,11,11,11,11,11,11,11,11,11, +16,11,2,7,2,6,2,15,2,14,2,12,2,11,2,3,2,10,2,13,2, +9,2,1,46,46,36,11,11,11,16,0,16,0,16,0,35,35,11,11,11,11, +16,0,16,0,16,0,35,35,16,0,16,17,83,158,35,16,2,89,162,43,36, +48,2,18,223,0,33,28,80,159,35,53,36,83,158,35,16,2,89,162,8,44, +36,55,2,18,223,0,33,29,80,159,35,52,36,83,158,35,16,2,32,0,89, +162,43,36,44,2,1,222,33,30,80,159,35,35,36,83,158,35,16,2,249,22, +164,6,7,92,7,92,80,159,35,36,36,83,158,35,16,2,89,162,43,36,53, +2,3,223,0,33,31,80,159,35,37,36,83,158,35,16,2,32,0,89,162,8, +44,37,49,2,4,222,33,32,80,159,35,38,36,83,158,35,16,2,32,0,89, +162,8,44,38,50,2,5,222,33,34,80,159,35,39,36,83,158,35,16,2,32, +0,89,162,8,45,37,49,2,6,222,33,38,80,159,35,40,36,83,158,35,16, +2,32,0,89,162,43,39,51,2,7,222,33,41,80,159,35,41,36,83,158,35, +16,2,32,0,89,162,43,38,49,2,8,222,33,42,80,159,35,42,36,83,158, +35,16,2,32,0,89,162,43,37,52,2,9,222,33,43,80,159,35,43,36,83, +158,35,16,2,32,0,89,162,43,37,53,2,10,222,33,44,80,159,35,44,36, +83,158,35,16,2,32,0,89,162,43,36,43,2,11,222,33,45,80,159,35,45, +36,83,158,35,16,2,83,158,38,20,96,96,2,12,89,162,43,35,43,9,223, +0,33,46,89,162,43,36,44,9,223,0,33,47,89,162,43,37,54,9,223,0, +33,48,80,159,35,46,36,83,158,35,16,2,27,248,22,133,14,248,22,173,7, +27,28,249,22,167,8,247,22,181,7,2,20,6,1,1,59,6,1,1,58,250, +22,146,7,6,14,14,40,91,94,126,97,93,42,41,126,97,40,46,42,41,23, +196,2,23,196,1,89,162,8,44,37,47,2,13,223,0,33,53,80,159,35,47, +36,83,158,35,16,2,83,158,38,20,96,96,2,14,89,162,8,44,38,56,9, +223,0,33,60,89,162,43,37,46,9,223,0,33,61,89,162,43,36,45,9,223, +0,33,62,80,159,35,48,36,83,158,35,16,2,89,162,43,38,51,2,15,223, +0,33,64,80,159,35,49,36,94,29,94,2,16,68,35,37,107,101,114,110,101, +108,11,29,94,2,16,69,35,37,109,105,110,45,115,116,120,11,9,9,9,35, +0}; + EVAL_ONE_SIZED_STR((char *)expr, 5439); } { - static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,50,46,51,46,57,8,0,0,0,1,0,0,6,0,19,0, -34,0,48,0,62,0,76,0,118,0,0,0,53,1,0,0,65,113,117,111,116, -101,29,94,2,1,67,35,37,117,116,105,108,115,11,29,94,2,1,69,35,37, -110,101,116,119,111,114,107,11,29,94,2,1,68,35,37,112,97,114,97,109,122, -11,29,94,2,1,68,35,37,101,120,112,111,98,115,11,29,94,2,1,68,35, -37,107,101,114,110,101,108,11,97,35,11,8,240,9,79,0,0,98,159,2,2, -35,35,159,2,3,35,35,159,2,4,35,35,159,2,5,35,35,159,2,6,35, -35,159,2,6,35,35,16,0,159,35,20,102,159,35,16,1,11,16,0,83,158, -41,20,100,144,69,35,37,98,117,105,108,116,105,110,29,11,11,11,11,11,18, -96,11,42,42,42,35,80,158,35,35,20,102,159,35,16,0,16,0,16,0,35, -16,0,35,16,0,35,11,11,38,35,11,11,11,16,0,16,0,16,0,35,35, -36,11,11,11,16,0,16,0,16,0,35,35,11,11,11,11,16,0,16,0,16, -0,35,35,16,0,16,0,102,2,6,2,5,29,94,2,1,69,35,37,102,111, -114,101,105,103,110,11,29,94,2,1,68,35,37,117,110,115,97,102,101,11,29, -94,2,1,69,35,37,102,108,102,120,110,117,109,11,2,4,2,3,2,2,29, -94,2,1,67,35,37,112,108,97,99,101,11,29,94,2,1,69,35,37,102,117, -116,117,114,101,115,11,9,9,9,35,0}; - EVAL_ONE_SIZED_STR((char *)expr, 346); + static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,52,46,50,46,51,46,49,48,8,0,0,0,1,0,0,6,0,19, +0,34,0,48,0,62,0,76,0,118,0,0,0,53,1,0,0,65,113,117,111, +116,101,29,94,2,1,67,35,37,117,116,105,108,115,11,29,94,2,1,69,35, +37,110,101,116,119,111,114,107,11,29,94,2,1,68,35,37,112,97,114,97,109, +122,11,29,94,2,1,68,35,37,101,120,112,111,98,115,11,29,94,2,1,68, +35,37,107,101,114,110,101,108,11,97,35,11,8,240,162,79,0,0,98,159,2, +2,35,35,159,2,3,35,35,159,2,4,35,35,159,2,5,35,35,159,2,6, +35,35,159,2,6,35,35,16,0,159,35,20,102,159,35,16,1,11,16,0,83, +158,41,20,100,144,69,35,37,98,117,105,108,116,105,110,29,11,11,11,11,11, +18,96,11,42,42,42,35,80,158,35,35,20,102,159,35,16,0,16,0,16,0, +35,16,0,35,16,0,35,11,11,38,35,11,11,11,16,0,16,0,16,0,35, +35,36,11,11,11,16,0,16,0,16,0,35,35,11,11,11,11,16,0,16,0, +16,0,35,35,16,0,16,0,102,2,6,2,5,29,94,2,1,69,35,37,102, +111,114,101,105,103,110,11,29,94,2,1,68,35,37,117,110,115,97,102,101,11, +29,94,2,1,69,35,37,102,108,102,120,110,117,109,11,2,4,2,3,2,2, +29,94,2,1,67,35,37,112,108,97,99,101,11,29,94,2,1,69,35,37,102, +117,116,117,114,101,115,11,9,9,9,35,0}; + EVAL_ONE_SIZED_STR((char *)expr, 347); } { - static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,50,46,51,46,57,55,0,0,0,1,0,0,11,0,38,0, -44,0,57,0,66,0,73,0,95,0,117,0,143,0,155,0,173,0,193,0,205, -0,221,0,244,0,0,1,31,1,38,1,43,1,48,1,53,1,58,1,67,1, -72,1,76,1,84,1,93,1,101,1,146,1,166,1,195,1,226,1,26,2,36, -2,83,2,93,2,100,2,243,3,6,4,20,4,78,5,91,5,101,6,143,7, -9,8,15,8,29,8,56,8,141,8,143,8,209,8,191,15,241,15,6,16,0, -0,214,18,0,0,70,100,108,108,45,115,117,102,102,105,120,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,65,113,117,111,116,101,29,94,2,3,67,35,37,117,116,105,108,115,11,68, -35,37,112,97,114,97,109,122,29,94,2,3,2,5,11,1,20,112,97,114,97, -109,101,116,101,114,105,122,97,116,105,111,110,45,107,101,121,1,20,100,101,102, -97,117,108,116,45,114,101,97,100,101,114,45,103,117,97,114,100,1,24,45,109, -111,100,117,108,101,45,104,97,115,104,45,116,97,98,108,101,45,116,97,98,108, -101,71,45,112,97,116,104,45,99,97,99,104,101,77,45,108,111,97,100,105,110, -103,45,102,105,108,101,110,97,109,101,79,45,108,111,97,100,105,110,103,45,112, -114,111,109,112,116,45,116,97,103,71,45,112,114,101,118,45,114,101,108,116,111, -75,45,112,114,101,118,45,114,101,108,116,111,45,100,105,114,1,21,115,112,108, -105,116,45,114,101,108,97,116,105,118,101,45,115,116,114,105,110,103,71,111,114, -105,103,45,112,97,114,97,109,122,1,29,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,29,94, -2,3,2,5,11,64,98,111,111,116,64,115,101,97,108,64,115,97,109,101,5, -3,46,122,111,6,6,6,110,97,116,105,118,101,64,108,111,111,112,63,108,105, -98,67,105,103,110,111,114,101,100,249,22,14,195,80,159,37,45,37,249,80,159, -37,48,36,195,10,20,14,159,80,158,35,39,250,80,158,38,40,249,22,27,11, -80,158,40,39,22,130,5,28,248,22,150,13,23,198,2,23,197,1,87,94,23, -197,1,247,22,191,13,247,194,250,22,168,13,23,197,1,23,199,1,249,80,158, -42,38,23,198,1,2,22,252,22,168,13,23,199,1,23,201,1,2,23,247,22, -182,7,249,80,158,44,38,23,200,1,80,159,44,35,37,87,94,23,194,1,27, -250,22,185,13,196,11,32,0,89,162,8,44,35,40,9,222,11,28,192,249,22, -67,195,194,11,27,252,22,168,13,23,200,1,23,202,1,2,23,247,22,182,7, -249,80,158,45,38,23,201,1,80,159,45,35,37,27,250,22,185,13,196,11,32, -0,89,162,8,44,35,40,9,222,11,28,192,249,22,67,195,194,11,249,247,22, -132,14,248,22,68,195,195,27,250,22,168,13,23,198,1,23,200,1,249,80,158, -43,38,23,199,1,2,22,27,250,22,185,13,196,11,32,0,89,162,8,44,35, -40,9,222,11,28,192,249,22,67,195,194,11,249,247,22,128,5,248,22,68,195, -195,249,247,22,128,5,194,195,87,94,28,248,80,158,36,37,23,195,2,12,250, -22,135,9,77,108,111,97,100,47,117,115,101,45,99,111,109,112,105,108,101,100, -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,23,197,2,91,159,41,11,90,161,36,35,11,28,248, -22,174,13,23,201,2,23,200,1,27,247,22,130,5,28,23,193,2,249,22,175, -13,23,203,1,23,195,1,200,90,161,38,36,11,248,22,171,13,23,194,2,87, -94,23,196,1,90,161,36,39,11,28,249,22,167,8,23,196,2,68,114,101,108, -97,116,105,118,101,87,94,23,194,1,2,21,23,194,1,90,161,36,40,11,247, -22,129,14,27,89,162,43,36,49,62,122,111,225,7,5,3,33,30,27,89,162, -43,36,51,9,225,8,6,4,33,31,27,249,22,5,89,162,8,44,36,46,9, -223,5,33,32,23,203,2,27,28,23,195,1,27,249,22,5,89,162,8,44,36, -52,9,225,13,11,9,33,33,23,205,2,27,28,23,196,2,11,193,28,192,192, -28,193,28,23,196,2,28,249,22,170,3,248,22,69,196,248,22,69,23,199,2, -193,11,11,11,11,28,23,193,2,249,80,159,47,58,36,202,89,162,43,35,45, -9,224,14,2,33,34,87,94,23,193,1,27,28,23,197,1,27,249,22,5,83, -158,39,20,97,94,89,162,8,44,36,50,9,225,14,12,10,33,35,23,203,1, -23,206,1,27,28,196,11,193,28,192,192,28,193,28,196,28,249,22,170,3,248, -22,69,196,248,22,69,199,193,11,11,11,11,28,192,249,80,159,48,58,36,203, -89,162,43,35,45,9,224,15,2,33,36,249,80,159,48,58,36,203,89,162,43, -35,44,9,224,15,7,33,37,0,17,35,114,120,34,94,40,46,42,63,41,47, -40,46,42,41,36,34,32,40,89,162,8,44,36,8,39,2,24,222,33,41,27, -249,22,137,14,2,39,23,196,2,28,23,193,2,87,94,23,194,1,249,22,67, -248,22,92,23,196,2,27,248,22,101,23,197,1,27,249,22,137,14,2,39,23, -196,2,28,23,193,2,87,94,23,194,1,249,22,67,248,22,92,23,196,2,27, -248,22,101,23,197,1,27,249,22,137,14,2,39,23,196,2,28,23,193,2,87, -94,23,194,1,249,22,67,248,22,92,23,196,2,27,248,22,101,23,197,1,27, -249,22,137,14,2,39,23,196,2,28,23,193,2,87,94,23,194,1,249,22,67, -248,22,92,23,196,2,27,248,22,101,23,197,1,27,249,22,137,14,2,39,23, -196,2,28,23,193,2,87,94,23,194,1,249,22,67,248,22,92,23,196,2,27, -248,22,101,23,197,1,27,249,22,137,14,2,39,23,196,2,28,23,193,2,87, -94,23,194,1,249,22,67,248,22,92,23,196,2,27,248,22,101,23,197,1,27, -249,22,137,14,2,39,23,196,2,28,23,193,2,87,94,23,194,1,249,22,67, -248,22,92,23,196,2,27,248,22,101,23,197,1,27,249,22,137,14,2,39,23, -196,2,28,23,193,2,87,94,23,194,1,249,22,67,248,22,92,23,196,2,248, -2,40,248,22,101,23,197,1,248,22,77,194,248,22,77,194,248,22,77,194,248, -22,77,194,248,22,77,194,248,22,77,194,248,22,77,194,248,22,77,194,32,42, -89,162,43,36,8,28,2,24,222,33,43,28,248,22,75,248,22,69,23,195,2, -249,22,7,9,248,22,68,195,91,159,37,11,90,161,37,35,11,27,248,22,69, -196,28,248,22,75,248,22,69,23,195,2,249,22,7,9,248,22,68,195,91,159, -37,11,90,161,37,35,11,27,248,22,69,196,28,248,22,75,248,22,69,23,195, -2,249,22,7,9,248,22,68,195,91,159,37,11,90,161,37,35,11,27,248,22, -69,196,28,248,22,75,248,22,69,23,195,2,249,22,7,9,248,22,68,195,91, -159,37,11,90,161,37,35,11,27,248,22,69,196,28,248,22,75,248,22,69,23, -195,2,249,22,7,9,248,22,68,195,91,159,37,11,90,161,37,35,11,27,248, -22,69,196,28,248,22,75,248,22,69,23,195,2,249,22,7,9,248,22,68,195, -91,159,37,11,90,161,37,35,11,248,2,42,248,22,69,196,249,22,7,249,22, -67,248,22,68,199,196,195,249,22,7,249,22,67,248,22,68,199,196,195,249,22, -7,249,22,67,248,22,68,199,196,195,249,22,7,249,22,67,248,22,68,199,196, -195,249,22,7,249,22,67,248,22,68,199,196,195,249,22,7,249,22,67,248,22, -68,199,196,195,27,27,249,22,137,14,2,39,23,197,2,28,23,193,2,87,94, -23,195,1,249,22,67,248,22,92,23,196,2,27,248,22,101,23,197,1,27,249, -22,137,14,2,39,23,196,2,28,23,193,2,87,94,23,194,1,249,22,67,248, -22,92,23,196,2,27,248,22,101,23,197,1,27,249,22,137,14,2,39,23,196, + static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,8,52,46,50,46,51,46,49,48,67,0,0,0,1,0,0,11,0,38, +0,44,0,57,0,66,0,73,0,95,0,117,0,143,0,155,0,173,0,193,0, +205,0,221,0,244,0,0,1,31,1,38,1,43,1,48,1,53,1,58,1,62, +1,70,1,79,1,124,1,147,1,183,1,214,1,248,1,2,2,36,2,46,2, +53,2,215,3,234,3,247,3,149,4,161,4,39,5,171,5,37,6,43,6,57, +6,70,6,150,6,162,6,208,6,221,6,45,7,57,7,103,7,130,7,143,7, +223,7,235,7,25,8,38,8,118,8,200,8,29,9,31,9,97,9,181,17,231, +17,252,17,0,0,182,20,0,0,70,100,108,108,45,115,117,102,102,105,120,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,65,113,117,111,116,101,29,94,2,3,67,35,37,117,116,105, +108,115,11,68,35,37,112,97,114,97,109,122,29,94,2,3,2,5,11,1,20, +112,97,114,97,109,101,116,101,114,105,122,97,116,105,111,110,45,107,101,121,1, +20,100,101,102,97,117,108,116,45,114,101,97,100,101,114,45,103,117,97,114,100, +1,24,45,109,111,100,117,108,101,45,104,97,115,104,45,116,97,98,108,101,45, +116,97,98,108,101,71,45,112,97,116,104,45,99,97,99,104,101,77,45,108,111, +97,100,105,110,103,45,102,105,108,101,110,97,109,101,79,45,108,111,97,100,105, +110,103,45,112,114,111,109,112,116,45,116,97,103,71,45,112,114,101,118,45,114, +101,108,116,111,75,45,112,114,101,118,45,114,101,108,116,111,45,100,105,114,1, +21,115,112,108,105,116,45,114,101,108,97,116,105,118,101,45,115,116,114,105,110, +103,71,111,114,105,103,45,112,97,114,97,109,122,1,29,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,29,94,2,3,2,5,11,64,98,111,111,116,64,115,101,97,108,64,115, +97,109,101,64,108,111,111,112,63,108,105,98,67,105,103,110,111,114,101,100,249, +22,14,195,80,159,37,45,37,20,14,159,80,158,35,39,250,80,158,38,40,249, +22,27,11,80,158,40,39,22,130,5,28,248,22,150,13,23,198,2,23,197,1, +87,94,23,197,1,247,22,191,13,247,194,250,22,168,13,23,197,1,23,199,1, +249,80,158,42,38,23,198,1,5,3,46,122,111,252,22,168,13,23,199,1,23, +201,1,6,6,6,110,97,116,105,118,101,247,22,182,7,249,80,158,44,38,23, +200,1,80,159,44,35,37,87,94,23,194,1,27,250,22,185,13,196,11,32,0, +89,162,8,44,35,40,9,222,11,28,192,249,22,67,195,194,11,27,248,23,195, +1,23,196,1,27,250,22,185,13,196,11,32,0,89,162,8,44,35,40,9,222, +11,28,192,249,22,67,195,194,11,249,247,22,132,14,248,22,68,195,195,27,248, +23,195,1,23,196,1,27,250,22,185,13,196,11,32,0,89,162,8,44,35,40, +9,222,11,28,192,249,22,67,195,194,11,249,247,22,128,5,248,22,68,195,195, +249,247,22,128,5,194,195,87,94,28,248,80,158,36,37,23,195,2,12,250,22, +135,9,77,108,111,97,100,47,117,115,101,45,99,111,109,112,105,108,101,100,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,23,197,2,91,159,41,11,90,161,36,35,11,28,248,22, +174,13,23,201,2,23,200,1,27,247,22,130,5,28,23,193,2,249,22,175,13, +23,203,1,23,195,1,200,90,161,38,36,11,248,22,171,13,23,194,2,87,94, +23,196,1,90,161,36,39,11,28,249,22,167,8,23,196,2,68,114,101,108,97, +116,105,118,101,87,94,23,194,1,2,21,23,194,1,90,161,36,40,11,247,22, +129,14,27,89,162,43,36,49,62,122,111,225,7,5,3,33,27,27,83,158,39, +20,97,94,89,162,43,36,51,9,225,8,6,4,33,28,23,197,1,27,249,22, +5,89,162,8,44,36,46,9,223,5,33,29,23,203,2,27,28,23,195,2,27, +249,22,5,83,158,39,20,97,94,89,162,8,44,36,47,9,223,5,33,30,23, +198,1,23,205,2,27,28,23,196,2,11,193,28,192,192,28,193,28,23,196,2, +28,249,22,170,3,248,22,69,196,248,22,69,23,199,2,193,11,11,11,87,94, +23,195,1,11,28,23,193,2,249,80,159,47,58,36,202,89,162,43,35,45,9, +224,14,2,33,31,87,94,23,193,1,27,28,23,197,2,27,249,22,5,83,158, +39,20,97,94,89,162,8,44,36,47,9,223,7,33,32,23,200,1,23,206,1, +27,28,196,11,193,28,192,192,28,193,28,196,28,249,22,170,3,248,22,69,196, +248,22,69,199,193,11,11,11,11,28,192,249,80,159,48,58,36,203,89,162,43, +35,45,9,224,15,2,33,33,249,80,159,48,58,36,203,89,162,43,35,44,9, +224,15,7,33,34,0,17,35,114,120,34,94,40,46,42,63,41,47,40,46,42, +41,36,34,32,37,89,162,8,44,36,58,2,22,222,33,38,27,249,22,137,14, +2,36,23,196,2,28,23,193,2,87,94,23,194,1,249,22,67,248,22,92,23, +196,2,27,248,22,101,23,197,1,27,249,22,137,14,2,36,23,196,2,28,23, +193,2,87,94,23,194,1,249,22,67,248,22,92,23,196,2,27,248,22,101,23, +197,1,27,249,22,137,14,2,36,23,196,2,28,23,193,2,87,94,23,194,1, +249,22,67,248,22,92,23,196,2,27,248,22,101,23,197,1,27,249,22,137,14, +2,36,23,196,2,28,23,193,2,87,94,23,194,1,249,22,67,248,22,92,23, +196,2,248,2,37,248,22,101,23,197,1,248,22,77,194,248,22,77,194,248,22, +77,194,248,22,77,194,32,39,89,162,43,36,54,2,22,222,33,40,28,248,22, +75,248,22,69,23,195,2,249,22,7,9,248,22,68,195,91,159,37,11,90,161, +37,35,11,27,248,22,69,196,28,248,22,75,248,22,69,23,195,2,249,22,7, +9,248,22,68,195,91,159,37,11,90,161,37,35,11,27,248,22,69,196,28,248, +22,75,248,22,69,23,195,2,249,22,7,9,248,22,68,195,91,159,37,11,90, +161,37,35,11,248,2,39,248,22,69,196,249,22,7,249,22,67,248,22,68,199, +196,195,249,22,7,249,22,67,248,22,68,199,196,195,249,22,7,249,22,67,248, +22,68,199,196,195,27,27,249,22,137,14,2,36,23,197,2,28,23,193,2,87, +94,23,195,1,249,22,67,248,22,92,23,196,2,27,248,22,101,23,197,1,27, +249,22,137,14,2,36,23,196,2,28,23,193,2,87,94,23,194,1,249,22,67, +248,22,92,23,196,2,248,2,37,248,22,101,23,197,1,248,22,77,194,248,22, +77,195,28,23,195,1,192,28,248,22,75,248,22,69,23,195,2,249,22,7,9, +248,22,68,195,91,159,37,11,90,161,37,35,11,248,2,39,248,22,69,196,249, +22,7,249,22,67,248,22,68,199,196,195,87,95,28,248,22,174,4,195,12,250, +22,135,9,2,17,6,20,20,114,101,115,111,108,118,101,100,45,109,111,100,117, +108,101,45,112,97,116,104,197,28,24,193,2,248,24,194,1,195,87,94,23,193, +1,12,27,27,250,22,141,2,80,159,41,42,37,248,22,157,14,247,22,132,12, +11,28,23,193,2,192,87,94,23,193,1,27,247,22,125,87,94,250,22,139,2, +80,159,42,42,37,248,22,157,14,247,22,132,12,195,192,250,22,139,2,195,198, +66,97,116,116,97,99,104,251,211,197,198,199,10,28,192,250,22,134,9,11,196, +195,248,22,132,9,194,32,45,89,162,8,44,36,50,2,22,222,33,46,27,249, +22,137,14,2,36,23,196,2,28,23,193,2,87,94,23,194,1,249,22,67,248, +22,92,23,196,2,27,248,22,101,23,197,1,27,249,22,137,14,2,36,23,196, +2,28,23,193,2,87,94,23,194,1,249,22,67,248,22,92,23,196,2,248,2, +45,248,22,101,23,197,1,248,22,77,194,248,22,77,194,32,47,89,162,43,36, +48,2,22,222,33,48,28,248,22,75,248,22,69,23,195,2,249,22,7,9,248, +22,68,195,91,159,37,11,90,161,37,35,11,248,2,47,248,22,69,196,249,22, +7,249,22,67,248,22,68,199,196,195,32,49,89,162,8,44,36,50,2,22,222, +33,50,27,249,22,137,14,2,36,23,196,2,28,23,193,2,87,94,23,194,1, +249,22,67,248,22,92,23,196,2,27,248,22,101,23,197,1,27,249,22,137,14, +2,36,23,196,2,28,23,193,2,87,94,23,194,1,249,22,67,248,22,92,23, +196,2,248,2,49,248,22,101,23,197,1,248,22,77,194,248,22,77,194,32,51, +89,162,43,36,48,2,22,222,33,52,28,248,22,75,248,22,69,23,195,2,249, +22,7,9,248,22,68,195,91,159,37,11,90,161,37,35,11,248,2,51,248,22, +69,196,249,22,7,249,22,67,248,22,68,199,196,195,28,249,22,168,6,194,6, +1,1,46,2,21,28,249,22,168,6,194,6,2,2,46,46,62,117,112,192,32, +54,89,162,8,44,36,50,2,22,222,33,55,27,249,22,137,14,2,36,23,196, 2,28,23,193,2,87,94,23,194,1,249,22,67,248,22,92,23,196,2,27,248, -22,101,23,197,1,27,249,22,137,14,2,39,23,196,2,28,23,193,2,87,94, -23,194,1,249,22,67,248,22,92,23,196,2,248,2,40,248,22,101,23,197,1, -248,22,77,194,248,22,77,194,248,22,77,194,248,22,77,195,28,23,195,1,192, -28,248,22,75,248,22,69,23,195,2,249,22,7,9,248,22,68,195,91,159,37, -11,90,161,37,35,11,27,248,22,69,196,28,248,22,75,248,22,69,23,195,2, -249,22,7,9,248,22,68,195,91,159,37,11,90,161,37,35,11,27,248,22,69, -196,28,248,22,75,248,22,69,23,195,2,249,22,7,9,248,22,68,195,91,159, -37,11,90,161,37,35,11,248,2,42,248,22,69,196,249,22,7,249,22,67,248, -22,68,199,196,195,249,22,7,249,22,67,248,22,68,199,196,195,249,22,7,249, -22,67,248,22,68,199,196,195,87,95,28,248,22,174,4,195,12,250,22,135,9, -2,17,6,20,20,114,101,115,111,108,118,101,100,45,109,111,100,117,108,101,45, -112,97,116,104,197,28,24,193,2,248,24,194,1,195,87,94,23,193,1,12,27, -27,250,22,141,2,80,159,41,42,37,248,22,157,14,247,22,132,12,11,28,23, -193,2,192,87,94,23,193,1,27,247,22,125,87,94,250,22,139,2,80,159,42, -42,37,248,22,157,14,247,22,132,12,195,192,250,22,139,2,195,198,66,97,116, -116,97,99,104,251,211,197,198,199,10,28,192,250,22,134,9,11,196,195,248,22, -132,9,194,28,249,22,168,6,194,6,1,1,46,2,21,28,249,22,168,6,194, -6,2,2,46,46,62,117,112,192,28,249,22,169,8,248,22,69,23,200,2,23, -197,1,28,249,22,167,8,248,22,68,23,200,2,23,196,1,251,22,132,9,2, -17,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,23,200,1,249,22,2,22,69,248,22,82,249, -22,67,23,206,1,23,202,1,12,12,247,192,20,14,159,80,159,39,44,37,249, -22,67,248,22,157,14,247,22,132,12,23,197,1,20,14,159,80,158,39,39,250, -80,158,42,40,249,22,27,11,80,158,44,39,22,156,4,23,196,1,249,247,22, -129,5,23,198,1,248,22,55,248,22,154,13,23,198,1,87,94,28,28,248,22, -150,13,23,196,2,10,248,22,180,4,23,196,2,12,28,23,197,2,250,22,134, -9,11,6,15,15,98,97,100,32,109,111,100,117,108,101,32,112,97,116,104,23, -200,2,250,22,135,9,2,17,6,19,19,109,111,100,117,108,101,45,112,97,116, -104,32,111,114,32,112,97,116,104,23,198,2,28,28,248,22,65,23,196,2,249, -22,167,8,248,22,68,23,198,2,2,3,11,248,22,175,4,248,22,92,196,28, -28,248,22,65,23,196,2,249,22,167,8,248,22,68,23,198,2,66,112,108,97, -110,101,116,11,87,94,28,207,12,20,14,159,80,158,36,51,80,158,36,49,90, -161,36,35,10,249,22,157,4,21,94,2,25,6,18,18,112,108,97,110,101,116, -47,114,101,115,111,108,118,101,114,46,115,115,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,12, -252,212,199,200,201,202,80,158,41,49,87,94,23,193,1,27,89,162,8,44,36, -45,79,115,104,111,119,45,99,111,108,108,101,99,116,105,111,110,45,101,114,114, -223,5,33,47,27,28,248,22,53,23,198,2,27,250,22,141,2,80,159,42,43, -37,249,22,67,23,203,2,247,22,128,14,11,28,23,193,2,192,87,94,23,193, -1,91,159,37,11,90,161,37,35,11,249,80,159,43,48,36,248,22,58,23,203, -2,11,27,251,80,158,46,52,2,17,23,202,1,28,248,22,75,23,199,2,23, -199,2,248,22,68,23,199,2,28,248,22,75,23,199,2,9,248,22,69,23,199, -2,249,22,168,13,23,195,1,28,248,22,75,23,197,1,87,94,23,197,1,6, -7,7,109,97,105,110,46,115,115,249,22,185,6,23,199,1,6,3,3,46,115, -115,28,248,22,162,6,23,198,2,87,94,23,194,1,27,27,28,23,200,2,28, -249,22,167,8,23,202,2,80,158,42,46,80,158,40,47,27,248,22,176,4,23, -202,2,28,248,22,150,13,23,194,2,91,159,38,11,90,161,38,35,11,248,22, -171,13,23,197,1,87,95,83,160,37,11,80,158,44,46,23,204,2,83,160,37, -11,80,158,44,47,192,192,11,11,28,23,193,2,192,87,94,23,193,1,27,247, -22,130,5,28,23,193,2,192,87,94,23,193,1,247,22,191,13,27,250,22,141, -2,80,159,43,43,37,249,22,67,23,204,2,23,199,2,11,28,23,193,2,192, -87,94,23,193,1,91,159,37,11,90,161,37,35,11,249,80,159,44,48,36,23, -203,2,11,250,22,1,22,168,13,23,199,1,249,22,81,249,22,2,32,0,89, -162,8,44,36,43,9,222,33,48,23,200,1,248,22,77,23,200,1,28,248,22, -150,13,23,198,2,87,94,23,194,1,28,248,22,173,13,23,198,2,23,197,2, -248,22,77,6,26,26,32,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,249,22,167,8,248,22,68,23,200, -2,2,25,27,250,22,141,2,80,159,42,43,37,249,22,67,23,203,2,247,22, -128,14,11,28,23,193,2,192,87,94,23,193,1,91,159,38,11,90,161,37,35, -11,249,80,159,44,48,36,248,22,92,23,204,2,11,90,161,36,37,11,28,248, +22,101,23,197,1,27,249,22,137,14,2,36,23,196,2,28,23,193,2,87,94, +23,194,1,249,22,67,248,22,92,23,196,2,248,2,54,248,22,101,23,197,1, +248,22,77,194,248,22,77,194,32,56,89,162,43,36,48,2,22,222,33,57,28, +248,22,75,248,22,69,23,195,2,249,22,7,9,248,22,68,195,91,159,37,11, +90,161,37,35,11,248,2,56,248,22,69,196,249,22,7,249,22,67,248,22,68, +199,196,195,32,58,89,162,8,44,36,50,2,22,222,33,59,27,249,22,137,14, +2,36,23,196,2,28,23,193,2,87,94,23,194,1,249,22,67,248,22,92,23, +196,2,27,248,22,101,23,197,1,27,249,22,137,14,2,36,23,196,2,28,23, +193,2,87,94,23,194,1,249,22,67,248,22,92,23,196,2,248,2,58,248,22, +101,23,197,1,248,22,77,194,248,22,77,194,27,27,249,22,137,14,2,36,23, +197,2,28,23,193,2,87,94,23,195,1,249,22,67,248,22,92,23,196,2,27, +248,22,101,23,197,1,27,249,22,137,14,2,36,23,196,2,28,23,193,2,87, +94,23,194,1,249,22,67,248,22,92,23,196,2,248,2,58,248,22,101,23,197, +1,248,22,77,194,248,22,77,195,192,28,249,22,169,8,248,22,69,23,200,2, +23,197,1,28,249,22,167,8,248,22,68,23,200,2,23,196,1,251,22,132,9, +2,17,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,23,200,1,249,22,2,22,69,248,22,82, +249,22,67,23,206,1,23,202,1,12,12,247,192,20,14,159,80,159,39,44,37, +249,22,67,248,22,157,14,247,22,132,12,23,197,1,20,14,159,80,158,39,39, +250,80,158,42,40,249,22,27,11,80,158,44,39,22,156,4,23,196,1,249,247, +22,129,5,23,198,1,248,22,55,248,22,154,13,23,198,1,87,94,28,28,248, +22,150,13,23,196,2,10,248,22,180,4,23,196,2,12,28,23,197,2,250,22, +134,9,11,6,15,15,98,97,100,32,109,111,100,117,108,101,32,112,97,116,104, +23,200,2,250,22,135,9,2,17,6,19,19,109,111,100,117,108,101,45,112,97, +116,104,32,111,114,32,112,97,116,104,23,198,2,28,28,248,22,65,23,196,2, +249,22,167,8,248,22,68,23,198,2,2,3,11,248,22,175,4,248,22,92,196, +28,28,248,22,65,23,196,2,249,22,167,8,248,22,68,23,198,2,66,112,108, +97,110,101,116,11,87,94,28,207,12,20,14,159,80,158,36,51,80,158,36,49, +90,161,36,35,10,249,22,157,4,21,94,2,23,6,18,18,112,108,97,110,101, +116,47,114,101,115,111,108,118,101,114,46,115,115,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, +12,252,212,199,200,201,202,80,158,41,49,87,94,23,193,1,27,89,162,8,44, +36,45,79,115,104,111,119,45,99,111,108,108,101,99,116,105,111,110,45,101,114, +114,223,5,33,44,27,28,248,22,53,23,198,2,27,250,22,141,2,80,159,42, +43,37,249,22,67,23,203,2,247,22,128,14,11,28,23,193,2,192,87,94,23, +193,1,91,159,37,11,90,161,37,35,11,27,248,22,58,23,202,2,27,27,249, +22,137,14,2,36,23,197,2,28,23,193,2,87,94,23,195,1,249,22,67,248, +22,92,23,196,2,27,248,22,101,23,197,1,27,249,22,137,14,2,36,23,196, +2,28,23,193,2,87,94,23,194,1,249,22,67,248,22,92,23,196,2,248,2, +45,248,22,101,23,197,1,248,22,77,194,248,22,77,195,28,248,22,75,248,22, +69,23,195,2,249,22,7,9,248,22,68,195,91,159,37,11,90,161,37,35,11, +248,2,47,248,22,69,196,249,22,7,249,22,67,248,22,68,199,196,195,27,251, +80,158,46,52,2,17,23,202,1,28,248,22,75,23,199,2,23,199,2,248,22, +68,23,199,2,28,248,22,75,23,199,2,9,248,22,69,23,199,2,249,22,168, +13,23,195,1,28,248,22,75,23,197,1,87,94,23,197,1,6,7,7,109,97, +105,110,46,115,115,249,22,185,6,23,199,1,6,3,3,46,115,115,28,248,22, +162,6,23,198,2,87,94,23,194,1,27,27,28,23,200,2,28,249,22,167,8, +23,202,2,80,158,42,46,80,158,40,47,27,248,22,176,4,23,202,2,28,248, +22,150,13,23,194,2,91,159,38,11,90,161,38,35,11,248,22,171,13,23,197, +1,87,95,83,160,37,11,80,158,44,46,23,204,2,83,160,37,11,80,158,44, +47,192,192,11,11,28,23,193,2,192,87,94,23,193,1,27,247,22,130,5,28, +23,193,2,192,87,94,23,193,1,247,22,191,13,27,250,22,141,2,80,159,43, +43,37,249,22,67,23,204,2,23,199,2,11,28,23,193,2,192,87,94,23,193, +1,91,159,37,11,90,161,37,35,11,27,27,249,22,137,14,2,36,23,205,2, +28,23,193,2,249,22,67,248,22,92,23,196,2,27,248,22,101,23,197,1,27, +249,22,137,14,2,36,23,196,2,28,23,193,2,87,94,23,194,1,249,22,67, +248,22,92,23,196,2,248,2,49,248,22,101,23,197,1,248,22,77,194,248,22, +77,23,204,2,28,248,22,75,248,22,69,23,195,2,249,22,7,9,248,22,68, +195,91,159,37,11,90,161,37,35,11,248,2,51,248,22,69,196,249,22,7,249, +22,67,248,22,68,199,196,195,250,22,1,22,168,13,23,199,1,249,22,81,249, +22,2,32,0,89,162,8,44,36,43,9,222,33,53,23,200,1,248,22,77,23, +200,1,28,248,22,150,13,23,198,2,87,94,23,194,1,28,248,22,173,13,23, +198,2,23,197,2,248,22,77,6,26,26,32,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,249,22,167,8, +248,22,68,23,200,2,2,23,27,250,22,141,2,80,159,42,43,37,249,22,67, +23,203,2,247,22,128,14,11,28,23,193,2,192,87,94,23,193,1,91,159,38, +11,90,161,37,35,11,27,248,22,92,23,203,2,27,27,249,22,137,14,2,36, +23,197,2,28,23,193,2,87,94,23,195,1,249,22,67,248,22,92,23,196,2, +27,248,22,101,23,197,1,27,249,22,137,14,2,36,23,196,2,28,23,193,2, +87,94,23,194,1,249,22,67,248,22,92,23,196,2,248,2,54,248,22,101,23, +197,1,248,22,77,194,248,22,77,195,28,248,22,75,248,22,69,23,195,2,249, +22,7,9,248,22,68,195,91,159,37,11,90,161,37,35,11,248,2,56,248,22, +69,196,249,22,7,249,22,67,248,22,68,199,196,195,90,161,36,37,11,28,248, 22,75,248,22,94,23,203,2,28,248,22,75,23,194,2,249,22,139,14,0,8, 35,114,120,34,91,46,93,34,23,196,2,11,10,27,27,28,23,197,2,249,22, 81,28,248,22,75,248,22,94,23,207,2,21,93,6,5,5,109,122,108,105,98, -249,22,1,22,81,249,22,2,80,159,50,59,36,248,22,94,23,210,2,23,197, -2,28,248,22,75,23,196,2,248,22,77,23,197,2,23,195,2,251,80,158,48, -52,2,17,23,204,1,248,22,68,23,198,2,248,22,69,23,198,1,249,22,168, -13,23,195,1,28,23,198,1,87,94,23,196,1,23,197,1,28,248,22,75,23, -197,1,87,94,23,197,1,6,7,7,109,97,105,110,46,115,115,28,249,22,139, -14,0,8,35,114,120,34,91,46,93,34,23,199,2,23,197,1,249,22,185,6, -23,199,1,6,3,3,46,115,115,28,249,22,167,8,248,22,68,23,200,2,64, -102,105,108,101,249,22,175,13,248,22,179,13,248,22,92,23,201,2,27,28,23, -201,2,28,249,22,167,8,23,203,2,80,158,43,46,80,158,41,47,27,248,22, -176,4,23,203,2,28,248,22,150,13,23,194,2,91,159,38,11,90,161,38,35, -11,248,22,171,13,23,197,1,87,95,83,160,37,11,80,158,45,46,23,205,2, -83,160,37,11,80,158,45,47,192,192,11,11,28,23,193,2,192,87,94,23,193, -1,27,247,22,130,5,28,23,193,2,192,87,94,23,193,1,247,22,191,13,12, -87,94,28,28,248,22,150,13,23,194,2,10,248,22,184,7,23,194,2,87,94, -23,199,1,12,28,23,199,2,250,22,134,9,67,114,101,113,117,105,114,101,249, -22,146,7,6,17,17,98,97,100,32,109,111,100,117,108,101,32,112,97,116,104, -126,97,28,23,198,2,248,22,68,23,199,2,6,0,0,23,202,1,87,94,23, -199,1,250,22,135,9,2,17,249,22,146,7,6,13,13,109,111,100,117,108,101, -32,112,97,116,104,126,97,28,23,198,2,248,22,68,23,199,2,6,0,0,23, -200,2,27,28,248,22,184,7,23,195,2,249,22,189,7,23,196,2,35,249,22, -177,13,248,22,178,13,23,197,2,11,27,28,248,22,184,7,23,196,2,249,22, -189,7,23,197,2,36,248,80,158,41,53,23,195,2,91,159,38,11,90,161,38, -35,11,28,248,22,184,7,23,199,2,250,22,7,2,26,249,22,189,7,23,203, -2,37,2,26,248,22,171,13,23,198,2,87,95,23,195,1,23,193,1,27,28, -248,22,184,7,23,200,2,249,22,189,7,23,201,2,38,249,80,158,46,54,23, -197,2,5,0,27,28,248,22,184,7,23,201,2,249,22,189,7,23,202,2,39, -248,22,175,4,23,200,2,27,27,250,22,141,2,80,159,50,42,37,248,22,157, -14,247,22,132,12,11,28,23,193,2,192,87,94,23,193,1,27,247,22,125,87, -94,250,22,139,2,80,159,51,42,37,248,22,157,14,247,22,132,12,195,192,87, -95,28,23,208,1,27,250,22,141,2,23,197,2,197,11,28,23,193,1,12,87, -95,27,27,28,248,22,17,80,159,50,45,37,80,159,49,45,37,247,22,19,250, -22,25,248,22,23,23,197,2,80,159,52,44,37,23,196,1,27,248,22,157,14, -247,22,132,12,249,22,3,83,158,39,20,97,94,89,162,8,44,36,54,9,226, -12,11,2,3,33,49,23,195,1,23,196,1,248,28,248,22,17,80,159,49,45, -37,32,0,89,162,43,36,41,9,222,33,50,80,159,48,8,25,36,89,162,43, -35,50,9,227,13,9,8,4,3,33,51,250,22,139,2,23,197,1,197,10,12, -28,28,248,22,184,7,23,202,1,11,27,248,22,162,6,23,207,2,28,192,192, -27,248,22,53,23,208,2,28,192,192,28,248,22,65,23,208,2,249,22,167,8, -248,22,68,23,210,2,2,25,11,250,22,139,2,80,159,49,43,37,28,248,22, -162,6,23,209,2,249,22,67,23,210,1,27,28,23,212,2,28,249,22,167,8, -23,214,2,80,158,54,46,87,94,23,212,1,80,158,52,47,27,248,22,176,4, -23,214,2,28,248,22,150,13,23,194,2,91,159,38,11,90,161,38,35,11,248, -22,171,13,23,197,1,87,95,83,160,37,11,80,158,56,46,23,23,83,160,37, -11,80,158,56,47,192,192,11,11,28,23,193,2,192,87,94,23,193,1,27,247, -22,130,5,28,23,193,2,192,87,94,23,193,1,247,22,191,13,249,22,67,23, -210,1,247,22,128,14,252,22,186,7,23,208,1,23,207,1,23,205,1,23,203, -1,201,12,193,87,96,83,160,37,11,80,158,35,49,248,80,158,36,57,249,22, -27,11,80,158,38,51,248,22,155,4,80,159,36,50,37,248,22,129,5,80,159, -36,36,36,248,22,187,12,80,159,36,41,36,83,160,37,11,80,158,35,49,248, -80,158,36,57,249,22,27,11,80,158,38,51,159,35,20,102,159,35,16,1,11, -16,0,83,158,41,20,100,144,66,35,37,98,111,111,116,29,11,11,11,11,11, -10,37,80,158,35,35,20,102,159,38,16,23,2,1,2,2,30,2,4,72,112, -97,116,104,45,115,116,114,105,110,103,63,10,30,2,4,75,112,97,116,104,45, -97,100,100,45,115,117,102,102,105,120,7,30,2,6,2,7,4,30,2,6,1, -23,101,120,116,101,110,100,45,112,97,114,97,109,101,116,101,114,105,122,97,116, -105,111,110,3,2,8,2,9,2,10,2,11,2,12,2,13,2,14,2,15,2, -16,2,17,30,2,18,2,7,4,30,2,4,69,45,102,105,110,100,45,99,111, -108,0,30,2,4,76,110,111,114,109,97,108,45,99,97,115,101,45,112,97,116, -104,6,30,2,4,79,112,97,116,104,45,114,101,112,108,97,99,101,45,115,117, -102,102,105,120,9,2,19,2,20,30,2,18,74,114,101,112,97,114,97,109,101, -116,101,114,105,122,101,5,16,0,16,0,35,16,0,35,16,12,2,11,2,12, -2,9,2,10,2,13,2,14,2,2,2,8,2,1,2,16,2,15,2,17,47, -11,11,38,35,11,11,11,16,2,2,19,2,20,16,2,11,11,16,2,2,19, -2,20,37,37,36,11,11,11,16,0,16,0,16,0,35,35,11,11,11,11,16, -0,16,0,16,0,35,35,16,0,16,17,83,158,35,16,2,89,162,43,36,44, -9,223,0,33,27,80,159,35,8,25,36,83,158,35,16,2,89,162,43,36,44, -9,223,0,33,28,80,159,35,59,36,83,158,35,16,2,89,162,43,37,48,68, -119,105,116,104,45,100,105,114,223,0,33,29,80,159,35,58,36,83,158,35,16, -2,248,22,181,7,69,115,111,45,115,117,102,102,105,120,80,159,35,35,36,83, -158,35,16,2,89,162,43,37,59,2,2,223,0,33,38,80,159,35,36,36,83, -158,35,16,2,32,0,89,162,8,44,36,41,2,8,222,192,80,159,35,41,36, -83,158,35,16,2,247,22,128,2,80,159,35,42,36,83,158,35,16,2,247,22, -127,80,159,35,43,36,83,158,35,16,2,247,22,63,80,159,35,44,36,83,158, -35,16,2,248,22,18,74,109,111,100,117,108,101,45,108,111,97,100,105,110,103, -80,159,35,45,36,83,158,35,16,2,11,80,158,35,46,83,158,35,16,2,11, -80,158,35,47,83,158,35,16,2,32,0,89,162,43,37,8,25,2,15,222,33, -44,80,159,35,48,36,83,158,35,16,2,11,80,158,35,49,83,158,35,16,2, -91,159,37,10,90,161,36,35,10,11,90,161,36,36,10,83,158,38,20,96,96, -2,17,89,162,8,44,36,50,9,224,2,0,33,45,89,162,43,38,48,9,223, -1,33,46,89,162,43,39,8,32,9,224,2,0,33,52,208,80,159,35,50,36, -83,158,35,16,2,89,162,43,35,44,2,19,223,0,33,53,80,159,35,55,36, -83,158,35,16,2,89,162,8,44,35,44,2,20,223,0,33,54,80,159,35,56, -36,96,29,94,2,3,68,35,37,107,101,114,110,101,108,11,29,94,2,3,69, -35,37,109,105,110,45,115,116,120,11,2,4,2,18,9,9,9,35,0}; - EVAL_ONE_SIZED_STR((char *)expr, 4953); +249,22,1,22,81,249,22,2,32,0,89,162,8,44,36,51,9,222,33,60,248, +22,94,23,210,2,23,197,2,28,248,22,75,23,196,2,248,22,77,23,197,2, +23,195,2,251,80,158,48,52,2,17,23,204,1,248,22,68,23,198,2,248,22, +69,23,198,1,249,22,168,13,23,195,1,28,23,198,1,87,94,23,196,1,23, +197,1,28,248,22,75,23,197,1,87,94,23,197,1,6,7,7,109,97,105,110, +46,115,115,28,249,22,139,14,0,8,35,114,120,34,91,46,93,34,23,199,2, +23,197,1,249,22,185,6,23,199,1,6,3,3,46,115,115,28,249,22,167,8, +248,22,68,23,200,2,64,102,105,108,101,249,22,175,13,248,22,179,13,248,22, +92,23,201,2,27,28,23,201,2,28,249,22,167,8,23,203,2,80,158,43,46, +80,158,41,47,27,248,22,176,4,23,203,2,28,248,22,150,13,23,194,2,91, +159,38,11,90,161,38,35,11,248,22,171,13,23,197,1,87,95,83,160,37,11, +80,158,45,46,23,205,2,83,160,37,11,80,158,45,47,192,192,11,11,28,23, +193,2,192,87,94,23,193,1,27,247,22,130,5,28,23,193,2,192,87,94,23, +193,1,247,22,191,13,12,87,94,28,28,248,22,150,13,23,194,2,10,248,22, +184,7,23,194,2,87,94,23,199,1,12,28,23,199,2,250,22,134,9,67,114, +101,113,117,105,114,101,249,22,146,7,6,17,17,98,97,100,32,109,111,100,117, +108,101,32,112,97,116,104,126,97,28,23,198,2,248,22,68,23,199,2,6,0, +0,23,202,1,87,94,23,199,1,250,22,135,9,2,17,249,22,146,7,6,13, +13,109,111,100,117,108,101,32,112,97,116,104,126,97,28,23,198,2,248,22,68, +23,199,2,6,0,0,23,200,2,27,28,248,22,184,7,23,195,2,249,22,189, +7,23,196,2,35,249,22,177,13,248,22,178,13,23,197,2,11,27,28,248,22, +184,7,23,196,2,249,22,189,7,23,197,2,36,248,80,158,41,53,23,195,2, +91,159,38,11,90,161,38,35,11,28,248,22,184,7,23,199,2,250,22,7,2, +24,249,22,189,7,23,203,2,37,2,24,248,22,171,13,23,198,2,87,95,23, +195,1,23,193,1,27,28,248,22,184,7,23,200,2,249,22,189,7,23,201,2, +38,249,80,158,46,54,23,197,2,5,0,27,28,248,22,184,7,23,201,2,249, +22,189,7,23,202,2,39,248,22,175,4,23,200,2,27,27,250,22,141,2,80, +159,50,42,37,248,22,157,14,247,22,132,12,11,28,23,193,2,192,87,94,23, +193,1,27,247,22,125,87,94,250,22,139,2,80,159,51,42,37,248,22,157,14, +247,22,132,12,195,192,87,95,28,23,208,1,27,250,22,141,2,23,197,2,197, +11,28,23,193,1,12,87,95,27,27,28,248,22,17,80,159,50,45,37,80,159, +49,45,37,247,22,19,250,22,25,248,22,23,23,197,2,80,159,52,44,37,23, +196,1,27,248,22,157,14,247,22,132,12,249,22,3,83,158,39,20,97,94,89, +162,8,44,36,54,9,226,12,11,2,3,33,61,23,195,1,23,196,1,248,28, +248,22,17,80,159,49,45,37,32,0,89,162,43,36,41,9,222,33,62,80,159, +48,59,36,89,162,43,35,50,9,227,13,9,8,4,3,33,63,250,22,139,2, +23,197,1,197,10,12,28,28,248,22,184,7,23,202,1,11,28,248,22,162,6, +23,206,2,10,28,248,22,53,23,206,2,10,28,248,22,65,23,206,2,249,22, +167,8,248,22,68,23,208,2,2,23,11,250,22,139,2,80,159,49,43,37,28, +248,22,162,6,23,209,2,249,22,67,23,210,1,27,28,23,212,2,28,249,22, +167,8,23,214,2,80,158,54,46,87,94,23,212,1,80,158,52,47,27,248,22, +176,4,23,214,2,28,248,22,150,13,23,194,2,91,159,38,11,90,161,38,35, +11,248,22,171,13,23,197,1,87,95,83,160,37,11,80,158,56,46,23,23,83, +160,37,11,80,158,56,47,192,192,11,11,28,23,193,2,192,87,94,23,193,1, +27,247,22,130,5,28,23,193,2,192,87,94,23,193,1,247,22,191,13,249,22, +67,23,210,1,247,22,128,14,252,22,186,7,23,208,1,23,207,1,23,205,1, +23,203,1,201,12,193,87,96,83,160,37,11,80,158,35,49,248,80,158,36,57, +249,22,27,11,80,158,38,51,248,22,155,4,80,159,36,50,37,248,22,129,5, +80,159,36,36,36,248,22,187,12,80,159,36,41,36,83,160,37,11,80,158,35, +49,248,80,158,36,57,249,22,27,11,80,158,38,51,159,35,20,102,159,35,16, +1,11,16,0,83,158,41,20,100,144,66,35,37,98,111,111,116,29,11,11,11, +11,11,10,37,80,158,35,35,20,102,159,37,16,23,2,1,2,2,30,2,4, +72,112,97,116,104,45,115,116,114,105,110,103,63,10,30,2,4,75,112,97,116, +104,45,97,100,100,45,115,117,102,102,105,120,7,30,2,6,2,7,4,30,2, +6,1,23,101,120,116,101,110,100,45,112,97,114,97,109,101,116,101,114,105,122, +97,116,105,111,110,3,2,8,2,9,2,10,2,11,2,12,2,13,2,14,2, +15,2,16,2,17,30,2,18,2,7,4,30,2,4,69,45,102,105,110,100,45, +99,111,108,0,30,2,4,76,110,111,114,109,97,108,45,99,97,115,101,45,112, +97,116,104,6,30,2,4,79,112,97,116,104,45,114,101,112,108,97,99,101,45, +115,117,102,102,105,120,9,2,19,2,20,30,2,18,74,114,101,112,97,114,97, +109,101,116,101,114,105,122,101,5,16,0,16,0,35,16,0,35,16,12,2,11, +2,12,2,9,2,10,2,13,2,14,2,2,2,8,2,1,2,16,2,15,2, +17,47,11,11,38,35,11,11,11,16,2,2,19,2,20,16,2,11,11,16,2, +2,19,2,20,37,37,36,11,11,11,16,0,16,0,16,0,35,35,11,11,11, +11,16,0,16,0,16,0,35,35,16,0,16,16,83,158,35,16,2,89,162,43, +36,44,9,223,0,33,25,80,159,35,59,36,83,158,35,16,2,89,162,43,37, +48,68,119,105,116,104,45,100,105,114,223,0,33,26,80,159,35,58,36,83,158, +35,16,2,248,22,181,7,69,115,111,45,115,117,102,102,105,120,80,159,35,35, +36,83,158,35,16,2,89,162,43,37,59,2,2,223,0,33,35,80,159,35,36, +36,83,158,35,16,2,32,0,89,162,8,44,36,41,2,8,222,192,80,159,35, +41,36,83,158,35,16,2,247,22,128,2,80,159,35,42,36,83,158,35,16,2, +247,22,127,80,159,35,43,36,83,158,35,16,2,247,22,63,80,159,35,44,36, +83,158,35,16,2,248,22,18,74,109,111,100,117,108,101,45,108,111,97,100,105, +110,103,80,159,35,45,36,83,158,35,16,2,11,80,158,35,46,83,158,35,16, +2,11,80,158,35,47,83,158,35,16,2,32,0,89,162,43,37,52,2,15,222, +33,41,80,159,35,48,36,83,158,35,16,2,11,80,158,35,49,83,158,35,16, +2,91,159,37,10,90,161,36,35,10,11,90,161,36,36,10,83,158,38,20,96, +96,2,17,89,162,8,44,36,50,9,224,2,0,33,42,89,162,43,38,48,9, +223,1,33,43,89,162,43,39,8,32,9,224,2,0,33,64,208,80,159,35,50, +36,83,158,35,16,2,89,162,43,35,44,2,19,223,0,33,65,80,159,35,55, +36,83,158,35,16,2,89,162,8,44,35,44,2,20,223,0,33,66,80,159,35, +56,36,96,29,94,2,3,68,35,37,107,101,114,110,101,108,11,29,94,2,3, +69,35,37,109,105,110,45,115,116,120,11,2,4,2,18,9,9,9,35,0}; + EVAL_ONE_SIZED_STR((char *)expr, 5458); } diff --git a/src/mzscheme/src/eval.c b/src/mzscheme/src/eval.c index e132a80874..bba7a2634a 100644 --- a/src/mzscheme/src/eval.c +++ b/src/mzscheme/src/eval.c @@ -2849,13 +2849,27 @@ int scheme_wants_flonum_arguments(Scheme_Object *rator, int argpos, int rotate_m || IS_NAMED_PRIM(rator, "unsafe-fl=") || IS_NAMED_PRIM(rator, "unsafe-fl>") || IS_NAMED_PRIM(rator, "unsafe-fl>=") + || IS_NAMED_PRIM(rator, "unsafe-flmin") + || IS_NAMED_PRIM(rator, "unsafe-flmax") || (rotate_mode && IS_NAMED_PRIM(rator, "unsafe-flvector-ref")) || (rotate_mode && IS_NAMED_PRIM(rator, "unsafe-fx->fl"))) return 1; } else if (SCHEME_PRIM_PROC_FLAGS(rator) & SCHEME_PRIM_IS_UNARY_INLINED) { if (!rotate_mode) { if (IS_NAMED_PRIM(rator, "flabs") - || IS_NAMED_PRIM(rator, "flsqrt")) + || IS_NAMED_PRIM(rator, "flsqrt") + || IS_NAMED_PRIM(rator, "fltruncate") + || IS_NAMED_PRIM(rator, "flround") + || IS_NAMED_PRIM(rator, "flfloor") + || IS_NAMED_PRIM(rator, "flceiling") + || IS_NAMED_PRIM(rator, "flsin") + || IS_NAMED_PRIM(rator, "flcos") + || IS_NAMED_PRIM(rator, "fltan") + || IS_NAMED_PRIM(rator, "flasin") + || IS_NAMED_PRIM(rator, "flacos") + || IS_NAMED_PRIM(rator, "flatan") + || IS_NAMED_PRIM(rator, "fllog") + || IS_NAMED_PRIM(rator, "flexp")) return 1; } } else if (SCHEME_PRIM_PROC_FLAGS(rator) & SCHEME_PRIM_IS_BINARY_INLINED) { @@ -2868,7 +2882,8 @@ int scheme_wants_flonum_arguments(Scheme_Object *rator, int argpos, int rotate_m || IS_NAMED_PRIM(rator, "fl<=") || IS_NAMED_PRIM(rator, "fl=") || IS_NAMED_PRIM(rator, "fl>") - || IS_NAMED_PRIM(rator, "fl>=")) + || IS_NAMED_PRIM(rator, "flmin") + || IS_NAMED_PRIM(rator, "flmax")) return 1; } } else if (SCHEME_PRIM_PROC_FLAGS(rator) & SCHEME_PRIM_IS_NARY_INLINED) { @@ -2896,6 +2911,8 @@ static int produces_unboxed(Scheme_Object *rator, int *non_fl_args, int argc, in || IS_NAMED_PRIM(rator, "unsafe-fl-") || IS_NAMED_PRIM(rator, "unsafe-fl*") || IS_NAMED_PRIM(rator, "unsafe-fl/") + || IS_NAMED_PRIM(rator, "unsafe-flmin") + || IS_NAMED_PRIM(rator, "unsafe-flmax") || (for_args && (IS_NAMED_PRIM(rator, "unsafe-fl<") || IS_NAMED_PRIM(rator, "unsafe-fl<=") @@ -2910,7 +2927,19 @@ static int produces_unboxed(Scheme_Object *rator, int *non_fl_args, int argc, in } } else if ((argc == 1) && (SCHEME_PRIM_PROC_FLAGS(rator) & SCHEME_PRIM_IS_UNARY_INLINED)) { if (IS_NAMED_PRIM(rator, "flabs") - || IS_NAMED_PRIM(rator, "flsqrt")) + || IS_NAMED_PRIM(rator, "flsqrt") + || IS_NAMED_PRIM(rator, "fltruncate") + || IS_NAMED_PRIM(rator, "flround") + || IS_NAMED_PRIM(rator, "flfloor") + || IS_NAMED_PRIM(rator, "flceiling") + || IS_NAMED_PRIM(rator, "flsin") + || IS_NAMED_PRIM(rator, "flcos") + || IS_NAMED_PRIM(rator, "fltan") + || IS_NAMED_PRIM(rator, "flasin") + || IS_NAMED_PRIM(rator, "flacos") + || IS_NAMED_PRIM(rator, "flatan") + || IS_NAMED_PRIM(rator, "fllog") + || IS_NAMED_PRIM(rator, "flexp")) return 1; if (IS_NAMED_PRIM(rator, "->fl")) { if (non_fl_args) *non_fl_args = 1; @@ -2923,11 +2952,14 @@ static int produces_unboxed(Scheme_Object *rator, int *non_fl_args, int argc, in || IS_NAMED_PRIM(rator, "fl-") || IS_NAMED_PRIM(rator, "fl*") || IS_NAMED_PRIM(rator, "fl/") - || IS_NAMED_PRIM(rator, "fl<") - || IS_NAMED_PRIM(rator, "fl<=") - || IS_NAMED_PRIM(rator, "fl=") - || IS_NAMED_PRIM(rator, "fl>") - || IS_NAMED_PRIM(rator, "fl>=")) + || IS_NAMED_PRIM(rator, "flmin") + || IS_NAMED_PRIM(rator, "flmax") + || (for_args + && (IS_NAMED_PRIM(rator, "fl<") + || IS_NAMED_PRIM(rator, "fl<=") + || IS_NAMED_PRIM(rator, "fl=") + || IS_NAMED_PRIM(rator, "fl>") + || IS_NAMED_PRIM(rator, "fl>=")))) return 1; if (IS_NAMED_PRIM(rator, "flvector-ref")) { if (non_fl_args) *non_fl_args = 1; diff --git a/src/mzscheme/src/jit.c b/src/mzscheme/src/jit.c index 18301d2da4..a964502560 100644 --- a/src/mzscheme/src/jit.c +++ b/src/mzscheme/src/jit.c @@ -4078,7 +4078,7 @@ static int generate_app(Scheme_App_Rec *app, Scheme_Object **alt_rands, int num_ return is_tail ? 2 : 1; } -static int is_inline_unboxable_op(Scheme_Object *obj, int flag, int unsafely) +static int is_inline_unboxable_op(Scheme_Object *obj, int flag, int unsafely, int just_checking_result) { if (!SCHEME_PRIMP(obj)) return 0; @@ -4091,6 +4091,8 @@ static int is_inline_unboxable_op(Scheme_Object *obj, int flag, int unsafely) if (IS_NAMED_PRIM(obj, "unsafe-fl/")) return 1; if (IS_NAMED_PRIM(obj, "unsafe-flabs")) return 1; if (IS_NAMED_PRIM(obj, "unsafe-flsqrt")) return 1; + if (IS_NAMED_PRIM(obj, "unsafe-flmin")) return 1; + if (IS_NAMED_PRIM(obj, "unsafe-flmax")) return 1; if (IS_NAMED_PRIM(obj, "unsafe-fx->fl")) return 1; if (IS_NAMED_PRIM(obj, "unsafe-f64vector-ref")) return 1; if (IS_NAMED_PRIM(obj, "unsafe-flvector-ref")) return 1; @@ -4104,6 +4106,23 @@ static int is_inline_unboxable_op(Scheme_Object *obj, int flag, int unsafely) if (IS_NAMED_PRIM(obj, "fl/")) return 1; if (IS_NAMED_PRIM(obj, "flabs")) return 1; if (IS_NAMED_PRIM(obj, "flsqrt")) return 1; + if (IS_NAMED_PRIM(obj, "flmin")) return 1; + if (IS_NAMED_PRIM(obj, "flmax")) return 1; + + if (just_checking_result) { + if (IS_NAMED_PRIM(obj, "flfloor")) return 1; + if (IS_NAMED_PRIM(obj, "flceiling")) return 1; + if (IS_NAMED_PRIM(obj, "fltruncate")) return 1; + if (IS_NAMED_PRIM(obj, "flround")) return 1; + if (IS_NAMED_PRIM(obj, "flsin")) return 1; + if (IS_NAMED_PRIM(obj, "flcos")) return 1; + if (IS_NAMED_PRIM(obj, "fltan")) return 1; + if (IS_NAMED_PRIM(obj, "flasin")) return 1; + if (IS_NAMED_PRIM(obj, "flacos")) return 1; + if (IS_NAMED_PRIM(obj, "flatan")) return 1; + if (IS_NAMED_PRIM(obj, "fllog")) return 1; + if (IS_NAMED_PRIM(obj, "flexp")) return 1; + } } return 0; @@ -4116,7 +4135,7 @@ static int generate_pop_unboxed(mz_jit_state *jitter) to pop them off before escaping. */ int i; for (i = jitter->unbox_depth; i--; ) { - FUCOMPr(1); /* compare with single pop; we ignore the compare result, of course */ + FSTPr(0); } CHECK_LIMIT(); #endif @@ -4161,14 +4180,14 @@ static int can_unbox_inline(Scheme_Object *obj, int fuel, int regs, int unsafely case scheme_application2_type: { Scheme_App2_Rec *app = (Scheme_App2_Rec *)obj; - if (!is_inline_unboxable_op(app->rator, SCHEME_PRIM_IS_UNARY_INLINED, unsafely)) + if (!is_inline_unboxable_op(app->rator, SCHEME_PRIM_IS_UNARY_INLINED, unsafely, 0)) return 0; return can_unbox_inline(app->rand, fuel - 1, regs, unsafely); } case scheme_application3_type: { Scheme_App3_Rec *app = (Scheme_App3_Rec *)obj; - if (!is_inline_unboxable_op(app->rator, SCHEME_PRIM_IS_BINARY_INLINED, unsafely)) + if (!is_inline_unboxable_op(app->rator, SCHEME_PRIM_IS_BINARY_INLINED, unsafely, 0)) return 0; if (IS_NAMED_PRIM(app->rator, "unsafe-f64vector-ref") || IS_NAMED_PRIM(app->rator, "unsafe-flvector-ref")) { @@ -4197,7 +4216,7 @@ static int can_unbox_directly(Scheme_Object *obj) case scheme_application2_type: { Scheme_App2_Rec *app = (Scheme_App2_Rec *)obj; - if (is_inline_unboxable_op(app->rator, SCHEME_PRIM_IS_UNARY_INLINED, 1)) + if (is_inline_unboxable_op(app->rator, SCHEME_PRIM_IS_UNARY_INLINED, 1, 1)) return 1; if (SCHEME_PRIMP(app->rator) && (SCHEME_PRIM_PROC_FLAGS(app->rator) & SCHEME_PRIM_IS_UNARY_INLINED)) { @@ -4210,7 +4229,7 @@ static int can_unbox_directly(Scheme_Object *obj) case scheme_application3_type: { Scheme_App3_Rec *app = (Scheme_App3_Rec *)obj; - if (is_inline_unboxable_op(app->rator, SCHEME_PRIM_IS_BINARY_INLINED, 1)) + if (is_inline_unboxable_op(app->rator, SCHEME_PRIM_IS_BINARY_INLINED, 1, 1)) return 1; if (SCHEME_PRIMP(app->rator) && (SCHEME_PRIM_PROC_FLAGS(app->rator) & SCHEME_PRIM_IS_BINARY_INLINED)) { @@ -4310,7 +4329,8 @@ static int can_fast_double(int arith, int cmp, int two_args) || (arith == -2) || (arith == 11) || (arith == 12) - || (arith == 13)) + || (arith == 13) + || (arith == 14)) return 1; #endif #ifdef INLINE_FP_COMP @@ -4362,11 +4382,31 @@ static int can_fast_double(int arith, int cmp, int two_args) #define jit_beqr_d_fppop(d, s1, s2) jit_beqr_d(d, s1, s2) #define jit_bantieqr_d_fppop(d, s1, s2) jit_bantieqr_d(d, s1, s2) #define jit_extr_l_d_fppush(rd, rs) jit_extr_l_d(rd, rs) +#define jit_movr_d_rel(rd, rs) jit_movr_d(rd, rs) #define R0_FP_ADJUST(x) /* empty */ #else #define R0_FP_ADJUST(x) x #endif +#ifdef CAN_INLINE_ALLOC +# ifdef JIT_USE_FP_OPS +#define DECL_FP_GLUE(op) static void call_ ## op(void) { save_fp = scheme_double_ ## op(save_fp); } +DECL_FP_GLUE(sin) +DECL_FP_GLUE(cos) +DECL_FP_GLUE(tan) +DECL_FP_GLUE(asin) +DECL_FP_GLUE(acos) +DECL_FP_GLUE(atan) +DECL_FP_GLUE(exp) +DECL_FP_GLUE(log) +DECL_FP_GLUE(floor) +DECL_FP_GLUE(ceiling) +DECL_FP_GLUE(truncate) +DECL_FP_GLUE(round) +typedef void (*call_fp_proc)(void); +# endif +#endif + #if defined(MZ_USE_JIT_I386) # define mz_movi_d_fppush(rd,immd,tmp) { GC_CAN_IGNORE void *addr; addr = mz_retain_double(jitter, immd); \ (void)jit_patchable_movi_p(tmp, addr); \ @@ -4406,7 +4446,8 @@ static int generate_alloc_double(mz_jit_state *jitter, int inline_retry) return 1; } -static int generate_double_arith(mz_jit_state *jitter, int arith, int cmp, int reversed, int two_args, int second_const, +static int generate_double_arith(mz_jit_state *jitter, Scheme_Object *rator, + int arith, int cmp, int reversed, int two_args, int second_const, jit_insn **_refd, jit_insn **_refdt, Branch_Info *for_branch, int branch_short, int unsafe_fl, int unboxed, int unboxed_result) /* Unless unboxed, first arg is in JIT_R1, second in JIT_R0. @@ -4416,7 +4457,7 @@ static int generate_double_arith(mz_jit_state *jitter, int arith, int cmp, int r { #if defined(INLINE_FP_OPS) || defined(INLINE_FP_COMP) GC_CAN_IGNORE jit_insn *ref8, *ref9, *ref10, *refd, *refdt; - int no_alloc = unboxed_result; + int no_alloc = unboxed_result, need_post_pop = 0; if (!unsafe_fl) { /* Maybe they're doubles */ @@ -4460,6 +4501,8 @@ static int generate_double_arith(mz_jit_state *jitter, int arith, int cmp, int r /* abs needs no extra number */ } else if (arith == 13) { /* sqrt needs no extra number */ + } else if (arith == 14) { + /* flround, flsin, etc. needs no extra number */ } else if (arith == 12) { /* exact->inexact needs no extra number */ } else { @@ -4515,19 +4558,35 @@ static int generate_double_arith(mz_jit_state *jitter, int arith, int cmp, int r __START_TINY_JUMPS__(1); /* If R0 is nan, then copy to R1, ensuring nan result */ refn = jit_beqr_d(jit_forward(), fpr0, fpr0); - jit_movr_p(JIT_R1, JIT_R0); + if (unboxed) + jit_movr_d_rel(fpr1, fpr0); + else + jit_movr_p(JIT_R1, JIT_R0); mz_patch_branch(refn); if (arith == 9) { - refc = jit_bltr_d_fppop(jit_forward(), fpr0, fpr1); + if (unboxed) { + refc = jit_bltr_d(jit_forward(), fpr0, fpr1); + } else { + refc = jit_bltr_d_fppop(jit_forward(), fpr0, fpr1); + } } else { - refc = jit_bger_d_fppop(jit_forward(), fpr0, fpr1); + if (unboxed) { + refc = jit_bger_d(jit_forward(), fpr0, fpr1); + } else { + refc = jit_bger_d_fppop(jit_forward(), fpr0, fpr1); + } } - jit_movr_p(JIT_R0, JIT_R1); + if (unboxed) { + jit_movr_d_rel(fpr0, fpr1); + need_post_pop = 1; + } else + jit_movr_p(JIT_R0, JIT_R1); mz_patch_branch(refc); __END_TINY_JUMPS__(1); - /* no unsafe version of `min' and `max', so we never need an - unboxed result, but we've already set JIT_R0 */ - no_alloc = 1; + if (!unboxed) { + /* we've already set JIT_R0 */ + no_alloc = 1; + } } break; case 11: /* abs */ @@ -4539,6 +4598,48 @@ static int generate_double_arith(mz_jit_state *jitter, int arith, int cmp, int r case 13: /* sqrt */ jit_sqrt_d_fppop(fpr0, fpr0); break; +#ifdef CAN_INLINE_ALLOC +# ifdef JIT_USE_FP_OPS + case 14: /* flfloor, flsin, etc. */ + { + call_fp_proc f; + + if (IS_NAMED_PRIM(rator, "flsin")) + f = call_sin; + else if (IS_NAMED_PRIM(rator, "flcos")) + f = call_cos; + else if (IS_NAMED_PRIM(rator, "fltan")) + f = call_tan; + else if (IS_NAMED_PRIM(rator, "flasin")) + f = call_asin; + else if (IS_NAMED_PRIM(rator, "flacos")) + f = call_acos; + else if (IS_NAMED_PRIM(rator, "flatan")) + f = call_atan; + else if (IS_NAMED_PRIM(rator, "flexp")) + f = call_exp; + else if (IS_NAMED_PRIM(rator, "fllog")) + f = call_log; + else if (IS_NAMED_PRIM(rator, "flfloor")) + f = call_floor; + else if (IS_NAMED_PRIM(rator, "flceiling")) + f = call_ceiling; + else if (IS_NAMED_PRIM(rator, "fltruncate")) + f = call_truncate; + else if (IS_NAMED_PRIM(rator, "flround")) + f = call_round; + else { + scheme_signal_error("internal error: unknown flonum function"); + f = NULL; + } + (void)mz_tl_sti_d_fppop(tl_save_fp, JIT_FPR0, JIT_R2); + mz_prepare(0); + mz_finish(f); + (void)mz_tl_ldi_d_fppush(JIT_FPR0, tl_save_fp, JIT_R2); + } + break; +# endif +#endif default: break; } @@ -4548,6 +4649,10 @@ static int generate_double_arith(mz_jit_state *jitter, int arith, int cmp, int r mz_rs_sync(); /* needed if arguments were unboxed */ generate_alloc_double(jitter, 0); CHECK_LIMIT(); +#if defined(MZ_USE_JIT_I386) + if (need_post_pop) + FSTPr(0); +#endif } else if (unboxed_result) { jitter->unbox_depth++; } @@ -4641,6 +4746,24 @@ static int check_flonum_result(mz_jit_state *jitter, int reg, void *fail_code, S return 1; } +static void generate_modulo_setup(mz_jit_state *jitter, int branch_short, int a1, int a2) +/* r1 has two flags: bit 0 means two args have different sign; bit 1 means second arg is negative */ +{ + GC_CAN_IGNORE jit_insn *refx; + + jit_movi_l(JIT_R1, 0x0); + __START_INNER_TINY__(branch_short); + refx = jit_bgei_l(jit_forward(), a1, 0); + jit_negr_l(a1, a1); + jit_movi_l(JIT_R1, 0x1); + mz_patch_branch(refx); + refx = jit_bgei_l(jit_forward(), a2, 0); + jit_xori_l(JIT_R1, JIT_R1, 0x3); + jit_negr_l(a2, a2); + mz_patch_branch(refx); + __END_INNER_TINY__(branch_short); +} + static int generate_arith(mz_jit_state *jitter, Scheme_Object *rator, Scheme_Object *rand, Scheme_Object *rand2, int orig_args, int arith, int cmp, int v, Branch_Info *for_branch, int branch_short, @@ -4653,6 +4776,7 @@ static int generate_arith(mz_jit_state *jitter, Scheme_Object *rator, Scheme_Obj arith = -2 -> / arith = -3 -> quotient arith = -4 -> remainder + arith = -5 -> modulo arith = 3 -> bitwise-and arith = 4 -> bitwise-ior arith = 5 -> bitwise-xor @@ -4664,6 +4788,7 @@ static int generate_arith(mz_jit_state *jitter, Scheme_Object *rator, Scheme_Obj arith = 11 -> abs arith = 12 -> exact->inexact arith = 13 -> sqrt + arith = 14 -> unary floating-point op (consult `rator') cmp = 0 -> = or zero? cmp = +/-1 -> >=/<= cmp = +/-2 -> >/< or positive/negative? @@ -4710,7 +4835,7 @@ static int generate_arith(mz_jit_state *jitter, Scheme_Object *rator, Scheme_Obj #endif ) { /* Unboxed (and maybe unsafe) floating-point ops. */ - int args_unboxed = ((arith != 9) && (arith != 10)); + int args_unboxed = (((arith != 9) && (arith != 10)) || rand); int flonum_depth, fl_reversed = 0, can_direct1, can_direct2; if (inlined_flonum1 && inlined_flonum2) /* safe can be implemented as unsafe */ @@ -4824,7 +4949,7 @@ static int generate_arith(mz_jit_state *jitter, Scheme_Object *rator, Scheme_Obj if (for_branch) mz_rs_sync(); /* needed if arguments were unboxed */ - generate_double_arith(jitter, arith, cmp, reversed, !!rand2, 0, + generate_double_arith(jitter, rator, arith, cmp, reversed, !!rand2, 0, &refd, &refdt, for_branch, branch_short, 1, args_unboxed, jitter->unbox); CHECK_LIMIT(); @@ -4985,7 +5110,7 @@ static int generate_arith(mz_jit_state *jitter, Scheme_Object *rator, Scheme_Obj && can_fast_double(arith, cmp, 1))) { /* Maybe they're both doubles... */ if (unsafe_fl) mz_rs_sync(); - generate_double_arith(jitter, arith, cmp, reversed, 1, 0, &refd, &refdt, + generate_double_arith(jitter, rator, arith, cmp, reversed, 1, 0, &refd, &refdt, for_branch, branch_short, unsafe_fl, 0, 0); CHECK_LIMIT(); } @@ -5035,7 +5160,7 @@ static int generate_arith(mz_jit_state *jitter, Scheme_Object *rator, Scheme_Obj if (unsafe_fl || (!unsafe_fx && has_flonum_fast && can_fast_double(arith, cmp, 1))) { /* Maybe they're both doubles... */ if (unsafe_fl) mz_rs_sync(); - generate_double_arith(jitter, arith, cmp, reversed, 1, 0, &refd, &refdt, + generate_double_arith(jitter, rator, arith, cmp, reversed, 1, 0, &refd, &refdt, for_branch, branch_short, unsafe_fl, 0, 0); CHECK_LIMIT(); } @@ -5083,7 +5208,7 @@ static int generate_arith(mz_jit_state *jitter, Scheme_Object *rator, Scheme_Obj /* watch out: divide by 0 is special: */ && ((arith != -2) || v || reversed))) { /* Maybe it's a double... */ - generate_double_arith(jitter, arith, cmp, reversed, 0, v, &refd, &refdt, + generate_double_arith(jitter, rator, arith, cmp, reversed, 0, v, &refd, &refdt, for_branch, branch_short, unsafe_fl, 0, 0); CHECK_LIMIT(); } @@ -5119,7 +5244,7 @@ static int generate_arith(mz_jit_state *jitter, Scheme_Object *rator, Scheme_Obj if (!unsafe_fl) { if (arith) { - if (((arith == -3) || (arith == -4)) && !rand2) { + if (((arith == -3) || (arith == -4) || (arith == -5)) && !rand2) { (void)jit_movi_p(JIT_R1, scheme_make_integer(v)); rand2 = scheme_true; reversed = !reversed; @@ -5163,13 +5288,17 @@ static int generate_arith(mz_jit_state *jitter, Scheme_Object *rator, Scheme_Obj /* No fast path for fixnum division, yet */ (void)jit_jmpi(refslow); } - } else if ((arith == -3) || (arith == -4)) { - /* -3 : quotient -4 : remainder */ + } else if ((arith == -3) || (arith == -4) || (arith == -5)) { + /* -3 : quotient -4 : remainder -5 : modulo */ jit_rshi_l(JIT_V1, JIT_R0, 0x1); jit_rshi_l(JIT_R2, JIT_R1, 0x1); if (reversed) { if (!unsafe_fx || overflow_refslow) (void)jit_beqi_l(refslow, JIT_R2, 0); + if (arith == -5) { + generate_modulo_setup(jitter, branch_short, JIT_V1, JIT_R2); + CHECK_LIMIT(); + } if (arith == -3) jit_divr_l(JIT_R0, JIT_V1, JIT_R2); else @@ -5177,11 +5306,51 @@ static int generate_arith(mz_jit_state *jitter, Scheme_Object *rator, Scheme_Obj } else { if (!unsafe_fx || overflow_refslow) (void)jit_beqi_l(refslow, JIT_V1, 0); + if (arith == -5) { + generate_modulo_setup(jitter, branch_short, JIT_R2, JIT_V1); + CHECK_LIMIT(); + } if (arith == -3) jit_divr_l(JIT_R0, JIT_R2, JIT_V1); else jit_modr_l(JIT_R0, JIT_R2, JIT_V1); } + if (arith == -5) { + GC_CAN_IGNORE jit_insn *refx, *refy; + __START_INNER_TINY__(branch_short); + refy = jit_beqi_l(jit_forward(), JIT_R0, 0); + refx = jit_bmci_l(jit_forward(), JIT_R1, 0x1); + if (reversed) + jit_subr_l(JIT_R0, JIT_R2, JIT_R0); + else + jit_subr_l(JIT_R0, JIT_V1, JIT_R0); + mz_patch_branch(refx); + refx = jit_bmci_l(jit_forward(), JIT_R1, 0x2); + jit_negr_l(JIT_R0, JIT_R0); + mz_patch_branch(refx); + mz_patch_branch(refy); + __END_INNER_TINY__(branch_short); + } + if (arith == -3) { + /* watch out for negation of most negative fixnum, + which is a positive number too big for a fixnum */ + if (!unsafe_fx || overflow_refslow) { + GC_CAN_IGNORE jit_insn *refx; + __START_INNER_TINY__(branch_short); + refx = jit_bnei_l(jit_forward(), JIT_R0, (void *)(((long)1 << ((8 * JIT_WORD_SIZE) - 2)))); + __END_INNER_TINY__(branch_short); + /* first argument must have been most negative fixnum, + second argument must have been -1: */ + if (reversed) + jit_movi_p(JIT_R0, (void *)(((long)1 << ((8 * JIT_WORD_SIZE) - 1)) | 0x1)); + else + jit_movi_p(JIT_R0, scheme_make_integer(-1)); + (void)jit_jmpi(refslow); + __START_INNER_TINY__(branch_short); + mz_patch_branch(refx); + __END_INNER_TINY__(branch_short); + } + } jit_lshi_l(JIT_R0, JIT_R0, 1); jit_ori_l(JIT_R0, JIT_R0, 0x1); } else if (arith == 3) { @@ -5827,6 +5996,8 @@ static int generate_nary_arith(mz_jit_state *jitter, Scheme_App_Rec *app, if (!arith && for_branch) { GC_CAN_IGNORE jit_insn *refx; + prepare_branch_jump(jitter, for_branch); + CHECK_LIMIT(); __START_SHORT_JUMPS__(branch_short); refx = jit_beqi_p(jit_forward(), JIT_R0, scheme_false); add_branch_false(for_branch, refx); @@ -6493,6 +6664,20 @@ static int generate_inlined_unary(mz_jit_state *jitter, Scheme_App2_Rec *app, in } else if (IS_NAMED_PRIM(rator, "flsqrt")) { generate_arith(jitter, rator, app->rand, NULL, 1, 13, 0, 0, NULL, 1, 0, -1, NULL); return 1; + } else if (IS_NAMED_PRIM(rator, "flfloor") + || IS_NAMED_PRIM(rator, "flceiling") + || IS_NAMED_PRIM(rator, "flround") + || IS_NAMED_PRIM(rator, "fltruncate") + || IS_NAMED_PRIM(rator, "flsin") + || IS_NAMED_PRIM(rator, "flcos") + || IS_NAMED_PRIM(rator, "fltan") + || IS_NAMED_PRIM(rator, "flasin") + || IS_NAMED_PRIM(rator, "flacos") + || IS_NAMED_PRIM(rator, "flatan") + || IS_NAMED_PRIM(rator, "flexp") + || IS_NAMED_PRIM(rator, "fllog")) { + generate_arith(jitter, rator, app->rand, NULL, 1, 14, 0, 0, NULL, 1, 0, -1, NULL); + return 1; } else if (IS_NAMED_PRIM(rator, "exact->inexact")) { generate_arith(jitter, rator, app->rand, NULL, 1, 12, 0, 0, NULL, 1, 0, 0, NULL); return 1; @@ -7106,18 +7291,51 @@ static int generate_inlined_binary(mz_jit_state *jitter, Scheme_App3_Rec *app, i } else if (IS_NAMED_PRIM(rator, "remainder")) { generate_arith(jitter, rator, app->rand1, app->rand2, 2, -4, 0, 0, NULL, 1, 0, 0, NULL); return 1; + } else if (IS_NAMED_PRIM(rator, "modulo")) { + generate_arith(jitter, rator, app->rand1, app->rand2, 2, -5, 0, 0, NULL, 1, 0, 0, NULL); + return 1; } else if (IS_NAMED_PRIM(rator, "unsafe-fxremainder")) { generate_arith(jitter, rator, app->rand1, app->rand2, 2, -4, 0, 0, NULL, 1, 1, 0, NULL); return 1; + } else if (IS_NAMED_PRIM(rator, "unsafe-fxmodulo")) { + generate_arith(jitter, rator, app->rand1, app->rand2, 2, -5, 0, 0, NULL, 1, 1, 0, NULL); + return 1; } else if (IS_NAMED_PRIM(rator, "fxremainder")) { generate_arith(jitter, rator, app->rand1, app->rand2, 2, -4, 0, 0, NULL, 1, -1, 0, NULL); return 1; + } else if (IS_NAMED_PRIM(rator, "fxmodulo")) { + generate_arith(jitter, rator, app->rand1, app->rand2, 2, -5, 0, 0, NULL, 1, -1, 0, NULL); + return 1; } else if (IS_NAMED_PRIM(rator, "min")) { generate_arith(jitter, rator, app->rand1, app->rand2, 2, 9, 0, 0, NULL, 1, 0, 0, NULL); return 1; } else if (IS_NAMED_PRIM(rator, "max")) { generate_arith(jitter, rator, app->rand1, app->rand2, 2, 10, 0, 0, NULL, 1, 0, 0, NULL); return 1; + } else if (IS_NAMED_PRIM(rator, "unsafe-flmin")) { + generate_arith(jitter, rator, app->rand1, app->rand2, 2, 9, 0, 0, NULL, 1, 0, 1, NULL); + return 1; + } else if (IS_NAMED_PRIM(rator, "unsafe-flmax")) { + generate_arith(jitter, rator, app->rand1, app->rand2, 2, 10, 0, 0, NULL, 1, 0, 1, NULL); + return 1; + } else if (IS_NAMED_PRIM(rator, "flmin")) { + generate_arith(jitter, rator, app->rand1, app->rand2, 2, 9, 0, 0, NULL, 1, 0, -1, NULL); + return 1; + } else if (IS_NAMED_PRIM(rator, "flmax")) { + generate_arith(jitter, rator, app->rand1, app->rand2, 2, 10, 0, 0, NULL, 1, 0, -1, NULL); + return 1; + } else if (IS_NAMED_PRIM(rator, "unsafe-fxmin")) { + generate_arith(jitter, rator, app->rand1, app->rand2, 2, 9, 0, 0, NULL, 1, 1, 0, NULL); + return 1; + } else if (IS_NAMED_PRIM(rator, "unsafe-fxmax")) { + generate_arith(jitter, rator, app->rand1, app->rand2, 2, 10, 0, 0, NULL, 1, 1, 0, NULL); + return 1; + } else if (IS_NAMED_PRIM(rator, "fxmin")) { + generate_arith(jitter, rator, app->rand1, app->rand2, 2, 9, 0, 0, NULL, 1, -1, 0, NULL); + return 1; + } else if (IS_NAMED_PRIM(rator, "fxmax")) { + generate_arith(jitter, rator, app->rand1, app->rand2, 2, 10, 0, 0, NULL, 1, -1, 0, NULL); + return 1; } else if (IS_NAMED_PRIM(rator, "bitwise-and")) { generate_arith(jitter, rator, app->rand1, app->rand2, 2, 3, 0, 0, NULL, 1, 0, 0, NULL); return 1; @@ -7977,11 +8195,8 @@ int generate_inlined_test(mz_jit_state *jitter, Scheme_Object *obj, int branch_s /* de-sync'd ok; syncs before jump */ { switch (SCHEME_TYPE(obj)) { -#if 0 - /* REMOVEME: need to fix this */ case scheme_application_type: return generate_inlined_nary(jitter, (Scheme_App_Rec *)obj, 0, 0, for_branch, branch_short); -#endif case scheme_application2_type: return generate_inlined_unary(jitter, (Scheme_App2_Rec *)obj, 0, 0, for_branch, branch_short, need_sync); case scheme_application3_type: diff --git a/src/mzscheme/src/lightning/i386/fp.h b/src/mzscheme/src/lightning/i386/fp.h index 89de7548ed..44c3bc313d 100644 --- a/src/mzscheme/src/lightning/i386/fp.h +++ b/src/mzscheme/src/lightning/i386/fp.h @@ -101,9 +101,10 @@ #define jit_movr_d(rd,s1) \ ((s1) == (rd) ? 0 \ - : (s1) == 0 ? FSTr ((rd)) \ - : (rd) == 0 ? (FXCHr ((s1)), FSTr ((s1))) \ - : (FLDr ((s1)), FSTr ((rd)+1))) + : (rd) == 0 ? (FSTPr(0), FSTr (((s1)-1))) \ + : (FLDr ((s1)), FSTPr ((rd)+1))) + +#define jit_movr_d_rel(rd,s1) ((rd < s1) ? (FSTPr(0), FLDr(0)) : (FSTr(1))) /* - loads: diff --git a/src/mzscheme/src/module.c b/src/mzscheme/src/module.c index 0849855f10..fa5e819c84 100644 --- a/src/mzscheme/src/module.c +++ b/src/mzscheme/src/module.c @@ -3113,7 +3113,7 @@ Scheme_Object *scheme_modidx_shift(Scheme_Object *modidx, for (j = 0; j < c; j++) { SCHEME_VEC_ELS(naya)[j] = SCHEME_VEC_ELS(cvec)[j]; } - if (!sbm->shift_cache) { + if (0 && !sbm->shift_cache) { sbm->cache_next = modidx_caching_chain; modidx_caching_chain = sbm; } diff --git a/src/mzscheme/src/mzrt.c b/src/mzscheme/src/mzrt.c index 2cf35c6197..9f7d96af53 100644 --- a/src/mzscheme/src/mzrt.c +++ b/src/mzscheme/src/mzrt.c @@ -166,7 +166,7 @@ void *mzrt_thread_stub(void *data){ scheme_init_os_thread(); proc_thread_self = stub_data->thread; - free(data); + //free(data); REMOVEME --- why does this break Mac OS X? return start_proc(start_proc_data); } @@ -214,7 +214,7 @@ mz_proc_thread* mz_proc_thread_create(mz_proc_thread_start start_proc, void* dat stub_data->data = data; stub_data->thread = thread; # ifdef WIN32 - thread->threadid = CreateThread(NULL, 0, start_proc, data, 0, NULL); + thread->threadid = CreateThread(NULL, 0, mzrt_thread_stub, stub_data, 0, NULL); # else pthread_create(&thread->threadid, attr, mzrt_thread_stub, stub_data); # endif diff --git a/src/mzscheme/src/numarith.c b/src/mzscheme/src/numarith.c index 691c5d27b0..fbf2c024b3 100644 --- a/src/mzscheme/src/numarith.c +++ b/src/mzscheme/src/numarith.c @@ -40,6 +40,7 @@ static Scheme_Object *fx_minus (int argc, Scheme_Object *argv[]); static Scheme_Object *fx_mult (int argc, Scheme_Object *argv[]); static Scheme_Object *fx_div (int argc, Scheme_Object *argv[]); static Scheme_Object *fx_rem (int argc, Scheme_Object *argv[]); +static Scheme_Object *fx_mod (int argc, Scheme_Object *argv[]); static Scheme_Object *fx_abs (int argc, Scheme_Object *argv[]); static Scheme_Object *unsafe_fx_plus (int argc, Scheme_Object *argv[]); @@ -47,6 +48,7 @@ static Scheme_Object *unsafe_fx_minus (int argc, Scheme_Object *argv[]); static Scheme_Object *unsafe_fx_mult (int argc, Scheme_Object *argv[]); static Scheme_Object *unsafe_fx_div (int argc, Scheme_Object *argv[]); static Scheme_Object *unsafe_fx_rem (int argc, Scheme_Object *argv[]); +static Scheme_Object *unsafe_fx_mod (int argc, Scheme_Object *argv[]); static Scheme_Object *unsafe_fx_abs (int argc, Scheme_Object *argv[]); static Scheme_Object *fl_plus (int argc, Scheme_Object *argv[]); @@ -122,11 +124,10 @@ void scheme_init_numarith(Scheme_Env *env) 2, 2, 2, 2), env); - scheme_add_global_constant("modulo", - scheme_make_folding_prim(scheme_modulo, - "modulo", - 2, 2, 1), - env); + + p = scheme_make_folding_prim(scheme_modulo, "modulo", 2, 2, 1); + SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED; + scheme_add_global_constant("modulo", p, env); } void scheme_init_flfxnum_numarith(Scheme_Env *env) @@ -153,6 +154,10 @@ void scheme_init_flfxnum_numarith(Scheme_Env *env) SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED; scheme_add_global_constant("fxremainder", p, env); + p = scheme_make_folding_prim(fx_mod, "fxmodulo", 2, 2, 1); + SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED; + scheme_add_global_constant("fxmodulo", p, env); + p = scheme_make_folding_prim(fx_abs, "fxabs", 1, 1, 1); SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED; scheme_add_global_constant("fxabs", p, env); @@ -218,6 +223,11 @@ void scheme_init_unsafe_numarith(Scheme_Env *env) | SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL); scheme_add_global_constant("unsafe-fxremainder", p, env); + p = scheme_make_folding_prim(unsafe_fx_mod, "unsafe-fxmodulo", 2, 2, 1); + SCHEME_PRIM_PROC_FLAGS(p) |= (SCHEME_PRIM_IS_BINARY_INLINED + | SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL); + scheme_add_global_constant("unsafe-fxmodulo", p, env); + p = scheme_make_folding_prim(unsafe_fx_abs, "unsafe-fxabs", 1, 1, 1); SCHEME_PRIM_PROC_FLAGS(p) |= (SCHEME_PRIM_IS_UNARY_INLINED | SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL); @@ -582,7 +592,9 @@ do_bin_quotient(const char *name, const Scheme_Object *n1, const Scheme_Object * "%s: undefined for 0.0", name); if (SCHEME_INTP(n1) && SCHEME_INTP(n2)) { - return (scheme_make_integer (SCHEME_INT_VAL(n1) / SCHEME_INT_VAL(n2))); + /* Beware that most negative fixnum divided by -1 + isn't a fixnum: */ + return (scheme_make_integer_value(SCHEME_INT_VAL(n1) / SCHEME_INT_VAL(n2))); } if (SCHEME_DBLP(n1) || SCHEME_DBLP(n2)) { Scheme_Object *r; @@ -781,9 +793,11 @@ rem_mod (int argc, Scheme_Object *argv[], char *name, int first_sign) if (v) { if (first_sign) { + /* remainder */ if (a < 0) v = -v; } else { + /* modulo */ int neg1, neg2; neg1 = (a < 0); @@ -880,22 +894,30 @@ quotient_remainder(int argc, Scheme_Object *argv[]) /* Flfx */ /************************************************************************/ -#define SAFE_FX(name, s_name, scheme_op) \ +#define CHECK_SECOND_ZERO(name) \ + if (!SCHEME_INT_VAL(argv[1])) \ + scheme_raise_exn(MZEXN_FAIL_CONTRACT_DIVIDE_BY_ZERO, \ + name ": undefined for 0"); + + +#define SAFE_FX(name, s_name, scheme_op, EXTRA_CHECK) \ static Scheme_Object *name(int argc, Scheme_Object *argv[]) \ { \ Scheme_Object *o; \ if (!SCHEME_INTP(argv[0])) scheme_wrong_type(s_name, "fixnum", 0, argc, argv); \ if (!SCHEME_INTP(argv[1])) scheme_wrong_type(s_name, "fixnum", 1, argc, argv); \ + EXTRA_CHECK \ o = scheme_op(argc, argv); \ if (!SCHEME_INTP(o)) scheme_non_fixnum_result(s_name, o); \ return o; \ } -SAFE_FX(fx_plus, "fx+", plus) -SAFE_FX(fx_minus, "fx-", minus) -SAFE_FX(fx_mult, "fx*", mult) -SAFE_FX(fx_div, "fxquotient", quotient) -SAFE_FX(fx_rem, "fxremainder", rem_prim) +SAFE_FX(fx_plus, "fx+", plus, ) +SAFE_FX(fx_minus, "fx-", minus, ) +SAFE_FX(fx_mult, "fx*", mult, ) +SAFE_FX(fx_div, "fxquotient", quotient, CHECK_SECOND_ZERO("fxquotient")) +SAFE_FX(fx_rem, "fxremainder", rem_prim, CHECK_SECOND_ZERO("fxremainder")) +SAFE_FX(fx_mod, "fxmodulo", scheme_modulo, CHECK_SECOND_ZERO("fxmodulo")) static Scheme_Object *fx_abs(int argc, Scheme_Object *argv[]) { @@ -921,6 +943,34 @@ UNSAFE_FX(unsafe_fx_mult, *, mult) UNSAFE_FX(unsafe_fx_div, /, quotient) UNSAFE_FX(unsafe_fx_rem, %, rem_prim) +static Scheme_Object *unsafe_fx_mod(int argc, Scheme_Object *argv[]) +{ + int neg1, neg2; + long v, v1, av1, v2, av2; + if (scheme_current_thread->constant_folding) return scheme_modulo(argc, argv); + + v1 = SCHEME_INT_VAL(argv[0]); + v2 = SCHEME_INT_VAL(argv[1]); + + av1 = (v1 < 0) ? -v1 : v1; + av2 = (v2 < 0) ? -v2 : v2; + + v = av1 % av2; + + if (v) { + neg1 = (v1 < 0); + neg2 = (v2 < 0); + + if (neg1 != neg2) + v = av2 - v; + + if (neg2) + v = -v; + } + + return scheme_make_integer(v); +} + static Scheme_Object *unsafe_fx_abs(int argc, Scheme_Object *argv[]) { long v; diff --git a/src/mzscheme/src/number.c b/src/mzscheme/src/number.c index 46080637a0..b06ab56056 100644 --- a/src/mzscheme/src/number.c +++ b/src/mzscheme/src/number.c @@ -110,6 +110,19 @@ static Scheme_Object *fx_lshift (int argc, Scheme_Object *argv[]); static Scheme_Object *fx_rshift (int argc, Scheme_Object *argv[]); static Scheme_Object *fx_to_fl (int argc, Scheme_Object *argv[]); +static Scheme_Object *fl_floor (int argc, Scheme_Object *argv[]); +static Scheme_Object *fl_ceiling (int argc, Scheme_Object *argv[]); +static Scheme_Object *fl_truncate (int argc, Scheme_Object *argv[]); +static Scheme_Object *fl_round (int argc, Scheme_Object *argv[]); +static Scheme_Object *fl_sin (int argc, Scheme_Object *argv[]); +static Scheme_Object *fl_cos (int argc, Scheme_Object *argv[]); +static Scheme_Object *fl_tan (int argc, Scheme_Object *argv[]); +static Scheme_Object *fl_asin (int argc, Scheme_Object *argv[]); +static Scheme_Object *fl_acos (int argc, Scheme_Object *argv[]); +static Scheme_Object *fl_atan (int argc, Scheme_Object *argv[]); +static Scheme_Object *fl_exp (int argc, Scheme_Object *argv[]); +static Scheme_Object *fl_log (int argc, Scheme_Object *argv[]); + static Scheme_Object *unsafe_fx_and (int argc, Scheme_Object *argv[]); static Scheme_Object *unsafe_fx_or (int argc, Scheme_Object *argv[]); static Scheme_Object *unsafe_fx_xor (int argc, Scheme_Object *argv[]); @@ -588,6 +601,67 @@ void scheme_init_flfxnum_number(Scheme_Env *env) if (scheme_can_inline_fp_op()) SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED; scheme_add_global_constant("fx->fl", p, env); + + + p = scheme_make_folding_prim(fl_truncate, "fltruncate", 1, 1, 1); + if (scheme_can_inline_fp_op()) + SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED; + scheme_add_global_constant("fltruncate", p, env); + + p = scheme_make_folding_prim(fl_round, "flround", 1, 1, 1); + if (scheme_can_inline_fp_op()) + SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED; + scheme_add_global_constant("flround", p, env); + + p = scheme_make_folding_prim(fl_ceiling, "flceiling", 1, 1, 1); + if (scheme_can_inline_fp_op()) + SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED; + scheme_add_global_constant("flceiling", p, env); + + p = scheme_make_folding_prim(fl_floor, "flfloor", 1, 1, 1); + if (scheme_can_inline_fp_op()) + SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED; + scheme_add_global_constant("flfloor", p, env); + + p = scheme_make_folding_prim(fl_sin, "flsin", 1, 1, 1); + if (scheme_can_inline_fp_op()) + SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED; + scheme_add_global_constant("flsin", p, env); + + p = scheme_make_folding_prim(fl_cos, "flcos", 1, 1, 1); + if (scheme_can_inline_fp_op()) + SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED; + scheme_add_global_constant("flcos", p, env); + + p = scheme_make_folding_prim(fl_tan, "fltan", 1, 1, 1); + if (scheme_can_inline_fp_op()) + SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED; + scheme_add_global_constant("fltan", p, env); + + p = scheme_make_folding_prim(fl_asin, "flasin", 1, 1, 1); + if (scheme_can_inline_fp_op()) + SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED; + scheme_add_global_constant("flasin", p, env); + + p = scheme_make_folding_prim(fl_acos, "flacos", 1, 1, 1); + if (scheme_can_inline_fp_op()) + SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED; + scheme_add_global_constant("flacos", p, env); + + p = scheme_make_folding_prim(fl_atan, "flatan", 1, 1, 1); + if (scheme_can_inline_fp_op()) + SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED; + scheme_add_global_constant("flatan", p, env); + + p = scheme_make_folding_prim(fl_log, "fllog", 1, 1, 1); + if (scheme_can_inline_fp_op()) + SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED; + scheme_add_global_constant("fllog", p, env); + + p = scheme_make_folding_prim(fl_exp, "flexp", 1, 1, 1); + if (scheme_can_inline_fp_op()) + SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED; + scheme_add_global_constant("flexp", p, env); } void scheme_init_unsafe_number(Scheme_Env *env) @@ -1349,6 +1423,15 @@ ceiling (int argc, Scheme_Object *argv[]) ESCAPED_BEFORE_HERE; } +XFORM_NONGCING static double SCH_TRUNC(double v) +{ + if (v > 0) + v = floor(v); + else + v = ceil(v); + return v; +} + static Scheme_Object * sch_truncate (int argc, Scheme_Object *argv[]) { @@ -1369,11 +1452,8 @@ sch_truncate (int argc, Scheme_Object *argv[]) } #endif if (t == scheme_double_type) { - double v = SCHEME_DBL_VAL(o); - if (v > 0) - v = floor(v); - else - v = ceil(v); + double v; + v = SCH_TRUNC(SCHEME_DBL_VAL(o)); return scheme_make_double(v); } if (t == scheme_bignum_type) @@ -1386,6 +1466,38 @@ sch_truncate (int argc, Scheme_Object *argv[]) ESCAPED_BEFORE_HERE; } +XFORM_NONGCING static double SCH_ROUND(double d) +{ + double i, frac; + int invert; + +#ifdef FMOD_CAN_RETURN_POS_ZERO + if ((d == 0.0) && minus_zero_p(d)) + return d; +#endif + + if (d < 0) { + d = -d; + invert = 1; + } else + invert = 0; + + frac = modf(d, &i); + if (frac < 0.5) + d = i; + else if (frac > 0.5) + d = i + 1; + else if (fmod(i, 2.0) != 0.0) + d = i + 1; + else + d = i; + + if (invert) + d = -d; + + return d; +} + static Scheme_Object * sch_round (int argc, Scheme_Object *argv[]) { @@ -1424,34 +1536,8 @@ sch_round (int argc, Scheme_Object *argv[]) } #endif if (t == scheme_double_type) { - double d = SCHEME_DBL_VAL(o); - double i, frac; - int invert; - -#ifdef FMOD_CAN_RETURN_POS_ZERO - if ((d == 0.0) && minus_zero_p(d)) - return o; -#endif - - if (d < 0) { - d = -d; - invert = 1; - } else - invert = 0; - - frac = modf(d, &i); - if (frac < 0.5) - d = i; - else if (frac > 0.5) - d = i + 1; - else if (fmod(i, 2.0) != 0.0) - d = i + 1; - else - d = i; - - if (invert) - d = -d; - + double d; + d = SCH_ROUND(SCHEME_DBL_VAL(o)); return scheme_make_double(d); } if (t == scheme_bignum_type) @@ -1464,6 +1550,11 @@ sch_round (int argc, Scheme_Object *argv[]) ESCAPED_BEFORE_HERE; } +double scheme_double_truncate(double x) { return SCH_TRUNC(x); } +double scheme_double_round(double x) { return SCH_ROUND(x); } +double scheme_double_floor(double x) { return floor(x); } +double scheme_double_ceiling(double x) { return ceil(x); } + #ifdef MZ_USE_SINGLE_FLOATS #define TO_FLOAT_VAL scheme_get_val_as_float @@ -1793,13 +1884,33 @@ MK_SCH_TRIG(SCH_TAN, tan) # define SCH_ASIN asin #endif +static double SCH_ATAN(double v) +{ +#ifdef TRIG_ZERO_NEEDS_SIGN_CHECK + if (v == 0.0) { + /* keep v the same */ + } else +#endif + v = atan(v); + return v; +} + #ifdef LOG_ZERO_ISNT_NEG_INF -double SCH_LOG(double d) { if (d == 0.0) return scheme_minus_infinity_val; else return log(d); } +static double SCH_LOG(double d) { if (d == 0.0) return scheme_minus_infinity_val; else return log(d); } #else # define SCH_LOG log #endif #define BIGNUM_LOG(o) return bignum_log(o); +double scheme_double_sin(double x) { return SCH_SIN(x); } +double scheme_double_cos(double x) { return SCH_COS(x); } +double scheme_double_tan(double x) { return SCH_TAN(x); } +double scheme_double_asin(double x) { return SCH_ASIN(x); } +double scheme_double_acos(double x) { return acos(x); } +double scheme_double_atan(double x) { return SCH_ATAN(x); } +double scheme_double_log(double x) { return SCH_LOG(x); } +double scheme_double_exp(double x) { return exp(x); } + static Scheme_Object *scheme_inf_plus_pi() { return scheme_make_complex(scheme_inf_object, scheme_pi); @@ -1927,12 +2038,7 @@ atan_prim (int argc, Scheme_Object *argv[]) if (argv[0] == zeroi) return zeroi; -#ifdef TRIG_ZERO_NEEDS_SIGN_CHECK - if (v == 0.0) { - /* keep v the same */ - } else -#endif - v = atan(v); + v = SCH_ATAN(v); #ifdef MZ_USE_SINGLE_FLOATS # ifndef USE_SINGLE_FLOATS_AS_DEFAULT @@ -3109,6 +3215,28 @@ static Scheme_Object *fx_to_fl (int argc, Scheme_Object *argv[]) return scheme_make_double(v); } +#define SAFE_FL(op) \ + static Scheme_Object * fl_ ## op (int argc, Scheme_Object *argv[]) \ + { \ + double v; \ + if (!SCHEME_DBLP(argv[0])) scheme_wrong_type("fl" #op, "inexact-real", 0, argc, argv); \ + v = scheme_double_ ## op (SCHEME_DBL_VAL(argv[0])); \ + return scheme_make_double(v); \ + } + +SAFE_FL(floor) +SAFE_FL(ceiling) +SAFE_FL(truncate) +SAFE_FL(round) +SAFE_FL(sin) +SAFE_FL(cos) +SAFE_FL(tan) +SAFE_FL(asin) +SAFE_FL(acos) +SAFE_FL(atan) +SAFE_FL(exp) +SAFE_FL(log) + #define UNSAFE_FX(name, op, fold) \ static Scheme_Object *name(int argc, Scheme_Object *argv[]) \ { \ diff --git a/src/mzscheme/src/numcomp.c b/src/mzscheme/src/numcomp.c index e5e7e79773..773ee22a22 100644 --- a/src/mzscheme/src/numcomp.c +++ b/src/mzscheme/src/numcomp.c @@ -43,24 +43,32 @@ static Scheme_Object *fx_lt (int argc, Scheme_Object *argv[]); static Scheme_Object *fx_gt (int argc, Scheme_Object *argv[]); static Scheme_Object *fx_lt_eq (int argc, Scheme_Object *argv[]); static Scheme_Object *fx_gt_eq (int argc, Scheme_Object *argv[]); +static Scheme_Object *fx_min (int argc, Scheme_Object *argv[]); +static Scheme_Object *fx_max (int argc, Scheme_Object *argv[]); static Scheme_Object *unsafe_fx_eq (int argc, Scheme_Object *argv[]); static Scheme_Object *unsafe_fx_lt (int argc, Scheme_Object *argv[]); static Scheme_Object *unsafe_fx_gt (int argc, Scheme_Object *argv[]); static Scheme_Object *unsafe_fx_lt_eq (int argc, Scheme_Object *argv[]); static Scheme_Object *unsafe_fx_gt_eq (int argc, Scheme_Object *argv[]); +static Scheme_Object *unsafe_fx_min (int argc, Scheme_Object *argv[]); +static Scheme_Object *unsafe_fx_max (int argc, Scheme_Object *argv[]); static Scheme_Object *fl_eq (int argc, Scheme_Object *argv[]); static Scheme_Object *fl_lt (int argc, Scheme_Object *argv[]); static Scheme_Object *fl_gt (int argc, Scheme_Object *argv[]); static Scheme_Object *fl_lt_eq (int argc, Scheme_Object *argv[]); static Scheme_Object *fl_gt_eq (int argc, Scheme_Object *argv[]); +static Scheme_Object *fl_min (int argc, Scheme_Object *argv[]); +static Scheme_Object *fl_max (int argc, Scheme_Object *argv[]); static Scheme_Object *unsafe_fl_eq (int argc, Scheme_Object *argv[]); static Scheme_Object *unsafe_fl_lt (int argc, Scheme_Object *argv[]); static Scheme_Object *unsafe_fl_gt (int argc, Scheme_Object *argv[]); static Scheme_Object *unsafe_fl_lt_eq (int argc, Scheme_Object *argv[]); static Scheme_Object *unsafe_fl_gt_eq (int argc, Scheme_Object *argv[]); +static Scheme_Object *unsafe_fl_min (int argc, Scheme_Object *argv[]); +static Scheme_Object *unsafe_fl_max (int argc, Scheme_Object *argv[]); #define zeroi scheme_exact_zero @@ -140,6 +148,16 @@ void scheme_init_flfxnum_numcomp(Scheme_Env *env) SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED; scheme_add_global_constant("fx>=", p, env); + p = scheme_make_folding_prim(fx_min, "fxmin", 2, 2, 1); + if (scheme_can_inline_fp_comp()) + SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED; + scheme_add_global_constant("fxmin", p, env); + + p = scheme_make_folding_prim(fx_max, "fxmax", 2, 2, 1); + if (scheme_can_inline_fp_comp()) + SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED; + scheme_add_global_constant("fxmax", p, env); + p = scheme_make_folding_prim(fl_eq, "fl=", 2, 2, 1); if (scheme_can_inline_fp_comp()) @@ -165,6 +183,16 @@ void scheme_init_flfxnum_numcomp(Scheme_Env *env) if (scheme_can_inline_fp_comp()) SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED; scheme_add_global_constant("fl>=", p, env); + + p = scheme_make_folding_prim(fl_min, "flmin", 2, 2, 1); + if (scheme_can_inline_fp_comp()) + SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED; + scheme_add_global_constant("flmin", p, env); + + p = scheme_make_folding_prim(fl_max, "flmax", 2, 2, 1); + if (scheme_can_inline_fp_comp()) + SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED; + scheme_add_global_constant("flmax", p, env); } void scheme_init_unsafe_numcomp(Scheme_Env *env) @@ -196,6 +224,16 @@ void scheme_init_unsafe_numcomp(Scheme_Env *env) | SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL); scheme_add_global_constant("unsafe-fx>=", p, env); + p = scheme_make_folding_prim(unsafe_fx_min, "unsafe-fxmin", 2, 2, 1); + SCHEME_PRIM_PROC_FLAGS(p) |= (SCHEME_PRIM_IS_BINARY_INLINED + | SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL); + scheme_add_global_constant("unsafe-fxmin", p, env); + + p = scheme_make_folding_prim(unsafe_fx_max, "unsafe-fxmax", 2, 2, 1); + SCHEME_PRIM_PROC_FLAGS(p) |= (SCHEME_PRIM_IS_BINARY_INLINED + | SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL); + scheme_add_global_constant("unsafe-fxmax", p, env); + p = scheme_make_folding_prim(unsafe_fl_eq, "unsafe-fl=", 2, 2, 1); if (scheme_can_inline_fp_comp()) SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED; @@ -225,6 +263,18 @@ void scheme_init_unsafe_numcomp(Scheme_Env *env) SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED; SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL; scheme_add_global_constant("unsafe-fl>=", p, env); + + p = scheme_make_folding_prim(unsafe_fl_min, "unsafe-flmin", 2, 2, 1); + if (scheme_can_inline_fp_comp()) + SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED; + SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL; + scheme_add_global_constant("unsafe-flmin", p, env); + + p = scheme_make_folding_prim(unsafe_fl_max, "unsafe-flmax", 2, 2, 1); + if (scheme_can_inline_fp_comp()) + SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED; + SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNSAFE_FUNCTIONAL; + scheme_add_global_constant("unsafe-flmax", p, env); } /* Prototype needed for 3m conversion: */ @@ -434,68 +484,90 @@ GEN_TWOARY_OP(static, sch_min, "min", bin_min, SCHEME_REALP, REAL_NUMBER_STR) /* Flfx */ /************************************************************************/ -#define SAFE_FX(name, s_name, op) \ +#define SAFE_FX_X(name, s_name, op, T, F) \ static Scheme_Object *name(int argc, Scheme_Object *argv[]) \ { \ if (!SCHEME_INTP(argv[0])) scheme_wrong_type(s_name, "fixnum", 0, argc, argv); \ if (!SCHEME_INTP(argv[1])) scheme_wrong_type(s_name, "fixnum", 1, argc, argv); \ if (SCHEME_INT_VAL(argv[0]) op SCHEME_INT_VAL(argv[1])) \ - return scheme_true; \ + return T; \ else \ - return scheme_false; \ + return F; \ } +#define SAFE_FX(name, s_name, op) SAFE_FX_X(name, s_name, op, scheme_true, scheme_false) + SAFE_FX(fx_eq, "fx=", ==) SAFE_FX(fx_lt, "fx<", <) SAFE_FX(fx_gt, "fx>", >) SAFE_FX(fx_lt_eq, "fx<=", <=) SAFE_FX(fx_gt_eq, "fx>=", >=) +SAFE_FX_X(fx_min, "fxmin", <, argv[0], argv[1]) +SAFE_FX_X(fx_max, "fxmax", >, argv[0], argv[1]) -#define UNSAFE_FX(name, op, fold) \ +#define UNSAFE_FX_X(name, op, fold, T, F) \ static Scheme_Object *name(int argc, Scheme_Object *argv[]) \ { \ if (scheme_current_thread->constant_folding) return (fold(argv[0], argv[1]) ? scheme_true : scheme_false); \ if (SCHEME_INT_VAL(argv[0]) op SCHEME_INT_VAL(argv[1])) \ - return scheme_true; \ + return T; \ else \ - return scheme_false; \ + return F; \ } +#define UNSAFE_FX(name, op, fold) UNSAFE_FX_X(name, op, fold, scheme_true, scheme_false) + UNSAFE_FX(unsafe_fx_eq, ==, scheme_bin_eq) UNSAFE_FX(unsafe_fx_lt, <, scheme_bin_lt) UNSAFE_FX(unsafe_fx_gt, >, scheme_bin_gt) UNSAFE_FX(unsafe_fx_lt_eq, <=, scheme_bin_lt_eq) UNSAFE_FX(unsafe_fx_gt_eq, >=, scheme_bin_gt_eq) -#define SAFE_FL(name, sname, op) \ +UNSAFE_FX_X(unsafe_fx_min, <, bin_min, argv[0], argv[1]) +UNSAFE_FX_X(unsafe_fx_max, >, bin_max, argv[0], argv[1]) + +#define SAFE_FL_X(name, sname, op, T, F) \ static Scheme_Object *name(int argc, Scheme_Object *argv[]) \ { \ if (!SCHEME_FLOATP(argv[0])) scheme_wrong_type(sname, "inexact-real", 0, argc, argv); \ if (!SCHEME_FLOATP(argv[1])) scheme_wrong_type(sname, "inexact-real", 1, argc, argv); \ if (SCHEME_DBL_VAL(argv[0]) op SCHEME_DBL_VAL(argv[1])) \ - return scheme_true; \ + return T; \ else \ - return scheme_false; \ + return F; \ } +#define SAFE_FL(name, sname, op) SAFE_FL_X(name, sname, op, scheme_true, scheme_false) + SAFE_FL(fl_eq, "fl=", ==) SAFE_FL(fl_lt, "fl<", <) SAFE_FL(fl_gt, "fl>", >) SAFE_FL(fl_lt_eq, "fl<=", <=) SAFE_FL(fl_gt_eq, "fl>=", >=) -#define UNSAFE_FL(name, op, fold) \ +SAFE_FL_X(fl_min, "flmin", <, argv[0], argv[1]) +SAFE_FL_X(fl_max, "flmax", >, argv[0], argv[1]) + +#define UNSAFE_FL_X(name, op, fold, T, F, PRE_CHECK) \ static Scheme_Object *name(int argc, Scheme_Object *argv[]) \ { \ if (scheme_current_thread->constant_folding) return (fold(argv[0], argv[1]) ? scheme_true : scheme_false); \ + PRE_CHECK \ if (SCHEME_DBL_VAL(argv[0]) op SCHEME_DBL_VAL(argv[1])) \ - return scheme_true; \ + return T; \ else \ - return scheme_false; \ + return F; \ } +#define UNSAFE_FL(name, op, fold) UNSAFE_FL_X(name, op, fold, scheme_true, scheme_false, ) + UNSAFE_FL(unsafe_fl_eq, ==, scheme_bin_eq) UNSAFE_FL(unsafe_fl_lt, <, scheme_bin_lt) UNSAFE_FL(unsafe_fl_gt, >, scheme_bin_gt) UNSAFE_FL(unsafe_fl_lt_eq, <=, scheme_bin_lt_eq) UNSAFE_FL(unsafe_fl_gt_eq, >=, scheme_bin_gt_eq) + +#define CHECK_ARGV0_NAN if (MZ_IS_NAN(SCHEME_DBL_VAL(argv[0]))) return argv[0]; + +UNSAFE_FL_X(unsafe_fl_min, <, bin_min, argv[0], argv[1], CHECK_ARGV0_NAN) +UNSAFE_FL_X(unsafe_fl_max, >, bin_max, argv[0], argv[1], CHECK_ARGV0_NAN) diff --git a/src/mzscheme/src/salloc.c b/src/mzscheme/src/salloc.c index 127ed6db5b..b3c81ba547 100644 --- a/src/mzscheme/src/salloc.c +++ b/src/mzscheme/src/salloc.c @@ -303,9 +303,6 @@ extern void GC_attach_current_thread_exceptions_to_handler(); #endif #ifdef IMPLEMENT_THREAD_LOCAL_VIA_PTHREADS -void scheme_set_thread_local_variables(void *tlvas) XFORM_SKIP_PROC { - pthread_setspecific(scheme_thread_local_key, tlvas); -} void* scheme_dbg_get_thread_local_variables() XFORM_SKIP_PROC { return pthread_getspecific(scheme_thread_local_key); } diff --git a/src/mzscheme/src/schminc.h b/src/mzscheme/src/schminc.h index 395b4cec65..51cb9c0219 100644 --- a/src/mzscheme/src/schminc.h +++ b/src/mzscheme/src/schminc.h @@ -14,8 +14,8 @@ #define USE_COMPILED_STARTUP 1 #define EXPECTED_PRIM_COUNT 962 -#define EXPECTED_UNSAFE_COUNT 53 -#define EXPECTED_FLFXNUM_COUNT 36 +#define EXPECTED_UNSAFE_COUNT 58 +#define EXPECTED_FLFXNUM_COUNT 53 #ifdef MZSCHEME_SOMETHING_OMITTED # undef USE_COMPILED_STARTUP diff --git a/src/mzscheme/src/schpriv.h b/src/mzscheme/src/schpriv.h index 14e470f145..9d53ad56dd 100644 --- a/src/mzscheme/src/schpriv.h +++ b/src/mzscheme/src/schpriv.h @@ -1793,6 +1793,21 @@ typedef struct { Scheme_Object *scheme_make_random_state(long seed); long scheme_rand(Scheme_Random_State *rs); +/***** flonums *****/ + +double scheme_double_truncate(double x); +double scheme_double_round(double x); +double scheme_double_floor(double x); +double scheme_double_ceiling(double x); +double scheme_double_sin(double x); +double scheme_double_cos(double x); +double scheme_double_tan(double x); +double scheme_double_asin(double x); +double scheme_double_acos(double x); +double scheme_double_atan(double x); +double scheme_double_log(double x); +double scheme_double_exp(double x); + /*========================================================================*/ /* read, eval, print */ /*========================================================================*/ diff --git a/src/mzscheme/src/schvers.h b/src/mzscheme/src/schvers.h index 3e84b40148..49ab82fe01 100644 --- a/src/mzscheme/src/schvers.h +++ b/src/mzscheme/src/schvers.h @@ -13,12 +13,12 @@ consistently.) */ -#define MZSCHEME_VERSION "4.2.3.9" +#define MZSCHEME_VERSION "4.2.3.10" #define MZSCHEME_VERSION_X 4 #define MZSCHEME_VERSION_Y 2 #define MZSCHEME_VERSION_Z 3 -#define MZSCHEME_VERSION_W 9 +#define MZSCHEME_VERSION_W 10 #define MZSCHEME_VERSION_MAJOR ((MZSCHEME_VERSION_X * 100) + MZSCHEME_VERSION_Y) #define MZSCHEME_VERSION_MINOR ((MZSCHEME_VERSION_Z * 1000) + MZSCHEME_VERSION_W)