diff options
Diffstat (limited to 'include/apply.s')
| -rw-r--r-- | include/apply.s | 63 |
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 | |
