@@ -64,30 +64,18 @@ define void @store_i16(ptr %ptr, i16 %v) {
64
64
define i16 @load_i16_unaligned (ptr %ptr ) {
65
65
; CHECK-O0-LABEL: load_i16_unaligned:
66
66
; CHECK-O0: # %bb.0:
67
- ; CHECK-O0-NEXT: pushq %rax
68
- ; CHECK-O0-NEXT: .cfi_def_cfa_offset 16
69
- ; CHECK-O0-NEXT: movq %rdi, %rsi
70
- ; CHECK-O0-NEXT: movl $2, %edi
71
- ; CHECK-O0-NEXT: leaq {{[0-9]+}}(%rsp), %rdx
72
- ; CHECK-O0-NEXT: xorl %ecx, %ecx
73
- ; CHECK-O0-NEXT: callq __atomic_load@PLT
74
- ; CHECK-O0-NEXT: movw {{[0-9]+}}(%rsp), %ax
75
- ; CHECK-O0-NEXT: popq %rcx
76
- ; CHECK-O0-NEXT: .cfi_def_cfa_offset 8
67
+ ; CHECK-O0-NEXT: xorl %eax, %eax
68
+ ; CHECK-O0-NEXT: movw %ax, %cx
69
+ ; CHECK-O0-NEXT: movw %cx, %ax
70
+ ; CHECK-O0-NEXT: lock cmpxchgw %cx, (%rdi)
71
+ ; CHECK-O0-NEXT: sete %cl
77
72
; CHECK-O0-NEXT: retq
78
73
;
79
74
; CHECK-O3-LABEL: load_i16_unaligned:
80
75
; CHECK-O3: # %bb.0:
81
- ; CHECK-O3-NEXT: pushq %rax
82
- ; CHECK-O3-NEXT: .cfi_def_cfa_offset 16
83
- ; CHECK-O3-NEXT: movq %rdi, %rsi
84
- ; CHECK-O3-NEXT: leaq {{[0-9]+}}(%rsp), %rdx
85
- ; CHECK-O3-NEXT: movl $2, %edi
86
76
; CHECK-O3-NEXT: xorl %ecx, %ecx
87
- ; CHECK-O3-NEXT: callq __atomic_load@PLT
88
- ; CHECK-O3-NEXT: movzwl {{[0-9]+}}(%rsp), %eax
89
- ; CHECK-O3-NEXT: popq %rcx
90
- ; CHECK-O3-NEXT: .cfi_def_cfa_offset 8
77
+ ; CHECK-O3-NEXT: xorl %eax, %eax
78
+ ; CHECK-O3-NEXT: lock cmpxchgw %cx, (%rdi)
91
79
; CHECK-O3-NEXT: retq
92
80
%v = load atomic i16 , ptr %ptr unordered , align 1
93
81
ret i16 %v
@@ -97,33 +85,13 @@ define i16 @load_i16_unaligned(ptr %ptr) {
97
85
define void @store_i16_unaligned (ptr %ptr , i16 %v ) {
98
86
; CHECK-O0-LABEL: store_i16_unaligned:
99
87
; CHECK-O0: # %bb.0:
100
- ; CHECK-O0-NEXT: pushq %rax
101
- ; CHECK-O0-NEXT: .cfi_def_cfa_offset 16
102
- ; CHECK-O0-NEXT: movl %esi, %eax
103
- ; CHECK-O0-NEXT: movq %rdi, %rsi
104
- ; CHECK-O0-NEXT: # kill: def $ax killed $ax killed $eax
105
- ; CHECK-O0-NEXT: movw %ax, {{[0-9]+}}(%rsp)
106
- ; CHECK-O0-NEXT: movl $2, %edi
107
- ; CHECK-O0-NEXT: leaq {{[0-9]+}}(%rsp), %rdx
108
- ; CHECK-O0-NEXT: xorl %ecx, %ecx
109
- ; CHECK-O0-NEXT: callq __atomic_store@PLT
110
- ; CHECK-O0-NEXT: popq %rax
111
- ; CHECK-O0-NEXT: .cfi_def_cfa_offset 8
88
+ ; CHECK-O0-NEXT: movw %si, %ax
89
+ ; CHECK-O0-NEXT: xchgw %ax, (%rdi)
112
90
; CHECK-O0-NEXT: retq
113
91
;
114
92
; CHECK-O3-LABEL: store_i16_unaligned:
115
93
; CHECK-O3: # %bb.0:
116
- ; CHECK-O3-NEXT: pushq %rax
117
- ; CHECK-O3-NEXT: .cfi_def_cfa_offset 16
118
- ; CHECK-O3-NEXT: movq %rdi, %rax
119
- ; CHECK-O3-NEXT: movw %si, {{[0-9]+}}(%rsp)
120
- ; CHECK-O3-NEXT: leaq {{[0-9]+}}(%rsp), %rdx
121
- ; CHECK-O3-NEXT: movl $2, %edi
122
- ; CHECK-O3-NEXT: movq %rax, %rsi
123
- ; CHECK-O3-NEXT: xorl %ecx, %ecx
124
- ; CHECK-O3-NEXT: callq __atomic_store@PLT
125
- ; CHECK-O3-NEXT: popq %rax
126
- ; CHECK-O3-NEXT: .cfi_def_cfa_offset 8
94
+ ; CHECK-O3-NEXT: xchgw %si, (%rdi)
127
95
; CHECK-O3-NEXT: retq
128
96
store atomic i16 %v , ptr %ptr unordered , align 1
129
97
ret void
@@ -150,65 +118,27 @@ define void @store_i32(ptr %ptr, i32 %v) {
150
118
define i32 @load_i32_unaligned (ptr %ptr ) {
151
119
; CHECK-O0-LABEL: load_i32_unaligned:
152
120
; CHECK-O0: # %bb.0:
153
- ; CHECK-O0-NEXT: pushq %rax
154
- ; CHECK-O0-NEXT: .cfi_def_cfa_offset 16
155
- ; CHECK-O0-NEXT: movq %rdi, %rsi
156
- ; CHECK-O0-NEXT: movl $4, %edi
157
- ; CHECK-O0-NEXT: leaq {{[0-9]+}}(%rsp), %rdx
158
121
; CHECK-O0-NEXT: xorl %ecx, %ecx
159
- ; CHECK-O0-NEXT: callq __atomic_load@PLT
160
- ; CHECK-O0-NEXT: movl {{[0-9]+}}(%rsp), %eax
161
- ; CHECK-O0-NEXT: popq %rcx
162
- ; CHECK-O0-NEXT: .cfi_def_cfa_offset 8
122
+ ; CHECK-O0-NEXT: movl %ecx, %eax
123
+ ; CHECK-O0-NEXT: lock cmpxchgl %ecx, (%rdi)
124
+ ; CHECK-O0-NEXT: sete %cl
163
125
; CHECK-O0-NEXT: retq
164
126
;
165
127
; CHECK-O3-LABEL: load_i32_unaligned:
166
128
; CHECK-O3: # %bb.0:
167
- ; CHECK-O3-NEXT: pushq %rax
168
- ; CHECK-O3-NEXT: .cfi_def_cfa_offset 16
169
- ; CHECK-O3-NEXT: movq %rdi, %rsi
170
- ; CHECK-O3-NEXT: leaq {{[0-9]+}}(%rsp), %rdx
171
- ; CHECK-O3-NEXT: movl $4, %edi
172
129
; CHECK-O3-NEXT: xorl %ecx, %ecx
173
- ; CHECK-O3-NEXT: callq __atomic_load@PLT
174
- ; CHECK-O3-NEXT: movl {{[0-9]+}}(%rsp), %eax
175
- ; CHECK-O3-NEXT: popq %rcx
176
- ; CHECK-O3-NEXT: .cfi_def_cfa_offset 8
130
+ ; CHECK-O3-NEXT: xorl %eax, %eax
131
+ ; CHECK-O3-NEXT: lock cmpxchgl %ecx, (%rdi)
177
132
; CHECK-O3-NEXT: retq
178
133
%v = load atomic i32 , ptr %ptr unordered , align 1
179
134
ret i32 %v
180
135
}
181
136
182
137
define void @store_i32_unaligned (ptr %ptr , i32 %v ) {
183
- ; CHECK-O0-LABEL: store_i32_unaligned:
184
- ; CHECK-O0: # %bb.0:
185
- ; CHECK-O0-NEXT: pushq %rax
186
- ; CHECK-O0-NEXT: .cfi_def_cfa_offset 16
187
- ; CHECK-O0-NEXT: movl %esi, %eax
188
- ; CHECK-O0-NEXT: movq %rdi, %rsi
189
- ; CHECK-O0-NEXT: movl %eax, {{[0-9]+}}(%rsp)
190
- ; CHECK-O0-NEXT: movl $4, %edi
191
- ; CHECK-O0-NEXT: leaq {{[0-9]+}}(%rsp), %rdx
192
- ; CHECK-O0-NEXT: xorl %ecx, %ecx
193
- ; CHECK-O0-NEXT: callq __atomic_store@PLT
194
- ; CHECK-O0-NEXT: popq %rax
195
- ; CHECK-O0-NEXT: .cfi_def_cfa_offset 8
196
- ; CHECK-O0-NEXT: retq
197
- ;
198
- ; CHECK-O3-LABEL: store_i32_unaligned:
199
- ; CHECK-O3: # %bb.0:
200
- ; CHECK-O3-NEXT: pushq %rax
201
- ; CHECK-O3-NEXT: .cfi_def_cfa_offset 16
202
- ; CHECK-O3-NEXT: movq %rdi, %rax
203
- ; CHECK-O3-NEXT: movl %esi, {{[0-9]+}}(%rsp)
204
- ; CHECK-O3-NEXT: leaq {{[0-9]+}}(%rsp), %rdx
205
- ; CHECK-O3-NEXT: movl $4, %edi
206
- ; CHECK-O3-NEXT: movq %rax, %rsi
207
- ; CHECK-O3-NEXT: xorl %ecx, %ecx
208
- ; CHECK-O3-NEXT: callq __atomic_store@PLT
209
- ; CHECK-O3-NEXT: popq %rax
210
- ; CHECK-O3-NEXT: .cfi_def_cfa_offset 8
211
- ; CHECK-O3-NEXT: retq
138
+ ; CHECK-LABEL: store_i32_unaligned:
139
+ ; CHECK: # %bb.0:
140
+ ; CHECK-NEXT: xchgl %esi, (%rdi)
141
+ ; CHECK-NEXT: retq
212
142
store atomic i32 %v , ptr %ptr unordered , align 1
213
143
ret void
214
144
}
@@ -234,65 +164,28 @@ define void @store_i64(ptr %ptr, i64 %v) {
234
164
define i64 @load_i64_unaligned (ptr %ptr ) {
235
165
; CHECK-O0-LABEL: load_i64_unaligned:
236
166
; CHECK-O0: # %bb.0:
237
- ; CHECK-O0-NEXT: pushq %rax
238
- ; CHECK-O0-NEXT: .cfi_def_cfa_offset 16
239
- ; CHECK-O0-NEXT: movq %rdi, %rsi
240
- ; CHECK-O0-NEXT: movl $8, %edi
241
- ; CHECK-O0-NEXT: movq %rsp, %rdx
242
- ; CHECK-O0-NEXT: xorl %ecx, %ecx
243
- ; CHECK-O0-NEXT: callq __atomic_load@PLT
244
- ; CHECK-O0-NEXT: movq (%rsp), %rax
245
- ; CHECK-O0-NEXT: popq %rcx
246
- ; CHECK-O0-NEXT: .cfi_def_cfa_offset 8
167
+ ; CHECK-O0-NEXT: xorl %eax, %eax
168
+ ; CHECK-O0-NEXT: movl %eax, %ecx
169
+ ; CHECK-O0-NEXT: movq %rcx, %rax
170
+ ; CHECK-O0-NEXT: lock cmpxchgq %rcx, (%rdi)
171
+ ; CHECK-O0-NEXT: sete %cl
247
172
; CHECK-O0-NEXT: retq
248
173
;
249
174
; CHECK-O3-LABEL: load_i64_unaligned:
250
175
; CHECK-O3: # %bb.0:
251
- ; CHECK-O3-NEXT: pushq %rax
252
- ; CHECK-O3-NEXT: .cfi_def_cfa_offset 16
253
- ; CHECK-O3-NEXT: movq %rdi, %rsi
254
- ; CHECK-O3-NEXT: movq %rsp, %rdx
255
- ; CHECK-O3-NEXT: movl $8, %edi
256
176
; CHECK-O3-NEXT: xorl %ecx, %ecx
257
- ; CHECK-O3-NEXT: callq __atomic_load@PLT
258
- ; CHECK-O3-NEXT: movq (%rsp), %rax
259
- ; CHECK-O3-NEXT: popq %rcx
260
- ; CHECK-O3-NEXT: .cfi_def_cfa_offset 8
177
+ ; CHECK-O3-NEXT: xorl %eax, %eax
178
+ ; CHECK-O3-NEXT: lock cmpxchgq %rcx, (%rdi)
261
179
; CHECK-O3-NEXT: retq
262
180
%v = load atomic i64 , ptr %ptr unordered , align 1
263
181
ret i64 %v
264
182
}
265
183
266
184
define void @store_i64_unaligned (ptr %ptr , i64 %v ) {
267
- ; CHECK-O0-LABEL: store_i64_unaligned:
268
- ; CHECK-O0: # %bb.0:
269
- ; CHECK-O0-NEXT: pushq %rax
270
- ; CHECK-O0-NEXT: .cfi_def_cfa_offset 16
271
- ; CHECK-O0-NEXT: movq %rsi, %rax
272
- ; CHECK-O0-NEXT: movq %rdi, %rsi
273
- ; CHECK-O0-NEXT: movq %rax, (%rsp)
274
- ; CHECK-O0-NEXT: movl $8, %edi
275
- ; CHECK-O0-NEXT: movq %rsp, %rdx
276
- ; CHECK-O0-NEXT: xorl %ecx, %ecx
277
- ; CHECK-O0-NEXT: callq __atomic_store@PLT
278
- ; CHECK-O0-NEXT: popq %rax
279
- ; CHECK-O0-NEXT: .cfi_def_cfa_offset 8
280
- ; CHECK-O0-NEXT: retq
281
- ;
282
- ; CHECK-O3-LABEL: store_i64_unaligned:
283
- ; CHECK-O3: # %bb.0:
284
- ; CHECK-O3-NEXT: pushq %rax
285
- ; CHECK-O3-NEXT: .cfi_def_cfa_offset 16
286
- ; CHECK-O3-NEXT: movq %rdi, %rax
287
- ; CHECK-O3-NEXT: movq %rsi, (%rsp)
288
- ; CHECK-O3-NEXT: movq %rsp, %rdx
289
- ; CHECK-O3-NEXT: movl $8, %edi
290
- ; CHECK-O3-NEXT: movq %rax, %rsi
291
- ; CHECK-O3-NEXT: xorl %ecx, %ecx
292
- ; CHECK-O3-NEXT: callq __atomic_store@PLT
293
- ; CHECK-O3-NEXT: popq %rax
294
- ; CHECK-O3-NEXT: .cfi_def_cfa_offset 8
295
- ; CHECK-O3-NEXT: retq
185
+ ; CHECK-LABEL: store_i64_unaligned:
186
+ ; CHECK: # %bb.0:
187
+ ; CHECK-NEXT: xchgq %rsi, (%rdi)
188
+ ; CHECK-NEXT: retq
296
189
store atomic i64 %v , ptr %ptr unordered , align 1
297
190
ret void
298
191
}
0 commit comments