@@ -27,10 +27,13 @@ .section .text .macro generate_lookup name not_found \name: beqz $a0, 0f + andi $t0, $a0, 1 + bnez $t0, .Ltagged_pointer_\name + lw $t0, 0($a0) lw $t0, 32($t0) .Lmain_\name: #ifdef OF_BIG_ENDIAN @@ -87,10 +90,38 @@ addiu $gp, $gp, 1b-\name lw $t9, %call16(\not_found)($gp) jr $t9 #endif + +.Ltagged_pointer_\name: +#ifdef OF_PIC +0: + lui $gp, %hi(_gp_disp) + addiu $gp, $gp, %lo(_gp_disp) + addu $gp, $gp, $t9 + addiu $gp, $gp, 0b-\name + + lw $t0, %got(objc_tagged_pointer_secret)($gp) +#else + la $t0, objc_tagged_pointer_secret +#endif + lw $t0, 0($t0) + xor $t0, $a0, $t0 + and $t0, $t0, 0xE + sll $t0, $t0, 1 + +#ifdef OF_PIC + lw $t1, %got(objc_tagged_pointer_classes)($gp) +#else + la $t1, objc_tagged_pointer_classes +#endif + addu $t0, $t1, $t0 + ld $t0, ($t0) + ld $t0, 32($t0) + + b .Lmain_\name .type \name, %function .size \name, .-\name .endm .macro generate_lookup_super name lookup