Index: src/runtime/Makefile ================================================================== --- src/runtime/Makefile +++ src/runtime/Makefile @@ -6,20 +6,20 @@ SRCS = category.m \ class.m \ hashtable.m \ init.m \ lookup.m \ + lookup-amd64-elf.S \ + lookup-x86-elf.S \ protocol.m \ selector.m \ sparsearray.m \ static-instances.m \ - threading.m \ - asm/amd64-elf/lookup.S \ - asm/x86-elf/lookup.S + threading.m INCLUDES = runtime.h include ../../buildsys.mk CPPFLAGS += -I. -I.. -I../.. AS = ${OBJC} ASFLAGS = ${CPPFLAGS} LD = ${OBJC} DELETED src/runtime/asm/amd64-elf/lookup.S Index: src/runtime/asm/amd64-elf/lookup.S ================================================================== --- src/runtime/asm/amd64-elf/lookup.S +++ src/runtime/asm/amd64-elf/lookup.S @@ -1,73 +0,0 @@ -/* - * Copyright (c) 2008, 2009, 2010, 2011, 2012 - * Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#if defined(__x86_64__) && defined(__ELF__) - -.intel_syntax noprefix -.globl objc_msg_lookup -.globl objc_msg_lookup_super - -.section .text -objc_msg_lookup: - test rdi, rdi - jz ret_nil - - mov r8, [rdi] - mov r8, [r8+64] - -lookup: - mov rax, [rsi] - movzx ecx, ah - movzx edx, al - shr eax, 16 - - mov r8, [r8+rax*8] - mov r8, [r8+rcx*8] - mov rax, [r8+rdx*8] - - test rax, rax - jz forward - - ret - -forward: - mov rax, qword ptr objc_forward_handler@GOTPCREL[rip] - jmp [rax] - -objc_msg_lookup_super: - mov rax, [rdi] - test rax, rax - jz ret_nil - - mov r8, [rdi+8] - mov r8, [r8+64] - mov rdi, rax - jmp lookup - -ret_nil: - lea rax, nil_method[rip] - ret - -nil_method: - mov rax, rdi - ret - -.type objc_msg_lookup, @function -.type objc_msg_lookup_super, @function -.size objc_msg_lookup, forward-objc_msg_lookup -.size objc_msg_lookup_super, ret_nil-objc_msg_lookup_super - -#endif DELETED src/runtime/asm/x86-elf/lookup.S Index: src/runtime/asm/x86-elf/lookup.S ================================================================== --- src/runtime/asm/x86-elf/lookup.S +++ src/runtime/asm/x86-elf/lookup.S @@ -1,81 +0,0 @@ -/* - * Copyright (c) 2008, 2009, 2010, 2011, 2012 - * Jonathan Schleifer - * - * All rights reserved. - * - * This file is part of ObjFW. It may be distributed under the terms of the - * Q Public License 1.0, which can be found in the file LICENSE.QPL included in - * the packaging of this file. - * - * Alternatively, it may be distributed under the terms of the GNU General - * Public License, either version 2 or 3, which can be found in the file - * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this - * file. - */ - -#if defined(__i386__) && defined(__ELF__) - -.intel_syntax noprefix -.globl objc_msg_lookup -.globl objc_msg_lookup_super - -.section .text -objc_msg_lookup: - mov edx, [esp+4] - test edx, edx - jz ret_nil - - mov edx, [edx] - mov edx, [edx+32] - -lookup: - mov eax, [esp+8] - - movzx ecx, byte ptr [eax+2] - mov edx, [edx+ecx*4] - movzx ecx, byte ptr [eax+1] - mov edx, [edx+ecx*4] - movzx ecx, byte ptr [eax] - mov eax, [edx+ecx*4] - - test eax, eax - jz forward - - ret - -forward: - call get_eip -.L1: - add eax, offset objc_forward_handler - offset .L1 - jmp [eax] - -objc_msg_lookup_super: - mov edx, [esp+4] - cmp dword ptr [edx], 0 - je ret_nil - - mov edx, [edx+4] - mov edx, [edx+32] - jmp lookup - -ret_nil: - call get_eip -.L2: - add eax, offset nil_method - offset .L2 - ret - -nil_method: - mov eax, [esp+4] - ret - -get_eip: - mov eax, dword ptr [esp] - ret - -.type objc_msg_lookup, @function -.type objc_msg_lookup_super, @function -.size objc_msg_lookup, forward-objc_msg_lookup -.size objc_msg_lookup_super, ret_nil-objc_msg_lookup_super - -#endif ADDED src/runtime/lookup-amd64-elf.S Index: src/runtime/lookup-amd64-elf.S ================================================================== --- src/runtime/lookup-amd64-elf.S +++ src/runtime/lookup-amd64-elf.S @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2008, 2009, 2010, 2011, 2012 + * Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#if defined(__x86_64__) && defined(__ELF__) + +.intel_syntax noprefix +.globl objc_msg_lookup +.globl objc_msg_lookup_super + +.section .text +objc_msg_lookup: + test rdi, rdi + jz ret_nil + + mov r8, [rdi] + mov r8, [r8+64] + +lookup: + mov rax, [rsi] + movzx ecx, ah + movzx edx, al + shr eax, 16 + + mov r8, [r8+rax*8] + mov r8, [r8+rcx*8] + mov rax, [r8+rdx*8] + + test rax, rax + jz forward + + ret + +forward: + mov rax, qword ptr objc_forward_handler@GOTPCREL[rip] + jmp [rax] + +objc_msg_lookup_super: + mov rax, [rdi] + test rax, rax + jz ret_nil + + mov r8, [rdi+8] + mov r8, [r8+64] + mov rdi, rax + jmp lookup + +ret_nil: + lea rax, nil_method[rip] + ret + +nil_method: + mov rax, rdi + ret + +.type objc_msg_lookup, @function +.type objc_msg_lookup_super, @function +.size objc_msg_lookup, forward-objc_msg_lookup +.size objc_msg_lookup_super, ret_nil-objc_msg_lookup_super + +#endif ADDED src/runtime/lookup-x86-elf.S Index: src/runtime/lookup-x86-elf.S ================================================================== --- src/runtime/lookup-x86-elf.S +++ src/runtime/lookup-x86-elf.S @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2008, 2009, 2010, 2011, 2012 + * Jonathan Schleifer + * + * All rights reserved. + * + * This file is part of ObjFW. It may be distributed under the terms of the + * Q Public License 1.0, which can be found in the file LICENSE.QPL included in + * the packaging of this file. + * + * Alternatively, it may be distributed under the terms of the GNU General + * Public License, either version 2 or 3, which can be found in the file + * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this + * file. + */ + +#if defined(__i386__) && defined(__ELF__) + +.intel_syntax noprefix +.globl objc_msg_lookup +.globl objc_msg_lookup_super + +.section .text +objc_msg_lookup: + mov edx, [esp+4] + test edx, edx + jz ret_nil + + mov edx, [edx] + mov edx, [edx+32] + +lookup: + mov eax, [esp+8] + + movzx ecx, byte ptr [eax+2] + mov edx, [edx+ecx*4] + movzx ecx, byte ptr [eax+1] + mov edx, [edx+ecx*4] + movzx ecx, byte ptr [eax] + mov eax, [edx+ecx*4] + + test eax, eax + jz forward + + ret + +forward: + call get_eip +.L1: + add eax, offset objc_forward_handler - offset .L1 + jmp [eax] + +objc_msg_lookup_super: + mov edx, [esp+4] + cmp dword ptr [edx], 0 + je ret_nil + + mov edx, [edx+4] + mov edx, [edx+32] + jmp lookup + +ret_nil: + call get_eip +.L2: + add eax, offset nil_method - offset .L2 + ret + +nil_method: + mov eax, [esp+4] + ret + +get_eip: + mov eax, dword ptr [esp] + ret + +.type objc_msg_lookup, @function +.type objc_msg_lookup_super, @function +.size objc_msg_lookup, forward-objc_msg_lookup +.size objc_msg_lookup_super, ret_nil-objc_msg_lookup_super + +#endif Index: src/runtime/lookup.m ================================================================== --- src/runtime/lookup.m +++ src/runtime/lookup.m @@ -17,11 +17,11 @@ #include "config.h" #include #include -#import "runtime.h" +#import "runtime.h" #import "runtime-private.h" #import "macros.h" static IMP not_found_handler(id, SEL); IMP (*objc_forward_handler)(id, SEL) = not_found_handler;