stack-machine/asm/lib/memcmp.txt

49 lines
744 B
Plaintext

#int memcmp(const void *data, const void *base, size_t sz)
#{
# const uint8_t *p = (const uint8_t*)data;
# const uint8_t *q = (const uint8_t*)base;
#
# while (sz-- > 0)
# {
# int c = *p++ - *q++;
# if (c != 0)
# return c;
# }
# return 0;
#}
# ( p1 p2 sz -- diff )
memcmp:
jump .nonempty rel ne
drop2
immed 0
nip return # ( 0 // )
.nonempty:
push
dup
push
swap
dup
push # ( p2 p1 // p1 p2 sz )
load byte
swap
load byte # ( [p1] [p2] // p1 p2 sz )
sub
jump .zero rel eq
rdrop
rdrop
rdrop
return # ( diff // )
.zero: # ( diff // p1 p2 sz )
drop
pop
immed 1
add
pop
immed 1
add
pop
immed 1
sub
jump memcpy # ( p1+1 p2+1 sz-1 // )