<?xml version="1.0" ?><?xml-stylesheet type="text/xsl" encoding="UTF-8" href="iform.xsl" version="1.0"?><!DOCTYPE instructionsection  PUBLIC '-//ARM//DTD instructionsection //EN'  'iform-p.dtd'><!-- Copyright (c) 2010-2026 Arm Limited or its affiliates. All rights reserved. --><!-- This document is Non-Confidential. This document may only be used and distributed in accordance with the terms of the agreement entered into by Arm and the party that Arm delivered this document to. --><instructionsection id="RETASPPCR_reg" title="RETAASPPCR, RETABSPPCR -- A64" type="instruction">
  <docvars>
    <docvar key="instr-class" value="general"/>
    <docvar key="isa" value="A64"/>
  </docvars>
  <heading>RETAASPPCR, RETABSPPCR</heading>
  <desc>
    <brief>
      <para>Return from subroutine, with enhanced pointer authentication using a register</para>
    </brief>
    <authored>
      <para>This instruction authenticates the address that is held in LR, using
SP as the first modifier,
the value in the specified register as the second modifier,
and the specified key, and branches to the authenticated address.</para>
      <para>Key A is used for <instruction>RETAASPPCR</instruction>. Key B is used for <instruction>RETABSPPCR</instruction>.</para>
      <para>If the authentication passes, the PE continues execution at the
target of the branch.
For information on behavior if the authentication fails, see
<xref linkend="ARMARM_MDSec.Faulting_on_pointer_authentication">Faulting on pointer authentication</xref>.</para>
      <para>The authenticated address is not written back to LR.</para>
      <para>This instruction provides a hint that this is a subroutine return.</para>
    </authored>
  </desc>
  <alias_list howmany="0"/>
  <classes>
    <iclass name="Integer" oneof="1" id="iclass_integer" no_encodings="2" isa="A64">
      <docvars>
        <docvar key="instr-class" value="general"/>
        <docvar key="isa" value="A64"/>
      </docvars>
      <iclassintro count="2"/>
      <arch_variants>
        <arch_variant feature="FEAT_PAuth_LR" name="v9Ap5"/>
      </arch_variants>
      <regdiagram form="32" psname="A64.control.branch_reg.RETAASPPCR_64M_branch_reg" tworows="1">
        <box hibit="31" width="7" settings="7">
          <c>1</c>
          <c>1</c>
          <c>0</c>
          <c>1</c>
          <c>0</c>
          <c>1</c>
          <c>1</c>
        </box>
        <box hibit="24" width="4" name="opc" usename="1" settings="4" psbits="xxxx">
          <c>0</c>
          <c>0</c>
          <c>1</c>
          <c>0</c>
        </box>
        <box hibit="20" width="5" name="op2" usename="1" settings="5" psbits="xxxxx">
          <c>1</c>
          <c>1</c>
          <c>1</c>
          <c>1</c>
          <c>1</c>
        </box>
        <box hibit="15" width="5" settings="5">
          <c>0</c>
          <c>0</c>
          <c>0</c>
          <c>0</c>
          <c>1</c>
        </box>
        <box hibit="10" width="1" name="M" usename="1">
          <c colspan="1"/>
        </box>
        <box hibit="9" width="5" name="Rn" usename="1" settings="5" psbits="xxxxx">
          <c>1</c>
          <c>1</c>
          <c>1</c>
          <c>1</c>
          <c>1</c>
        </box>
        <box hibit="4" width="5" name="Rm" usename="1" settings="5" constraint="!= 11111">
          <c colspan="5">!= 11111</c>
        </box>
      </regdiagram>
      <encoding name="RETAASPPCR_64M_branch_reg" oneofinclass="2" oneof="2" label="RETAASPPCR" bitdiffs="M == 0">
        <docvars>
          <docvar key="instr-class" value="general"/>
          <docvar key="isa" value="A64"/>
          <docvar key="mnemonic" value="RETAASPPCR"/>
        </docvars>
        <box hibit="10" width="1" name="M">
          <c>0</c>
        </box>
        <asmtemplate><text>RETAASPPCR  </text><a hover="Is the 64-bit name of the general-purpose source register, encoded in the &quot;Rm&quot; field." link="XmOrXZR">&lt;Xm&gt;</a></asmtemplate>
      </encoding>
      <encoding name="RETABSPPCR_64M_branch_reg" oneofinclass="2" oneof="2" label="RETABSPPCR" bitdiffs="M == 1">
        <docvars>
          <docvar key="instr-class" value="general"/>
          <docvar key="isa" value="A64"/>
          <docvar key="mnemonic" value="RETABSPPCR"/>
        </docvars>
        <box hibit="10" width="1" name="M">
          <c>1</c>
        </box>
        <asmtemplate><text>RETABSPPCR  </text><a hover="Is the 64-bit name of the general-purpose source register, encoded in the &quot;Rm&quot; field." link="XmOrXZR">&lt;Xm&gt;</a></asmtemplate>
      </encoding>
      <ps_section howmany="1">
        <ps name="A64.control.branch_reg.RETAASPPCR_64M_branch_reg" sections="1" secttype="noheading">
          <pstext mayhavelinks="1" section="Decode" rep_section="decode">if !IsFeatureImplemented(FEAT_PAuth_LR) then <a link="func_EndOfDecode_1" file="shared_pseudocode.xml">EndOfDecode</a>(<a link="enum_Decode_UNDEF" file="shared_pseudocode.xml">Decode_UNDEF</a>); end;
