This is a collection of Intel®’ IA32® Software Developer's Manuals (URL of the day) and AMD' AMD64 Architecture Programmer's Manual together with the related specifications, application notes, white papers, and change logs. The collection aims to keep all available revisions. It was originally created by Michal Necasek, see OS/2 Museum.

If you have a public document, related to the IA32® specifications and missing from the collection, please mail it to me. The content of this URL and all sub-ULRs is available for convenient bulk download by rsync x86docs password "" (empty).

LDRSHT -- AArch32

LDRSHT

Load Register Signed Halfword Unprivileged loads a halfword from memory, sign-extends it to form a 32-bit word, and writes it to a register. For information about memory accesses see Memory accesses.

The memory access is restricted as if the PE were running in User mode. This makes no difference if the PE is actually running in User mode.

LDRSHT is UNPREDICTABLE in Hyp mode.

The T32 instruction uses an offset addressing mode, that calculates the address used for the memory access from a base register value and an immediate offset, and leaves the base register unchanged.

The A32 instruction uses a post-indexed addressing mode, that uses a base register value as the address for the memory access, and calculates a new address from a base register value and an offset and writes it back to the base register. The offset can be an immediate value or a register value.

It has encodings from the following instruction sets: A32 ( A1 and A2 ) and T32 ( T1 ) .

A1

313029282726252423222120191817161514131211109876543210
!= 11110000U111RnRtimm4H1111imm4L
condPWo1op2

Encoding

LDRSHT{<c>}{<q>} <Rt>, [<Rn>] {, #{+/-}<imm>}

Decode for this encoding

let t : integer = UInt(Rt); let n : integer = UInt(Rn); let postindex : boolean = TRUE; let add : boolean = (U == '1'); let register_form : boolean = FALSE; let imm32 : bits(32) = ZeroExtend{}(imm4H::imm4L); let m : integer = ARBITRARY : integer; if t == 15 || n == 15 || n == t then UnpredictableProcedure(); end;

CONSTRAINED UNPREDICTABLE behavior

If n == 15, then one of the following behaviors must occur:

If n == t && n != 15, then one of the following behaviors must occur:

A2

313029282726252423222120191817161514131211109876543210
!= 11110000U011RnRt(0)(0)(0)(0)1111Rm
condPWo1op2

Encoding

LDRSHT{<c>}{<q>} <Rt>, [<Rn>], {+/-}<Rm>

Decode for this encoding

let t : integer = UInt(Rt); let n : integer = UInt(Rn); let m : integer = UInt(Rm); let postindex : boolean = TRUE; let add : boolean = (U == '1'); let register_form : boolean = TRUE; let imm32 : bits(32) = ARBITRARY : bits(32); if t == 15 || n == 15 || n == t || m == 15 then UnpredictableProcedure(); end;

CONSTRAINED UNPREDICTABLE behavior

If n == t && n != 15, then one of the following behaviors must occur:

T1

15141312111098765432101514131211109876543210
111110010011!= 1111Rt1110imm8
sizeRn

Encoding

LDRSHT{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}]

Decode for this encoding

if Rn == '1111' then See("LDRSH (literal)"); end; let t : integer = UInt(Rt); let n : integer = UInt(Rn); let postindex : boolean = FALSE; let add : boolean = TRUE; let register_form : boolean = FALSE; let imm32 : bits(32) = ZeroExtend{}(imm8); let m : integer = ARBITRARY : integer; // Armv8-A removes UNPREDICTABLE for R13 if t == 15 then UnpredictableProcedure(); end;

For more information about the CONSTRAINED UNPREDICTABLE behavior of this instruction, see Architectural Constraints on UNPREDICTABLE behaviors.

Assembler Symbols

<c>

See Standard assembler syntax fields.

<q>

See Standard assembler syntax fields.

<Rt>

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

<Rn>

Is the general-purpose base register, encoded in the "Rn" field.

+/-

For the "A1" variant: specifies the offset is added to or subtracted from the base register, defaulting to + if omitted and encoded in U:

U +/-
0 -
1 +

For the "A2" variant: specifies the index register is added to or subtracted from the base register, defaulting to + if omitted and encoded in U:

U +/-
0 -
1 +
<imm>

For the "A1" variant: is the 8-bit unsigned immediate byte offset, in the range 0 to 255, defaulting to 0 if omitted, and encoded in the "imm4H:imm4L" field.

For the "T1" variant: is an optional 8-bit unsigned immediate byte offset, in the range 0 to 255, defaulting to 0 and encoded in the "imm8" field.

<Rm>

Is the general-purpose index register, encoded in the "Rm" field.

+

Specifies the offset is added to the base register.

Operation

if ConditionPassed() then EncodingSpecificOperations(); if PSTATE.EL == EL2 then UnpredictableProcedure(); end; // Hyp mode let offset : bits(32) = if register_form then R(m) else imm32; let offset_addr : bits(32) = if add then (R(n) + offset) else (R(n) - offset); let address : bits(32) = if postindex then R(n) else offset_addr; let data : bits(16) = MemU_unpriv{16}(address); if postindex then R(n) = offset_addr; end; R(t) = SignExtend{32}(data); end;

CONSTRAINED UNPREDICTABLE behavior

If PSTATE.EL == EL2, then one of the following behaviors must occur:

Operational information

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


2025-09_rel_asl1 2026-03-12 12:57:38

Copyright © 2010-2025 Arm Limited or its affiliates. All rights reserved. This document is Non-Confidential.