@@ -13,84 +13,91 @@ * 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 not_found +.macro GENERATE_LOOKUP name notFound \name: - test rcx, rcx - jz short ret_nil - - bt ecx, 0 - jc short .Ltagged_pointer_\name - - mov r8, [rcx] - mov r8, [r8+56] + testq %rcx, %rcx + jz returnNilMethod + + testb $1, %cl + jnz .LtaggedPointer_\name + + movq (%rcx), %r8 + movq 56(%r8), %r8 .Lmain_\name: - mov r10, rcx - mov r11, rdx + movq %rcx, %r10 + movq %rdx, %r11 - mov rax, [rdx] - movzx ecx, ah - movzx edx, al + movq (%rdx), %rax + movzbl %ah, %ecx + movzbl %al, %edx #ifdef OF_SELUID24 - shr eax, 16 + shrl $16, %eax - mov r8, [r8+rax*8] + movq (%r8,%rax,8), %r8 #endif - mov r8, [r8+rcx*8] - mov rax, [r8+rdx*8] + movq (%r8,%rcx,8), %r8 + movq (%r8,%rdx,8), %rax - test rax, rax - jz short 0f + testq %rax, %rax + jz 0f ret 0: - mov rcx, r10 - mov rdx, r11 - jmp \not_found - -.Ltagged_pointer_\name: - xor rcx, objc_tagged_pointer_secret - and cl, 0xE - movzx r8, cl - - mov r8, [objc_tagged_pointer_classes+r8*4] - mov r8, [r8+56] - - jmp short .Lmain_\name -.endm - -.macro generate_lookup_super name lookup -\name: - mov r8, rcx - mov rcx, [rcx] - test rcx, rcx - jz short ret_nil - - mov r8, [r8+8] - mov r8, [r8+56] - jmp short .Lmain_\lookup -.endm - -generate_lookup objc_msg_lookup objc_method_not_found -generate_lookup objc_msg_lookup_stret objc_method_not_found_stret -generate_lookup_super objc_msg_lookup_super objc_msg_lookup -generate_lookup_super objc_msg_lookup_super_stret objc_msg_lookup_stret - -ret_nil: - mov rax, offset nil_method - ret - -nil_method: - xor rax, rax + movq %r10, %rcx + movq %r11, %rdx + jmp \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 +.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 +.def \name +.scl 2 +.type 32 +.endef +.endm + +GENERATE_LOOKUP objc_msg_lookup objc_methodNotFound +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 + ret + +nilMethod: + xorq %rax, %rax ret