xref: /minix3/external/bsd/llvm/dist/llvm/test/CodeGen/X86/atomic128.ll (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
1*0a6a1f1dSLionel Sambuc; RUN: llc < %s -mtriple=x86_64-apple-macosx10.9 -verify-machineinstrs -mattr=cx16 | FileCheck %s
2*0a6a1f1dSLionel Sambuc
3*0a6a1f1dSLionel Sambuc@var = global i128 0
4*0a6a1f1dSLionel Sambuc
5*0a6a1f1dSLionel Sambucdefine i128 @val_compare_and_swap(i128* %p, i128 %oldval, i128 %newval) {
6*0a6a1f1dSLionel Sambuc; CHECK-LABEL: val_compare_and_swap:
7*0a6a1f1dSLionel Sambuc; CHECK: movq %rsi, %rax
8*0a6a1f1dSLionel Sambuc; CHECK: movq %rcx, %rbx
9*0a6a1f1dSLionel Sambuc; CHECK: movq %r8, %rcx
10*0a6a1f1dSLionel Sambuc; CHECK: lock
11*0a6a1f1dSLionel Sambuc; CHECK: cmpxchg16b (%rdi)
12*0a6a1f1dSLionel Sambuc
13*0a6a1f1dSLionel Sambuc  %pair = cmpxchg i128* %p, i128 %oldval, i128 %newval acquire acquire
14*0a6a1f1dSLionel Sambuc  %val = extractvalue { i128, i1 } %pair, 0
15*0a6a1f1dSLionel Sambuc  ret i128 %val
16*0a6a1f1dSLionel Sambuc}
17*0a6a1f1dSLionel Sambuc
18*0a6a1f1dSLionel Sambucdefine void @fetch_and_nand(i128* %p, i128 %bits) {
19*0a6a1f1dSLionel Sambuc; CHECK-LABEL: fetch_and_nand:
20*0a6a1f1dSLionel Sambuc; CHECK-DAG:     movq %rdx, [[INCHI:%[a-z0-9]+]]
21*0a6a1f1dSLionel Sambuc; CHECK-DAG:     movq (%rdi), %rax
22*0a6a1f1dSLionel Sambuc; CHECK-DAG:     movq 8(%rdi), %rdx
23*0a6a1f1dSLionel Sambuc
24*0a6a1f1dSLionel Sambuc; CHECK: [[LOOP:.?LBB[0-9]+_[0-9]+]]:
25*0a6a1f1dSLionel Sambuc; CHECK:         movq %rdx, %rcx
26*0a6a1f1dSLionel Sambuc; CHECK:         andq [[INCHI]], %rcx
27*0a6a1f1dSLionel Sambuc; CHECK:         movq %rax, %rbx
28*0a6a1f1dSLionel Sambuc  ; INCLO equivalent comes in in %rsi, so it makes sense it stays there.
29*0a6a1f1dSLionel Sambuc; CHECK:         andq %rsi, %rbx
30*0a6a1f1dSLionel Sambuc; CHECK:         notq %rbx
31*0a6a1f1dSLionel Sambuc; CHECK:         notq %rcx
32*0a6a1f1dSLionel Sambuc; CHECK:         lock
33*0a6a1f1dSLionel Sambuc; CHECK:         cmpxchg16b (%rdi)
34*0a6a1f1dSLionel Sambuc; CHECK:         jne [[LOOP]]
35*0a6a1f1dSLionel Sambuc
36*0a6a1f1dSLionel Sambuc; CHECK:         movq %rax, _var
37*0a6a1f1dSLionel Sambuc; CHECK:         movq %rdx, _var+8
38*0a6a1f1dSLionel Sambuc  %val = atomicrmw nand i128* %p, i128 %bits release
39*0a6a1f1dSLionel Sambuc  store i128 %val, i128* @var, align 16
40*0a6a1f1dSLionel Sambuc  ret void
41*0a6a1f1dSLionel Sambuc}
42*0a6a1f1dSLionel Sambuc
43*0a6a1f1dSLionel Sambucdefine void @fetch_and_or(i128* %p, i128 %bits) {
44*0a6a1f1dSLionel Sambuc; CHECK-LABEL: fetch_and_or:
45*0a6a1f1dSLionel Sambuc; CHECK-DAG:     movq %rdx, [[INCHI:%[a-z0-9]+]]
46*0a6a1f1dSLionel Sambuc; CHECK-DAG:     movq (%rdi), %rax
47*0a6a1f1dSLionel Sambuc; CHECK-DAG:     movq 8(%rdi), %rdx
48*0a6a1f1dSLionel Sambuc
49*0a6a1f1dSLionel Sambuc; CHECK: [[LOOP:.?LBB[0-9]+_[0-9]+]]:
50*0a6a1f1dSLionel Sambuc; CHECK:         movq %rax, %rbx
51*0a6a1f1dSLionel Sambuc  ; INCLO equivalent comes in in %rsi, so it makes sense it stays there.
52*0a6a1f1dSLionel Sambuc; CHECK:         orq %rsi, %rbx
53*0a6a1f1dSLionel Sambuc; CHECK:         movq %rdx, %rcx
54*0a6a1f1dSLionel Sambuc; CHECK:         orq [[INCHI]], %rcx
55*0a6a1f1dSLionel Sambuc; CHECK:         lock
56*0a6a1f1dSLionel Sambuc; CHECK:         cmpxchg16b (%rdi)
57*0a6a1f1dSLionel Sambuc; CHECK:         jne [[LOOP]]
58*0a6a1f1dSLionel Sambuc
59*0a6a1f1dSLionel Sambuc; CHECK:         movq %rax, _var
60*0a6a1f1dSLionel Sambuc; CHECK:         movq %rdx, _var+8
61*0a6a1f1dSLionel Sambuc
62*0a6a1f1dSLionel Sambuc  %val = atomicrmw or i128* %p, i128 %bits seq_cst
63*0a6a1f1dSLionel Sambuc  store i128 %val, i128* @var, align 16
64*0a6a1f1dSLionel Sambuc  ret void
65*0a6a1f1dSLionel Sambuc}
66*0a6a1f1dSLionel Sambuc
67*0a6a1f1dSLionel Sambucdefine void @fetch_and_add(i128* %p, i128 %bits) {
68*0a6a1f1dSLionel Sambuc; CHECK-LABEL: fetch_and_add:
69*0a6a1f1dSLionel Sambuc; CHECK-DAG:     movq %rdx, [[INCHI:%[a-z0-9]+]]
70*0a6a1f1dSLionel Sambuc; CHECK-DAG:     movq (%rdi), %rax
71*0a6a1f1dSLionel Sambuc; CHECK-DAG:     movq 8(%rdi), %rdx
72*0a6a1f1dSLionel Sambuc
73*0a6a1f1dSLionel Sambuc; CHECK: [[LOOP:.?LBB[0-9]+_[0-9]+]]:
74*0a6a1f1dSLionel Sambuc; CHECK:         movq %rax, %rbx
75*0a6a1f1dSLionel Sambuc  ; INCLO equivalent comes in in %rsi, so it makes sense it stays there.
76*0a6a1f1dSLionel Sambuc; CHECK:         addq %rsi, %rbx
77*0a6a1f1dSLionel Sambuc; CHECK:         movq %rdx, %rcx
78*0a6a1f1dSLionel Sambuc; CHECK:         adcq [[INCHI]], %rcx
79*0a6a1f1dSLionel Sambuc; CHECK:         lock
80*0a6a1f1dSLionel Sambuc; CHECK:         cmpxchg16b (%rdi)
81*0a6a1f1dSLionel Sambuc; CHECK:         jne [[LOOP]]
82*0a6a1f1dSLionel Sambuc
83*0a6a1f1dSLionel Sambuc; CHECK:         movq %rax, _var
84*0a6a1f1dSLionel Sambuc; CHECK:         movq %rdx, _var+8
85*0a6a1f1dSLionel Sambuc
86*0a6a1f1dSLionel Sambuc  %val = atomicrmw add i128* %p, i128 %bits seq_cst
87*0a6a1f1dSLionel Sambuc  store i128 %val, i128* @var, align 16
88*0a6a1f1dSLionel Sambuc  ret void
89*0a6a1f1dSLionel Sambuc}
90*0a6a1f1dSLionel Sambuc
91*0a6a1f1dSLionel Sambucdefine void @fetch_and_sub(i128* %p, i128 %bits) {
92*0a6a1f1dSLionel Sambuc; CHECK-LABEL: fetch_and_sub:
93*0a6a1f1dSLionel Sambuc; CHECK-DAG:     movq %rdx, [[INCHI:%[a-z0-9]+]]
94*0a6a1f1dSLionel Sambuc; CHECK-DAG:     movq (%rdi), %rax
95*0a6a1f1dSLionel Sambuc; CHECK-DAG:     movq 8(%rdi), %rdx
96*0a6a1f1dSLionel Sambuc
97*0a6a1f1dSLionel Sambuc; CHECK: [[LOOP:.?LBB[0-9]+_[0-9]+]]:
98*0a6a1f1dSLionel Sambuc; CHECK:         movq %rax, %rbx
99*0a6a1f1dSLionel Sambuc  ; INCLO equivalent comes in in %rsi, so it makes sense it stays there.
100*0a6a1f1dSLionel Sambuc; CHECK:         subq %rsi, %rbx
101*0a6a1f1dSLionel Sambuc; CHECK:         movq %rdx, %rcx
102*0a6a1f1dSLionel Sambuc; CHECK:         sbbq [[INCHI]], %rcx
103*0a6a1f1dSLionel Sambuc; CHECK:         lock
104*0a6a1f1dSLionel Sambuc; CHECK:         cmpxchg16b (%rdi)
105*0a6a1f1dSLionel Sambuc; CHECK:         jne [[LOOP]]
106*0a6a1f1dSLionel Sambuc
107*0a6a1f1dSLionel Sambuc; CHECK:         movq %rax, _var
108*0a6a1f1dSLionel Sambuc; CHECK:         movq %rdx, _var+8
109*0a6a1f1dSLionel Sambuc
110*0a6a1f1dSLionel Sambuc  %val = atomicrmw sub i128* %p, i128 %bits seq_cst
111*0a6a1f1dSLionel Sambuc  store i128 %val, i128* @var, align 16
112*0a6a1f1dSLionel Sambuc  ret void
113*0a6a1f1dSLionel Sambuc}
114*0a6a1f1dSLionel Sambuc
115*0a6a1f1dSLionel Sambucdefine void @fetch_and_min(i128* %p, i128 %bits) {
116*0a6a1f1dSLionel Sambuc; CHECK-LABEL: fetch_and_min:
117*0a6a1f1dSLionel Sambuc; CHECK-DAG:     movq %rdx, [[INCHI:%[a-z0-9]+]]
118*0a6a1f1dSLionel Sambuc; CHECK-DAG:     movq (%rdi), %rax
119*0a6a1f1dSLionel Sambuc; CHECK-DAG:     movq 8(%rdi), %rdx
120*0a6a1f1dSLionel Sambuc
121*0a6a1f1dSLionel Sambuc; CHECK: [[LOOP:.?LBB[0-9]+_[0-9]+]]:
122*0a6a1f1dSLionel Sambuc; CHECK:         cmpq %rsi, %rax
123*0a6a1f1dSLionel Sambuc; CHECK:         setbe [[CMP:%[a-z0-9]+]]
124*0a6a1f1dSLionel Sambuc; CHECK:         cmpq [[INCHI]], %rdx
125*0a6a1f1dSLionel Sambuc; CHECK:         setle [[HICMP:%[a-z0-9]+]]
126*0a6a1f1dSLionel Sambuc; CHECK:         je [[USE_LO:.?LBB[0-9]+_[0-9]+]]
127*0a6a1f1dSLionel Sambuc
128*0a6a1f1dSLionel Sambuc; CHECK:         movb [[HICMP]], [[CMP]]
129*0a6a1f1dSLionel Sambuc; CHECK: [[USE_LO]]:
130*0a6a1f1dSLionel Sambuc; CHECK:         testb [[CMP]], [[CMP]]
131*0a6a1f1dSLionel Sambuc; CHECK:         movq %rsi, %rbx
132*0a6a1f1dSLionel Sambuc; CHECK:         cmovneq %rax, %rbx
133*0a6a1f1dSLionel Sambuc; CHECK:         movq [[INCHI]], %rcx
134*0a6a1f1dSLionel Sambuc; CHECK:         cmovneq %rdx, %rcx
135*0a6a1f1dSLionel Sambuc; CHECK:         lock
136*0a6a1f1dSLionel Sambuc; CHECK:         cmpxchg16b (%rdi)
137*0a6a1f1dSLionel Sambuc; CHECK:         jne [[LOOP]]
138*0a6a1f1dSLionel Sambuc
139*0a6a1f1dSLionel Sambuc; CHECK:         movq %rax, _var
140*0a6a1f1dSLionel Sambuc; CHECK:         movq %rdx, _var+8
141*0a6a1f1dSLionel Sambuc
142*0a6a1f1dSLionel Sambuc  %val = atomicrmw min i128* %p, i128 %bits seq_cst
143*0a6a1f1dSLionel Sambuc  store i128 %val, i128* @var, align 16
144*0a6a1f1dSLionel Sambuc  ret void
145*0a6a1f1dSLionel Sambuc}
146*0a6a1f1dSLionel Sambuc
147*0a6a1f1dSLionel Sambucdefine void @fetch_and_max(i128* %p, i128 %bits) {
148*0a6a1f1dSLionel Sambuc; CHECK-LABEL: fetch_and_max:
149*0a6a1f1dSLionel Sambuc; CHECK-DAG:     movq %rdx, [[INCHI:%[a-z0-9]+]]
150*0a6a1f1dSLionel Sambuc; CHECK-DAG:     movq (%rdi), %rax
151*0a6a1f1dSLionel Sambuc; CHECK-DAG:     movq 8(%rdi), %rdx
152*0a6a1f1dSLionel Sambuc
153*0a6a1f1dSLionel Sambuc; CHECK: [[LOOP:.?LBB[0-9]+_[0-9]+]]:
154*0a6a1f1dSLionel Sambuc; CHECK:         cmpq %rsi, %rax
155*0a6a1f1dSLionel Sambuc; CHECK:         setae [[CMP:%[a-z0-9]+]]
156*0a6a1f1dSLionel Sambuc; CHECK:         cmpq [[INCHI]], %rdx
157*0a6a1f1dSLionel Sambuc; CHECK:         setge [[HICMP:%[a-z0-9]+]]
158*0a6a1f1dSLionel Sambuc; CHECK:         je [[USE_LO:.?LBB[0-9]+_[0-9]+]]
159*0a6a1f1dSLionel Sambuc
160*0a6a1f1dSLionel Sambuc; CHECK:         movb [[HICMP]], [[CMP]]
161*0a6a1f1dSLionel Sambuc; CHECK: [[USE_LO]]:
162*0a6a1f1dSLionel Sambuc; CHECK:         testb [[CMP]], [[CMP]]
163*0a6a1f1dSLionel Sambuc; CHECK:         movq %rsi, %rbx
164*0a6a1f1dSLionel Sambuc; CHECK:         cmovneq %rax, %rbx
165*0a6a1f1dSLionel Sambuc; CHECK:         movq [[INCHI]], %rcx
166*0a6a1f1dSLionel Sambuc; CHECK:         cmovneq %rdx, %rcx
167*0a6a1f1dSLionel Sambuc; CHECK:         lock
168*0a6a1f1dSLionel Sambuc; CHECK:         cmpxchg16b (%rdi)
169*0a6a1f1dSLionel Sambuc; CHECK:         jne [[LOOP]]
170*0a6a1f1dSLionel Sambuc
171*0a6a1f1dSLionel Sambuc; CHECK:         movq %rax, _var
172*0a6a1f1dSLionel Sambuc; CHECK:         movq %rdx, _var+8
173*0a6a1f1dSLionel Sambuc
174*0a6a1f1dSLionel Sambuc  %val = atomicrmw max i128* %p, i128 %bits seq_cst
175*0a6a1f1dSLionel Sambuc  store i128 %val, i128* @var, align 16
176*0a6a1f1dSLionel Sambuc  ret void
177*0a6a1f1dSLionel Sambuc}
178*0a6a1f1dSLionel Sambuc
179*0a6a1f1dSLionel Sambucdefine void @fetch_and_umin(i128* %p, i128 %bits) {
180*0a6a1f1dSLionel Sambuc; CHECK-LABEL: fetch_and_umin:
181*0a6a1f1dSLionel Sambuc; CHECK-DAG:     movq %rdx, [[INCHI:%[a-z0-9]+]]
182*0a6a1f1dSLionel Sambuc; CHECK-DAG:     movq (%rdi), %rax
183*0a6a1f1dSLionel Sambuc; CHECK-DAG:     movq 8(%rdi), %rdx
184*0a6a1f1dSLionel Sambuc
185*0a6a1f1dSLionel Sambuc; CHECK: [[LOOP:.?LBB[0-9]+_[0-9]+]]:
186*0a6a1f1dSLionel Sambuc; CHECK:         cmpq %rsi, %rax
187*0a6a1f1dSLionel Sambuc; CHECK:         setbe [[CMP:%[a-z0-9]+]]
188*0a6a1f1dSLionel Sambuc; CHECK:         cmpq [[INCHI]], %rdx
189*0a6a1f1dSLionel Sambuc; CHECK:         setbe [[HICMP:%[a-z0-9]+]]
190*0a6a1f1dSLionel Sambuc; CHECK:         je [[USE_LO:.?LBB[0-9]+_[0-9]+]]
191*0a6a1f1dSLionel Sambuc
192*0a6a1f1dSLionel Sambuc; CHECK:         movb [[HICMP]], [[CMP]]
193*0a6a1f1dSLionel Sambuc; CHECK: [[USE_LO]]:
194*0a6a1f1dSLionel Sambuc; CHECK:         testb [[CMP]], [[CMP]]
195*0a6a1f1dSLionel Sambuc; CHECK:         movq %rsi, %rbx
196*0a6a1f1dSLionel Sambuc; CHECK:         cmovneq %rax, %rbx
197*0a6a1f1dSLionel Sambuc; CHECK:         movq [[INCHI]], %rcx
198*0a6a1f1dSLionel Sambuc; CHECK:         cmovneq %rdx, %rcx
199*0a6a1f1dSLionel Sambuc; CHECK:         lock
200*0a6a1f1dSLionel Sambuc; CHECK:         cmpxchg16b (%rdi)
201*0a6a1f1dSLionel Sambuc; CHECK:         jne [[LOOP]]
202*0a6a1f1dSLionel Sambuc
203*0a6a1f1dSLionel Sambuc; CHECK:         movq %rax, _var
204*0a6a1f1dSLionel Sambuc; CHECK:         movq %rdx, _var+8
205*0a6a1f1dSLionel Sambuc
206*0a6a1f1dSLionel Sambuc  %val = atomicrmw umin i128* %p, i128 %bits seq_cst
207*0a6a1f1dSLionel Sambuc  store i128 %val, i128* @var, align 16
208*0a6a1f1dSLionel Sambuc  ret void
209*0a6a1f1dSLionel Sambuc}
210*0a6a1f1dSLionel Sambuc
211*0a6a1f1dSLionel Sambucdefine void @fetch_and_umax(i128* %p, i128 %bits) {
212*0a6a1f1dSLionel Sambuc; CHECK-LABEL: fetch_and_umax:
213*0a6a1f1dSLionel Sambuc; CHECK-DAG:     movq %rdx, [[INCHI:%[a-z0-9]+]]
214*0a6a1f1dSLionel Sambuc; CHECK-DAG:     movq (%rdi), %rax
215*0a6a1f1dSLionel Sambuc; CHECK-DAG:     movq 8(%rdi), %rdx
216*0a6a1f1dSLionel Sambuc
217*0a6a1f1dSLionel Sambuc; CHECK: [[LOOP:.?LBB[0-9]+_[0-9]+]]:
218*0a6a1f1dSLionel Sambuc; CHECK:         cmpq %rax, %rsi
219*0a6a1f1dSLionel Sambuc; CHECK:         setb [[CMP:%[a-z0-9]+]]
220*0a6a1f1dSLionel Sambuc; CHECK:         cmpq [[INCHI]], %rdx
221*0a6a1f1dSLionel Sambuc; CHECK:         seta [[HICMP:%[a-z0-9]+]]
222*0a6a1f1dSLionel Sambuc; CHECK:         je [[USE_LO:.?LBB[0-9]+_[0-9]+]]
223*0a6a1f1dSLionel Sambuc
224*0a6a1f1dSLionel Sambuc; CHECK:         movb [[HICMP]], [[CMP]]
225*0a6a1f1dSLionel Sambuc; CHECK: [[USE_LO]]:
226*0a6a1f1dSLionel Sambuc; CHECK:         testb [[CMP]], [[CMP]]
227*0a6a1f1dSLionel Sambuc; CHECK:         movq %rsi, %rbx
228*0a6a1f1dSLionel Sambuc; CHECK:         cmovneq %rax, %rbx
229*0a6a1f1dSLionel Sambuc; CHECK:         movq [[INCHI]], %rcx
230*0a6a1f1dSLionel Sambuc; CHECK:         cmovneq %rdx, %rcx
231*0a6a1f1dSLionel Sambuc; CHECK:         lock
232*0a6a1f1dSLionel Sambuc; CHECK:         cmpxchg16b (%rdi)
233*0a6a1f1dSLionel Sambuc; CHECK:         jne [[LOOP]]
234*0a6a1f1dSLionel Sambuc
235*0a6a1f1dSLionel Sambuc; CHECK:         movq %rax, _var
236*0a6a1f1dSLionel Sambuc; CHECK:         movq %rdx, _var+8
237*0a6a1f1dSLionel Sambuc
238*0a6a1f1dSLionel Sambuc  %val = atomicrmw umax i128* %p, i128 %bits seq_cst
239*0a6a1f1dSLionel Sambuc  store i128 %val, i128* @var, align 16
240*0a6a1f1dSLionel Sambuc  ret void
241*0a6a1f1dSLionel Sambuc}
242*0a6a1f1dSLionel Sambuc
243*0a6a1f1dSLionel Sambucdefine i128 @atomic_load_seq_cst(i128* %p) {
244*0a6a1f1dSLionel Sambuc; CHECK-LABEL: atomic_load_seq_cst:
245*0a6a1f1dSLionel Sambuc; CHECK: xorl %eax, %eax
246*0a6a1f1dSLionel Sambuc; CHECK: xorl %edx, %edx
247*0a6a1f1dSLionel Sambuc; CHECK: xorl %ebx, %ebx
248*0a6a1f1dSLionel Sambuc; CHECK: xorl %ecx, %ecx
249*0a6a1f1dSLionel Sambuc; CHECK: lock
250*0a6a1f1dSLionel Sambuc; CHECK: cmpxchg16b (%rdi)
251*0a6a1f1dSLionel Sambuc
252*0a6a1f1dSLionel Sambuc   %r = load atomic i128* %p seq_cst, align 16
253*0a6a1f1dSLionel Sambuc   ret i128 %r
254*0a6a1f1dSLionel Sambuc}
255*0a6a1f1dSLionel Sambuc
256*0a6a1f1dSLionel Sambucdefine i128 @atomic_load_relaxed(i128* %p) {
257*0a6a1f1dSLionel Sambuc; CHECK: atomic_load_relaxed:
258*0a6a1f1dSLionel Sambuc; CHECK: xorl %eax, %eax
259*0a6a1f1dSLionel Sambuc; CHECK: xorl %edx, %edx
260*0a6a1f1dSLionel Sambuc; CHECK: xorl %ebx, %ebx
261*0a6a1f1dSLionel Sambuc; CHECK: xorl %ecx, %ecx
262*0a6a1f1dSLionel Sambuc; CHECK: lock
263*0a6a1f1dSLionel Sambuc; CHECK: cmpxchg16b (%rdi)
264*0a6a1f1dSLionel Sambuc
265*0a6a1f1dSLionel Sambuc   %r = load atomic i128* %p monotonic, align 16
266*0a6a1f1dSLionel Sambuc   ret i128 %r
267*0a6a1f1dSLionel Sambuc}
268*0a6a1f1dSLionel Sambuc
269*0a6a1f1dSLionel Sambucdefine void @atomic_store_seq_cst(i128* %p, i128 %in) {
270*0a6a1f1dSLionel Sambuc; CHECK-LABEL: atomic_store_seq_cst:
271*0a6a1f1dSLionel Sambuc; CHECK:         movq %rdx, %rcx
272*0a6a1f1dSLionel Sambuc; CHECK:         movq %rsi, %rbx
273*0a6a1f1dSLionel Sambuc; CHECK:         movq (%rdi), %rax
274*0a6a1f1dSLionel Sambuc; CHECK:         movq 8(%rdi), %rdx
275*0a6a1f1dSLionel Sambuc
276*0a6a1f1dSLionel Sambuc; CHECK: [[LOOP:.?LBB[0-9]+_[0-9]+]]:
277*0a6a1f1dSLionel Sambuc; CHECK:         lock
278*0a6a1f1dSLionel Sambuc; CHECK:         cmpxchg16b (%rdi)
279*0a6a1f1dSLionel Sambuc; CHECK:         jne [[LOOP]]
280*0a6a1f1dSLionel Sambuc; CHECK-NOT:     callq ___sync_lock_test_and_set_16
281*0a6a1f1dSLionel Sambuc
282*0a6a1f1dSLionel Sambuc   store atomic i128 %in, i128* %p seq_cst, align 16
283*0a6a1f1dSLionel Sambuc   ret void
284*0a6a1f1dSLionel Sambuc}
285*0a6a1f1dSLionel Sambuc
286*0a6a1f1dSLionel Sambucdefine void @atomic_store_release(i128* %p, i128 %in) {
287*0a6a1f1dSLionel Sambuc; CHECK-LABEL: atomic_store_release:
288*0a6a1f1dSLionel Sambuc; CHECK:         movq %rdx, %rcx
289*0a6a1f1dSLionel Sambuc; CHECK:         movq %rsi, %rbx
290*0a6a1f1dSLionel Sambuc; CHECK:         movq (%rdi), %rax
291*0a6a1f1dSLionel Sambuc; CHECK:         movq 8(%rdi), %rdx
292*0a6a1f1dSLionel Sambuc
293*0a6a1f1dSLionel Sambuc; CHECK: [[LOOP:.?LBB[0-9]+_[0-9]+]]:
294*0a6a1f1dSLionel Sambuc; CHECK:         lock
295*0a6a1f1dSLionel Sambuc; CHECK:         cmpxchg16b (%rdi)
296*0a6a1f1dSLionel Sambuc; CHECK:         jne [[LOOP]]
297*0a6a1f1dSLionel Sambuc
298*0a6a1f1dSLionel Sambuc   store atomic i128 %in, i128* %p release, align 16
299*0a6a1f1dSLionel Sambuc   ret void
300*0a6a1f1dSLionel Sambuc}
301*0a6a1f1dSLionel Sambuc
302*0a6a1f1dSLionel Sambucdefine void @atomic_store_relaxed(i128* %p, i128 %in) {
303*0a6a1f1dSLionel Sambuc; CHECK-LABEL: atomic_store_relaxed:
304*0a6a1f1dSLionel Sambuc; CHECK:         movq %rdx, %rcx
305*0a6a1f1dSLionel Sambuc; CHECK:         movq %rsi, %rbx
306*0a6a1f1dSLionel Sambuc; CHECK:         movq (%rdi), %rax
307*0a6a1f1dSLionel Sambuc; CHECK:         movq 8(%rdi), %rdx
308*0a6a1f1dSLionel Sambuc
309*0a6a1f1dSLionel Sambuc; CHECK: [[LOOP:.?LBB[0-9]+_[0-9]+]]:
310*0a6a1f1dSLionel Sambuc; CHECK:         lock
311*0a6a1f1dSLionel Sambuc; CHECK:         cmpxchg16b (%rdi)
312*0a6a1f1dSLionel Sambuc; CHECK:         jne [[LOOP]]
313*0a6a1f1dSLionel Sambuc
314*0a6a1f1dSLionel Sambuc   store atomic i128 %in, i128* %p unordered, align 16
315*0a6a1f1dSLionel Sambuc   ret void
316*0a6a1f1dSLionel Sambuc}
317