ISA_v82A_A64_xml_00bet3.1 (old) | htmldiff from-ISA_v82A_A64_xml_00bet3.1 | (new) ISA_v82A_A64_xml_00bet3.1_OPT |
Atomic exclusive OR on byte in memory, without return, atomically loads an 8-bit byte from memory, performs an exclusive OR with the value held in a register on it, and stores the result back to memory.
For information about memory accesses see Load/Store addressing modes.
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | R | 1 | Rs | 0 | 0 | 1 | 0 | 0 | 0 | Rn | 1 | 1 | 1 | 1 | 1 | ||||||||
size | V | A | o3 | opc |
if !HaveAtomicExt() then UnallocatedEncoding();
integer n = UInt(Rn);
integer s = UInt(Rs);(Rs);
integer datasize = 8 <<
UInt(size);
integer regsize = if datasize == 64 then 64 else 32;
AccType stacctype = if R == '1' thenldacctype = AccType_ATOMICRW;
AccType stacctype = if R == '1' then AccType_ORDEREDRW else AccType_ATOMICRW;
MemAtomicOp op;
case o3:opc of
when '0000' op = MemAtomicOp_ADD;
when '0001' op = MemAtomicOp_BIC;
when '0010' op = MemAtomicOp_EOR;
when '0011' op = MemAtomicOp_ORR;
when '0100' op = MemAtomicOp_SMAX;
when '0101' op = MemAtomicOp_SMIN;
when '0110' op = MemAtomicOp_UMAX;
when '0111' op = MemAtomicOp_UMIN;
when '1000' op = MemAtomicOp_SWP;
otherwise UnallocatedEncoding;();
<Ws> | Is the 32-bit name of the general-purpose register holding the data value to be operated on with the contents of the memory location, encoded in the "Rs" field. |
<Xn|SP> | Is the 64-bit name of the general-purpose base register or stack pointer, encoded in the "Rn" field. |
bits(64) address;
bits(8) value;
bits(8) data;
bits(8) result;
bits(datasize) value;
bits(datasize) data;
bits(datasize) result;
value = X[s];
if n == 31 then
CheckSPAlignment();
address = SP[];
else
address = X[n];
data = Mem[address, 1,[address, datasize DIV 8, ldacctype];
case op of
when result = data + value;
when MemAtomicOp_BIC result = data AND NOT(value);
when MemAtomicOp_EOR result = data EOR value;
when MemAtomicOp_ORR result = data OR value;
when MemAtomicOp_SMAX result = if SInt(data) > SInt(value) then data else value;
when MemAtomicOp_SMIN result = if SInt(data) > SInt(value) then value else data;
when MemAtomicOp_UMAX result = if UInt(data) > UInt(value) then data else value;
when MemAtomicOp_UMIN result = if UInt(data) > UInt(value) then value else data;
when MemAtomicOp_SWPAccType_ATOMICRWMemAtomicOp_ADD];
result = value;
result = data EOR value;
// All observers in the shareability domain observe the
// following load and store atomically.
Mem[address, 1, stacctype] = result;[address, datasize DIV 8, stacctype] = result;
Internal version only: isa v25.07, AdvSIMD v23.0, pseudocode v31.3
Copyright © 2010-2017 ARM Limited or its affiliates. All rights reserved. This document is Confidential.
ISA_v82A_A64_xml_00bet3.1 (old) | htmldiff from-ISA_v82A_A64_xml_00bet3.1 | (new) ISA_v82A_A64_xml_00bet3.1_OPT |