ldrsh.w

Load Register Signed Halfword (Wide)

LDRSH.W <Rt>, [<Rn>, #<imm>]

Thumb-2 32-bit Load Signed Halfword.

Details

Load a 16-bit signed halfword from memory at address [Rn + imm12] into Rt, sign-extending to 32 bits. The immediate offset is unsigned and ranges from 0 to 4095 bytes; the halfword must be 2-byte aligned. Condition flags (N, Z, C, V) are not affected. T32 (Thumb-2) instruction only.

Pseudocode Operation

address ← Rn + ZeroExtend(imm12, 32);
Rt ← SignExtend([address]<15:0>, 32);

Example

LDRSH.W r3, [r1, #16]

Encoding

Binary Layout
111110011
01
1
Rn
Rt
imm12
 
Format Thumb Load
Opcode 0xF9B00000
Extension T32 (Thumb2)

Operands

  • Rt
    Transfer general-purpose register (load/store)
  • Rn
    First source / base general-purpose register
  • imm
    Signed immediate value

Reference (Arm AArch32 ISA)

Instruction Forms

Encoding Instruction ISA Bit pattern
0x015000F0 LDRSH{<c>}{<q>} <Rt>, [<Rn> {, #{+/-}<imm>}] A32 cond | 000 | 1 | U | 1 | 0 | 1 | Rn | Rt | imm4H | 1 | 11 | 1 | imm4L
0x005000F0 LDRSH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm> A32 cond | 000 | 0 | U | 1 | 0 | 1 | Rn | Rt | imm4H | 1 | 11 | 1 | imm4L
0x017000F0 LDRSH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<imm>]! A32 cond | 000 | 1 | U | 1 | 1 | 1 | Rn | Rt | imm4H | 1 | 11 | 1 | imm4L
0xF9B00000 LDRSH{<c>}{<q>} <Rt>, [<Rn> {, #{+}<imm>}] T32 111110011 | 01 | 1 | Rn | Rt | imm12
0xF9300C00 LDRSH{<c>}{<q>} <Rt>, [<Rn> {, #-<imm>}] T32 111110010 | 01 | 1 | Rn | Rt | 1 | 1 | 0 | 0 | imm8
0xF9300900 LDRSH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm> T32 111110010 | 01 | 1 | Rn | Rt | 1 | 0 | U | 1 | imm8
0xF9300D00 LDRSH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<imm>]! T32 111110010 | 01 | 1 | Rn | Rt | 1 | 1 | U | 1 | imm8
0x005F00F0 LDRSH{<c>}{<q>} <Rt>, <label> A32 cond | 000 | P | U | 1 | W | 1 | 1111 | Rt | imm4H | 1 | 11 | 1 | imm4L
0xF93F0000 LDRSH{<c>}{<q>} <Rt>, <label> T32 11111001 | U | 01 | 11111 | Rt | imm12
0x011000F0 LDRSH{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>] A32 cond | 000 | 1 | U | 0 | 0 | 1 | Rn | Rt | 0 | 0 | 0 | 0 | 1 | 11 | 1 | Rm
0x001000F0 LDRSH{<c>}{<q>} <Rt>, [<Rn>], {+/-}<Rm> A32 cond | 000 | 0 | U | 0 | 0 | 1 | Rn | Rt | 0 | 0 | 0 | 0 | 1 | 11 | 1 | Rm
0x013000F0 LDRSH{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>]! A32 cond | 000 | 1 | U | 0 | 1 | 1 | Rn | Rt | 0 | 0 | 0 | 0 | 1 | 11 | 1 | Rm
0x5E00 LDRSH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>] T32 0101 | 1 | 1 | 1 | Rm | Rn | Rt
0xF9300000 LDRSH{<c>}.W <Rt>, [<Rn>, {+}<Rm>] T32 111110010 | 01 | 1 | Rn | Rt | 000000 | imm2 | Rm

Description

Load Register Signed Halfword (immediate) calculates an address from a base register value and an immediate offset, loads a halfword from memory, sign-extends it to form a 32-bit word, and writes it to a register. It can use offset, post-indexed, or pre-indexed addressing. For information about memory accesses see Memory accesses.

Operation

if ConditionPassed() then
    EncodingSpecificOperations();
    offset_addr = if add then (R[n] + imm32) else (R[n] - imm32);
    address = if index then offset_addr else R[n];
    data = MemU[address,2];
    if wback then R[n] = offset_addr;
    R[t] = SignExtend(data, 32);