Index: src/forwarding/forwarding-amd64-win64.S ================================================================== --- src/forwarding/forwarding-amd64-win64.S +++ src/forwarding/forwarding-amd64-win64.S @@ -13,168 +13,170 @@ * file. */ #include "config.h" +.intel_syntax noprefix + .globl OFForward .globl OFForward_stret .section .text OFForward: - pushq %rbp - movq %rsp, %rbp + push rbp + mov rbp, rsp /* Save all arguments */ - subq $0x90, %rsp /* 16-byte alignment */ - movq %rax, -0x28(%rbp) - movq %rcx, -0x30(%rbp) - movq %rdx, -0x38(%rbp) - movq %r8, -0x40(%rbp) - movq %r9, -0x48(%rbp) - movaps %xmm0, -0x60(%rbp) - movaps %xmm1, -0x70(%rbp) - movaps %xmm2, -0x80(%rbp) - movaps %xmm3, -0x90(%rbp) + sub rsp, 0x90 /* 16-byte alignment */ + mov [rbp - 0x28], rax + mov [rbp - 0x30], rcx + mov [rbp - 0x38], rdx + mov [rbp - 0x40], r8 + mov [rbp - 0x48], r9 + movaps [rbp - 0x60], xmm0 + movaps [rbp - 0x70], xmm1 + movaps [rbp - 0x80], xmm2 + movaps [rbp - 0x90], xmm3 call object_getClass - movq %rax, %rcx - leaq sel_forwardingTargetForSelector_(%rip), %rdx + mov rcx, rax + lea rdx, [rip + sel_forwardingTargetForSelector_] call class_respondsToSelector - testq %rax, %rax - jz 0f - - movq -0x30(%rbp), %rcx - leaq sel_forwardingTargetForSelector_(%rip), %rdx - call objc_msg_lookup - - movq -0x30(%rbp), %rcx - leaq sel_forwardingTargetForSelector_(%rip), %rdx - movq -0x38(%rbp), %r8 - call *%rax - - testq %rax, %rax - jz 0f - cmpq -0x30(%rbp), %rax - je 0f - - movq %rax, -0x30(%rbp) - - movq %rax, %rcx - movq -0x38(%rbp), %rdx - call objc_msg_lookup - movq %rax, %r11 + test rax, rax + jz short 0f + + mov rcx, [rbp - 0x30] + lea rdx, [rip + sel_forwardingTargetForSelector_] + call objc_msg_lookup + + mov rcx, [rbp - 0x30] + lea rdx, [rip + sel_forwardingTargetForSelector_] + mov r8, [rbp - 0x38] + call rax + + test rax, rax + jz short 0f + cmp rax, [rbp - 0x30] + je short 0f + + mov [rbp - 0x30], rax + + mov rcx, rax + mov rdx, [rbp - 0x38] + call objc_msg_lookup + mov r11, rax /* Restore all arguments */ - movaps -0x90(%rbp), %xmm3 - movaps -0x80(%rbp), %xmm2 - movaps -0x70(%rbp), %xmm1 - movaps -0x60(%rbp), %xmm0 - movq -0x48(%rbp), %r9 - movq -0x40(%rbp), %r8 - movq -0x38(%rbp), %rdx - movq -0x30(%rbp), %rcx - movq -0x28(%rbp), %rax - - movq %rbp, %rsp - popq %rbp - - jmpq *%r11 + movaps xmm3, [rbp - 0x90] + movaps xmm2, [rbp - 0x80] + movaps xmm1, [rbp - 0x70] + movaps xmm0, [rbp - 0x60] + mov r9, [rbp - 0x48] + mov r8, [rbp - 0x40] + mov rdx, [rbp - 0x38] + mov rcx, [rbp - 0x30] + mov rax, [rbp - 0x28] + + mov rsp, rbp + pop rbp + + jmp r11 0: - movq -0x30(%rbp), %rcx - movq -0x38(%rbp), %rdx + mov rcx, [rbp - 0x30] + mov rdx, [rbp - 0x38] - movq %rbp, %rsp - popq %rbp + mov rsp, rbp + pop rbp jmp OFMethodNotFound .def OFForward .scl 2 .type 32 .endef OFForward_stret: - pushq %rbp - movq %rsp, %rbp + push rbp + mov rbp, rsp /* Save all arguments */ - subq $0x90, %rsp /* 16-byte alignment */ - movq %rax, -0x28(%rbp) - movq %rcx, -0x30(%rbp) - movq %rdx, -0x38(%rbp) - movq %r8, -0x40(%rbp) - movq %r9, -0x48(%rbp) - movaps %xmm0, -0x60(%rbp) - movaps %xmm1, -0x70(%rbp) - movaps %xmm2, -0x80(%rbp) - movaps %xmm3, -0x90(%rbp) - - movq %rdx, %rcx + sub rsp, 0x90 /* 16-byte alignment */ + mov [rbp - 0x28], rax + mov [rbp - 0x30], rcx + mov [rbp - 0x38], rdx + mov [rbp - 0x40], r8 + mov [rbp - 0x48], r9 + movaps [rbp - 0x60], xmm0 + movaps [rbp - 0x70], xmm1 + movaps [rbp - 0x80], xmm2 + movaps [rbp - 0x90], xmm3 + + mov rcx, rdx call object_getClass - movq %rax, %rcx - leaq sel_forwardingTargetForSelector_(%rip), %rdx + mov rcx, rax + lea rdx, [rip + sel_forwardingTargetForSelector_] call class_respondsToSelector - testq %rax, %rax - jz 0f + test rax, rax + jz short 0f - movq -0x38(%rbp), %rcx - leaq sel_forwardingTargetForSelector_(%rip), %rdx + mov rcx, [rbp - 0x38] + lea rdx, [rip + sel_forwardingTargetForSelector_] call objc_msg_lookup - movq -0x38(%rbp), %rcx - leaq sel_forwardingTargetForSelector_(%rip), %rdx - movq -0x40(%rbp), %r8 - call *%rax - - testq %rax, %rax - jz 0f - cmpq -0x38(%rbp), %rax - je 0f - - movq %rax, -0x38(%rbp) - - movq %rax, %rcx - movq -0x40(%rbp), %rdx + mov rcx, [rbp - 0x38] + lea rdx, [rip + sel_forwardingTargetForSelector_] + mov r8, [rbp - 0x40] + call rax + + test rax, rax + jz short 0f + cmp rax, [rbp - 0x38] + je short 0f + + mov [rbp - 0x38], rax + + mov rcx, rax + mov rdx, [rbp - 0x40] call objc_msg_lookup_stret - movq %rax, %r11 + mov r11, rax /* Restore all arguments */ - movaps -0x90(%rbp), %xmm3 - movaps -0x80(%rbp), %xmm2 - movaps -0x70(%rbp), %xmm1 - movaps -0x60(%rbp), %xmm0 - movq -0x48(%rbp), %r9 - movq -0x40(%rbp), %r8 - movq -0x38(%rbp), %rdx - movq -0x30(%rbp), %rcx - movq -0x28(%rbp), %rax - - movq %rbp, %rsp - popq %rbp - - jmpq *%r11 + movaps xmm3, [rbp - 0x90] + movaps xmm2, [rbp - 0x80] + movaps xmm1, [rbp - 0x70] + movaps xmm0, [rbp - 0x60] + mov r9, [rbp - 0x48] + mov r8, [rbp - 0x40] + mov rdx, [rbp - 0x38] + mov rcx, [rbp - 0x30] + mov rax, [rbp - 0x28] + + mov rsp, rbp + pop rbp + + jmp r11 0: - movq -0x30(%rbp), %rcx - movq -0x38(%rbp), %rdx - movq -0x40(%rbp), %r8 + mov rcx, [rbp - 0x30] + mov rdx, [rbp - 0x38] + mov r8, [rbp - 0x40] - movq %rbp, %rsp - popq %rbp + mov rsp, rbp + pop rbp jmp OFMethodNotFound_stret .def OFForward_stret .scl 2 .type 32 .endef init: - leaq module(%rip), %rcx + lea rcx, [rip + module] jmp __objc_exec_class .section .ctors, "aw" .quad init Index: src/runtime/lookup-asm/lookup-asm-amd64-win64.S ================================================================== --- src/runtime/lookup-asm/lookup-asm-amd64-win64.S +++ src/runtime/lookup-asm/lookup-asm-amd64-win64.S @@ -13,78 +13,80 @@ * file. */ #include "config.h" +.intel_syntax noprefix + .globl objc_msg_lookup .globl objc_msg_lookup_stret .globl objc_msg_lookup_super .globl objc_msg_lookup_super_stret .section .text .macro GENERATE_LOOKUP name notFound \name: - testq %rcx, %rcx - jz returnNilMethod - - testb $1, %cl - jnz .LtaggedPointer_\name - - movq (%rcx), %r8 - movq 56(%r8), %r8 + test rcx, rcx + jz short returnNilMethod + + test cl, 1 + jnz short .LtaggedPointer_\name + + mov r8, [rcx] + mov r8, [r8 + 56] .Lmain_\name: - movq %rcx, %r10 - movq %rdx, %r11 + mov r10, rcx + mov r11, rdx - movq (%rdx), %rax - movzbl %ah, %ecx - movzbl %al, %edx + mov rax, [rdx] + movzx ecx, ah + movzx edx, al #ifdef OF_SELUID24 - shrl $16, %eax + shr eax, 16 - movq (%r8,%rax,8), %r8 + mov r8, [r8 + 8 * rax] #endif - movq (%r8,%rcx,8), %r8 - movq (%r8,%rdx,8), %rax + mov r8, [r8 + 8 * rcx] + mov rax, [r8 + 8 * rdx] - testq %rax, %rax - jz 0f + test rax, rax + jz short 0f ret 0: - movq %r10, %rcx - movq %r11, %rdx - jmp \notFound + mov rcx, r10 + mov rdx, r11 + jmp short \notFound .LtaggedPointer_\name: - xorq objc_taggedPointerSecret(%rip), %rcx - andb $0xE, %cl - movzbl %cl, %r8d - - leaq objc_taggedPointerClasses(%rip), %rax - movq (%rax,%r8,4), %r8 - movq 56(%r8), %r8 - - jmp .Lmain_\name + xor rcx, [rip + objc_taggedPointerSecret] + and cl, 0xE + movzx r8d, cl + + lea rax, [rip + objc_taggedPointerClasses] + mov r8, [rax + 4 * r8] + mov r8, [r8 + 56] + + jmp short .Lmain_\name .def \name .scl 2 .type 32 .endef .endm .macro GENERATE_LOOKUP_SUPER name lookup \name: - movq %rcx, %r8 - movq (%rcx), %rcx - testq %rcx, %rcx - jz returnNilMethod - - movq 8(%r8), %r8 - movq 56(%r8), %r8 - jmp .Lmain_\lookup + mov r8, rcx + mov rcx, [rcx] + test rcx, rcx + jz short returnNilMethod + + mov r8, [r8 + 8] + mov r8, [r8 + 56] + jmp short .Lmain_\lookup .def \name .scl 2 .type 32 .endef .endm @@ -93,11 +95,11 @@ GENERATE_LOOKUP objc_msg_lookup_stret objc_methodNotFound_stret GENERATE_LOOKUP_SUPER objc_msg_lookup_super objc_msg_lookup GENERATE_LOOKUP_SUPER objc_msg_lookup_super_stret objc_msg_lookup_stret returnNilMethod: - leaq nilMethod(%rip), %rax + lea rax, [rip + nilMethod] ret nilMethod: - xorq %rax, %rax + xor rax, rax ret