Index: src/runtime/lookup-asm/lookup-asm-arm64-elf.S ================================================================== --- src/runtime/lookup-asm/lookup-asm-arm64-elf.S +++ src/runtime/lookup-asm/lookup-asm-arm64-elf.S @@ -25,41 +25,52 @@ .globl objc_msg_lookup_super_stret .section .text .macro generate_lookup name not_found \name: - cmp x0, #0 - beq ret_nil + cbz x0, ret_nil + + tst x0, #1 + bne .Ltagged_pointer_\name - ldr x2, [x0, #0] + ldr x2, [x0] ldr x2, [x2, #64] .Lmain_\name: #ifdef OF_SELUID24 ldrb w3, [x1, #2] ldr x2, [x2, x3, lsl #3] #endif ldrb w3, [x1, #1] ldr x2, [x2, x3, lsl #3] - ldrb w3, [x1, #0] + ldrb w3, [x1] ldr x2, [x2, x3, lsl #3] - cmp x2, #0 - beq \not_found + cbz x2, \not_found mov x0, x2 ret + +.Ltagged_pointer_\name: + and x0, x0, #0xE + lsl x0, x0, #2 + + adrp x2, :got:objc_tagged_pointer_classes + ldr x2, [x2, #:got_lo12:objc_tagged_pointer_classes] + ldr x2, [x2, x0] + ldr x2, [x2, #64] + + b .Lmain_\name .type \name, %function .size \name, .-\name .endm .macro generate_lookup_super name lookup \name: mov x2, x0 - ldr x0, [x0, #0] - cmp x0, #0 - beq ret_nil + ldr x0, [x0] + cbz x0, ret_nil ldr x2, [x2, #8] ldr x2, [x2, #64] b .Lmain_\lookup