summaryrefslogtreecommitdiff
path: root/sanctuary.s
diff options
context:
space:
mode:
Diffstat (limited to 'sanctuary.s')
-rw-r--r--sanctuary.s83
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