…
AArch64 Z6.5+poxxs
"PodWWXX WseXX PodWWXX WseXX PodWRXX FreXX"
Cycle=FreXX PodWWXX WseXX PodWWXX WseXX PodWRXX
Relax=
Safe=PodWW PodWR FreXX WseXX
Prefetch=0:x=F,0:y=W,1:y=F,1:z=W,2:z=F,2:x=T
Com=Ws Ws Fr
Orig=PodWWXX WseXX PodWWXX WseXX PodWRXX FreXX
{ ok=1;
0:X0=x; 0:X4=y; 0:X8=ok;
1:X0=y; 1:X4=z; 1:X8=ok;
2:X0=z; 2:X4=x; 2:X7=ok;
}
P0 | P1 | P2 ;
MOV W1,#1 | MOV W1,#2 | MOV W1,#2 ;
LDXR W2,[X0] | LDXR W2,[X0] | LDXR W2,[X0] ;
STXR W3,W1,[X0] | STXR W3,W1,[X0] | STXR W3,W1,[X0] ;
CBNZ W3,Fail0 | CBNZ W3,Fail1 | CBNZ W3,Fail2 ;
MOV W5,#1 | MOV W5,#1 | LDXR W5,[X4] ;
LDXR W6,[X4] | LDXR W6,[X4] | STXR W3,W5,[X4] ;
STXR W3,W5,[X4] | STXR W3,W5,[X4] | CBNZ W3,Fail2 ;
CBNZ W3,Fail0 | CBNZ W3,Fail1 | B Exit2 ;
B Exit0 | B Exit1 | Fail2: ;
Fail0: | Fail1: | MOV W6,#0 ;
MOV W7,#0 | MOV W7,#0 | STR W6,[X7] ;
STR W7,[X8] | STR W7,[X8] | Exit2: ;
Exit0: | Exit1: | ;
Observed
z=2; y=2; x=1; ok=1; 2:X5=0; 2:X2=1; 1:X6=0; 1:X2=1; 0:X6=0; 0:X2=0;
and z=2; y=2; x=1; ok=0; 2:X5=0; 2:X2=1; 1:X6=0; 1:X2=1; 0:X6=0; 0:X2=0;
and z=2; y=2; x=1; ok=0; 2:X5=0; 2:X2=0; 1:X6=0; 1:X2=1; 0:X6=0; 0:X2=0;
and z=2; y=2; x=1; ok=0; 2:X5=0; 2:X2=1; 1:X6=0; 1:X2=0; 0:X6=0; 0:X2=0;
and z=2; y=2; x=1; ok=0; 2:X5=0; 2:X2=0; 1:X6=0; 1:X2=0; 0:X6=0; 0:X2=0;