<?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="ADD_ADR" title="ADD (immediate, to PC) -- AArch32" type="alias">
  <docvars>
    <docvar key="instr-class" value="general"/>
    <docvar key="mnemonic" value="ADR"/>
  </docvars>
  <heading>ADD (immediate, to PC)</heading>
  <desc>
    <brief>
      <para>Add to PC</para>
    </brief>
    <authored>
      <para>Add to PC adds an immediate value to the Align(PC, 4) value to form a PC-relative address, and writes the result to the destination register.  Arm recommends that, where possible, software avoids using this alias.</para>
    </authored>
  </desc>
  <aliasto refiform="adr.xml" iformid="ADR">ADR</aliasto>
  <classes>
    <classesintro count="3">
      <txt>It has encodings from the following instruction sets:</txt>
      <txt> A32 (</txt>
      <a href="#iclass_a1">A1</a>
      <txt>)</txt>
      <txt> and </txt>
      <txt> T32 (</txt>
      <a href="#iclass_t1">T1</a>
      <txt> and </txt>
      <a href="#iclass_t3">T3</a>
      <txt>)</txt>
      <txt>.</txt>
    </classesintro>
    <iclass name="A1" oneof="3" id="iclass_a1" no_encodings="1" isa="A32">
      <docvars>
        <docvar key="armarmheading" value="A1"/>
        <docvar key="instr-class" value="general"/>
        <docvar key="isa" value="A32"/>
        <docvar key="mnemonic" value="ADR"/>
      </docvars>
      <iclassintro count="1"/>
      <regdiagram form="32" psname="A32.dp.dpimm.intdp2reg_imm.ADR_A1.ADD" tworows="1">
        <box hibit="31" width="4" name="cond" usename="1" settings="4" constraint="!= 1111">
          <c colspan="4">!= 1111</c>
        </box>
        <box hibit="27" width="2" settings="2">
          <c>0</c>
          <c>0</c>
        </box>
        <box hibit="25" width="1" settings="1">
          <c>1</c>
        </box>
        <box hibit="24" width="1" settings="1">
          <c>0</c>
        </box>
        <box hibit="23" width="3" name="opc" usename="1" settings="3" psbits="xxx">
          <c>1</c>
          <c>0</c>
          <c>0</c>
        </box>
        <box hibit="20" name="S" usename="1" settings="1" psbits="x">
          <c>0</c>
        </box>
        <box hibit="19" width="4" name="Rn" usename="1" settings="4" psbits="xxxx">
          <c>1</c>
          <c>1</c>
          <c>1</c>
          <c>1</c>
        </box>
        <box hibit="15" width="4" name="Rd" usename="1">
          <c colspan="4"/>
        </box>
        <box hibit="11" width="12" name="imm12" usename="1">
          <c colspan="12"/>
        </box>
      </regdiagram>
      <encoding name="ADD_ADR_A1" oneofinclass="1" oneof="3" label="A1">
        <docvars>
          <docvar key="armarmheading" value="A1"/>
          <docvar key="instr-class" value="general"/>
          <docvar key="isa" value="A32"/>
          <docvar key="mnemonic" value="ADR"/>
          <docvar key="alias_mnemonic" value="ADD"/>
        </docvars>
        <asmtemplate><text>ADD{</text><a hover="See x[Standard assembler syntax fields](Babbefhf)." link="AL_option__4">&lt;c&gt;</a><text>}{</text><a hover="See x[Standard assembler syntax fields](Babbefhf)." link="qn_option">&lt;q&gt;</a><text>}  </text><a hover="For the &quot;A1&quot; variant: is the general-purpose destination register, encoded in the &quot;Rd&quot; field. If the PC is used, the instruction is a branch to the address calculated by the operation. This is an interworking branch, see x[Pseudocode description of operations on the AArch32 general-purpose registers and the PC](BEICJFEH)." link="Rd__23">&lt;Rd&gt;</a><text>, PC, #</text><a hover="An immediate value. See x[Modified immediate constants in A32 instructions](BABHDAJF) for the range of values." link="const__15">&lt;const&gt;</a></asmtemplate>
        <equivalent_to>
          <asmtemplate><a href="adr.xml#ADR_A1">ADR</a><text>{</text><a hover="See x[Standard assembler syntax fields](Babbefhf)." href="adr_a32.xml#AL_option__4">&lt;c&gt;</a><text>}{</text><a hover="See x[Standard assembler syntax fields](Babbefhf)." href="adr_a32.xml#qn_option">&lt;q&gt;</a><text>}  </text><a hover="For the &quot;A1&quot; variant: is the general-purpose destination register, encoded in the &quot;Rd&quot; field. If the PC is used, the instruction is a branch to the address calculated by the operation. This is an interworking branch, see x[Pseudocode description of operations on the AArch32 general-purpose registers and the PC](BEICJFEH)." href="adr_a32.xml#Rd__23">&lt;Rd&gt;</a><text>, </text><a hover="For the &quot;A1&quot; and &quot;A2&quot; variants: the label of an instruction or literal data item whose address is to be loaded into &lt;Rd&gt;. The assembler calculates the required value of the offset from the Align(PC, 4) value of the ADR instruction to this label." href="adr_a32.xml#label__15">&lt;label&gt;</a></asmtemplate>
          <aliascond>Never</aliascond>
        </equivalent_to>
      </encoding>
    </iclass>
    <iclass name="T1" oneof="3" id="iclass_t1" no_encodings="1" isa="T32">
      <docvars>
        <docvar key="armarmheading" value="T1"/>
        <docvar key="instr-class" value="general"/>
        <docvar key="isa" value="T32"/>
        <docvar key="mnemonic" value="ADR"/>
      </docvars>
      <iclassintro count="1"/>
      <regdiagram form="16" psname="T32.n.addpcsp16.ADR_T1.ADD" tworows="1">
        <box hibit="15" width="4" settings="4">
          <c>1</c>
          <c>0</c>
          <c>1</c>
          <c>0</c>
        </box>
        <box hibit="11" name="SP" usename="1" settings="1" psbits="x">
          <c>0</c>
        </box>
        <box hibit="10" width="3" name="Rd" usename="1">
          <c colspan="3"/>
        </box>
        <box hibit="7" width="8" name="imm8" usename="1">
          <c colspan="8"/>
        </box>
      </regdiagram>
      <encoding name="ADD_ADR_T1" oneofinclass="1" oneof="3" label="T1">
        <docvars>
          <docvar key="armarmheading" value="T1"/>
          <docvar key="instr-class" value="general"/>
          <docvar key="isa" value="T32"/>
          <docvar key="mnemonic" value="ADR"/>
          <docvar key="alias_mnemonic" value="ADD"/>
        </docvars>
        <asmtemplate><text>ADD{</text><a hover="See x[Standard assembler syntax fields](Babbefhf)." link="AL_option__4">&lt;c&gt;</a><text>}{</text><a hover="See x[Standard assembler syntax fields](Babbefhf)." link="qn_option">&lt;q&gt;</a><text>}  </text><a hover="For the &quot;T1&quot; and &quot;T3&quot; variants: is the general-purpose destination register, encoded in the &quot;Rd&quot; field." link="Rd__25">&lt;Rd&gt;</a><text>, PC, #</text><a hover="Is an unsigned immediate, a multiple of 4, in the range 0 to 1020, encoded in the &quot;imm8&quot; field as &lt;imm8&gt;/4." link="imm8__3">&lt;imm8&gt;</a></asmtemplate>
        <equivalent_to>
          <asmtemplate><a href="adr.xml#ADR_T1">ADR</a><text>{</text><a hover="See x[Standard assembler syntax fields](Babbefhf)." href="adr_a32.xml#AL_option__4">&lt;c&gt;</a><text>}{</text><a hover="See x[Standard assembler syntax fields](Babbefhf)." href="adr_a32.xml#qn_option">&lt;q&gt;</a><text>}  </text><a hover="For the &quot;T1&quot; and &quot;T3&quot; variants: is the general-purpose destination register, encoded in the &quot;Rd&quot; field." href="adr_a32.xml#Rd__25">&lt;Rd&gt;</a><text>, </text><a hover="For the &quot;T1&quot; variant: the label of an instruction or literal data item whose address is to be loaded into &lt;Rd&gt;. The assembler calculates the required value of the offset from the Align(PC, 4) value of the ADR instruction to this label. Permitted values of the size of the offset are multiples of 4 in the range 0 to 1020." href="adr_a32.xml#label__10">&lt;label&gt;</a></asmtemplate>
          <aliascond>Never</aliascond>
        </equivalent_to>
      </encoding>
    </iclass>
    <iclass name="T3" oneof="3" id="iclass_t3" no_encodings="1" isa="T32">
      <docvars>
        <docvar key="armarmheading" value="T3"/>
        <docvar key="instr-class" value="general"/>
        <docvar key="isa" value="T32"/>
        <docvar key="mnemonic" value="ADR"/>
      </docvars>
      <iclassintro count="1"/>
      <regdiagram form="16x2" psname="T32.w.imm.dpint_imms.ADR_T3.ADDB" tworows="1">
        <box hibit="31" width="3" settings="3">
          <c>1</c>
          <c>1</c>
          <c>1</c>
        </box>
        <box hibit="28" width="2" settings="2">
          <c>1</c>
          <c>0</c>
        </box>
        <box hibit="26" width="1" name="i" usename="1">
          <c colspan="1"/>
        </box>
        <box hibit="25" width="1" settings="1">
          <c>1</c>
        </box>
        <box hibit="24" width="1" settings="1">
          <c>0</c>
        </box>
        <box hibit="23" name="o1" usename="1" settings="1" psbits="x">
          <c>0</c>
        </box>
        <box hibit="22" width="1" settings="1">
          <c>0</c>
        </box>
        <box hibit="21" name="o2" usename="1" settings="1" psbits="x">
          <c>0</c>
        </box>
        <box hibit="20" width="1" settings="1">
          <c>0</c>
        </box>
        <box hibit="19" width="4" name="Rn" usename="1" settings="4" psbits="xxxx">
          <c>1</c>
          <c>1</c>
          <c>1</c>
          <c>1</c>
        </box>
        <box hibit="15" width="1" settings="1">
          <c>0</c>
        </box>
        <box hibit="14" width="3" name="imm3" usename="1">
          <c colspan="3"/>
        </box>
        <box hibit="11" width="4" name="Rd" usename="1">
          <c colspan="4"/>
        </box>
        <box hibit="7" width="8" name="imm8" usename="1">
          <c colspan="8"/>
        </box>
      </regdiagram>
      <encoding name="ADD_ADR_T3" oneofinclass="1" oneof="3" label="T3">
        <docvars>
          <docvar key="armarmheading" value="T3"/>
          <docvar key="instr-class" value="general"/>
          <docvar key="isa" value="T32"/>
          <docvar key="mnemonic" value="ADR"/>
          <docvar key="alias_mnemonic" value="ADD"/>
        </docvars>
        <asmtemplate><text>ADD{</text><a hover="See x[Standard assembler syntax fields](Babbefhf)." link="AL_option__4">&lt;c&gt;</a><text>}{</text><a hover="See x[Standard assembler syntax fields](Babbefhf)." link="qn_option">&lt;q&gt;</a><text>}  </text><a hover="For the &quot;T1&quot; and &quot;T3&quot; variants: is the general-purpose destination register, encoded in the &quot;Rd&quot; field." link="Rd__25">&lt;Rd&gt;</a><text>, PC, #</text><a hover="Is a 12-bit unsigned immediate, in the range 0 to 4095, encoded in the &quot;i:imm3:imm8&quot; field." link="imm12">&lt;imm12&gt;</a></asmtemplate>
        <asmtemplate comment="UInt(Rd) &lt; 8 &amp;&amp; UInt(i :: imm3 :: imm8) &lt; 256"><text>ADDW{</text><a hover="See x[Standard assembler syntax fields](Babbefhf)." link="AL_option__4">&lt;c&gt;</a><text>}{</text><a hover="See x[Standard assembler syntax fields](Babbefhf)." link="qn_option">&lt;q&gt;</a><text>}  </text><a hover="For the &quot;T1&quot; and &quot;T3&quot; variants: is the general-purpose destination register, encoded in the &quot;Rd&quot; field." link="Rd__25">&lt;Rd&gt;</a><text>, PC, #</text><a hover="Is a 12-bit unsigned immediate, in the range 0 to 4095, encoded in the &quot;i:imm3:imm8&quot; field." link="imm12">&lt;imm12&gt;</a></asmtemplate>
        <equivalent_to>
          <asmtemplate><a href="adr.xml#ADR_T3">ADR</a><text>{</text><a hover="See x[Standard assembler syntax fields](Babbefhf)." href="adr_a32.xml#AL_option__4">&lt;c&gt;</a><text>}{</text><a hover="See x[Standard assembler syntax fields](Babbefhf)." href="adr_a32.xml#qn_option">&lt;q&gt;</a><text>}  </text><a hover="For the &quot;T1&quot; and &quot;T3&quot; variants: is the general-purpose destination register, encoded in the &quot;Rd&quot; field." href="adr_a32.xml#Rd__25">&lt;Rd&gt;</a><text>, </text><a hover="For the &quot;T2&quot; and &quot;T3&quot; variants: the label of an instruction or literal data item whose address is to be loaded into &lt;Rd&gt;. The assembler calculates the required value of the offset from the Align(PC, 4) value of the ADR instruction to this label." href="adr_a32.xml#label__14">&lt;label&gt;</a></asmtemplate>
          <aliascond>Never</aliascond>
        </equivalent_to>
      </encoding>
    </iclass>
  </classes>
  <explanations scope="all">
    <explanation enclist="ADD_ADR_T3, ADD_ADR_T1, ADD_ADR_A1" symboldefcount="1">
      <symbol link="AL_option__4">&lt;c&gt;</symbol>
      <account encodedin="">
        <intro>
          <para>See <xref linkend="Babbefhf">Standard assembler syntax fields</xref>.</para>
        </intro>
      </account>
    </explanation>
    <explanation enclist="ADD_ADR_T3, ADD_ADR_T1, ADD_ADR_A1" symboldefcount="1">
      <symbol link="qn_option">&lt;q&gt;</symbol>
      <account encodedin="">
        <intro>
          <para>See <xref linkend="Babbefhf">Standard assembler syntax fields</xref>.</para>
        </intro>
      </account>
    </explanation>
    <explanation enclist="ADD_ADR_T3, ADD_ADR_T1" symboldefcount="1">
      <symbol link="Rd__25">&lt;Rd&gt;</symbol>
      <account encodedin="Rd">
        <intro>
          <para>For the &quot;T1&quot; and &quot;T3&quot; variants: is the general-purpose destination register, encoded in the &quot;Rd&quot; field.</para>
        </intro>
      </account>
    </explanation>
    <explanation enclist="ADD_ADR_A1" symboldefcount="2">
      <symbol link="Rd__23">&lt;Rd&gt;</symbol>
      <account encodedin="Rd">
        <intro>
          <para>For the &quot;A1&quot; variant: is the general-purpose destination register, encoded in the &quot;Rd&quot; field. If the PC is used, the instruction is a branch to the address calculated by the operation. This is an interworking branch, see <xref linkend="BEICJFEH">Pseudocode description of operations on the AArch32 general-purpose registers and the PC</xref>.</para>
        </intro>
      </account>
    </explanation>
    <explanation enclist="ADD_ADR_T3" symboldefcount="1">
      <symbol link="imm12">&lt;imm12&gt;</symbol>
      <account encodedin="(i :: imm3 :: imm8)">
        <intro>
          <para>Is a 12-bit unsigned immediate, in the range 0 to 4095, encoded in the &quot;i:imm3:imm8&quot; field.</para>
        </intro>
      </account>
    </explanation>
    <explanation enclist="ADD_ADR_A1" symboldefcount="1">
      <symbol link="const__15">&lt;const&gt;</symbol>
      <account encodedin="imm12">
        <intro>
          <para>An immediate value. See <xref linkend="BABHDAJF">Modified immediate constants in A32 instructions</xref> for the range of values.</para>
        </intro>
      </account>
    </explanation>
    <explanation enclist="ADD_ADR_T1" symboldefcount="1">
      <symbol link="imm8__3">&lt;imm8&gt;</symbol>
      <account encodedin="imm8">
        <intro>
          <para>Is an unsigned immediate, a multiple of 4, in the range 0 to 1020, encoded in the &quot;imm8&quot; field as &lt;imm8&gt;/4.</para>
        </intro>
      </account>
    </explanation>
  </explanations>
  <timestamp>2026-03-26 20:27:25</timestamp>
  <commit_id>2026-03_rel</commit_id>
</instructionsection>