Does AMOSWAP.H zero-extend rd?
No. Zabha AMO.H sign-extends the old value into rd; the U in AMOMINU.H/AMOMAXU.H only means unsigned comparison.
AMOSWAP.H atomically reads the old halfword, sign-extends it into rd, and writes the low 16 bits of rs2 to the target halfword.
Syntax is rd, rs2, (rs1). The three fields select x0–x31 or ABI names, with no offset immediate or rs3.
32-bit encoding: funct5=00001, funct3=001, opcode=0101111; aq is bit26 and rl is bit25.
RV32/RV64 Zabha (requires Zaamo): rd receives sign-extended old 16-bit memory; memory receives the low 16 rs2 bits.
The region must support this AMO width and operation. Use two-byte alignment, or a PMA with all accessed bytes in one misaligned atomicity granule; otherwise address-misaligned or access-fault is raised.
Sources use pre-execution values; rd=x0 discards only register writeback and memory still undergoes read-modify-write. aq/rl orders only the accessed memory/I/O domain; suffixes are .aq, .rl and .aqrl.
AMOSWAP.H is a Zabha (and therefore Zaamo) halfword AMO. It atomically reads the old 16-bit value at rs1, sign-extends it into rd, then writes rs2[15:0] there; aq/rl annotate memory ordering.
Shows Zabha (requires Zaamo) halfword atomic field decode, aq/rl ordering bits, a memory read, and RMW state update.
Zabha depends on Zaamo; Zabha-extension halfword atomic instructions use a 32-bit encoding; the animation starts by splitting the fields.
Assumes Zabha and Zaamo at the selected XLEN, successful fetch, a region supporting this width and operation, and a successful access. A misaligned halfword requires the stated PMA condition. Sources use pre-execution values; aq/rl orders only the accessed domain. Steps are a teaching sequence.
AMOSWAP.H is a Zabha halfword AMO: it atomically reads the old 16-bit memory value, sign-extends that old value into rd, and writes the low 16 bits of rs2 to the target halfword.
RV32/RV64 Zabha+Zaamo, a1=0x1000, old memory=5 and a2=3; assuming a supporting region and successful access, a0 receives old value 5 and the 16-bit memory operand becomes 3.
No. Zabha AMO.H sign-extends the old value into rd; the U in AMOMINU.H/AMOMAXU.H only means unsigned comparison.
Architecturally it modifies only the target 16-bit halfword and computes the new memory value at halfword width; neighboring bytes are not part of that data result.