@@ -13,17 +13,38 @@ foreach size = [8, 16, 32] in {
13
13
def : Pat<(!cast<SDPatternOperator>("atomic_load_"#size) MxCP_ARII:$ptr),
14
14
(!cast<MxInst>("MOV"#size#"df") !cast<MxMemOp>("MxARII"#size):$ptr)>;
15
15
16
+ def : Pat<(!cast<SDPatternOperator>("atomic_load_"#size) MxCP_ARID:$ptr),
17
+ (!cast<MxInst>("MOV"#size#"dp") !cast<MxMemOp>("MxARID"#size):$ptr)>;
18
+
19
+ def : Pat<(!cast<SDPatternOperator>("atomic_load_"#size) MxCP_PCD:$ptr),
20
+ (!cast<MxInst>("MOV"#size#"dq") !cast<MxMemOp>("MxPCD"#size):$ptr)>;
21
+
22
+ def : Pat<(!cast<SDPatternOperator>("atomic_load_"#size) MxCP_PCI:$ptr),
23
+ (!cast<MxInst>("MOV"#size#"dk") !cast<MxMemOp>("MxPCI"#size):$ptr)>;
24
+
16
25
def : Pat<(!cast<SDPatternOperator>("atomic_store_"#size) !cast<MxRegOp>("MxDRD"#size):$val, MxCP_ARI:$ptr),
17
26
(!cast<MxInst>("MOV"#size#"jd") !cast<MxMemOp>("MxARI"#size):$ptr,
18
27
!cast<MxRegOp>("MxDRD"#size):$val)>;
19
28
20
29
def : Pat<(!cast<SDPatternOperator>("atomic_store_"#size) !cast<MxRegOp>("MxDRD"#size):$val, MxCP_ARII:$ptr),
21
30
(!cast<MxInst>("MOV"#size#"fd") !cast<MxMemOp>("MxARII"#size):$ptr,
22
31
!cast<MxRegOp>("MxDRD"#size):$val)>;
32
+
33
+ def : Pat<(!cast<SDPatternOperator>("atomic_store_"#size) !cast<MxRegOp>("MxDRD"#size):$val, MxCP_ARID:$ptr),
34
+ (!cast<MxInst>("MOV"#size#"pd") !cast<MxMemOp>("MxARID"#size):$ptr,
35
+ !cast<MxRegOp>("MxDRD"#size):$val)>;
36
+
37
+ def : Pat<(!cast<SDPatternOperator>("atomic_store_"#size) !cast<MxRegOp>("MxDRD"#size):$val, MxCP_PCD:$ptr),
38
+ (!cast<MxInst>("MOV"#size#"qd") !cast<MxMemOp>("MxPCD"#size):$ptr,
39
+ !cast<MxRegOp>("MxDRD"#size):$val)>;
40
+
41
+ def : Pat<(!cast<SDPatternOperator>("atomic_store_"#size) !cast<MxRegOp>("MxDRD"#size):$val, MxCP_PCI:$ptr),
42
+ (!cast<MxInst>("MOV"#size#"kd") !cast<MxMemOp>("MxPCI"#size):$ptr,
43
+ !cast<MxRegOp>("MxDRD"#size):$val)>;
23
44
}
24
45
25
46
let Predicates = [AtLeastM68020] in {
26
- class MxCASOp <bits<2> size_encoding, MxType type>
47
+ class MxCASARIOp <bits<2> size_encoding, MxType type>
27
48
: MxInst<(outs type.ROp:$out),
28
49
(ins type.ROp:$dc, type.ROp:$du, !cast<MxMemOp>("MxARI"#type.Size):$mem),
29
50
"cas."#type.Prefix#" $dc, $du, $mem"> {
@@ -36,17 +57,128 @@ class MxCASOp<bits<2> size_encoding, MxType type>
36
57
let mayStore = 1;
37
58
}
38
59
39
- def CAS8 : MxCASOp<0x1, MxType8d>;
40
- def CAS16 : MxCASOp<0x2, MxType16d>;
41
- def CAS32 : MxCASOp<0x3, MxType32d>;
60
+ def CASARI8 : MxCASARIOp<0x1, MxType8d>;
61
+ def CASARI16 : MxCASARIOp<0x2, MxType16d>;
62
+ def CASARI32 : MxCASARIOp<0x3, MxType32d>;
63
+
64
+ class MxCASARIDOp<bits<2> size_encoding, MxType type>
65
+ : MxInst<(outs type.ROp:$out),
66
+ (ins type.ROp:$dc, type.ROp:$du, !cast<MxMemOp>("MxARID"#type.Size):$mem),
67
+ "cas."#type.Prefix#" $dc, $du, $mem"> {
68
+ let Inst = (ascend
69
+ (descend 0b00001, size_encoding, 0b011, MxEncAddrMode_p<"mem">.EA),
70
+ (descend 0b0000000, (operand "$du", 3), 0b000, (operand "$dc", 3))
71
+ );
72
+ let Constraints = "$out = $dc";
73
+ let mayLoad = 1;
74
+ let mayStore = 1;
75
+ }
76
+
77
+ def CASARID8 : MxCASARIDOp<0x1, MxType8d>;
78
+ def CASARID16 : MxCASARIDOp<0x2, MxType16d>;
79
+ def CASARID32 : MxCASARIDOp<0x3, MxType32d>;
80
+
81
+ class MxCASARIIOp<bits<2> size_encoding, MxType type>
82
+ : MxInst<(outs type.ROp:$out),
83
+ (ins type.ROp:$dc, type.ROp:$du, !cast<MxMemOp>("MxARII"#type.Size):$mem),
84
+ "cas."#type.Prefix#" $dc, $du, $mem"> {
85
+ let Inst = (ascend
86
+ (descend 0b00001, size_encoding, 0b011, MxEncAddrMode_f<"mem">.EA),
87
+ (descend 0b0000000, (operand "$du", 3), 0b000, (operand "$dc", 3))
88
+ );
89
+ let Constraints = "$out = $dc";
90
+ let mayLoad = 1;
91
+ let mayStore = 1;
92
+ }
93
+
94
+ def CASARII8 : MxCASARIIOp<0x1, MxType8d>;
95
+ def CASARII16 : MxCASARIIOp<0x2, MxType16d>;
96
+ def CASARII32 : MxCASARIIOp<0x3, MxType32d>;
42
97
98
+ class MxCASPCIOp<bits<2> size_encoding, MxType type>
99
+ : MxInst<(outs type.ROp:$out),
100
+ (ins type.ROp:$dc, type.ROp:$du, !cast<MxMemOp>("MxPCI"#type.Size):$mem),
101
+ "cas."#type.Prefix#" $dc, $du, $mem"> {
102
+ let Inst = (ascend
103
+ (descend 0b00001, size_encoding, 0b011, MxEncAddrMode_k<"mem">.EA),
104
+ (descend 0b0000000, (operand "$du", 3), 0b000, (operand "$dc", 3))
105
+ );
106
+ let Constraints = "$out = $dc";
107
+ let mayLoad = 1;
108
+ let mayStore = 1;
109
+ }
43
110
111
+ def CASPCI8 : MxCASPCIOp<0x1, MxType8d>;
112
+ def CASPCI16 : MxCASPCIOp<0x2, MxType16d>;
113
+ def CASPCI32 : MxCASPCIOp<0x3, MxType32d>;
114
+
115
+ class MxCASPCDOp<bits<2> size_encoding, MxType type>
116
+ : MxInst<(outs type.ROp:$out),
117
+ (ins type.ROp:$dc, type.ROp:$du, !cast<MxMemOp>("MxPCD"#type.Size):$mem),
118
+ "cas."#type.Prefix#" $dc, $du, $mem"> {
119
+ let Inst = (ascend
120
+ (descend 0b00001, size_encoding, 0b011, MxEncAddrMode_q<"mem">.EA),
121
+ (descend 0b0000000, (operand "$du", 3), 0b000, (operand "$dc", 3))
122
+ );
123
+ let Constraints = "$out = $dc";
124
+ let mayLoad = 1;
125
+ let mayStore = 1;
126
+ }
127
+
128
+ def CASPCD8 : MxCASPCDOp<0x1, MxType8d>;
129
+ def CASPCD16 : MxCASPCDOp<0x2, MxType16d>;
130
+ def CASPCD32 : MxCASPCDOp<0x3, MxType32d>;
131
+
132
+ class MxCASALOp<bits<2> size_encoding, MxType type>
133
+ : MxInst<(outs type.ROp:$out),
134
+ (ins type.ROp:$dc, type.ROp:$du, !cast<MxMemOp>("MxAL"#type.Size):$mem),
135
+ "cas."#type.Prefix#" $dc, $du, $mem"> {
136
+ let Inst = (ascend
137
+ (descend 0b00001, size_encoding, 0b011, MxEncAddrMode_abs<"mem">.EA),
138
+ (descend 0b0000000, (operand "$du", 3), 0b000, (operand "$dc", 3))
139
+ );
140
+ let Constraints = "$out = $dc";
141
+ let mayLoad = 1;
142
+ let mayStore = 1;
143
+ }
144
+
145
+ def CASAL8 : MxCASALOp<0x1, MxType8d>;
146
+ def CASAL16 : MxCASALOp<0x2, MxType16d>;
147
+ def CASAL32 : MxCASALOp<0x3, MxType32d>;
148
+
149
+ foreach mode = ["ARI", "ARII", "ARID", "PCI", "PCD", "AL"] in {
44
150
foreach size = [8, 16, 32] in {
45
- def : Pat<(!cast<SDPatternOperator>("atomic_cmp_swap_i"#size) MxCP_ARI :$ptr,
151
+ def : Pat<(!cast<SDPatternOperator>("atomic_cmp_swap_i"#size) !cast<ComplexPattern>("MxCP_"#mode) :$ptr,
46
152
!cast<MxRegOp>("MxDRD"#size):$cmp,
47
153
!cast<MxRegOp>("MxDRD"#size):$new),
48
- (!cast<MxInst>("CAS"#size) !cast<MxRegOp>("MxDRD"#size):$cmp,
154
+ (!cast<MxInst>("CAS"#mode# size) !cast<MxRegOp>("MxDRD"#size):$cmp,
49
155
!cast<MxRegOp>("MxDRD"#size):$new,
50
- !cast<MxMemOp>("MxARI"#size):$ptr)>;
156
+ !cast<MxMemOp>("Mx"#mode#size):$ptr)>;
157
+ } // size
158
+ } // addr mode
159
+
160
+ class MxCASARDOp<bits<2> size_encoding, MxType type>
161
+ : MxInst<(outs type.ROp:$out),
162
+ (ins type.ROp:$dc, type.ROp:$du, !cast<MxRegOp>("MxARD"#type.Size):$mem),
163
+ "cas."#type.Prefix#" $dc, $du, $mem"> {
164
+ let Inst = (ascend
165
+ (descend 0b00001, size_encoding, 0b011, MxEncAddrMode_a<"mem">.EA),
166
+ (descend 0b0000000, (operand "$du", 3), 0b000, (operand "$dc", 3))
167
+ );
168
+ let Constraints = "$out = $dc";
169
+ let mayLoad = 1;
170
+ let mayStore = 1;
51
171
}
172
+
173
+ def CASARD16 : MxCASARDOp<0x2, MxType16a>;
174
+ def CASARD32 : MxCASARDOp<0x3, MxType32a>;
175
+
176
+ foreach size = [16, 32] in {
177
+ def : Pat<(!cast<SDPatternOperator>("atomic_cmp_swap_i"#size) !cast<MxRegOp>("MxARD"#size):$ptr,
178
+ !cast<MxRegOp>("MxDRD"#size):$cmp,
179
+ !cast<MxRegOp>("MxDRD"#size):$new),
180
+ (!cast<MxInst>("CASARD"#size) !cast<MxRegOp>("MxDRD"#size):$cmp,
181
+ !cast<MxRegOp>("MxDRD"#size):$new,
182
+ !cast<MxRegOp>("MxARD"#size):$ptr)>;
183
+ } // size
52
184
} // let Predicates = [AtLeastM68020]
0 commit comments