\ optimized cmove to use cell wide @ and !
\ (C) Jens Wilke, PUBLIC DOMAIN
: (cmove) ( c_from c_to u -- )
bounds ?DO dup c@ I c! 1+ LOOP drop ;
: cmove ( c_from c_to u -- )
\ check whether optimization makes sense
dup 20 u< IF (cmove) EXIT THEN
over [ 1 cells 1- ] Literal and >r
rot dup [ 1 cells 1- ] Literal and
dup r> <>
\ relative cell offset is not identical fallback to (cmove)
IF drop -rot (cmove) EXIT THEN
?dup
IF ( c_to u c_from u2 )
[ 1 cells ] Literal swap -
>r -rot r> tuck - >r >r 2dup r> (cmove) r>
ELSE -rot
THEN
>r aligned swap aligned swap r>
2dup dup [ 1 cells 1- ] Literal and dup >r - + >r
[ 1 cells 2 = [IF] ]
1
[ [THEN] ]
[ 1 cells 4 = [IF] ]
2
[ [THEN] ]
[ 1 cells 8 = [IF] ]
3
[ [THEN] ]
tuck rshift -rot rshift swap bounds
DO dup @ I cells ! cell+ LOOP
r> r> (cmove) ;