Prefetch memory (register)
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.
The <prfop> operand specifies the prefetch hint as follows:
The effect of a PRFM instruction is IMPLEMENTATION DEFINED. For more information, see Prefetch memory.
For information about addressing modes, see Load/Store addressing modes.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | Rm | x | 1 | x | S | 1 | 0 | Rn | != 11xxx | ||||||||||||
| size | VR | opc | option | Rt | |||||||||||||||||||||||||||
if option[1] == '0' then EndOfDecode(Decode_UNDEF); end; // sub-word index let extend_type : ExtendType = DecodeRegExtend(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;
| <imm5> |
Is the prefetch operation encoding as an immediate, in the range 0 to 31, encoded in the "Rt" field. This syntax is only for encodings that are not accessible using <prfop>. |
| <Xn|SP> |
Is the 64-bit name of the general-purpose base register or stack pointer, encoded in the "Rn" field. |
| <Wm> |
When option<0> is set to 0, is the 32-bit name of the general-purpose index register, encoded in the "Rm" field. |
| <Xm> |
When option<0> is set to 1, is the 64-bit name of the general-purpose index register, encoded in the "Rm" field. |
| <extend> |
Is the index extend/shift specifier, defaulting to LSL, and which must be omitted for the LSL option when <amount> is omitted,
encoded in
|
| <amount> |
Is the index shift amount, optional only when <extend> is not LSL. Where it is permitted to be optional, it defaults to #0. It is
encoded in
|
var address : bits(64); let offset : bits(64) = ExtendReg{}(m, extend_type, shift); let privileged : boolean = PSTATE.EL != EL0; let accdesc : AccessDescriptor = CreateAccDescGPR(MemOp_PREFETCH, nontemporal, privileged, tagchecked, t); if n == 31 then address = SP{64}(); else address = X{64}(n); end; address = AddressAdd(address, offset, accdesc); let supports_ir : boolean = FALSE; Prefetch(address, t[4:0], supports_ir);
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.