@@ -15,69 +15,71 @@ #include "config.h" #include "platform.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 %rdi, %rdi - jz returnNilMethod - - testb $1, %dil - jnz .LtaggedPointer_\name - - movq (%rdi), %r8 - movq 64(%r8), %r8 + test rdi, rdi + jz short returnNilMethod + + test dil, 1 + jnz short .LtaggedPointer_\name + + mov r8, [rdi] + mov r8, [r8 + 64] .Lmain_\name: - movq (%rsi), %rax - movzbl %ah, %ecx - movzbl %al, %edx + mov rax, [rsi] + 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 \notFound@PLT + test rax, rax + jz short \notFound@PLT ret .LtaggedPointer_\name: - movq objc_taggedPointerSecret@GOTPCREL(%rip), %rax - xorq (%rax), %rdi - andb $0xE, %dil - movzbl %dil, %r8d - - movq objc_taggedPointerClasses@GOTPCREL(%rip), %rax - movq (%rax,%r8,4), %r8 - movq 64(%r8), %r8 - - jmp .Lmain_\name + mov rax, [rip + objc_taggedPointerSecret@GOTPCREL] + xor rdi, [rax] + and dil, 0xE + movzx r8d, dil + + mov rax, [rip + objc_taggedPointerClasses@GOTPCREL] + mov r8, [rax + 4 * r8] + mov r8, [r8 + 64] + + jmp short .Lmain_\name .type \name, %function .size \name, .-\name .endm .macro GENERATE_LOOKUP_SUPER name lookup \name: - movq %rdi, %r8 - movq (%rdi), %rdi - testq %rdi, %rdi - jz returnNilMethod - - movq 8(%r8), %r8 - movq 64(%r8), %r8 - jmp .Lmain_\lookup + mov r8, rdi + mov rdi, [rdi] + test rdi, rdi + jz short returnNilMethod + + mov r8, [r8 + 8] + mov r8, [r8 + 64] + jmp short .Lmain_\lookup .type \name, %function .size \name, .-\name .endm GENERATE_LOOKUP objc_msg_lookup objc_methodNotFound @@ -84,15 +86,15 @@ 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 #if defined(OF_LINUX) || defined(OF_HAIKU) || defined(OF_HURD) .section .note.GNU-stack, "", %progbits #endif