[mips] Use addiu in inline assembly tests since addi is not available in all ISA's
[oota-llvm.git] / test / CodeGen / Mips / atomic.ll
1 ; RUN: llc -march=mipsel --disable-machine-licm < %s | FileCheck %s -check-prefix=CHECK-EL
2 ; RUN: llc -march=mips   --disable-machine-licm < %s | FileCheck %s -check-prefix=CHECK-EB
3
4 @x = common global i32 0, align 4
5
6 define i32 @AtomicLoadAdd32(i32 %incr) nounwind {
7 entry:
8   %0 = atomicrmw add i32* @x, i32 %incr monotonic
9   ret i32 %0
10
11 ; CHECK-EL-LABEL:   AtomicLoadAdd32:
12 ; CHECK-EL:   lw      $[[R0:[0-9]+]], %got(x)
13 ; CHECK-EL:   $[[BB0:[A-Z_0-9]+]]:
14 ; CHECK-EL:   ll      $[[R1:[0-9]+]], 0($[[R0]])
15 ; CHECK-EL:   addu    $[[R2:[0-9]+]], $[[R1]], $4
16 ; CHECK-EL:   sc      $[[R2]], 0($[[R0]])
17 ; CHECK-EL:   beqz    $[[R2]], $[[BB0]]
18
19 ; CHECK-EB-LABEL:   AtomicLoadAdd32:
20 ; CHECK-EB:   lw      $[[R0:[0-9]+]], %got(x)
21 ; CHECK-EB:   $[[BB0:[A-Z_0-9]+]]:
22 ; CHECK-EB:   ll      $[[R1:[0-9]+]], 0($[[R0]])
23 ; CHECK-EB:   addu    $[[R2:[0-9]+]], $[[R1]], $4
24 ; CHECK-EB:   sc      $[[R2]], 0($[[R0]])
25 ; CHECK-EB:   beqz    $[[R2]], $[[BB0]]
26 }
27
28 define i32 @AtomicLoadNand32(i32 %incr) nounwind {
29 entry:
30   %0 = atomicrmw nand i32* @x, i32 %incr monotonic
31   ret i32 %0
32
33 ; CHECK-EL-LABEL:   AtomicLoadNand32:
34 ; CHECK-EL:   lw      $[[R0:[0-9]+]], %got(x)
35 ; CHECK-EL:   $[[BB0:[A-Z_0-9]+]]:
36 ; CHECK-EL:   ll      $[[R1:[0-9]+]], 0($[[R0]])
37 ; CHECK-EL:   and     $[[R3:[0-9]+]], $[[R1]], $4
38 ; CHECK-EL:   nor     $[[R2:[0-9]+]], $zero, $[[R3]]
39 ; CHECK-EL:   sc      $[[R2]], 0($[[R0]])
40 ; CHECK-EL:   beqz    $[[R2]], $[[BB0]]
41
42 ; CHECK-EB-LABEL:   AtomicLoadNand32:
43 ; CHECK-EB:   lw      $[[R0:[0-9]+]], %got(x)
44 ; CHECK-EB:   $[[BB0:[A-Z_0-9]+]]:
45 ; CHECK-EB:   ll      $[[R1:[0-9]+]], 0($[[R0]])
46 ; CHECK-EB:   and     $[[R3:[0-9]+]], $[[R1]], $4
47 ; CHECK-EB:   nor     $[[R2:[0-9]+]], $zero, $[[R3]]
48 ; CHECK-EB:   sc      $[[R2]], 0($[[R0]])
49 ; CHECK-EB:   beqz    $[[R2]], $[[BB0]]
50 }
51
52 define i32 @AtomicSwap32(i32 %newval) nounwind {
53 entry:
54   %newval.addr = alloca i32, align 4
55   store i32 %newval, i32* %newval.addr, align 4
56   %tmp = load i32* %newval.addr, align 4
57   %0 = atomicrmw xchg i32* @x, i32 %tmp monotonic
58   ret i32 %0
59
60 ; CHECK-EL-LABEL:   AtomicSwap32:
61 ; CHECK-EL:   lw      $[[R0:[0-9]+]], %got(x)
62 ; CHECK-EL:   $[[BB0:[A-Z_0-9]+]]:
63 ; CHECK-EL:   ll      ${{[0-9]+}}, 0($[[R0]])
64 ; CHECK-EL:   sc      $[[R2:[0-9]+]], 0($[[R0]])
65 ; CHECK-EL:   beqz    $[[R2]], $[[BB0]]
66
67 ; CHECK-EB-LABEL:   AtomicSwap32:
68 ; CHECK-EB:   lw      $[[R0:[0-9]+]], %got(x)
69 ; CHECK-EB:   $[[BB0:[A-Z_0-9]+]]:
70 ; CHECK-EB:   ll      ${{[0-9]+}}, 0($[[R0]])
71 ; CHECK-EB:   sc      $[[R2:[0-9]+]], 0($[[R0]])
72 ; CHECK-EB:   beqz    $[[R2]], $[[BB0]]
73 }
74
75 define i32 @AtomicCmpSwap32(i32 %oldval, i32 %newval) nounwind {
76 entry:
77   %newval.addr = alloca i32, align 4
78   store i32 %newval, i32* %newval.addr, align 4
79   %tmp = load i32* %newval.addr, align 4
80   %0 = cmpxchg i32* @x, i32 %oldval, i32 %tmp monotonic monotonic
81   ret i32 %0
82
83 ; CHECK-EL-LABEL:   AtomicCmpSwap32:
84 ; CHECK-EL:   lw      $[[R0:[0-9]+]], %got(x)
85 ; CHECK-EL:   $[[BB0:[A-Z_0-9]+]]:
86 ; CHECK-EL:   ll      $2, 0($[[R0]])
87 ; CHECK-EL:   bne     $2, $4, $[[BB1:[A-Z_0-9]+]]
88 ; CHECK-EL:   sc      $[[R2:[0-9]+]], 0($[[R0]])
89 ; CHECK-EL:   beqz    $[[R2]], $[[BB0]]
90 ; CHECK-EL:   $[[BB1]]:
91
92 ; CHECK-EB-LABEL:   AtomicCmpSwap32:
93 ; CHECK-EB:   lw      $[[R0:[0-9]+]], %got(x)
94 ; CHECK-EB:   $[[BB0:[A-Z_0-9]+]]:
95 ; CHECK-EB:   ll      $2, 0($[[R0]])
96 ; CHECK-EB:   bne     $2, $4, $[[BB1:[A-Z_0-9]+]]
97 ; CHECK-EB:   sc      $[[R2:[0-9]+]], 0($[[R0]])
98 ; CHECK-EB:   beqz    $[[R2]], $[[BB0]]
99 ; CHECK-EB:   $[[BB1]]:
100 }
101
102
103
104 @y = common global i8 0, align 1
105
106 define signext i8 @AtomicLoadAdd8(i8 signext %incr) nounwind {
107 entry:
108   %0 = atomicrmw add i8* @y, i8 %incr monotonic
109   ret i8 %0
110
111 ; CHECK-EL-LABEL:   AtomicLoadAdd8:
112 ; CHECK-EL:   lw      $[[R0:[0-9]+]], %got(y)
113 ; CHECK-EL:   addiu   $[[R1:[0-9]+]], $zero, -4
114 ; CHECK-EL:   and     $[[R2:[0-9]+]], $[[R0]], $[[R1]]
115 ; CHECK-EL:   andi    $[[R3:[0-9]+]], $[[R0]], 3
116 ; CHECK-EL:   sll     $[[R4:[0-9]+]], $[[R3]], 3
117 ; CHECK-EL:   ori     $[[R5:[0-9]+]], $zero, 255
118 ; CHECK-EL:   sllv    $[[R6:[0-9]+]], $[[R5]], $[[R4]]
119 ; CHECK-EL:   nor     $[[R7:[0-9]+]], $zero, $[[R6]]
120 ; CHECK-EL:   sllv    $[[R9:[0-9]+]], $4, $[[R4]]
121
122 ; CHECK-EL:   $[[BB0:[A-Z_0-9]+]]:
123 ; CHECK-EL:   ll      $[[R10:[0-9]+]], 0($[[R2]])
124 ; CHECK-EL:   addu    $[[R11:[0-9]+]], $[[R10]], $[[R9]]
125 ; CHECK-EL:   and     $[[R12:[0-9]+]], $[[R11]], $[[R6]]
126 ; CHECK-EL:   and     $[[R13:[0-9]+]], $[[R10]], $[[R7]]
127 ; CHECK-EL:   or      $[[R14:[0-9]+]], $[[R13]], $[[R12]]
128 ; CHECK-EL:   sc      $[[R14]], 0($[[R2]])
129 ; CHECK-EL:   beqz    $[[R14]], $[[BB0]]
130
131 ; CHECK-EL:   and     $[[R15:[0-9]+]], $[[R10]], $[[R6]]
132 ; CHECK-EL:   srlv    $[[R16:[0-9]+]], $[[R15]], $[[R4]]
133 ; CHECK-EL:   sll     $[[R17:[0-9]+]], $[[R16]], 24
134 ; CHECK-EL:   sra     $2, $[[R17]], 24
135
136 ; CHECK-EB-LABEL:   AtomicLoadAdd8:
137 ; CHECK-EB:   lw      $[[R0:[0-9]+]], %got(y)
138 ; CHECK-EB:   addiu   $[[R1:[0-9]+]], $zero, -4
139 ; CHECK-EB:   and     $[[R2:[0-9]+]], $[[R0]], $[[R1]]
140 ; CHECK-EB:   andi    $[[R3:[0-9]+]], $[[R0]], 3
141 ; CHECK-EB:   xori    $[[R4:[0-9]+]], $[[R3]], 3
142 ; CHECK-EB:   sll     $[[R5:[0-9]+]], $[[R4]], 3
143 ; CHECK-EB:   ori     $[[R6:[0-9]+]], $zero, 255
144 ; CHECK-EB:   sllv    $[[R7:[0-9]+]], $[[R6]], $[[R5]]
145 ; CHECK-EB:   nor     $[[R8:[0-9]+]], $zero, $[[R7]]
146 ; CHECK-EB:   sllv    $[[R9:[0-9]+]], $4, $[[R5]]
147
148 ; CHECK-EB:   $[[BB0:[A-Z_0-9]+]]:
149 ; CHECK-EB:   ll      $[[R10:[0-9]+]], 0($[[R2]])
150 ; CHECK-EB:   addu    $[[R11:[0-9]+]], $[[R10]], $[[R9]]
151 ; CHECK-EB:   and     $[[R12:[0-9]+]], $[[R11]], $[[R7]]
152 ; CHECK-EB:   and     $[[R13:[0-9]+]], $[[R10]], $[[R8]]
153 ; CHECK-EB:   or      $[[R14:[0-9]+]], $[[R13]], $[[R12]]
154 ; CHECK-EB:   sc      $[[R14]], 0($[[R2]])
155 ; CHECK-EB:   beqz    $[[R14]], $[[BB0]]
156
157 ; CHECK-EB:   and     $[[R15:[0-9]+]], $[[R10]], $[[R7]]
158 ; CHECK-EB:   srlv    $[[R16:[0-9]+]], $[[R15]], $[[R5]]
159 ; CHECK-EB:   sll     $[[R17:[0-9]+]], $[[R16]], 24
160 ; CHECK-EB:   sra     $2, $[[R17]], 24
161 }
162
163 define signext i8 @AtomicLoadSub8(i8 signext %incr) nounwind {
164 entry:
165   %0 = atomicrmw sub i8* @y, i8 %incr monotonic
166   ret i8 %0
167
168 ; CHECK-EL-LABEL:   AtomicLoadSub8:
169 ; CHECK-EL:   lw      $[[R0:[0-9]+]], %got(y)
170 ; CHECK-EL:   addiu   $[[R1:[0-9]+]], $zero, -4
171 ; CHECK-EL:   and     $[[R2:[0-9]+]], $[[R0]], $[[R1]]
172 ; CHECK-EL:   andi    $[[R3:[0-9]+]], $[[R0]], 3
173 ; CHECK-EL:   sll     $[[R4:[0-9]+]], $[[R3]], 3
174 ; CHECK-EL:   ori     $[[R5:[0-9]+]], $zero, 255
175 ; CHECK-EL:   sllv    $[[R6:[0-9]+]], $[[R5]], $[[R4]]
176 ; CHECK-EL:   nor     $[[R7:[0-9]+]], $zero, $[[R6]]
177 ; CHECK-EL:   sllv     $[[R9:[0-9]+]], $4, $[[R4]]
178
179 ; CHECK-EL:   $[[BB0:[A-Z_0-9]+]]:
180 ; CHECK-EL:   ll      $[[R10:[0-9]+]], 0($[[R2]])
181 ; CHECK-EL:   subu    $[[R11:[0-9]+]], $[[R10]], $[[R9]]
182 ; CHECK-EL:   and     $[[R12:[0-9]+]], $[[R11]], $[[R6]]
183 ; CHECK-EL:   and     $[[R13:[0-9]+]], $[[R10]], $[[R7]]
184 ; CHECK-EL:   or      $[[R14:[0-9]+]], $[[R13]], $[[R12]]
185 ; CHECK-EL:   sc      $[[R14]], 0($[[R2]])
186 ; CHECK-EL:   beqz    $[[R14]], $[[BB0]]
187
188 ; CHECK-EL:   and     $[[R15:[0-9]+]], $[[R10]], $[[R6]]
189 ; CHECK-EL:   srlv    $[[R16:[0-9]+]], $[[R15]], $[[R4]]
190 ; CHECK-EL:   sll     $[[R17:[0-9]+]], $[[R16]], 24
191 ; CHECK-EL:   sra     $2, $[[R17]], 24
192
193 ; CHECK-EB-LABEL:   AtomicLoadSub8:
194 ; CHECK-EB:   lw      $[[R0:[0-9]+]], %got(y)
195 ; CHECK-EB:   addiu   $[[R1:[0-9]+]], $zero, -4
196 ; CHECK-EB:   and     $[[R2:[0-9]+]], $[[R0]], $[[R1]]
197 ; CHECK-EB:   andi    $[[R3:[0-9]+]], $[[R0]], 3
198 ; CHECK-EB:   xori    $[[R4:[0-9]+]], $[[R3]], 3
199 ; CHECK-EB:   sll     $[[R5:[0-9]+]], $[[R4]], 3
200 ; CHECK-EB:   ori     $[[R6:[0-9]+]], $zero, 255
201 ; CHECK-EB:   sllv    $[[R7:[0-9]+]], $[[R6]], $[[R5]]
202 ; CHECK-EB:   nor     $[[R8:[0-9]+]], $zero, $[[R7]]
203 ; CHECK-EB:   sllv    $[[R9:[0-9]+]], $4, $[[R5]]
204
205 ; CHECK-EB:   $[[BB0:[A-Z_0-9]+]]:
206 ; CHECK-EB:   ll      $[[R10:[0-9]+]], 0($[[R2]])
207 ; CHECK-EB:   subu    $[[R11:[0-9]+]], $[[R10]], $[[R9]]
208 ; CHECK-EB:   and     $[[R12:[0-9]+]], $[[R11]], $[[R7]]
209 ; CHECK-EB:   and     $[[R13:[0-9]+]], $[[R10]], $[[R8]]
210 ; CHECK-EB:   or      $[[R14:[0-9]+]], $[[R13]], $[[R12]]
211 ; CHECK-EB:   sc      $[[R14]], 0($[[R2]])
212 ; CHECK-EB:   beqz    $[[R14]], $[[BB0]]
213
214 ; CHECK-EB:   and     $[[R15:[0-9]+]], $[[R10]], $[[R7]]
215 ; CHECK-EB:   srlv    $[[R16:[0-9]+]], $[[R15]], $[[R5]]
216 ; CHECK-EB:   sll     $[[R17:[0-9]+]], $[[R16]], 24
217 ; CHECK-EB:   sra     $2, $[[R17]], 24
218 }
219
220 define signext i8 @AtomicLoadNand8(i8 signext %incr) nounwind {
221 entry:
222   %0 = atomicrmw nand i8* @y, i8 %incr monotonic
223   ret i8 %0
224
225 ; CHECK-EL-LABEL:   AtomicLoadNand8:
226 ; CHECK-EL:   lw      $[[R0:[0-9]+]], %got(y)
227 ; CHECK-EL:   addiu   $[[R1:[0-9]+]], $zero, -4
228 ; CHECK-EL:   and     $[[R2:[0-9]+]], $[[R0]], $[[R1]]
229 ; CHECK-EL:   andi    $[[R3:[0-9]+]], $[[R0]], 3
230 ; CHECK-EL:   sll     $[[R4:[0-9]+]], $[[R3]], 3
231 ; CHECK-EL:   ori     $[[R5:[0-9]+]], $zero, 255
232 ; CHECK-EL:   sllv    $[[R6:[0-9]+]], $[[R5]], $[[R4]]
233 ; CHECK-EL:   nor     $[[R7:[0-9]+]], $zero, $[[R6]]
234 ; CHECK-EL:   sllv    $[[R9:[0-9]+]], $4, $[[R4]]
235
236 ; CHECK-EL:   $[[BB0:[A-Z_0-9]+]]:
237 ; CHECK-EL:   ll      $[[R10:[0-9]+]], 0($[[R2]])
238 ; CHECK-EL:   and     $[[R18:[0-9]+]], $[[R10]], $[[R9]]
239 ; CHECK-EL:   nor     $[[R11:[0-9]+]], $zero, $[[R18]]
240 ; CHECK-EL:   and     $[[R12:[0-9]+]], $[[R11]], $[[R6]]
241 ; CHECK-EL:   and     $[[R13:[0-9]+]], $[[R10]], $[[R7]]
242 ; CHECK-EL:   or      $[[R14:[0-9]+]], $[[R13]], $[[R12]]
243 ; CHECK-EL:   sc      $[[R14]], 0($[[R2]])
244 ; CHECK-EL:   beqz    $[[R14]], $[[BB0]]
245
246 ; CHECK-EL:   and     $[[R15:[0-9]+]], $[[R10]], $[[R6]]
247 ; CHECK-EL:   srlv    $[[R16:[0-9]+]], $[[R15]], $[[R4]]
248 ; CHECK-EL:   sll     $[[R17:[0-9]+]], $[[R16]], 24
249 ; CHECK-EL:   sra     $2, $[[R17]], 24
250
251 ; CHECK-EB-LABEL:   AtomicLoadNand8:
252 ; CHECK-EB:   lw      $[[R0:[0-9]+]], %got(y)
253 ; CHECK-EB:   addiu   $[[R1:[0-9]+]], $zero, -4
254 ; CHECK-EB:   and     $[[R2:[0-9]+]], $[[R0]], $[[R1]]
255 ; CHECK-EB:   andi    $[[R3:[0-9]+]], $[[R0]], 3
256 ; CHECK-EB:   xori    $[[R4:[0-9]+]], $[[R3]], 3
257 ; CHECK-EB:   sll     $[[R5:[0-9]+]], $[[R4]], 3
258 ; CHECK-EB:   ori     $[[R6:[0-9]+]], $zero, 255
259 ; CHECK-EB:   sllv    $[[R7:[0-9]+]], $[[R6]], $[[R5]]
260 ; CHECK-EB:   nor     $[[R8:[0-9]+]], $zero, $[[R7]]
261 ; CHECK-EB:   sllv    $[[R9:[0-9]+]], $4, $[[R5]]
262
263 ; CHECK-EB:   $[[BB0:[A-Z_0-9]+]]:
264 ; CHECK-EB:   ll      $[[R10:[0-9]+]], 0($[[R2]])
265 ; CHECK-EB:   and     $[[R18:[0-9]+]], $[[R10]], $[[R9]]
266 ; CHECK-EB:   nor     $[[R11:[0-9]+]], $zero, $[[R18]]
267 ; CHECK-EB:   and     $[[R12:[0-9]+]], $[[R11]], $[[R7]]
268 ; CHECK-EB:   and     $[[R13:[0-9]+]], $[[R10]], $[[R8]]
269 ; CHECK-EB:   or      $[[R14:[0-9]+]], $[[R13]], $[[R12]]
270 ; CHECK-EB:   sc      $[[R14]], 0($[[R2]])
271 ; CHECK-EB:   beqz    $[[R14]], $[[BB0]]
272
273 ; CHECK-EB:   and     $[[R15:[0-9]+]], $[[R10]], $[[R7]]
274 ; CHECK-EB:   srlv    $[[R16:[0-9]+]], $[[R15]], $[[R5]]
275 ; CHECK-EB:   sll     $[[R17:[0-9]+]], $[[R16]], 24
276 ; CHECK-EB:   sra     $2, $[[R17]], 24
277 }
278
279 define signext i8 @AtomicSwap8(i8 signext %newval) nounwind {
280 entry:
281   %0 = atomicrmw xchg i8* @y, i8 %newval monotonic
282   ret i8 %0
283
284 ; CHECK-EL-LABEL:   AtomicSwap8:
285 ; CHECK-EL:   lw      $[[R0:[0-9]+]], %got(y)
286 ; CHECK-EL:   addiu   $[[R1:[0-9]+]], $zero, -4
287 ; CHECK-EL:   and     $[[R2:[0-9]+]], $[[R0]], $[[R1]]
288 ; CHECK-EL:   andi    $[[R3:[0-9]+]], $[[R0]], 3
289 ; CHECK-EL:   sll     $[[R4:[0-9]+]], $[[R3]], 3
290 ; CHECK-EL:   ori     $[[R5:[0-9]+]], $zero, 255
291 ; CHECK-EL:   sllv    $[[R6:[0-9]+]], $[[R5]], $[[R4]]
292 ; CHECK-EL:   nor     $[[R7:[0-9]+]], $zero, $[[R6]]
293 ; CHECK-EL:   sllv    $[[R9:[0-9]+]], $4, $[[R4]]
294
295 ; CHECK-EL:   $[[BB0:[A-Z_0-9]+]]:
296 ; CHECK-EL:   ll      $[[R10:[0-9]+]], 0($[[R2]])
297 ; CHECK-EL:   and     $[[R18:[0-9]+]], $[[R9]], $[[R6]]
298 ; CHECK-EL:   and     $[[R13:[0-9]+]], $[[R10]], $[[R7]]
299 ; CHECK-EL:   or      $[[R14:[0-9]+]], $[[R13]], $[[R18]]
300 ; CHECK-EL:   sc      $[[R14]], 0($[[R2]])
301 ; CHECK-EL:   beqz    $[[R14]], $[[BB0]]
302
303 ; CHECK-EL:   and     $[[R15:[0-9]+]], $[[R10]], $[[R6]]
304 ; CHECK-EL:   srlv    $[[R16:[0-9]+]], $[[R15]], $[[R4]]
305 ; CHECK-EL:   sll     $[[R17:[0-9]+]], $[[R16]], 24
306 ; CHECK-EL:   sra     $2, $[[R17]], 24
307
308 ; CHECK-EB-LABEL:   AtomicSwap8:
309 ; CHECK-EB:   lw      $[[R0:[0-9]+]], %got(y)
310 ; CHECK-EB:   addiu   $[[R1:[0-9]+]], $zero, -4
311 ; CHECK-EB:   and     $[[R2:[0-9]+]], $[[R0]], $[[R1]]
312 ; CHECK-EB:   andi    $[[R3:[0-9]+]], $[[R0]], 3
313 ; CHECK-EB:   xori    $[[R4:[0-9]+]], $[[R3]], 3
314 ; CHECK-EB:   sll     $[[R5:[0-9]+]], $[[R4]], 3
315 ; CHECK-EB:   ori     $[[R6:[0-9]+]], $zero, 255
316 ; CHECK-EB:   sllv    $[[R7:[0-9]+]], $[[R6]], $[[R5]]
317 ; CHECK-EB:   nor     $[[R8:[0-9]+]], $zero, $[[R7]]
318 ; CHECK-EB:   sllv    $[[R9:[0-9]+]], $4, $[[R5]]
319
320 ; CHECK-EB:   $[[BB0:[A-Z_0-9]+]]:
321 ; CHECK-EB:   ll      $[[R10:[0-9]+]], 0($[[R2]])
322 ; CHECK-EB:   and     $[[R18:[0-9]+]], $[[R9]], $[[R7]]
323 ; CHECK-EB:   and     $[[R13:[0-9]+]], $[[R10]], $[[R8]]
324 ; CHECK-EB:   or      $[[R14:[0-9]+]], $[[R13]], $[[R18]]
325 ; CHECK-EB:   sc      $[[R14]], 0($[[R2]])
326 ; CHECK-EB:   beqz    $[[R14]], $[[BB0]]
327
328 ; CHECK-EB:   and     $[[R15:[0-9]+]], $[[R10]], $[[R7]]
329 ; CHECK-EB:   srlv    $[[R16:[0-9]+]], $[[R15]], $[[R5]]
330 ; CHECK-EB:   sll     $[[R17:[0-9]+]], $[[R16]], 24
331 ; CHECK-EB:   sra     $2, $[[R17]], 24
332 }
333
334 define signext i8 @AtomicCmpSwap8(i8 signext %oldval, i8 signext %newval) nounwind {
335 entry:
336   %0 = cmpxchg i8* @y, i8 %oldval, i8 %newval monotonic monotonic
337   ret i8 %0
338
339 ; CHECK-EL-LABEL:   AtomicCmpSwap8:
340 ; CHECK-EL:   lw      $[[R0:[0-9]+]], %got(y)
341 ; CHECK-EL:   addiu   $[[R1:[0-9]+]], $zero, -4
342 ; CHECK-EL:   and     $[[R2:[0-9]+]], $[[R0]], $[[R1]]
343 ; CHECK-EL:   andi    $[[R3:[0-9]+]], $[[R0]], 3
344 ; CHECK-EL:   sll     $[[R4:[0-9]+]], $[[R3]], 3
345 ; CHECK-EL:   ori     $[[R5:[0-9]+]], $zero, 255
346 ; CHECK-EL:   sllv    $[[R6:[0-9]+]], $[[R5]], $[[R4]]
347 ; CHECK-EL:   nor     $[[R7:[0-9]+]], $zero, $[[R6]]
348 ; CHECK-EL:   andi    $[[R8:[0-9]+]], $4, 255
349 ; CHECK-EL:   sllv    $[[R9:[0-9]+]], $[[R8]], $[[R4]]
350 ; CHECK-EL:   andi    $[[R10:[0-9]+]], $5, 255
351 ; CHECK-EL:   sllv    $[[R11:[0-9]+]], $[[R10]], $[[R4]]
352
353 ; CHECK-EL:   $[[BB0:[A-Z_0-9]+]]:
354 ; CHECK-EL:   ll      $[[R12:[0-9]+]], 0($[[R2]])
355 ; CHECK-EL:   and     $[[R13:[0-9]+]], $[[R12]], $[[R6]]
356 ; CHECK-EL:   bne     $[[R13]], $[[R9]], $[[BB1:[A-Z_0-9]+]]
357
358 ; CHECK-EL:   and     $[[R14:[0-9]+]], $[[R12]], $[[R7]]
359 ; CHECK-EL:   or      $[[R15:[0-9]+]], $[[R14]], $[[R11]]
360 ; CHECK-EL:   sc      $[[R15]], 0($[[R2]])
361 ; CHECK-EL:   beqz    $[[R15]], $[[BB0]]
362
363 ; CHECK-EL:   $[[BB1]]:
364 ; CHECK-EL:   srlv    $[[R16:[0-9]+]], $[[R13]], $[[R4]]
365 ; CHECK-EL:   sll     $[[R17:[0-9]+]], $[[R16]], 24
366 ; CHECK-EL:   sra     $2, $[[R17]], 24
367
368 ; CHECK-EB-LABEL:   AtomicCmpSwap8:
369 ; CHECK-EB:   lw      $[[R0:[0-9]+]], %got(y)
370 ; CHECK-EB:   addiu   $[[R1:[0-9]+]], $zero, -4
371 ; CHECK-EB:   and     $[[R2:[0-9]+]], $[[R0]], $[[R1]]
372 ; CHECK-EB:   andi    $[[R3:[0-9]+]], $[[R0]], 3
373 ; CHECK-EB:   xori    $[[R4:[0-9]+]], $[[R3]], 3
374 ; CHECK-EB:   sll     $[[R5:[0-9]+]], $[[R4]], 3
375 ; CHECK-EB:   ori     $[[R6:[0-9]+]], $zero, 255
376 ; CHECK-EB:   sllv    $[[R7:[0-9]+]], $[[R6]], $[[R5]]
377 ; CHECK-EB:   nor     $[[R8:[0-9]+]], $zero, $[[R7]]
378 ; CHECK-EB:   andi    $[[R9:[0-9]+]], $4, 255
379 ; CHECK-EB:   sllv    $[[R10:[0-9]+]], $[[R9]], $[[R5]]
380 ; CHECK-EB:   andi    $[[R11:[0-9]+]], $5, 255
381 ; CHECK-EB:   sllv    $[[R12:[0-9]+]], $[[R11]], $[[R5]]
382
383 ; CHECK-EB:   $[[BB0:[A-Z_0-9]+]]:
384 ; CHECK-EB:   ll      $[[R13:[0-9]+]], 0($[[R2]])
385 ; CHECK-EB:   and     $[[R14:[0-9]+]], $[[R13]], $[[R7]]
386 ; CHECK-EB:   bne     $[[R14]], $[[R10]], $[[BB1:[A-Z_0-9]+]]
387
388 ; CHECK-EB:   and     $[[R15:[0-9]+]], $[[R13]], $[[R8]]
389 ; CHECK-EB:   or      $[[R16:[0-9]+]], $[[R15]], $[[R12]]
390 ; CHECK-EB:   sc      $[[R16]], 0($[[R2]])
391 ; CHECK-EB:   beqz    $[[R16]], $[[BB0]]
392
393 ; CHECK-EB:   $[[BB1]]:
394 ; CHECK-EB:   srlv    $[[R17:[0-9]+]], $[[R14]], $[[R5]]
395 ; CHECK-EB:   sll     $[[R18:[0-9]+]], $[[R17]], 24
396 ; CHECK-EB:   sra     $2, $[[R18]], 24
397 }
398
399 @countsint = common global i32 0, align 4
400
401 define i32 @CheckSync(i32 %v) nounwind noinline {
402 entry:
403   %0 = atomicrmw add i32* @countsint, i32 %v seq_cst
404   ret i32 %0 
405
406 ; CHECK-EL-LABEL:   CheckSync:
407 ; CHECK-EL:   sync 0
408 ; CHECK-EL:   ll
409 ; CHECK-EL:   sc
410 ; CHECK-EL:   beq
411 ; CHECK-EL:   sync 0
412
413 ; CHECK-EB-LABEL:   CheckSync:
414 ; CHECK-EB:   sync 0
415 ; CHECK-EB:   ll
416 ; CHECK-EB:   sc
417 ; CHECK-EB:   beq
418 ; CHECK-EB:   sync 0
419 }
420
421 ; make sure that this assertion in
422 ; TwoAddressInstructionPass::TryInstructionTransform does not fail:
423 ;
424 ; line 1203: assert(TargetRegisterInfo::isVirtualRegister(regB) &&
425 ;
426 ; it failed when MipsDAGToDAGISel::ReplaceUsesWithZeroReg replaced an
427 ; operand of an atomic instruction with register $zero. 
428 @a = external global i32
429
430 define i32 @zeroreg() nounwind {
431 entry:
432   %0 = cmpxchg i32* @a, i32 1, i32 0 seq_cst seq_cst
433   %1 = icmp eq i32 %0, 1
434   %conv = zext i1 %1 to i32
435   ret i32 %conv
436 }