Index: src/invocation/apple-call-x86_64.S ================================================================== --- src/invocation/apple-call-x86_64.S +++ src/invocation/apple-call-x86_64.S @@ -60,12 +60,24 @@ movq 24(%rdi), %rcx movq 16(%rdi), %rdx movq 8(%rdi), %rsi movq 0(%rdi), %rdi + movb 225(%rdi), %r11b + + cmpb $1, %r11b + je Lcall_send_stret + + cmpb $3, %r11b + je _objc_msgSend + + cmpb $4, %r11b + je _objc_msgSend_stret + call _objc_msgSend +Lafter_send: movq -8(%rbp), %rdi movq %rax, 48(%rdi) movq %rdx, 56(%rdi) movdqa %xmm0, 64(%rdi) movdqa %xmm1, 80(%rdi) @@ -81,9 +93,13 @@ Lfix_align: xorq %r11, %r11 pushq %r11 jmp Lfill_stack + +Lcall_send_stret: + call _objc_msgSend_stret + jmp Lafter_send Lpop_long_double: fstpt 192(%rdi) jmp Lreturn Index: src/invocation/invoke-x86_64.m ================================================================== --- src/invocation/invoke-x86_64.m +++ src/invocation/invoke-x86_64.m @@ -32,11 +32,13 @@ #define NUM_X87_OUT 2 enum { RETURN_TYPE_NORMAL, RETURN_TYPE_STRUCT, - RETURN_TYPE_X87 + RETURN_TYPE_X87, + RETURN_TYPE_JMP, + RETURN_TYPE_JMP_STRET }; struct call_context { uint64_t gpr[NUM_GPR_IN + NUM_GPR_OUT]; __m128 sse[NUM_SSE_IN];