aboutsummaryrefslogtreecommitdiff
path: root/include/apply.s
diff options
context:
space:
mode:
Diffstat (limited to 'include/apply.s')
-rw-r--r--include/apply.s63
1 files changed, 2 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 |