<?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="PRFM_reg" title="PRFM (register) -- A64" type="instruction">
  <docvars>
    <docvar key="instr-class" value="general"/>
    <docvar key="isa" value="A64"/>
    <docvar key="mnemonic" value="PRFM"/>
    <docvar key="offset-type" value="off-reg"/>
  </docvars>
  <heading>PRFM (register)</heading>
  <desc>
    <brief>
      <para>Prefetch memory (register)</para>
    </brief>
    <authored>
      <para>This instruction signals the memory system that data memory
accesses from a specified address are likely to occur in the near
future. The address for data memory accesses is calculated from a
base register value and an offset register value. The offset
register value can optionally be shifted and extended.
The memory system can respond by taking actions that are
expected to speed up the memory accesses when they do occur, such as
making the cache line containing the specified address available at
the level of cache specified by the instruction.</para>
      <para>The <syntax>&lt;prfop&gt;</syntax> operand specifies the prefetch hint as follows:</para>
      <list type="unordered">
        <listitem>
          <content>Access type:<list type="unordered">
              <listitem>
                <content>PLD for prefetch for load.</content>
              </listitem>
              <listitem>
                <content>PLI for prefetch for execute.</content>
              </listitem>
              <listitem>
                <content>PST for prefetch for store.</content>
              </listitem>
            </list>
          </content>
        </listitem>
        <listitem>
          <content>Target cache level:<list type="unordered">
              <listitem>
                <content>L1 for Level 1 cache.</content>
              </listitem>
              <listitem>
                <content>L2 for Level 2 cache.</content>
              </listitem>
              <listitem>
                <content>L3 for Level 3 cache.</content>
              </listitem>
              <listitem>
                <content>When FEAT_PRFMSLC is implemented, SLC for system level cache.</content>
              </listitem>
            </list>
          </content>
        </listitem>
        <listitem>
          <content>Policy:<list type="unordered">
              <listitem>
                <content>KEEP for retained or temporal prefetch, allocated in the cache normally.</content>
              </listitem>
              <listitem>
                <content>STRM for streaming or non-temporal prefetch, for data that is used only once.</content>
              </listitem>
            </list>
          </content>
        </listitem>
      </list>
      <para>The effect of a <instruction>PRFM</instruction> instruction is
<arm-defined-word>IMPLEMENTATION DEFINED</arm-defined-word>. For more information,
see <xref linkend="ARMARM_CEGGGIDE">Prefetch memory</xref>.</para>
      <para>For information about addressing modes, see
