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

RCWSETP, RCWSETPA, RCWSETPAL, RCWSETPL -- A64

RCWSETP, RCWSETPA, RCWSETPAL, RCWSETPL

Read check write atomic bit set on quadword in memory

This instruction atomically loads a 128-bit quadword from memory, performs a bitwise OR with the value held in a pair of registers on it, and conditionally stores the result back to memory. Storing of the result back to memory is conditional on RCW 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
00011001AR1Rt2101100RnRt
So3opc

Encoding for the RCWSETP variant

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

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

Encoding for the RCWSETPA variant

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

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

Encoding for the RCWSETPAL variant

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

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

Encoding for the RCWSETPL variant

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

RCWSETPL <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 = FALSE; 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_ORR, 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.