lhu - 2024.2 English

MicroBlaze Processor Reference Guide (UG984)

Document ID
UG984
Release Date
2024-11-27
Version
2024.2 English
Figure 1. lhu

Description

Loads a halfword (16 bits) from the halfword aligned memory location that results from adding the contents of registers rAX and rBX. The data is placed in the least significant halfword of register rDX and the other halfwords in rDX is cleared.

If the R bit is set, a halfword reversed memory location is used and the two bytes in the halfword are reversed, loading data with the opposite endianness of the endianness defined by the E bit (if virtual protected mode is enabled).

If the EA bit is set, an extended address is used, formed by concatenating rA and rB instead of adding them.

A data TLB miss exception occurs if virtual protected mode is enabled, and a valid translation entry corresponding to the address is not found in the TLB.

A data storage exception occurs if access is prevented by a no-access-allowed zone protection. This only applies to accesses with user mode and virtual protected mode enabled.

An unaligned data access exception occurs if the least significant bit in the address is not zero.

A privileged instruction error occurs if the EA bit is set, Physical Address Extension (PAE) is enabled, and the instruction is not explicitly allowed.

Pseudocode

if EA = 1 then
   Addr ← (rA) & (rB)
else
   Addr ← (rAx) + (rBx)
if TLB_Miss(Addr) and MSR[VM] = 1 then
   ESR[EC] ← 10010; ESR[S] ← 0
   MSR[UMS] ← MSR[UM]; MSR[VMS] ← MSR[VM]; MSR[UM] ← 0; MSR[VM] ← 0
else if Access_Protected(Addr) and MSR[UM] = 1 and MSR[VM] = 1 then
   ESR[EC] ← 10000; ESR[S] ← 0 ; ESR[DIZ] ← 1
   MSR[UMS] ← MSR[UM]; MSR[VMS] ← MSR[VM]; MSR[UM] ← 0; MSR[VM] ← 0
else if Addr[31] ≠ 0 then
   ESR[EC] ← 00001; ESR[W] ← 0; ESR[S] ← 0; ESR[Rx] ← rD
else if (VM = 0 and R = 1) or
             (VM = 1 and R = 1 and E = 1) or
             (VM = 1 and R = 0 and E = 0) then
   (rDx)[C_DATA_SIZE-16:C_DATA_SIZE-9] ← Mem(Addr);
   (rDx)[C_DATA_SIZE-8:C_DATA_SIZE-1] ← Mem(Addr+1);
   (rDx)[0:C_DATA_SIZE-17] ← 0
else
   (rDx)[C_DATA_SIZE-16:C_DATA_SIZE-9] ← Mem(Addr+1);
   (rDx)[C_DATA_SIZE-8:C_DATA_SIZE-1] ← Mem(Addr);
   (rDx)[0:C_DATA_SIZE-17] ← 0

Registers Altered

  • rDX, unless an exception is generated, in which case the register is unchanged
  • MSR[UM], MSR[VM], MSR[UMS], MSR[VMS], if an exception is generated
  • ESR[EC], ESR[S], if an exception is generated
  • ESR[DIZ], if a data storage exception is generated
  • ESR[W], ESR[Rx], if an unaligned data access exception is generated

Latency

  • 1 cycle with C_AREA_OPTIMIZED=0 or 2
  • 2 cycles with C_AREA_OPTIMIZED=1

Notes

  • The halfword reversed instruction is only valid if MicroBlaze is configured to use reorder instructions (C_USE_REORDER_INSTR = 1).
  • The extended address instruction is only valid if MicroBlaze is configured to use extended address (C_ADDR_SIZE > 32) and is using 32-bit mode (C_DATA_SIZE = 32).