Index: src/invocation/apple-call-x86_64.S ================================================================== --- src/invocation/apple-call-x86_64.S +++ src/invocation/apple-call-x86_64.S @@ -23,10 +23,12 @@ pushq %rbp movq %rsp, %rbp subq $16, %rsp movq %rdi, -8(%rbp) + + movb 177(%rdi), %al movdqa 176(%rdi), %xmm7 movdqa 160(%rdi), %xmm6 movdqa 144(%rdi), %xmm5 movdqa 128(%rdi), %xmm4 Index: src/invocation/invoke-x86_64.m ================================================================== --- src/invocation/invoke-x86_64.m +++ src/invocation/invoke-x86_64.m @@ -30,10 +30,11 @@ #define NUM_SSE_OUT 2 struct registers { uint64_t gpr[NUM_GPR_IN + NUM_GPR_OUT]; __m128 sse[NUM_SSE_IN]; + uint8_t num_sse; }; extern void of_invocation_call(struct registers *); void @@ -42,10 +43,12 @@ OFMethodSignature *methodSignature = [invocation methodSignature]; size_t numberOfArguments = [methodSignature numberOfArguments]; const char *typeEncoding; struct registers registers; size_t currentGPR = 0, currentSSE = 0; + + memset(®isters, '\0', sizeof(registers)); for (size_t i = 0; i < numberOfArguments; i++) { union { uint64_t gpr; __m128 sse; @@ -126,13 +129,14 @@ registers.gpr[currentGPR++] = value.gpr; else /* TODO */ abort(); } else if (valueType == VALUE_SSE) { - if (currentSSE < NUM_SSE_IN) + if (currentSSE < NUM_SSE_IN) { registers.sse[currentSSE++] = value.sse; - else + registers.num_sse++; + } else /* TODO */ abort(); } }