let m : integer = UInt(Rm);
let use_key_a : boolean = M == '0';
let auth_then_branch : boolean = TRUE;</pstext></ps>
      </ps_section>
    </iclass>
  </classes>
  <explanations scope="all">
    <explanation enclist="RETAASPPCR_64M_branch_reg, RETABSPPCR_64M_branch_reg" symboldefcount="1">
      <symbol link="XmOrXZR">&lt;Xm&gt;</symbol>
      <account encodedin="Rm">
        <intro>
          <para>Is the 64-bit name of the general-purpose source register, encoded in the &quot;Rm&quot; field.</para>
        </intro>
      </account>
    </explanation>
  </explanations>
  <ps_section howmany="1">
    <ps name="A64.control.branch_reg.RETAASPPCR_64M_branch_reg" sections="1" secttype="Operation">
      <pstext mayhavelinks="1" section="Execute" rep_section="execute">var inst_type : <a link="type_GCSInstruction" file="shared_pseudocode.xml">GCSInstruction</a>;
var target : bits(64) = X{}(30);

let modifier : bits(64) = SP{}();
let modifier2 : bits(64) = X{}(m);

if use_key_a then
    target = <a link="func_AuthIA2_4" file="shared_pseudocode.xml">AuthIA2</a>(target, modifier, modifier2, auth_then_branch);
else
    target = <a link="func_AuthIB2_4" file="shared_pseudocode.xml">AuthIB2</a>(target, modifier, modifier2, auth_then_branch);
end;

if IsFeatureImplemented(FEAT_GCS) &amp;&amp; <a link="func_GCSPCREnabled_1" file="shared_pseudocode.xml">GCSPCREnabled</a>(<a link="global_PSTATE" file="shared_pseudocode.xml">PSTATE</a>.EL) then
    inst_type = if use_key_a then <a link="enum_GCSInstType_PRETAA" file="shared_pseudocode.xml">GCSInstType_PRETAA</a> else <a link="enum_GCSInstType_PRETAB" file="shared_pseudocode.xml">GCSInstType_PRETAB</a>;
    target = <a link="func_LoadCheckGCSRecord_2" file="shared_pseudocode.xml">LoadCheckGCSRecord</a>(target, inst_type);
    <a link="func_SetCurrentGCSPointer_1" file="shared_pseudocode.xml">SetCurrentGCSPointer</a>(<a link="func_GetCurrentGCSPointer_0" file="shared_pseudocode.xml">GetCurrentGCSPointer</a>() + 8);
end;

// Value in BTypeNext will be used to set PSTATE.BTYPE
<a link="global_BTypeNext" file="shared_pseudocode.xml">BTypeNext</a> = '00';

let branch_conditional : boolean = FALSE;
<a link="func_BranchTo_4" file="shared_pseudocode.xml">BranchTo</a>{64}(target, <a link="enum_BranchType_RET" file="shared_pseudocode.xml">BranchType_RET</a>, branch_conditional);</pstext></ps>
  </ps_section>
  <timestamp>2026-03-26 20:27:25</timestamp>
  <commit_id>2026-03_rel</commit_id>
</instructionsection>