diff --git a/doc/bytecode.txt b/doc/bytecode.txt index c7115b4..d741604 100644 --- a/doc/bytecode.txt +++ b/doc/bytecode.txt @@ -4,119 +4,120 @@ top: 1xxxxxxx out in in: conditional expression: up to 64, 1 out, 2 in 00000000 out sub in: unary-expr - 00000001 out sub in: unary-float-expr 00xxxxxx out in in: binary-expr, x > 1 unary-expr: up to 255, 1 out, 1 in - (set! out in) - (set! out (car in)) - (set! out (cdr in)) - (set! out (unbox in)) - (set! out (not in)) ; if in == #f then #t else #f - (set! out (nil? in)) ; value => bool - (set! out (pair? in)) ; value => bool - (set! out (box? in)) ; value => bool - (set! out (vector? in)) ; value => bool - (set! out (byte-string? in)) ; value => bool - (set! out (struct? in)) ; value => bool - (set! out (fixnum? in)) ; value => bool - (set! out (float? in)) ; value => bool - (set! out (make-box in)) ; value => box - (set! out (make-struct in)) ; metastruct => struct - (set! out (make-float in)) ; fixnum => float - (set! out (lambda in)) ; template-or-lambda => lambda - (set! out (fix- in)) ; two's complement / arithmetic negation - (set! out (bit-not in)) ; one's complement / bitwise negation -unary-float-expr: up to 255, 1 out, 1 in - (set! out (float- in)) + 00 invalid / permanently reserved + 01 (set! out in) + 02 (set! out (car in)) + 03 (set! out (cdr in)) + 04 (set! out (unbox in)) + 05 (set! out (not in)) ; if in == #f then #t else #f + 06 (set! out (nil? in)) ; value => bool + 07 (set! out (pair? in)) ; value => bool + 08 (set! out (box? in)) ; value => bool + 09 (set! out (vector? in)) ; value => bool + 0a (set! out (byte-string? in)) ; value => bool + 0b (set! out (struct? in)) ; value => bool + 0c (set! out (fixnum? in)) ; value => bool + 0d (set! out (float? in)) ; value => bool + 0e (set! out (make-box in)) ; value => box + 0f (set! out (make-struct in)) ; metastruct => struct + 10 (set! out (make-float in)) ; fixnum => float + 11 (set! out (lambda in)) ; template-or-lambda => lambda + 12 (set! out (bit-not in)) ; one's complement / bitwise negation + 13 (set! out (fix- in)) ; two's complement / arithmetic negation + 14 (set! out (float- in)) ; floating-point negation - ; ISO C - (set! out (acos in)) - (set! out (asin in)) - (set! out (atan in)) - (set! out (cos in)) - (set! out (sin in)) - (set! out (tan in)) - (set! out (cosh in)) - (set! out (sinh in)) - (set! out (tanh in)) - (set! out (exp in)) - (set! out (frexp in)) ; float => (float . fixnum) - (set! out (log in)) ; base e - (set! out (log10 in)) - (set! out (modf in)) ; float => (float . float) - (set! out (sqrt in)) - (set! out (ceil in)) - (set! out (fabs in)) - (set! out (floor in)) + ; ISO C floating-point + 20 (set! out (acos in)) + 21 (set! out (asin in)) + 22 (set! out (atan in)) + 23 (set! out (cos in)) + 24 (set! out (sin in)) + 25 (set! out (tan in)) + 26 (set! out (cosh in)) + 27 (set! out (sinh in)) + 28 (set! out (tanh in)) + 29 (set! out (exp in)) + 2a (set! out (frexp in)) ; float => (float . fixnum) + 2b (set! out (log in)) ; base e + 2c (set! out (log10 in)) + 2d (set! out (modf in)) ; float => (float . float) + 2e (set! out (sqrt in)) + 2f (set! out (ceil in)) + 30 (set! out (fabs in)) + 31 (set! out (floor in)) ; SVID & X/Open - (set! out (erf in)) - (set! out (erfc in)) - ;(set! out (gamma in)) ; obsolete - (set! out (j0 in)) - (set! out (j1 in)) - (set! out (lgamma in)) ; float => (float . fixnum), actually lgamma_r - (set! out (y0 in)) - (set! out (y1 in)) + 40 (set! out (erf in)) + 41 (set! out (erfc in)) + ; (set! out (gamma in)) ; obsolete + 42 (set! out (j0 in)) + 43 (set! out (j1 in)) + 44 (set! out (lgamma in)) ; float => (float . fixnum), actually lgamma_r + 45 (set! out (y0 in)) + 46 (set! out (y1 in)) ; SVID & XPG 4.2/5 - (set! out (asinh in)) - (set! out (acosh in)) - (set! out (atanh in)) - (set! out (cbrt in)) - (set! out (logb in)) + 47 (set! out (asinh in)) + 48 (set! out (acosh in)) + 49 (set! out (atanh in)) + 4a (set! out (cbrt in)) + 4b (set! out (logb in)) ; XPG 4.2/5 - (set! out (expm1 in)) - (set! out (ilogb in)) - (set! out (log1p in)) - ;(set! out (rint in)) ; implies changing rounding mode; use floor or ceil -binary-expr: up to 64, 1 out, 2 in - (set! out (cons in1 in2)) ; car cdr - (set! out (make-vector in1 in2)) ; nelem iv, nelem >= 0 - (set! out (make-byte-string in1 in2)) ; nbytes iv, nbytes >= 0 - (set! out (vector-ref in1 in2)) ; vector n, 0 <= n < nelem - (set! out (byte-string-ref in1 in2)) ; string n, 0 <= n < nbytes - (set! out (struct-ref in1 in2)) ; struct n, 0 <= n < nslots - (set! out (eq? in1 in2)) ; any values; superset of (fix= in2 in1) - (set! out (fix+ in1 in2)) - (set! out (fix- in1 in2)) - (set! out (fix* in1 in2)) - (set! out (fix/ in1 in2)) - (set! out (fix% in1 in2)) - (set! out (fix< in1 in2)) ; == (fix> in2 in1) - (set! out (fix>= in1 in2)) ; == (fix<= in2 in1) - (set! out (bit-and in1 in2)) - (set! out (bit-or in1 in2)) - (set! out (bit-xor in1 in2)) - (set! out (fix<< in1 in2)) ; arithmetic left-shift (2*x) w/ overflow into sign - (set! out (fix>> in1 in2)) ; arithmetic right-shift (x/2) - (set! out (fix>>> in1 in2)) ; logical right-shift; sign becomes zero (+) - (set! out (float+ in1 in2)) - (set! out (float- in1 in2)) - (set! out (float* in1 in2)) - (set! out (float/ in1 in2)) - (set! out (float< in1 in2)) ; == (float> in2 in1) - (set! out (float>= in1 in2)) ; == (float<= in2 in1) - (set! out (atan2 in1 in2)) ; float float - (set! out (pow in1 in2)) ; float float - (set! out (ldexp in1 in2)) ; float fixnum - (set! out (fmod in1 in2)) ; float float - (set! out (hypot in1 in2)) ; float float - (set! out (jn in1 in2)) ; fixnum float - (set! out (yn in1 in2)) ; fixnum float - (set! out (nextafter in1 in2)) ; float float - (set! out (remainder in1 in2)) ; float float - (set! out (scalb in1 in2)) ; float float + 4c (set! out (expm1 in)) + 4d (set! out (ilogb in)) + 4e (set! out (log1p in)) + ; (set! out (rint in)) ; implies changing rounding mode; use floor or ceil +binary-expr: up to 63 (01..3f), 1 out, 2 in + 00 unary-expr + 01 (set! out (cons in1 in2)) ; car cdr + 02 (set! out (make-vector in1 in2)) ; nelem iv, nelem >= 0 + 03 (set! out (make-byte-string in1 in2)) ; nbytes iv, nbytes >= 0 + 04 (set! out (vector-ref in1 in2)) ; vector n, 0 <= n < nelem + 05 (set! out (byte-string-ref in1 in2)) ; string n, 0 <= n < nbytes + 06 (set! out (struct-ref in1 in2)) ; struct n, 0 <= n < nslots + 07 (set! out (eq? in1 in2)) ; any values; superset of (fix= in2 in1) + 08 (set! out (fix+ in1 in2)) + 09 (set! out (fix- in1 in2)) + 0a (set! out (fix* in1 in2)) + 0b (set! out (fix/ in1 in2)) + 0c (set! out (fix% in1 in2)) + 0d (set! out (fix< in1 in2)) ; == (fix> in2 in1) + 0e (set! out (fix>= in1 in2)) ; == (fix<= in2 in1) + 0f (set! out (bit-and in1 in2)) + 10 (set! out (bit-or in1 in2)) + 11 (set! out (bit-xor in1 in2)) + 12 (set! out (fix<< in1 in2)) ; arithmetic left-shift (2*x) w/ overflow into sign + 13 (set! out (fix>> in1 in2)) ; arithmetic right-shift (x/2) + 14 (set! out (fix>>> in1 in2)) ; logical right-shift; sign becomes zero (+) + 15 (set! out (float+ in1 in2)) + 16 (set! out (float- in1 in2)) + 17 (set! out (float* in1 in2)) + 18 (set! out (float/ in1 in2)) + 19 (set! out (float< in1 in2)) ; == (float> in2 in1) + 1a (set! out (float>= in1 in2)) ; == (float<= in2 in1) + 1b (set! out (atan2 in1 in2)) ; float float + 1c (set! out (pow in1 in2)) ; float float + 1d (set! out (ldexp in1 in2)) ; float fixnum + 1e (set! out (fmod in1 in2)) ; float float + 1f (set! out (hypot in1 in2)) ; float float + 20 (set! out (jn in1 in2)) ; fixnum float + 21 (set! out (yn in1 in2)) ; fixnum float + 22 (set! out (nextafter in1 in2)) ; float float + 23 (set! out (remainder in1 in2)) ; float float + 24 (set! out (scalb in1 in2)) ; float float conditional: 1AAAAAAA; 1 out, 2 in + fA - (set! out (if fA in1 in2)) ; in2 if fA == #f, in1 otherwise -statement: up to 64, 3 in - (set-box! in in) ; box value - (set-car! in in) ; pair value - (set-cdr! in in) ; pair value - (vector-set! in in in) ; vector n value, 0 <= n < nelem - (byte-string-set! in in in) ; string n value, 0 <= n < nbytes - (struct-set! in in in) ; struct n value, 1 <= n < nslots + AA (set! out (if fA in1 in2)) ; in2 if fA == #f, in1 otherwise +statement: up to 64 (40..7f), 3 in + 40 (set-box! in in) ; box value + 41 (set-car! in in) ; pair value + 42 (set-cdr! in in) ; pair value + + 60 (vector-set! in in in) ; vector n value, 0 <= n < nelem + 61 (byte-string-set! in in in) ; string n value, 0 <= n < nbytes + 62 (struct-set! in in in) ; struct n value, 0 <= n < nslots in: nil (00000000) [g0, always NIL]