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

LDSETP, LDSETPA, LDSETPAL, LDSETPL -- A64

LDSETP, LDSETPA, LDSETPAL, LDSETPL

Atomic bit set on quadword

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 stores the result back to memory. The value initially loaded from memory is returned in the same pair of registers.

Integer
(FEAT_LSE128)

313029282726252423222120191817161514131211109876543210
00011001AR1Rt2001100RnRt
So3opc

Encoding for the LDSETP variant

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

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

Encoding for the LDSETPA variant

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

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

Encoding for the LDSETPAL variant

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

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

Encoding for the LDSETPL variant

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

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

Decode for all variants of this encoding

if !IsFeatureImplemented(FEAT_LSE128) 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 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 128-bit Atomic Memory Operations.

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

var address : bits(64); let value1 : bits(64) = X{}(t); let value2 : bits(64) = X{}(t2); var data : bits(128); var store_value : bits(128); let privileged : boolean = PSTATE.EL != EL0; let accdesc : AccessDescriptor = CreateAccDescAtomicOp(MemAtomicOp_ORR, acquire, release, tagchecked, privileged, t, t2, t, t2); if n == 31 then CheckSPAlignment(); address = SP{64}(); else address = X{64}(n); end; store_value = if BigEndian(accdesc.acctype) then value1::value2 else value2::value1; let comparevalue : bits(128) = ARBITRARY : bits(128); // Irrelevant when not executing CAS data = MemAtomic{128}(address, comparevalue, store_value, accdesc); if rt_unknown then data = ARBITRARY : bits(128); end; if BigEndian(accdesc.acctype) then X{64}(t) = data[127:64]; X{64}(t2) = data[63:0]; else X{64}(t) = data[63:0]; X{64}(t2) = data[127:64]; end;

Operational information

This instruction is a data-independent-time instruction as described in About PSTATE.DIT.


2026-03_rel 2026-03-26 20:48:11

Copyright © 2010-2026 Arm Limited or its affiliates. All rights reserved. This document is Non-Confidential.