aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorMirek Kratochvil <exa.exa@gmail.com>2023-11-03 21:28:40 +0100
committerMirek Kratochvil <exa.exa@gmail.com>2023-11-03 21:28:40 +0100
commitd7fcbcdbf0dd3976ea26800a28508785d02c2408 (patch)
treed2720d0045110b3520749be8272c76844583e1b6 /include
parent1909e97d4615045e707710a2aaeae8bf702a8355 (diff)
downloaduskel-d7fcbcdbf0dd3976ea26800a28508785d02c2408.tar.gz
uskel-d7fcbcdbf0dd3976ea26800a28508785d02c2408.tar.bz2
fix blackhole (partially), kill apply1
Diffstat (limited to 'include')
-rw-r--r--include/apply.s63
-rw-r--r--include/data.s4
-rw-r--r--include/macros.s6
-rw-r--r--include/primops.s2
4 files changed, 14 insertions, 61 deletions
diff --git a/include/apply.s b/include/apply.s
index 7c5d366..a8d6768 100644
--- a/include/apply.s
+++ b/include/apply.s
@@ -1,71 +1,12 @@
.include "include/data.s"
-#TODO apply1 seems obsolete by generic apply
-
-# | fun | arg | -> cont
-.thunkcode apply1
- needs_alloc $050
- thunkto %rsi, $apply1_fini, $3, 030(%rbp), %rbp, %rsi
- enter 020(%rbp) # evaluate fun
-
-# fun -> | arg | ret | cont |
-.thunkcode apply1_fini
- # we now know that fun points to a FUN with at least one arg missing.
- # we're certainly going to copy a lot of args.
- mov 020(%rsi), %r11 # amount of args applied now
-
- # prepare enough memory for the worst case alloc (make FUN from arg count + 3)
- lea 030(,%r11,010), %r12
- needs_alloc %r12
-
- # the copying code is shared so let's do that first:
- pushq 020(%rbp) #push the new arg
- lea 030(%rsi), %rdx # the end (first arg)
- lea (%rdx, %r11, 010), %rbx # address behind the last arg
-
- cmp %rdx, %rbx
- jbe apply1_fini_cont
-apply1_fini_copy:
- sub $010, %rbx # iterate down
- pushq (%rbx) # push what we have
- cmp %rdx, %rbx # check if we are at the end
- ja apply1_fini_copy # if not, continue
-apply1_fini_cont:
- add $1, %r11
- pushq %r11 # new number of args of fun/thunk
- pushq 010(%rsi) # thunk code pointer
-
- # copying of all args and their thunky header is now done, let's find
- # out how we need to finish it.
-
- mov (%rsi), %rdi # infotable for the original fun
- mov -010(%rdi), %r12 # amount of args required to make the thunk
- cmp %r11, %r12
- ja apply1_fini_feed # not enough args, just make a bigger FUN
-
- # if there was enough args, we simply have a thunk that we want to
- # continue evaluating, so let's jump to it.
- mov 030(%rbp), %rdi # load the original thunk
- mov %rsp, 010(%rdi) # set indirect to the new thunk
- movq $IND_code, 0(%rdi)
- mov 040(%rbp), %rsi # set continuation to the original continuation
- enter %rsp # evaluate the new thunk
-
-apply1_fini_feed:
- # if there were not enough args, we push the function info and return
- pushq (%rsi) # copy the function infoptr
-
- mov 030(%rbp), %rdi # load the original thunk
- mov %rsp, 010(%rdi) # set the indirect to the new FUN
- movq $IND_code, 0(%rdi)
- mov %rsp, %rsi # return the new FUN
- enter 040(%rbp) # jump to the continuation
-
# | fun | arg[1] | arg[2] | ... | arg[args-1] | -> cont
.thunkcode apply
needs_alloc $040
thunkto %rsi, $apply_fini, $2, %rbp, %rsi
+ # TODO: this needs to be blackholed here, but we need to copy out all
+ # the args because the blackhole can't hold them
enter 020(%rbp)
# fun -> | ret (with args) | cont |
diff --git a/include/data.s b/include/data.s
index 35c4c8d..c3f113f 100644
--- a/include/data.s
+++ b/include/data.s
@@ -67,8 +67,12 @@ IND_code:
# Blackhole (contains the original thunkptr for debugging purposes)
# | ptr | orig_thunkptr |
BLE_evacuate:
+ pushq 010(%rbp)
+ pushq $BLE_code
+ mov %rsp,%rbp
jmp _gc_evacuate_ret
BLE_scavenge:
+ add $020, %rbp
jmp _gc_scavenge_ret
BLE_info_table:
diff --git a/include/macros.s b/include/macros.s
index 051f147..81c5002 100644
--- a/include/macros.s
+++ b/include/macros.s
@@ -51,4 +51,10 @@ _macros_s_file:
mov %rsp, \reg
.endm
+.macro blackhole
+ mov (%rbp), %rax
+ mov %rax, 010(%rbp)
+ movq $BLE_code, (%rbp)
+.endm
+
.endif # _macros_s_file
diff --git a/include/primops.s b/include/primops.s
index 117bcca..5f26307 100644
--- a/include/primops.s
+++ b/include/primops.s
@@ -12,6 +12,7 @@ _primops_s_file:
needs_alloc $040
# push a thunk for collecting the first arg and set it as continuation
thunkto %rsi, $\name\()_fini, $2, %rbp, %rsi
+ blackhole
enter 020(%rbp) # evaluate arg1
# arg1 -> | ret | cont |
@@ -43,6 +44,7 @@ _primops_s_file:
needs_alloc $050
# push a thunk for collecting the first arg and set it as continuation
thunkto %rsi, $\name\()_step1, $3, 030(%rbp), %rbp, %rsi
+ blackhole
enter 020(%rbp) # evaluate arg1
# arg1 -> | arg2 | ret | cont |