1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2024-09-07 12:54:31 +00:00

Add logical shift and rename arithmetic shift

This commit is contained in:
David Schmenk 2024-07-23 14:49:33 -07:00
parent ef3b3eb1b1
commit daed69e113
3 changed files with 98 additions and 44 deletions

View File

@ -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)

Binary file not shown.

View File

@ -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