<xref linkend="ARMARM_CHDIIIBB">Load/Store addressing modes</xref>.</para>
    </authored>
  </desc>
  <alias_list howmany="0"/>
  <classes>
    <iclass name="Integer" oneof="1" id="iclass_integer" no_encodings="1" isa="A64">
      <docvars>
        <docvar key="instr-class" value="general"/>
        <docvar key="isa" value="A64"/>
        <docvar key="mnemonic" value="PRFM"/>
        <docvar key="offset-type" value="off-reg"/>
      </docvars>
      <iclassintro count="1"/>
      <regdiagram form="32" psname="A64.ldst.ldst_regoff.PRFM_P_ldst_regoff" tworows="1">
        <box hibit="31" width="2" name="size" usename="1" settings="2" psbits="xx">
          <c>1</c>
          <c>1</c>
        </box>
        <box hibit="29" width="2" settings="2">
          <c>1</c>
          <c>1</c>
        </box>
        <box hibit="27" width="1" settings="1">
          <c>1</c>
        </box>
        <box hibit="26" name="VR" usename="1" settings="1" psbits="x">
          <c>0</c>
        </box>
        <box hibit="25" width="1" settings="1">
          <c>0</c>
        </box>
        <box hibit="24" width="1" settings="1">
          <c>0</c>
        </box>
        <box hibit="23" width="2" name="opc" usename="1" settings="2" psbits="xx">
          <c>1</c>
          <c>0</c>
        </box>
        <box hibit="21" width="1" settings="1">
          <c>1</c>
        </box>
        <box hibit="20" width="5" name="Rm" usename="1">
          <c colspan="5"/>
        </box>
        <box hibit="15" width="3" name="option" usename="1" settings="1" psbits="xxx">
          <c>x</c>
          <c>1</c>
          <c>x</c>
        </box>
        <box hibit="12" width="1" name="S" usename="1">
          <c colspan="1"/>
        </box>
        <box hibit="11" width="2" settings="2">
          <c>1</c>
          <c>0</c>
        </box>
        <box hibit="9" width="5" name="Rn" usename="1">
          <c colspan="5"/>
        </box>
        <box hibit="4" width="5" name="Rt" usename="1" settings="2" psbits="xxxxx" constraint="!= 11xxx">
          <c colspan="5">!= 11xxx</c>
        </box>
      </regdiagram>
      <encoding name="PRFM_P_ldst_regoff" oneofinclass="1" oneof="1" label="">
        <docvars>
          <docvar key="instr-class" value="general"/>
          <docvar key="isa" value="A64"/>
          <docvar key="offset-type" value="off-reg"/>
          <docvar key="mnemonic" value="PRFM"/>
        </docvars>
        <asmtemplate><text>PRFM  (</text><a hover="Is the prefetch operation, " link="Rt_prfop">&lt;prfop&gt;</a><text>|#</text><a hover="Is the prefetch operation encoding as an immediate, in the range 0 to 31, encoded in the &quot;Rt&quot; field.

This syntax is only for encodings that are not accessible using &lt;prfop&gt;." link="Rt_imm5">&lt;imm5&gt;</a><text>), [</text><a hover="Is the 64-bit name of the general-purpose base register or stack pointer, encoded in the &quot;Rn&quot; field." link="XnSP_option">&lt;Xn|SP&gt;</a><text>, (</text><a hover="When option&lt;0&gt; is set to 0, is the 32-bit name of the general-purpose index register, encoded in the &quot;Rm&quot; field." link="WmOrWZR">&lt;Wm&gt;</a><text>|</text><a hover="When option&lt;0&gt; is set to 1, is the 64-bit name of the general-purpose index register, encoded in the &quot;Rm&quot; field." link="XmOrXZR__2">&lt;Xm&gt;</a><text>){, </text><a hover="For the &quot;128-bit&quot;, &quot;16-bit&quot;, &quot;32-bit&quot;, and &quot;64-bit&quot; variants: is the index extend/shift specifier, defaulting to LSL, and which must be omitted for the LSL option when &lt;amount&gt; is omitted, " link="extend_option__3">&lt;extend&gt;</a><text> {</text><a hover="For the &quot;64-bit&quot; variant: is the index shift amount, optional only when &lt;extend&gt; is not LSL. Where it is permitted to be optional, it defaults to #0. It is " link="amount_option__6">&lt;amount&gt;</a><text>}}]</text></asmtemplate>
      </encoding>
      <ps_section howmany="1">
        <ps name="A64.ldst.ldst_regoff.PRFM_P_ldst_regoff" sections="1" secttype="noheading">
          <pstext mayhavelinks="1" section="Decode" rep_section="decode">if option[1] == '0' 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;         // sub-word index
let extend_type : <a link="type_ExtendType" file="shared_pseudocode.xml">ExtendType</a> = <a link="func_DecodeRegExtend_1" file="shared_pseudocode.xml">DecodeRegExtend</a>(option);
let shift : integer{} = if S == '1' then 3 else 0;
let n : integer = UInt(Rn);
let t : integer = UInt(Rt);
let m : integer = UInt(Rm);
let nontemporal : boolean = FALSE;
let tagchecked : boolean = FALSE;</pstext></ps>
      </ps_section>
    </iclass>
  </classes>
  <explanations scope="all">
    <explanation enclist="PRFM_P_ldst_regoff" symboldefcount="1">
      <symbol link="Rt_prfop">&lt;prfop&gt;</symbol>
      <definition encodedin="Rt">
        <intro>Is the prefetch operation, </intro>
        <table class="valuetable">
          <tgroup cols="3">
            <thead>
              <row>
                <entry class="bitfield">Rt</entry>
                <entry class="symbol">&lt;prfop&gt;</entry>
                <entry class="symbol">Architectural Feature</entry>
              </row>
            </thead>
            <tbody>
              <row>
                <entry class="bitfield">00000</entry>
                <entry class="symbol">PLDL1KEEP</entry>
                <entry class="feature"/>
              </row>
              <row>
                <entry class="bitfield">00001</entry>
                <entry class="symbol">PLDL1STRM</entry>
                <entry class="feature"/>
              </row>
              <row>
                <entry class="bitfield">00010</entry>
                <entry class="symbol">PLDL2KEEP</entry>
                <entry class="feature"/>
              </row>
              <row>
                <entry class="bitfield">00011</entry>
                <entry class="symbol">PLDL2STRM</entry>
                <entry class="feature"/>
              </row>
              <row>
                <entry class="bitfield">00100</entry>
                <entry class="symbol">PLDL3KEEP</entry>
                <entry class="feature"/>
              </row>
              <row>
                <entry class="bitfield">00101</entry>
                <entry class="symbol">PLDL3STRM</entry>
                <entry class="feature"/>
              </row>
              <row>
                <entry class="bitfield">00110</entry>
                <entry class="symbol">PLDSLCKEEP</entry>
                <entry class="feature">
                  <arch_variants>
                    <arch_variant feature="FEAT_PRFMSLC"/>
                  </arch_variants>
                </entry>
              </row>
              <row>
                <entry class="bitfield">00111</entry>
                <entry class="symbol">PLDSLCSTRM</entry>
                <entry class="feature">
                  <arch_variants>
                    <arch_variant feature="FEAT_PRFMSLC"/>
                  </arch_variants>
                </entry>
              </row>
              <row>
                <entry class="bitfield">01000</entry>
                <entry class="symbol">PLIL1KEEP</entry>
                <entry class="feature"/>
              </row>
              <row>
                <entry class="bitfield">01001</entry>
                <entry class="symbol">PLIL1STRM</entry>
                <entry class="feature"/>
              </row>
              <row>
                <entry class="bitfield">01010</entry>
                <entry class="symbol">PLIL2KEEP</entry>
                <entry class="feature"/>
              </row>
              <row>
                <entry class="bitfield">01011</entry>
                <entry class="symbol">PLIL2STRM</entry>
                <entry class="feature"/>
              </row>
              <row>
                <entry class="bitfield">01100</entry>
                <entry class="symbol">PLIL3KEEP</entry>
                <entry class="feature"/>
              </row>
              <row>
                <entry class="bitfield">01101</entry>
                <entry class="symbol">PLIL3STRM</entry>
                <entry class="feature"/>
              </row>
              <row>
                <entry class="bitfield">01110</entry>
                <entry class="symbol">PLISLCKEEP</entry>
                <entry class="feature">
                  <arch_variants>
                    <arch_variant feature="FEAT_PRFMSLC"/>
                  </arch_variants>
                </entry>
              </row>
              <row>
                <entry class="bitfield">01111</entry>
                <entry class="symbol">PLISLCSTRM</entry>
                <entry class="feature">
                  <arch_variants>
                    <arch_variant feature="FEAT_PRFMSLC"/>
                  </arch_variants>
                </entry>
              </row>
              <row>
                <entry class="bitfield">10000</entry>
                <entry class="symbol">PSTL1KEEP</entry>
                <entry class="feature"/>
              </row>
              <row>
                <entry class="bitfield">10001</entry>
                <entry class="symbol">PSTL1STRM</entry>
                <entry class="feature"/>
              </row>
              <row>
                <entry class="bitfield">10010</entry>
                <entry class="symbol">PSTL2KEEP</entry>
                <entry class="feature"/>
              </row>
              <row>
                <entry class="bitfield">10011</entry>
                <entry class="symbol">PSTL2STRM</entry>
                <entry class="feature"/>
              </row>
              <row>
                <entry class="bitfield">10100</entry>
                <entry class="symbol">PSTL3KEEP</entry>
                <entry class="feature"/>
              </row>
              <row>
                <entry class="bitfield">10101</entry>
                <entry class="symbol">PSTL3STRM</entry>
                <entry class="feature"/>
              </row>
              <row>
                <entry class="bitfield">10110</entry>
                <entry class="symbol">PSTSLCKEEP</entry>
                <entry class="feature">
                  <arch_variants>
                    <arch_variant feature="FEAT_PRFMSLC"/>
                  </arch_variants>
                </entry>
              </row>
              <row>
                <entry class="bitfield">10111</entry>
                <entry class="symbol">PSTSLCSTRM</entry>
                <entry class="feature">
                  <arch_variants>
                    <arch_variant feature="FEAT_PRFMSLC"/>
                  </arch_variants>
                </entry>
              </row>
            </tbody>
          </tgroup>
        </table>
        <after>For other encodings of the &quot;Rt&quot; field, use &lt;imm5&gt;.</after>
      </definition>
    </explanation>
    <explanation enclist="PRFM_P_ldst_regoff" symboldefcount="1">
      <symbol link="Rt_imm5">&lt;imm5&gt;</symbol>
      <account encodedin="Rt">
        <intro>
          <para>Is the prefetch operation encoding as an immediate, in the range 0 to 31, encoded in the &quot;Rt&quot; field.</para>
          <para>This syntax is only for encodings that are not accessible using <syntax>&lt;prfop&gt;</syntax>.</para>
        </intro>
      </account>
    </explanation>
    <explanation enclist="PRFM_P_ldst_regoff" symboldefcount="1">
      <symbol link="XnSP_option">&lt;Xn|SP&gt;</symbol>
      <account encodedin="Rn">
        <intro>
          <para>Is the 64-bit name of the general-purpose base register or stack pointer, encoded in the &quot;Rn&quot; field.</para>
        </intro>
      </account>
    </explanation>
    <explanation enclist="PRFM_P_ldst_regoff" symboldefcount="1">
      <symbol link="WmOrWZR">&lt;Wm&gt;</symbol>
      <account encodedin="Rm">
        <intro>
          <para>When <field>option&lt;0&gt;</field> is set to 0, is the 32-bit name of the general-purpose index register, encoded in the &quot;Rm&quot; field.</para>
        </intro>
      </account>
    </explanation>
    <explanation enclist="PRFM_P_ldst_regoff" symboldefcount="1">
      <symbol link="XmOrXZR__2">&lt;Xm&gt;</symbol>
      <account encodedin="Rm">
        <intro>
          <para>When <field>option&lt;0&gt;</field> is set to 1, is the 64-bit name of the general-purpose index register, encoded in the &quot;Rm&quot; field.</para>
        </intro>
      </account>
    </explanation>
    <explanation enclist="PRFM_P_ldst_regoff" symboldefcount="1">
      <symbol link="extend_option__3">&lt;extend&gt;</symbol>
      <definition encodedin="option">
        <intro>Is the index extend/shift specifier, defaulting to LSL, and which must be omitted for the LSL option when &lt;amount&gt; is omitted, </intro>
        <table class="valuetable">
          <tgroup cols="2">
            <thead>
              <row>
                <entry class="bitfield">option</entry>
                <entry class="symbol">&lt;extend&gt;</entry>
              </row>
            </thead>
            <tbody>
              <row>
                <entry class="bitfield">010</entry>
                <entry class="symbol">UXTW</entry>
              </row>
              <row>
                <entry class="bitfield">011</entry>
                <entry class="symbol">LSL</entry>
              </row>
              <row>
                <entry class="bitfield">110</entry>
                <entry class="symbol">SXTW</entry>
              </row>
              <row>
                <entry class="bitfield">111</entry>
                <entry class="symbol">SXTX</entry>
              </row>
            </tbody>
          </tgroup>
        </table>
      </definition>
    </explanation>
    <explanation enclist="PRFM_P_ldst_regoff" symboldefcount="1">
      <symbol link="amount_option__6">&lt;amount&gt;</symbol>
      <definition encodedin="S">
        <intro>Is the index shift amount, optional only when &lt;extend&gt; is not LSL. Where it is permitted to be optional, it defaults to #0. It is </intro>
        <table class="valuetable">
          <tgroup cols="2">
            <thead>
              <row>
                <entry class="bitfield">S</entry>
                <entry class="symbol">&lt;amount&gt;</entry>
              </row>
            </thead>
            <tbody>
              <row>
                <entry class="bitfield">0</entry>
                <entry class="symbol">#0</entry>
              </row>
              <row>
                <entry class="bitfield">1</entry>
                <entry class="symbol">#3</entry>
              </row>
            </tbody>
          </tgroup>
        </table>
      </definition>
    </explanation>
  </explanations>
  <ps_section howmany="1">
    <ps name="A64.ldst.ldst_regoff.PRFM_P_ldst_regoff" sections="1" secttype="Operation">
      <pstext mayhavelinks="1" section="Execute" rep_section="execute">var address : bits(64);

let offset : bits(64) = ExtendReg{}(m, extend_type, shift);
let privileged : boolean = <a link="global_PSTATE" file="shared_pseudocode.xml">PSTATE</a>.EL != <a link="global_EL0" file="shared_pseudocode.xml">EL0</a>;
let accdesc : <a link="type_AccessDescriptor" file="shared_pseudocode.xml">AccessDescriptor</a> = <a link="func_CreateAccDescGPR_5" file="shared_pseudocode.xml">CreateAccDescGPR</a>(<a link="enum_MemOp_PREFETCH" file="shared_pseudocode.xml">MemOp_PREFETCH</a>, nontemporal, privileged,
                                                  tagchecked, t);

if n == 31 then
    address = <a link="accessor_SP_1" file="shared_pseudocode.xml">SP</a>{64}();
else
    address = <a link="accessor_X_2" file="shared_pseudocode.xml">X</a>{64}(n);
end;

address = <a link="func_AddressAdd_3" file="shared_pseudocode.xml">AddressAdd</a>(address, offset, accdesc);
let supports_ir : boolean = FALSE;
<a link="func_Prefetch_3" file="shared_pseudocode.xml">Prefetch</a>(address, t[4:0], supports_ir);</pstext></ps>
  </ps_section>
  <timestamp>2026-03-26 20:27:25</timestamp>
  <commit_id>2026-03_rel</commit_id>
</instructionsection>