LDR (immediate)

Load register (immediate)

This instruction loads a word or doubleword from memory and writes it to a register. The address that is used for the load is calculated from a base register and an immediate offset. For information about addressing modes, see Load/Store addressing modes. The Unsigned offset variant scales the immediate offset value by the size of the value accessed before adding it to the base register value.

It has encodings from 3 classes: Post-index , Pre-index and Unsigned offset

Post-index

313029282726252423222120191817161514131211109876543210
1x111000010imm901RnRt
sizeVRopc

Encoding for the 32-bit variant

Applies when (size == 10)

LDR <Wt>, [<Xn|SP>], #<simm>

Encoding for the 64-bit variant

Applies when (size == 11)

LDR <Xt>, [<Xn|SP>], #<simm>

Decode for all variants of this encoding

var wback : boolean = TRUE; let postindex : boolean = TRUE; let scale : integer{} = UInt(size); let offset : bits(64) = SignExtend{}(imm9);

Pre-index

313029282726252423222120191817161514131211109876543210
1x111000010imm911RnRt
sizeVRopc

Encoding for the 32-bit variant

Applies when (size == 10)

LDR <Wt>, [<Xn|SP>, #<simm>]!

Encoding for the 64-bit variant

Applies when (size == 11)

LDR <Xt>, [<Xn|SP>, #<simm>]!

Decode for all variants of this encoding

var wback : boolean = TRUE; let postindex : boolean = FALSE; let scale : integer{} = UInt(size); let offset : bits(64) = SignExtend{}(imm9);

Unsigned offset

313029282726252423222120191817161514131211109876543210
1x11100101imm12RnRt
sizeVRopc

Encoding for the 32-bit variant

Applies when (size == 10)

LDR <Wt>, [<Xn|SP>{, #<pimm>}]

Encoding for the 64-bit variant

Applies when (size == 11)

LDR <Xt>, [<Xn|SP>{, #<pimm>}]

Decode for all variants of this encoding

var wback : boolean = FALSE; let postindex : boolean = FALSE; let scale : integer{} = UInt(size); let offset : bits(64) = LSL(ZeroExtend{64}(imm12), scale);

For information about the CONSTRAINED UNPREDICTABLE behavior of this instruction, see Architectural Constraints on UNPREDICTABLE behaviors, and particularly LDR (immediate).

Assembler Symbols

<Wt>

Is the 32-bit name of the general-purpose register to be transferred, encoded in the "Rt" field.

<Xn|SP>

Is the 64-bit name of the general-purpose base register or stack pointer, encoded in the "Rn" field.

<simm>

Is the signed immediate byte offset, in the range -256 to 255, encoded in the "imm9" field.

<Xt>

Is the 64-bit name of the general-purpose register to be transferred, encoded in the "Rt" field.

<pimm>

For the "32-bit" variant: is the optional positive immediate byte offset, a multiple of 4 in the range 0 to 16380, defaulting to 0 and encoded in the "imm12" field as <pimm>/4.

For the "64-bit" variant: is the optional positive immediate byte offset, a multiple of 8 in the range 0 to 32760, defaulting to 0 and encoded in the "imm12" field as <pimm>/8.

Shared Decode

let t : integer{} = UInt(Rt); let n : integer{} = UInt(Rn); let datasize : integer{} = 8 << scale; let regsize : integer{} = if datasize == 64 then 64 else 32; let nontemporal : boolean = FALSE; let tagchecked : boolean = wback || n != 31; var c : Constraint; var wb_unknown : boolean = FALSE; if wback && n == t && n != 31 then c = ConstrainUnpredictable(Unpredictable_WBOVERLAPLD); assert c IN {Constraint_WBSUPPRESS, Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; case c of when Constraint_WBSUPPRESS => wback = FALSE; // Writeback is suppressed when Constraint_UNKNOWN => wb_unknown = TRUE; // Writeback is UNKNOWN when Constraint_UNDEF => EndOfDecode(Decode_UNDEF); when Constraint_NOP => EndOfDecode(Decode_NOP); end; end;

Operation

var address : bits(64); let privileged : boolean = PSTATE.EL != EL0; let accdesc : AccessDescriptor = CreateAccDescGPR(MemOp_LOAD, nontemporal, privileged, tagchecked, t); if n == 31 then CheckSPAlignment(); address = SP{64}(); else address = X{64}(n); end; if !postindex then address = AddressAdd(address, offset, accdesc); end; let data : bits(datasize) = Mem{datasize}(address, accdesc); X{regsize}(t) = ZeroExtend{regsize}(data); if wback then if wb_unknown then address = ARBITRARY : bits(64); elsif postindex then address = AddressAdd(address, offset, accdesc); end; if n == 31 then SP{64}() = address; else X{64}(n) = address; end; end;

Operational information

This instruction is a data-independent-time instruction as described in About PSTATE.DIT.


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.