"ARMv8 AArch64"
include "cos.cat"
include "aarch64fences.cat"
let dsb.full = DSB.ISH | DSB.OSH | DSB.SY
let dsb.ld = DSB.ISHLD | DSB.OSHLD | DSB.LD
let dsb.st = DSB.ISHST | DSB.OSHST | DSB.ST
let dmb.full = DMB.ISH | DMB.OSH | DMB.SY | dsb.full
let dmb.ld = DMB.ISHLD | DMB.OSHLD | DMB.LD | dsb.ld
let dmb.st = DMB.ISHST | DMB.OSHST | DMB.ST | dsb.st
flag ~
empty (dmb.full | dmb.ld | dmb.st) \
(DMB.SY | DMB.LD | DMB.ST | DSB.SY | DSB.LD | DSB.ST)
as Assuming-common-inner-shareable-domain
let intrinsic = (iico_data|iico_ctrl)+
let ca = fr | co
let lrs = [W]; (po-loc \ (po-loc;[W];po-loc)) ; [R]
let lws = po-loc; [W]
let si = sm
show (sm \ id) \ (I * I)
as si
let obs = rfe | fre | coe
let dob = addr | data
| ctrl; [W]
| (ctrl | (addr; po)); [ISB]; po; [R]
| addr; po; [W]
| (addr | data); lrs
let aob = rmw
| [range(rmw)]; lrs; [A | Q]
let bob = po; ([dmb.full]|([A];amo;[L])); po
| [L]; po; [A]
| [R\NoRet]; po; [dmb.ld]; po
| [A | Q]; po
| [W]; po; [dmb.st]; po; [W]
| po; [L]
let tob = [R & T]; intrinsic; [M \ T]
let rec lob = lws; si
| dob
| aob
| bob
| tob
| lob; lob
let rec ob = obs; si
| lob
| ob; ob
acyclic po-loc | ca | rf
as internal
irreflexive ob
as external
empty rmw & (fre; coe)
as atomic