#if __arm64__
#include "objc-config.h"
#if __LP64__
#define SUPPORT_TAGGED_POINTERS 1
#define PTR .quad
#define PTRSIZE 8
#define PTRSHIFT 3 // 1<<PTRSHIFT == PTRSIZE
#define UXTP UXTX
#define p0 x0
#define p1 x1
#define p2 x2
#define p3 x3
#define p4 x4
#define p5 x5
#define p6 x6
#define p7 x7
#define p8 x8
#define p9 x9
#define p10 x10
#define p11 x11
#define p12 x12
#define p13 x13
#define p14 x14
#define p15 x15
#define p16 x16
#define p17 x17
#else
#define SUPPORT_TAGGED_POINTERS 0
#define PTR .long
#define PTRSIZE 4
#define PTRSHIFT 2 // 1<<PTRSHIFT == PTRSIZE
#define UXTP UXTW
#define p0 w0
#define p1 w1
#define p2 w2
#define p3 w3
#define p4 w4
#define p5 w5
#define p6 w6
#define p7 w7
#define p8 w8
#define p9 w9
#define p10 w10
#define p11 w11
#define p12 w12
#define p13 w13
#define p14 w14
#define p15 w15
#define p16 w16
#define p17 w17
#endif
#if __has_feature(ptrauth_returns)
# define SignLR pacibsp
# define AuthenticateLR autibsp
#else
# define SignLR
# define AuthenticateLR
#endif
#if __has_feature(ptrauth_calls)
.macro TailCallFunctionPointer
braaz $0
.endmacro
.macro TailCallCachedImp
eor $1, $1, $2 eor $1, $1, $3 brab $0, $1
.endmacro
.macro TailCallMethodListImp
braa $0, $1
.endmacro
.macro TailCallBlockInvoke
braa $0, $1
.endmacro
.macro AuthAndResignAsIMP
eor $1, $1, $2 eor $1, $1, $3 autib $0, $1 ldr xzr, [$0] paciza $0 .endmacro
.macro ExtractISA
and $0, $1, #ISA_MASK
#if ISA_SIGNING_AUTH_MODE == ISA_SIGNING_STRIP
xpacd $0
#elif ISA_SIGNING_AUTH_MODE == ISA_SIGNING_AUTH
mov x10, $2
movk x10, #ISA_SIGNING_DISCRIMINATOR, LSL #48
autda $0, x10
#endif
.endmacro
.macro AuthISASuper dst, addr_mutable, discriminator
#if ISA_SIGNING_AUTH_MODE == ISA_SIGNING_AUTH
movk \addr_mutable, #\discriminator, LSL #48
autda \dst, \addr_mutable
#elif ISA_SIGNING_AUTH_MODE == ISA_SIGNING_STRIP
xpacd \dst
#endif
.endmacro
.macro SignAsImp
paciza $0
.endmacro
#else
.macro TailCallFunctionPointer
br $0
.endmacro
.macro TailCallCachedImp
eor $0, $0, $3
br $0
.endmacro
.macro TailCallMethodListImp
br $0
.endmacro
.macro TailCallBlockInvoke
br $0
.endmacro
.macro AuthAndResignAsIMP
eor $0, $0, $3
.endmacro
.macro SignAsImp
.endmacro
.macro ExtractISA
and $0, $1, #ISA_MASK
.endmacro
#endif
#define TailCallBlockInvoke TailCallMethodListImp
#endif