diff options
Diffstat (limited to 'sanctuary.s')
| -rw-r--r-- | sanctuary.s | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/sanctuary.s b/sanctuary.s index 44cd4af..1b9fd0f 100644 --- a/sanctuary.s +++ b/sanctuary.s @@ -661,6 +661,81 @@ defcode "rdrop", rdrop, 0 ret ; }}} +; memory access {{{ +defcode "@", fetch, 0 + pspop r11 + mov r12, qword [r11] + pspush r12 + ret + +defcode "c@", cfetch, 0 + pspop r11 + xor r12, r12 + mov r12b, byte [r11] + pspush r12 + ret + +defcode "!", store, 0 + pspop r11 + pspop r12 + mov qword [r11], r12 + ret + +defcode "c!", cstore, 0 + pspop r11 + pspop r12 + mov byte [r11], r12b + ret + +defcode "+!", plusstore, 0 + pspop r11 + pspop r12 + add qword [r11], r12 + ret + +defcode "-!", minusstore, 0 + pspop r11 + pspop r12 + sub qword [r11], r12 + ret + +defcode ",", comma, 0 + pspop r11 + mov r12, [here] + mov qword [r12], r11 + add r12, 8 + mov qword [here], r12 + ret + +defcode "c,", c_comma, 0 + pspop r11 + mov r12, [here] + mov byte [r12], r11b + inc r12 + mov qword [here], r12 + ret + +defcode "cmove", _cmove, 0 + pspop rcx + pspop rdi + pspop rsi + + rep movsb + ret + +defcode "cmove>", cmove_to, 0 + std + pspop rcx + pspop rdi + add rdi, rcx + pspop rsi + add rsi, rcx + + rep movsb + cld + ret +; }}} + ; math + comparison {{{ ; i believe some of these could be improved by direct accesses to [r15] defcode "+", plus, 0 @@ -677,6 +752,14 @@ defcode "-", minus, 0 pspush r12 ret +defcode "1+", oneplus, 0 + inc qword [r15] + ret + +defcode "1-", oneminus, 0 + dec qword [r15] + ret + defcode "*", _times, 0 pspop r11 pspop r12 |
