From daed69e1134dbcb075b191b58b779e4eb3a8b1f9 Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Tue, 23 Jul 2024 14:49:33 -0700 Subject: [PATCH] Add logical shift and rename arithmetic shift --- doc/DRAWL.md | 3 +- images/apple/DRAWL.po | Bin 143360 -> 143360 bytes src/lisp/s-math.pla | 139 +++++++++++++++++++++++++++++------------- 3 files changed, 98 insertions(+), 44 deletions(-) diff --git a/doc/DRAWL.md b/doc/DRAWL.md index aefe916..6bfd023 100644 --- a/doc/DRAWL.md +++ b/doc/DRAWL.md @@ -120,7 +120,8 @@ The DRAWL implementation comes with the following built-in functions: - BITAND() = Bit-wise AND - BITOR() = Bit-wise OR - BITXOR= Bit-wise XOR -- SHIFT() = Bit-wise SHIFT (positive = left, negative = right) +- ARITHSHIFT() = Bit-wise arithmetic SHIFT (positive = left, negative = right) +- LOGICSHIFT() = Bit-wise logicalal SHIFT (positive = left, negative = right) - ROTATE() = Bit-wise ROTATE (positive = left, negative = right) ### Floating Point (from the SANE library) diff --git a/images/apple/DRAWL.po b/images/apple/DRAWL.po index 69282b458eb63d01c3fe41def979b56b8fab8fe8..3a06594b027f5c68745e28639afe0ccf14d69509 100644 GIT binary patch delta 1558 zcmZY7Z)h8390%~R_b*+gS+NqE6=X3JIhsFL7DESG8^8_po1h^~TDoi}|PXOMP^`!^A{_QKb*maO=j!1?$u5 zNb6}E`>UH>3zHmD{l@~Phic}SWjDhVh$mCAWX5PxFVa2K;jng?Tv^pFK~s`HiZ8i&gM!)!jAa^^61l-#tX!;EAN@$w$cKgy}hbaUphIImYy=2i4E+pef9pbxlFP0?%P;3d0kLnIu{Fj&q|HyT*y{>wI3|n zN9`0J`c8ZQJV#kubAkJWM;uZvS=f=^k&G7#MB7?k2-MaE9jQzrIcUCle0|WC%M_$S zteGnRKFyoTPhR5FEyD5jn(s3I(o(88x63D;B%gDV@{()2vd<-Da4&oj?t^c@x8MXk0zZVGz|Y|4@GQIte}=!pS-1f0 z-iYk+lHBGc<$mwI%35z&_B$}?_J);!H>{0a;WAf!f}5v)V!?Lv)}Mdf{u}?#9BVwo e4X1GDAI$1JRbvm=kFvn(UTKr+6Ru6wx&MD+7MqX& delta 1418 zcmZY7TSydP6bJBg#?j2#rY%&q)a*iLWnQv}7AslY)wXusWoPX|1w~W@K@iwW59>hG zOAyl}3&}o2;X_J9OKlHDQAtGCgjWQPt>_FqH)=sq?$5R<5S;Usg5ckjtKWYg8EnJ!V!JA3;@V z(6`B7K2bN~MpbN zjb*XXH()kN9;RuOpJVM1n_QLa3N9{! zTG!{vRg1li;p&xXRYysr;Y@2UXGi*O^qtn}adSG~*!sne@$DE>xrr8f+^)v-gUzB0kiyu$LXt;xn9nHqpQt&X3q=Rh}g+KcdC%kZZFqZQb8+Mm^RuLabErgv)(i zB{-H8e^UnO*2_X{4kGC}@ej`KERQygjQxR-EA+d9=~3}7a*M`t6ER0ao!ip&A7ZDi zS7CImchyW{7ab%(QRH z*XH^HA&)YV6B)4wsn~S$Ka?11W3kkx$if~Xx4n|C7bI+Vd4%IE3~)lY&)>46m!I%p z)ZWd7iO#27CKP2V>%H~iFwyFaLnXa)%daazyJ7&TN~sAzvU50_%(o8 YlH2=O=3!kej>PRk3!fJ%&)IW?{{x|JtpET3 diff --git a/src/lisp/s-math.pla b/src/lisp/s-math.pla index eb9e2fa..30b82a0 100644 --- a/src/lisp/s-math.pla +++ b/src/lisp/s-math.pla @@ -587,7 +587,7 @@ def natv_bitxor(symptr, expr) return new_int(bitval[0] ^ symptr=>intval[0], bitval[1] ^ symptr=>intval[1]) end -def natv_shift(symptr, expr) +def natv_arithshift(symptr, expr) var[2] bitval var shift @@ -636,6 +636,55 @@ def natv_shift(symptr, expr) return new_int(bitval[0], bitval[1]) end +def natv_logicshift(symptr, expr) + var[2] bitval + var shift + + symptr = eval_int(expr) + bitval[0] = symptr=>intval[0] + bitval[1] = symptr=>intval[1] + symptr = eval_int(expr=>cdr) + shift = symptr=>intval[0] + if shift < 0 + // + // Shift right + // + if shift < -31 + bitval[1] = 0 + bitval[0] = 0 + else + while shift < 0 + bitval[0] = bitval[0] >> 1 + if bitval[1] & 1 + bitval[0] = bitval[0] | $8000 + else + bitval[0] = bitval[0] & $7FFF + fin + bitval[1] = (bitval[1] >> 1) & $7FFF + shift++ + loop + fin + else + // + // Shift left + // + if shift > 31 + bitval[0] = 0 + bitval[1] = 0 + else + while shift > 0 + bitval[1] = bitval[1] << 1 + if bitval[0] & $8000 + bitval[1] = bitval[1] | 1 + fin + bitval[0] = bitval[0] << 1 + shift-- + loop + fin + fin + return new_int(bitval[0], bitval[1]) +end + def natv_rotate(symptr, expr) var[2] bitval var rotate, wrap @@ -678,49 +727,53 @@ end // sane:initFP() -new_sym("PI")=>apval = new_float(@ext_pi) ^ NULL_HACK -new_sym("MATH_E")=>apval = new_float(@ext_e) ^ NULL_HACK +new_sym("PI")=>apval = new_float(@ext_pi) ^ NULL_HACK +new_sym("MATH_E")=>apval = new_float(@ext_e) ^ NULL_HACK +new_sym("SUM")=>natv = @natv_sum +new_sym("+")=>natv = @natv_sum +new_sym("-")=>natv = @natv_sub +new_sym("*")=>natv = @natv_mul +new_sym("/")=>natv = @natv_div +new_sym("REM")=>natv = @natv_rem +new_sym("NEG")=>natv = @natv_neg +new_sym("ABS")=>natv = @natv_abs +new_sym(">")=>natv = @natv_gt +new_sym("<")=>natv = @natv_lt +new_sym("MIN")=>natv = @natv_min +new_sym("MAX")=>natv = @natv_max +new_sym("LOGB")=>natv = @natv_logb +new_sym("SCALEB_I")=>natv = @natv_scalebI +new_sym("TRUNCATE")=>natv = @natv_trunc +new_sym("ROUND")=>natv = @natv_round +new_sym("SQRT")=>natv = @natv_sqrt +new_sym("COS")=>natv = @natv_cos +new_sym("SIN")=>natv = @natv_sin +new_sym("TAN")=>natv = @natv_tan +new_sym("ATAN")=>natv = @natv_atan +new_sym("LOG2")=>natv = @natv_log2 +new_sym("LOG2_1")=>natv = @natv_log21 +new_sym("LN")=>natv = @natv_ln +new_sym("LN_1")=>natv = @natv_ln1 +new_sym("POW2")=>natv = @natv_pow2 +new_sym("POW2_1")=>natv = @natv_pow21 +new_sym("POWE")=>natv = @natv_powE +new_sym("POWE_1")=>natv = @natv_powE1 +new_sym("POW_I")=>natv = @natv_powI +new_sym("POWY")=>natv = @natv_pow +new_sym("COMP")=>natv = @natv_comp +new_sym("ANNUITY")=>natv = @natv_annuity +new_sym("BITNOT")=>natv = @natv_bitnot +new_sym("BITAND")=>natv = @natv_bitand +new_sym("BITOR")=>natv = @natv_bitor +new_sym("BITXOR")=>natv = @natv_bitxor +new_sym("ARITHSHIFT")=>natv = @natv_arithshift +new_sym("LOGICSHIFT")=>natv = @natv_logicshift +new_sym("ROTATE")=>natv = @natv_rotate memcpy(@tempext, @ext_pi, t_extended) +// +// Force load of ELEM library +// sane:saveZP() -sane:restoreZP(sane:op1ELEM(FOSINX, @tempext)) // Force load of ELEMS library -new_sym("SUM")=>natv = @natv_sum -new_sym("+")=>natv = @natv_sum -new_sym("-")=>natv = @natv_sub -new_sym("*")=>natv = @natv_mul -new_sym("/")=>natv = @natv_div -new_sym("REM")=>natv = @natv_rem -new_sym("NEG")=>natv = @natv_neg -new_sym("ABS")=>natv = @natv_abs -new_sym(">")=>natv = @natv_gt -new_sym("<")=>natv = @natv_lt -new_sym("MIN")=>natv = @natv_min -new_sym("MAX")=>natv = @natv_max -new_sym("LOGB")=>natv = @natv_logb -new_sym("SCALEB_I")=>natv = @natv_scalebI -new_sym("TRUNCATE")=>natv = @natv_trunc -new_sym("ROUND")=>natv = @natv_round -new_sym("SQRT")=>natv = @natv_sqrt -new_sym("COS")=>natv = @natv_cos -new_sym("SIN")=>natv = @natv_sin -new_sym("TAN")=>natv = @natv_tan -new_sym("ATAN")=>natv = @natv_atan -new_sym("LOG2")=>natv = @natv_log2 -new_sym("LOG2_1")=>natv = @natv_log21 -new_sym("LN")=>natv = @natv_ln -new_sym("LN_1")=>natv = @natv_ln1 -new_sym("POW2")=>natv = @natv_pow2 -new_sym("POW2_1")=>natv = @natv_pow21 -new_sym("POWE")=>natv = @natv_powE -new_sym("POWE_1")=>natv = @natv_powE1 -new_sym("POW_I")=>natv = @natv_powI -new_sym("POWY")=>natv = @natv_pow -new_sym("COMP")=>natv = @natv_comp -new_sym("ANNUITY")=>natv = @natv_annuity -new_sym("BITNOT")=>natv = @natv_bitnot -new_sym("BITAND")=>natv = @natv_bitand -new_sym("BITOR")=>natv = @natv_bitor -new_sym("BITXOR")=>natv = @natv_bitxor -new_sym("SHIFT")=>natv = @natv_shift -new_sym("ROTATE")=>natv = @natv_rotate +sane:restoreZP(sane:op1ELEM(FOSINX, @tempext)) return modkeep | modinitkeep done