@@ -27,22 +27,43 @@ def : Pat<(atomic_fence (timm), (timm)), (DMB (i32 0xb))>;
27
27
// supported, but when they're relaxed and anything can be used, all the
28
28
// standard modes would be valid and may give efficiency gains.
29
29
30
+ // An atomic load operation that does not need either acquire or release
31
+ // semantics.
32
+ class relaxed_load<PatFrag base>
33
+ : PatFrag<(ops node:$ptr), (base node:$ptr)> {
34
+ let IsAtomic = 1;
35
+ let IsAtomicOrderingAcquireOrStronger = 0;
36
+ }
37
+
30
38
// A atomic load operation that actually needs acquire semantics.
31
39
class acquiring_load<PatFrag base>
32
40
: PatFrag<(ops node:$ptr), (base node:$ptr)> {
33
41
let IsAtomic = 1;
34
- let IsAtomicOrderingAcquireOrStronger = 1;
42
+ let IsAtomicOrderingAcquire = 1;
35
43
}
36
44
37
- // An atomic load operation that does not need either acquire or release
38
- // semantics.
39
- class relaxed_load<PatFrag base>
45
+ // An atomic load operation that needs sequential consistency.
46
+ class seq_cst_load<PatFrag base>
40
47
: PatFrag<(ops node:$ptr), (base node:$ptr)> {
41
48
let IsAtomic = 1;
42
- let IsAtomicOrderingAcquireOrStronger = 0;
49
+ let IsAtomicOrderingSequentiallyConsistent = 1;
50
+ }
51
+
52
+ // RCPC extension, currently opt-in under a separate feature.
53
+ let Predicates = [HasLDAPR] in {
54
+ // v8.3 Release Consistent Processor Consistent support, optional in v8.2.
55
+ // 8-bit loads
56
+ def : Pat<(acquiring_load<atomic_load_8> GPR64sp:$ptr), (LDAPRB GPR64sp:$ptr)>;
57
+ // 16-bit loads
58
+ def : Pat<(acquiring_load<atomic_load_16> GPR64sp:$ptr), (LDAPRH GPR64sp:$ptr)>;
59
+ // 32-bit loads
60
+ def : Pat<(acquiring_load<atomic_load_32> GPR64sp:$ptr), (LDAPRW GPR64sp:$ptr)>;
61
+ // 64-bit loads
62
+ def : Pat<(acquiring_load<atomic_load_64> GPR64sp:$ptr), (LDAPRX GPR64sp:$ptr)>;
43
63
}
44
64
45
65
// 8-bit loads
66
+ def : Pat<(seq_cst_load<atomic_load_8> GPR64sp:$ptr), (LDARB GPR64sp:$ptr)>;
46
67
def : Pat<(acquiring_load<atomic_load_8> GPR64sp:$ptr), (LDARB GPR64sp:$ptr)>;
47
68
def : Pat<(relaxed_load<atomic_load_8> (ro_Windexed8 GPR64sp:$Rn, GPR32:$Rm,
48
69
ro_Wextend8:$offset)),
@@ -58,6 +79,7 @@ def : Pat<(relaxed_load<atomic_load_8>
58
79
(LDURBBi GPR64sp:$Rn, simm9:$offset)>;
59
80
60
81
// 16-bit loads
82
+ def : Pat<(seq_cst_load<atomic_load_16> GPR64sp:$ptr), (LDARH GPR64sp:$ptr)>;
61
83
def : Pat<(acquiring_load<atomic_load_16> GPR64sp:$ptr), (LDARH GPR64sp:$ptr)>;
62
84
def : Pat<(relaxed_load<atomic_load_16> (ro_Windexed16 GPR64sp:$Rn, GPR32:$Rm,
63
85
ro_Wextend16:$extend)),
@@ -73,6 +95,7 @@ def : Pat<(relaxed_load<atomic_load_16>
73
95
(LDURHHi GPR64sp:$Rn, simm9:$offset)>;
74
96
75
97
// 32-bit loads
98
+ def : Pat<(seq_cst_load<atomic_load_32> GPR64sp:$ptr), (LDARW GPR64sp:$ptr)>;
76
99
def : Pat<(acquiring_load<atomic_load_32> GPR64sp:$ptr), (LDARW GPR64sp:$ptr)>;
77
100
def : Pat<(relaxed_load<atomic_load_32> (ro_Windexed32 GPR64sp:$Rn, GPR32:$Rm,
78
101
ro_Wextend32:$extend)),
@@ -88,6 +111,7 @@ def : Pat<(relaxed_load<atomic_load_32>
88
111
(LDURWi GPR64sp:$Rn, simm9:$offset)>;
89
112
90
113
// 64-bit loads
114
+ def : Pat<(seq_cst_load<atomic_load_64> GPR64sp:$ptr), (LDARX GPR64sp:$ptr)>;
91
115
def : Pat<(acquiring_load<atomic_load_64> GPR64sp:$ptr), (LDARX GPR64sp:$ptr)>;
92
116
def : Pat<(relaxed_load<atomic_load_64> (ro_Windexed64 GPR64sp:$Rn, GPR32:$Rm,
93
117
ro_Wextend64:$extend)),
0 commit comments