X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fx86-64-assem.S;h=6ea7d2153562b86e8bbcb7e397a75642ff438dca;hb=2b90fd1dbad23322258222a2ef4cef7f6a00831d;hp=02c508a4e05462c3e4161ba92fcb18ffb47b01ec;hpb=ee41b142b86e50983bd885141eaf2ede02815000;p=sbcl.git diff --git a/src/runtime/x86-64-assem.S b/src/runtime/x86-64-assem.S index 02c508a..6ea7d21 100644 --- a/src/runtime/x86-64-assem.S +++ b/src/runtime/x86-64-assem.S @@ -17,6 +17,7 @@ #include "validate.h" #include "sbcl.h" #include "genesis/closure.h" +#include "genesis/funcallable-instance.h" #include "genesis/fdefn.h" #include "genesis/static-symbols.h" #include "genesis/symbol.h" @@ -170,8 +171,9 @@ Lcall: /* If the function returned multiple values, it will return to this point. Lose them */ + jnc LsingleValue mov %rbx, %rsp - /* A singled value function returns here */ +LsingleValue: /* Restore the stack, in case there was a stack change. */ pop %rsp # c-sp @@ -282,6 +284,17 @@ GNAME(closure_tramp): jmp *CLOSURE_FUN_OFFSET(%rax) .size GNAME(closure_tramp), .-GNAME(closure_tramp) + .text + .align align_8byte,0x90 + .global GNAME(funcallable_instance_tramp) + .type GNAME(funcallable_instance_tramp),@function +GNAME(funcallable_instance_tramp): + mov FUNCALLABLE_INSTANCE_FUNCTION_OFFSET(%rax),%rax + /* KLUDGE: on this platform, whatever kind of function is in %rax + * now, the first word of it contains the address to jump to. */ + jmp *CLOSURE_FUN_OFFSET(%rax) + .size GNAME(funcallable_instance_tramp), .-GNAME(funcallable_instance_tramp) + /* * fun-end breakpoint magic */ @@ -290,11 +303,7 @@ GNAME(closure_tramp): .align align_8byte GNAME(fun_end_breakpoint_guts): /* Multiple Value return */ - jmp multiple_value_return - /* the above jmp is only 2 bytes long, we need to add a nop for - * padding since the single value return convention jumps to original - * return address + 3 bytes */ - nop + jc multiple_value_return /* Single value return: The eventual return will now use the multiple values return convention but with a return values count of one. */