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).

RCWSSWPP, RCWSSWPPA, RCWSSWPPAL, RCWSSWPPL -- A64

RCWSSWPP, RCWSSWPPA, RCWSSWPPAL, RCWSSWPPL

Read check write software swap quadword in memory

This instruction atomically loads a 128-bit quadword from a memory location, and conditionally stores the value held in a pair of registers back to the same memory location. Storing back to memory is conditional on RCW Checks and RCWS Checks. The value initially loaded from memory is returned in the same pair of registers. This instruction updates the condition flags based on the result of the update of memory.


Note

This instruction is for performing atomic updates of translation table entries and not for general use.


Integer
(FEAT_D128 && FEAT_THE)

313029282726252423222120191817161514131211109876543210
01011001AR1Rt2101000RnRt
So3opc

Encoding for the RCWSSWPP variant

Applies when (A == 0 && R == 0)

RCWSSWPP <Xt1>, <Xt2>, [<Xn|SP>]

Encoding for the RCWSSWPPA variant

Applies when (A == 1 && R == 0)

RCWSSWPPA <Xt1>, <Xt2>, [<Xn|SP>]

Encoding for the RCWSSWPPAL variant

Applies when (A == 1 && R == 1)

RCWSSWPPAL <Xt1>, <Xt2>, [<Xn|SP>]

Encoding for the RCWSSWPPL variant

Applies when (A == 0 && R == 1)

RCWSSWPPL <Xt1>, <Xt2>, [<Xn|SP>]

Decode for all variants of this encoding

if !IsFeatureImplemented(FEAT_D128) || !IsFeatureImplemented(FEAT_THE) then EndOfDecode(Decode_UNDEF); end; if Rt == '11111' then EndOfDecode(Decode_UNDEF); end; if Rt2 == '11111' then EndOfDecode(Decode_UNDEF); end; let t : integer{} = UInt(Rt); let t2 : integer{} = UInt(Rt2); let n : integer{} = UInt(Rn); let soft : boolean = TRUE; let acquire : boolean = A == '1'; let release : boolean = R == '1'; let tagchecked : boolean = n != 31; var rt_unknown : boolean = FALSE; if t == t2 then let c : Constraint = ConstrainUnpredictable(Unpredictable_LSE128OVERLAP); assert c IN {Constraint_UNKNOWN, Constraint_UNDEF, Constraint_NOP}; case c of when Constraint_UNKNOWN => rt_unknown = TRUE; // result is UNKNOWN when Constraint_UNDEF => EndOfDecode(Decode_UNDEF); when Constraint_NOP => EndOfDecode(Decode_NOP); end; end;

For information about the CONSTRAINED UNPREDICTABLE behavior of this instruction, see Architectural Constraints on UNPREDICTABLE behaviors, and particularly CONSTRAINED UNPREDICTABLE behavior for A64 instructions.

Assembler Symbols

<Xt1>

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

<Xt2>

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

<Xn|SP>

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

Operation

if !IsD128Enabled(PSTATE.EL) then Undefined(); end; var address : bits(64); var value1 : bits(64); var value2 : bits(64); var newdata : bits(128); var readdata : bits(128); var nzcv : bits(4); let accdesc : AccessDescriptor = CreateAccDescRCW(MemAtomicOp_SWP, soft, acquire, release, tagchecked, t, t2, t, t2); if n == 31 then CheckSPAlignment(); address = SP{64}(); else address = X{64}(n); end; value1 = X{64}(t); value2 = X{64}(t2); newdata = if BigEndian(accdesc.acctype) then value1::value2 else value2::value1; let compdata : bits(128) = ARBITRARY : bits(128); // Irrelevant when not executing CAS (nzcv, readdata) = MemAtomicRCW{128}(address, compdata, newdata, accdesc); PSTATE.[N,Z,C,V] = nzcv; if rt_unknown then readdata = ARBITRARY : bits(128); end; if BigEndian(accdesc.acctype) then X{64}(t) = readdata[127:64]; X{64}(t2) = readdata[63:0]; else X{64}(t) = readdata[63:0]; X{64}(t2) = readdata[127:64]; end;


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.