ADDED src/runtime/lookup-asm/lookup-asm-powerpc64-elf.S Index: src/runtime/lookup-asm/lookup-asm-powerpc64-elf.S ================================================================== --- src/runtime/lookup-asm/lookup-asm-powerpc64-elf.S +++ src/runtime/lookup-asm/lookup-asm-powerpc64-elf.S @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2008-2021 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. + */ + +#include "config.h" + +#include "platform.h" + +.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 +.section .opd, "aw", @progbits +\name: + .p2align 3 + .quad .Lbegin_\name + .quad .TOC.@tocbase + .quad 0 +.text +.Lbegin_\name: + cmpdi %r3, 0 + beq- .LreturnNilMethod + + andi. %r0, %r3, 1 + bne- .LtaggedPointer_\name + + ld %r5, 0(%r3) + ld %r5, 64(%r5) + +.Lmain_\name: + ld %r8, 0(%r4) +#ifdef OF_SELUID24 + rlwinm %r6, %r8, 19, 0x7F8 +#endif + rlwinm %r7, %r8, 27, 0x7F8 + rlwinm %r8, %r8, 3, 0x7F8 + +#ifdef OF_SELUID24 + ldx %r5, %r5, %r6 +#endif + ldx %r5, %r5, %r7 + ldx %r5, %r5, %r8 + + cmpdi %r5, 0 + beq- 0f + + mr %r3, %r5 + blr + +0: + mflr %r0 + std %r0, 16(%r1) + stdu %r1, -112(%r1) + bl \notFound + nop + addi %r1, %r1, 112 + ld %r0, 16(%r1) + mtlr %r0 + blr + +.LtaggedPointer_\name: + addis %r5, %r2, objc_taggedPointerSecret@toc@ha + ld %r5, objc_taggedPointerSecret@toc@l(%r5) + xor %r5, %r3, %r5 + rlwinm %r5, %r5, 2, 0x38 + + addis %r6, %r2, objc_taggedPointerClasses@toc@ha + addi %r6, %r6, objc_taggedPointerClasses@toc@l + ldx %r5, %r6, %r5 + ld %r5, 64(%r5) + + b .Lmain_\name +.type \name, @function +.size \name, .-.Lbegin_\name +.endm + +.macro GENERATE_LOOKUP_SUPER name lookup +.section .opd, "aw", @progbits +\name: + .p2align 3 + .quad .Lbegin_\name + .quad .TOC.@tocbase + .quad 0 +.text +.Lbegin_\name: + mr %r5, %r3 + ld %r3, 0(%r3) + cmpdi %r3, 0 + beq- .LreturnNilMethod + + ld %r5, 8(%r5) + ld %r5, 64(%r5) + + b .Lmain_\lookup +.type \name, @function +.size \name, .-.Lbegin_\name +.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 + +.LreturnNilMethod: + addis %r3, %r2, nilMethod@toc@ha + addi %r3, %r3, nilMethod@toc@l + blr + +.section .opd, "aw", @progbits +nilMethod: + .p2align 3 + .quad .Lbegin_nilMethod + .quad .TOC.@tocbase + .quad 0 +.text +.Lbegin_nilMethod: + li %r3, 0 + blr +.type nilMethod, @function +.size nilMethod, .-.Lbegin_nilMethod + +#ifdef OF_LINUX +.section .note.GNU-stack, "", @progbits +#endif Index: src/runtime/lookup-asm/lookup-asm.S ================================================================== --- src/runtime/lookup-asm/lookup-asm.S +++ src/runtime/lookup-asm/lookup-asm.S @@ -24,10 +24,12 @@ # include "lookup-asm-x86-elf.S" # elif defined(OF_ARM64) # include "lookup-asm-arm64-elf.S" # elif defined(OF_ARM) # include "lookup-asm-arm-elf.S" +# elif defined(OF_POWERPC64) +# include "lookup-asm-powerpc64-elf.S" # elif defined(OF_POWERPC) # include "lookup-asm-powerpc-elf.S" # elif defined(OF_MIPS64_N64) # include "lookup-asm-mips64-n64-elf.S" # elif defined(OF_MIPS) Index: src/runtime/private.h ================================================================== --- src/runtime/private.h +++ src/runtime/private.h @@ -356,11 +356,12 @@ #define OBJC_ERROR(...) \ objc_error("ObjFWRT @ " __FILE__ ":" OF_STRINGIFY(__LINE__), \ __VA_ARGS__) #if defined(OF_ELF) -# if defined(OF_X86_64) || defined(OF_X86) || defined(OF_POWERPC) || \ +# if defined(OF_X86_64) || defined(OF_X86) || \ + defined(OF_POWERPC64) || defined(OF_POWERPC) || \ defined(OF_ARM64) || defined(OF_ARM) || \ defined(OF_MIPS64_N64) || defined(OF_MIPS) || \ defined(OF_SPARC64) || defined(OF_SPARC) # define OF_ASM_LOOKUP # endif