Index: src/forwarding/forwarding-x86_64-elf.S ================================================================== --- src/forwarding/forwarding-x86_64-elf.S +++ src/forwarding/forwarding-x86_64-elf.S @@ -93,11 +93,11 @@ movq -0x8(%rbp), %rax movq %rbp, %rsp popq %rbp - jmpq *%r11 + jmpq *%r11 0: movq -0x10(%rbp), %rdi movq -0x18(%rbp), %rsi @@ -179,11 +179,11 @@ movq -0x8(%rbp), %rax movq %rbp, %rsp popq %rbp - jmpq *%r11 + jmpq *%r11 0: movq -0x10(%rbp), %rdi movq -0x18(%rbp), %rsi movq -0x20(%rbp), %rdx Index: src/forwarding/forwarding-x86_64-macho.S ================================================================== --- src/forwarding/forwarding-x86_64-macho.S +++ src/forwarding/forwarding-x86_64-macho.S @@ -93,11 +93,11 @@ movq -0x8(%rbp), %rax movq %rbp, %rsp popq %rbp - jmpq *%r11 + jmpq *%r11 0: movq -0x10(%rbp), %rdi movq -0x18(%rbp), %rsi @@ -177,11 +177,11 @@ movq -0x8(%rbp), %rax movq %rbp, %rsp popq %rbp - jmpq *%r11 + jmpq *%r11 0: movq -0x10(%rbp), %rdi movq -0x18(%rbp), %rsi movq -0x20(%rbp), %rdx Index: src/forwarding/forwarding-x86_64-win64.S ================================================================== --- src/forwarding/forwarding-x86_64-win64.S +++ src/forwarding/forwarding-x86_64-win64.S @@ -79,11 +79,11 @@ movq -0x28(%rbp), %rax movq %rbp, %rsp popq %rbp - jmpq *%r11 + jmpq *%r11 0: movq -0x30(%rbp), %rcx movq -0x38(%rbp), %rdx @@ -151,11 +151,11 @@ movq -0x28(%rbp), %rax movq %rbp, %rsp popq %rbp - jmpq *%r11 + jmpq *%r11 0: movq -0x30(%rbp), %rcx movq -0x38(%rbp), %rdx movq -0x40(%rbp), %r8 Index: src/invocation/apple-call-x86_64.S ================================================================== --- src/invocation/apple-call-x86_64.S +++ src/invocation/apple-call-x86_64.S @@ -28,12 +28,12 @@ subq $16, %rsp andq $-16, %rsp movq %rdi, -8(%rbp) - leaq 240(%rdi), %rdx - movq 232(%rdi), %rcx + leaq OFFSET_STACK(%rdi), %rdx + movq OFFSET_STACK_SIZE(%rdi), %rcx testq $1, %rcx jnz Lfix_align Lfill_stack: @@ -45,29 +45,29 @@ pushq %r11 jmp Lfill_stack Lstack_filled: - movb 224(%rdi), %al - - movdqa 176(%rdi), %xmm7 - movdqa 160(%rdi), %xmm6 - movdqa 144(%rdi), %xmm5 - movdqa 128(%rdi), %xmm4 - movdqa 112(%rdi), %xmm3 - movdqa 96(%rdi), %xmm2 - movdqa 80(%rdi), %xmm1 - movdqa 64(%rdi), %xmm0 - - movq 40(%rdi), %r9 - movq 32(%rdi), %r8 - movq 24(%rdi), %rcx - movq 16(%rdi), %rdx - movq 8(%rdi), %rsi - - movb 225(%rdi), %r11b - movq 0(%rdi), %rdi + movb OFFSET_NUM_SSE_USED(%rdi), %al + + movdqa OFFSET_SSE_INOUT+112(%rdi), %xmm7 + movdqa OFFSET_SSE_INOUT+96(%rdi), %xmm6 + movdqa OFFSET_SSE_INOUT+80(%rdi), %xmm5 + movdqa OFFSET_SSE_INOUT+64(%rdi), %xmm4 + movdqa OFFSET_SSE_INOUT+48(%rdi), %xmm3 + movdqa OFFSET_SSE_INOUT+32(%rdi), %xmm2 + movdqa OFFSET_SSE_INOUT+16(%rdi), %xmm1 + movdqa OFFSET_SSE_INOUT(%rdi), %xmm0 + + movq OFFSET_GPR_IN+40(%rdi), %r9 + movq OFFSET_GPR_IN+32(%rdi), %r8 + movq OFFSET_GPR_IN+24(%rdi), %rcx + movq OFFSET_GPR_IN+16(%rdi), %rdx + movq OFFSET_GPR_IN+8(%rdi), %rsi + + movb OFFSET_RETURN_TYPE(%rdi), %r11b + movq OFFSET_GPR_IN(%rdi), %rdi cmpb $RETURN_TYPE_STRET, %r11b je Lcall_send_stret cmpb $RETURN_TYPE_JMP, %r11b @@ -78,16 +78,16 @@ 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) + movq %rax, OFFSET_GPR_OUT(%rdi) + movq %rdx, OFFSET_GPR_OUT+8(%rdi) + movdqa %xmm0, OFFSET_SSE_INOUT(%rdi) + movdqa %xmm1, OFFSET_SSE_INOUT+16(%rdi) - movb 225(%rdi), %r11b + movb OFFSET_RETURN_TYPE(%rdi), %r11b cmpb $RETURN_TYPE_X87, %r11b je Lpop_long_double cmpb $RETURN_TYPE_COMPLEX_X87, %r11b @@ -107,12 +107,12 @@ Lcall_send_stret: call _objc_msgSend_stret jmp Lafter_send Lpop_long_double: - fstpt 192(%rdi) + fstpt OFFSET_X87_OUT(%rdi) jmp Lreturn Lpop_complex_long_double: - fstpt 192(%rdi) - fstpt 208(%rdi) + fstpt OFFSET_X87_OUT(%rdi) + fstpt OFFSET_X87_OUT+16(%rdi) jmp Lreturn Index: src/invocation/call-x86_64-elf.S ================================================================== --- src/invocation/call-x86_64-elf.S +++ src/invocation/call-x86_64-elf.S @@ -28,26 +28,26 @@ subq $16, %rsp andq $-16, %rsp movq %rdi, -8(%rbp) - movb 225(%rdi), %r11b + movb OFFSET_RETURN_TYPE(%rdi), %r11b cmpb $RETURN_TYPE_STRET, %r11b je .lookup_stret cmpb $RETURN_TYPE_JMP_STRET, %r11b je .lookup_stret - movq 8(%rdi), %rsi - movq 0(%rdi), %rdi + movq OFFSET_GPR_IN+8(%rdi), %rsi + movq OFFSET_GPR_IN+0(%rdi), %rdi call objc_msg_lookup@PLT .after_lookup: movq %rax, -16(%rbp) movq -8(%rbp), %rdi - leaq 240(%rdi), %rdx - movq 232(%rdi), %rcx + leaq OFFSET_STACK(%rdi), %rdx + movq OFFSET_STACK_SIZE(%rdi), %rcx testq $1, %rcx jnz .fix_align .fill_stack: @@ -59,29 +59,29 @@ pushq %r11 jmp .fill_stack .stack_filled: - movb 224(%rdi), %al - - movdqa 176(%rdi), %xmm7 - movdqa 160(%rdi), %xmm6 - movdqa 144(%rdi), %xmm5 - movdqa 128(%rdi), %xmm4 - movdqa 112(%rdi), %xmm3 - movdqa 96(%rdi), %xmm2 - movdqa 80(%rdi), %xmm1 - movdqa 64(%rdi), %xmm0 - - movq 40(%rdi), %r9 - movq 32(%rdi), %r8 - movq 24(%rdi), %rcx - movq 16(%rdi), %rdx - movq 8(%rdi), %rsi - - movb 225(%rdi), %r11b - movq 0(%rdi), %rdi + movb OFFSET_NUM_SSE_USED(%rdi), %al + + movdqa OFFSET_SSE_INOUT+112(%rdi), %xmm7 + movdqa OFFSET_SSE_INOUT+96(%rdi), %xmm6 + movdqa OFFSET_SSE_INOUT+80(%rdi), %xmm5 + movdqa OFFSET_SSE_INOUT+64(%rdi), %xmm4 + movdqa OFFSET_SSE_INOUT+48(%rdi), %xmm3 + movdqa OFFSET_SSE_INOUT+32(%rdi), %xmm2 + movdqa OFFSET_SSE_INOUT+16(%rdi), %xmm1 + movdqa OFFSET_SSE_INOUT(%rdi), %xmm0 + + movq OFFSET_GPR_IN+40(%rdi), %r9 + movq OFFSET_GPR_IN+32(%rdi), %r8 + movq OFFSET_GPR_IN+24(%rdi), %rcx + movq OFFSET_GPR_IN+16(%rdi), %rdx + movq OFFSET_GPR_IN+8(%rdi), %rsi + + movb OFFSET_RETURN_TYPE(%rdi), %r11b + movq OFFSET_GPR_IN(%rdi), %rdi cmpb $RETURN_TYPE_JMP, %r11b je .jmp_into_method cmpb $RETURN_TYPE_JMP_STRET, %r11b je .jmp_into_method @@ -89,16 +89,16 @@ movq -16(%rbp), %r11 call *%r11 .after_send: movq -8(%rbp), %rdi - movq %rax, 48(%rdi) - movq %rdx, 56(%rdi) - movdqa %xmm0, 64(%rdi) - movdqa %xmm1, 80(%rdi) + movq %rax, OFFSET_GPR_OUT(%rdi) + movq %rdx, OFFSET_GPR_OUT+8(%rdi) + movdqa %xmm0, OFFSET_SSE_INOUT(%rdi) + movdqa %xmm1, OFFSET_SSE_INOUT+16(%rdi) - movb 225(%rdi), %r11b + movb OFFSET_RETURN_TYPE(%rdi), %r11b cmpb $RETURN_TYPE_X87, %r11b je .pop_long_double cmpb $RETURN_TYPE_COMPLEX_X87, %r11b @@ -114,27 +114,27 @@ xorq %r11, %r11 pushq %r11 jmp .fill_stack .lookup_stret: - movq 16(%rdi), %rsi - movq 8(%rdi), %rdi + movq OFFSET_GPR_IN+16(%rdi), %rsi + movq OFFSET_GPR_IN+8(%rdi), %rdi call objc_msg_lookup_stret@PLT jmp .after_lookup .jmp_into_method: movq -16(%rbp), %r11 jmp *%r11 .pop_long_double: - fstpt 192(%rdi) + fstpt OFFSET_X87_OUT(%rdi) jmp .return .pop_complex_long_double: - fstpt 192(%rdi) - fstpt 208(%rdi) + fstpt OFFSET_X87_OUT(%rdi) + fstpt OFFSET_X87_OUT+16(%rdi) jmp .return #ifdef OF_LINUX .section .note.GNU-stack, "", %progbits #endif Index: src/invocation/invoke-x86_64.h ================================================================== --- src/invocation/invoke-x86_64.h +++ src/invocation/invoke-x86_64.h @@ -19,5 +19,19 @@ #define RETURN_TYPE_STRET 1 #define RETURN_TYPE_X87 2 #define RETURN_TYPE_COMPLEX_X87 3 #define RETURN_TYPE_JMP 4 #define RETURN_TYPE_JMP_STRET 5 + +#define NUM_GPR_IN 6 +#define NUM_GPR_OUT 2 +#define NUM_SSE_INOUT 8 +#define NUM_X87_OUT 2 + +#define OFFSET_GPR_IN 0 +#define OFFSET_GPR_OUT (OFFSET_GPR_IN + NUM_GPR_IN * 8) +#define OFFSET_SSE_INOUT (OFFSET_GPR_OUT + NUM_GPR_OUT * 8) +#define OFFSET_X87_OUT (OFFSET_SSE_INOUT + NUM_SSE_INOUT * 16) +#define OFFSET_NUM_SSE_USED (OFFSET_X87_OUT + NUM_X87_OUT * 16) +#define OFFSET_RETURN_TYPE (OFFSET_NUM_SSE_USED + 1) +#define OFFSET_STACK_SIZE (OFFSET_RETURN_TYPE + 7) +#define OFFSET_STACK (OFFSET_STACK_SIZE + 8) Index: src/invocation/invoke-x86_64.m ================================================================== --- src/invocation/invoke-x86_64.m +++ src/invocation/invoke-x86_64.m @@ -29,18 +29,13 @@ #import "invoke-x86_64.h" #import "macros.h" -#define NUM_GPR_IN 6 -#define NUM_GPR_OUT 2 -#define NUM_SSE_IN 8 -#define NUM_X87_OUT 2 - struct call_context { uint64_t GPR[NUM_GPR_IN + NUM_GPR_OUT]; - __m128 SSE[NUM_SSE_IN]; + __m128 SSE[NUM_SSE_INOUT]; long double X87[NUM_X87_OUT]; uint8_t numSSEUsed; uint8_t returnType; uint64_t stackSize; uint64_t stack[]; @@ -74,11 +69,11 @@ pushDouble(struct call_context **context, uint_fast8_t *currentSSE, double value) { struct call_context *newContext; - if (*currentSSE < NUM_SSE_IN) { + if (*currentSSE < NUM_SSE_INOUT) { (*context)->SSE[(*currentSSE)++] = (__m128)_mm_set_sd(value); (*context)->numSSEUsed++; return; } @@ -99,11 +94,11 @@ double low, double high) { size_t stackSize; struct call_context *newContext; - if (*currentSSE + 1 < NUM_SSE_IN) { + if (*currentSSE + 1 < NUM_SSE_INOUT) { (*context)->SSE[(*currentSSE)++] = (__m128)_mm_set_sd(low); (*context)->SSE[(*currentSSE)++] = (__m128)_mm_set_sd(high); (*context)->numSSEUsed += 2; return; }