|
71 | 71 |
|
72 | 72 | #let lwfs = [Exp & M | Imp & Tag & R]; (po & same-loc); [Exp & W] |
73 | 73 | -safe Pos*W |
| 74 | +-safe [Pos*R Amo.Swp] [Pos*R Amo.Cas] [Pos*R Amo.StAdd] [Pos*R Amo.LdAdd] [Pos*R LxSx] |
74 | 75 |
|
75 | 76 | ### Data and address dependance |
76 | 77 | # let data = [Exp & R]; (basic-dep; [DATA]; iico_data+; [Exp & W]) & ~same-instance |
|
90 | 91 | -safe [DpCtrldW ExpObs] |
91 | 92 | # `DpCtrlsW` is stronger than `Pos*W`. |
92 | 93 | #-safe DpCtrlsW |
| 94 | +-safe [DpCtrldR Amo.Cas] [DpCtrldR Amo.Swp] [DpCtrldR Amo.StAdd] [DpCtrldR Amo.LdAdd] [DpCtrldR LxSx] |
| 95 | +#`[DpCtrlsR rmw]` is stronger than `Pos*W`. |
| 96 | +#-safe [DpCtrlsR Amo.Cas] [DpCtrlsR Amo.Swp] [DpCtrlsR LxSx] |
93 | 97 |
|
94 | 98 | # let dob = addr; [Exp & M]; po; [Exp & W | HU] |
95 | 99 | -safe [DpAddr Pod*W] [DpAddrd* Pos*W] |
96 | 100 | # `[DpAddrs* Pos*W]` are stronger than `Pos*W` as the former are a read followed by a write to the same location. |
97 | 101 | #-safe [DpAddrs* Pos*W] |
| 102 | +-safe [DpAddr*R Amo.Swp PodWW] |
| 103 | +-safe [DpAddr*R Amo.Cas PodWW] |
| 104 | +-safe [DpAddr*R Amo.StAdd PodWW] |
| 105 | +-safe [DpAddr*R Amo.LdAdd PodWW] |
| 106 | +-safe [DpAddr*R LxSx PodWW] |
| 107 | +# `[DpAddrdR rmw PosWW]` can be combined by `diy` as `[DpAddrdR rmw]` and `PosWW` |
| 108 | +-safe [DpAddrd* Po**R Amo.Swp] [DpAddrs* Pod*R Amo.Swp] |
| 109 | +-safe [DpAddrd* Po**R Amo.Cas] [DpAddrs* Pod*R Amo.Cas] |
| 110 | +-safe [DpAddrd* Po**R Amo.StAdd] [DpAddrs* Pod*R Amo.StAdd] |
| 111 | +-safe [DpAddrd* Po**R Amo.LdAdd] [DpAddrs* Pod*R Amo.LdAdd] |
| 112 | +-safe [DpAddrd* Po**R LxSx] [DpAddrs* Pod*R LxSx] |
| 113 | +# `[DpAddrs* Pos*R rmw]` is stronger than `Pos*W`. |
98 | 114 |
|
99 | 115 | # let dob = addr; [Exp & M]; lmrs; [Exp & R | Imp & Tag & R] |
100 | 116 | # let lmrs = [W]; ((po & same-loc) & ~(intervening(W,(po & same-loc)))); [R] |
101 | 117 | -safe [DpAddr*W PosWR] |
| 118 | +-safe [DpAddrdR Amo.Swp PosWR] [DpAddrsR Amo.Swp PosWR] |
| 119 | +-safe [DpAddrdR Amo.Cas PosWR] [DpAddrsR Amo.Cas PosWR] |
| 120 | +-safe [DpAddrdR Amo.StAdd PosWR] [DpAddrsR Amo.StAdd PosWR] |
| 121 | +-safe [DpAddrdR Amo.LdAdd PosWR] [DpAddrsR Amo.LdAdd PosWR] |
| 122 | +-safe [DpAddrdR LxSx PosWR] [DpAddrsR LxSx PosWR] |
102 | 123 |
|
103 | 124 | # let dob = data; [Exp & M]; lmrs; [Exp & R | Imp & Tag & R] |
104 | 125 | # let lmrs = [W]; ((po & same-loc) & ~(intervening(W,(po & same-loc)))); [R] |
|
125 | 146 | #-safe [DpAddr** ISB**W] |
126 | 147 | # `[DpAddrdW ISBsWR]` is stronger than `[DpAddrdW PosWR]`. |
127 | 148 | #-safe [DpAddrdW ISBsWR] |
| 149 | +-safe [DpAddr*R Amo.Swp ISBdWR ExpObs] |
| 150 | +-safe [DpAddr*R Amo.Cas ISBdWR ExpObs] |
| 151 | +-safe [DpAddr*R Amo.StAdd ISBdWR ExpObs] |
| 152 | +-safe [DpAddr*R Amo.LdAdd ISBdWR ExpObs] |
| 153 | +-safe [DpAddr*R LxSx ISBdWR ExpObs] |
| 154 | +# `[DpAddr*R rmw ISBsWR]` is stronger than `[DpAddr*R rmw PosWR]` |
| 155 | +#-safe [DpAddrdR Amo.Swp ISBsWR] [DpAddrsR Amo.Swp ISBsWR] |
| 156 | +#-safe [DpAddrdR Amo.Cas ISBsWR] [DpAddrsR Amo.Cas ISBsWR] |
| 157 | +#-safe [DpAddrdR LxSx ISBsWR] [DpAddrsR LxSx ISBsWR] |
128 | 158 |
|
129 | 159 | # let IFB-ob = [Exp & R]; pick-addr-dep; [Exp & M]; po; [IFB]; po |
130 | 160 | -safe [DpAddrCsel ISB**R ExpObs] |
131 | 161 | # `[DpAddrCsels* ISBs*W]` are stronger than `Pos*W` as the former are a read followed by a write to the same location. |
132 | 162 | #-safe [DpAddrCsels* ISBs*W] |
133 | 163 | # `[DpAddrCsel** ISB**W]` is stronger than `[DpAddr** Po**W]` |
134 | 164 | #-safe [DpAddrCsel** ISB**W] |
| 165 | +-safe [DpAddrCsel*R Amo.Swp ISB*WR ExpObs] |
| 166 | +-safe [DpAddrCsel*R Amo.Cas ISB*WR ExpObs] |
| 167 | +-safe [DpAddrCsel*R Amo.StAdd ISB*WR ExpObs] |
| 168 | +-safe [DpAddrCsel*R Amo.LdAdd ISB*WR ExpObs] |
| 169 | +-safe [DpAddrCsel*R LxSx ISB*WR ExpObs] |
135 | 170 |
|
136 | 171 | # let pob = pick-addr-dep; [Exp & W | HU | TLBI | DC.CVAU | IC] |
137 | 172 | -safe DpAddrCseldW |
138 | 173 | # `DpAddrCselsW` is stronger than `Pos*W`. |
139 | 174 | #-safe DpAddrCselsW |
| 175 | +-safe [DpAddrCseldR Amo.Swp] [DpAddrCseldR Amo.Cas] [DpAddrCseldR Amo.StAdd] [DpAddrCseldR Amo.LdAdd] [DpAddrCseldR LxSx] |
140 | 176 |
|
141 | 177 | # let pob = pick-data-dep |
142 | 178 | -safe DpDataCseldW |
|
147 | 183 | -safe DpCtrlCseldW |
148 | 184 | # `DpCtrlCselsW` is stronger than `Pos*W`. |
149 | 185 | #-safe DpCtrlCselsW |
| 186 | +-safe [DpCtrlCseldR Amo.Swp] [DpCtrlCseldR Amo.Cas] [DpCtrlCseldR Amo.StAdd] [DpCtrlCseldR Amo.LdAdd] [DpCtrlCseldR LxSx] |
150 | 187 |
|
151 | 188 | # let pob = pick-addr-dep; [Exp & M]; po; [Exp & W | HU] |
152 | 189 | -safe [DpAddrCsel Pod*W] [DpAddrCseld* Pos*W] |
153 | 190 | # `[DpAddrCsels* Pos*W]` are stronger than `Pos*W` as the former are a read followed by a write to the same location. |
154 | 191 | #-safe [DpAddrCsels* Pos*W] |
| 192 | +-safe [DpAddrCsel*R Amo.Swp Po*WW] |
| 193 | +-safe [DpAddrCsel*R Amo.Cas Po*WW] |
| 194 | +-safe [DpAddrCsel*R Amo.StAdd Po*WW] |
| 195 | +-safe [DpAddrCsel*R Amo.LdAdd Po*WW] |
| 196 | +-safe [DpAddrCsel*R LxSx Po*WW] |
| 197 | +# |
| 198 | +-safe [DpAddrCseld* Po**R Amo.Swp] [DpAddrCsels* Pod*R Amo.Swp] |
| 199 | +-safe [DpAddrCseld* Po**R Amo.Cas] [DpAddrCsels* Pod*R Amo.Cas] |
| 200 | +-safe [DpAddrCseld* Po**R Amo.StAdd] [DpAddrCsels* Pod*R Amo.StAdd] |
| 201 | +-safe [DpAddrCseld* Po**R Amo.LdAdd] [DpAddrCsels* Pod*R Amo.LdAdd] |
| 202 | +-safe [DpAddrCseld* Po**R LxSx] [DpAddrCsels* Pod*R LxSx] |
| 203 | +# `[DpAddrCsels* Pos*R rmw]` is stronger than `Pos*W`. |
| 204 | +-safe [DpAddrCseldR Amo.Swp Po*WR Amo.Swp] [DpAddrCseldR Amo.Swp Po*WR Amo.Cas] [DpAddrCseldR Amo.Swp Po*WR Amo.StAdd] [DpAddrCseldR Amo.Swp Po*WR Amo.LdAdd] [DpAddrCseldR Amo.Swp Po*WR LxSx] |
| 205 | +-safe [DpAddrCselsR Amo.Swp PodWR Amo.Swp] [DpAddrCselsR Amo.Swp PodWR Amo.Cas] [DpAddrCselsR Amo.Swp PodWR Amo.StAdd] [DpAddrCselsR Amo.Swp PodWR Amo.LdAdd] [DpAddrCselsR Amo.Swp PodWR LxSx] |
| 206 | +# |
| 207 | +-safe [DpAddrCseldR Amo.Cas Po*WR Amo.Swp] [DpAddrCseldR Amo.Cas Po*WR Amo.Cas] [DpAddrCseldR Amo.Cas Po*WR Amo.StAdd] [DpAddrCseldR Amo.Cas Po*WR Amo.LdAdd] [DpAddrCseldR Amo.Cas Po*WR LxSx] |
| 208 | +-safe [DpAddrCselsR Amo.Cas PodWR Amo.Swp] [DpAddrCselsR Amo.Cas PodWR Amo.Cas] [DpAddrCselsR Amo.Cas PodWR Amo.StAdd] [DpAddrCselsR Amo.Cas PodWR Amo.LdAdd] [DpAddrCselsR Amo.Cas PodWR LxSx] |
| 209 | +# |
| 210 | +-safe [DpAddrCseldR Amo.StAdd Po*WR Amo.Swp] [DpAddrCseldR Amo.StAdd Po*WR Amo.Cas] [DpAddrCseldR Amo.StAdd Po*WR Amo.StAdd] [DpAddrCseldR Amo.StAdd Po*WR Amo.LdAdd] [DpAddrCseldR Amo.StAdd Po*WR LxSx] |
| 211 | +-safe [DpAddrCselsR Amo.StAdd PodWR Amo.Swp] [DpAddrCselsR Amo.StAdd PodWR Amo.Cas] [DpAddrCselsR Amo.StAdd PodWR Amo.StAdd] [DpAddrCselsR Amo.StAdd PodWR Amo.LdAdd] [DpAddrCselsR Amo.StAdd PodWR LxSx] |
| 212 | +# |
| 213 | +-safe [DpAddrCseldR Amo.LdAdd Po*WR Amo.Swp] [DpAddrCseldR Amo.LdAdd Po*WR Amo.Cas] [DpAddrCseldR Amo.LdAdd Po*WR Amo.StAdd] [DpAddrCseldR Amo.LdAdd Po*WR Amo.LdAdd] [DpAddrCseldR Amo.LdAdd Po*WR LxSx] |
| 214 | +-safe [DpAddrCselsR Amo.LdAdd PodWR Amo.Swp] [DpAddrCselsR Amo.LdAdd PodWR Amo.Cas] [DpAddrCselsR Amo.LdAdd PodWR Amo.StAdd] [DpAddrCselsR Amo.LdAdd PodWR Amo.LdAdd] [DpAddrCselsR Amo.LdAdd PodWR LxSx] |
| 215 | +# |
| 216 | +-safe [DpAddrCseldR LxSx Po*WR Amo.Swp] [DpAddrCseldR LxSx Po*WR Amo.Cas] [DpAddrCseldR LxSx Po*WR Amo.StAdd] [DpAddrCseldR LxSx Po*WR Amo.LdAdd] [DpAddrCseldR LxSx Po*WR LxSx] |
| 217 | +-safe [DpAddrCselsR LxSx PodWR Amo.Swp] [DpAddrCselsR LxSx PodWR Amo.Cas] [DpAddrCselsR LxSx PodWR Amo.StAdd] [DpAddrCselsR LxSx PodWR Amo.LdAdd] [DpAddrCselsR LxSx PodWR LxSx] |
| 218 | +# `[DpAddrCselsR rmw PosWR rmw]` is stronger than `Pos*W` |
155 | 219 |
|
156 | 220 | ### Fence |
157 | 221 |
|
|
165 | 229 | -safe [DMB.LDdR* ExpObs] [DMB.LDsRR ExpObs] |
166 | 230 | # `DMB.LDsRW` is stronger than `Pos*W`. |
167 | 231 | #-safe DMB.LDsRW |
| 232 | +-safe [Amo.Swp DMB.LDdW*] [Amo.Cas DMB.LDdW*] [Amo.LdAdd DMB.LDdW*] [LxSx DMB.LDdW*] |
| 233 | +-safe [Amo.Swp DMB.LDsWR] [Amo.Cas DMB.LDsWR] [Amo.LdAdd DMB.LDsWR] [LxSx DMB.LDsWR] |
| 234 | +# `[DMB.LD*R* rmw]` can be combined by `diy` |
168 | 235 |
|
169 | 236 | # let bob = [Exp & W]; po; [dmb.st]; po; [Exp & W | MMU & FAULT] |
170 | 237 | -safe DMB.STdWW |
171 | 238 | # `DMB.STsWW` is stronger than `Pos*W`. |
172 | 239 | #-safe DMB.STsWW |
| 240 | +-safe [DMB.STdWR Amo.Swp] [DMB.STdWR Amo.Cas] [DMB.STdWR Amo.StAdd] [DMB.STdWR Amo.LdAdd] [DMB.STdWR LxSx] |
173 | 241 |
|
174 | 242 | # let DSB-ob = [M | DC.CVAU | IC]; po; [dsb.full]; po; [~(Imp & TTD & M | Imp & Instr & R)] |
175 | 243 | # DSB.ISH*** DSB.OSH*** in `-moreedges` in `diy7`; these two edges also satisfy `dsb.full` |
|
181 | 249 | -safe [DSB.LDdR* ExpObs] [DSB.LDsRR ExpObs] |
182 | 250 | # `DSB.LDsRW` is stronger than `Pos*W`. |
183 | 251 | #-safe DSB.LDsRW |
| 252 | +-safe [Amo.Swp DSB.LDdW*] [Amo.Cas DSB.LDdW*] [Amo.LdAdd DSB.LDdW*] [LxSx DSB.LDdW*] |
| 253 | +-safe [Amo.Swp DSB.LDsWR] [Amo.Cas DSB.LDsWR] [Amo.LdAdd DSB.LDsWR] [LxSx DSB.LDsWR] |
184 | 254 |
|
185 | 255 | # let DSB-ob = [Exp & W]; po; [dsb.st]; po; [~(Imp & TTD & M | Imp & Instr & R)] |
186 | 256 | -safe [DSB.STdW* ExpObs] [DSB.STsWR ExpObs] |
|
190 | 260 | ### Acquire-Release load and store |
191 | 261 | # let bob = [L]; po; [A] |
192 | 262 | -safe [L Po*WR A] |
| 263 | +# `[(rmw) L Po*WR A (rmw)]` can be combined by `diy` |
193 | 264 |
|
194 | 265 | ### Atomic operation |
195 | 266 | # Amo.Swp |
|
204 | 275 | -safe [A PodR* ExpObs] [A PosRR ExpObs] [Q PodR* ExpObs] [Q PosRR ExpObs] |
205 | 276 | # `[A|Q PosRW]` is stronger than `PosRW` |
206 | 277 | #-safe [A PosRW] [Q PosRW] |
207 | | - |
208 | 278 | # An acquire atomic operation followed by a memory access also matches above |
209 | 279 | -safe [A Amo.Swp PodW* ExpObs] [A Amo.Swp PosWR ExpObs] |
210 | 280 | -safe [A Amo.Cas PodW* ExpObs] [A Amo.Cas PosWR ExpObs] |
|
226 | 296 | -safe [ExpObs Pod*R Amo.LdAdd L] |
227 | 297 | -safe [ExpObs Pod*R LxSx L] |
228 | 298 | # `[Pos*R rmw L]` is stronger than `Pos*W` |
229 | | -#-safe [Pos*R Amo.Swp L] [Pos*R Amo.Cas L] [Pos*R LxSx L] |
| 299 | +#-safe [Pos*R Amo.Swp L] [Pos*R Amo.Cas L] [Pos*R LxSx L] |
230 | 300 |
|
231 | 301 | # let aob = [Exp & M]; rmw; [Exp & M] |
232 | 302 | -safe LxSx Amo.Swp Amo.Cas |
|
0 commit comments