\ portable functions for 64 bit numbers
: min! ( n addr -- ) >r r@ @ min r> ! ;
: max! ( n addr -- ) >r r@ @ max r> ! ;
: umin! ( n addr -- ) >r r@ @ umin r> ! ;
: umax! ( n addr -- ) >r r@ @ umax r> ! ;
1 pad ! pad c@ negate constant le?
cell 8 = [IF]
: 64bit ;
synonym 64@ @
synonym 64! !
synonym le-64@ le-ux@
synonym le-64! le-x!
synonym be-64@ be-ux@
synonym be-64! be-x!
synonym 64>< noop
synonym n64-swap swap
synonym 64n-swap swap
synonym 64dup dup
synonym 64over over
synonym 64drop drop
synonym 64nip nip
synonym 64swap swap
synonym 64tuck tuck
synonym 64+ +
synonym 64- -
synonym 64or or
synonym 64and and
synonym 64xor xor
synonym 64Variable Variable
synonym 64User User
synonym 64Constant Constant
synonym 64Value Value
synonym 64-2/ 2/
synonym 64-2* 2*
synonym 64negate negate
synonym 64invert invert
0 Constant 64#0
1 Constant 64#1
-1 Constant 64#-1
synonym 64literal literal
synonym 64rshift rshift
synonym 64lshift lshift
synonym 64rol rol
synonym 64ror ror
synonym 64>f s>f
synonym f>64 f>s
synonym 64= =
synonym 64<> <>
-1 1 64rshift Constant max-int64
synonym u64. u.
synonym s64. .
synonym 64>n noop immediate
synonym n>64 noop immediate
synonym u>64 noop immediate
synonym 64>d s>d
synonym d>64 drop
synonym 64>r >r
synonym 64r> r>
synonym 64-0= 0=
synonym 64-0<> 0<>
synonym 64-0>= 0>=
synonym 64-0<= 0<=
synonym 64-0< 0<
synonym 64< <
synonym 64> >
synonym 64u< u<
synonym 64u> u>
synonym 64u<= u<=
synonym 64u>= u>=
synonym 64on on
synonym 64+! +!
synonym 64min min
synonym 64max max
synonym 64umin umin
synonym 64umax umax
synonym 64abs abs
synonym 64off off
synonym 64*/ */
synonym 64* *
: 128@ ( addr -- d ) 2@ swap ;
: 128! ( d addr -- ) >r swap r> 2! ;
synonym 128+ d+ \ 128 bit addition
synonym 128- d- \ 128 bit addition
synonym stop-64ns stop-ns
also locals-types definitions
synonym 64: w:
synonym 64^ w^
previous definitions
synonym 64min! min!
synonym 64max! max!
synonym 64umin! umin!
synonym 64umax! umax!
synonym 64!@ !@
synonym be@ be-ux@
synonym be! be-x!
[ELSE]
synonym n64-swap rot
synonym 64n-swap -rot
synonym 64drop 2drop
synonym 64nip 2nip
synonym 64dup 2dup
synonym 64over 2over
synonym 64swap 2swap
synonym 64tuck 2tuck
synonym 64>< swap
: 64@ 2@ 64>< ; [IFDEF] macro macro [THEN]
: 64! >r 64>< r> 2! ; [IFDEF] macro macro [THEN]
synonym le-64@ le-uxd@
synonym le-64! le-xd!
synonym be-64@ be-uxd@
synonym be-64! be-xd!
synonym 64+ d+
synonym 64- d-
: 64or rot or >r or r> ;
: 64and rot and >r and r> ;
: 64xor rot xor >r xor r> ;
synonym 64Variable 2Variable
: 64User User cell uallot drop ;
synonym 64Constant 2Constant
synonym 64Value 2Value
synonym 64-2/ d2/
synonym 64-2* d2*
synonym 64negate dnegate
: 64invert invert swap invert swap ;
#0. 2Constant 64#0
#1. 2Constant 64#1
#-1. 2Constant 64#-1
synonym 64literal 2literal
synonym 64lshift dlshift
synonym 64rshift drshift
synonym 64rol drol
synonym 64ror dror
synonym 64>f d>f
synonym f>64 f>d
synonym 64= d=
synonym 64<> d<>
#-1. 1 64rshift 64Constant max-int64
synonym u64. ud.
synonym s64. d.
synonym 64>n drop
synonym 64>d noop immediate
synonym d>64 noop immediate
synonym n>64 s>d
synonym u>64 false
synonym 64>r 2>r
synonym 64r> 2r>
synonym 64-0= d0=
synonym 64-0<> d0<>
synonym 64-0>= d0>=
synonym 64-0<= d0<=
synonym 64-0< d0<
synonym 64< d<
synonym 64> d>
synonym 64u< du<
synonym 64u> du>
synonym 64u<= du<=
synonym 64u>= du>=
: 64on ( addr -- ) >r 64#-1 r> 64! ;
: 64+! ( 64n addr -- ) dup >r 64@ 64+ r> 64! ;
synonym 64min dmin
synonym 64max dmax
: 64umin 2over 2over du> IF 2swap THEN 2drop ;
: 64umax 2over 2over du< IF 2swap THEN 2drop ;
synonym 64abs dabs
: 64off #0. rot 64! ;
synonym 64*/ m*/
: 64* ( d1 d2 -- d3 ) { l1 h1 l2 h2 }
l1 l2 um* l1 h2 um* l2 h1 um* d+ drop + ;
: 128@ ( addr -- x1..x4 )
>r
r@ @
r@ cell+ @
r@ 2 cells + @
r> 3 cells + @ ;
: 128! ( x1..x4 addr -- )
>r
r@ 3 cells + !
r@ 2 cells + !
r@ cell+ !
r> ! ;
synonym stop-64ns stop-dns
: compile-pushlocal-64 ( a-addr -- ) ( run-time: w1 w2 -- )
locals-size @ alignlp-w cell+ cell+ dup locals-size !
swap !
postpone >l postpone >l ;
also locals-types definitions
synonym 64: d:
: 64^ ( "name" -- a-addr xt ) \ net2o 64-caret
create-local
['] compile-pushlocal-64
does> ( Compilation: -- ) ( Run-time: -- w )
postpone laddr# @ lp-offset, ;
previous definitions
' dummy-dict ' dict-execute ' locals-types:64^ wrap-xt dummy-64^ 2drop
: dumin ( ud1 ud2 -- ud3 ) 2over 2over du> IF 2swap THEN 2drop ;
: dumax ( ud1 ud2 -- ud3 ) 2over 2over du< IF 2swap THEN 2drop ;
: 64!@ ( value addr -- old-value ) >r r@ 64@ 64swap r> 64! ;
: 64min! ( d addr -- ) >r r@ 64@ dmin r> 64! ;
: 64max! ( d addr -- ) >r r@ 64@ dmax r> 64! ;
: 64umin! ( n addr -- ) >r r@ 64@ dumin r> 64! ;
: 64umax! ( n addr -- ) >r r@ 64@ dumin r> 64! ;
synonym be@ be-ul@
synonym be! be-l!
: 128+ ( 128a 128b -- 128c ) \ 128 bit addition
{ d: a1 d: a2 d: b1 d: b2 }
a1 b1 d+ a2 b2 d+ 2over a1 du< s>d d- ;
: 128- ( 128a 128b -- 128c ) \ 128 bit addition
{ d: a1 d: a2 d: b1 d: b2 }
a1 b1 d- a2 b2 d- 2over a1 du> s>d d+ ;
[THEN]
\ independent of cell size, using dfloats:
synonym 64s dfloats
synonym 64'+ dfloat+
synonym 64aligned dfaligned
synonym 64field: dffield:
: x64. ( 64n -- ) ['] u64. $10 base-execute ;
: le-128@ ( addr -- d )
dup >r le-64@ r> 64'+ le-64@ ;
: le-128! ( d addr -- )
dup >r 64'+ le-64! r> le-64! ;
: be-128@ ( addr -- d )
dup >r 64'+ be-64@ r> be-64@ ;
: be-128! ( d addr -- )
dup >r be-64! r> 64'+ be-64! ;
: 64>128 ( 64 -- 128 ) 64dup 64-0< n>64 ;
Create 64!-table ' 64! , ' 64+! ,
1 64s ' 64aligned ' 64@ 64!-table wrap+value: 64value: ( u1 "name" -- u2 )