AArch64
"ARMv8 AArch64"
catdep
include "cos.cat"
include "aarch64fences.cat"
include "aarch64deps.cat"
include "aarch64show.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 obs = rfe | fre | coe
let rmw = lxsx | amo
let dob = addr | data
| ctrl; [W]
| (ctrl | (addr; po)); [ISB]; po; [M]
| addr; po; [W]
| (addr | data); lrs
show ctrl;[M]
as ctrl
let pob = pick-dep; [W]
| (pick-ctrl-dep | pick-addr-dep; po); [ISB]; po; [M]
| pick-addr-dep; [M]; po; [W]
let aob = rmw
| rmw; lrs; [A | Q]
let bob = po; [dmb.full]; po
| [range([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]; iico_data; [PoD]; iico_ctrl; [M \ T]
let rec lob = lws; si
| dob
| pob
| aob
| bob
| tob
| lob; lob
let pick-lob = pick-basic-dep; lob; [W]
let rec ob = obs; si
| lob
| pick-lob
| ob; ob
let tlo = [R & T]; tob; loc; tob^-1; [R & T]
let po-loc =
let Exp = M\domain(tob)
in
(po-loc & Exp*Exp) | (po & tlo)
acyclic po-loc | ca | rf
as internal
irreflexive ob
as external
empty rmw & (fre; coe)
as atomic