PACIB, PACIB1716, PACIBSP, PACIBZ, PACIZB
Pointer Authentication Code for instruction address, using key B
This instruction computes and inserts a Pointer Authentication Code
for an instruction address, using a modifier and key B.
The address is:
In the general-purpose register that is specified by
<Xd> for PACIB and PACIZB.
In X17, for PACIB1716.
In X30, for PACIBSP and PACIBZ.
The modifier is:
In the general-purpose register or stack pointer that is specified
by <Xn|SP> for PACIB.
The value zero, for PACIZB and PACIBZ.
In X16, for PACIB1716.
In SP, for PACIBSP.
If FEAT_PAuth_LR is implemented and PSTATE.PACM is 1, then
PACIB1716 and PACIBSP include a second modifier that is:
In X15, for PACIB1716.
The value of PC, for PACIBSP.
A PACIBSP instruction has an implicit BTI instruction. The
implicit BTI instruction of a PACIBSP instruction is always
compatible with PSTATE.BTYPE == 0b01
and PSTATE.BTYPE == 0b10.
Controls in SCTLR_ELx configure whether the
implicit BTI instruction of a PACIBSP instruction is compatible with
PSTATE.BTYPE == 0b11.
For more information, see PSTATE.BTYPE.
It has encodings from 2 classes:
Integer
and
System
1
1
0
1
1
0
1
0
1
1
0
0
0
0
0
1
0
0
0
0
1
0
PACIB <Xd>, <Xn|SP>
1
1
1
1
1
1
PACIZB <Xd>
if !IsFeatureImplemented(FEAT_PAuth) then UNDEFINED;
boolean source_is_sp = FALSE;
constant boolean pacib1716 = FALSE;
constant integer d = UInt(Rd);
constant integer n = UInt(Rn);
if Z == '0' then // PACIB
if n == 31 then source_is_sp = TRUE;
else // PACIZB
if n != 31 then UNDEFINED;
1
1
0
1
0
1
0
1
0
0
0
0
0
0
1
1
0
0
1
0
0
0
x
1
0
1
x
1
1
1
1
1
0
0
PACIB1716
1
1
PACIBSP
1
0
PACIBZ
if !IsFeatureImplemented(FEAT_PAuth) then ExecuteAsNOP();
integer d;
integer n;
boolean source_is_sp = FALSE;
boolean pacib1716 = FALSE;
case CRm:op2 of
when '0011 010' // PACIBZ
d = 30;
n = 31;
when '0011 011' // PACIBSP
d = 30;
source_is_sp = TRUE;
if IsFeatureImplemented(FEAT_BTI) then
// Check for branch target compatibility between PSTATE.BTYPE
// and implicit branch target of PACIBSP instruction.
SetBTypeCompatible(BTypeCompatible_PACIXSP());
when '0001 010' // PACIB1716
d = 17;
n = 16;
pacib1716 = TRUE;
when '0001 000' SEE "PACIA";
when '0001 100' SEE "AUTIA";
when '0001 110' SEE "AUTIB";
when '0011 00x' SEE "PACIA";
when '0011 10x' SEE "AUTIA";
when '0011 11x' SEE "AUTIB";
when '0000 111' SEE "XPACLRI";
otherwise SEE "HINT";
<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.
if source_is_sp then
if IsFeatureImplemented(FEAT_PAuth_LR) && PSTATE.PACM == '1' then
X[d, 64] = AddPACIB2(X[d, 64], SP[], PC64);
else
X[d, 64] = AddPACIB(X[d, 64], SP[]);
else
if IsFeatureImplemented(FEAT_PAuth_LR) && PSTATE.PACM == '1' && pacib1716 then
X[d, 64] = AddPACIB2(X[d, 64], X[n, 64], X[15, 64]);
else
X[d, 64] = AddPACIB(X[d, 64], X[n, 64]);