This is a collection of Intel®’ IA32® Software Developer's Manuals (URL of the day) and AMD' AMD64 Architecture Programmer's Manual together with the related specifications, application notes, white papers, and change logs. The collection aims to keep all available revisions. It was originally created by Michal Necasek, see OS/2 Museum.

If you have a public document, related to the IA32® specifications and missing from the collection, please mail it to me. The content of this URL and all sub-ULRs is available for convenient bulk download by rsync x86docs password "" (empty).

PACIA, PACIA1716, PACIASP, PACIAZ, PACIZA -- A64

PACIA, PACIA1716, PACIASP, PACIAZ, PACIZA

Pointer Authentication Code for instruction address, using key A

This instruction calculates and inserts a Pointer Authentication Code for an instruction address, using a modifier and key A.

The address is:

The modifier is:

If FEAT_PAuth_LR is implemented and PSTATE.PACM is 1, then PACIA1716 and PACIASP include a second modifier that is:

A PACIASP instruction has an implicit BTI instruction. The implicit BTI instruction of a PACIASP instruction is always compatible with PSTATE.BTYPE == 0b01 and PSTATE.BTYPE == 0b10. Controls in SCTLR_ELx configure whether the implicit BTI instruction of a PACIASP instruction is compatible with PSTATE.BTYPE == 0b11. For more information, see PSTATE.BTYPE.

It has encodings from 2 classes: Integer and System

Integer
(FEAT_PAuth)

313029282726252423222120191817161514131211109876543210
110110101100000100Z000RnRd
sfSopcode2

Encoding for the PACIA variant

Applies when (Z == 0)

PACIA <Xd>, <Xn|SP>

Encoding for the PACIZA variant

Applies when (Z == 1 && Rn == 11111)

PACIZA <Xd>

Decode for all variants of this encoding

if !IsFeatureImplemented(FEAT_PAuth) then EndOfDecode(Decode_UNDEF); end; var source_is_sp : boolean = FALSE; let pacia1716 : boolean = FALSE; let d : integer = UInt(Rd); let n : integer = UInt(Rn); if Z == '0' then // PACIA if n == 31 then source_is_sp = TRUE; end; else // PACIZA if n != 31 then EndOfDecode(Decode_UNDEF); end; end;

System
(FEAT_PAuth)

313029282726252423222120191817161514131211109876543210
1101010100000011001000x100x11111
CRmop2

Encoding for the PACIA1716 variant

Applies when (CRm == 0001 && op2 == 000)

PACIA1716

Encoding for the PACIASP variant

Applies when (CRm == 0011 && op2 == 001)

PACIASP

Encoding for the PACIAZ variant

Applies when (CRm == 0011 && op2 == 000)

PACIAZ

Decode for all variants of this encoding

if !IsFeatureImplemented(FEAT_PAuth) then EndOfDecode(Decode_NOP); end; var d : integer; var n : integer; var source_is_sp : boolean = FALSE; var pacia1716 : boolean = FALSE; case CRm::op2 of when '0011 000' => // PACIAZ d = 30; n = 31; when '0011 001' => // PACIASP d = 30; source_is_sp = TRUE; if IsFeatureImplemented(FEAT_BTI) then // Check for branch target compatibility between PSTATE.BTYPE // and implicit branch target of PACIASP instruction. let pacinst : PACInstType = PACIxSP; SetBTypeCompatible(BTypeCompatible_PAC(pacinst)); end; when '0001 000' => // PACIA1716 d = 17; n = 16; pacia1716 = TRUE; end;

Assembler Symbols

<Xd>

Is the 64-bit name of the general-purpose destination register, encoded in the "Rd" field.

<Xn|SP>

Is the 64-bit name of the general-purpose source register or stack pointer, encoded in the "Rn" field.

Operation

if source_is_sp then if IsFeatureImplemented(FEAT_PAuth_LR) && PSTATE.PACM == '1' then X{64}(d) = AddPACIA2(X{64}(d), SP{64}(), PC64()); else X{64}(d) = AddPACIA(X{64}(d), SP{64}()); end; else if IsFeatureImplemented(FEAT_PAuth_LR) && PSTATE.PACM == '1' && pacia1716 then X{64}(d) = AddPACIA2(X{64}(d), X{64}(n), X{64}(15)); else X{64}(d) = AddPACIA(X{64}(d), X{64}(n)); end; end;


2026-03_rel 2026-03-26 20:48:11

Copyright © 2010-2026 Arm Limited or its affiliates. All rights reserved. This document is Non-Confidential.