1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; Test the instruction sequences produced by atomicrmw instructions. In
3; particular, ensure there are no stores/spills inserted between the exclusive
4; load and stores, which would invalidate the exclusive monitor.
5
6; RUN: llc -mtriple=armv8-unknown-none-eabi -O0 -o - %s | FileCheck %s --check-prefix=CHECK-ARM8
7; RUN: llc -mtriple=armv6-unknown-none-eabi -O0 -o - %s | FileCheck %s --check-prefix=CHECK-ARM6
8; RUN: llc -mtriple=thumbv7-unknown-none-eabi -O0 -o - %s | FileCheck %s --check-prefix=CHECK-THUMB7
9; RUN: llc -mtriple=thumbv6-unknown-none-eabi -O0 -o - %s | FileCheck %s --check-prefix=CHECK-THUMB6
10; RUN: llc -mtriple=thumbv8m.base-unknown-none-eabi -O0 -o - %s | FileCheck %s --check-prefix=CHECK-THUMB8BASE
11
12@atomic_i8 = external global i8
13@atomic_i16 = external global i16
14@atomic_i32 = external global i32
15@atomic_i64 = external global i64
16
17define i8 @test_xchg_i8() {
18; CHECK-ARM8-LABEL: test_xchg_i8:
19; CHECK-ARM8:       @ %bb.0: @ %entry
20; CHECK-ARM8-NEXT:    .pad #8
21; CHECK-ARM8-NEXT:    sub sp, sp, #8
22; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i8
23; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i8
24; CHECK-ARM8-NEXT:    ldrb r0, [r0]
25; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
26; CHECK-ARM8-NEXT:    b .LBB0_1
27; CHECK-ARM8-NEXT:  .LBB0_1: @ %atomicrmw.start
28; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
29; CHECK-ARM8-NEXT:    @ Child Loop BB0_2 Depth 2
30; CHECK-ARM8-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
31; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i8
32; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i8
33; CHECK-ARM8-NEXT:    mov r12, #1
34; CHECK-ARM8-NEXT:    uxtb r1, r1
35; CHECK-ARM8-NEXT:  .LBB0_2: @ %atomicrmw.start
36; CHECK-ARM8-NEXT:    @ Parent Loop BB0_1 Depth=1
37; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
38; CHECK-ARM8-NEXT:    ldrexb r0, [r3]
39; CHECK-ARM8-NEXT:    cmp r0, r1
40; CHECK-ARM8-NEXT:    bne .LBB0_4
41; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
42; CHECK-ARM8-NEXT:    @ in Loop: Header=BB0_2 Depth=2
43; CHECK-ARM8-NEXT:    strexb r2, r12, [r3]
44; CHECK-ARM8-NEXT:    cmp r2, #0
45; CHECK-ARM8-NEXT:    bne .LBB0_2
46; CHECK-ARM8-NEXT:  .LBB0_4: @ %atomicrmw.start
47; CHECK-ARM8-NEXT:    @ in Loop: Header=BB0_1 Depth=1
48; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
49; CHECK-ARM8-NEXT:    uxtb r1, r1
50; CHECK-ARM8-NEXT:    sub r1, r0, r1
51; CHECK-ARM8-NEXT:    clz r1, r1
52; CHECK-ARM8-NEXT:    lsr r1, r1, #5
53; CHECK-ARM8-NEXT:    cmp r1, #1
54; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
55; CHECK-ARM8-NEXT:    bne .LBB0_1
56; CHECK-ARM8-NEXT:    b .LBB0_5
57; CHECK-ARM8-NEXT:  .LBB0_5: @ %atomicrmw.end
58; CHECK-ARM8-NEXT:    ldr r0, [sp] @ 4-byte Reload
59; CHECK-ARM8-NEXT:    add sp, sp, #8
60; CHECK-ARM8-NEXT:    bx lr
61;
62; CHECK-ARM6-LABEL: test_xchg_i8:
63; CHECK-ARM6:       @ %bb.0: @ %entry
64; CHECK-ARM6-NEXT:    .pad #8
65; CHECK-ARM6-NEXT:    sub sp, sp, #8
66; CHECK-ARM6-NEXT:    ldr r0, .LCPI0_0
67; CHECK-ARM6-NEXT:    ldrb r0, [r0]
68; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
69; CHECK-ARM6-NEXT:    b .LBB0_1
70; CHECK-ARM6-NEXT:  .LBB0_1: @ %atomicrmw.start
71; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
72; CHECK-ARM6-NEXT:    @ Child Loop BB0_2 Depth 2
73; CHECK-ARM6-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
74; CHECK-ARM6-NEXT:    ldr r3, .LCPI0_0
75; CHECK-ARM6-NEXT:    mov r12, #1
76; CHECK-ARM6-NEXT:    uxtb r1, r1
77; CHECK-ARM6-NEXT:  .LBB0_2: @ %atomicrmw.start
78; CHECK-ARM6-NEXT:    @ Parent Loop BB0_1 Depth=1
79; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
80; CHECK-ARM6-NEXT:    ldrexb r0, [r3]
81; CHECK-ARM6-NEXT:    cmp r0, r1
82; CHECK-ARM6-NEXT:    bne .LBB0_4
83; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
84; CHECK-ARM6-NEXT:    @ in Loop: Header=BB0_2 Depth=2
85; CHECK-ARM6-NEXT:    strexb r2, r12, [r3]
86; CHECK-ARM6-NEXT:    cmp r2, #0
87; CHECK-ARM6-NEXT:    bne .LBB0_2
88; CHECK-ARM6-NEXT:  .LBB0_4: @ %atomicrmw.start
89; CHECK-ARM6-NEXT:    @ in Loop: Header=BB0_1 Depth=1
90; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
91; CHECK-ARM6-NEXT:    uxtb r1, r1
92; CHECK-ARM6-NEXT:    sub r1, r0, r1
93; CHECK-ARM6-NEXT:    clz r1, r1
94; CHECK-ARM6-NEXT:    lsr r1, r1, #5
95; CHECK-ARM6-NEXT:    cmp r1, #1
96; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
97; CHECK-ARM6-NEXT:    bne .LBB0_1
98; CHECK-ARM6-NEXT:    b .LBB0_5
99; CHECK-ARM6-NEXT:  .LBB0_5: @ %atomicrmw.end
100; CHECK-ARM6-NEXT:    ldr r0, [sp] @ 4-byte Reload
101; CHECK-ARM6-NEXT:    add sp, sp, #8
102; CHECK-ARM6-NEXT:    bx lr
103; CHECK-ARM6-NEXT:    .p2align 2
104; CHECK-ARM6-NEXT:  @ %bb.6:
105; CHECK-ARM6-NEXT:  .LCPI0_0:
106; CHECK-ARM6-NEXT:    .long atomic_i8
107;
108; CHECK-THUMB7-LABEL: test_xchg_i8:
109; CHECK-THUMB7:       @ %bb.0: @ %entry
110; CHECK-THUMB7-NEXT:    .pad #8
111; CHECK-THUMB7-NEXT:    sub sp, #8
112; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i8
113; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i8
114; CHECK-THUMB7-NEXT:    ldrb r0, [r0]
115; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
116; CHECK-THUMB7-NEXT:    b .LBB0_1
117; CHECK-THUMB7-NEXT:  .LBB0_1: @ %atomicrmw.start
118; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
119; CHECK-THUMB7-NEXT:    @ Child Loop BB0_2 Depth 2
120; CHECK-THUMB7-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
121; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i8
122; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i8
123; CHECK-THUMB7-NEXT:    mov.w r12, #1
124; CHECK-THUMB7-NEXT:    uxtb r1, r1
125; CHECK-THUMB7-NEXT:  .LBB0_2: @ %atomicrmw.start
126; CHECK-THUMB7-NEXT:    @ Parent Loop BB0_1 Depth=1
127; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
128; CHECK-THUMB7-NEXT:    ldrexb r0, [r3]
129; CHECK-THUMB7-NEXT:    cmp r0, r1
130; CHECK-THUMB7-NEXT:    bne .LBB0_4
131; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
132; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB0_2 Depth=2
133; CHECK-THUMB7-NEXT:    strexb r2, r12, [r3]
134; CHECK-THUMB7-NEXT:    cmp r2, #0
135; CHECK-THUMB7-NEXT:    bne .LBB0_2
136; CHECK-THUMB7-NEXT:  .LBB0_4: @ %atomicrmw.start
137; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB0_1 Depth=1
138; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
139; CHECK-THUMB7-NEXT:    uxtb r1, r1
140; CHECK-THUMB7-NEXT:    subs r1, r0, r1
141; CHECK-THUMB7-NEXT:    clz r1, r1
142; CHECK-THUMB7-NEXT:    lsrs r1, r1, #5
143; CHECK-THUMB7-NEXT:    cmp r1, #1
144; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
145; CHECK-THUMB7-NEXT:    bne .LBB0_1
146; CHECK-THUMB7-NEXT:    b .LBB0_5
147; CHECK-THUMB7-NEXT:  .LBB0_5: @ %atomicrmw.end
148; CHECK-THUMB7-NEXT:    ldr r0, [sp] @ 4-byte Reload
149; CHECK-THUMB7-NEXT:    add sp, #8
150; CHECK-THUMB7-NEXT:    bx lr
151;
152; CHECK-THUMB6-LABEL: test_xchg_i8:
153; CHECK-THUMB6:       @ %bb.0: @ %entry
154; CHECK-THUMB6-NEXT:    .save {r7, lr}
155; CHECK-THUMB6-NEXT:    push {r7, lr}
156; CHECK-THUMB6-NEXT:    ldr r0, .LCPI0_0
157; CHECK-THUMB6-NEXT:    movs r1, #1
158; CHECK-THUMB6-NEXT:    bl __sync_lock_test_and_set_1
159; CHECK-THUMB6-NEXT:    pop {r7, pc}
160; CHECK-THUMB6-NEXT:    .p2align 2
161; CHECK-THUMB6-NEXT:  @ %bb.1:
162; CHECK-THUMB6-NEXT:  .LCPI0_0:
163; CHECK-THUMB6-NEXT:    .long atomic_i8
164;
165; CHECK-THUMB8BASE-LABEL: test_xchg_i8:
166; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
167; CHECK-THUMB8BASE-NEXT:    .save {r4, lr}
168; CHECK-THUMB8BASE-NEXT:    push {r4, lr}
169; CHECK-THUMB8BASE-NEXT:    .pad #8
170; CHECK-THUMB8BASE-NEXT:    sub sp, #8
171; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i8
172; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i8
173; CHECK-THUMB8BASE-NEXT:    ldrb r0, [r0]
174; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
175; CHECK-THUMB8BASE-NEXT:    b .LBB0_1
176; CHECK-THUMB8BASE-NEXT:  .LBB0_1: @ %atomicrmw.start
177; CHECK-THUMB8BASE-NEXT:    @ =>This Loop Header: Depth=1
178; CHECK-THUMB8BASE-NEXT:    @ Child Loop BB0_2 Depth 2
179; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
180; CHECK-THUMB8BASE-NEXT:    movw r3, :lower16:atomic_i8
181; CHECK-THUMB8BASE-NEXT:    movt r3, :upper16:atomic_i8
182; CHECK-THUMB8BASE-NEXT:    movs r4, #1
183; CHECK-THUMB8BASE-NEXT:    uxtb r1, r1
184; CHECK-THUMB8BASE-NEXT:  .LBB0_2: @ %atomicrmw.start
185; CHECK-THUMB8BASE-NEXT:    @ Parent Loop BB0_1 Depth=1
186; CHECK-THUMB8BASE-NEXT:    @ => This Inner Loop Header: Depth=2
187; CHECK-THUMB8BASE-NEXT:    ldrexb r0, [r3]
188; CHECK-THUMB8BASE-NEXT:    cmp r0, r1
189; CHECK-THUMB8BASE-NEXT:    bne .LBB0_4
190; CHECK-THUMB8BASE-NEXT:  @ %bb.3: @ %atomicrmw.start
191; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB0_2 Depth=2
192; CHECK-THUMB8BASE-NEXT:    strexb r2, r4, [r3]
193; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
194; CHECK-THUMB8BASE-NEXT:    bne .LBB0_2
195; CHECK-THUMB8BASE-NEXT:  .LBB0_4: @ %atomicrmw.start
196; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB0_1 Depth=1
197; CHECK-THUMB8BASE-NEXT:    str r0, [sp] @ 4-byte Spill
198; CHECK-THUMB8BASE-NEXT:    uxtb r1, r1
199; CHECK-THUMB8BASE-NEXT:    subs r1, r0, r1
200; CHECK-THUMB8BASE-NEXT:    rsbs r2, r1, #0
201; CHECK-THUMB8BASE-NEXT:    adcs r1, r2
202; CHECK-THUMB8BASE-NEXT:    cmp r1, #1
203; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
204; CHECK-THUMB8BASE-NEXT:    bne .LBB0_1
205; CHECK-THUMB8BASE-NEXT:    b .LBB0_5
206; CHECK-THUMB8BASE-NEXT:  .LBB0_5: @ %atomicrmw.end
207; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp] @ 4-byte Reload
208; CHECK-THUMB8BASE-NEXT:    add sp, #8
209; CHECK-THUMB8BASE-NEXT:    pop {r4, pc}
210entry:
211  %0 = atomicrmw xchg i8* @atomic_i8, i8 1 monotonic
212  ret i8 %0
213}
214define i8 @test_add_i8() {
215; CHECK-ARM8-LABEL: test_add_i8:
216; CHECK-ARM8:       @ %bb.0: @ %entry
217; CHECK-ARM8-NEXT:    .pad #8
218; CHECK-ARM8-NEXT:    sub sp, sp, #8
219; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i8
220; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i8
221; CHECK-ARM8-NEXT:    ldrb r0, [r0]
222; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
223; CHECK-ARM8-NEXT:    b .LBB1_1
224; CHECK-ARM8-NEXT:  .LBB1_1: @ %atomicrmw.start
225; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
226; CHECK-ARM8-NEXT:    @ Child Loop BB1_2 Depth 2
227; CHECK-ARM8-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
228; CHECK-ARM8-NEXT:    add r12, r1, #1
229; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i8
230; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i8
231; CHECK-ARM8-NEXT:    uxtb r1, r1
232; CHECK-ARM8-NEXT:  .LBB1_2: @ %atomicrmw.start
233; CHECK-ARM8-NEXT:    @ Parent Loop BB1_1 Depth=1
234; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
235; CHECK-ARM8-NEXT:    ldrexb r0, [r3]
236; CHECK-ARM8-NEXT:    cmp r0, r1
237; CHECK-ARM8-NEXT:    bne .LBB1_4
238; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
239; CHECK-ARM8-NEXT:    @ in Loop: Header=BB1_2 Depth=2
240; CHECK-ARM8-NEXT:    strexb r2, r12, [r3]
241; CHECK-ARM8-NEXT:    cmp r2, #0
242; CHECK-ARM8-NEXT:    bne .LBB1_2
243; CHECK-ARM8-NEXT:  .LBB1_4: @ %atomicrmw.start
244; CHECK-ARM8-NEXT:    @ in Loop: Header=BB1_1 Depth=1
245; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
246; CHECK-ARM8-NEXT:    uxtb r1, r1
247; CHECK-ARM8-NEXT:    sub r1, r0, r1
248; CHECK-ARM8-NEXT:    clz r1, r1
249; CHECK-ARM8-NEXT:    lsr r1, r1, #5
250; CHECK-ARM8-NEXT:    cmp r1, #1
251; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
252; CHECK-ARM8-NEXT:    bne .LBB1_1
253; CHECK-ARM8-NEXT:    b .LBB1_5
254; CHECK-ARM8-NEXT:  .LBB1_5: @ %atomicrmw.end
255; CHECK-ARM8-NEXT:    ldr r0, [sp] @ 4-byte Reload
256; CHECK-ARM8-NEXT:    add sp, sp, #8
257; CHECK-ARM8-NEXT:    bx lr
258;
259; CHECK-ARM6-LABEL: test_add_i8:
260; CHECK-ARM6:       @ %bb.0: @ %entry
261; CHECK-ARM6-NEXT:    .pad #8
262; CHECK-ARM6-NEXT:    sub sp, sp, #8
263; CHECK-ARM6-NEXT:    ldr r0, .LCPI1_0
264; CHECK-ARM6-NEXT:    ldrb r0, [r0]
265; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
266; CHECK-ARM6-NEXT:    b .LBB1_1
267; CHECK-ARM6-NEXT:  .LBB1_1: @ %atomicrmw.start
268; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
269; CHECK-ARM6-NEXT:    @ Child Loop BB1_2 Depth 2
270; CHECK-ARM6-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
271; CHECK-ARM6-NEXT:    add r12, r1, #1
272; CHECK-ARM6-NEXT:    ldr r3, .LCPI1_0
273; CHECK-ARM6-NEXT:    uxtb r1, r1
274; CHECK-ARM6-NEXT:  .LBB1_2: @ %atomicrmw.start
275; CHECK-ARM6-NEXT:    @ Parent Loop BB1_1 Depth=1
276; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
277; CHECK-ARM6-NEXT:    ldrexb r0, [r3]
278; CHECK-ARM6-NEXT:    cmp r0, r1
279; CHECK-ARM6-NEXT:    bne .LBB1_4
280; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
281; CHECK-ARM6-NEXT:    @ in Loop: Header=BB1_2 Depth=2
282; CHECK-ARM6-NEXT:    strexb r2, r12, [r3]
283; CHECK-ARM6-NEXT:    cmp r2, #0
284; CHECK-ARM6-NEXT:    bne .LBB1_2
285; CHECK-ARM6-NEXT:  .LBB1_4: @ %atomicrmw.start
286; CHECK-ARM6-NEXT:    @ in Loop: Header=BB1_1 Depth=1
287; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
288; CHECK-ARM6-NEXT:    uxtb r1, r1
289; CHECK-ARM6-NEXT:    sub r1, r0, r1
290; CHECK-ARM6-NEXT:    clz r1, r1
291; CHECK-ARM6-NEXT:    lsr r1, r1, #5
292; CHECK-ARM6-NEXT:    cmp r1, #1
293; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
294; CHECK-ARM6-NEXT:    bne .LBB1_1
295; CHECK-ARM6-NEXT:    b .LBB1_5
296; CHECK-ARM6-NEXT:  .LBB1_5: @ %atomicrmw.end
297; CHECK-ARM6-NEXT:    ldr r0, [sp] @ 4-byte Reload
298; CHECK-ARM6-NEXT:    add sp, sp, #8
299; CHECK-ARM6-NEXT:    bx lr
300; CHECK-ARM6-NEXT:    .p2align 2
301; CHECK-ARM6-NEXT:  @ %bb.6:
302; CHECK-ARM6-NEXT:  .LCPI1_0:
303; CHECK-ARM6-NEXT:    .long atomic_i8
304;
305; CHECK-THUMB7-LABEL: test_add_i8:
306; CHECK-THUMB7:       @ %bb.0: @ %entry
307; CHECK-THUMB7-NEXT:    .pad #8
308; CHECK-THUMB7-NEXT:    sub sp, #8
309; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i8
310; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i8
311; CHECK-THUMB7-NEXT:    ldrb r0, [r0]
312; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
313; CHECK-THUMB7-NEXT:    b .LBB1_1
314; CHECK-THUMB7-NEXT:  .LBB1_1: @ %atomicrmw.start
315; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
316; CHECK-THUMB7-NEXT:    @ Child Loop BB1_2 Depth 2
317; CHECK-THUMB7-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
318; CHECK-THUMB7-NEXT:    add.w r12, r1, #1
319; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i8
320; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i8
321; CHECK-THUMB7-NEXT:    uxtb r1, r1
322; CHECK-THUMB7-NEXT:  .LBB1_2: @ %atomicrmw.start
323; CHECK-THUMB7-NEXT:    @ Parent Loop BB1_1 Depth=1
324; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
325; CHECK-THUMB7-NEXT:    ldrexb r0, [r3]
326; CHECK-THUMB7-NEXT:    cmp r0, r1
327; CHECK-THUMB7-NEXT:    bne .LBB1_4
328; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
329; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB1_2 Depth=2
330; CHECK-THUMB7-NEXT:    strexb r2, r12, [r3]
331; CHECK-THUMB7-NEXT:    cmp r2, #0
332; CHECK-THUMB7-NEXT:    bne .LBB1_2
333; CHECK-THUMB7-NEXT:  .LBB1_4: @ %atomicrmw.start
334; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB1_1 Depth=1
335; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
336; CHECK-THUMB7-NEXT:    uxtb r1, r1
337; CHECK-THUMB7-NEXT:    subs r1, r0, r1
338; CHECK-THUMB7-NEXT:    clz r1, r1
339; CHECK-THUMB7-NEXT:    lsrs r1, r1, #5
340; CHECK-THUMB7-NEXT:    cmp r1, #1
341; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
342; CHECK-THUMB7-NEXT:    bne .LBB1_1
343; CHECK-THUMB7-NEXT:    b .LBB1_5
344; CHECK-THUMB7-NEXT:  .LBB1_5: @ %atomicrmw.end
345; CHECK-THUMB7-NEXT:    ldr r0, [sp] @ 4-byte Reload
346; CHECK-THUMB7-NEXT:    add sp, #8
347; CHECK-THUMB7-NEXT:    bx lr
348;
349; CHECK-THUMB6-LABEL: test_add_i8:
350; CHECK-THUMB6:       @ %bb.0: @ %entry
351; CHECK-THUMB6-NEXT:    .save {r7, lr}
352; CHECK-THUMB6-NEXT:    push {r7, lr}
353; CHECK-THUMB6-NEXT:    ldr r0, .LCPI1_0
354; CHECK-THUMB6-NEXT:    movs r1, #1
355; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_add_1
356; CHECK-THUMB6-NEXT:    pop {r7, pc}
357; CHECK-THUMB6-NEXT:    .p2align 2
358; CHECK-THUMB6-NEXT:  @ %bb.1:
359; CHECK-THUMB6-NEXT:  .LCPI1_0:
360; CHECK-THUMB6-NEXT:    .long atomic_i8
361;
362; CHECK-THUMB8BASE-LABEL: test_add_i8:
363; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
364; CHECK-THUMB8BASE-NEXT:    .save {r4, lr}
365; CHECK-THUMB8BASE-NEXT:    push {r4, lr}
366; CHECK-THUMB8BASE-NEXT:    .pad #8
367; CHECK-THUMB8BASE-NEXT:    sub sp, #8
368; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i8
369; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i8
370; CHECK-THUMB8BASE-NEXT:    ldrb r0, [r0]
371; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
372; CHECK-THUMB8BASE-NEXT:    b .LBB1_1
373; CHECK-THUMB8BASE-NEXT:  .LBB1_1: @ %atomicrmw.start
374; CHECK-THUMB8BASE-NEXT:    @ =>This Loop Header: Depth=1
375; CHECK-THUMB8BASE-NEXT:    @ Child Loop BB1_2 Depth 2
376; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
377; CHECK-THUMB8BASE-NEXT:    adds r4, r1, #1
378; CHECK-THUMB8BASE-NEXT:    movw r3, :lower16:atomic_i8
379; CHECK-THUMB8BASE-NEXT:    movt r3, :upper16:atomic_i8
380; CHECK-THUMB8BASE-NEXT:    uxtb r1, r1
381; CHECK-THUMB8BASE-NEXT:  .LBB1_2: @ %atomicrmw.start
382; CHECK-THUMB8BASE-NEXT:    @ Parent Loop BB1_1 Depth=1
383; CHECK-THUMB8BASE-NEXT:    @ => This Inner Loop Header: Depth=2
384; CHECK-THUMB8BASE-NEXT:    ldrexb r0, [r3]
385; CHECK-THUMB8BASE-NEXT:    cmp r0, r1
386; CHECK-THUMB8BASE-NEXT:    bne .LBB1_4
387; CHECK-THUMB8BASE-NEXT:  @ %bb.3: @ %atomicrmw.start
388; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB1_2 Depth=2
389; CHECK-THUMB8BASE-NEXT:    strexb r2, r4, [r3]
390; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
391; CHECK-THUMB8BASE-NEXT:    bne .LBB1_2
392; CHECK-THUMB8BASE-NEXT:  .LBB1_4: @ %atomicrmw.start
393; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB1_1 Depth=1
394; CHECK-THUMB8BASE-NEXT:    str r0, [sp] @ 4-byte Spill
395; CHECK-THUMB8BASE-NEXT:    uxtb r1, r1
396; CHECK-THUMB8BASE-NEXT:    subs r1, r0, r1
397; CHECK-THUMB8BASE-NEXT:    rsbs r2, r1, #0
398; CHECK-THUMB8BASE-NEXT:    adcs r1, r2
399; CHECK-THUMB8BASE-NEXT:    cmp r1, #1
400; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
401; CHECK-THUMB8BASE-NEXT:    bne .LBB1_1
402; CHECK-THUMB8BASE-NEXT:    b .LBB1_5
403; CHECK-THUMB8BASE-NEXT:  .LBB1_5: @ %atomicrmw.end
404; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp] @ 4-byte Reload
405; CHECK-THUMB8BASE-NEXT:    add sp, #8
406; CHECK-THUMB8BASE-NEXT:    pop {r4, pc}
407entry:
408  %0 = atomicrmw add i8* @atomic_i8, i8 1 monotonic
409  ret i8 %0
410}
411define i8 @test_sub_i8() {
412; CHECK-ARM8-LABEL: test_sub_i8:
413; CHECK-ARM8:       @ %bb.0: @ %entry
414; CHECK-ARM8-NEXT:    .pad #8
415; CHECK-ARM8-NEXT:    sub sp, sp, #8
416; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i8
417; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i8
418; CHECK-ARM8-NEXT:    ldrb r0, [r0]
419; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
420; CHECK-ARM8-NEXT:    b .LBB2_1
421; CHECK-ARM8-NEXT:  .LBB2_1: @ %atomicrmw.start
422; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
423; CHECK-ARM8-NEXT:    @ Child Loop BB2_2 Depth 2
424; CHECK-ARM8-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
425; CHECK-ARM8-NEXT:    sub r12, r1, #1
426; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i8
427; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i8
428; CHECK-ARM8-NEXT:    uxtb r1, r1
429; CHECK-ARM8-NEXT:  .LBB2_2: @ %atomicrmw.start
430; CHECK-ARM8-NEXT:    @ Parent Loop BB2_1 Depth=1
431; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
432; CHECK-ARM8-NEXT:    ldrexb r0, [r3]
433; CHECK-ARM8-NEXT:    cmp r0, r1
434; CHECK-ARM8-NEXT:    bne .LBB2_4
435; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
436; CHECK-ARM8-NEXT:    @ in Loop: Header=BB2_2 Depth=2
437; CHECK-ARM8-NEXT:    strexb r2, r12, [r3]
438; CHECK-ARM8-NEXT:    cmp r2, #0
439; CHECK-ARM8-NEXT:    bne .LBB2_2
440; CHECK-ARM8-NEXT:  .LBB2_4: @ %atomicrmw.start
441; CHECK-ARM8-NEXT:    @ in Loop: Header=BB2_1 Depth=1
442; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
443; CHECK-ARM8-NEXT:    uxtb r1, r1
444; CHECK-ARM8-NEXT:    sub r1, r0, r1
445; CHECK-ARM8-NEXT:    clz r1, r1
446; CHECK-ARM8-NEXT:    lsr r1, r1, #5
447; CHECK-ARM8-NEXT:    cmp r1, #1
448; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
449; CHECK-ARM8-NEXT:    bne .LBB2_1
450; CHECK-ARM8-NEXT:    b .LBB2_5
451; CHECK-ARM8-NEXT:  .LBB2_5: @ %atomicrmw.end
452; CHECK-ARM8-NEXT:    ldr r0, [sp] @ 4-byte Reload
453; CHECK-ARM8-NEXT:    add sp, sp, #8
454; CHECK-ARM8-NEXT:    bx lr
455;
456; CHECK-ARM6-LABEL: test_sub_i8:
457; CHECK-ARM6:       @ %bb.0: @ %entry
458; CHECK-ARM6-NEXT:    .pad #8
459; CHECK-ARM6-NEXT:    sub sp, sp, #8
460; CHECK-ARM6-NEXT:    ldr r0, .LCPI2_0
461; CHECK-ARM6-NEXT:    ldrb r0, [r0]
462; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
463; CHECK-ARM6-NEXT:    b .LBB2_1
464; CHECK-ARM6-NEXT:  .LBB2_1: @ %atomicrmw.start
465; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
466; CHECK-ARM6-NEXT:    @ Child Loop BB2_2 Depth 2
467; CHECK-ARM6-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
468; CHECK-ARM6-NEXT:    sub r12, r1, #1
469; CHECK-ARM6-NEXT:    ldr r3, .LCPI2_0
470; CHECK-ARM6-NEXT:    uxtb r1, r1
471; CHECK-ARM6-NEXT:  .LBB2_2: @ %atomicrmw.start
472; CHECK-ARM6-NEXT:    @ Parent Loop BB2_1 Depth=1
473; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
474; CHECK-ARM6-NEXT:    ldrexb r0, [r3]
475; CHECK-ARM6-NEXT:    cmp r0, r1
476; CHECK-ARM6-NEXT:    bne .LBB2_4
477; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
478; CHECK-ARM6-NEXT:    @ in Loop: Header=BB2_2 Depth=2
479; CHECK-ARM6-NEXT:    strexb r2, r12, [r3]
480; CHECK-ARM6-NEXT:    cmp r2, #0
481; CHECK-ARM6-NEXT:    bne .LBB2_2
482; CHECK-ARM6-NEXT:  .LBB2_4: @ %atomicrmw.start
483; CHECK-ARM6-NEXT:    @ in Loop: Header=BB2_1 Depth=1
484; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
485; CHECK-ARM6-NEXT:    uxtb r1, r1
486; CHECK-ARM6-NEXT:    sub r1, r0, r1
487; CHECK-ARM6-NEXT:    clz r1, r1
488; CHECK-ARM6-NEXT:    lsr r1, r1, #5
489; CHECK-ARM6-NEXT:    cmp r1, #1
490; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
491; CHECK-ARM6-NEXT:    bne .LBB2_1
492; CHECK-ARM6-NEXT:    b .LBB2_5
493; CHECK-ARM6-NEXT:  .LBB2_5: @ %atomicrmw.end
494; CHECK-ARM6-NEXT:    ldr r0, [sp] @ 4-byte Reload
495; CHECK-ARM6-NEXT:    add sp, sp, #8
496; CHECK-ARM6-NEXT:    bx lr
497; CHECK-ARM6-NEXT:    .p2align 2
498; CHECK-ARM6-NEXT:  @ %bb.6:
499; CHECK-ARM6-NEXT:  .LCPI2_0:
500; CHECK-ARM6-NEXT:    .long atomic_i8
501;
502; CHECK-THUMB7-LABEL: test_sub_i8:
503; CHECK-THUMB7:       @ %bb.0: @ %entry
504; CHECK-THUMB7-NEXT:    .pad #8
505; CHECK-THUMB7-NEXT:    sub sp, #8
506; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i8
507; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i8
508; CHECK-THUMB7-NEXT:    ldrb r0, [r0]
509; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
510; CHECK-THUMB7-NEXT:    b .LBB2_1
511; CHECK-THUMB7-NEXT:  .LBB2_1: @ %atomicrmw.start
512; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
513; CHECK-THUMB7-NEXT:    @ Child Loop BB2_2 Depth 2
514; CHECK-THUMB7-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
515; CHECK-THUMB7-NEXT:    sub.w r12, r1, #1
516; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i8
517; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i8
518; CHECK-THUMB7-NEXT:    uxtb r1, r1
519; CHECK-THUMB7-NEXT:  .LBB2_2: @ %atomicrmw.start
520; CHECK-THUMB7-NEXT:    @ Parent Loop BB2_1 Depth=1
521; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
522; CHECK-THUMB7-NEXT:    ldrexb r0, [r3]
523; CHECK-THUMB7-NEXT:    cmp r0, r1
524; CHECK-THUMB7-NEXT:    bne .LBB2_4
525; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
526; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB2_2 Depth=2
527; CHECK-THUMB7-NEXT:    strexb r2, r12, [r3]
528; CHECK-THUMB7-NEXT:    cmp r2, #0
529; CHECK-THUMB7-NEXT:    bne .LBB2_2
530; CHECK-THUMB7-NEXT:  .LBB2_4: @ %atomicrmw.start
531; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB2_1 Depth=1
532; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
533; CHECK-THUMB7-NEXT:    uxtb r1, r1
534; CHECK-THUMB7-NEXT:    subs r1, r0, r1
535; CHECK-THUMB7-NEXT:    clz r1, r1
536; CHECK-THUMB7-NEXT:    lsrs r1, r1, #5
537; CHECK-THUMB7-NEXT:    cmp r1, #1
538; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
539; CHECK-THUMB7-NEXT:    bne .LBB2_1
540; CHECK-THUMB7-NEXT:    b .LBB2_5
541; CHECK-THUMB7-NEXT:  .LBB2_5: @ %atomicrmw.end
542; CHECK-THUMB7-NEXT:    ldr r0, [sp] @ 4-byte Reload
543; CHECK-THUMB7-NEXT:    add sp, #8
544; CHECK-THUMB7-NEXT:    bx lr
545;
546; CHECK-THUMB6-LABEL: test_sub_i8:
547; CHECK-THUMB6:       @ %bb.0: @ %entry
548; CHECK-THUMB6-NEXT:    .save {r7, lr}
549; CHECK-THUMB6-NEXT:    push {r7, lr}
550; CHECK-THUMB6-NEXT:    ldr r0, .LCPI2_0
551; CHECK-THUMB6-NEXT:    movs r1, #1
552; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_sub_1
553; CHECK-THUMB6-NEXT:    pop {r7, pc}
554; CHECK-THUMB6-NEXT:    .p2align 2
555; CHECK-THUMB6-NEXT:  @ %bb.1:
556; CHECK-THUMB6-NEXT:  .LCPI2_0:
557; CHECK-THUMB6-NEXT:    .long atomic_i8
558;
559; CHECK-THUMB8BASE-LABEL: test_sub_i8:
560; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
561; CHECK-THUMB8BASE-NEXT:    .save {r4, lr}
562; CHECK-THUMB8BASE-NEXT:    push {r4, lr}
563; CHECK-THUMB8BASE-NEXT:    .pad #8
564; CHECK-THUMB8BASE-NEXT:    sub sp, #8
565; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i8
566; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i8
567; CHECK-THUMB8BASE-NEXT:    ldrb r0, [r0]
568; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
569; CHECK-THUMB8BASE-NEXT:    b .LBB2_1
570; CHECK-THUMB8BASE-NEXT:  .LBB2_1: @ %atomicrmw.start
571; CHECK-THUMB8BASE-NEXT:    @ =>This Loop Header: Depth=1
572; CHECK-THUMB8BASE-NEXT:    @ Child Loop BB2_2 Depth 2
573; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
574; CHECK-THUMB8BASE-NEXT:    subs r4, r1, #1
575; CHECK-THUMB8BASE-NEXT:    movw r3, :lower16:atomic_i8
576; CHECK-THUMB8BASE-NEXT:    movt r3, :upper16:atomic_i8
577; CHECK-THUMB8BASE-NEXT:    uxtb r1, r1
578; CHECK-THUMB8BASE-NEXT:  .LBB2_2: @ %atomicrmw.start
579; CHECK-THUMB8BASE-NEXT:    @ Parent Loop BB2_1 Depth=1
580; CHECK-THUMB8BASE-NEXT:    @ => This Inner Loop Header: Depth=2
581; CHECK-THUMB8BASE-NEXT:    ldrexb r0, [r3]
582; CHECK-THUMB8BASE-NEXT:    cmp r0, r1
583; CHECK-THUMB8BASE-NEXT:    bne .LBB2_4
584; CHECK-THUMB8BASE-NEXT:  @ %bb.3: @ %atomicrmw.start
585; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB2_2 Depth=2
586; CHECK-THUMB8BASE-NEXT:    strexb r2, r4, [r3]
587; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
588; CHECK-THUMB8BASE-NEXT:    bne .LBB2_2
589; CHECK-THUMB8BASE-NEXT:  .LBB2_4: @ %atomicrmw.start
590; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB2_1 Depth=1
591; CHECK-THUMB8BASE-NEXT:    str r0, [sp] @ 4-byte Spill
592; CHECK-THUMB8BASE-NEXT:    uxtb r1, r1
593; CHECK-THUMB8BASE-NEXT:    subs r1, r0, r1
594; CHECK-THUMB8BASE-NEXT:    rsbs r2, r1, #0
595; CHECK-THUMB8BASE-NEXT:    adcs r1, r2
596; CHECK-THUMB8BASE-NEXT:    cmp r1, #1
597; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
598; CHECK-THUMB8BASE-NEXT:    bne .LBB2_1
599; CHECK-THUMB8BASE-NEXT:    b .LBB2_5
600; CHECK-THUMB8BASE-NEXT:  .LBB2_5: @ %atomicrmw.end
601; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp] @ 4-byte Reload
602; CHECK-THUMB8BASE-NEXT:    add sp, #8
603; CHECK-THUMB8BASE-NEXT:    pop {r4, pc}
604entry:
605  %0 = atomicrmw sub i8* @atomic_i8, i8 1 monotonic
606  ret i8 %0
607}
608define i8 @test_and_i8() {
609; CHECK-ARM8-LABEL: test_and_i8:
610; CHECK-ARM8:       @ %bb.0: @ %entry
611; CHECK-ARM8-NEXT:    .pad #8
612; CHECK-ARM8-NEXT:    sub sp, sp, #8
613; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i8
614; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i8
615; CHECK-ARM8-NEXT:    ldrb r0, [r0]
616; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
617; CHECK-ARM8-NEXT:    b .LBB3_1
618; CHECK-ARM8-NEXT:  .LBB3_1: @ %atomicrmw.start
619; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
620; CHECK-ARM8-NEXT:    @ Child Loop BB3_2 Depth 2
621; CHECK-ARM8-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
622; CHECK-ARM8-NEXT:    and r12, r1, #1
623; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i8
624; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i8
625; CHECK-ARM8-NEXT:    uxtb r1, r1
626; CHECK-ARM8-NEXT:  .LBB3_2: @ %atomicrmw.start
627; CHECK-ARM8-NEXT:    @ Parent Loop BB3_1 Depth=1
628; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
629; CHECK-ARM8-NEXT:    ldrexb r0, [r3]
630; CHECK-ARM8-NEXT:    cmp r0, r1
631; CHECK-ARM8-NEXT:    bne .LBB3_4
632; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
633; CHECK-ARM8-NEXT:    @ in Loop: Header=BB3_2 Depth=2
634; CHECK-ARM8-NEXT:    strexb r2, r12, [r3]
635; CHECK-ARM8-NEXT:    cmp r2, #0
636; CHECK-ARM8-NEXT:    bne .LBB3_2
637; CHECK-ARM8-NEXT:  .LBB3_4: @ %atomicrmw.start
638; CHECK-ARM8-NEXT:    @ in Loop: Header=BB3_1 Depth=1
639; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
640; CHECK-ARM8-NEXT:    uxtb r1, r1
641; CHECK-ARM8-NEXT:    sub r1, r0, r1
642; CHECK-ARM8-NEXT:    clz r1, r1
643; CHECK-ARM8-NEXT:    lsr r1, r1, #5
644; CHECK-ARM8-NEXT:    cmp r1, #1
645; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
646; CHECK-ARM8-NEXT:    bne .LBB3_1
647; CHECK-ARM8-NEXT:    b .LBB3_5
648; CHECK-ARM8-NEXT:  .LBB3_5: @ %atomicrmw.end
649; CHECK-ARM8-NEXT:    ldr r0, [sp] @ 4-byte Reload
650; CHECK-ARM8-NEXT:    add sp, sp, #8
651; CHECK-ARM8-NEXT:    bx lr
652;
653; CHECK-ARM6-LABEL: test_and_i8:
654; CHECK-ARM6:       @ %bb.0: @ %entry
655; CHECK-ARM6-NEXT:    .pad #8
656; CHECK-ARM6-NEXT:    sub sp, sp, #8
657; CHECK-ARM6-NEXT:    ldr r0, .LCPI3_0
658; CHECK-ARM6-NEXT:    ldrb r0, [r0]
659; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
660; CHECK-ARM6-NEXT:    b .LBB3_1
661; CHECK-ARM6-NEXT:  .LBB3_1: @ %atomicrmw.start
662; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
663; CHECK-ARM6-NEXT:    @ Child Loop BB3_2 Depth 2
664; CHECK-ARM6-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
665; CHECK-ARM6-NEXT:    and r12, r1, #1
666; CHECK-ARM6-NEXT:    ldr r3, .LCPI3_0
667; CHECK-ARM6-NEXT:    uxtb r1, r1
668; CHECK-ARM6-NEXT:  .LBB3_2: @ %atomicrmw.start
669; CHECK-ARM6-NEXT:    @ Parent Loop BB3_1 Depth=1
670; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
671; CHECK-ARM6-NEXT:    ldrexb r0, [r3]
672; CHECK-ARM6-NEXT:    cmp r0, r1
673; CHECK-ARM6-NEXT:    bne .LBB3_4
674; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
675; CHECK-ARM6-NEXT:    @ in Loop: Header=BB3_2 Depth=2
676; CHECK-ARM6-NEXT:    strexb r2, r12, [r3]
677; CHECK-ARM6-NEXT:    cmp r2, #0
678; CHECK-ARM6-NEXT:    bne .LBB3_2
679; CHECK-ARM6-NEXT:  .LBB3_4: @ %atomicrmw.start
680; CHECK-ARM6-NEXT:    @ in Loop: Header=BB3_1 Depth=1
681; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
682; CHECK-ARM6-NEXT:    uxtb r1, r1
683; CHECK-ARM6-NEXT:    sub r1, r0, r1
684; CHECK-ARM6-NEXT:    clz r1, r1
685; CHECK-ARM6-NEXT:    lsr r1, r1, #5
686; CHECK-ARM6-NEXT:    cmp r1, #1
687; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
688; CHECK-ARM6-NEXT:    bne .LBB3_1
689; CHECK-ARM6-NEXT:    b .LBB3_5
690; CHECK-ARM6-NEXT:  .LBB3_5: @ %atomicrmw.end
691; CHECK-ARM6-NEXT:    ldr r0, [sp] @ 4-byte Reload
692; CHECK-ARM6-NEXT:    add sp, sp, #8
693; CHECK-ARM6-NEXT:    bx lr
694; CHECK-ARM6-NEXT:    .p2align 2
695; CHECK-ARM6-NEXT:  @ %bb.6:
696; CHECK-ARM6-NEXT:  .LCPI3_0:
697; CHECK-ARM6-NEXT:    .long atomic_i8
698;
699; CHECK-THUMB7-LABEL: test_and_i8:
700; CHECK-THUMB7:       @ %bb.0: @ %entry
701; CHECK-THUMB7-NEXT:    .pad #8
702; CHECK-THUMB7-NEXT:    sub sp, #8
703; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i8
704; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i8
705; CHECK-THUMB7-NEXT:    ldrb r0, [r0]
706; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
707; CHECK-THUMB7-NEXT:    b .LBB3_1
708; CHECK-THUMB7-NEXT:  .LBB3_1: @ %atomicrmw.start
709; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
710; CHECK-THUMB7-NEXT:    @ Child Loop BB3_2 Depth 2
711; CHECK-THUMB7-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
712; CHECK-THUMB7-NEXT:    and r12, r1, #1
713; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i8
714; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i8
715; CHECK-THUMB7-NEXT:    uxtb r1, r1
716; CHECK-THUMB7-NEXT:  .LBB3_2: @ %atomicrmw.start
717; CHECK-THUMB7-NEXT:    @ Parent Loop BB3_1 Depth=1
718; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
719; CHECK-THUMB7-NEXT:    ldrexb r0, [r3]
720; CHECK-THUMB7-NEXT:    cmp r0, r1
721; CHECK-THUMB7-NEXT:    bne .LBB3_4
722; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
723; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB3_2 Depth=2
724; CHECK-THUMB7-NEXT:    strexb r2, r12, [r3]
725; CHECK-THUMB7-NEXT:    cmp r2, #0
726; CHECK-THUMB7-NEXT:    bne .LBB3_2
727; CHECK-THUMB7-NEXT:  .LBB3_4: @ %atomicrmw.start
728; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB3_1 Depth=1
729; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
730; CHECK-THUMB7-NEXT:    uxtb r1, r1
731; CHECK-THUMB7-NEXT:    subs r1, r0, r1
732; CHECK-THUMB7-NEXT:    clz r1, r1
733; CHECK-THUMB7-NEXT:    lsrs r1, r1, #5
734; CHECK-THUMB7-NEXT:    cmp r1, #1
735; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
736; CHECK-THUMB7-NEXT:    bne .LBB3_1
737; CHECK-THUMB7-NEXT:    b .LBB3_5
738; CHECK-THUMB7-NEXT:  .LBB3_5: @ %atomicrmw.end
739; CHECK-THUMB7-NEXT:    ldr r0, [sp] @ 4-byte Reload
740; CHECK-THUMB7-NEXT:    add sp, #8
741; CHECK-THUMB7-NEXT:    bx lr
742;
743; CHECK-THUMB6-LABEL: test_and_i8:
744; CHECK-THUMB6:       @ %bb.0: @ %entry
745; CHECK-THUMB6-NEXT:    .save {r7, lr}
746; CHECK-THUMB6-NEXT:    push {r7, lr}
747; CHECK-THUMB6-NEXT:    ldr r0, .LCPI3_0
748; CHECK-THUMB6-NEXT:    movs r1, #1
749; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_and_1
750; CHECK-THUMB6-NEXT:    pop {r7, pc}
751; CHECK-THUMB6-NEXT:    .p2align 2
752; CHECK-THUMB6-NEXT:  @ %bb.1:
753; CHECK-THUMB6-NEXT:  .LCPI3_0:
754; CHECK-THUMB6-NEXT:    .long atomic_i8
755;
756; CHECK-THUMB8BASE-LABEL: test_and_i8:
757; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
758; CHECK-THUMB8BASE-NEXT:    .save {r4, lr}
759; CHECK-THUMB8BASE-NEXT:    push {r4, lr}
760; CHECK-THUMB8BASE-NEXT:    .pad #8
761; CHECK-THUMB8BASE-NEXT:    sub sp, #8
762; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i8
763; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i8
764; CHECK-THUMB8BASE-NEXT:    ldrb r0, [r0]
765; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
766; CHECK-THUMB8BASE-NEXT:    b .LBB3_1
767; CHECK-THUMB8BASE-NEXT:  .LBB3_1: @ %atomicrmw.start
768; CHECK-THUMB8BASE-NEXT:    @ =>This Loop Header: Depth=1
769; CHECK-THUMB8BASE-NEXT:    @ Child Loop BB3_2 Depth 2
770; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
771; CHECK-THUMB8BASE-NEXT:    movs r0, #1
772; CHECK-THUMB8BASE-NEXT:    mov r4, r1
773; CHECK-THUMB8BASE-NEXT:    ands r4, r0
774; CHECK-THUMB8BASE-NEXT:    movw r3, :lower16:atomic_i8
775; CHECK-THUMB8BASE-NEXT:    movt r3, :upper16:atomic_i8
776; CHECK-THUMB8BASE-NEXT:    uxtb r1, r1
777; CHECK-THUMB8BASE-NEXT:  .LBB3_2: @ %atomicrmw.start
778; CHECK-THUMB8BASE-NEXT:    @ Parent Loop BB3_1 Depth=1
779; CHECK-THUMB8BASE-NEXT:    @ => This Inner Loop Header: Depth=2
780; CHECK-THUMB8BASE-NEXT:    ldrexb r0, [r3]
781; CHECK-THUMB8BASE-NEXT:    cmp r0, r1
782; CHECK-THUMB8BASE-NEXT:    bne .LBB3_4
783; CHECK-THUMB8BASE-NEXT:  @ %bb.3: @ %atomicrmw.start
784; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB3_2 Depth=2
785; CHECK-THUMB8BASE-NEXT:    strexb r2, r4, [r3]
786; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
787; CHECK-THUMB8BASE-NEXT:    bne .LBB3_2
788; CHECK-THUMB8BASE-NEXT:  .LBB3_4: @ %atomicrmw.start
789; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB3_1 Depth=1
790; CHECK-THUMB8BASE-NEXT:    str r0, [sp] @ 4-byte Spill
791; CHECK-THUMB8BASE-NEXT:    uxtb r1, r1
792; CHECK-THUMB8BASE-NEXT:    subs r1, r0, r1
793; CHECK-THUMB8BASE-NEXT:    rsbs r2, r1, #0
794; CHECK-THUMB8BASE-NEXT:    adcs r1, r2
795; CHECK-THUMB8BASE-NEXT:    cmp r1, #1
796; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
797; CHECK-THUMB8BASE-NEXT:    bne .LBB3_1
798; CHECK-THUMB8BASE-NEXT:    b .LBB3_5
799; CHECK-THUMB8BASE-NEXT:  .LBB3_5: @ %atomicrmw.end
800; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp] @ 4-byte Reload
801; CHECK-THUMB8BASE-NEXT:    add sp, #8
802; CHECK-THUMB8BASE-NEXT:    pop {r4, pc}
803entry:
804  %0 = atomicrmw and i8* @atomic_i8, i8 1 monotonic
805  ret i8 %0
806}
807define i8 @test_nand_i8() {
808; CHECK-ARM8-LABEL: test_nand_i8:
809; CHECK-ARM8:       @ %bb.0: @ %entry
810; CHECK-ARM8-NEXT:    .pad #8
811; CHECK-ARM8-NEXT:    sub sp, sp, #8
812; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i8
813; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i8
814; CHECK-ARM8-NEXT:    ldrb r0, [r0]
815; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
816; CHECK-ARM8-NEXT:    b .LBB4_1
817; CHECK-ARM8-NEXT:  .LBB4_1: @ %atomicrmw.start
818; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
819; CHECK-ARM8-NEXT:    @ Child Loop BB4_2 Depth 2
820; CHECK-ARM8-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
821; CHECK-ARM8-NEXT:    mvn r0, r1
822; CHECK-ARM8-NEXT:    mvn r2, #1
823; CHECK-ARM8-NEXT:    orr r12, r0, r2
824; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i8
825; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i8
826; CHECK-ARM8-NEXT:    uxtb r1, r1
827; CHECK-ARM8-NEXT:  .LBB4_2: @ %atomicrmw.start
828; CHECK-ARM8-NEXT:    @ Parent Loop BB4_1 Depth=1
829; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
830; CHECK-ARM8-NEXT:    ldrexb r0, [r3]
831; CHECK-ARM8-NEXT:    cmp r0, r1
832; CHECK-ARM8-NEXT:    bne .LBB4_4
833; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
834; CHECK-ARM8-NEXT:    @ in Loop: Header=BB4_2 Depth=2
835; CHECK-ARM8-NEXT:    strexb r2, r12, [r3]
836; CHECK-ARM8-NEXT:    cmp r2, #0
837; CHECK-ARM8-NEXT:    bne .LBB4_2
838; CHECK-ARM8-NEXT:  .LBB4_4: @ %atomicrmw.start
839; CHECK-ARM8-NEXT:    @ in Loop: Header=BB4_1 Depth=1
840; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
841; CHECK-ARM8-NEXT:    uxtb r1, r1
842; CHECK-ARM8-NEXT:    sub r1, r0, r1
843; CHECK-ARM8-NEXT:    clz r1, r1
844; CHECK-ARM8-NEXT:    lsr r1, r1, #5
845; CHECK-ARM8-NEXT:    cmp r1, #1
846; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
847; CHECK-ARM8-NEXT:    bne .LBB4_1
848; CHECK-ARM8-NEXT:    b .LBB4_5
849; CHECK-ARM8-NEXT:  .LBB4_5: @ %atomicrmw.end
850; CHECK-ARM8-NEXT:    ldr r0, [sp] @ 4-byte Reload
851; CHECK-ARM8-NEXT:    add sp, sp, #8
852; CHECK-ARM8-NEXT:    bx lr
853;
854; CHECK-ARM6-LABEL: test_nand_i8:
855; CHECK-ARM6:       @ %bb.0: @ %entry
856; CHECK-ARM6-NEXT:    .pad #8
857; CHECK-ARM6-NEXT:    sub sp, sp, #8
858; CHECK-ARM6-NEXT:    ldr r0, .LCPI4_0
859; CHECK-ARM6-NEXT:    ldrb r0, [r0]
860; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
861; CHECK-ARM6-NEXT:    b .LBB4_1
862; CHECK-ARM6-NEXT:  .LBB4_1: @ %atomicrmw.start
863; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
864; CHECK-ARM6-NEXT:    @ Child Loop BB4_2 Depth 2
865; CHECK-ARM6-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
866; CHECK-ARM6-NEXT:    mvn r0, r1
867; CHECK-ARM6-NEXT:    mvn r2, #1
868; CHECK-ARM6-NEXT:    orr r12, r0, r2
869; CHECK-ARM6-NEXT:    ldr r3, .LCPI4_0
870; CHECK-ARM6-NEXT:    uxtb r1, r1
871; CHECK-ARM6-NEXT:  .LBB4_2: @ %atomicrmw.start
872; CHECK-ARM6-NEXT:    @ Parent Loop BB4_1 Depth=1
873; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
874; CHECK-ARM6-NEXT:    ldrexb r0, [r3]
875; CHECK-ARM6-NEXT:    cmp r0, r1
876; CHECK-ARM6-NEXT:    bne .LBB4_4
877; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
878; CHECK-ARM6-NEXT:    @ in Loop: Header=BB4_2 Depth=2
879; CHECK-ARM6-NEXT:    strexb r2, r12, [r3]
880; CHECK-ARM6-NEXT:    cmp r2, #0
881; CHECK-ARM6-NEXT:    bne .LBB4_2
882; CHECK-ARM6-NEXT:  .LBB4_4: @ %atomicrmw.start
883; CHECK-ARM6-NEXT:    @ in Loop: Header=BB4_1 Depth=1
884; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
885; CHECK-ARM6-NEXT:    uxtb r1, r1
886; CHECK-ARM6-NEXT:    sub r1, r0, r1
887; CHECK-ARM6-NEXT:    clz r1, r1
888; CHECK-ARM6-NEXT:    lsr r1, r1, #5
889; CHECK-ARM6-NEXT:    cmp r1, #1
890; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
891; CHECK-ARM6-NEXT:    bne .LBB4_1
892; CHECK-ARM6-NEXT:    b .LBB4_5
893; CHECK-ARM6-NEXT:  .LBB4_5: @ %atomicrmw.end
894; CHECK-ARM6-NEXT:    ldr r0, [sp] @ 4-byte Reload
895; CHECK-ARM6-NEXT:    add sp, sp, #8
896; CHECK-ARM6-NEXT:    bx lr
897; CHECK-ARM6-NEXT:    .p2align 2
898; CHECK-ARM6-NEXT:  @ %bb.6:
899; CHECK-ARM6-NEXT:  .LCPI4_0:
900; CHECK-ARM6-NEXT:    .long atomic_i8
901;
902; CHECK-THUMB7-LABEL: test_nand_i8:
903; CHECK-THUMB7:       @ %bb.0: @ %entry
904; CHECK-THUMB7-NEXT:    .pad #8
905; CHECK-THUMB7-NEXT:    sub sp, #8
906; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i8
907; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i8
908; CHECK-THUMB7-NEXT:    ldrb r0, [r0]
909; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
910; CHECK-THUMB7-NEXT:    b .LBB4_1
911; CHECK-THUMB7-NEXT:  .LBB4_1: @ %atomicrmw.start
912; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
913; CHECK-THUMB7-NEXT:    @ Child Loop BB4_2 Depth 2
914; CHECK-THUMB7-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
915; CHECK-THUMB7-NEXT:    mvn r0, #1
916; CHECK-THUMB7-NEXT:    orn r12, r0, r1
917; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i8
918; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i8
919; CHECK-THUMB7-NEXT:    uxtb r1, r1
920; CHECK-THUMB7-NEXT:  .LBB4_2: @ %atomicrmw.start
921; CHECK-THUMB7-NEXT:    @ Parent Loop BB4_1 Depth=1
922; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
923; CHECK-THUMB7-NEXT:    ldrexb r0, [r3]
924; CHECK-THUMB7-NEXT:    cmp r0, r1
925; CHECK-THUMB7-NEXT:    bne .LBB4_4
926; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
927; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB4_2 Depth=2
928; CHECK-THUMB7-NEXT:    strexb r2, r12, [r3]
929; CHECK-THUMB7-NEXT:    cmp r2, #0
930; CHECK-THUMB7-NEXT:    bne .LBB4_2
931; CHECK-THUMB7-NEXT:  .LBB4_4: @ %atomicrmw.start
932; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB4_1 Depth=1
933; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
934; CHECK-THUMB7-NEXT:    uxtb r1, r1
935; CHECK-THUMB7-NEXT:    subs r1, r0, r1
936; CHECK-THUMB7-NEXT:    clz r1, r1
937; CHECK-THUMB7-NEXT:    lsrs r1, r1, #5
938; CHECK-THUMB7-NEXT:    cmp r1, #1
939; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
940; CHECK-THUMB7-NEXT:    bne .LBB4_1
941; CHECK-THUMB7-NEXT:    b .LBB4_5
942; CHECK-THUMB7-NEXT:  .LBB4_5: @ %atomicrmw.end
943; CHECK-THUMB7-NEXT:    ldr r0, [sp] @ 4-byte Reload
944; CHECK-THUMB7-NEXT:    add sp, #8
945; CHECK-THUMB7-NEXT:    bx lr
946;
947; CHECK-THUMB6-LABEL: test_nand_i8:
948; CHECK-THUMB6:       @ %bb.0: @ %entry
949; CHECK-THUMB6-NEXT:    .save {r7, lr}
950; CHECK-THUMB6-NEXT:    push {r7, lr}
951; CHECK-THUMB6-NEXT:    ldr r0, .LCPI4_0
952; CHECK-THUMB6-NEXT:    movs r1, #1
953; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_nand_1
954; CHECK-THUMB6-NEXT:    pop {r7, pc}
955; CHECK-THUMB6-NEXT:    .p2align 2
956; CHECK-THUMB6-NEXT:  @ %bb.1:
957; CHECK-THUMB6-NEXT:  .LCPI4_0:
958; CHECK-THUMB6-NEXT:    .long atomic_i8
959;
960; CHECK-THUMB8BASE-LABEL: test_nand_i8:
961; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
962; CHECK-THUMB8BASE-NEXT:    .save {r4, lr}
963; CHECK-THUMB8BASE-NEXT:    push {r4, lr}
964; CHECK-THUMB8BASE-NEXT:    .pad #8
965; CHECK-THUMB8BASE-NEXT:    sub sp, #8
966; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i8
967; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i8
968; CHECK-THUMB8BASE-NEXT:    ldrb r0, [r0]
969; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
970; CHECK-THUMB8BASE-NEXT:    b .LBB4_1
971; CHECK-THUMB8BASE-NEXT:  .LBB4_1: @ %atomicrmw.start
972; CHECK-THUMB8BASE-NEXT:    @ =>This Loop Header: Depth=1
973; CHECK-THUMB8BASE-NEXT:    @ Child Loop BB4_2 Depth 2
974; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
975; CHECK-THUMB8BASE-NEXT:    mvns r4, r1
976; CHECK-THUMB8BASE-NEXT:    movs r0, #1
977; CHECK-THUMB8BASE-NEXT:    mvns r0, r0
978; CHECK-THUMB8BASE-NEXT:    orrs r4, r0
979; CHECK-THUMB8BASE-NEXT:    movw r3, :lower16:atomic_i8
980; CHECK-THUMB8BASE-NEXT:    movt r3, :upper16:atomic_i8
981; CHECK-THUMB8BASE-NEXT:    uxtb r1, r1
982; CHECK-THUMB8BASE-NEXT:  .LBB4_2: @ %atomicrmw.start
983; CHECK-THUMB8BASE-NEXT:    @ Parent Loop BB4_1 Depth=1
984; CHECK-THUMB8BASE-NEXT:    @ => This Inner Loop Header: Depth=2
985; CHECK-THUMB8BASE-NEXT:    ldrexb r0, [r3]
986; CHECK-THUMB8BASE-NEXT:    cmp r0, r1
987; CHECK-THUMB8BASE-NEXT:    bne .LBB4_4
988; CHECK-THUMB8BASE-NEXT:  @ %bb.3: @ %atomicrmw.start
989; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB4_2 Depth=2
990; CHECK-THUMB8BASE-NEXT:    strexb r2, r4, [r3]
991; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
992; CHECK-THUMB8BASE-NEXT:    bne .LBB4_2
993; CHECK-THUMB8BASE-NEXT:  .LBB4_4: @ %atomicrmw.start
994; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB4_1 Depth=1
995; CHECK-THUMB8BASE-NEXT:    str r0, [sp] @ 4-byte Spill
996; CHECK-THUMB8BASE-NEXT:    uxtb r1, r1
997; CHECK-THUMB8BASE-NEXT:    subs r1, r0, r1
998; CHECK-THUMB8BASE-NEXT:    rsbs r2, r1, #0
999; CHECK-THUMB8BASE-NEXT:    adcs r1, r2
1000; CHECK-THUMB8BASE-NEXT:    cmp r1, #1
1001; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
1002; CHECK-THUMB8BASE-NEXT:    bne .LBB4_1
1003; CHECK-THUMB8BASE-NEXT:    b .LBB4_5
1004; CHECK-THUMB8BASE-NEXT:  .LBB4_5: @ %atomicrmw.end
1005; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp] @ 4-byte Reload
1006; CHECK-THUMB8BASE-NEXT:    add sp, #8
1007; CHECK-THUMB8BASE-NEXT:    pop {r4, pc}
1008entry:
1009  %0 = atomicrmw nand i8* @atomic_i8, i8 1 monotonic
1010  ret i8 %0
1011}
1012define i8 @test_or_i8() {
1013; CHECK-ARM8-LABEL: test_or_i8:
1014; CHECK-ARM8:       @ %bb.0: @ %entry
1015; CHECK-ARM8-NEXT:    .pad #8
1016; CHECK-ARM8-NEXT:    sub sp, sp, #8
1017; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i8
1018; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i8
1019; CHECK-ARM8-NEXT:    ldrb r0, [r0]
1020; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
1021; CHECK-ARM8-NEXT:    b .LBB5_1
1022; CHECK-ARM8-NEXT:  .LBB5_1: @ %atomicrmw.start
1023; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
1024; CHECK-ARM8-NEXT:    @ Child Loop BB5_2 Depth 2
1025; CHECK-ARM8-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
1026; CHECK-ARM8-NEXT:    orr r12, r1, #1
1027; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i8
1028; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i8
1029; CHECK-ARM8-NEXT:    uxtb r1, r1
1030; CHECK-ARM8-NEXT:  .LBB5_2: @ %atomicrmw.start
1031; CHECK-ARM8-NEXT:    @ Parent Loop BB5_1 Depth=1
1032; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
1033; CHECK-ARM8-NEXT:    ldrexb r0, [r3]
1034; CHECK-ARM8-NEXT:    cmp r0, r1
1035; CHECK-ARM8-NEXT:    bne .LBB5_4
1036; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
1037; CHECK-ARM8-NEXT:    @ in Loop: Header=BB5_2 Depth=2
1038; CHECK-ARM8-NEXT:    strexb r2, r12, [r3]
1039; CHECK-ARM8-NEXT:    cmp r2, #0
1040; CHECK-ARM8-NEXT:    bne .LBB5_2
1041; CHECK-ARM8-NEXT:  .LBB5_4: @ %atomicrmw.start
1042; CHECK-ARM8-NEXT:    @ in Loop: Header=BB5_1 Depth=1
1043; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
1044; CHECK-ARM8-NEXT:    uxtb r1, r1
1045; CHECK-ARM8-NEXT:    sub r1, r0, r1
1046; CHECK-ARM8-NEXT:    clz r1, r1
1047; CHECK-ARM8-NEXT:    lsr r1, r1, #5
1048; CHECK-ARM8-NEXT:    cmp r1, #1
1049; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
1050; CHECK-ARM8-NEXT:    bne .LBB5_1
1051; CHECK-ARM8-NEXT:    b .LBB5_5
1052; CHECK-ARM8-NEXT:  .LBB5_5: @ %atomicrmw.end
1053; CHECK-ARM8-NEXT:    ldr r0, [sp] @ 4-byte Reload
1054; CHECK-ARM8-NEXT:    add sp, sp, #8
1055; CHECK-ARM8-NEXT:    bx lr
1056;
1057; CHECK-ARM6-LABEL: test_or_i8:
1058; CHECK-ARM6:       @ %bb.0: @ %entry
1059; CHECK-ARM6-NEXT:    .pad #8
1060; CHECK-ARM6-NEXT:    sub sp, sp, #8
1061; CHECK-ARM6-NEXT:    ldr r0, .LCPI5_0
1062; CHECK-ARM6-NEXT:    ldrb r0, [r0]
1063; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
1064; CHECK-ARM6-NEXT:    b .LBB5_1
1065; CHECK-ARM6-NEXT:  .LBB5_1: @ %atomicrmw.start
1066; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
1067; CHECK-ARM6-NEXT:    @ Child Loop BB5_2 Depth 2
1068; CHECK-ARM6-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
1069; CHECK-ARM6-NEXT:    orr r12, r1, #1
1070; CHECK-ARM6-NEXT:    ldr r3, .LCPI5_0
1071; CHECK-ARM6-NEXT:    uxtb r1, r1
1072; CHECK-ARM6-NEXT:  .LBB5_2: @ %atomicrmw.start
1073; CHECK-ARM6-NEXT:    @ Parent Loop BB5_1 Depth=1
1074; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
1075; CHECK-ARM6-NEXT:    ldrexb r0, [r3]
1076; CHECK-ARM6-NEXT:    cmp r0, r1
1077; CHECK-ARM6-NEXT:    bne .LBB5_4
1078; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
1079; CHECK-ARM6-NEXT:    @ in Loop: Header=BB5_2 Depth=2
1080; CHECK-ARM6-NEXT:    strexb r2, r12, [r3]
1081; CHECK-ARM6-NEXT:    cmp r2, #0
1082; CHECK-ARM6-NEXT:    bne .LBB5_2
1083; CHECK-ARM6-NEXT:  .LBB5_4: @ %atomicrmw.start
1084; CHECK-ARM6-NEXT:    @ in Loop: Header=BB5_1 Depth=1
1085; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
1086; CHECK-ARM6-NEXT:    uxtb r1, r1
1087; CHECK-ARM6-NEXT:    sub r1, r0, r1
1088; CHECK-ARM6-NEXT:    clz r1, r1
1089; CHECK-ARM6-NEXT:    lsr r1, r1, #5
1090; CHECK-ARM6-NEXT:    cmp r1, #1
1091; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
1092; CHECK-ARM6-NEXT:    bne .LBB5_1
1093; CHECK-ARM6-NEXT:    b .LBB5_5
1094; CHECK-ARM6-NEXT:  .LBB5_5: @ %atomicrmw.end
1095; CHECK-ARM6-NEXT:    ldr r0, [sp] @ 4-byte Reload
1096; CHECK-ARM6-NEXT:    add sp, sp, #8
1097; CHECK-ARM6-NEXT:    bx lr
1098; CHECK-ARM6-NEXT:    .p2align 2
1099; CHECK-ARM6-NEXT:  @ %bb.6:
1100; CHECK-ARM6-NEXT:  .LCPI5_0:
1101; CHECK-ARM6-NEXT:    .long atomic_i8
1102;
1103; CHECK-THUMB7-LABEL: test_or_i8:
1104; CHECK-THUMB7:       @ %bb.0: @ %entry
1105; CHECK-THUMB7-NEXT:    .pad #8
1106; CHECK-THUMB7-NEXT:    sub sp, #8
1107; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i8
1108; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i8
1109; CHECK-THUMB7-NEXT:    ldrb r0, [r0]
1110; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
1111; CHECK-THUMB7-NEXT:    b .LBB5_1
1112; CHECK-THUMB7-NEXT:  .LBB5_1: @ %atomicrmw.start
1113; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
1114; CHECK-THUMB7-NEXT:    @ Child Loop BB5_2 Depth 2
1115; CHECK-THUMB7-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
1116; CHECK-THUMB7-NEXT:    orr r12, r1, #1
1117; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i8
1118; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i8
1119; CHECK-THUMB7-NEXT:    uxtb r1, r1
1120; CHECK-THUMB7-NEXT:  .LBB5_2: @ %atomicrmw.start
1121; CHECK-THUMB7-NEXT:    @ Parent Loop BB5_1 Depth=1
1122; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
1123; CHECK-THUMB7-NEXT:    ldrexb r0, [r3]
1124; CHECK-THUMB7-NEXT:    cmp r0, r1
1125; CHECK-THUMB7-NEXT:    bne .LBB5_4
1126; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
1127; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB5_2 Depth=2
1128; CHECK-THUMB7-NEXT:    strexb r2, r12, [r3]
1129; CHECK-THUMB7-NEXT:    cmp r2, #0
1130; CHECK-THUMB7-NEXT:    bne .LBB5_2
1131; CHECK-THUMB7-NEXT:  .LBB5_4: @ %atomicrmw.start
1132; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB5_1 Depth=1
1133; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
1134; CHECK-THUMB7-NEXT:    uxtb r1, r1
1135; CHECK-THUMB7-NEXT:    subs r1, r0, r1
1136; CHECK-THUMB7-NEXT:    clz r1, r1
1137; CHECK-THUMB7-NEXT:    lsrs r1, r1, #5
1138; CHECK-THUMB7-NEXT:    cmp r1, #1
1139; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
1140; CHECK-THUMB7-NEXT:    bne .LBB5_1
1141; CHECK-THUMB7-NEXT:    b .LBB5_5
1142; CHECK-THUMB7-NEXT:  .LBB5_5: @ %atomicrmw.end
1143; CHECK-THUMB7-NEXT:    ldr r0, [sp] @ 4-byte Reload
1144; CHECK-THUMB7-NEXT:    add sp, #8
1145; CHECK-THUMB7-NEXT:    bx lr
1146;
1147; CHECK-THUMB6-LABEL: test_or_i8:
1148; CHECK-THUMB6:       @ %bb.0: @ %entry
1149; CHECK-THUMB6-NEXT:    .save {r7, lr}
1150; CHECK-THUMB6-NEXT:    push {r7, lr}
1151; CHECK-THUMB6-NEXT:    ldr r0, .LCPI5_0
1152; CHECK-THUMB6-NEXT:    movs r1, #1
1153; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_or_1
1154; CHECK-THUMB6-NEXT:    pop {r7, pc}
1155; CHECK-THUMB6-NEXT:    .p2align 2
1156; CHECK-THUMB6-NEXT:  @ %bb.1:
1157; CHECK-THUMB6-NEXT:  .LCPI5_0:
1158; CHECK-THUMB6-NEXT:    .long atomic_i8
1159;
1160; CHECK-THUMB8BASE-LABEL: test_or_i8:
1161; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
1162; CHECK-THUMB8BASE-NEXT:    .save {r4, lr}
1163; CHECK-THUMB8BASE-NEXT:    push {r4, lr}
1164; CHECK-THUMB8BASE-NEXT:    .pad #8
1165; CHECK-THUMB8BASE-NEXT:    sub sp, #8
1166; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i8
1167; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i8
1168; CHECK-THUMB8BASE-NEXT:    ldrb r0, [r0]
1169; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
1170; CHECK-THUMB8BASE-NEXT:    b .LBB5_1
1171; CHECK-THUMB8BASE-NEXT:  .LBB5_1: @ %atomicrmw.start
1172; CHECK-THUMB8BASE-NEXT:    @ =>This Loop Header: Depth=1
1173; CHECK-THUMB8BASE-NEXT:    @ Child Loop BB5_2 Depth 2
1174; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
1175; CHECK-THUMB8BASE-NEXT:    movs r0, #1
1176; CHECK-THUMB8BASE-NEXT:    mov r4, r1
1177; CHECK-THUMB8BASE-NEXT:    orrs r4, r0
1178; CHECK-THUMB8BASE-NEXT:    movw r3, :lower16:atomic_i8
1179; CHECK-THUMB8BASE-NEXT:    movt r3, :upper16:atomic_i8
1180; CHECK-THUMB8BASE-NEXT:    uxtb r1, r1
1181; CHECK-THUMB8BASE-NEXT:  .LBB5_2: @ %atomicrmw.start
1182; CHECK-THUMB8BASE-NEXT:    @ Parent Loop BB5_1 Depth=1
1183; CHECK-THUMB8BASE-NEXT:    @ => This Inner Loop Header: Depth=2
1184; CHECK-THUMB8BASE-NEXT:    ldrexb r0, [r3]
1185; CHECK-THUMB8BASE-NEXT:    cmp r0, r1
1186; CHECK-THUMB8BASE-NEXT:    bne .LBB5_4
1187; CHECK-THUMB8BASE-NEXT:  @ %bb.3: @ %atomicrmw.start
1188; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB5_2 Depth=2
1189; CHECK-THUMB8BASE-NEXT:    strexb r2, r4, [r3]
1190; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
1191; CHECK-THUMB8BASE-NEXT:    bne .LBB5_2
1192; CHECK-THUMB8BASE-NEXT:  .LBB5_4: @ %atomicrmw.start
1193; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB5_1 Depth=1
1194; CHECK-THUMB8BASE-NEXT:    str r0, [sp] @ 4-byte Spill
1195; CHECK-THUMB8BASE-NEXT:    uxtb r1, r1
1196; CHECK-THUMB8BASE-NEXT:    subs r1, r0, r1
1197; CHECK-THUMB8BASE-NEXT:    rsbs r2, r1, #0
1198; CHECK-THUMB8BASE-NEXT:    adcs r1, r2
1199; CHECK-THUMB8BASE-NEXT:    cmp r1, #1
1200; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
1201; CHECK-THUMB8BASE-NEXT:    bne .LBB5_1
1202; CHECK-THUMB8BASE-NEXT:    b .LBB5_5
1203; CHECK-THUMB8BASE-NEXT:  .LBB5_5: @ %atomicrmw.end
1204; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp] @ 4-byte Reload
1205; CHECK-THUMB8BASE-NEXT:    add sp, #8
1206; CHECK-THUMB8BASE-NEXT:    pop {r4, pc}
1207entry:
1208  %0 = atomicrmw or i8* @atomic_i8, i8 1 monotonic
1209  ret i8 %0
1210}
1211define i8 @test_xor_i8() {
1212; CHECK-ARM8-LABEL: test_xor_i8:
1213; CHECK-ARM8:       @ %bb.0: @ %entry
1214; CHECK-ARM8-NEXT:    .pad #8
1215; CHECK-ARM8-NEXT:    sub sp, sp, #8
1216; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i8
1217; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i8
1218; CHECK-ARM8-NEXT:    ldrb r0, [r0]
1219; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
1220; CHECK-ARM8-NEXT:    b .LBB6_1
1221; CHECK-ARM8-NEXT:  .LBB6_1: @ %atomicrmw.start
1222; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
1223; CHECK-ARM8-NEXT:    @ Child Loop BB6_2 Depth 2
1224; CHECK-ARM8-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
1225; CHECK-ARM8-NEXT:    eor r12, r1, #1
1226; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i8
1227; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i8
1228; CHECK-ARM8-NEXT:    uxtb r1, r1
1229; CHECK-ARM8-NEXT:  .LBB6_2: @ %atomicrmw.start
1230; CHECK-ARM8-NEXT:    @ Parent Loop BB6_1 Depth=1
1231; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
1232; CHECK-ARM8-NEXT:    ldrexb r0, [r3]
1233; CHECK-ARM8-NEXT:    cmp r0, r1
1234; CHECK-ARM8-NEXT:    bne .LBB6_4
1235; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
1236; CHECK-ARM8-NEXT:    @ in Loop: Header=BB6_2 Depth=2
1237; CHECK-ARM8-NEXT:    strexb r2, r12, [r3]
1238; CHECK-ARM8-NEXT:    cmp r2, #0
1239; CHECK-ARM8-NEXT:    bne .LBB6_2
1240; CHECK-ARM8-NEXT:  .LBB6_4: @ %atomicrmw.start
1241; CHECK-ARM8-NEXT:    @ in Loop: Header=BB6_1 Depth=1
1242; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
1243; CHECK-ARM8-NEXT:    uxtb r1, r1
1244; CHECK-ARM8-NEXT:    sub r1, r0, r1
1245; CHECK-ARM8-NEXT:    clz r1, r1
1246; CHECK-ARM8-NEXT:    lsr r1, r1, #5
1247; CHECK-ARM8-NEXT:    cmp r1, #1
1248; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
1249; CHECK-ARM8-NEXT:    bne .LBB6_1
1250; CHECK-ARM8-NEXT:    b .LBB6_5
1251; CHECK-ARM8-NEXT:  .LBB6_5: @ %atomicrmw.end
1252; CHECK-ARM8-NEXT:    ldr r0, [sp] @ 4-byte Reload
1253; CHECK-ARM8-NEXT:    add sp, sp, #8
1254; CHECK-ARM8-NEXT:    bx lr
1255;
1256; CHECK-ARM6-LABEL: test_xor_i8:
1257; CHECK-ARM6:       @ %bb.0: @ %entry
1258; CHECK-ARM6-NEXT:    .pad #8
1259; CHECK-ARM6-NEXT:    sub sp, sp, #8
1260; CHECK-ARM6-NEXT:    ldr r0, .LCPI6_0
1261; CHECK-ARM6-NEXT:    ldrb r0, [r0]
1262; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
1263; CHECK-ARM6-NEXT:    b .LBB6_1
1264; CHECK-ARM6-NEXT:  .LBB6_1: @ %atomicrmw.start
1265; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
1266; CHECK-ARM6-NEXT:    @ Child Loop BB6_2 Depth 2
1267; CHECK-ARM6-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
1268; CHECK-ARM6-NEXT:    eor r12, r1, #1
1269; CHECK-ARM6-NEXT:    ldr r3, .LCPI6_0
1270; CHECK-ARM6-NEXT:    uxtb r1, r1
1271; CHECK-ARM6-NEXT:  .LBB6_2: @ %atomicrmw.start
1272; CHECK-ARM6-NEXT:    @ Parent Loop BB6_1 Depth=1
1273; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
1274; CHECK-ARM6-NEXT:    ldrexb r0, [r3]
1275; CHECK-ARM6-NEXT:    cmp r0, r1
1276; CHECK-ARM6-NEXT:    bne .LBB6_4
1277; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
1278; CHECK-ARM6-NEXT:    @ in Loop: Header=BB6_2 Depth=2
1279; CHECK-ARM6-NEXT:    strexb r2, r12, [r3]
1280; CHECK-ARM6-NEXT:    cmp r2, #0
1281; CHECK-ARM6-NEXT:    bne .LBB6_2
1282; CHECK-ARM6-NEXT:  .LBB6_4: @ %atomicrmw.start
1283; CHECK-ARM6-NEXT:    @ in Loop: Header=BB6_1 Depth=1
1284; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
1285; CHECK-ARM6-NEXT:    uxtb r1, r1
1286; CHECK-ARM6-NEXT:    sub r1, r0, r1
1287; CHECK-ARM6-NEXT:    clz r1, r1
1288; CHECK-ARM6-NEXT:    lsr r1, r1, #5
1289; CHECK-ARM6-NEXT:    cmp r1, #1
1290; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
1291; CHECK-ARM6-NEXT:    bne .LBB6_1
1292; CHECK-ARM6-NEXT:    b .LBB6_5
1293; CHECK-ARM6-NEXT:  .LBB6_5: @ %atomicrmw.end
1294; CHECK-ARM6-NEXT:    ldr r0, [sp] @ 4-byte Reload
1295; CHECK-ARM6-NEXT:    add sp, sp, #8
1296; CHECK-ARM6-NEXT:    bx lr
1297; CHECK-ARM6-NEXT:    .p2align 2
1298; CHECK-ARM6-NEXT:  @ %bb.6:
1299; CHECK-ARM6-NEXT:  .LCPI6_0:
1300; CHECK-ARM6-NEXT:    .long atomic_i8
1301;
1302; CHECK-THUMB7-LABEL: test_xor_i8:
1303; CHECK-THUMB7:       @ %bb.0: @ %entry
1304; CHECK-THUMB7-NEXT:    .pad #8
1305; CHECK-THUMB7-NEXT:    sub sp, #8
1306; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i8
1307; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i8
1308; CHECK-THUMB7-NEXT:    ldrb r0, [r0]
1309; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
1310; CHECK-THUMB7-NEXT:    b .LBB6_1
1311; CHECK-THUMB7-NEXT:  .LBB6_1: @ %atomicrmw.start
1312; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
1313; CHECK-THUMB7-NEXT:    @ Child Loop BB6_2 Depth 2
1314; CHECK-THUMB7-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
1315; CHECK-THUMB7-NEXT:    eor r12, r1, #1
1316; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i8
1317; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i8
1318; CHECK-THUMB7-NEXT:    uxtb r1, r1
1319; CHECK-THUMB7-NEXT:  .LBB6_2: @ %atomicrmw.start
1320; CHECK-THUMB7-NEXT:    @ Parent Loop BB6_1 Depth=1
1321; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
1322; CHECK-THUMB7-NEXT:    ldrexb r0, [r3]
1323; CHECK-THUMB7-NEXT:    cmp r0, r1
1324; CHECK-THUMB7-NEXT:    bne .LBB6_4
1325; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
1326; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB6_2 Depth=2
1327; CHECK-THUMB7-NEXT:    strexb r2, r12, [r3]
1328; CHECK-THUMB7-NEXT:    cmp r2, #0
1329; CHECK-THUMB7-NEXT:    bne .LBB6_2
1330; CHECK-THUMB7-NEXT:  .LBB6_4: @ %atomicrmw.start
1331; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB6_1 Depth=1
1332; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
1333; CHECK-THUMB7-NEXT:    uxtb r1, r1
1334; CHECK-THUMB7-NEXT:    subs r1, r0, r1
1335; CHECK-THUMB7-NEXT:    clz r1, r1
1336; CHECK-THUMB7-NEXT:    lsrs r1, r1, #5
1337; CHECK-THUMB7-NEXT:    cmp r1, #1
1338; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
1339; CHECK-THUMB7-NEXT:    bne .LBB6_1
1340; CHECK-THUMB7-NEXT:    b .LBB6_5
1341; CHECK-THUMB7-NEXT:  .LBB6_5: @ %atomicrmw.end
1342; CHECK-THUMB7-NEXT:    ldr r0, [sp] @ 4-byte Reload
1343; CHECK-THUMB7-NEXT:    add sp, #8
1344; CHECK-THUMB7-NEXT:    bx lr
1345;
1346; CHECK-THUMB6-LABEL: test_xor_i8:
1347; CHECK-THUMB6:       @ %bb.0: @ %entry
1348; CHECK-THUMB6-NEXT:    .save {r7, lr}
1349; CHECK-THUMB6-NEXT:    push {r7, lr}
1350; CHECK-THUMB6-NEXT:    ldr r0, .LCPI6_0
1351; CHECK-THUMB6-NEXT:    movs r1, #1
1352; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_xor_1
1353; CHECK-THUMB6-NEXT:    pop {r7, pc}
1354; CHECK-THUMB6-NEXT:    .p2align 2
1355; CHECK-THUMB6-NEXT:  @ %bb.1:
1356; CHECK-THUMB6-NEXT:  .LCPI6_0:
1357; CHECK-THUMB6-NEXT:    .long atomic_i8
1358;
1359; CHECK-THUMB8BASE-LABEL: test_xor_i8:
1360; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
1361; CHECK-THUMB8BASE-NEXT:    .save {r4, lr}
1362; CHECK-THUMB8BASE-NEXT:    push {r4, lr}
1363; CHECK-THUMB8BASE-NEXT:    .pad #8
1364; CHECK-THUMB8BASE-NEXT:    sub sp, #8
1365; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i8
1366; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i8
1367; CHECK-THUMB8BASE-NEXT:    ldrb r0, [r0]
1368; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
1369; CHECK-THUMB8BASE-NEXT:    b .LBB6_1
1370; CHECK-THUMB8BASE-NEXT:  .LBB6_1: @ %atomicrmw.start
1371; CHECK-THUMB8BASE-NEXT:    @ =>This Loop Header: Depth=1
1372; CHECK-THUMB8BASE-NEXT:    @ Child Loop BB6_2 Depth 2
1373; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
1374; CHECK-THUMB8BASE-NEXT:    movs r0, #1
1375; CHECK-THUMB8BASE-NEXT:    mov r4, r1
1376; CHECK-THUMB8BASE-NEXT:    eors r4, r0
1377; CHECK-THUMB8BASE-NEXT:    movw r3, :lower16:atomic_i8
1378; CHECK-THUMB8BASE-NEXT:    movt r3, :upper16:atomic_i8
1379; CHECK-THUMB8BASE-NEXT:    uxtb r1, r1
1380; CHECK-THUMB8BASE-NEXT:  .LBB6_2: @ %atomicrmw.start
1381; CHECK-THUMB8BASE-NEXT:    @ Parent Loop BB6_1 Depth=1
1382; CHECK-THUMB8BASE-NEXT:    @ => This Inner Loop Header: Depth=2
1383; CHECK-THUMB8BASE-NEXT:    ldrexb r0, [r3]
1384; CHECK-THUMB8BASE-NEXT:    cmp r0, r1
1385; CHECK-THUMB8BASE-NEXT:    bne .LBB6_4
1386; CHECK-THUMB8BASE-NEXT:  @ %bb.3: @ %atomicrmw.start
1387; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB6_2 Depth=2
1388; CHECK-THUMB8BASE-NEXT:    strexb r2, r4, [r3]
1389; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
1390; CHECK-THUMB8BASE-NEXT:    bne .LBB6_2
1391; CHECK-THUMB8BASE-NEXT:  .LBB6_4: @ %atomicrmw.start
1392; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB6_1 Depth=1
1393; CHECK-THUMB8BASE-NEXT:    str r0, [sp] @ 4-byte Spill
1394; CHECK-THUMB8BASE-NEXT:    uxtb r1, r1
1395; CHECK-THUMB8BASE-NEXT:    subs r1, r0, r1
1396; CHECK-THUMB8BASE-NEXT:    rsbs r2, r1, #0
1397; CHECK-THUMB8BASE-NEXT:    adcs r1, r2
1398; CHECK-THUMB8BASE-NEXT:    cmp r1, #1
1399; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
1400; CHECK-THUMB8BASE-NEXT:    bne .LBB6_1
1401; CHECK-THUMB8BASE-NEXT:    b .LBB6_5
1402; CHECK-THUMB8BASE-NEXT:  .LBB6_5: @ %atomicrmw.end
1403; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp] @ 4-byte Reload
1404; CHECK-THUMB8BASE-NEXT:    add sp, #8
1405; CHECK-THUMB8BASE-NEXT:    pop {r4, pc}
1406entry:
1407  %0 = atomicrmw xor i8* @atomic_i8, i8 1 monotonic
1408  ret i8 %0
1409}
1410define i8 @test_max_i8() {
1411; CHECK-ARM8-LABEL: test_max_i8:
1412; CHECK-ARM8:       @ %bb.0: @ %entry
1413; CHECK-ARM8-NEXT:    .pad #8
1414; CHECK-ARM8-NEXT:    sub sp, sp, #8
1415; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i8
1416; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i8
1417; CHECK-ARM8-NEXT:    ldrb r0, [r0]
1418; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
1419; CHECK-ARM8-NEXT:    b .LBB7_1
1420; CHECK-ARM8-NEXT:  .LBB7_1: @ %atomicrmw.start
1421; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
1422; CHECK-ARM8-NEXT:    @ Child Loop BB7_2 Depth 2
1423; CHECK-ARM8-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
1424; CHECK-ARM8-NEXT:    sxtb r0, r1
1425; CHECK-ARM8-NEXT:    mov r12, #1
1426; CHECK-ARM8-NEXT:    cmp r0, #1
1427; CHECK-ARM8-NEXT:    movgt r12, r1
1428; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i8
1429; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i8
1430; CHECK-ARM8-NEXT:    uxtb r1, r1
1431; CHECK-ARM8-NEXT:  .LBB7_2: @ %atomicrmw.start
1432; CHECK-ARM8-NEXT:    @ Parent Loop BB7_1 Depth=1
1433; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
1434; CHECK-ARM8-NEXT:    ldrexb r0, [r3]
1435; CHECK-ARM8-NEXT:    cmp r0, r1
1436; CHECK-ARM8-NEXT:    bne .LBB7_4
1437; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
1438; CHECK-ARM8-NEXT:    @ in Loop: Header=BB7_2 Depth=2
1439; CHECK-ARM8-NEXT:    strexb r2, r12, [r3]
1440; CHECK-ARM8-NEXT:    cmp r2, #0
1441; CHECK-ARM8-NEXT:    bne .LBB7_2
1442; CHECK-ARM8-NEXT:  .LBB7_4: @ %atomicrmw.start
1443; CHECK-ARM8-NEXT:    @ in Loop: Header=BB7_1 Depth=1
1444; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
1445; CHECK-ARM8-NEXT:    uxtb r1, r1
1446; CHECK-ARM8-NEXT:    sub r1, r0, r1
1447; CHECK-ARM8-NEXT:    clz r1, r1
1448; CHECK-ARM8-NEXT:    lsr r1, r1, #5
1449; CHECK-ARM8-NEXT:    cmp r1, #1
1450; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
1451; CHECK-ARM8-NEXT:    bne .LBB7_1
1452; CHECK-ARM8-NEXT:    b .LBB7_5
1453; CHECK-ARM8-NEXT:  .LBB7_5: @ %atomicrmw.end
1454; CHECK-ARM8-NEXT:    ldr r0, [sp] @ 4-byte Reload
1455; CHECK-ARM8-NEXT:    add sp, sp, #8
1456; CHECK-ARM8-NEXT:    bx lr
1457;
1458; CHECK-ARM6-LABEL: test_max_i8:
1459; CHECK-ARM6:       @ %bb.0: @ %entry
1460; CHECK-ARM6-NEXT:    .pad #8
1461; CHECK-ARM6-NEXT:    sub sp, sp, #8
1462; CHECK-ARM6-NEXT:    ldr r0, .LCPI7_0
1463; CHECK-ARM6-NEXT:    ldrb r0, [r0]
1464; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
1465; CHECK-ARM6-NEXT:    b .LBB7_1
1466; CHECK-ARM6-NEXT:  .LBB7_1: @ %atomicrmw.start
1467; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
1468; CHECK-ARM6-NEXT:    @ Child Loop BB7_2 Depth 2
1469; CHECK-ARM6-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
1470; CHECK-ARM6-NEXT:    sxtb r0, r1
1471; CHECK-ARM6-NEXT:    mov r12, #1
1472; CHECK-ARM6-NEXT:    cmp r0, #1
1473; CHECK-ARM6-NEXT:    movgt r12, r1
1474; CHECK-ARM6-NEXT:    ldr r3, .LCPI7_0
1475; CHECK-ARM6-NEXT:    uxtb r1, r1
1476; CHECK-ARM6-NEXT:  .LBB7_2: @ %atomicrmw.start
1477; CHECK-ARM6-NEXT:    @ Parent Loop BB7_1 Depth=1
1478; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
1479; CHECK-ARM6-NEXT:    ldrexb r0, [r3]
1480; CHECK-ARM6-NEXT:    cmp r0, r1
1481; CHECK-ARM6-NEXT:    bne .LBB7_4
1482; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
1483; CHECK-ARM6-NEXT:    @ in Loop: Header=BB7_2 Depth=2
1484; CHECK-ARM6-NEXT:    strexb r2, r12, [r3]
1485; CHECK-ARM6-NEXT:    cmp r2, #0
1486; CHECK-ARM6-NEXT:    bne .LBB7_2
1487; CHECK-ARM6-NEXT:  .LBB7_4: @ %atomicrmw.start
1488; CHECK-ARM6-NEXT:    @ in Loop: Header=BB7_1 Depth=1
1489; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
1490; CHECK-ARM6-NEXT:    uxtb r1, r1
1491; CHECK-ARM6-NEXT:    sub r1, r0, r1
1492; CHECK-ARM6-NEXT:    clz r1, r1
1493; CHECK-ARM6-NEXT:    lsr r1, r1, #5
1494; CHECK-ARM6-NEXT:    cmp r1, #1
1495; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
1496; CHECK-ARM6-NEXT:    bne .LBB7_1
1497; CHECK-ARM6-NEXT:    b .LBB7_5
1498; CHECK-ARM6-NEXT:  .LBB7_5: @ %atomicrmw.end
1499; CHECK-ARM6-NEXT:    ldr r0, [sp] @ 4-byte Reload
1500; CHECK-ARM6-NEXT:    add sp, sp, #8
1501; CHECK-ARM6-NEXT:    bx lr
1502; CHECK-ARM6-NEXT:    .p2align 2
1503; CHECK-ARM6-NEXT:  @ %bb.6:
1504; CHECK-ARM6-NEXT:  .LCPI7_0:
1505; CHECK-ARM6-NEXT:    .long atomic_i8
1506;
1507; CHECK-THUMB7-LABEL: test_max_i8:
1508; CHECK-THUMB7:       @ %bb.0: @ %entry
1509; CHECK-THUMB7-NEXT:    .pad #8
1510; CHECK-THUMB7-NEXT:    sub sp, #8
1511; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i8
1512; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i8
1513; CHECK-THUMB7-NEXT:    ldrb r0, [r0]
1514; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
1515; CHECK-THUMB7-NEXT:    b .LBB7_1
1516; CHECK-THUMB7-NEXT:  .LBB7_1: @ %atomicrmw.start
1517; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
1518; CHECK-THUMB7-NEXT:    @ Child Loop BB7_2 Depth 2
1519; CHECK-THUMB7-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
1520; CHECK-THUMB7-NEXT:    sxtb r0, r1
1521; CHECK-THUMB7-NEXT:    mov.w r12, #1
1522; CHECK-THUMB7-NEXT:    cmp r0, #1
1523; CHECK-THUMB7-NEXT:    it gt
1524; CHECK-THUMB7-NEXT:    movgt r12, r1
1525; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i8
1526; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i8
1527; CHECK-THUMB7-NEXT:    uxtb r1, r1
1528; CHECK-THUMB7-NEXT:  .LBB7_2: @ %atomicrmw.start
1529; CHECK-THUMB7-NEXT:    @ Parent Loop BB7_1 Depth=1
1530; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
1531; CHECK-THUMB7-NEXT:    ldrexb r0, [r3]
1532; CHECK-THUMB7-NEXT:    cmp r0, r1
1533; CHECK-THUMB7-NEXT:    bne .LBB7_4
1534; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
1535; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB7_2 Depth=2
1536; CHECK-THUMB7-NEXT:    strexb r2, r12, [r3]
1537; CHECK-THUMB7-NEXT:    cmp r2, #0
1538; CHECK-THUMB7-NEXT:    bne .LBB7_2
1539; CHECK-THUMB7-NEXT:  .LBB7_4: @ %atomicrmw.start
1540; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB7_1 Depth=1
1541; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
1542; CHECK-THUMB7-NEXT:    uxtb r1, r1
1543; CHECK-THUMB7-NEXT:    subs r1, r0, r1
1544; CHECK-THUMB7-NEXT:    clz r1, r1
1545; CHECK-THUMB7-NEXT:    lsrs r1, r1, #5
1546; CHECK-THUMB7-NEXT:    cmp r1, #1
1547; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
1548; CHECK-THUMB7-NEXT:    bne .LBB7_1
1549; CHECK-THUMB7-NEXT:    b .LBB7_5
1550; CHECK-THUMB7-NEXT:  .LBB7_5: @ %atomicrmw.end
1551; CHECK-THUMB7-NEXT:    ldr r0, [sp] @ 4-byte Reload
1552; CHECK-THUMB7-NEXT:    add sp, #8
1553; CHECK-THUMB7-NEXT:    bx lr
1554;
1555; CHECK-THUMB6-LABEL: test_max_i8:
1556; CHECK-THUMB6:       @ %bb.0: @ %entry
1557; CHECK-THUMB6-NEXT:    .save {r7, lr}
1558; CHECK-THUMB6-NEXT:    push {r7, lr}
1559; CHECK-THUMB6-NEXT:    ldr r0, .LCPI7_0
1560; CHECK-THUMB6-NEXT:    movs r1, #1
1561; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_max_1
1562; CHECK-THUMB6-NEXT:    pop {r7, pc}
1563; CHECK-THUMB6-NEXT:    .p2align 2
1564; CHECK-THUMB6-NEXT:  @ %bb.1:
1565; CHECK-THUMB6-NEXT:  .LCPI7_0:
1566; CHECK-THUMB6-NEXT:    .long atomic_i8
1567;
1568; CHECK-THUMB8BASE-LABEL: test_max_i8:
1569; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
1570; CHECK-THUMB8BASE-NEXT:    .save {r4, lr}
1571; CHECK-THUMB8BASE-NEXT:    push {r4, lr}
1572; CHECK-THUMB8BASE-NEXT:    .pad #20
1573; CHECK-THUMB8BASE-NEXT:    sub sp, #20
1574; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i8
1575; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i8
1576; CHECK-THUMB8BASE-NEXT:    ldrb r0, [r0]
1577; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #16] @ 4-byte Spill
1578; CHECK-THUMB8BASE-NEXT:    b .LBB7_1
1579; CHECK-THUMB8BASE-NEXT:  .LBB7_1: @ %atomicrmw.start
1580; CHECK-THUMB8BASE-NEXT:    @ =>This Loop Header: Depth=1
1581; CHECK-THUMB8BASE-NEXT:    @ Child Loop BB7_4 Depth 2
1582; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #16] @ 4-byte Reload
1583; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
1584; CHECK-THUMB8BASE-NEXT:    sxtb r1, r0
1585; CHECK-THUMB8BASE-NEXT:    movs r2, #1
1586; CHECK-THUMB8BASE-NEXT:    str r2, [sp, #8] @ 4-byte Spill
1587; CHECK-THUMB8BASE-NEXT:    cmp r1, #1
1588; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #12] @ 4-byte Spill
1589; CHECK-THUMB8BASE-NEXT:    bgt .LBB7_3
1590; CHECK-THUMB8BASE-NEXT:  @ %bb.2: @ %atomicrmw.start
1591; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB7_1 Depth=1
1592; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #8] @ 4-byte Reload
1593; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #12] @ 4-byte Spill
1594; CHECK-THUMB8BASE-NEXT:  .LBB7_3: @ %atomicrmw.start
1595; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB7_1 Depth=1
1596; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
1597; CHECK-THUMB8BASE-NEXT:    ldr r4, [sp, #12] @ 4-byte Reload
1598; CHECK-THUMB8BASE-NEXT:    movw r3, :lower16:atomic_i8
1599; CHECK-THUMB8BASE-NEXT:    movt r3, :upper16:atomic_i8
1600; CHECK-THUMB8BASE-NEXT:    uxtb r1, r1
1601; CHECK-THUMB8BASE-NEXT:  .LBB7_4: @ %atomicrmw.start
1602; CHECK-THUMB8BASE-NEXT:    @ Parent Loop BB7_1 Depth=1
1603; CHECK-THUMB8BASE-NEXT:    @ => This Inner Loop Header: Depth=2
1604; CHECK-THUMB8BASE-NEXT:    ldrexb r0, [r3]
1605; CHECK-THUMB8BASE-NEXT:    cmp r0, r1
1606; CHECK-THUMB8BASE-NEXT:    bne .LBB7_6
1607; CHECK-THUMB8BASE-NEXT:  @ %bb.5: @ %atomicrmw.start
1608; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB7_4 Depth=2
1609; CHECK-THUMB8BASE-NEXT:    strexb r2, r4, [r3]
1610; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
1611; CHECK-THUMB8BASE-NEXT:    bne .LBB7_4
1612; CHECK-THUMB8BASE-NEXT:  .LBB7_6: @ %atomicrmw.start
1613; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB7_1 Depth=1
1614; CHECK-THUMB8BASE-NEXT:    str r0, [sp] @ 4-byte Spill
1615; CHECK-THUMB8BASE-NEXT:    uxtb r1, r1
1616; CHECK-THUMB8BASE-NEXT:    subs r1, r0, r1
1617; CHECK-THUMB8BASE-NEXT:    rsbs r2, r1, #0
1618; CHECK-THUMB8BASE-NEXT:    adcs r1, r2
1619; CHECK-THUMB8BASE-NEXT:    cmp r1, #1
1620; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #16] @ 4-byte Spill
1621; CHECK-THUMB8BASE-NEXT:    bne .LBB7_1
1622; CHECK-THUMB8BASE-NEXT:    b .LBB7_7
1623; CHECK-THUMB8BASE-NEXT:  .LBB7_7: @ %atomicrmw.end
1624; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp] @ 4-byte Reload
1625; CHECK-THUMB8BASE-NEXT:    add sp, #20
1626; CHECK-THUMB8BASE-NEXT:    pop {r4, pc}
1627entry:
1628  %0 = atomicrmw max i8* @atomic_i8, i8 1 monotonic
1629  ret i8 %0
1630}
1631define i8 @test_min_i8() {
1632; CHECK-ARM8-LABEL: test_min_i8:
1633; CHECK-ARM8:       @ %bb.0: @ %entry
1634; CHECK-ARM8-NEXT:    .pad #8
1635; CHECK-ARM8-NEXT:    sub sp, sp, #8
1636; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i8
1637; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i8
1638; CHECK-ARM8-NEXT:    ldrb r0, [r0]
1639; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
1640; CHECK-ARM8-NEXT:    b .LBB8_1
1641; CHECK-ARM8-NEXT:  .LBB8_1: @ %atomicrmw.start
1642; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
1643; CHECK-ARM8-NEXT:    @ Child Loop BB8_2 Depth 2
1644; CHECK-ARM8-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
1645; CHECK-ARM8-NEXT:    sxtb r0, r1
1646; CHECK-ARM8-NEXT:    mov r12, #1
1647; CHECK-ARM8-NEXT:    cmp r0, #2
1648; CHECK-ARM8-NEXT:    movlt r12, r1
1649; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i8
1650; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i8
1651; CHECK-ARM8-NEXT:    uxtb r1, r1
1652; CHECK-ARM8-NEXT:  .LBB8_2: @ %atomicrmw.start
1653; CHECK-ARM8-NEXT:    @ Parent Loop BB8_1 Depth=1
1654; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
1655; CHECK-ARM8-NEXT:    ldrexb r0, [r3]
1656; CHECK-ARM8-NEXT:    cmp r0, r1
1657; CHECK-ARM8-NEXT:    bne .LBB8_4
1658; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
1659; CHECK-ARM8-NEXT:    @ in Loop: Header=BB8_2 Depth=2
1660; CHECK-ARM8-NEXT:    strexb r2, r12, [r3]
1661; CHECK-ARM8-NEXT:    cmp r2, #0
1662; CHECK-ARM8-NEXT:    bne .LBB8_2
1663; CHECK-ARM8-NEXT:  .LBB8_4: @ %atomicrmw.start
1664; CHECK-ARM8-NEXT:    @ in Loop: Header=BB8_1 Depth=1
1665; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
1666; CHECK-ARM8-NEXT:    uxtb r1, r1
1667; CHECK-ARM8-NEXT:    sub r1, r0, r1
1668; CHECK-ARM8-NEXT:    clz r1, r1
1669; CHECK-ARM8-NEXT:    lsr r1, r1, #5
1670; CHECK-ARM8-NEXT:    cmp r1, #1
1671; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
1672; CHECK-ARM8-NEXT:    bne .LBB8_1
1673; CHECK-ARM8-NEXT:    b .LBB8_5
1674; CHECK-ARM8-NEXT:  .LBB8_5: @ %atomicrmw.end
1675; CHECK-ARM8-NEXT:    ldr r0, [sp] @ 4-byte Reload
1676; CHECK-ARM8-NEXT:    add sp, sp, #8
1677; CHECK-ARM8-NEXT:    bx lr
1678;
1679; CHECK-ARM6-LABEL: test_min_i8:
1680; CHECK-ARM6:       @ %bb.0: @ %entry
1681; CHECK-ARM6-NEXT:    .pad #8
1682; CHECK-ARM6-NEXT:    sub sp, sp, #8
1683; CHECK-ARM6-NEXT:    ldr r0, .LCPI8_0
1684; CHECK-ARM6-NEXT:    ldrb r0, [r0]
1685; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
1686; CHECK-ARM6-NEXT:    b .LBB8_1
1687; CHECK-ARM6-NEXT:  .LBB8_1: @ %atomicrmw.start
1688; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
1689; CHECK-ARM6-NEXT:    @ Child Loop BB8_2 Depth 2
1690; CHECK-ARM6-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
1691; CHECK-ARM6-NEXT:    sxtb r0, r1
1692; CHECK-ARM6-NEXT:    mov r12, #1
1693; CHECK-ARM6-NEXT:    cmp r0, #2
1694; CHECK-ARM6-NEXT:    movlt r12, r1
1695; CHECK-ARM6-NEXT:    ldr r3, .LCPI8_0
1696; CHECK-ARM6-NEXT:    uxtb r1, r1
1697; CHECK-ARM6-NEXT:  .LBB8_2: @ %atomicrmw.start
1698; CHECK-ARM6-NEXT:    @ Parent Loop BB8_1 Depth=1
1699; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
1700; CHECK-ARM6-NEXT:    ldrexb r0, [r3]
1701; CHECK-ARM6-NEXT:    cmp r0, r1
1702; CHECK-ARM6-NEXT:    bne .LBB8_4
1703; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
1704; CHECK-ARM6-NEXT:    @ in Loop: Header=BB8_2 Depth=2
1705; CHECK-ARM6-NEXT:    strexb r2, r12, [r3]
1706; CHECK-ARM6-NEXT:    cmp r2, #0
1707; CHECK-ARM6-NEXT:    bne .LBB8_2
1708; CHECK-ARM6-NEXT:  .LBB8_4: @ %atomicrmw.start
1709; CHECK-ARM6-NEXT:    @ in Loop: Header=BB8_1 Depth=1
1710; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
1711; CHECK-ARM6-NEXT:    uxtb r1, r1
1712; CHECK-ARM6-NEXT:    sub r1, r0, r1
1713; CHECK-ARM6-NEXT:    clz r1, r1
1714; CHECK-ARM6-NEXT:    lsr r1, r1, #5
1715; CHECK-ARM6-NEXT:    cmp r1, #1
1716; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
1717; CHECK-ARM6-NEXT:    bne .LBB8_1
1718; CHECK-ARM6-NEXT:    b .LBB8_5
1719; CHECK-ARM6-NEXT:  .LBB8_5: @ %atomicrmw.end
1720; CHECK-ARM6-NEXT:    ldr r0, [sp] @ 4-byte Reload
1721; CHECK-ARM6-NEXT:    add sp, sp, #8
1722; CHECK-ARM6-NEXT:    bx lr
1723; CHECK-ARM6-NEXT:    .p2align 2
1724; CHECK-ARM6-NEXT:  @ %bb.6:
1725; CHECK-ARM6-NEXT:  .LCPI8_0:
1726; CHECK-ARM6-NEXT:    .long atomic_i8
1727;
1728; CHECK-THUMB7-LABEL: test_min_i8:
1729; CHECK-THUMB7:       @ %bb.0: @ %entry
1730; CHECK-THUMB7-NEXT:    .pad #8
1731; CHECK-THUMB7-NEXT:    sub sp, #8
1732; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i8
1733; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i8
1734; CHECK-THUMB7-NEXT:    ldrb r0, [r0]
1735; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
1736; CHECK-THUMB7-NEXT:    b .LBB8_1
1737; CHECK-THUMB7-NEXT:  .LBB8_1: @ %atomicrmw.start
1738; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
1739; CHECK-THUMB7-NEXT:    @ Child Loop BB8_2 Depth 2
1740; CHECK-THUMB7-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
1741; CHECK-THUMB7-NEXT:    sxtb r0, r1
1742; CHECK-THUMB7-NEXT:    mov.w r12, #1
1743; CHECK-THUMB7-NEXT:    cmp r0, #2
1744; CHECK-THUMB7-NEXT:    it lt
1745; CHECK-THUMB7-NEXT:    movlt r12, r1
1746; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i8
1747; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i8
1748; CHECK-THUMB7-NEXT:    uxtb r1, r1
1749; CHECK-THUMB7-NEXT:  .LBB8_2: @ %atomicrmw.start
1750; CHECK-THUMB7-NEXT:    @ Parent Loop BB8_1 Depth=1
1751; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
1752; CHECK-THUMB7-NEXT:    ldrexb r0, [r3]
1753; CHECK-THUMB7-NEXT:    cmp r0, r1
1754; CHECK-THUMB7-NEXT:    bne .LBB8_4
1755; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
1756; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB8_2 Depth=2
1757; CHECK-THUMB7-NEXT:    strexb r2, r12, [r3]
1758; CHECK-THUMB7-NEXT:    cmp r2, #0
1759; CHECK-THUMB7-NEXT:    bne .LBB8_2
1760; CHECK-THUMB7-NEXT:  .LBB8_4: @ %atomicrmw.start
1761; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB8_1 Depth=1
1762; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
1763; CHECK-THUMB7-NEXT:    uxtb r1, r1
1764; CHECK-THUMB7-NEXT:    subs r1, r0, r1
1765; CHECK-THUMB7-NEXT:    clz r1, r1
1766; CHECK-THUMB7-NEXT:    lsrs r1, r1, #5
1767; CHECK-THUMB7-NEXT:    cmp r1, #1
1768; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
1769; CHECK-THUMB7-NEXT:    bne .LBB8_1
1770; CHECK-THUMB7-NEXT:    b .LBB8_5
1771; CHECK-THUMB7-NEXT:  .LBB8_5: @ %atomicrmw.end
1772; CHECK-THUMB7-NEXT:    ldr r0, [sp] @ 4-byte Reload
1773; CHECK-THUMB7-NEXT:    add sp, #8
1774; CHECK-THUMB7-NEXT:    bx lr
1775;
1776; CHECK-THUMB6-LABEL: test_min_i8:
1777; CHECK-THUMB6:       @ %bb.0: @ %entry
1778; CHECK-THUMB6-NEXT:    .save {r7, lr}
1779; CHECK-THUMB6-NEXT:    push {r7, lr}
1780; CHECK-THUMB6-NEXT:    ldr r0, .LCPI8_0
1781; CHECK-THUMB6-NEXT:    movs r1, #1
1782; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_min_1
1783; CHECK-THUMB6-NEXT:    pop {r7, pc}
1784; CHECK-THUMB6-NEXT:    .p2align 2
1785; CHECK-THUMB6-NEXT:  @ %bb.1:
1786; CHECK-THUMB6-NEXT:  .LCPI8_0:
1787; CHECK-THUMB6-NEXT:    .long atomic_i8
1788;
1789; CHECK-THUMB8BASE-LABEL: test_min_i8:
1790; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
1791; CHECK-THUMB8BASE-NEXT:    .save {r4, lr}
1792; CHECK-THUMB8BASE-NEXT:    push {r4, lr}
1793; CHECK-THUMB8BASE-NEXT:    .pad #20
1794; CHECK-THUMB8BASE-NEXT:    sub sp, #20
1795; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i8
1796; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i8
1797; CHECK-THUMB8BASE-NEXT:    ldrb r0, [r0]
1798; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #16] @ 4-byte Spill
1799; CHECK-THUMB8BASE-NEXT:    b .LBB8_1
1800; CHECK-THUMB8BASE-NEXT:  .LBB8_1: @ %atomicrmw.start
1801; CHECK-THUMB8BASE-NEXT:    @ =>This Loop Header: Depth=1
1802; CHECK-THUMB8BASE-NEXT:    @ Child Loop BB8_4 Depth 2
1803; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #16] @ 4-byte Reload
1804; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
1805; CHECK-THUMB8BASE-NEXT:    sxtb r1, r0
1806; CHECK-THUMB8BASE-NEXT:    movs r2, #1
1807; CHECK-THUMB8BASE-NEXT:    str r2, [sp, #8] @ 4-byte Spill
1808; CHECK-THUMB8BASE-NEXT:    cmp r1, #2
1809; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #12] @ 4-byte Spill
1810; CHECK-THUMB8BASE-NEXT:    blt .LBB8_3
1811; CHECK-THUMB8BASE-NEXT:  @ %bb.2: @ %atomicrmw.start
1812; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB8_1 Depth=1
1813; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #8] @ 4-byte Reload
1814; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #12] @ 4-byte Spill
1815; CHECK-THUMB8BASE-NEXT:  .LBB8_3: @ %atomicrmw.start
1816; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB8_1 Depth=1
1817; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
1818; CHECK-THUMB8BASE-NEXT:    ldr r4, [sp, #12] @ 4-byte Reload
1819; CHECK-THUMB8BASE-NEXT:    movw r3, :lower16:atomic_i8
1820; CHECK-THUMB8BASE-NEXT:    movt r3, :upper16:atomic_i8
1821; CHECK-THUMB8BASE-NEXT:    uxtb r1, r1
1822; CHECK-THUMB8BASE-NEXT:  .LBB8_4: @ %atomicrmw.start
1823; CHECK-THUMB8BASE-NEXT:    @ Parent Loop BB8_1 Depth=1
1824; CHECK-THUMB8BASE-NEXT:    @ => This Inner Loop Header: Depth=2
1825; CHECK-THUMB8BASE-NEXT:    ldrexb r0, [r3]
1826; CHECK-THUMB8BASE-NEXT:    cmp r0, r1
1827; CHECK-THUMB8BASE-NEXT:    bne .LBB8_6
1828; CHECK-THUMB8BASE-NEXT:  @ %bb.5: @ %atomicrmw.start
1829; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB8_4 Depth=2
1830; CHECK-THUMB8BASE-NEXT:    strexb r2, r4, [r3]
1831; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
1832; CHECK-THUMB8BASE-NEXT:    bne .LBB8_4
1833; CHECK-THUMB8BASE-NEXT:  .LBB8_6: @ %atomicrmw.start
1834; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB8_1 Depth=1
1835; CHECK-THUMB8BASE-NEXT:    str r0, [sp] @ 4-byte Spill
1836; CHECK-THUMB8BASE-NEXT:    uxtb r1, r1
1837; CHECK-THUMB8BASE-NEXT:    subs r1, r0, r1
1838; CHECK-THUMB8BASE-NEXT:    rsbs r2, r1, #0
1839; CHECK-THUMB8BASE-NEXT:    adcs r1, r2
1840; CHECK-THUMB8BASE-NEXT:    cmp r1, #1
1841; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #16] @ 4-byte Spill
1842; CHECK-THUMB8BASE-NEXT:    bne .LBB8_1
1843; CHECK-THUMB8BASE-NEXT:    b .LBB8_7
1844; CHECK-THUMB8BASE-NEXT:  .LBB8_7: @ %atomicrmw.end
1845; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp] @ 4-byte Reload
1846; CHECK-THUMB8BASE-NEXT:    add sp, #20
1847; CHECK-THUMB8BASE-NEXT:    pop {r4, pc}
1848entry:
1849  %0 = atomicrmw min i8* @atomic_i8, i8 1 monotonic
1850  ret i8 %0
1851}
1852define i8 @test_umax_i8() {
1853; CHECK-ARM8-LABEL: test_umax_i8:
1854; CHECK-ARM8:       @ %bb.0: @ %entry
1855; CHECK-ARM8-NEXT:    .save {r11, lr}
1856; CHECK-ARM8-NEXT:    push {r11, lr}
1857; CHECK-ARM8-NEXT:    .pad #8
1858; CHECK-ARM8-NEXT:    sub sp, sp, #8
1859; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i8
1860; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i8
1861; CHECK-ARM8-NEXT:    ldrb r0, [r0]
1862; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
1863; CHECK-ARM8-NEXT:    b .LBB9_1
1864; CHECK-ARM8-NEXT:  .LBB9_1: @ %atomicrmw.start
1865; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
1866; CHECK-ARM8-NEXT:    @ Child Loop BB9_2 Depth 2
1867; CHECK-ARM8-NEXT:    ldr r12, [sp, #4] @ 4-byte Reload
1868; CHECK-ARM8-NEXT:    uxtb r1, r12
1869; CHECK-ARM8-NEXT:    mov lr, #1
1870; CHECK-ARM8-NEXT:    cmp r1, #1
1871; CHECK-ARM8-NEXT:    movhi lr, r12
1872; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i8
1873; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i8
1874; CHECK-ARM8-NEXT:    uxtb r12, r12
1875; CHECK-ARM8-NEXT:  .LBB9_2: @ %atomicrmw.start
1876; CHECK-ARM8-NEXT:    @ Parent Loop BB9_1 Depth=1
1877; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
1878; CHECK-ARM8-NEXT:    ldrexb r0, [r3]
1879; CHECK-ARM8-NEXT:    cmp r0, r12
1880; CHECK-ARM8-NEXT:    bne .LBB9_4
1881; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
1882; CHECK-ARM8-NEXT:    @ in Loop: Header=BB9_2 Depth=2
1883; CHECK-ARM8-NEXT:    strexb r2, lr, [r3]
1884; CHECK-ARM8-NEXT:    cmp r2, #0
1885; CHECK-ARM8-NEXT:    bne .LBB9_2
1886; CHECK-ARM8-NEXT:  .LBB9_4: @ %atomicrmw.start
1887; CHECK-ARM8-NEXT:    @ in Loop: Header=BB9_1 Depth=1
1888; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
1889; CHECK-ARM8-NEXT:    sub r1, r0, r1
1890; CHECK-ARM8-NEXT:    clz r1, r1
1891; CHECK-ARM8-NEXT:    lsr r1, r1, #5
1892; CHECK-ARM8-NEXT:    cmp r1, #1
1893; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
1894; CHECK-ARM8-NEXT:    bne .LBB9_1
1895; CHECK-ARM8-NEXT:    b .LBB9_5
1896; CHECK-ARM8-NEXT:  .LBB9_5: @ %atomicrmw.end
1897; CHECK-ARM8-NEXT:    ldr r0, [sp] @ 4-byte Reload
1898; CHECK-ARM8-NEXT:    add sp, sp, #8
1899; CHECK-ARM8-NEXT:    pop {r11, pc}
1900;
1901; CHECK-ARM6-LABEL: test_umax_i8:
1902; CHECK-ARM6:       @ %bb.0: @ %entry
1903; CHECK-ARM6-NEXT:    .save {r11, lr}
1904; CHECK-ARM6-NEXT:    push {r11, lr}
1905; CHECK-ARM6-NEXT:    .pad #8
1906; CHECK-ARM6-NEXT:    sub sp, sp, #8
1907; CHECK-ARM6-NEXT:    ldr r0, .LCPI9_0
1908; CHECK-ARM6-NEXT:    ldrb r0, [r0]
1909; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
1910; CHECK-ARM6-NEXT:    b .LBB9_1
1911; CHECK-ARM6-NEXT:  .LBB9_1: @ %atomicrmw.start
1912; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
1913; CHECK-ARM6-NEXT:    @ Child Loop BB9_2 Depth 2
1914; CHECK-ARM6-NEXT:    ldr r12, [sp, #4] @ 4-byte Reload
1915; CHECK-ARM6-NEXT:    uxtb r1, r12
1916; CHECK-ARM6-NEXT:    mov lr, #1
1917; CHECK-ARM6-NEXT:    cmp r1, #1
1918; CHECK-ARM6-NEXT:    movhi lr, r12
1919; CHECK-ARM6-NEXT:    ldr r3, .LCPI9_0
1920; CHECK-ARM6-NEXT:    uxtb r12, r12
1921; CHECK-ARM6-NEXT:  .LBB9_2: @ %atomicrmw.start
1922; CHECK-ARM6-NEXT:    @ Parent Loop BB9_1 Depth=1
1923; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
1924; CHECK-ARM6-NEXT:    ldrexb r0, [r3]
1925; CHECK-ARM6-NEXT:    cmp r0, r12
1926; CHECK-ARM6-NEXT:    bne .LBB9_4
1927; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
1928; CHECK-ARM6-NEXT:    @ in Loop: Header=BB9_2 Depth=2
1929; CHECK-ARM6-NEXT:    strexb r2, lr, [r3]
1930; CHECK-ARM6-NEXT:    cmp r2, #0
1931; CHECK-ARM6-NEXT:    bne .LBB9_2
1932; CHECK-ARM6-NEXT:  .LBB9_4: @ %atomicrmw.start
1933; CHECK-ARM6-NEXT:    @ in Loop: Header=BB9_1 Depth=1
1934; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
1935; CHECK-ARM6-NEXT:    sub r1, r0, r1
1936; CHECK-ARM6-NEXT:    clz r1, r1
1937; CHECK-ARM6-NEXT:    lsr r1, r1, #5
1938; CHECK-ARM6-NEXT:    cmp r1, #1
1939; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
1940; CHECK-ARM6-NEXT:    bne .LBB9_1
1941; CHECK-ARM6-NEXT:    b .LBB9_5
1942; CHECK-ARM6-NEXT:  .LBB9_5: @ %atomicrmw.end
1943; CHECK-ARM6-NEXT:    ldr r0, [sp] @ 4-byte Reload
1944; CHECK-ARM6-NEXT:    add sp, sp, #8
1945; CHECK-ARM6-NEXT:    pop {r11, pc}
1946; CHECK-ARM6-NEXT:    .p2align 2
1947; CHECK-ARM6-NEXT:  @ %bb.6:
1948; CHECK-ARM6-NEXT:  .LCPI9_0:
1949; CHECK-ARM6-NEXT:    .long atomic_i8
1950;
1951; CHECK-THUMB7-LABEL: test_umax_i8:
1952; CHECK-THUMB7:       @ %bb.0: @ %entry
1953; CHECK-THUMB7-NEXT:    .save {r4, lr}
1954; CHECK-THUMB7-NEXT:    push {r4, lr}
1955; CHECK-THUMB7-NEXT:    .pad #8
1956; CHECK-THUMB7-NEXT:    sub sp, #8
1957; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i8
1958; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i8
1959; CHECK-THUMB7-NEXT:    ldrb r0, [r0]
1960; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
1961; CHECK-THUMB7-NEXT:    b .LBB9_1
1962; CHECK-THUMB7-NEXT:  .LBB9_1: @ %atomicrmw.start
1963; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
1964; CHECK-THUMB7-NEXT:    @ Child Loop BB9_2 Depth 2
1965; CHECK-THUMB7-NEXT:    ldr r4, [sp, #4] @ 4-byte Reload
1966; CHECK-THUMB7-NEXT:    uxtb r1, r4
1967; CHECK-THUMB7-NEXT:    mov.w r12, #1
1968; CHECK-THUMB7-NEXT:    cmp r1, #1
1969; CHECK-THUMB7-NEXT:    it hi
1970; CHECK-THUMB7-NEXT:    movhi r12, r4
1971; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i8
1972; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i8
1973; CHECK-THUMB7-NEXT:    uxtb r4, r4
1974; CHECK-THUMB7-NEXT:  .LBB9_2: @ %atomicrmw.start
1975; CHECK-THUMB7-NEXT:    @ Parent Loop BB9_1 Depth=1
1976; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
1977; CHECK-THUMB7-NEXT:    ldrexb r0, [r3]
1978; CHECK-THUMB7-NEXT:    cmp r0, r4
1979; CHECK-THUMB7-NEXT:    bne .LBB9_4
1980; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
1981; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB9_2 Depth=2
1982; CHECK-THUMB7-NEXT:    strexb r2, r12, [r3]
1983; CHECK-THUMB7-NEXT:    cmp r2, #0
1984; CHECK-THUMB7-NEXT:    bne .LBB9_2
1985; CHECK-THUMB7-NEXT:  .LBB9_4: @ %atomicrmw.start
1986; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB9_1 Depth=1
1987; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
1988; CHECK-THUMB7-NEXT:    subs r1, r0, r1
1989; CHECK-THUMB7-NEXT:    clz r1, r1
1990; CHECK-THUMB7-NEXT:    lsrs r1, r1, #5
1991; CHECK-THUMB7-NEXT:    cmp r1, #1
1992; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
1993; CHECK-THUMB7-NEXT:    bne .LBB9_1
1994; CHECK-THUMB7-NEXT:    b .LBB9_5
1995; CHECK-THUMB7-NEXT:  .LBB9_5: @ %atomicrmw.end
1996; CHECK-THUMB7-NEXT:    ldr r0, [sp] @ 4-byte Reload
1997; CHECK-THUMB7-NEXT:    add sp, #8
1998; CHECK-THUMB7-NEXT:    pop {r4, pc}
1999;
2000; CHECK-THUMB6-LABEL: test_umax_i8:
2001; CHECK-THUMB6:       @ %bb.0: @ %entry
2002; CHECK-THUMB6-NEXT:    .save {r7, lr}
2003; CHECK-THUMB6-NEXT:    push {r7, lr}
2004; CHECK-THUMB6-NEXT:    ldr r0, .LCPI9_0
2005; CHECK-THUMB6-NEXT:    movs r1, #1
2006; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_umax_1
2007; CHECK-THUMB6-NEXT:    pop {r7, pc}
2008; CHECK-THUMB6-NEXT:    .p2align 2
2009; CHECK-THUMB6-NEXT:  @ %bb.1:
2010; CHECK-THUMB6-NEXT:  .LCPI9_0:
2011; CHECK-THUMB6-NEXT:    .long atomic_i8
2012;
2013; CHECK-THUMB8BASE-LABEL: test_umax_i8:
2014; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
2015; CHECK-THUMB8BASE-NEXT:    .save {r4, r5, r7, lr}
2016; CHECK-THUMB8BASE-NEXT:    push {r4, r5, r7, lr}
2017; CHECK-THUMB8BASE-NEXT:    .pad #24
2018; CHECK-THUMB8BASE-NEXT:    sub sp, #24
2019; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i8
2020; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i8
2021; CHECK-THUMB8BASE-NEXT:    ldrb r0, [r0]
2022; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #20] @ 4-byte Spill
2023; CHECK-THUMB8BASE-NEXT:    b .LBB9_1
2024; CHECK-THUMB8BASE-NEXT:  .LBB9_1: @ %atomicrmw.start
2025; CHECK-THUMB8BASE-NEXT:    @ =>This Loop Header: Depth=1
2026; CHECK-THUMB8BASE-NEXT:    @ Child Loop BB9_4 Depth 2
2027; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #20] @ 4-byte Reload
2028; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
2029; CHECK-THUMB8BASE-NEXT:    uxtb r1, r0
2030; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #8] @ 4-byte Spill
2031; CHECK-THUMB8BASE-NEXT:    movs r2, #1
2032; CHECK-THUMB8BASE-NEXT:    str r2, [sp, #12] @ 4-byte Spill
2033; CHECK-THUMB8BASE-NEXT:    cmp r1, #1
2034; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #16] @ 4-byte Spill
2035; CHECK-THUMB8BASE-NEXT:    bhi .LBB9_3
2036; CHECK-THUMB8BASE-NEXT:  @ %bb.2: @ %atomicrmw.start
2037; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB9_1 Depth=1
2038; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #12] @ 4-byte Reload
2039; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #16] @ 4-byte Spill
2040; CHECK-THUMB8BASE-NEXT:  .LBB9_3: @ %atomicrmw.start
2041; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB9_1 Depth=1
2042; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #8] @ 4-byte Reload
2043; CHECK-THUMB8BASE-NEXT:    ldr r4, [sp, #4] @ 4-byte Reload
2044; CHECK-THUMB8BASE-NEXT:    ldr r5, [sp, #16] @ 4-byte Reload
2045; CHECK-THUMB8BASE-NEXT:    movw r3, :lower16:atomic_i8
2046; CHECK-THUMB8BASE-NEXT:    movt r3, :upper16:atomic_i8
2047; CHECK-THUMB8BASE-NEXT:    uxtb r4, r4
2048; CHECK-THUMB8BASE-NEXT:  .LBB9_4: @ %atomicrmw.start
2049; CHECK-THUMB8BASE-NEXT:    @ Parent Loop BB9_1 Depth=1
2050; CHECK-THUMB8BASE-NEXT:    @ => This Inner Loop Header: Depth=2
2051; CHECK-THUMB8BASE-NEXT:    ldrexb r0, [r3]
2052; CHECK-THUMB8BASE-NEXT:    cmp r0, r4
2053; CHECK-THUMB8BASE-NEXT:    bne .LBB9_6
2054; CHECK-THUMB8BASE-NEXT:  @ %bb.5: @ %atomicrmw.start
2055; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB9_4 Depth=2
2056; CHECK-THUMB8BASE-NEXT:    strexb r2, r5, [r3]
2057; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
2058; CHECK-THUMB8BASE-NEXT:    bne .LBB9_4
2059; CHECK-THUMB8BASE-NEXT:  .LBB9_6: @ %atomicrmw.start
2060; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB9_1 Depth=1
2061; CHECK-THUMB8BASE-NEXT:    str r0, [sp] @ 4-byte Spill
2062; CHECK-THUMB8BASE-NEXT:    subs r1, r0, r1
2063; CHECK-THUMB8BASE-NEXT:    rsbs r2, r1, #0
2064; CHECK-THUMB8BASE-NEXT:    adcs r1, r2
2065; CHECK-THUMB8BASE-NEXT:    cmp r1, #1
2066; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #20] @ 4-byte Spill
2067; CHECK-THUMB8BASE-NEXT:    bne .LBB9_1
2068; CHECK-THUMB8BASE-NEXT:    b .LBB9_7
2069; CHECK-THUMB8BASE-NEXT:  .LBB9_7: @ %atomicrmw.end
2070; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp] @ 4-byte Reload
2071; CHECK-THUMB8BASE-NEXT:    add sp, #24
2072; CHECK-THUMB8BASE-NEXT:    pop {r4, r5, r7, pc}
2073entry:
2074  %0 = atomicrmw umax i8* @atomic_i8, i8 1 monotonic
2075  ret i8 %0
2076}
2077define i8 @test_umin_i8() {
2078; CHECK-ARM8-LABEL: test_umin_i8:
2079; CHECK-ARM8:       @ %bb.0: @ %entry
2080; CHECK-ARM8-NEXT:    .save {r11, lr}
2081; CHECK-ARM8-NEXT:    push {r11, lr}
2082; CHECK-ARM8-NEXT:    .pad #8
2083; CHECK-ARM8-NEXT:    sub sp, sp, #8
2084; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i8
2085; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i8
2086; CHECK-ARM8-NEXT:    ldrb r0, [r0]
2087; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
2088; CHECK-ARM8-NEXT:    b .LBB10_1
2089; CHECK-ARM8-NEXT:  .LBB10_1: @ %atomicrmw.start
2090; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
2091; CHECK-ARM8-NEXT:    @ Child Loop BB10_2 Depth 2
2092; CHECK-ARM8-NEXT:    ldr r12, [sp, #4] @ 4-byte Reload
2093; CHECK-ARM8-NEXT:    uxtb r1, r12
2094; CHECK-ARM8-NEXT:    mov lr, #1
2095; CHECK-ARM8-NEXT:    cmp r1, #2
2096; CHECK-ARM8-NEXT:    movlo lr, r12
2097; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i8
2098; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i8
2099; CHECK-ARM8-NEXT:    uxtb r12, r12
2100; CHECK-ARM8-NEXT:  .LBB10_2: @ %atomicrmw.start
2101; CHECK-ARM8-NEXT:    @ Parent Loop BB10_1 Depth=1
2102; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
2103; CHECK-ARM8-NEXT:    ldrexb r0, [r3]
2104; CHECK-ARM8-NEXT:    cmp r0, r12
2105; CHECK-ARM8-NEXT:    bne .LBB10_4
2106; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
2107; CHECK-ARM8-NEXT:    @ in Loop: Header=BB10_2 Depth=2
2108; CHECK-ARM8-NEXT:    strexb r2, lr, [r3]
2109; CHECK-ARM8-NEXT:    cmp r2, #0
2110; CHECK-ARM8-NEXT:    bne .LBB10_2
2111; CHECK-ARM8-NEXT:  .LBB10_4: @ %atomicrmw.start
2112; CHECK-ARM8-NEXT:    @ in Loop: Header=BB10_1 Depth=1
2113; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
2114; CHECK-ARM8-NEXT:    sub r1, r0, r1
2115; CHECK-ARM8-NEXT:    clz r1, r1
2116; CHECK-ARM8-NEXT:    lsr r1, r1, #5
2117; CHECK-ARM8-NEXT:    cmp r1, #1
2118; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
2119; CHECK-ARM8-NEXT:    bne .LBB10_1
2120; CHECK-ARM8-NEXT:    b .LBB10_5
2121; CHECK-ARM8-NEXT:  .LBB10_5: @ %atomicrmw.end
2122; CHECK-ARM8-NEXT:    ldr r0, [sp] @ 4-byte Reload
2123; CHECK-ARM8-NEXT:    add sp, sp, #8
2124; CHECK-ARM8-NEXT:    pop {r11, pc}
2125;
2126; CHECK-ARM6-LABEL: test_umin_i8:
2127; CHECK-ARM6:       @ %bb.0: @ %entry
2128; CHECK-ARM6-NEXT:    .save {r11, lr}
2129; CHECK-ARM6-NEXT:    push {r11, lr}
2130; CHECK-ARM6-NEXT:    .pad #8
2131; CHECK-ARM6-NEXT:    sub sp, sp, #8
2132; CHECK-ARM6-NEXT:    ldr r0, .LCPI10_0
2133; CHECK-ARM6-NEXT:    ldrb r0, [r0]
2134; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
2135; CHECK-ARM6-NEXT:    b .LBB10_1
2136; CHECK-ARM6-NEXT:  .LBB10_1: @ %atomicrmw.start
2137; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
2138; CHECK-ARM6-NEXT:    @ Child Loop BB10_2 Depth 2
2139; CHECK-ARM6-NEXT:    ldr r12, [sp, #4] @ 4-byte Reload
2140; CHECK-ARM6-NEXT:    uxtb r1, r12
2141; CHECK-ARM6-NEXT:    mov lr, #1
2142; CHECK-ARM6-NEXT:    cmp r1, #2
2143; CHECK-ARM6-NEXT:    movlo lr, r12
2144; CHECK-ARM6-NEXT:    ldr r3, .LCPI10_0
2145; CHECK-ARM6-NEXT:    uxtb r12, r12
2146; CHECK-ARM6-NEXT:  .LBB10_2: @ %atomicrmw.start
2147; CHECK-ARM6-NEXT:    @ Parent Loop BB10_1 Depth=1
2148; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
2149; CHECK-ARM6-NEXT:    ldrexb r0, [r3]
2150; CHECK-ARM6-NEXT:    cmp r0, r12
2151; CHECK-ARM6-NEXT:    bne .LBB10_4
2152; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
2153; CHECK-ARM6-NEXT:    @ in Loop: Header=BB10_2 Depth=2
2154; CHECK-ARM6-NEXT:    strexb r2, lr, [r3]
2155; CHECK-ARM6-NEXT:    cmp r2, #0
2156; CHECK-ARM6-NEXT:    bne .LBB10_2
2157; CHECK-ARM6-NEXT:  .LBB10_4: @ %atomicrmw.start
2158; CHECK-ARM6-NEXT:    @ in Loop: Header=BB10_1 Depth=1
2159; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
2160; CHECK-ARM6-NEXT:    sub r1, r0, r1
2161; CHECK-ARM6-NEXT:    clz r1, r1
2162; CHECK-ARM6-NEXT:    lsr r1, r1, #5
2163; CHECK-ARM6-NEXT:    cmp r1, #1
2164; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
2165; CHECK-ARM6-NEXT:    bne .LBB10_1
2166; CHECK-ARM6-NEXT:    b .LBB10_5
2167; CHECK-ARM6-NEXT:  .LBB10_5: @ %atomicrmw.end
2168; CHECK-ARM6-NEXT:    ldr r0, [sp] @ 4-byte Reload
2169; CHECK-ARM6-NEXT:    add sp, sp, #8
2170; CHECK-ARM6-NEXT:    pop {r11, pc}
2171; CHECK-ARM6-NEXT:    .p2align 2
2172; CHECK-ARM6-NEXT:  @ %bb.6:
2173; CHECK-ARM6-NEXT:  .LCPI10_0:
2174; CHECK-ARM6-NEXT:    .long atomic_i8
2175;
2176; CHECK-THUMB7-LABEL: test_umin_i8:
2177; CHECK-THUMB7:       @ %bb.0: @ %entry
2178; CHECK-THUMB7-NEXT:    .save {r4, lr}
2179; CHECK-THUMB7-NEXT:    push {r4, lr}
2180; CHECK-THUMB7-NEXT:    .pad #8
2181; CHECK-THUMB7-NEXT:    sub sp, #8
2182; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i8
2183; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i8
2184; CHECK-THUMB7-NEXT:    ldrb r0, [r0]
2185; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
2186; CHECK-THUMB7-NEXT:    b .LBB10_1
2187; CHECK-THUMB7-NEXT:  .LBB10_1: @ %atomicrmw.start
2188; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
2189; CHECK-THUMB7-NEXT:    @ Child Loop BB10_2 Depth 2
2190; CHECK-THUMB7-NEXT:    ldr r4, [sp, #4] @ 4-byte Reload
2191; CHECK-THUMB7-NEXT:    uxtb r1, r4
2192; CHECK-THUMB7-NEXT:    mov.w r12, #1
2193; CHECK-THUMB7-NEXT:    cmp r1, #2
2194; CHECK-THUMB7-NEXT:    it lo
2195; CHECK-THUMB7-NEXT:    movlo r12, r4
2196; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i8
2197; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i8
2198; CHECK-THUMB7-NEXT:    uxtb r4, r4
2199; CHECK-THUMB7-NEXT:  .LBB10_2: @ %atomicrmw.start
2200; CHECK-THUMB7-NEXT:    @ Parent Loop BB10_1 Depth=1
2201; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
2202; CHECK-THUMB7-NEXT:    ldrexb r0, [r3]
2203; CHECK-THUMB7-NEXT:    cmp r0, r4
2204; CHECK-THUMB7-NEXT:    bne .LBB10_4
2205; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
2206; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB10_2 Depth=2
2207; CHECK-THUMB7-NEXT:    strexb r2, r12, [r3]
2208; CHECK-THUMB7-NEXT:    cmp r2, #0
2209; CHECK-THUMB7-NEXT:    bne .LBB10_2
2210; CHECK-THUMB7-NEXT:  .LBB10_4: @ %atomicrmw.start
2211; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB10_1 Depth=1
2212; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
2213; CHECK-THUMB7-NEXT:    subs r1, r0, r1
2214; CHECK-THUMB7-NEXT:    clz r1, r1
2215; CHECK-THUMB7-NEXT:    lsrs r1, r1, #5
2216; CHECK-THUMB7-NEXT:    cmp r1, #1
2217; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
2218; CHECK-THUMB7-NEXT:    bne .LBB10_1
2219; CHECK-THUMB7-NEXT:    b .LBB10_5
2220; CHECK-THUMB7-NEXT:  .LBB10_5: @ %atomicrmw.end
2221; CHECK-THUMB7-NEXT:    ldr r0, [sp] @ 4-byte Reload
2222; CHECK-THUMB7-NEXT:    add sp, #8
2223; CHECK-THUMB7-NEXT:    pop {r4, pc}
2224;
2225; CHECK-THUMB6-LABEL: test_umin_i8:
2226; CHECK-THUMB6:       @ %bb.0: @ %entry
2227; CHECK-THUMB6-NEXT:    .save {r7, lr}
2228; CHECK-THUMB6-NEXT:    push {r7, lr}
2229; CHECK-THUMB6-NEXT:    ldr r0, .LCPI10_0
2230; CHECK-THUMB6-NEXT:    movs r1, #1
2231; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_umin_1
2232; CHECK-THUMB6-NEXT:    pop {r7, pc}
2233; CHECK-THUMB6-NEXT:    .p2align 2
2234; CHECK-THUMB6-NEXT:  @ %bb.1:
2235; CHECK-THUMB6-NEXT:  .LCPI10_0:
2236; CHECK-THUMB6-NEXT:    .long atomic_i8
2237;
2238; CHECK-THUMB8BASE-LABEL: test_umin_i8:
2239; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
2240; CHECK-THUMB8BASE-NEXT:    .save {r4, r5, r7, lr}
2241; CHECK-THUMB8BASE-NEXT:    push {r4, r5, r7, lr}
2242; CHECK-THUMB8BASE-NEXT:    .pad #24
2243; CHECK-THUMB8BASE-NEXT:    sub sp, #24
2244; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i8
2245; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i8
2246; CHECK-THUMB8BASE-NEXT:    ldrb r0, [r0]
2247; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #20] @ 4-byte Spill
2248; CHECK-THUMB8BASE-NEXT:    b .LBB10_1
2249; CHECK-THUMB8BASE-NEXT:  .LBB10_1: @ %atomicrmw.start
2250; CHECK-THUMB8BASE-NEXT:    @ =>This Loop Header: Depth=1
2251; CHECK-THUMB8BASE-NEXT:    @ Child Loop BB10_4 Depth 2
2252; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #20] @ 4-byte Reload
2253; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
2254; CHECK-THUMB8BASE-NEXT:    uxtb r1, r0
2255; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #8] @ 4-byte Spill
2256; CHECK-THUMB8BASE-NEXT:    movs r2, #1
2257; CHECK-THUMB8BASE-NEXT:    str r2, [sp, #12] @ 4-byte Spill
2258; CHECK-THUMB8BASE-NEXT:    cmp r1, #2
2259; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #16] @ 4-byte Spill
2260; CHECK-THUMB8BASE-NEXT:    blo .LBB10_3
2261; CHECK-THUMB8BASE-NEXT:  @ %bb.2: @ %atomicrmw.start
2262; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB10_1 Depth=1
2263; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #12] @ 4-byte Reload
2264; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #16] @ 4-byte Spill
2265; CHECK-THUMB8BASE-NEXT:  .LBB10_3: @ %atomicrmw.start
2266; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB10_1 Depth=1
2267; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #8] @ 4-byte Reload
2268; CHECK-THUMB8BASE-NEXT:    ldr r4, [sp, #4] @ 4-byte Reload
2269; CHECK-THUMB8BASE-NEXT:    ldr r5, [sp, #16] @ 4-byte Reload
2270; CHECK-THUMB8BASE-NEXT:    movw r3, :lower16:atomic_i8
2271; CHECK-THUMB8BASE-NEXT:    movt r3, :upper16:atomic_i8
2272; CHECK-THUMB8BASE-NEXT:    uxtb r4, r4
2273; CHECK-THUMB8BASE-NEXT:  .LBB10_4: @ %atomicrmw.start
2274; CHECK-THUMB8BASE-NEXT:    @ Parent Loop BB10_1 Depth=1
2275; CHECK-THUMB8BASE-NEXT:    @ => This Inner Loop Header: Depth=2
2276; CHECK-THUMB8BASE-NEXT:    ldrexb r0, [r3]
2277; CHECK-THUMB8BASE-NEXT:    cmp r0, r4
2278; CHECK-THUMB8BASE-NEXT:    bne .LBB10_6
2279; CHECK-THUMB8BASE-NEXT:  @ %bb.5: @ %atomicrmw.start
2280; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB10_4 Depth=2
2281; CHECK-THUMB8BASE-NEXT:    strexb r2, r5, [r3]
2282; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
2283; CHECK-THUMB8BASE-NEXT:    bne .LBB10_4
2284; CHECK-THUMB8BASE-NEXT:  .LBB10_6: @ %atomicrmw.start
2285; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB10_1 Depth=1
2286; CHECK-THUMB8BASE-NEXT:    str r0, [sp] @ 4-byte Spill
2287; CHECK-THUMB8BASE-NEXT:    subs r1, r0, r1
2288; CHECK-THUMB8BASE-NEXT:    rsbs r2, r1, #0
2289; CHECK-THUMB8BASE-NEXT:    adcs r1, r2
2290; CHECK-THUMB8BASE-NEXT:    cmp r1, #1
2291; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #20] @ 4-byte Spill
2292; CHECK-THUMB8BASE-NEXT:    bne .LBB10_1
2293; CHECK-THUMB8BASE-NEXT:    b .LBB10_7
2294; CHECK-THUMB8BASE-NEXT:  .LBB10_7: @ %atomicrmw.end
2295; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp] @ 4-byte Reload
2296; CHECK-THUMB8BASE-NEXT:    add sp, #24
2297; CHECK-THUMB8BASE-NEXT:    pop {r4, r5, r7, pc}
2298entry:
2299  %0 = atomicrmw umin i8* @atomic_i8, i8 1 monotonic
2300  ret i8 %0
2301}
2302
2303
2304define i16 @test_xchg_i16() {
2305; CHECK-ARM8-LABEL: test_xchg_i16:
2306; CHECK-ARM8:       @ %bb.0: @ %entry
2307; CHECK-ARM8-NEXT:    .pad #8
2308; CHECK-ARM8-NEXT:    sub sp, sp, #8
2309; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i16
2310; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i16
2311; CHECK-ARM8-NEXT:    ldrh r0, [r0]
2312; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
2313; CHECK-ARM8-NEXT:    b .LBB11_1
2314; CHECK-ARM8-NEXT:  .LBB11_1: @ %atomicrmw.start
2315; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
2316; CHECK-ARM8-NEXT:    @ Child Loop BB11_2 Depth 2
2317; CHECK-ARM8-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
2318; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i16
2319; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i16
2320; CHECK-ARM8-NEXT:    mov r12, #1
2321; CHECK-ARM8-NEXT:    uxth r1, r1
2322; CHECK-ARM8-NEXT:  .LBB11_2: @ %atomicrmw.start
2323; CHECK-ARM8-NEXT:    @ Parent Loop BB11_1 Depth=1
2324; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
2325; CHECK-ARM8-NEXT:    ldrexh r0, [r3]
2326; CHECK-ARM8-NEXT:    cmp r0, r1
2327; CHECK-ARM8-NEXT:    bne .LBB11_4
2328; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
2329; CHECK-ARM8-NEXT:    @ in Loop: Header=BB11_2 Depth=2
2330; CHECK-ARM8-NEXT:    strexh r2, r12, [r3]
2331; CHECK-ARM8-NEXT:    cmp r2, #0
2332; CHECK-ARM8-NEXT:    bne .LBB11_2
2333; CHECK-ARM8-NEXT:  .LBB11_4: @ %atomicrmw.start
2334; CHECK-ARM8-NEXT:    @ in Loop: Header=BB11_1 Depth=1
2335; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
2336; CHECK-ARM8-NEXT:    uxth r1, r1
2337; CHECK-ARM8-NEXT:    sub r1, r0, r1
2338; CHECK-ARM8-NEXT:    clz r1, r1
2339; CHECK-ARM8-NEXT:    lsr r1, r1, #5
2340; CHECK-ARM8-NEXT:    cmp r1, #1
2341; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
2342; CHECK-ARM8-NEXT:    bne .LBB11_1
2343; CHECK-ARM8-NEXT:    b .LBB11_5
2344; CHECK-ARM8-NEXT:  .LBB11_5: @ %atomicrmw.end
2345; CHECK-ARM8-NEXT:    ldr r0, [sp] @ 4-byte Reload
2346; CHECK-ARM8-NEXT:    add sp, sp, #8
2347; CHECK-ARM8-NEXT:    bx lr
2348;
2349; CHECK-ARM6-LABEL: test_xchg_i16:
2350; CHECK-ARM6:       @ %bb.0: @ %entry
2351; CHECK-ARM6-NEXT:    .pad #8
2352; CHECK-ARM6-NEXT:    sub sp, sp, #8
2353; CHECK-ARM6-NEXT:    ldr r0, .LCPI11_0
2354; CHECK-ARM6-NEXT:    ldrh r0, [r0]
2355; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
2356; CHECK-ARM6-NEXT:    b .LBB11_1
2357; CHECK-ARM6-NEXT:  .LBB11_1: @ %atomicrmw.start
2358; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
2359; CHECK-ARM6-NEXT:    @ Child Loop BB11_2 Depth 2
2360; CHECK-ARM6-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
2361; CHECK-ARM6-NEXT:    ldr r3, .LCPI11_0
2362; CHECK-ARM6-NEXT:    mov r12, #1
2363; CHECK-ARM6-NEXT:    uxth r1, r1
2364; CHECK-ARM6-NEXT:  .LBB11_2: @ %atomicrmw.start
2365; CHECK-ARM6-NEXT:    @ Parent Loop BB11_1 Depth=1
2366; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
2367; CHECK-ARM6-NEXT:    ldrexh r0, [r3]
2368; CHECK-ARM6-NEXT:    cmp r0, r1
2369; CHECK-ARM6-NEXT:    bne .LBB11_4
2370; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
2371; CHECK-ARM6-NEXT:    @ in Loop: Header=BB11_2 Depth=2
2372; CHECK-ARM6-NEXT:    strexh r2, r12, [r3]
2373; CHECK-ARM6-NEXT:    cmp r2, #0
2374; CHECK-ARM6-NEXT:    bne .LBB11_2
2375; CHECK-ARM6-NEXT:  .LBB11_4: @ %atomicrmw.start
2376; CHECK-ARM6-NEXT:    @ in Loop: Header=BB11_1 Depth=1
2377; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
2378; CHECK-ARM6-NEXT:    uxth r1, r1
2379; CHECK-ARM6-NEXT:    sub r1, r0, r1
2380; CHECK-ARM6-NEXT:    clz r1, r1
2381; CHECK-ARM6-NEXT:    lsr r1, r1, #5
2382; CHECK-ARM6-NEXT:    cmp r1, #1
2383; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
2384; CHECK-ARM6-NEXT:    bne .LBB11_1
2385; CHECK-ARM6-NEXT:    b .LBB11_5
2386; CHECK-ARM6-NEXT:  .LBB11_5: @ %atomicrmw.end
2387; CHECK-ARM6-NEXT:    ldr r0, [sp] @ 4-byte Reload
2388; CHECK-ARM6-NEXT:    add sp, sp, #8
2389; CHECK-ARM6-NEXT:    bx lr
2390; CHECK-ARM6-NEXT:    .p2align 2
2391; CHECK-ARM6-NEXT:  @ %bb.6:
2392; CHECK-ARM6-NEXT:  .LCPI11_0:
2393; CHECK-ARM6-NEXT:    .long atomic_i16
2394;
2395; CHECK-THUMB7-LABEL: test_xchg_i16:
2396; CHECK-THUMB7:       @ %bb.0: @ %entry
2397; CHECK-THUMB7-NEXT:    .pad #8
2398; CHECK-THUMB7-NEXT:    sub sp, #8
2399; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i16
2400; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i16
2401; CHECK-THUMB7-NEXT:    ldrh r0, [r0]
2402; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
2403; CHECK-THUMB7-NEXT:    b .LBB11_1
2404; CHECK-THUMB7-NEXT:  .LBB11_1: @ %atomicrmw.start
2405; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
2406; CHECK-THUMB7-NEXT:    @ Child Loop BB11_2 Depth 2
2407; CHECK-THUMB7-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
2408; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i16
2409; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i16
2410; CHECK-THUMB7-NEXT:    mov.w r12, #1
2411; CHECK-THUMB7-NEXT:    uxth r1, r1
2412; CHECK-THUMB7-NEXT:  .LBB11_2: @ %atomicrmw.start
2413; CHECK-THUMB7-NEXT:    @ Parent Loop BB11_1 Depth=1
2414; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
2415; CHECK-THUMB7-NEXT:    ldrexh r0, [r3]
2416; CHECK-THUMB7-NEXT:    cmp r0, r1
2417; CHECK-THUMB7-NEXT:    bne .LBB11_4
2418; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
2419; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB11_2 Depth=2
2420; CHECK-THUMB7-NEXT:    strexh r2, r12, [r3]
2421; CHECK-THUMB7-NEXT:    cmp r2, #0
2422; CHECK-THUMB7-NEXT:    bne .LBB11_2
2423; CHECK-THUMB7-NEXT:  .LBB11_4: @ %atomicrmw.start
2424; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB11_1 Depth=1
2425; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
2426; CHECK-THUMB7-NEXT:    uxth r1, r1
2427; CHECK-THUMB7-NEXT:    subs r1, r0, r1
2428; CHECK-THUMB7-NEXT:    clz r1, r1
2429; CHECK-THUMB7-NEXT:    lsrs r1, r1, #5
2430; CHECK-THUMB7-NEXT:    cmp r1, #1
2431; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
2432; CHECK-THUMB7-NEXT:    bne .LBB11_1
2433; CHECK-THUMB7-NEXT:    b .LBB11_5
2434; CHECK-THUMB7-NEXT:  .LBB11_5: @ %atomicrmw.end
2435; CHECK-THUMB7-NEXT:    ldr r0, [sp] @ 4-byte Reload
2436; CHECK-THUMB7-NEXT:    add sp, #8
2437; CHECK-THUMB7-NEXT:    bx lr
2438;
2439; CHECK-THUMB6-LABEL: test_xchg_i16:
2440; CHECK-THUMB6:       @ %bb.0: @ %entry
2441; CHECK-THUMB6-NEXT:    .save {r7, lr}
2442; CHECK-THUMB6-NEXT:    push {r7, lr}
2443; CHECK-THUMB6-NEXT:    ldr r0, .LCPI11_0
2444; CHECK-THUMB6-NEXT:    movs r1, #1
2445; CHECK-THUMB6-NEXT:    bl __sync_lock_test_and_set_2
2446; CHECK-THUMB6-NEXT:    pop {r7, pc}
2447; CHECK-THUMB6-NEXT:    .p2align 2
2448; CHECK-THUMB6-NEXT:  @ %bb.1:
2449; CHECK-THUMB6-NEXT:  .LCPI11_0:
2450; CHECK-THUMB6-NEXT:    .long atomic_i16
2451;
2452; CHECK-THUMB8BASE-LABEL: test_xchg_i16:
2453; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
2454; CHECK-THUMB8BASE-NEXT:    .save {r4, lr}
2455; CHECK-THUMB8BASE-NEXT:    push {r4, lr}
2456; CHECK-THUMB8BASE-NEXT:    .pad #8
2457; CHECK-THUMB8BASE-NEXT:    sub sp, #8
2458; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i16
2459; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i16
2460; CHECK-THUMB8BASE-NEXT:    ldrh r0, [r0]
2461; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
2462; CHECK-THUMB8BASE-NEXT:    b .LBB11_1
2463; CHECK-THUMB8BASE-NEXT:  .LBB11_1: @ %atomicrmw.start
2464; CHECK-THUMB8BASE-NEXT:    @ =>This Loop Header: Depth=1
2465; CHECK-THUMB8BASE-NEXT:    @ Child Loop BB11_2 Depth 2
2466; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
2467; CHECK-THUMB8BASE-NEXT:    movw r3, :lower16:atomic_i16
2468; CHECK-THUMB8BASE-NEXT:    movt r3, :upper16:atomic_i16
2469; CHECK-THUMB8BASE-NEXT:    movs r4, #1
2470; CHECK-THUMB8BASE-NEXT:    uxth r1, r1
2471; CHECK-THUMB8BASE-NEXT:  .LBB11_2: @ %atomicrmw.start
2472; CHECK-THUMB8BASE-NEXT:    @ Parent Loop BB11_1 Depth=1
2473; CHECK-THUMB8BASE-NEXT:    @ => This Inner Loop Header: Depth=2
2474; CHECK-THUMB8BASE-NEXT:    ldrexh r0, [r3]
2475; CHECK-THUMB8BASE-NEXT:    cmp r0, r1
2476; CHECK-THUMB8BASE-NEXT:    bne .LBB11_4
2477; CHECK-THUMB8BASE-NEXT:  @ %bb.3: @ %atomicrmw.start
2478; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB11_2 Depth=2
2479; CHECK-THUMB8BASE-NEXT:    strexh r2, r4, [r3]
2480; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
2481; CHECK-THUMB8BASE-NEXT:    bne .LBB11_2
2482; CHECK-THUMB8BASE-NEXT:  .LBB11_4: @ %atomicrmw.start
2483; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB11_1 Depth=1
2484; CHECK-THUMB8BASE-NEXT:    str r0, [sp] @ 4-byte Spill
2485; CHECK-THUMB8BASE-NEXT:    uxth r1, r1
2486; CHECK-THUMB8BASE-NEXT:    subs r1, r0, r1
2487; CHECK-THUMB8BASE-NEXT:    rsbs r2, r1, #0
2488; CHECK-THUMB8BASE-NEXT:    adcs r1, r2
2489; CHECK-THUMB8BASE-NEXT:    cmp r1, #1
2490; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
2491; CHECK-THUMB8BASE-NEXT:    bne .LBB11_1
2492; CHECK-THUMB8BASE-NEXT:    b .LBB11_5
2493; CHECK-THUMB8BASE-NEXT:  .LBB11_5: @ %atomicrmw.end
2494; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp] @ 4-byte Reload
2495; CHECK-THUMB8BASE-NEXT:    add sp, #8
2496; CHECK-THUMB8BASE-NEXT:    pop {r4, pc}
2497entry:
2498  %0 = atomicrmw xchg i16* @atomic_i16, i16 1 monotonic
2499  ret i16 %0
2500}
2501define i16 @test_add_i16() {
2502; CHECK-ARM8-LABEL: test_add_i16:
2503; CHECK-ARM8:       @ %bb.0: @ %entry
2504; CHECK-ARM8-NEXT:    .pad #8
2505; CHECK-ARM8-NEXT:    sub sp, sp, #8
2506; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i16
2507; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i16
2508; CHECK-ARM8-NEXT:    ldrh r0, [r0]
2509; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
2510; CHECK-ARM8-NEXT:    b .LBB12_1
2511; CHECK-ARM8-NEXT:  .LBB12_1: @ %atomicrmw.start
2512; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
2513; CHECK-ARM8-NEXT:    @ Child Loop BB12_2 Depth 2
2514; CHECK-ARM8-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
2515; CHECK-ARM8-NEXT:    add r12, r1, #1
2516; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i16
2517; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i16
2518; CHECK-ARM8-NEXT:    uxth r1, r1
2519; CHECK-ARM8-NEXT:  .LBB12_2: @ %atomicrmw.start
2520; CHECK-ARM8-NEXT:    @ Parent Loop BB12_1 Depth=1
2521; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
2522; CHECK-ARM8-NEXT:    ldrexh r0, [r3]
2523; CHECK-ARM8-NEXT:    cmp r0, r1
2524; CHECK-ARM8-NEXT:    bne .LBB12_4
2525; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
2526; CHECK-ARM8-NEXT:    @ in Loop: Header=BB12_2 Depth=2
2527; CHECK-ARM8-NEXT:    strexh r2, r12, [r3]
2528; CHECK-ARM8-NEXT:    cmp r2, #0
2529; CHECK-ARM8-NEXT:    bne .LBB12_2
2530; CHECK-ARM8-NEXT:  .LBB12_4: @ %atomicrmw.start
2531; CHECK-ARM8-NEXT:    @ in Loop: Header=BB12_1 Depth=1
2532; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
2533; CHECK-ARM8-NEXT:    uxth r1, r1
2534; CHECK-ARM8-NEXT:    sub r1, r0, r1
2535; CHECK-ARM8-NEXT:    clz r1, r1
2536; CHECK-ARM8-NEXT:    lsr r1, r1, #5
2537; CHECK-ARM8-NEXT:    cmp r1, #1
2538; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
2539; CHECK-ARM8-NEXT:    bne .LBB12_1
2540; CHECK-ARM8-NEXT:    b .LBB12_5
2541; CHECK-ARM8-NEXT:  .LBB12_5: @ %atomicrmw.end
2542; CHECK-ARM8-NEXT:    ldr r0, [sp] @ 4-byte Reload
2543; CHECK-ARM8-NEXT:    add sp, sp, #8
2544; CHECK-ARM8-NEXT:    bx lr
2545;
2546; CHECK-ARM6-LABEL: test_add_i16:
2547; CHECK-ARM6:       @ %bb.0: @ %entry
2548; CHECK-ARM6-NEXT:    .pad #8
2549; CHECK-ARM6-NEXT:    sub sp, sp, #8
2550; CHECK-ARM6-NEXT:    ldr r0, .LCPI12_0
2551; CHECK-ARM6-NEXT:    ldrh r0, [r0]
2552; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
2553; CHECK-ARM6-NEXT:    b .LBB12_1
2554; CHECK-ARM6-NEXT:  .LBB12_1: @ %atomicrmw.start
2555; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
2556; CHECK-ARM6-NEXT:    @ Child Loop BB12_2 Depth 2
2557; CHECK-ARM6-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
2558; CHECK-ARM6-NEXT:    add r12, r1, #1
2559; CHECK-ARM6-NEXT:    ldr r3, .LCPI12_0
2560; CHECK-ARM6-NEXT:    uxth r1, r1
2561; CHECK-ARM6-NEXT:  .LBB12_2: @ %atomicrmw.start
2562; CHECK-ARM6-NEXT:    @ Parent Loop BB12_1 Depth=1
2563; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
2564; CHECK-ARM6-NEXT:    ldrexh r0, [r3]
2565; CHECK-ARM6-NEXT:    cmp r0, r1
2566; CHECK-ARM6-NEXT:    bne .LBB12_4
2567; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
2568; CHECK-ARM6-NEXT:    @ in Loop: Header=BB12_2 Depth=2
2569; CHECK-ARM6-NEXT:    strexh r2, r12, [r3]
2570; CHECK-ARM6-NEXT:    cmp r2, #0
2571; CHECK-ARM6-NEXT:    bne .LBB12_2
2572; CHECK-ARM6-NEXT:  .LBB12_4: @ %atomicrmw.start
2573; CHECK-ARM6-NEXT:    @ in Loop: Header=BB12_1 Depth=1
2574; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
2575; CHECK-ARM6-NEXT:    uxth r1, r1
2576; CHECK-ARM6-NEXT:    sub r1, r0, r1
2577; CHECK-ARM6-NEXT:    clz r1, r1
2578; CHECK-ARM6-NEXT:    lsr r1, r1, #5
2579; CHECK-ARM6-NEXT:    cmp r1, #1
2580; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
2581; CHECK-ARM6-NEXT:    bne .LBB12_1
2582; CHECK-ARM6-NEXT:    b .LBB12_5
2583; CHECK-ARM6-NEXT:  .LBB12_5: @ %atomicrmw.end
2584; CHECK-ARM6-NEXT:    ldr r0, [sp] @ 4-byte Reload
2585; CHECK-ARM6-NEXT:    add sp, sp, #8
2586; CHECK-ARM6-NEXT:    bx lr
2587; CHECK-ARM6-NEXT:    .p2align 2
2588; CHECK-ARM6-NEXT:  @ %bb.6:
2589; CHECK-ARM6-NEXT:  .LCPI12_0:
2590; CHECK-ARM6-NEXT:    .long atomic_i16
2591;
2592; CHECK-THUMB7-LABEL: test_add_i16:
2593; CHECK-THUMB7:       @ %bb.0: @ %entry
2594; CHECK-THUMB7-NEXT:    .pad #8
2595; CHECK-THUMB7-NEXT:    sub sp, #8
2596; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i16
2597; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i16
2598; CHECK-THUMB7-NEXT:    ldrh r0, [r0]
2599; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
2600; CHECK-THUMB7-NEXT:    b .LBB12_1
2601; CHECK-THUMB7-NEXT:  .LBB12_1: @ %atomicrmw.start
2602; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
2603; CHECK-THUMB7-NEXT:    @ Child Loop BB12_2 Depth 2
2604; CHECK-THUMB7-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
2605; CHECK-THUMB7-NEXT:    add.w r12, r1, #1
2606; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i16
2607; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i16
2608; CHECK-THUMB7-NEXT:    uxth r1, r1
2609; CHECK-THUMB7-NEXT:  .LBB12_2: @ %atomicrmw.start
2610; CHECK-THUMB7-NEXT:    @ Parent Loop BB12_1 Depth=1
2611; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
2612; CHECK-THUMB7-NEXT:    ldrexh r0, [r3]
2613; CHECK-THUMB7-NEXT:    cmp r0, r1
2614; CHECK-THUMB7-NEXT:    bne .LBB12_4
2615; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
2616; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB12_2 Depth=2
2617; CHECK-THUMB7-NEXT:    strexh r2, r12, [r3]
2618; CHECK-THUMB7-NEXT:    cmp r2, #0
2619; CHECK-THUMB7-NEXT:    bne .LBB12_2
2620; CHECK-THUMB7-NEXT:  .LBB12_4: @ %atomicrmw.start
2621; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB12_1 Depth=1
2622; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
2623; CHECK-THUMB7-NEXT:    uxth r1, r1
2624; CHECK-THUMB7-NEXT:    subs r1, r0, r1
2625; CHECK-THUMB7-NEXT:    clz r1, r1
2626; CHECK-THUMB7-NEXT:    lsrs r1, r1, #5
2627; CHECK-THUMB7-NEXT:    cmp r1, #1
2628; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
2629; CHECK-THUMB7-NEXT:    bne .LBB12_1
2630; CHECK-THUMB7-NEXT:    b .LBB12_5
2631; CHECK-THUMB7-NEXT:  .LBB12_5: @ %atomicrmw.end
2632; CHECK-THUMB7-NEXT:    ldr r0, [sp] @ 4-byte Reload
2633; CHECK-THUMB7-NEXT:    add sp, #8
2634; CHECK-THUMB7-NEXT:    bx lr
2635;
2636; CHECK-THUMB6-LABEL: test_add_i16:
2637; CHECK-THUMB6:       @ %bb.0: @ %entry
2638; CHECK-THUMB6-NEXT:    .save {r7, lr}
2639; CHECK-THUMB6-NEXT:    push {r7, lr}
2640; CHECK-THUMB6-NEXT:    ldr r0, .LCPI12_0
2641; CHECK-THUMB6-NEXT:    movs r1, #1
2642; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_add_2
2643; CHECK-THUMB6-NEXT:    pop {r7, pc}
2644; CHECK-THUMB6-NEXT:    .p2align 2
2645; CHECK-THUMB6-NEXT:  @ %bb.1:
2646; CHECK-THUMB6-NEXT:  .LCPI12_0:
2647; CHECK-THUMB6-NEXT:    .long atomic_i16
2648;
2649; CHECK-THUMB8BASE-LABEL: test_add_i16:
2650; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
2651; CHECK-THUMB8BASE-NEXT:    .save {r4, lr}
2652; CHECK-THUMB8BASE-NEXT:    push {r4, lr}
2653; CHECK-THUMB8BASE-NEXT:    .pad #8
2654; CHECK-THUMB8BASE-NEXT:    sub sp, #8
2655; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i16
2656; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i16
2657; CHECK-THUMB8BASE-NEXT:    ldrh r0, [r0]
2658; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
2659; CHECK-THUMB8BASE-NEXT:    b .LBB12_1
2660; CHECK-THUMB8BASE-NEXT:  .LBB12_1: @ %atomicrmw.start
2661; CHECK-THUMB8BASE-NEXT:    @ =>This Loop Header: Depth=1
2662; CHECK-THUMB8BASE-NEXT:    @ Child Loop BB12_2 Depth 2
2663; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
2664; CHECK-THUMB8BASE-NEXT:    adds r4, r1, #1
2665; CHECK-THUMB8BASE-NEXT:    movw r3, :lower16:atomic_i16
2666; CHECK-THUMB8BASE-NEXT:    movt r3, :upper16:atomic_i16
2667; CHECK-THUMB8BASE-NEXT:    uxth r1, r1
2668; CHECK-THUMB8BASE-NEXT:  .LBB12_2: @ %atomicrmw.start
2669; CHECK-THUMB8BASE-NEXT:    @ Parent Loop BB12_1 Depth=1
2670; CHECK-THUMB8BASE-NEXT:    @ => This Inner Loop Header: Depth=2
2671; CHECK-THUMB8BASE-NEXT:    ldrexh r0, [r3]
2672; CHECK-THUMB8BASE-NEXT:    cmp r0, r1
2673; CHECK-THUMB8BASE-NEXT:    bne .LBB12_4
2674; CHECK-THUMB8BASE-NEXT:  @ %bb.3: @ %atomicrmw.start
2675; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB12_2 Depth=2
2676; CHECK-THUMB8BASE-NEXT:    strexh r2, r4, [r3]
2677; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
2678; CHECK-THUMB8BASE-NEXT:    bne .LBB12_2
2679; CHECK-THUMB8BASE-NEXT:  .LBB12_4: @ %atomicrmw.start
2680; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB12_1 Depth=1
2681; CHECK-THUMB8BASE-NEXT:    str r0, [sp] @ 4-byte Spill
2682; CHECK-THUMB8BASE-NEXT:    uxth r1, r1
2683; CHECK-THUMB8BASE-NEXT:    subs r1, r0, r1
2684; CHECK-THUMB8BASE-NEXT:    rsbs r2, r1, #0
2685; CHECK-THUMB8BASE-NEXT:    adcs r1, r2
2686; CHECK-THUMB8BASE-NEXT:    cmp r1, #1
2687; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
2688; CHECK-THUMB8BASE-NEXT:    bne .LBB12_1
2689; CHECK-THUMB8BASE-NEXT:    b .LBB12_5
2690; CHECK-THUMB8BASE-NEXT:  .LBB12_5: @ %atomicrmw.end
2691; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp] @ 4-byte Reload
2692; CHECK-THUMB8BASE-NEXT:    add sp, #8
2693; CHECK-THUMB8BASE-NEXT:    pop {r4, pc}
2694entry:
2695  %0 = atomicrmw add i16* @atomic_i16, i16 1 monotonic
2696  ret i16 %0
2697}
2698define i16 @test_sub_i16() {
2699; CHECK-ARM8-LABEL: test_sub_i16:
2700; CHECK-ARM8:       @ %bb.0: @ %entry
2701; CHECK-ARM8-NEXT:    .pad #8
2702; CHECK-ARM8-NEXT:    sub sp, sp, #8
2703; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i16
2704; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i16
2705; CHECK-ARM8-NEXT:    ldrh r0, [r0]
2706; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
2707; CHECK-ARM8-NEXT:    b .LBB13_1
2708; CHECK-ARM8-NEXT:  .LBB13_1: @ %atomicrmw.start
2709; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
2710; CHECK-ARM8-NEXT:    @ Child Loop BB13_2 Depth 2
2711; CHECK-ARM8-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
2712; CHECK-ARM8-NEXT:    sub r12, r1, #1
2713; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i16
2714; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i16
2715; CHECK-ARM8-NEXT:    uxth r1, r1
2716; CHECK-ARM8-NEXT:  .LBB13_2: @ %atomicrmw.start
2717; CHECK-ARM8-NEXT:    @ Parent Loop BB13_1 Depth=1
2718; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
2719; CHECK-ARM8-NEXT:    ldrexh r0, [r3]
2720; CHECK-ARM8-NEXT:    cmp r0, r1
2721; CHECK-ARM8-NEXT:    bne .LBB13_4
2722; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
2723; CHECK-ARM8-NEXT:    @ in Loop: Header=BB13_2 Depth=2
2724; CHECK-ARM8-NEXT:    strexh r2, r12, [r3]
2725; CHECK-ARM8-NEXT:    cmp r2, #0
2726; CHECK-ARM8-NEXT:    bne .LBB13_2
2727; CHECK-ARM8-NEXT:  .LBB13_4: @ %atomicrmw.start
2728; CHECK-ARM8-NEXT:    @ in Loop: Header=BB13_1 Depth=1
2729; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
2730; CHECK-ARM8-NEXT:    uxth r1, r1
2731; CHECK-ARM8-NEXT:    sub r1, r0, r1
2732; CHECK-ARM8-NEXT:    clz r1, r1
2733; CHECK-ARM8-NEXT:    lsr r1, r1, #5
2734; CHECK-ARM8-NEXT:    cmp r1, #1
2735; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
2736; CHECK-ARM8-NEXT:    bne .LBB13_1
2737; CHECK-ARM8-NEXT:    b .LBB13_5
2738; CHECK-ARM8-NEXT:  .LBB13_5: @ %atomicrmw.end
2739; CHECK-ARM8-NEXT:    ldr r0, [sp] @ 4-byte Reload
2740; CHECK-ARM8-NEXT:    add sp, sp, #8
2741; CHECK-ARM8-NEXT:    bx lr
2742;
2743; CHECK-ARM6-LABEL: test_sub_i16:
2744; CHECK-ARM6:       @ %bb.0: @ %entry
2745; CHECK-ARM6-NEXT:    .pad #8
2746; CHECK-ARM6-NEXT:    sub sp, sp, #8
2747; CHECK-ARM6-NEXT:    ldr r0, .LCPI13_0
2748; CHECK-ARM6-NEXT:    ldrh r0, [r0]
2749; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
2750; CHECK-ARM6-NEXT:    b .LBB13_1
2751; CHECK-ARM6-NEXT:  .LBB13_1: @ %atomicrmw.start
2752; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
2753; CHECK-ARM6-NEXT:    @ Child Loop BB13_2 Depth 2
2754; CHECK-ARM6-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
2755; CHECK-ARM6-NEXT:    sub r12, r1, #1
2756; CHECK-ARM6-NEXT:    ldr r3, .LCPI13_0
2757; CHECK-ARM6-NEXT:    uxth r1, r1
2758; CHECK-ARM6-NEXT:  .LBB13_2: @ %atomicrmw.start
2759; CHECK-ARM6-NEXT:    @ Parent Loop BB13_1 Depth=1
2760; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
2761; CHECK-ARM6-NEXT:    ldrexh r0, [r3]
2762; CHECK-ARM6-NEXT:    cmp r0, r1
2763; CHECK-ARM6-NEXT:    bne .LBB13_4
2764; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
2765; CHECK-ARM6-NEXT:    @ in Loop: Header=BB13_2 Depth=2
2766; CHECK-ARM6-NEXT:    strexh r2, r12, [r3]
2767; CHECK-ARM6-NEXT:    cmp r2, #0
2768; CHECK-ARM6-NEXT:    bne .LBB13_2
2769; CHECK-ARM6-NEXT:  .LBB13_4: @ %atomicrmw.start
2770; CHECK-ARM6-NEXT:    @ in Loop: Header=BB13_1 Depth=1
2771; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
2772; CHECK-ARM6-NEXT:    uxth r1, r1
2773; CHECK-ARM6-NEXT:    sub r1, r0, r1
2774; CHECK-ARM6-NEXT:    clz r1, r1
2775; CHECK-ARM6-NEXT:    lsr r1, r1, #5
2776; CHECK-ARM6-NEXT:    cmp r1, #1
2777; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
2778; CHECK-ARM6-NEXT:    bne .LBB13_1
2779; CHECK-ARM6-NEXT:    b .LBB13_5
2780; CHECK-ARM6-NEXT:  .LBB13_5: @ %atomicrmw.end
2781; CHECK-ARM6-NEXT:    ldr r0, [sp] @ 4-byte Reload
2782; CHECK-ARM6-NEXT:    add sp, sp, #8
2783; CHECK-ARM6-NEXT:    bx lr
2784; CHECK-ARM6-NEXT:    .p2align 2
2785; CHECK-ARM6-NEXT:  @ %bb.6:
2786; CHECK-ARM6-NEXT:  .LCPI13_0:
2787; CHECK-ARM6-NEXT:    .long atomic_i16
2788;
2789; CHECK-THUMB7-LABEL: test_sub_i16:
2790; CHECK-THUMB7:       @ %bb.0: @ %entry
2791; CHECK-THUMB7-NEXT:    .pad #8
2792; CHECK-THUMB7-NEXT:    sub sp, #8
2793; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i16
2794; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i16
2795; CHECK-THUMB7-NEXT:    ldrh r0, [r0]
2796; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
2797; CHECK-THUMB7-NEXT:    b .LBB13_1
2798; CHECK-THUMB7-NEXT:  .LBB13_1: @ %atomicrmw.start
2799; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
2800; CHECK-THUMB7-NEXT:    @ Child Loop BB13_2 Depth 2
2801; CHECK-THUMB7-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
2802; CHECK-THUMB7-NEXT:    sub.w r12, r1, #1
2803; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i16
2804; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i16
2805; CHECK-THUMB7-NEXT:    uxth r1, r1
2806; CHECK-THUMB7-NEXT:  .LBB13_2: @ %atomicrmw.start
2807; CHECK-THUMB7-NEXT:    @ Parent Loop BB13_1 Depth=1
2808; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
2809; CHECK-THUMB7-NEXT:    ldrexh r0, [r3]
2810; CHECK-THUMB7-NEXT:    cmp r0, r1
2811; CHECK-THUMB7-NEXT:    bne .LBB13_4
2812; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
2813; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB13_2 Depth=2
2814; CHECK-THUMB7-NEXT:    strexh r2, r12, [r3]
2815; CHECK-THUMB7-NEXT:    cmp r2, #0
2816; CHECK-THUMB7-NEXT:    bne .LBB13_2
2817; CHECK-THUMB7-NEXT:  .LBB13_4: @ %atomicrmw.start
2818; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB13_1 Depth=1
2819; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
2820; CHECK-THUMB7-NEXT:    uxth r1, r1
2821; CHECK-THUMB7-NEXT:    subs r1, r0, r1
2822; CHECK-THUMB7-NEXT:    clz r1, r1
2823; CHECK-THUMB7-NEXT:    lsrs r1, r1, #5
2824; CHECK-THUMB7-NEXT:    cmp r1, #1
2825; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
2826; CHECK-THUMB7-NEXT:    bne .LBB13_1
2827; CHECK-THUMB7-NEXT:    b .LBB13_5
2828; CHECK-THUMB7-NEXT:  .LBB13_5: @ %atomicrmw.end
2829; CHECK-THUMB7-NEXT:    ldr r0, [sp] @ 4-byte Reload
2830; CHECK-THUMB7-NEXT:    add sp, #8
2831; CHECK-THUMB7-NEXT:    bx lr
2832;
2833; CHECK-THUMB6-LABEL: test_sub_i16:
2834; CHECK-THUMB6:       @ %bb.0: @ %entry
2835; CHECK-THUMB6-NEXT:    .save {r7, lr}
2836; CHECK-THUMB6-NEXT:    push {r7, lr}
2837; CHECK-THUMB6-NEXT:    ldr r0, .LCPI13_0
2838; CHECK-THUMB6-NEXT:    movs r1, #1
2839; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_sub_2
2840; CHECK-THUMB6-NEXT:    pop {r7, pc}
2841; CHECK-THUMB6-NEXT:    .p2align 2
2842; CHECK-THUMB6-NEXT:  @ %bb.1:
2843; CHECK-THUMB6-NEXT:  .LCPI13_0:
2844; CHECK-THUMB6-NEXT:    .long atomic_i16
2845;
2846; CHECK-THUMB8BASE-LABEL: test_sub_i16:
2847; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
2848; CHECK-THUMB8BASE-NEXT:    .save {r4, lr}
2849; CHECK-THUMB8BASE-NEXT:    push {r4, lr}
2850; CHECK-THUMB8BASE-NEXT:    .pad #8
2851; CHECK-THUMB8BASE-NEXT:    sub sp, #8
2852; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i16
2853; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i16
2854; CHECK-THUMB8BASE-NEXT:    ldrh r0, [r0]
2855; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
2856; CHECK-THUMB8BASE-NEXT:    b .LBB13_1
2857; CHECK-THUMB8BASE-NEXT:  .LBB13_1: @ %atomicrmw.start
2858; CHECK-THUMB8BASE-NEXT:    @ =>This Loop Header: Depth=1
2859; CHECK-THUMB8BASE-NEXT:    @ Child Loop BB13_2 Depth 2
2860; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
2861; CHECK-THUMB8BASE-NEXT:    subs r4, r1, #1
2862; CHECK-THUMB8BASE-NEXT:    movw r3, :lower16:atomic_i16
2863; CHECK-THUMB8BASE-NEXT:    movt r3, :upper16:atomic_i16
2864; CHECK-THUMB8BASE-NEXT:    uxth r1, r1
2865; CHECK-THUMB8BASE-NEXT:  .LBB13_2: @ %atomicrmw.start
2866; CHECK-THUMB8BASE-NEXT:    @ Parent Loop BB13_1 Depth=1
2867; CHECK-THUMB8BASE-NEXT:    @ => This Inner Loop Header: Depth=2
2868; CHECK-THUMB8BASE-NEXT:    ldrexh r0, [r3]
2869; CHECK-THUMB8BASE-NEXT:    cmp r0, r1
2870; CHECK-THUMB8BASE-NEXT:    bne .LBB13_4
2871; CHECK-THUMB8BASE-NEXT:  @ %bb.3: @ %atomicrmw.start
2872; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB13_2 Depth=2
2873; CHECK-THUMB8BASE-NEXT:    strexh r2, r4, [r3]
2874; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
2875; CHECK-THUMB8BASE-NEXT:    bne .LBB13_2
2876; CHECK-THUMB8BASE-NEXT:  .LBB13_4: @ %atomicrmw.start
2877; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB13_1 Depth=1
2878; CHECK-THUMB8BASE-NEXT:    str r0, [sp] @ 4-byte Spill
2879; CHECK-THUMB8BASE-NEXT:    uxth r1, r1
2880; CHECK-THUMB8BASE-NEXT:    subs r1, r0, r1
2881; CHECK-THUMB8BASE-NEXT:    rsbs r2, r1, #0
2882; CHECK-THUMB8BASE-NEXT:    adcs r1, r2
2883; CHECK-THUMB8BASE-NEXT:    cmp r1, #1
2884; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
2885; CHECK-THUMB8BASE-NEXT:    bne .LBB13_1
2886; CHECK-THUMB8BASE-NEXT:    b .LBB13_5
2887; CHECK-THUMB8BASE-NEXT:  .LBB13_5: @ %atomicrmw.end
2888; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp] @ 4-byte Reload
2889; CHECK-THUMB8BASE-NEXT:    add sp, #8
2890; CHECK-THUMB8BASE-NEXT:    pop {r4, pc}
2891entry:
2892  %0 = atomicrmw sub i16* @atomic_i16, i16 1 monotonic
2893  ret i16 %0
2894}
2895define i16 @test_and_i16() {
2896; CHECK-ARM8-LABEL: test_and_i16:
2897; CHECK-ARM8:       @ %bb.0: @ %entry
2898; CHECK-ARM8-NEXT:    .pad #8
2899; CHECK-ARM8-NEXT:    sub sp, sp, #8
2900; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i16
2901; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i16
2902; CHECK-ARM8-NEXT:    ldrh r0, [r0]
2903; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
2904; CHECK-ARM8-NEXT:    b .LBB14_1
2905; CHECK-ARM8-NEXT:  .LBB14_1: @ %atomicrmw.start
2906; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
2907; CHECK-ARM8-NEXT:    @ Child Loop BB14_2 Depth 2
2908; CHECK-ARM8-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
2909; CHECK-ARM8-NEXT:    and r12, r1, #1
2910; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i16
2911; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i16
2912; CHECK-ARM8-NEXT:    uxth r1, r1
2913; CHECK-ARM8-NEXT:  .LBB14_2: @ %atomicrmw.start
2914; CHECK-ARM8-NEXT:    @ Parent Loop BB14_1 Depth=1
2915; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
2916; CHECK-ARM8-NEXT:    ldrexh r0, [r3]
2917; CHECK-ARM8-NEXT:    cmp r0, r1
2918; CHECK-ARM8-NEXT:    bne .LBB14_4
2919; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
2920; CHECK-ARM8-NEXT:    @ in Loop: Header=BB14_2 Depth=2
2921; CHECK-ARM8-NEXT:    strexh r2, r12, [r3]
2922; CHECK-ARM8-NEXT:    cmp r2, #0
2923; CHECK-ARM8-NEXT:    bne .LBB14_2
2924; CHECK-ARM8-NEXT:  .LBB14_4: @ %atomicrmw.start
2925; CHECK-ARM8-NEXT:    @ in Loop: Header=BB14_1 Depth=1
2926; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
2927; CHECK-ARM8-NEXT:    uxth r1, r1
2928; CHECK-ARM8-NEXT:    sub r1, r0, r1
2929; CHECK-ARM8-NEXT:    clz r1, r1
2930; CHECK-ARM8-NEXT:    lsr r1, r1, #5
2931; CHECK-ARM8-NEXT:    cmp r1, #1
2932; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
2933; CHECK-ARM8-NEXT:    bne .LBB14_1
2934; CHECK-ARM8-NEXT:    b .LBB14_5
2935; CHECK-ARM8-NEXT:  .LBB14_5: @ %atomicrmw.end
2936; CHECK-ARM8-NEXT:    ldr r0, [sp] @ 4-byte Reload
2937; CHECK-ARM8-NEXT:    add sp, sp, #8
2938; CHECK-ARM8-NEXT:    bx lr
2939;
2940; CHECK-ARM6-LABEL: test_and_i16:
2941; CHECK-ARM6:       @ %bb.0: @ %entry
2942; CHECK-ARM6-NEXT:    .pad #8
2943; CHECK-ARM6-NEXT:    sub sp, sp, #8
2944; CHECK-ARM6-NEXT:    ldr r0, .LCPI14_0
2945; CHECK-ARM6-NEXT:    ldrh r0, [r0]
2946; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
2947; CHECK-ARM6-NEXT:    b .LBB14_1
2948; CHECK-ARM6-NEXT:  .LBB14_1: @ %atomicrmw.start
2949; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
2950; CHECK-ARM6-NEXT:    @ Child Loop BB14_2 Depth 2
2951; CHECK-ARM6-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
2952; CHECK-ARM6-NEXT:    and r12, r1, #1
2953; CHECK-ARM6-NEXT:    ldr r3, .LCPI14_0
2954; CHECK-ARM6-NEXT:    uxth r1, r1
2955; CHECK-ARM6-NEXT:  .LBB14_2: @ %atomicrmw.start
2956; CHECK-ARM6-NEXT:    @ Parent Loop BB14_1 Depth=1
2957; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
2958; CHECK-ARM6-NEXT:    ldrexh r0, [r3]
2959; CHECK-ARM6-NEXT:    cmp r0, r1
2960; CHECK-ARM6-NEXT:    bne .LBB14_4
2961; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
2962; CHECK-ARM6-NEXT:    @ in Loop: Header=BB14_2 Depth=2
2963; CHECK-ARM6-NEXT:    strexh r2, r12, [r3]
2964; CHECK-ARM6-NEXT:    cmp r2, #0
2965; CHECK-ARM6-NEXT:    bne .LBB14_2
2966; CHECK-ARM6-NEXT:  .LBB14_4: @ %atomicrmw.start
2967; CHECK-ARM6-NEXT:    @ in Loop: Header=BB14_1 Depth=1
2968; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
2969; CHECK-ARM6-NEXT:    uxth r1, r1
2970; CHECK-ARM6-NEXT:    sub r1, r0, r1
2971; CHECK-ARM6-NEXT:    clz r1, r1
2972; CHECK-ARM6-NEXT:    lsr r1, r1, #5
2973; CHECK-ARM6-NEXT:    cmp r1, #1
2974; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
2975; CHECK-ARM6-NEXT:    bne .LBB14_1
2976; CHECK-ARM6-NEXT:    b .LBB14_5
2977; CHECK-ARM6-NEXT:  .LBB14_5: @ %atomicrmw.end
2978; CHECK-ARM6-NEXT:    ldr r0, [sp] @ 4-byte Reload
2979; CHECK-ARM6-NEXT:    add sp, sp, #8
2980; CHECK-ARM6-NEXT:    bx lr
2981; CHECK-ARM6-NEXT:    .p2align 2
2982; CHECK-ARM6-NEXT:  @ %bb.6:
2983; CHECK-ARM6-NEXT:  .LCPI14_0:
2984; CHECK-ARM6-NEXT:    .long atomic_i16
2985;
2986; CHECK-THUMB7-LABEL: test_and_i16:
2987; CHECK-THUMB7:       @ %bb.0: @ %entry
2988; CHECK-THUMB7-NEXT:    .pad #8
2989; CHECK-THUMB7-NEXT:    sub sp, #8
2990; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i16
2991; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i16
2992; CHECK-THUMB7-NEXT:    ldrh r0, [r0]
2993; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
2994; CHECK-THUMB7-NEXT:    b .LBB14_1
2995; CHECK-THUMB7-NEXT:  .LBB14_1: @ %atomicrmw.start
2996; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
2997; CHECK-THUMB7-NEXT:    @ Child Loop BB14_2 Depth 2
2998; CHECK-THUMB7-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
2999; CHECK-THUMB7-NEXT:    and r12, r1, #1
3000; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i16
3001; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i16
3002; CHECK-THUMB7-NEXT:    uxth r1, r1
3003; CHECK-THUMB7-NEXT:  .LBB14_2: @ %atomicrmw.start
3004; CHECK-THUMB7-NEXT:    @ Parent Loop BB14_1 Depth=1
3005; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
3006; CHECK-THUMB7-NEXT:    ldrexh r0, [r3]
3007; CHECK-THUMB7-NEXT:    cmp r0, r1
3008; CHECK-THUMB7-NEXT:    bne .LBB14_4
3009; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
3010; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB14_2 Depth=2
3011; CHECK-THUMB7-NEXT:    strexh r2, r12, [r3]
3012; CHECK-THUMB7-NEXT:    cmp r2, #0
3013; CHECK-THUMB7-NEXT:    bne .LBB14_2
3014; CHECK-THUMB7-NEXT:  .LBB14_4: @ %atomicrmw.start
3015; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB14_1 Depth=1
3016; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
3017; CHECK-THUMB7-NEXT:    uxth r1, r1
3018; CHECK-THUMB7-NEXT:    subs r1, r0, r1
3019; CHECK-THUMB7-NEXT:    clz r1, r1
3020; CHECK-THUMB7-NEXT:    lsrs r1, r1, #5
3021; CHECK-THUMB7-NEXT:    cmp r1, #1
3022; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
3023; CHECK-THUMB7-NEXT:    bne .LBB14_1
3024; CHECK-THUMB7-NEXT:    b .LBB14_5
3025; CHECK-THUMB7-NEXT:  .LBB14_5: @ %atomicrmw.end
3026; CHECK-THUMB7-NEXT:    ldr r0, [sp] @ 4-byte Reload
3027; CHECK-THUMB7-NEXT:    add sp, #8
3028; CHECK-THUMB7-NEXT:    bx lr
3029;
3030; CHECK-THUMB6-LABEL: test_and_i16:
3031; CHECK-THUMB6:       @ %bb.0: @ %entry
3032; CHECK-THUMB6-NEXT:    .save {r7, lr}
3033; CHECK-THUMB6-NEXT:    push {r7, lr}
3034; CHECK-THUMB6-NEXT:    ldr r0, .LCPI14_0
3035; CHECK-THUMB6-NEXT:    movs r1, #1
3036; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_and_2
3037; CHECK-THUMB6-NEXT:    pop {r7, pc}
3038; CHECK-THUMB6-NEXT:    .p2align 2
3039; CHECK-THUMB6-NEXT:  @ %bb.1:
3040; CHECK-THUMB6-NEXT:  .LCPI14_0:
3041; CHECK-THUMB6-NEXT:    .long atomic_i16
3042;
3043; CHECK-THUMB8BASE-LABEL: test_and_i16:
3044; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
3045; CHECK-THUMB8BASE-NEXT:    .save {r4, lr}
3046; CHECK-THUMB8BASE-NEXT:    push {r4, lr}
3047; CHECK-THUMB8BASE-NEXT:    .pad #8
3048; CHECK-THUMB8BASE-NEXT:    sub sp, #8
3049; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i16
3050; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i16
3051; CHECK-THUMB8BASE-NEXT:    ldrh r0, [r0]
3052; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
3053; CHECK-THUMB8BASE-NEXT:    b .LBB14_1
3054; CHECK-THUMB8BASE-NEXT:  .LBB14_1: @ %atomicrmw.start
3055; CHECK-THUMB8BASE-NEXT:    @ =>This Loop Header: Depth=1
3056; CHECK-THUMB8BASE-NEXT:    @ Child Loop BB14_2 Depth 2
3057; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
3058; CHECK-THUMB8BASE-NEXT:    movs r0, #1
3059; CHECK-THUMB8BASE-NEXT:    mov r4, r1
3060; CHECK-THUMB8BASE-NEXT:    ands r4, r0
3061; CHECK-THUMB8BASE-NEXT:    movw r3, :lower16:atomic_i16
3062; CHECK-THUMB8BASE-NEXT:    movt r3, :upper16:atomic_i16
3063; CHECK-THUMB8BASE-NEXT:    uxth r1, r1
3064; CHECK-THUMB8BASE-NEXT:  .LBB14_2: @ %atomicrmw.start
3065; CHECK-THUMB8BASE-NEXT:    @ Parent Loop BB14_1 Depth=1
3066; CHECK-THUMB8BASE-NEXT:    @ => This Inner Loop Header: Depth=2
3067; CHECK-THUMB8BASE-NEXT:    ldrexh r0, [r3]
3068; CHECK-THUMB8BASE-NEXT:    cmp r0, r1
3069; CHECK-THUMB8BASE-NEXT:    bne .LBB14_4
3070; CHECK-THUMB8BASE-NEXT:  @ %bb.3: @ %atomicrmw.start
3071; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB14_2 Depth=2
3072; CHECK-THUMB8BASE-NEXT:    strexh r2, r4, [r3]
3073; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
3074; CHECK-THUMB8BASE-NEXT:    bne .LBB14_2
3075; CHECK-THUMB8BASE-NEXT:  .LBB14_4: @ %atomicrmw.start
3076; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB14_1 Depth=1
3077; CHECK-THUMB8BASE-NEXT:    str r0, [sp] @ 4-byte Spill
3078; CHECK-THUMB8BASE-NEXT:    uxth r1, r1
3079; CHECK-THUMB8BASE-NEXT:    subs r1, r0, r1
3080; CHECK-THUMB8BASE-NEXT:    rsbs r2, r1, #0
3081; CHECK-THUMB8BASE-NEXT:    adcs r1, r2
3082; CHECK-THUMB8BASE-NEXT:    cmp r1, #1
3083; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
3084; CHECK-THUMB8BASE-NEXT:    bne .LBB14_1
3085; CHECK-THUMB8BASE-NEXT:    b .LBB14_5
3086; CHECK-THUMB8BASE-NEXT:  .LBB14_5: @ %atomicrmw.end
3087; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp] @ 4-byte Reload
3088; CHECK-THUMB8BASE-NEXT:    add sp, #8
3089; CHECK-THUMB8BASE-NEXT:    pop {r4, pc}
3090entry:
3091  %0 = atomicrmw and i16* @atomic_i16, i16 1 monotonic
3092  ret i16 %0
3093}
3094define i16 @test_nand_i16() {
3095; CHECK-ARM8-LABEL: test_nand_i16:
3096; CHECK-ARM8:       @ %bb.0: @ %entry
3097; CHECK-ARM8-NEXT:    .pad #8
3098; CHECK-ARM8-NEXT:    sub sp, sp, #8
3099; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i16
3100; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i16
3101; CHECK-ARM8-NEXT:    ldrh r0, [r0]
3102; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
3103; CHECK-ARM8-NEXT:    b .LBB15_1
3104; CHECK-ARM8-NEXT:  .LBB15_1: @ %atomicrmw.start
3105; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
3106; CHECK-ARM8-NEXT:    @ Child Loop BB15_2 Depth 2
3107; CHECK-ARM8-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
3108; CHECK-ARM8-NEXT:    mvn r0, r1
3109; CHECK-ARM8-NEXT:    mvn r2, #1
3110; CHECK-ARM8-NEXT:    orr r12, r0, r2
3111; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i16
3112; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i16
3113; CHECK-ARM8-NEXT:    uxth r1, r1
3114; CHECK-ARM8-NEXT:  .LBB15_2: @ %atomicrmw.start
3115; CHECK-ARM8-NEXT:    @ Parent Loop BB15_1 Depth=1
3116; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
3117; CHECK-ARM8-NEXT:    ldrexh r0, [r3]
3118; CHECK-ARM8-NEXT:    cmp r0, r1
3119; CHECK-ARM8-NEXT:    bne .LBB15_4
3120; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
3121; CHECK-ARM8-NEXT:    @ in Loop: Header=BB15_2 Depth=2
3122; CHECK-ARM8-NEXT:    strexh r2, r12, [r3]
3123; CHECK-ARM8-NEXT:    cmp r2, #0
3124; CHECK-ARM8-NEXT:    bne .LBB15_2
3125; CHECK-ARM8-NEXT:  .LBB15_4: @ %atomicrmw.start
3126; CHECK-ARM8-NEXT:    @ in Loop: Header=BB15_1 Depth=1
3127; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
3128; CHECK-ARM8-NEXT:    uxth r1, r1
3129; CHECK-ARM8-NEXT:    sub r1, r0, r1
3130; CHECK-ARM8-NEXT:    clz r1, r1
3131; CHECK-ARM8-NEXT:    lsr r1, r1, #5
3132; CHECK-ARM8-NEXT:    cmp r1, #1
3133; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
3134; CHECK-ARM8-NEXT:    bne .LBB15_1
3135; CHECK-ARM8-NEXT:    b .LBB15_5
3136; CHECK-ARM8-NEXT:  .LBB15_5: @ %atomicrmw.end
3137; CHECK-ARM8-NEXT:    ldr r0, [sp] @ 4-byte Reload
3138; CHECK-ARM8-NEXT:    add sp, sp, #8
3139; CHECK-ARM8-NEXT:    bx lr
3140;
3141; CHECK-ARM6-LABEL: test_nand_i16:
3142; CHECK-ARM6:       @ %bb.0: @ %entry
3143; CHECK-ARM6-NEXT:    .pad #8
3144; CHECK-ARM6-NEXT:    sub sp, sp, #8
3145; CHECK-ARM6-NEXT:    ldr r0, .LCPI15_0
3146; CHECK-ARM6-NEXT:    ldrh r0, [r0]
3147; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
3148; CHECK-ARM6-NEXT:    b .LBB15_1
3149; CHECK-ARM6-NEXT:  .LBB15_1: @ %atomicrmw.start
3150; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
3151; CHECK-ARM6-NEXT:    @ Child Loop BB15_2 Depth 2
3152; CHECK-ARM6-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
3153; CHECK-ARM6-NEXT:    mvn r0, r1
3154; CHECK-ARM6-NEXT:    mvn r2, #1
3155; CHECK-ARM6-NEXT:    orr r12, r0, r2
3156; CHECK-ARM6-NEXT:    ldr r3, .LCPI15_0
3157; CHECK-ARM6-NEXT:    uxth r1, r1
3158; CHECK-ARM6-NEXT:  .LBB15_2: @ %atomicrmw.start
3159; CHECK-ARM6-NEXT:    @ Parent Loop BB15_1 Depth=1
3160; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
3161; CHECK-ARM6-NEXT:    ldrexh r0, [r3]
3162; CHECK-ARM6-NEXT:    cmp r0, r1
3163; CHECK-ARM6-NEXT:    bne .LBB15_4
3164; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
3165; CHECK-ARM6-NEXT:    @ in Loop: Header=BB15_2 Depth=2
3166; CHECK-ARM6-NEXT:    strexh r2, r12, [r3]
3167; CHECK-ARM6-NEXT:    cmp r2, #0
3168; CHECK-ARM6-NEXT:    bne .LBB15_2
3169; CHECK-ARM6-NEXT:  .LBB15_4: @ %atomicrmw.start
3170; CHECK-ARM6-NEXT:    @ in Loop: Header=BB15_1 Depth=1
3171; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
3172; CHECK-ARM6-NEXT:    uxth r1, r1
3173; CHECK-ARM6-NEXT:    sub r1, r0, r1
3174; CHECK-ARM6-NEXT:    clz r1, r1
3175; CHECK-ARM6-NEXT:    lsr r1, r1, #5
3176; CHECK-ARM6-NEXT:    cmp r1, #1
3177; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
3178; CHECK-ARM6-NEXT:    bne .LBB15_1
3179; CHECK-ARM6-NEXT:    b .LBB15_5
3180; CHECK-ARM6-NEXT:  .LBB15_5: @ %atomicrmw.end
3181; CHECK-ARM6-NEXT:    ldr r0, [sp] @ 4-byte Reload
3182; CHECK-ARM6-NEXT:    add sp, sp, #8
3183; CHECK-ARM6-NEXT:    bx lr
3184; CHECK-ARM6-NEXT:    .p2align 2
3185; CHECK-ARM6-NEXT:  @ %bb.6:
3186; CHECK-ARM6-NEXT:  .LCPI15_0:
3187; CHECK-ARM6-NEXT:    .long atomic_i16
3188;
3189; CHECK-THUMB7-LABEL: test_nand_i16:
3190; CHECK-THUMB7:       @ %bb.0: @ %entry
3191; CHECK-THUMB7-NEXT:    .pad #8
3192; CHECK-THUMB7-NEXT:    sub sp, #8
3193; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i16
3194; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i16
3195; CHECK-THUMB7-NEXT:    ldrh r0, [r0]
3196; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
3197; CHECK-THUMB7-NEXT:    b .LBB15_1
3198; CHECK-THUMB7-NEXT:  .LBB15_1: @ %atomicrmw.start
3199; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
3200; CHECK-THUMB7-NEXT:    @ Child Loop BB15_2 Depth 2
3201; CHECK-THUMB7-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
3202; CHECK-THUMB7-NEXT:    mvn r0, #1
3203; CHECK-THUMB7-NEXT:    orn r12, r0, r1
3204; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i16
3205; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i16
3206; CHECK-THUMB7-NEXT:    uxth r1, r1
3207; CHECK-THUMB7-NEXT:  .LBB15_2: @ %atomicrmw.start
3208; CHECK-THUMB7-NEXT:    @ Parent Loop BB15_1 Depth=1
3209; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
3210; CHECK-THUMB7-NEXT:    ldrexh r0, [r3]
3211; CHECK-THUMB7-NEXT:    cmp r0, r1
3212; CHECK-THUMB7-NEXT:    bne .LBB15_4
3213; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
3214; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB15_2 Depth=2
3215; CHECK-THUMB7-NEXT:    strexh r2, r12, [r3]
3216; CHECK-THUMB7-NEXT:    cmp r2, #0
3217; CHECK-THUMB7-NEXT:    bne .LBB15_2
3218; CHECK-THUMB7-NEXT:  .LBB15_4: @ %atomicrmw.start
3219; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB15_1 Depth=1
3220; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
3221; CHECK-THUMB7-NEXT:    uxth r1, r1
3222; CHECK-THUMB7-NEXT:    subs r1, r0, r1
3223; CHECK-THUMB7-NEXT:    clz r1, r1
3224; CHECK-THUMB7-NEXT:    lsrs r1, r1, #5
3225; CHECK-THUMB7-NEXT:    cmp r1, #1
3226; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
3227; CHECK-THUMB7-NEXT:    bne .LBB15_1
3228; CHECK-THUMB7-NEXT:    b .LBB15_5
3229; CHECK-THUMB7-NEXT:  .LBB15_5: @ %atomicrmw.end
3230; CHECK-THUMB7-NEXT:    ldr r0, [sp] @ 4-byte Reload
3231; CHECK-THUMB7-NEXT:    add sp, #8
3232; CHECK-THUMB7-NEXT:    bx lr
3233;
3234; CHECK-THUMB6-LABEL: test_nand_i16:
3235; CHECK-THUMB6:       @ %bb.0: @ %entry
3236; CHECK-THUMB6-NEXT:    .save {r7, lr}
3237; CHECK-THUMB6-NEXT:    push {r7, lr}
3238; CHECK-THUMB6-NEXT:    ldr r0, .LCPI15_0
3239; CHECK-THUMB6-NEXT:    movs r1, #1
3240; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_nand_2
3241; CHECK-THUMB6-NEXT:    pop {r7, pc}
3242; CHECK-THUMB6-NEXT:    .p2align 2
3243; CHECK-THUMB6-NEXT:  @ %bb.1:
3244; CHECK-THUMB6-NEXT:  .LCPI15_0:
3245; CHECK-THUMB6-NEXT:    .long atomic_i16
3246;
3247; CHECK-THUMB8BASE-LABEL: test_nand_i16:
3248; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
3249; CHECK-THUMB8BASE-NEXT:    .save {r4, lr}
3250; CHECK-THUMB8BASE-NEXT:    push {r4, lr}
3251; CHECK-THUMB8BASE-NEXT:    .pad #8
3252; CHECK-THUMB8BASE-NEXT:    sub sp, #8
3253; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i16
3254; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i16
3255; CHECK-THUMB8BASE-NEXT:    ldrh r0, [r0]
3256; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
3257; CHECK-THUMB8BASE-NEXT:    b .LBB15_1
3258; CHECK-THUMB8BASE-NEXT:  .LBB15_1: @ %atomicrmw.start
3259; CHECK-THUMB8BASE-NEXT:    @ =>This Loop Header: Depth=1
3260; CHECK-THUMB8BASE-NEXT:    @ Child Loop BB15_2 Depth 2
3261; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
3262; CHECK-THUMB8BASE-NEXT:    mvns r4, r1
3263; CHECK-THUMB8BASE-NEXT:    movs r0, #1
3264; CHECK-THUMB8BASE-NEXT:    mvns r0, r0
3265; CHECK-THUMB8BASE-NEXT:    orrs r4, r0
3266; CHECK-THUMB8BASE-NEXT:    movw r3, :lower16:atomic_i16
3267; CHECK-THUMB8BASE-NEXT:    movt r3, :upper16:atomic_i16
3268; CHECK-THUMB8BASE-NEXT:    uxth r1, r1
3269; CHECK-THUMB8BASE-NEXT:  .LBB15_2: @ %atomicrmw.start
3270; CHECK-THUMB8BASE-NEXT:    @ Parent Loop BB15_1 Depth=1
3271; CHECK-THUMB8BASE-NEXT:    @ => This Inner Loop Header: Depth=2
3272; CHECK-THUMB8BASE-NEXT:    ldrexh r0, [r3]
3273; CHECK-THUMB8BASE-NEXT:    cmp r0, r1
3274; CHECK-THUMB8BASE-NEXT:    bne .LBB15_4
3275; CHECK-THUMB8BASE-NEXT:  @ %bb.3: @ %atomicrmw.start
3276; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB15_2 Depth=2
3277; CHECK-THUMB8BASE-NEXT:    strexh r2, r4, [r3]
3278; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
3279; CHECK-THUMB8BASE-NEXT:    bne .LBB15_2
3280; CHECK-THUMB8BASE-NEXT:  .LBB15_4: @ %atomicrmw.start
3281; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB15_1 Depth=1
3282; CHECK-THUMB8BASE-NEXT:    str r0, [sp] @ 4-byte Spill
3283; CHECK-THUMB8BASE-NEXT:    uxth r1, r1
3284; CHECK-THUMB8BASE-NEXT:    subs r1, r0, r1
3285; CHECK-THUMB8BASE-NEXT:    rsbs r2, r1, #0
3286; CHECK-THUMB8BASE-NEXT:    adcs r1, r2
3287; CHECK-THUMB8BASE-NEXT:    cmp r1, #1
3288; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
3289; CHECK-THUMB8BASE-NEXT:    bne .LBB15_1
3290; CHECK-THUMB8BASE-NEXT:    b .LBB15_5
3291; CHECK-THUMB8BASE-NEXT:  .LBB15_5: @ %atomicrmw.end
3292; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp] @ 4-byte Reload
3293; CHECK-THUMB8BASE-NEXT:    add sp, #8
3294; CHECK-THUMB8BASE-NEXT:    pop {r4, pc}
3295entry:
3296  %0 = atomicrmw nand i16* @atomic_i16, i16 1 monotonic
3297  ret i16 %0
3298}
3299define i16 @test_or_i16() {
3300; CHECK-ARM8-LABEL: test_or_i16:
3301; CHECK-ARM8:       @ %bb.0: @ %entry
3302; CHECK-ARM8-NEXT:    .pad #8
3303; CHECK-ARM8-NEXT:    sub sp, sp, #8
3304; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i16
3305; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i16
3306; CHECK-ARM8-NEXT:    ldrh r0, [r0]
3307; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
3308; CHECK-ARM8-NEXT:    b .LBB16_1
3309; CHECK-ARM8-NEXT:  .LBB16_1: @ %atomicrmw.start
3310; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
3311; CHECK-ARM8-NEXT:    @ Child Loop BB16_2 Depth 2
3312; CHECK-ARM8-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
3313; CHECK-ARM8-NEXT:    orr r12, r1, #1
3314; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i16
3315; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i16
3316; CHECK-ARM8-NEXT:    uxth r1, r1
3317; CHECK-ARM8-NEXT:  .LBB16_2: @ %atomicrmw.start
3318; CHECK-ARM8-NEXT:    @ Parent Loop BB16_1 Depth=1
3319; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
3320; CHECK-ARM8-NEXT:    ldrexh r0, [r3]
3321; CHECK-ARM8-NEXT:    cmp r0, r1
3322; CHECK-ARM8-NEXT:    bne .LBB16_4
3323; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
3324; CHECK-ARM8-NEXT:    @ in Loop: Header=BB16_2 Depth=2
3325; CHECK-ARM8-NEXT:    strexh r2, r12, [r3]
3326; CHECK-ARM8-NEXT:    cmp r2, #0
3327; CHECK-ARM8-NEXT:    bne .LBB16_2
3328; CHECK-ARM8-NEXT:  .LBB16_4: @ %atomicrmw.start
3329; CHECK-ARM8-NEXT:    @ in Loop: Header=BB16_1 Depth=1
3330; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
3331; CHECK-ARM8-NEXT:    uxth r1, r1
3332; CHECK-ARM8-NEXT:    sub r1, r0, r1
3333; CHECK-ARM8-NEXT:    clz r1, r1
3334; CHECK-ARM8-NEXT:    lsr r1, r1, #5
3335; CHECK-ARM8-NEXT:    cmp r1, #1
3336; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
3337; CHECK-ARM8-NEXT:    bne .LBB16_1
3338; CHECK-ARM8-NEXT:    b .LBB16_5
3339; CHECK-ARM8-NEXT:  .LBB16_5: @ %atomicrmw.end
3340; CHECK-ARM8-NEXT:    ldr r0, [sp] @ 4-byte Reload
3341; CHECK-ARM8-NEXT:    add sp, sp, #8
3342; CHECK-ARM8-NEXT:    bx lr
3343;
3344; CHECK-ARM6-LABEL: test_or_i16:
3345; CHECK-ARM6:       @ %bb.0: @ %entry
3346; CHECK-ARM6-NEXT:    .pad #8
3347; CHECK-ARM6-NEXT:    sub sp, sp, #8
3348; CHECK-ARM6-NEXT:    ldr r0, .LCPI16_0
3349; CHECK-ARM6-NEXT:    ldrh r0, [r0]
3350; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
3351; CHECK-ARM6-NEXT:    b .LBB16_1
3352; CHECK-ARM6-NEXT:  .LBB16_1: @ %atomicrmw.start
3353; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
3354; CHECK-ARM6-NEXT:    @ Child Loop BB16_2 Depth 2
3355; CHECK-ARM6-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
3356; CHECK-ARM6-NEXT:    orr r12, r1, #1
3357; CHECK-ARM6-NEXT:    ldr r3, .LCPI16_0
3358; CHECK-ARM6-NEXT:    uxth r1, r1
3359; CHECK-ARM6-NEXT:  .LBB16_2: @ %atomicrmw.start
3360; CHECK-ARM6-NEXT:    @ Parent Loop BB16_1 Depth=1
3361; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
3362; CHECK-ARM6-NEXT:    ldrexh r0, [r3]
3363; CHECK-ARM6-NEXT:    cmp r0, r1
3364; CHECK-ARM6-NEXT:    bne .LBB16_4
3365; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
3366; CHECK-ARM6-NEXT:    @ in Loop: Header=BB16_2 Depth=2
3367; CHECK-ARM6-NEXT:    strexh r2, r12, [r3]
3368; CHECK-ARM6-NEXT:    cmp r2, #0
3369; CHECK-ARM6-NEXT:    bne .LBB16_2
3370; CHECK-ARM6-NEXT:  .LBB16_4: @ %atomicrmw.start
3371; CHECK-ARM6-NEXT:    @ in Loop: Header=BB16_1 Depth=1
3372; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
3373; CHECK-ARM6-NEXT:    uxth r1, r1
3374; CHECK-ARM6-NEXT:    sub r1, r0, r1
3375; CHECK-ARM6-NEXT:    clz r1, r1
3376; CHECK-ARM6-NEXT:    lsr r1, r1, #5
3377; CHECK-ARM6-NEXT:    cmp r1, #1
3378; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
3379; CHECK-ARM6-NEXT:    bne .LBB16_1
3380; CHECK-ARM6-NEXT:    b .LBB16_5
3381; CHECK-ARM6-NEXT:  .LBB16_5: @ %atomicrmw.end
3382; CHECK-ARM6-NEXT:    ldr r0, [sp] @ 4-byte Reload
3383; CHECK-ARM6-NEXT:    add sp, sp, #8
3384; CHECK-ARM6-NEXT:    bx lr
3385; CHECK-ARM6-NEXT:    .p2align 2
3386; CHECK-ARM6-NEXT:  @ %bb.6:
3387; CHECK-ARM6-NEXT:  .LCPI16_0:
3388; CHECK-ARM6-NEXT:    .long atomic_i16
3389;
3390; CHECK-THUMB7-LABEL: test_or_i16:
3391; CHECK-THUMB7:       @ %bb.0: @ %entry
3392; CHECK-THUMB7-NEXT:    .pad #8
3393; CHECK-THUMB7-NEXT:    sub sp, #8
3394; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i16
3395; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i16
3396; CHECK-THUMB7-NEXT:    ldrh r0, [r0]
3397; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
3398; CHECK-THUMB7-NEXT:    b .LBB16_1
3399; CHECK-THUMB7-NEXT:  .LBB16_1: @ %atomicrmw.start
3400; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
3401; CHECK-THUMB7-NEXT:    @ Child Loop BB16_2 Depth 2
3402; CHECK-THUMB7-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
3403; CHECK-THUMB7-NEXT:    orr r12, r1, #1
3404; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i16
3405; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i16
3406; CHECK-THUMB7-NEXT:    uxth r1, r1
3407; CHECK-THUMB7-NEXT:  .LBB16_2: @ %atomicrmw.start
3408; CHECK-THUMB7-NEXT:    @ Parent Loop BB16_1 Depth=1
3409; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
3410; CHECK-THUMB7-NEXT:    ldrexh r0, [r3]
3411; CHECK-THUMB7-NEXT:    cmp r0, r1
3412; CHECK-THUMB7-NEXT:    bne .LBB16_4
3413; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
3414; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB16_2 Depth=2
3415; CHECK-THUMB7-NEXT:    strexh r2, r12, [r3]
3416; CHECK-THUMB7-NEXT:    cmp r2, #0
3417; CHECK-THUMB7-NEXT:    bne .LBB16_2
3418; CHECK-THUMB7-NEXT:  .LBB16_4: @ %atomicrmw.start
3419; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB16_1 Depth=1
3420; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
3421; CHECK-THUMB7-NEXT:    uxth r1, r1
3422; CHECK-THUMB7-NEXT:    subs r1, r0, r1
3423; CHECK-THUMB7-NEXT:    clz r1, r1
3424; CHECK-THUMB7-NEXT:    lsrs r1, r1, #5
3425; CHECK-THUMB7-NEXT:    cmp r1, #1
3426; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
3427; CHECK-THUMB7-NEXT:    bne .LBB16_1
3428; CHECK-THUMB7-NEXT:    b .LBB16_5
3429; CHECK-THUMB7-NEXT:  .LBB16_5: @ %atomicrmw.end
3430; CHECK-THUMB7-NEXT:    ldr r0, [sp] @ 4-byte Reload
3431; CHECK-THUMB7-NEXT:    add sp, #8
3432; CHECK-THUMB7-NEXT:    bx lr
3433;
3434; CHECK-THUMB6-LABEL: test_or_i16:
3435; CHECK-THUMB6:       @ %bb.0: @ %entry
3436; CHECK-THUMB6-NEXT:    .save {r7, lr}
3437; CHECK-THUMB6-NEXT:    push {r7, lr}
3438; CHECK-THUMB6-NEXT:    ldr r0, .LCPI16_0
3439; CHECK-THUMB6-NEXT:    movs r1, #1
3440; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_or_2
3441; CHECK-THUMB6-NEXT:    pop {r7, pc}
3442; CHECK-THUMB6-NEXT:    .p2align 2
3443; CHECK-THUMB6-NEXT:  @ %bb.1:
3444; CHECK-THUMB6-NEXT:  .LCPI16_0:
3445; CHECK-THUMB6-NEXT:    .long atomic_i16
3446;
3447; CHECK-THUMB8BASE-LABEL: test_or_i16:
3448; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
3449; CHECK-THUMB8BASE-NEXT:    .save {r4, lr}
3450; CHECK-THUMB8BASE-NEXT:    push {r4, lr}
3451; CHECK-THUMB8BASE-NEXT:    .pad #8
3452; CHECK-THUMB8BASE-NEXT:    sub sp, #8
3453; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i16
3454; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i16
3455; CHECK-THUMB8BASE-NEXT:    ldrh r0, [r0]
3456; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
3457; CHECK-THUMB8BASE-NEXT:    b .LBB16_1
3458; CHECK-THUMB8BASE-NEXT:  .LBB16_1: @ %atomicrmw.start
3459; CHECK-THUMB8BASE-NEXT:    @ =>This Loop Header: Depth=1
3460; CHECK-THUMB8BASE-NEXT:    @ Child Loop BB16_2 Depth 2
3461; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
3462; CHECK-THUMB8BASE-NEXT:    movs r0, #1
3463; CHECK-THUMB8BASE-NEXT:    mov r4, r1
3464; CHECK-THUMB8BASE-NEXT:    orrs r4, r0
3465; CHECK-THUMB8BASE-NEXT:    movw r3, :lower16:atomic_i16
3466; CHECK-THUMB8BASE-NEXT:    movt r3, :upper16:atomic_i16
3467; CHECK-THUMB8BASE-NEXT:    uxth r1, r1
3468; CHECK-THUMB8BASE-NEXT:  .LBB16_2: @ %atomicrmw.start
3469; CHECK-THUMB8BASE-NEXT:    @ Parent Loop BB16_1 Depth=1
3470; CHECK-THUMB8BASE-NEXT:    @ => This Inner Loop Header: Depth=2
3471; CHECK-THUMB8BASE-NEXT:    ldrexh r0, [r3]
3472; CHECK-THUMB8BASE-NEXT:    cmp r0, r1
3473; CHECK-THUMB8BASE-NEXT:    bne .LBB16_4
3474; CHECK-THUMB8BASE-NEXT:  @ %bb.3: @ %atomicrmw.start
3475; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB16_2 Depth=2
3476; CHECK-THUMB8BASE-NEXT:    strexh r2, r4, [r3]
3477; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
3478; CHECK-THUMB8BASE-NEXT:    bne .LBB16_2
3479; CHECK-THUMB8BASE-NEXT:  .LBB16_4: @ %atomicrmw.start
3480; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB16_1 Depth=1
3481; CHECK-THUMB8BASE-NEXT:    str r0, [sp] @ 4-byte Spill
3482; CHECK-THUMB8BASE-NEXT:    uxth r1, r1
3483; CHECK-THUMB8BASE-NEXT:    subs r1, r0, r1
3484; CHECK-THUMB8BASE-NEXT:    rsbs r2, r1, #0
3485; CHECK-THUMB8BASE-NEXT:    adcs r1, r2
3486; CHECK-THUMB8BASE-NEXT:    cmp r1, #1
3487; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
3488; CHECK-THUMB8BASE-NEXT:    bne .LBB16_1
3489; CHECK-THUMB8BASE-NEXT:    b .LBB16_5
3490; CHECK-THUMB8BASE-NEXT:  .LBB16_5: @ %atomicrmw.end
3491; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp] @ 4-byte Reload
3492; CHECK-THUMB8BASE-NEXT:    add sp, #8
3493; CHECK-THUMB8BASE-NEXT:    pop {r4, pc}
3494entry:
3495  %0 = atomicrmw or i16* @atomic_i16, i16 1 monotonic
3496  ret i16 %0
3497}
3498define i16 @test_xor_i16() {
3499; CHECK-ARM8-LABEL: test_xor_i16:
3500; CHECK-ARM8:       @ %bb.0: @ %entry
3501; CHECK-ARM8-NEXT:    .pad #8
3502; CHECK-ARM8-NEXT:    sub sp, sp, #8
3503; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i16
3504; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i16
3505; CHECK-ARM8-NEXT:    ldrh r0, [r0]
3506; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
3507; CHECK-ARM8-NEXT:    b .LBB17_1
3508; CHECK-ARM8-NEXT:  .LBB17_1: @ %atomicrmw.start
3509; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
3510; CHECK-ARM8-NEXT:    @ Child Loop BB17_2 Depth 2
3511; CHECK-ARM8-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
3512; CHECK-ARM8-NEXT:    eor r12, r1, #1
3513; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i16
3514; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i16
3515; CHECK-ARM8-NEXT:    uxth r1, r1
3516; CHECK-ARM8-NEXT:  .LBB17_2: @ %atomicrmw.start
3517; CHECK-ARM8-NEXT:    @ Parent Loop BB17_1 Depth=1
3518; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
3519; CHECK-ARM8-NEXT:    ldrexh r0, [r3]
3520; CHECK-ARM8-NEXT:    cmp r0, r1
3521; CHECK-ARM8-NEXT:    bne .LBB17_4
3522; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
3523; CHECK-ARM8-NEXT:    @ in Loop: Header=BB17_2 Depth=2
3524; CHECK-ARM8-NEXT:    strexh r2, r12, [r3]
3525; CHECK-ARM8-NEXT:    cmp r2, #0
3526; CHECK-ARM8-NEXT:    bne .LBB17_2
3527; CHECK-ARM8-NEXT:  .LBB17_4: @ %atomicrmw.start
3528; CHECK-ARM8-NEXT:    @ in Loop: Header=BB17_1 Depth=1
3529; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
3530; CHECK-ARM8-NEXT:    uxth r1, r1
3531; CHECK-ARM8-NEXT:    sub r1, r0, r1
3532; CHECK-ARM8-NEXT:    clz r1, r1
3533; CHECK-ARM8-NEXT:    lsr r1, r1, #5
3534; CHECK-ARM8-NEXT:    cmp r1, #1
3535; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
3536; CHECK-ARM8-NEXT:    bne .LBB17_1
3537; CHECK-ARM8-NEXT:    b .LBB17_5
3538; CHECK-ARM8-NEXT:  .LBB17_5: @ %atomicrmw.end
3539; CHECK-ARM8-NEXT:    ldr r0, [sp] @ 4-byte Reload
3540; CHECK-ARM8-NEXT:    add sp, sp, #8
3541; CHECK-ARM8-NEXT:    bx lr
3542;
3543; CHECK-ARM6-LABEL: test_xor_i16:
3544; CHECK-ARM6:       @ %bb.0: @ %entry
3545; CHECK-ARM6-NEXT:    .pad #8
3546; CHECK-ARM6-NEXT:    sub sp, sp, #8
3547; CHECK-ARM6-NEXT:    ldr r0, .LCPI17_0
3548; CHECK-ARM6-NEXT:    ldrh r0, [r0]
3549; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
3550; CHECK-ARM6-NEXT:    b .LBB17_1
3551; CHECK-ARM6-NEXT:  .LBB17_1: @ %atomicrmw.start
3552; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
3553; CHECK-ARM6-NEXT:    @ Child Loop BB17_2 Depth 2
3554; CHECK-ARM6-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
3555; CHECK-ARM6-NEXT:    eor r12, r1, #1
3556; CHECK-ARM6-NEXT:    ldr r3, .LCPI17_0
3557; CHECK-ARM6-NEXT:    uxth r1, r1
3558; CHECK-ARM6-NEXT:  .LBB17_2: @ %atomicrmw.start
3559; CHECK-ARM6-NEXT:    @ Parent Loop BB17_1 Depth=1
3560; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
3561; CHECK-ARM6-NEXT:    ldrexh r0, [r3]
3562; CHECK-ARM6-NEXT:    cmp r0, r1
3563; CHECK-ARM6-NEXT:    bne .LBB17_4
3564; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
3565; CHECK-ARM6-NEXT:    @ in Loop: Header=BB17_2 Depth=2
3566; CHECK-ARM6-NEXT:    strexh r2, r12, [r3]
3567; CHECK-ARM6-NEXT:    cmp r2, #0
3568; CHECK-ARM6-NEXT:    bne .LBB17_2
3569; CHECK-ARM6-NEXT:  .LBB17_4: @ %atomicrmw.start
3570; CHECK-ARM6-NEXT:    @ in Loop: Header=BB17_1 Depth=1
3571; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
3572; CHECK-ARM6-NEXT:    uxth r1, r1
3573; CHECK-ARM6-NEXT:    sub r1, r0, r1
3574; CHECK-ARM6-NEXT:    clz r1, r1
3575; CHECK-ARM6-NEXT:    lsr r1, r1, #5
3576; CHECK-ARM6-NEXT:    cmp r1, #1
3577; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
3578; CHECK-ARM6-NEXT:    bne .LBB17_1
3579; CHECK-ARM6-NEXT:    b .LBB17_5
3580; CHECK-ARM6-NEXT:  .LBB17_5: @ %atomicrmw.end
3581; CHECK-ARM6-NEXT:    ldr r0, [sp] @ 4-byte Reload
3582; CHECK-ARM6-NEXT:    add sp, sp, #8
3583; CHECK-ARM6-NEXT:    bx lr
3584; CHECK-ARM6-NEXT:    .p2align 2
3585; CHECK-ARM6-NEXT:  @ %bb.6:
3586; CHECK-ARM6-NEXT:  .LCPI17_0:
3587; CHECK-ARM6-NEXT:    .long atomic_i16
3588;
3589; CHECK-THUMB7-LABEL: test_xor_i16:
3590; CHECK-THUMB7:       @ %bb.0: @ %entry
3591; CHECK-THUMB7-NEXT:    .pad #8
3592; CHECK-THUMB7-NEXT:    sub sp, #8
3593; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i16
3594; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i16
3595; CHECK-THUMB7-NEXT:    ldrh r0, [r0]
3596; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
3597; CHECK-THUMB7-NEXT:    b .LBB17_1
3598; CHECK-THUMB7-NEXT:  .LBB17_1: @ %atomicrmw.start
3599; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
3600; CHECK-THUMB7-NEXT:    @ Child Loop BB17_2 Depth 2
3601; CHECK-THUMB7-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
3602; CHECK-THUMB7-NEXT:    eor r12, r1, #1
3603; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i16
3604; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i16
3605; CHECK-THUMB7-NEXT:    uxth r1, r1
3606; CHECK-THUMB7-NEXT:  .LBB17_2: @ %atomicrmw.start
3607; CHECK-THUMB7-NEXT:    @ Parent Loop BB17_1 Depth=1
3608; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
3609; CHECK-THUMB7-NEXT:    ldrexh r0, [r3]
3610; CHECK-THUMB7-NEXT:    cmp r0, r1
3611; CHECK-THUMB7-NEXT:    bne .LBB17_4
3612; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
3613; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB17_2 Depth=2
3614; CHECK-THUMB7-NEXT:    strexh r2, r12, [r3]
3615; CHECK-THUMB7-NEXT:    cmp r2, #0
3616; CHECK-THUMB7-NEXT:    bne .LBB17_2
3617; CHECK-THUMB7-NEXT:  .LBB17_4: @ %atomicrmw.start
3618; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB17_1 Depth=1
3619; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
3620; CHECK-THUMB7-NEXT:    uxth r1, r1
3621; CHECK-THUMB7-NEXT:    subs r1, r0, r1
3622; CHECK-THUMB7-NEXT:    clz r1, r1
3623; CHECK-THUMB7-NEXT:    lsrs r1, r1, #5
3624; CHECK-THUMB7-NEXT:    cmp r1, #1
3625; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
3626; CHECK-THUMB7-NEXT:    bne .LBB17_1
3627; CHECK-THUMB7-NEXT:    b .LBB17_5
3628; CHECK-THUMB7-NEXT:  .LBB17_5: @ %atomicrmw.end
3629; CHECK-THUMB7-NEXT:    ldr r0, [sp] @ 4-byte Reload
3630; CHECK-THUMB7-NEXT:    add sp, #8
3631; CHECK-THUMB7-NEXT:    bx lr
3632;
3633; CHECK-THUMB6-LABEL: test_xor_i16:
3634; CHECK-THUMB6:       @ %bb.0: @ %entry
3635; CHECK-THUMB6-NEXT:    .save {r7, lr}
3636; CHECK-THUMB6-NEXT:    push {r7, lr}
3637; CHECK-THUMB6-NEXT:    ldr r0, .LCPI17_0
3638; CHECK-THUMB6-NEXT:    movs r1, #1
3639; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_xor_2
3640; CHECK-THUMB6-NEXT:    pop {r7, pc}
3641; CHECK-THUMB6-NEXT:    .p2align 2
3642; CHECK-THUMB6-NEXT:  @ %bb.1:
3643; CHECK-THUMB6-NEXT:  .LCPI17_0:
3644; CHECK-THUMB6-NEXT:    .long atomic_i16
3645;
3646; CHECK-THUMB8BASE-LABEL: test_xor_i16:
3647; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
3648; CHECK-THUMB8BASE-NEXT:    .save {r4, lr}
3649; CHECK-THUMB8BASE-NEXT:    push {r4, lr}
3650; CHECK-THUMB8BASE-NEXT:    .pad #8
3651; CHECK-THUMB8BASE-NEXT:    sub sp, #8
3652; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i16
3653; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i16
3654; CHECK-THUMB8BASE-NEXT:    ldrh r0, [r0]
3655; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
3656; CHECK-THUMB8BASE-NEXT:    b .LBB17_1
3657; CHECK-THUMB8BASE-NEXT:  .LBB17_1: @ %atomicrmw.start
3658; CHECK-THUMB8BASE-NEXT:    @ =>This Loop Header: Depth=1
3659; CHECK-THUMB8BASE-NEXT:    @ Child Loop BB17_2 Depth 2
3660; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
3661; CHECK-THUMB8BASE-NEXT:    movs r0, #1
3662; CHECK-THUMB8BASE-NEXT:    mov r4, r1
3663; CHECK-THUMB8BASE-NEXT:    eors r4, r0
3664; CHECK-THUMB8BASE-NEXT:    movw r3, :lower16:atomic_i16
3665; CHECK-THUMB8BASE-NEXT:    movt r3, :upper16:atomic_i16
3666; CHECK-THUMB8BASE-NEXT:    uxth r1, r1
3667; CHECK-THUMB8BASE-NEXT:  .LBB17_2: @ %atomicrmw.start
3668; CHECK-THUMB8BASE-NEXT:    @ Parent Loop BB17_1 Depth=1
3669; CHECK-THUMB8BASE-NEXT:    @ => This Inner Loop Header: Depth=2
3670; CHECK-THUMB8BASE-NEXT:    ldrexh r0, [r3]
3671; CHECK-THUMB8BASE-NEXT:    cmp r0, r1
3672; CHECK-THUMB8BASE-NEXT:    bne .LBB17_4
3673; CHECK-THUMB8BASE-NEXT:  @ %bb.3: @ %atomicrmw.start
3674; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB17_2 Depth=2
3675; CHECK-THUMB8BASE-NEXT:    strexh r2, r4, [r3]
3676; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
3677; CHECK-THUMB8BASE-NEXT:    bne .LBB17_2
3678; CHECK-THUMB8BASE-NEXT:  .LBB17_4: @ %atomicrmw.start
3679; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB17_1 Depth=1
3680; CHECK-THUMB8BASE-NEXT:    str r0, [sp] @ 4-byte Spill
3681; CHECK-THUMB8BASE-NEXT:    uxth r1, r1
3682; CHECK-THUMB8BASE-NEXT:    subs r1, r0, r1
3683; CHECK-THUMB8BASE-NEXT:    rsbs r2, r1, #0
3684; CHECK-THUMB8BASE-NEXT:    adcs r1, r2
3685; CHECK-THUMB8BASE-NEXT:    cmp r1, #1
3686; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
3687; CHECK-THUMB8BASE-NEXT:    bne .LBB17_1
3688; CHECK-THUMB8BASE-NEXT:    b .LBB17_5
3689; CHECK-THUMB8BASE-NEXT:  .LBB17_5: @ %atomicrmw.end
3690; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp] @ 4-byte Reload
3691; CHECK-THUMB8BASE-NEXT:    add sp, #8
3692; CHECK-THUMB8BASE-NEXT:    pop {r4, pc}
3693entry:
3694  %0 = atomicrmw xor i16* @atomic_i16, i16 1 monotonic
3695  ret i16 %0
3696}
3697define i16 @test_max_i16() {
3698; CHECK-ARM8-LABEL: test_max_i16:
3699; CHECK-ARM8:       @ %bb.0: @ %entry
3700; CHECK-ARM8-NEXT:    .pad #8
3701; CHECK-ARM8-NEXT:    sub sp, sp, #8
3702; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i16
3703; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i16
3704; CHECK-ARM8-NEXT:    ldrh r0, [r0]
3705; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
3706; CHECK-ARM8-NEXT:    b .LBB18_1
3707; CHECK-ARM8-NEXT:  .LBB18_1: @ %atomicrmw.start
3708; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
3709; CHECK-ARM8-NEXT:    @ Child Loop BB18_2 Depth 2
3710; CHECK-ARM8-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
3711; CHECK-ARM8-NEXT:    sxth r0, r1
3712; CHECK-ARM8-NEXT:    mov r12, #1
3713; CHECK-ARM8-NEXT:    cmp r0, #1
3714; CHECK-ARM8-NEXT:    movgt r12, r1
3715; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i16
3716; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i16
3717; CHECK-ARM8-NEXT:    uxth r1, r1
3718; CHECK-ARM8-NEXT:  .LBB18_2: @ %atomicrmw.start
3719; CHECK-ARM8-NEXT:    @ Parent Loop BB18_1 Depth=1
3720; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
3721; CHECK-ARM8-NEXT:    ldrexh r0, [r3]
3722; CHECK-ARM8-NEXT:    cmp r0, r1
3723; CHECK-ARM8-NEXT:    bne .LBB18_4
3724; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
3725; CHECK-ARM8-NEXT:    @ in Loop: Header=BB18_2 Depth=2
3726; CHECK-ARM8-NEXT:    strexh r2, r12, [r3]
3727; CHECK-ARM8-NEXT:    cmp r2, #0
3728; CHECK-ARM8-NEXT:    bne .LBB18_2
3729; CHECK-ARM8-NEXT:  .LBB18_4: @ %atomicrmw.start
3730; CHECK-ARM8-NEXT:    @ in Loop: Header=BB18_1 Depth=1
3731; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
3732; CHECK-ARM8-NEXT:    uxth r1, r1
3733; CHECK-ARM8-NEXT:    sub r1, r0, r1
3734; CHECK-ARM8-NEXT:    clz r1, r1
3735; CHECK-ARM8-NEXT:    lsr r1, r1, #5
3736; CHECK-ARM8-NEXT:    cmp r1, #1
3737; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
3738; CHECK-ARM8-NEXT:    bne .LBB18_1
3739; CHECK-ARM8-NEXT:    b .LBB18_5
3740; CHECK-ARM8-NEXT:  .LBB18_5: @ %atomicrmw.end
3741; CHECK-ARM8-NEXT:    ldr r0, [sp] @ 4-byte Reload
3742; CHECK-ARM8-NEXT:    add sp, sp, #8
3743; CHECK-ARM8-NEXT:    bx lr
3744;
3745; CHECK-ARM6-LABEL: test_max_i16:
3746; CHECK-ARM6:       @ %bb.0: @ %entry
3747; CHECK-ARM6-NEXT:    .pad #8
3748; CHECK-ARM6-NEXT:    sub sp, sp, #8
3749; CHECK-ARM6-NEXT:    ldr r0, .LCPI18_0
3750; CHECK-ARM6-NEXT:    ldrh r0, [r0]
3751; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
3752; CHECK-ARM6-NEXT:    b .LBB18_1
3753; CHECK-ARM6-NEXT:  .LBB18_1: @ %atomicrmw.start
3754; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
3755; CHECK-ARM6-NEXT:    @ Child Loop BB18_2 Depth 2
3756; CHECK-ARM6-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
3757; CHECK-ARM6-NEXT:    sxth r0, r1
3758; CHECK-ARM6-NEXT:    mov r12, #1
3759; CHECK-ARM6-NEXT:    cmp r0, #1
3760; CHECK-ARM6-NEXT:    movgt r12, r1
3761; CHECK-ARM6-NEXT:    ldr r3, .LCPI18_0
3762; CHECK-ARM6-NEXT:    uxth r1, r1
3763; CHECK-ARM6-NEXT:  .LBB18_2: @ %atomicrmw.start
3764; CHECK-ARM6-NEXT:    @ Parent Loop BB18_1 Depth=1
3765; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
3766; CHECK-ARM6-NEXT:    ldrexh r0, [r3]
3767; CHECK-ARM6-NEXT:    cmp r0, r1
3768; CHECK-ARM6-NEXT:    bne .LBB18_4
3769; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
3770; CHECK-ARM6-NEXT:    @ in Loop: Header=BB18_2 Depth=2
3771; CHECK-ARM6-NEXT:    strexh r2, r12, [r3]
3772; CHECK-ARM6-NEXT:    cmp r2, #0
3773; CHECK-ARM6-NEXT:    bne .LBB18_2
3774; CHECK-ARM6-NEXT:  .LBB18_4: @ %atomicrmw.start
3775; CHECK-ARM6-NEXT:    @ in Loop: Header=BB18_1 Depth=1
3776; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
3777; CHECK-ARM6-NEXT:    uxth r1, r1
3778; CHECK-ARM6-NEXT:    sub r1, r0, r1
3779; CHECK-ARM6-NEXT:    clz r1, r1
3780; CHECK-ARM6-NEXT:    lsr r1, r1, #5
3781; CHECK-ARM6-NEXT:    cmp r1, #1
3782; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
3783; CHECK-ARM6-NEXT:    bne .LBB18_1
3784; CHECK-ARM6-NEXT:    b .LBB18_5
3785; CHECK-ARM6-NEXT:  .LBB18_5: @ %atomicrmw.end
3786; CHECK-ARM6-NEXT:    ldr r0, [sp] @ 4-byte Reload
3787; CHECK-ARM6-NEXT:    add sp, sp, #8
3788; CHECK-ARM6-NEXT:    bx lr
3789; CHECK-ARM6-NEXT:    .p2align 2
3790; CHECK-ARM6-NEXT:  @ %bb.6:
3791; CHECK-ARM6-NEXT:  .LCPI18_0:
3792; CHECK-ARM6-NEXT:    .long atomic_i16
3793;
3794; CHECK-THUMB7-LABEL: test_max_i16:
3795; CHECK-THUMB7:       @ %bb.0: @ %entry
3796; CHECK-THUMB7-NEXT:    .pad #8
3797; CHECK-THUMB7-NEXT:    sub sp, #8
3798; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i16
3799; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i16
3800; CHECK-THUMB7-NEXT:    ldrh r0, [r0]
3801; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
3802; CHECK-THUMB7-NEXT:    b .LBB18_1
3803; CHECK-THUMB7-NEXT:  .LBB18_1: @ %atomicrmw.start
3804; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
3805; CHECK-THUMB7-NEXT:    @ Child Loop BB18_2 Depth 2
3806; CHECK-THUMB7-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
3807; CHECK-THUMB7-NEXT:    sxth r0, r1
3808; CHECK-THUMB7-NEXT:    mov.w r12, #1
3809; CHECK-THUMB7-NEXT:    cmp r0, #1
3810; CHECK-THUMB7-NEXT:    it gt
3811; CHECK-THUMB7-NEXT:    movgt r12, r1
3812; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i16
3813; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i16
3814; CHECK-THUMB7-NEXT:    uxth r1, r1
3815; CHECK-THUMB7-NEXT:  .LBB18_2: @ %atomicrmw.start
3816; CHECK-THUMB7-NEXT:    @ Parent Loop BB18_1 Depth=1
3817; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
3818; CHECK-THUMB7-NEXT:    ldrexh r0, [r3]
3819; CHECK-THUMB7-NEXT:    cmp r0, r1
3820; CHECK-THUMB7-NEXT:    bne .LBB18_4
3821; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
3822; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB18_2 Depth=2
3823; CHECK-THUMB7-NEXT:    strexh r2, r12, [r3]
3824; CHECK-THUMB7-NEXT:    cmp r2, #0
3825; CHECK-THUMB7-NEXT:    bne .LBB18_2
3826; CHECK-THUMB7-NEXT:  .LBB18_4: @ %atomicrmw.start
3827; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB18_1 Depth=1
3828; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
3829; CHECK-THUMB7-NEXT:    uxth r1, r1
3830; CHECK-THUMB7-NEXT:    subs r1, r0, r1
3831; CHECK-THUMB7-NEXT:    clz r1, r1
3832; CHECK-THUMB7-NEXT:    lsrs r1, r1, #5
3833; CHECK-THUMB7-NEXT:    cmp r1, #1
3834; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
3835; CHECK-THUMB7-NEXT:    bne .LBB18_1
3836; CHECK-THUMB7-NEXT:    b .LBB18_5
3837; CHECK-THUMB7-NEXT:  .LBB18_5: @ %atomicrmw.end
3838; CHECK-THUMB7-NEXT:    ldr r0, [sp] @ 4-byte Reload
3839; CHECK-THUMB7-NEXT:    add sp, #8
3840; CHECK-THUMB7-NEXT:    bx lr
3841;
3842; CHECK-THUMB6-LABEL: test_max_i16:
3843; CHECK-THUMB6:       @ %bb.0: @ %entry
3844; CHECK-THUMB6-NEXT:    .save {r7, lr}
3845; CHECK-THUMB6-NEXT:    push {r7, lr}
3846; CHECK-THUMB6-NEXT:    ldr r0, .LCPI18_0
3847; CHECK-THUMB6-NEXT:    movs r1, #1
3848; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_max_2
3849; CHECK-THUMB6-NEXT:    pop {r7, pc}
3850; CHECK-THUMB6-NEXT:    .p2align 2
3851; CHECK-THUMB6-NEXT:  @ %bb.1:
3852; CHECK-THUMB6-NEXT:  .LCPI18_0:
3853; CHECK-THUMB6-NEXT:    .long atomic_i16
3854;
3855; CHECK-THUMB8BASE-LABEL: test_max_i16:
3856; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
3857; CHECK-THUMB8BASE-NEXT:    .save {r4, lr}
3858; CHECK-THUMB8BASE-NEXT:    push {r4, lr}
3859; CHECK-THUMB8BASE-NEXT:    .pad #20
3860; CHECK-THUMB8BASE-NEXT:    sub sp, #20
3861; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i16
3862; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i16
3863; CHECK-THUMB8BASE-NEXT:    ldrh r0, [r0]
3864; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #16] @ 4-byte Spill
3865; CHECK-THUMB8BASE-NEXT:    b .LBB18_1
3866; CHECK-THUMB8BASE-NEXT:  .LBB18_1: @ %atomicrmw.start
3867; CHECK-THUMB8BASE-NEXT:    @ =>This Loop Header: Depth=1
3868; CHECK-THUMB8BASE-NEXT:    @ Child Loop BB18_4 Depth 2
3869; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #16] @ 4-byte Reload
3870; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
3871; CHECK-THUMB8BASE-NEXT:    sxth r1, r0
3872; CHECK-THUMB8BASE-NEXT:    movs r2, #1
3873; CHECK-THUMB8BASE-NEXT:    str r2, [sp, #8] @ 4-byte Spill
3874; CHECK-THUMB8BASE-NEXT:    cmp r1, #1
3875; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #12] @ 4-byte Spill
3876; CHECK-THUMB8BASE-NEXT:    bgt .LBB18_3
3877; CHECK-THUMB8BASE-NEXT:  @ %bb.2: @ %atomicrmw.start
3878; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB18_1 Depth=1
3879; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #8] @ 4-byte Reload
3880; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #12] @ 4-byte Spill
3881; CHECK-THUMB8BASE-NEXT:  .LBB18_3: @ %atomicrmw.start
3882; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB18_1 Depth=1
3883; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
3884; CHECK-THUMB8BASE-NEXT:    ldr r4, [sp, #12] @ 4-byte Reload
3885; CHECK-THUMB8BASE-NEXT:    movw r3, :lower16:atomic_i16
3886; CHECK-THUMB8BASE-NEXT:    movt r3, :upper16:atomic_i16
3887; CHECK-THUMB8BASE-NEXT:    uxth r1, r1
3888; CHECK-THUMB8BASE-NEXT:  .LBB18_4: @ %atomicrmw.start
3889; CHECK-THUMB8BASE-NEXT:    @ Parent Loop BB18_1 Depth=1
3890; CHECK-THUMB8BASE-NEXT:    @ => This Inner Loop Header: Depth=2
3891; CHECK-THUMB8BASE-NEXT:    ldrexh r0, [r3]
3892; CHECK-THUMB8BASE-NEXT:    cmp r0, r1
3893; CHECK-THUMB8BASE-NEXT:    bne .LBB18_6
3894; CHECK-THUMB8BASE-NEXT:  @ %bb.5: @ %atomicrmw.start
3895; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB18_4 Depth=2
3896; CHECK-THUMB8BASE-NEXT:    strexh r2, r4, [r3]
3897; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
3898; CHECK-THUMB8BASE-NEXT:    bne .LBB18_4
3899; CHECK-THUMB8BASE-NEXT:  .LBB18_6: @ %atomicrmw.start
3900; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB18_1 Depth=1
3901; CHECK-THUMB8BASE-NEXT:    str r0, [sp] @ 4-byte Spill
3902; CHECK-THUMB8BASE-NEXT:    uxth r1, r1
3903; CHECK-THUMB8BASE-NEXT:    subs r1, r0, r1
3904; CHECK-THUMB8BASE-NEXT:    rsbs r2, r1, #0
3905; CHECK-THUMB8BASE-NEXT:    adcs r1, r2
3906; CHECK-THUMB8BASE-NEXT:    cmp r1, #1
3907; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #16] @ 4-byte Spill
3908; CHECK-THUMB8BASE-NEXT:    bne .LBB18_1
3909; CHECK-THUMB8BASE-NEXT:    b .LBB18_7
3910; CHECK-THUMB8BASE-NEXT:  .LBB18_7: @ %atomicrmw.end
3911; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp] @ 4-byte Reload
3912; CHECK-THUMB8BASE-NEXT:    add sp, #20
3913; CHECK-THUMB8BASE-NEXT:    pop {r4, pc}
3914entry:
3915  %0 = atomicrmw max i16* @atomic_i16, i16 1 monotonic
3916  ret i16 %0
3917}
3918define i16 @test_min_i16() {
3919; CHECK-ARM8-LABEL: test_min_i16:
3920; CHECK-ARM8:       @ %bb.0: @ %entry
3921; CHECK-ARM8-NEXT:    .pad #8
3922; CHECK-ARM8-NEXT:    sub sp, sp, #8
3923; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i16
3924; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i16
3925; CHECK-ARM8-NEXT:    ldrh r0, [r0]
3926; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
3927; CHECK-ARM8-NEXT:    b .LBB19_1
3928; CHECK-ARM8-NEXT:  .LBB19_1: @ %atomicrmw.start
3929; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
3930; CHECK-ARM8-NEXT:    @ Child Loop BB19_2 Depth 2
3931; CHECK-ARM8-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
3932; CHECK-ARM8-NEXT:    sxth r0, r1
3933; CHECK-ARM8-NEXT:    mov r12, #1
3934; CHECK-ARM8-NEXT:    cmp r0, #2
3935; CHECK-ARM8-NEXT:    movlt r12, r1
3936; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i16
3937; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i16
3938; CHECK-ARM8-NEXT:    uxth r1, r1
3939; CHECK-ARM8-NEXT:  .LBB19_2: @ %atomicrmw.start
3940; CHECK-ARM8-NEXT:    @ Parent Loop BB19_1 Depth=1
3941; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
3942; CHECK-ARM8-NEXT:    ldrexh r0, [r3]
3943; CHECK-ARM8-NEXT:    cmp r0, r1
3944; CHECK-ARM8-NEXT:    bne .LBB19_4
3945; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
3946; CHECK-ARM8-NEXT:    @ in Loop: Header=BB19_2 Depth=2
3947; CHECK-ARM8-NEXT:    strexh r2, r12, [r3]
3948; CHECK-ARM8-NEXT:    cmp r2, #0
3949; CHECK-ARM8-NEXT:    bne .LBB19_2
3950; CHECK-ARM8-NEXT:  .LBB19_4: @ %atomicrmw.start
3951; CHECK-ARM8-NEXT:    @ in Loop: Header=BB19_1 Depth=1
3952; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
3953; CHECK-ARM8-NEXT:    uxth r1, r1
3954; CHECK-ARM8-NEXT:    sub r1, r0, r1
3955; CHECK-ARM8-NEXT:    clz r1, r1
3956; CHECK-ARM8-NEXT:    lsr r1, r1, #5
3957; CHECK-ARM8-NEXT:    cmp r1, #1
3958; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
3959; CHECK-ARM8-NEXT:    bne .LBB19_1
3960; CHECK-ARM8-NEXT:    b .LBB19_5
3961; CHECK-ARM8-NEXT:  .LBB19_5: @ %atomicrmw.end
3962; CHECK-ARM8-NEXT:    ldr r0, [sp] @ 4-byte Reload
3963; CHECK-ARM8-NEXT:    add sp, sp, #8
3964; CHECK-ARM8-NEXT:    bx lr
3965;
3966; CHECK-ARM6-LABEL: test_min_i16:
3967; CHECK-ARM6:       @ %bb.0: @ %entry
3968; CHECK-ARM6-NEXT:    .pad #8
3969; CHECK-ARM6-NEXT:    sub sp, sp, #8
3970; CHECK-ARM6-NEXT:    ldr r0, .LCPI19_0
3971; CHECK-ARM6-NEXT:    ldrh r0, [r0]
3972; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
3973; CHECK-ARM6-NEXT:    b .LBB19_1
3974; CHECK-ARM6-NEXT:  .LBB19_1: @ %atomicrmw.start
3975; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
3976; CHECK-ARM6-NEXT:    @ Child Loop BB19_2 Depth 2
3977; CHECK-ARM6-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
3978; CHECK-ARM6-NEXT:    sxth r0, r1
3979; CHECK-ARM6-NEXT:    mov r12, #1
3980; CHECK-ARM6-NEXT:    cmp r0, #2
3981; CHECK-ARM6-NEXT:    movlt r12, r1
3982; CHECK-ARM6-NEXT:    ldr r3, .LCPI19_0
3983; CHECK-ARM6-NEXT:    uxth r1, r1
3984; CHECK-ARM6-NEXT:  .LBB19_2: @ %atomicrmw.start
3985; CHECK-ARM6-NEXT:    @ Parent Loop BB19_1 Depth=1
3986; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
3987; CHECK-ARM6-NEXT:    ldrexh r0, [r3]
3988; CHECK-ARM6-NEXT:    cmp r0, r1
3989; CHECK-ARM6-NEXT:    bne .LBB19_4
3990; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
3991; CHECK-ARM6-NEXT:    @ in Loop: Header=BB19_2 Depth=2
3992; CHECK-ARM6-NEXT:    strexh r2, r12, [r3]
3993; CHECK-ARM6-NEXT:    cmp r2, #0
3994; CHECK-ARM6-NEXT:    bne .LBB19_2
3995; CHECK-ARM6-NEXT:  .LBB19_4: @ %atomicrmw.start
3996; CHECK-ARM6-NEXT:    @ in Loop: Header=BB19_1 Depth=1
3997; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
3998; CHECK-ARM6-NEXT:    uxth r1, r1
3999; CHECK-ARM6-NEXT:    sub r1, r0, r1
4000; CHECK-ARM6-NEXT:    clz r1, r1
4001; CHECK-ARM6-NEXT:    lsr r1, r1, #5
4002; CHECK-ARM6-NEXT:    cmp r1, #1
4003; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
4004; CHECK-ARM6-NEXT:    bne .LBB19_1
4005; CHECK-ARM6-NEXT:    b .LBB19_5
4006; CHECK-ARM6-NEXT:  .LBB19_5: @ %atomicrmw.end
4007; CHECK-ARM6-NEXT:    ldr r0, [sp] @ 4-byte Reload
4008; CHECK-ARM6-NEXT:    add sp, sp, #8
4009; CHECK-ARM6-NEXT:    bx lr
4010; CHECK-ARM6-NEXT:    .p2align 2
4011; CHECK-ARM6-NEXT:  @ %bb.6:
4012; CHECK-ARM6-NEXT:  .LCPI19_0:
4013; CHECK-ARM6-NEXT:    .long atomic_i16
4014;
4015; CHECK-THUMB7-LABEL: test_min_i16:
4016; CHECK-THUMB7:       @ %bb.0: @ %entry
4017; CHECK-THUMB7-NEXT:    .pad #8
4018; CHECK-THUMB7-NEXT:    sub sp, #8
4019; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i16
4020; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i16
4021; CHECK-THUMB7-NEXT:    ldrh r0, [r0]
4022; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
4023; CHECK-THUMB7-NEXT:    b .LBB19_1
4024; CHECK-THUMB7-NEXT:  .LBB19_1: @ %atomicrmw.start
4025; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
4026; CHECK-THUMB7-NEXT:    @ Child Loop BB19_2 Depth 2
4027; CHECK-THUMB7-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
4028; CHECK-THUMB7-NEXT:    sxth r0, r1
4029; CHECK-THUMB7-NEXT:    mov.w r12, #1
4030; CHECK-THUMB7-NEXT:    cmp r0, #2
4031; CHECK-THUMB7-NEXT:    it lt
4032; CHECK-THUMB7-NEXT:    movlt r12, r1
4033; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i16
4034; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i16
4035; CHECK-THUMB7-NEXT:    uxth r1, r1
4036; CHECK-THUMB7-NEXT:  .LBB19_2: @ %atomicrmw.start
4037; CHECK-THUMB7-NEXT:    @ Parent Loop BB19_1 Depth=1
4038; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
4039; CHECK-THUMB7-NEXT:    ldrexh r0, [r3]
4040; CHECK-THUMB7-NEXT:    cmp r0, r1
4041; CHECK-THUMB7-NEXT:    bne .LBB19_4
4042; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
4043; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB19_2 Depth=2
4044; CHECK-THUMB7-NEXT:    strexh r2, r12, [r3]
4045; CHECK-THUMB7-NEXT:    cmp r2, #0
4046; CHECK-THUMB7-NEXT:    bne .LBB19_2
4047; CHECK-THUMB7-NEXT:  .LBB19_4: @ %atomicrmw.start
4048; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB19_1 Depth=1
4049; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
4050; CHECK-THUMB7-NEXT:    uxth r1, r1
4051; CHECK-THUMB7-NEXT:    subs r1, r0, r1
4052; CHECK-THUMB7-NEXT:    clz r1, r1
4053; CHECK-THUMB7-NEXT:    lsrs r1, r1, #5
4054; CHECK-THUMB7-NEXT:    cmp r1, #1
4055; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
4056; CHECK-THUMB7-NEXT:    bne .LBB19_1
4057; CHECK-THUMB7-NEXT:    b .LBB19_5
4058; CHECK-THUMB7-NEXT:  .LBB19_5: @ %atomicrmw.end
4059; CHECK-THUMB7-NEXT:    ldr r0, [sp] @ 4-byte Reload
4060; CHECK-THUMB7-NEXT:    add sp, #8
4061; CHECK-THUMB7-NEXT:    bx lr
4062;
4063; CHECK-THUMB6-LABEL: test_min_i16:
4064; CHECK-THUMB6:       @ %bb.0: @ %entry
4065; CHECK-THUMB6-NEXT:    .save {r7, lr}
4066; CHECK-THUMB6-NEXT:    push {r7, lr}
4067; CHECK-THUMB6-NEXT:    ldr r0, .LCPI19_0
4068; CHECK-THUMB6-NEXT:    movs r1, #1
4069; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_min_2
4070; CHECK-THUMB6-NEXT:    pop {r7, pc}
4071; CHECK-THUMB6-NEXT:    .p2align 2
4072; CHECK-THUMB6-NEXT:  @ %bb.1:
4073; CHECK-THUMB6-NEXT:  .LCPI19_0:
4074; CHECK-THUMB6-NEXT:    .long atomic_i16
4075;
4076; CHECK-THUMB8BASE-LABEL: test_min_i16:
4077; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
4078; CHECK-THUMB8BASE-NEXT:    .save {r4, lr}
4079; CHECK-THUMB8BASE-NEXT:    push {r4, lr}
4080; CHECK-THUMB8BASE-NEXT:    .pad #20
4081; CHECK-THUMB8BASE-NEXT:    sub sp, #20
4082; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i16
4083; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i16
4084; CHECK-THUMB8BASE-NEXT:    ldrh r0, [r0]
4085; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #16] @ 4-byte Spill
4086; CHECK-THUMB8BASE-NEXT:    b .LBB19_1
4087; CHECK-THUMB8BASE-NEXT:  .LBB19_1: @ %atomicrmw.start
4088; CHECK-THUMB8BASE-NEXT:    @ =>This Loop Header: Depth=1
4089; CHECK-THUMB8BASE-NEXT:    @ Child Loop BB19_4 Depth 2
4090; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #16] @ 4-byte Reload
4091; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
4092; CHECK-THUMB8BASE-NEXT:    sxth r1, r0
4093; CHECK-THUMB8BASE-NEXT:    movs r2, #1
4094; CHECK-THUMB8BASE-NEXT:    str r2, [sp, #8] @ 4-byte Spill
4095; CHECK-THUMB8BASE-NEXT:    cmp r1, #2
4096; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #12] @ 4-byte Spill
4097; CHECK-THUMB8BASE-NEXT:    blt .LBB19_3
4098; CHECK-THUMB8BASE-NEXT:  @ %bb.2: @ %atomicrmw.start
4099; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB19_1 Depth=1
4100; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #8] @ 4-byte Reload
4101; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #12] @ 4-byte Spill
4102; CHECK-THUMB8BASE-NEXT:  .LBB19_3: @ %atomicrmw.start
4103; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB19_1 Depth=1
4104; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
4105; CHECK-THUMB8BASE-NEXT:    ldr r4, [sp, #12] @ 4-byte Reload
4106; CHECK-THUMB8BASE-NEXT:    movw r3, :lower16:atomic_i16
4107; CHECK-THUMB8BASE-NEXT:    movt r3, :upper16:atomic_i16
4108; CHECK-THUMB8BASE-NEXT:    uxth r1, r1
4109; CHECK-THUMB8BASE-NEXT:  .LBB19_4: @ %atomicrmw.start
4110; CHECK-THUMB8BASE-NEXT:    @ Parent Loop BB19_1 Depth=1
4111; CHECK-THUMB8BASE-NEXT:    @ => This Inner Loop Header: Depth=2
4112; CHECK-THUMB8BASE-NEXT:    ldrexh r0, [r3]
4113; CHECK-THUMB8BASE-NEXT:    cmp r0, r1
4114; CHECK-THUMB8BASE-NEXT:    bne .LBB19_6
4115; CHECK-THUMB8BASE-NEXT:  @ %bb.5: @ %atomicrmw.start
4116; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB19_4 Depth=2
4117; CHECK-THUMB8BASE-NEXT:    strexh r2, r4, [r3]
4118; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
4119; CHECK-THUMB8BASE-NEXT:    bne .LBB19_4
4120; CHECK-THUMB8BASE-NEXT:  .LBB19_6: @ %atomicrmw.start
4121; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB19_1 Depth=1
4122; CHECK-THUMB8BASE-NEXT:    str r0, [sp] @ 4-byte Spill
4123; CHECK-THUMB8BASE-NEXT:    uxth r1, r1
4124; CHECK-THUMB8BASE-NEXT:    subs r1, r0, r1
4125; CHECK-THUMB8BASE-NEXT:    rsbs r2, r1, #0
4126; CHECK-THUMB8BASE-NEXT:    adcs r1, r2
4127; CHECK-THUMB8BASE-NEXT:    cmp r1, #1
4128; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #16] @ 4-byte Spill
4129; CHECK-THUMB8BASE-NEXT:    bne .LBB19_1
4130; CHECK-THUMB8BASE-NEXT:    b .LBB19_7
4131; CHECK-THUMB8BASE-NEXT:  .LBB19_7: @ %atomicrmw.end
4132; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp] @ 4-byte Reload
4133; CHECK-THUMB8BASE-NEXT:    add sp, #20
4134; CHECK-THUMB8BASE-NEXT:    pop {r4, pc}
4135entry:
4136  %0 = atomicrmw min i16* @atomic_i16, i16 1 monotonic
4137  ret i16 %0
4138}
4139define i16 @test_umax_i16() {
4140; CHECK-ARM8-LABEL: test_umax_i16:
4141; CHECK-ARM8:       @ %bb.0: @ %entry
4142; CHECK-ARM8-NEXT:    .save {r11, lr}
4143; CHECK-ARM8-NEXT:    push {r11, lr}
4144; CHECK-ARM8-NEXT:    .pad #8
4145; CHECK-ARM8-NEXT:    sub sp, sp, #8
4146; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i16
4147; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i16
4148; CHECK-ARM8-NEXT:    ldrh r0, [r0]
4149; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
4150; CHECK-ARM8-NEXT:    b .LBB20_1
4151; CHECK-ARM8-NEXT:  .LBB20_1: @ %atomicrmw.start
4152; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
4153; CHECK-ARM8-NEXT:    @ Child Loop BB20_2 Depth 2
4154; CHECK-ARM8-NEXT:    ldr r12, [sp, #4] @ 4-byte Reload
4155; CHECK-ARM8-NEXT:    uxth r1, r12
4156; CHECK-ARM8-NEXT:    mov lr, #1
4157; CHECK-ARM8-NEXT:    cmp r1, #1
4158; CHECK-ARM8-NEXT:    movhi lr, r12
4159; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i16
4160; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i16
4161; CHECK-ARM8-NEXT:    uxth r12, r12
4162; CHECK-ARM8-NEXT:  .LBB20_2: @ %atomicrmw.start
4163; CHECK-ARM8-NEXT:    @ Parent Loop BB20_1 Depth=1
4164; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
4165; CHECK-ARM8-NEXT:    ldrexh r0, [r3]
4166; CHECK-ARM8-NEXT:    cmp r0, r12
4167; CHECK-ARM8-NEXT:    bne .LBB20_4
4168; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
4169; CHECK-ARM8-NEXT:    @ in Loop: Header=BB20_2 Depth=2
4170; CHECK-ARM8-NEXT:    strexh r2, lr, [r3]
4171; CHECK-ARM8-NEXT:    cmp r2, #0
4172; CHECK-ARM8-NEXT:    bne .LBB20_2
4173; CHECK-ARM8-NEXT:  .LBB20_4: @ %atomicrmw.start
4174; CHECK-ARM8-NEXT:    @ in Loop: Header=BB20_1 Depth=1
4175; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
4176; CHECK-ARM8-NEXT:    sub r1, r0, r1
4177; CHECK-ARM8-NEXT:    clz r1, r1
4178; CHECK-ARM8-NEXT:    lsr r1, r1, #5
4179; CHECK-ARM8-NEXT:    cmp r1, #1
4180; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
4181; CHECK-ARM8-NEXT:    bne .LBB20_1
4182; CHECK-ARM8-NEXT:    b .LBB20_5
4183; CHECK-ARM8-NEXT:  .LBB20_5: @ %atomicrmw.end
4184; CHECK-ARM8-NEXT:    ldr r0, [sp] @ 4-byte Reload
4185; CHECK-ARM8-NEXT:    add sp, sp, #8
4186; CHECK-ARM8-NEXT:    pop {r11, pc}
4187;
4188; CHECK-ARM6-LABEL: test_umax_i16:
4189; CHECK-ARM6:       @ %bb.0: @ %entry
4190; CHECK-ARM6-NEXT:    .save {r11, lr}
4191; CHECK-ARM6-NEXT:    push {r11, lr}
4192; CHECK-ARM6-NEXT:    .pad #8
4193; CHECK-ARM6-NEXT:    sub sp, sp, #8
4194; CHECK-ARM6-NEXT:    ldr r0, .LCPI20_0
4195; CHECK-ARM6-NEXT:    ldrh r0, [r0]
4196; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
4197; CHECK-ARM6-NEXT:    b .LBB20_1
4198; CHECK-ARM6-NEXT:  .LBB20_1: @ %atomicrmw.start
4199; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
4200; CHECK-ARM6-NEXT:    @ Child Loop BB20_2 Depth 2
4201; CHECK-ARM6-NEXT:    ldr r12, [sp, #4] @ 4-byte Reload
4202; CHECK-ARM6-NEXT:    uxth r1, r12
4203; CHECK-ARM6-NEXT:    mov lr, #1
4204; CHECK-ARM6-NEXT:    cmp r1, #1
4205; CHECK-ARM6-NEXT:    movhi lr, r12
4206; CHECK-ARM6-NEXT:    ldr r3, .LCPI20_0
4207; CHECK-ARM6-NEXT:    uxth r12, r12
4208; CHECK-ARM6-NEXT:  .LBB20_2: @ %atomicrmw.start
4209; CHECK-ARM6-NEXT:    @ Parent Loop BB20_1 Depth=1
4210; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
4211; CHECK-ARM6-NEXT:    ldrexh r0, [r3]
4212; CHECK-ARM6-NEXT:    cmp r0, r12
4213; CHECK-ARM6-NEXT:    bne .LBB20_4
4214; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
4215; CHECK-ARM6-NEXT:    @ in Loop: Header=BB20_2 Depth=2
4216; CHECK-ARM6-NEXT:    strexh r2, lr, [r3]
4217; CHECK-ARM6-NEXT:    cmp r2, #0
4218; CHECK-ARM6-NEXT:    bne .LBB20_2
4219; CHECK-ARM6-NEXT:  .LBB20_4: @ %atomicrmw.start
4220; CHECK-ARM6-NEXT:    @ in Loop: Header=BB20_1 Depth=1
4221; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
4222; CHECK-ARM6-NEXT:    sub r1, r0, r1
4223; CHECK-ARM6-NEXT:    clz r1, r1
4224; CHECK-ARM6-NEXT:    lsr r1, r1, #5
4225; CHECK-ARM6-NEXT:    cmp r1, #1
4226; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
4227; CHECK-ARM6-NEXT:    bne .LBB20_1
4228; CHECK-ARM6-NEXT:    b .LBB20_5
4229; CHECK-ARM6-NEXT:  .LBB20_5: @ %atomicrmw.end
4230; CHECK-ARM6-NEXT:    ldr r0, [sp] @ 4-byte Reload
4231; CHECK-ARM6-NEXT:    add sp, sp, #8
4232; CHECK-ARM6-NEXT:    pop {r11, pc}
4233; CHECK-ARM6-NEXT:    .p2align 2
4234; CHECK-ARM6-NEXT:  @ %bb.6:
4235; CHECK-ARM6-NEXT:  .LCPI20_0:
4236; CHECK-ARM6-NEXT:    .long atomic_i16
4237;
4238; CHECK-THUMB7-LABEL: test_umax_i16:
4239; CHECK-THUMB7:       @ %bb.0: @ %entry
4240; CHECK-THUMB7-NEXT:    .save {r4, lr}
4241; CHECK-THUMB7-NEXT:    push {r4, lr}
4242; CHECK-THUMB7-NEXT:    .pad #8
4243; CHECK-THUMB7-NEXT:    sub sp, #8
4244; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i16
4245; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i16
4246; CHECK-THUMB7-NEXT:    ldrh r0, [r0]
4247; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
4248; CHECK-THUMB7-NEXT:    b .LBB20_1
4249; CHECK-THUMB7-NEXT:  .LBB20_1: @ %atomicrmw.start
4250; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
4251; CHECK-THUMB7-NEXT:    @ Child Loop BB20_2 Depth 2
4252; CHECK-THUMB7-NEXT:    ldr r4, [sp, #4] @ 4-byte Reload
4253; CHECK-THUMB7-NEXT:    uxth r1, r4
4254; CHECK-THUMB7-NEXT:    mov.w r12, #1
4255; CHECK-THUMB7-NEXT:    cmp r1, #1
4256; CHECK-THUMB7-NEXT:    it hi
4257; CHECK-THUMB7-NEXT:    movhi r12, r4
4258; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i16
4259; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i16
4260; CHECK-THUMB7-NEXT:    uxth r4, r4
4261; CHECK-THUMB7-NEXT:  .LBB20_2: @ %atomicrmw.start
4262; CHECK-THUMB7-NEXT:    @ Parent Loop BB20_1 Depth=1
4263; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
4264; CHECK-THUMB7-NEXT:    ldrexh r0, [r3]
4265; CHECK-THUMB7-NEXT:    cmp r0, r4
4266; CHECK-THUMB7-NEXT:    bne .LBB20_4
4267; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
4268; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB20_2 Depth=2
4269; CHECK-THUMB7-NEXT:    strexh r2, r12, [r3]
4270; CHECK-THUMB7-NEXT:    cmp r2, #0
4271; CHECK-THUMB7-NEXT:    bne .LBB20_2
4272; CHECK-THUMB7-NEXT:  .LBB20_4: @ %atomicrmw.start
4273; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB20_1 Depth=1
4274; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
4275; CHECK-THUMB7-NEXT:    subs r1, r0, r1
4276; CHECK-THUMB7-NEXT:    clz r1, r1
4277; CHECK-THUMB7-NEXT:    lsrs r1, r1, #5
4278; CHECK-THUMB7-NEXT:    cmp r1, #1
4279; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
4280; CHECK-THUMB7-NEXT:    bne .LBB20_1
4281; CHECK-THUMB7-NEXT:    b .LBB20_5
4282; CHECK-THUMB7-NEXT:  .LBB20_5: @ %atomicrmw.end
4283; CHECK-THUMB7-NEXT:    ldr r0, [sp] @ 4-byte Reload
4284; CHECK-THUMB7-NEXT:    add sp, #8
4285; CHECK-THUMB7-NEXT:    pop {r4, pc}
4286;
4287; CHECK-THUMB6-LABEL: test_umax_i16:
4288; CHECK-THUMB6:       @ %bb.0: @ %entry
4289; CHECK-THUMB6-NEXT:    .save {r7, lr}
4290; CHECK-THUMB6-NEXT:    push {r7, lr}
4291; CHECK-THUMB6-NEXT:    ldr r0, .LCPI20_0
4292; CHECK-THUMB6-NEXT:    movs r1, #1
4293; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_umax_2
4294; CHECK-THUMB6-NEXT:    pop {r7, pc}
4295; CHECK-THUMB6-NEXT:    .p2align 2
4296; CHECK-THUMB6-NEXT:  @ %bb.1:
4297; CHECK-THUMB6-NEXT:  .LCPI20_0:
4298; CHECK-THUMB6-NEXT:    .long atomic_i16
4299;
4300; CHECK-THUMB8BASE-LABEL: test_umax_i16:
4301; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
4302; CHECK-THUMB8BASE-NEXT:    .save {r4, r5, r7, lr}
4303; CHECK-THUMB8BASE-NEXT:    push {r4, r5, r7, lr}
4304; CHECK-THUMB8BASE-NEXT:    .pad #24
4305; CHECK-THUMB8BASE-NEXT:    sub sp, #24
4306; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i16
4307; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i16
4308; CHECK-THUMB8BASE-NEXT:    ldrh r0, [r0]
4309; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #20] @ 4-byte Spill
4310; CHECK-THUMB8BASE-NEXT:    b .LBB20_1
4311; CHECK-THUMB8BASE-NEXT:  .LBB20_1: @ %atomicrmw.start
4312; CHECK-THUMB8BASE-NEXT:    @ =>This Loop Header: Depth=1
4313; CHECK-THUMB8BASE-NEXT:    @ Child Loop BB20_4 Depth 2
4314; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #20] @ 4-byte Reload
4315; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
4316; CHECK-THUMB8BASE-NEXT:    uxth r1, r0
4317; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #8] @ 4-byte Spill
4318; CHECK-THUMB8BASE-NEXT:    movs r2, #1
4319; CHECK-THUMB8BASE-NEXT:    str r2, [sp, #12] @ 4-byte Spill
4320; CHECK-THUMB8BASE-NEXT:    cmp r1, #1
4321; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #16] @ 4-byte Spill
4322; CHECK-THUMB8BASE-NEXT:    bhi .LBB20_3
4323; CHECK-THUMB8BASE-NEXT:  @ %bb.2: @ %atomicrmw.start
4324; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB20_1 Depth=1
4325; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #12] @ 4-byte Reload
4326; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #16] @ 4-byte Spill
4327; CHECK-THUMB8BASE-NEXT:  .LBB20_3: @ %atomicrmw.start
4328; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB20_1 Depth=1
4329; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #8] @ 4-byte Reload
4330; CHECK-THUMB8BASE-NEXT:    ldr r4, [sp, #4] @ 4-byte Reload
4331; CHECK-THUMB8BASE-NEXT:    ldr r5, [sp, #16] @ 4-byte Reload
4332; CHECK-THUMB8BASE-NEXT:    movw r3, :lower16:atomic_i16
4333; CHECK-THUMB8BASE-NEXT:    movt r3, :upper16:atomic_i16
4334; CHECK-THUMB8BASE-NEXT:    uxth r4, r4
4335; CHECK-THUMB8BASE-NEXT:  .LBB20_4: @ %atomicrmw.start
4336; CHECK-THUMB8BASE-NEXT:    @ Parent Loop BB20_1 Depth=1
4337; CHECK-THUMB8BASE-NEXT:    @ => This Inner Loop Header: Depth=2
4338; CHECK-THUMB8BASE-NEXT:    ldrexh r0, [r3]
4339; CHECK-THUMB8BASE-NEXT:    cmp r0, r4
4340; CHECK-THUMB8BASE-NEXT:    bne .LBB20_6
4341; CHECK-THUMB8BASE-NEXT:  @ %bb.5: @ %atomicrmw.start
4342; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB20_4 Depth=2
4343; CHECK-THUMB8BASE-NEXT:    strexh r2, r5, [r3]
4344; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
4345; CHECK-THUMB8BASE-NEXT:    bne .LBB20_4
4346; CHECK-THUMB8BASE-NEXT:  .LBB20_6: @ %atomicrmw.start
4347; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB20_1 Depth=1
4348; CHECK-THUMB8BASE-NEXT:    str r0, [sp] @ 4-byte Spill
4349; CHECK-THUMB8BASE-NEXT:    subs r1, r0, r1
4350; CHECK-THUMB8BASE-NEXT:    rsbs r2, r1, #0
4351; CHECK-THUMB8BASE-NEXT:    adcs r1, r2
4352; CHECK-THUMB8BASE-NEXT:    cmp r1, #1
4353; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #20] @ 4-byte Spill
4354; CHECK-THUMB8BASE-NEXT:    bne .LBB20_1
4355; CHECK-THUMB8BASE-NEXT:    b .LBB20_7
4356; CHECK-THUMB8BASE-NEXT:  .LBB20_7: @ %atomicrmw.end
4357; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp] @ 4-byte Reload
4358; CHECK-THUMB8BASE-NEXT:    add sp, #24
4359; CHECK-THUMB8BASE-NEXT:    pop {r4, r5, r7, pc}
4360entry:
4361  %0 = atomicrmw umax i16* @atomic_i16, i16 1 monotonic
4362  ret i16 %0
4363}
4364define i16 @test_umin_i16() {
4365; CHECK-ARM8-LABEL: test_umin_i16:
4366; CHECK-ARM8:       @ %bb.0: @ %entry
4367; CHECK-ARM8-NEXT:    .save {r11, lr}
4368; CHECK-ARM8-NEXT:    push {r11, lr}
4369; CHECK-ARM8-NEXT:    .pad #8
4370; CHECK-ARM8-NEXT:    sub sp, sp, #8
4371; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i16
4372; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i16
4373; CHECK-ARM8-NEXT:    ldrh r0, [r0]
4374; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
4375; CHECK-ARM8-NEXT:    b .LBB21_1
4376; CHECK-ARM8-NEXT:  .LBB21_1: @ %atomicrmw.start
4377; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
4378; CHECK-ARM8-NEXT:    @ Child Loop BB21_2 Depth 2
4379; CHECK-ARM8-NEXT:    ldr r12, [sp, #4] @ 4-byte Reload
4380; CHECK-ARM8-NEXT:    uxth r1, r12
4381; CHECK-ARM8-NEXT:    mov lr, #1
4382; CHECK-ARM8-NEXT:    cmp r1, #2
4383; CHECK-ARM8-NEXT:    movlo lr, r12
4384; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i16
4385; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i16
4386; CHECK-ARM8-NEXT:    uxth r12, r12
4387; CHECK-ARM8-NEXT:  .LBB21_2: @ %atomicrmw.start
4388; CHECK-ARM8-NEXT:    @ Parent Loop BB21_1 Depth=1
4389; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
4390; CHECK-ARM8-NEXT:    ldrexh r0, [r3]
4391; CHECK-ARM8-NEXT:    cmp r0, r12
4392; CHECK-ARM8-NEXT:    bne .LBB21_4
4393; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
4394; CHECK-ARM8-NEXT:    @ in Loop: Header=BB21_2 Depth=2
4395; CHECK-ARM8-NEXT:    strexh r2, lr, [r3]
4396; CHECK-ARM8-NEXT:    cmp r2, #0
4397; CHECK-ARM8-NEXT:    bne .LBB21_2
4398; CHECK-ARM8-NEXT:  .LBB21_4: @ %atomicrmw.start
4399; CHECK-ARM8-NEXT:    @ in Loop: Header=BB21_1 Depth=1
4400; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
4401; CHECK-ARM8-NEXT:    sub r1, r0, r1
4402; CHECK-ARM8-NEXT:    clz r1, r1
4403; CHECK-ARM8-NEXT:    lsr r1, r1, #5
4404; CHECK-ARM8-NEXT:    cmp r1, #1
4405; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
4406; CHECK-ARM8-NEXT:    bne .LBB21_1
4407; CHECK-ARM8-NEXT:    b .LBB21_5
4408; CHECK-ARM8-NEXT:  .LBB21_5: @ %atomicrmw.end
4409; CHECK-ARM8-NEXT:    ldr r0, [sp] @ 4-byte Reload
4410; CHECK-ARM8-NEXT:    add sp, sp, #8
4411; CHECK-ARM8-NEXT:    pop {r11, pc}
4412;
4413; CHECK-ARM6-LABEL: test_umin_i16:
4414; CHECK-ARM6:       @ %bb.0: @ %entry
4415; CHECK-ARM6-NEXT:    .save {r11, lr}
4416; CHECK-ARM6-NEXT:    push {r11, lr}
4417; CHECK-ARM6-NEXT:    .pad #8
4418; CHECK-ARM6-NEXT:    sub sp, sp, #8
4419; CHECK-ARM6-NEXT:    ldr r0, .LCPI21_0
4420; CHECK-ARM6-NEXT:    ldrh r0, [r0]
4421; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
4422; CHECK-ARM6-NEXT:    b .LBB21_1
4423; CHECK-ARM6-NEXT:  .LBB21_1: @ %atomicrmw.start
4424; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
4425; CHECK-ARM6-NEXT:    @ Child Loop BB21_2 Depth 2
4426; CHECK-ARM6-NEXT:    ldr r12, [sp, #4] @ 4-byte Reload
4427; CHECK-ARM6-NEXT:    uxth r1, r12
4428; CHECK-ARM6-NEXT:    mov lr, #1
4429; CHECK-ARM6-NEXT:    cmp r1, #2
4430; CHECK-ARM6-NEXT:    movlo lr, r12
4431; CHECK-ARM6-NEXT:    ldr r3, .LCPI21_0
4432; CHECK-ARM6-NEXT:    uxth r12, r12
4433; CHECK-ARM6-NEXT:  .LBB21_2: @ %atomicrmw.start
4434; CHECK-ARM6-NEXT:    @ Parent Loop BB21_1 Depth=1
4435; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
4436; CHECK-ARM6-NEXT:    ldrexh r0, [r3]
4437; CHECK-ARM6-NEXT:    cmp r0, r12
4438; CHECK-ARM6-NEXT:    bne .LBB21_4
4439; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
4440; CHECK-ARM6-NEXT:    @ in Loop: Header=BB21_2 Depth=2
4441; CHECK-ARM6-NEXT:    strexh r2, lr, [r3]
4442; CHECK-ARM6-NEXT:    cmp r2, #0
4443; CHECK-ARM6-NEXT:    bne .LBB21_2
4444; CHECK-ARM6-NEXT:  .LBB21_4: @ %atomicrmw.start
4445; CHECK-ARM6-NEXT:    @ in Loop: Header=BB21_1 Depth=1
4446; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
4447; CHECK-ARM6-NEXT:    sub r1, r0, r1
4448; CHECK-ARM6-NEXT:    clz r1, r1
4449; CHECK-ARM6-NEXT:    lsr r1, r1, #5
4450; CHECK-ARM6-NEXT:    cmp r1, #1
4451; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
4452; CHECK-ARM6-NEXT:    bne .LBB21_1
4453; CHECK-ARM6-NEXT:    b .LBB21_5
4454; CHECK-ARM6-NEXT:  .LBB21_5: @ %atomicrmw.end
4455; CHECK-ARM6-NEXT:    ldr r0, [sp] @ 4-byte Reload
4456; CHECK-ARM6-NEXT:    add sp, sp, #8
4457; CHECK-ARM6-NEXT:    pop {r11, pc}
4458; CHECK-ARM6-NEXT:    .p2align 2
4459; CHECK-ARM6-NEXT:  @ %bb.6:
4460; CHECK-ARM6-NEXT:  .LCPI21_0:
4461; CHECK-ARM6-NEXT:    .long atomic_i16
4462;
4463; CHECK-THUMB7-LABEL: test_umin_i16:
4464; CHECK-THUMB7:       @ %bb.0: @ %entry
4465; CHECK-THUMB7-NEXT:    .save {r4, lr}
4466; CHECK-THUMB7-NEXT:    push {r4, lr}
4467; CHECK-THUMB7-NEXT:    .pad #8
4468; CHECK-THUMB7-NEXT:    sub sp, #8
4469; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i16
4470; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i16
4471; CHECK-THUMB7-NEXT:    ldrh r0, [r0]
4472; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
4473; CHECK-THUMB7-NEXT:    b .LBB21_1
4474; CHECK-THUMB7-NEXT:  .LBB21_1: @ %atomicrmw.start
4475; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
4476; CHECK-THUMB7-NEXT:    @ Child Loop BB21_2 Depth 2
4477; CHECK-THUMB7-NEXT:    ldr r4, [sp, #4] @ 4-byte Reload
4478; CHECK-THUMB7-NEXT:    uxth r1, r4
4479; CHECK-THUMB7-NEXT:    mov.w r12, #1
4480; CHECK-THUMB7-NEXT:    cmp r1, #2
4481; CHECK-THUMB7-NEXT:    it lo
4482; CHECK-THUMB7-NEXT:    movlo r12, r4
4483; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i16
4484; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i16
4485; CHECK-THUMB7-NEXT:    uxth r4, r4
4486; CHECK-THUMB7-NEXT:  .LBB21_2: @ %atomicrmw.start
4487; CHECK-THUMB7-NEXT:    @ Parent Loop BB21_1 Depth=1
4488; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
4489; CHECK-THUMB7-NEXT:    ldrexh r0, [r3]
4490; CHECK-THUMB7-NEXT:    cmp r0, r4
4491; CHECK-THUMB7-NEXT:    bne .LBB21_4
4492; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
4493; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB21_2 Depth=2
4494; CHECK-THUMB7-NEXT:    strexh r2, r12, [r3]
4495; CHECK-THUMB7-NEXT:    cmp r2, #0
4496; CHECK-THUMB7-NEXT:    bne .LBB21_2
4497; CHECK-THUMB7-NEXT:  .LBB21_4: @ %atomicrmw.start
4498; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB21_1 Depth=1
4499; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
4500; CHECK-THUMB7-NEXT:    subs r1, r0, r1
4501; CHECK-THUMB7-NEXT:    clz r1, r1
4502; CHECK-THUMB7-NEXT:    lsrs r1, r1, #5
4503; CHECK-THUMB7-NEXT:    cmp r1, #1
4504; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
4505; CHECK-THUMB7-NEXT:    bne .LBB21_1
4506; CHECK-THUMB7-NEXT:    b .LBB21_5
4507; CHECK-THUMB7-NEXT:  .LBB21_5: @ %atomicrmw.end
4508; CHECK-THUMB7-NEXT:    ldr r0, [sp] @ 4-byte Reload
4509; CHECK-THUMB7-NEXT:    add sp, #8
4510; CHECK-THUMB7-NEXT:    pop {r4, pc}
4511;
4512; CHECK-THUMB6-LABEL: test_umin_i16:
4513; CHECK-THUMB6:       @ %bb.0: @ %entry
4514; CHECK-THUMB6-NEXT:    .save {r7, lr}
4515; CHECK-THUMB6-NEXT:    push {r7, lr}
4516; CHECK-THUMB6-NEXT:    ldr r0, .LCPI21_0
4517; CHECK-THUMB6-NEXT:    movs r1, #1
4518; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_umin_2
4519; CHECK-THUMB6-NEXT:    pop {r7, pc}
4520; CHECK-THUMB6-NEXT:    .p2align 2
4521; CHECK-THUMB6-NEXT:  @ %bb.1:
4522; CHECK-THUMB6-NEXT:  .LCPI21_0:
4523; CHECK-THUMB6-NEXT:    .long atomic_i16
4524;
4525; CHECK-THUMB8BASE-LABEL: test_umin_i16:
4526; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
4527; CHECK-THUMB8BASE-NEXT:    .save {r4, r5, r7, lr}
4528; CHECK-THUMB8BASE-NEXT:    push {r4, r5, r7, lr}
4529; CHECK-THUMB8BASE-NEXT:    .pad #24
4530; CHECK-THUMB8BASE-NEXT:    sub sp, #24
4531; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i16
4532; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i16
4533; CHECK-THUMB8BASE-NEXT:    ldrh r0, [r0]
4534; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #20] @ 4-byte Spill
4535; CHECK-THUMB8BASE-NEXT:    b .LBB21_1
4536; CHECK-THUMB8BASE-NEXT:  .LBB21_1: @ %atomicrmw.start
4537; CHECK-THUMB8BASE-NEXT:    @ =>This Loop Header: Depth=1
4538; CHECK-THUMB8BASE-NEXT:    @ Child Loop BB21_4 Depth 2
4539; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #20] @ 4-byte Reload
4540; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
4541; CHECK-THUMB8BASE-NEXT:    uxth r1, r0
4542; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #8] @ 4-byte Spill
4543; CHECK-THUMB8BASE-NEXT:    movs r2, #1
4544; CHECK-THUMB8BASE-NEXT:    str r2, [sp, #12] @ 4-byte Spill
4545; CHECK-THUMB8BASE-NEXT:    cmp r1, #2
4546; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #16] @ 4-byte Spill
4547; CHECK-THUMB8BASE-NEXT:    blo .LBB21_3
4548; CHECK-THUMB8BASE-NEXT:  @ %bb.2: @ %atomicrmw.start
4549; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB21_1 Depth=1
4550; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #12] @ 4-byte Reload
4551; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #16] @ 4-byte Spill
4552; CHECK-THUMB8BASE-NEXT:  .LBB21_3: @ %atomicrmw.start
4553; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB21_1 Depth=1
4554; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #8] @ 4-byte Reload
4555; CHECK-THUMB8BASE-NEXT:    ldr r4, [sp, #4] @ 4-byte Reload
4556; CHECK-THUMB8BASE-NEXT:    ldr r5, [sp, #16] @ 4-byte Reload
4557; CHECK-THUMB8BASE-NEXT:    movw r3, :lower16:atomic_i16
4558; CHECK-THUMB8BASE-NEXT:    movt r3, :upper16:atomic_i16
4559; CHECK-THUMB8BASE-NEXT:    uxth r4, r4
4560; CHECK-THUMB8BASE-NEXT:  .LBB21_4: @ %atomicrmw.start
4561; CHECK-THUMB8BASE-NEXT:    @ Parent Loop BB21_1 Depth=1
4562; CHECK-THUMB8BASE-NEXT:    @ => This Inner Loop Header: Depth=2
4563; CHECK-THUMB8BASE-NEXT:    ldrexh r0, [r3]
4564; CHECK-THUMB8BASE-NEXT:    cmp r0, r4
4565; CHECK-THUMB8BASE-NEXT:    bne .LBB21_6
4566; CHECK-THUMB8BASE-NEXT:  @ %bb.5: @ %atomicrmw.start
4567; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB21_4 Depth=2
4568; CHECK-THUMB8BASE-NEXT:    strexh r2, r5, [r3]
4569; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
4570; CHECK-THUMB8BASE-NEXT:    bne .LBB21_4
4571; CHECK-THUMB8BASE-NEXT:  .LBB21_6: @ %atomicrmw.start
4572; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB21_1 Depth=1
4573; CHECK-THUMB8BASE-NEXT:    str r0, [sp] @ 4-byte Spill
4574; CHECK-THUMB8BASE-NEXT:    subs r1, r0, r1
4575; CHECK-THUMB8BASE-NEXT:    rsbs r2, r1, #0
4576; CHECK-THUMB8BASE-NEXT:    adcs r1, r2
4577; CHECK-THUMB8BASE-NEXT:    cmp r1, #1
4578; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #20] @ 4-byte Spill
4579; CHECK-THUMB8BASE-NEXT:    bne .LBB21_1
4580; CHECK-THUMB8BASE-NEXT:    b .LBB21_7
4581; CHECK-THUMB8BASE-NEXT:  .LBB21_7: @ %atomicrmw.end
4582; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp] @ 4-byte Reload
4583; CHECK-THUMB8BASE-NEXT:    add sp, #24
4584; CHECK-THUMB8BASE-NEXT:    pop {r4, r5, r7, pc}
4585entry:
4586  %0 = atomicrmw umin i16* @atomic_i16, i16 1 monotonic
4587  ret i16 %0
4588}
4589
4590
4591define i32 @test_xchg_i32() {
4592; CHECK-ARM8-LABEL: test_xchg_i32:
4593; CHECK-ARM8:       @ %bb.0: @ %entry
4594; CHECK-ARM8-NEXT:    .pad #8
4595; CHECK-ARM8-NEXT:    sub sp, sp, #8
4596; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i32
4597; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i32
4598; CHECK-ARM8-NEXT:    ldr r0, [r0]
4599; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
4600; CHECK-ARM8-NEXT:    b .LBB22_1
4601; CHECK-ARM8-NEXT:  .LBB22_1: @ %atomicrmw.start
4602; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
4603; CHECK-ARM8-NEXT:    @ Child Loop BB22_2 Depth 2
4604; CHECK-ARM8-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
4605; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i32
4606; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i32
4607; CHECK-ARM8-NEXT:    mov r12, #1
4608; CHECK-ARM8-NEXT:  .LBB22_2: @ %atomicrmw.start
4609; CHECK-ARM8-NEXT:    @ Parent Loop BB22_1 Depth=1
4610; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
4611; CHECK-ARM8-NEXT:    ldrex r0, [r3]
4612; CHECK-ARM8-NEXT:    cmp r0, r1
4613; CHECK-ARM8-NEXT:    bne .LBB22_4
4614; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
4615; CHECK-ARM8-NEXT:    @ in Loop: Header=BB22_2 Depth=2
4616; CHECK-ARM8-NEXT:    strex r2, r12, [r3]
4617; CHECK-ARM8-NEXT:    cmp r2, #0
4618; CHECK-ARM8-NEXT:    bne .LBB22_2
4619; CHECK-ARM8-NEXT:  .LBB22_4: @ %atomicrmw.start
4620; CHECK-ARM8-NEXT:    @ in Loop: Header=BB22_1 Depth=1
4621; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
4622; CHECK-ARM8-NEXT:    sub r1, r0, r1
4623; CHECK-ARM8-NEXT:    clz r1, r1
4624; CHECK-ARM8-NEXT:    lsr r1, r1, #5
4625; CHECK-ARM8-NEXT:    cmp r1, #1
4626; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
4627; CHECK-ARM8-NEXT:    bne .LBB22_1
4628; CHECK-ARM8-NEXT:    b .LBB22_5
4629; CHECK-ARM8-NEXT:  .LBB22_5: @ %atomicrmw.end
4630; CHECK-ARM8-NEXT:    ldr r0, [sp] @ 4-byte Reload
4631; CHECK-ARM8-NEXT:    add sp, sp, #8
4632; CHECK-ARM8-NEXT:    bx lr
4633;
4634; CHECK-ARM6-LABEL: test_xchg_i32:
4635; CHECK-ARM6:       @ %bb.0: @ %entry
4636; CHECK-ARM6-NEXT:    .pad #8
4637; CHECK-ARM6-NEXT:    sub sp, sp, #8
4638; CHECK-ARM6-NEXT:    ldr r0, .LCPI22_0
4639; CHECK-ARM6-NEXT:    ldr r0, [r0]
4640; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
4641; CHECK-ARM6-NEXT:    b .LBB22_1
4642; CHECK-ARM6-NEXT:  .LBB22_1: @ %atomicrmw.start
4643; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
4644; CHECK-ARM6-NEXT:    @ Child Loop BB22_2 Depth 2
4645; CHECK-ARM6-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
4646; CHECK-ARM6-NEXT:    ldr r3, .LCPI22_0
4647; CHECK-ARM6-NEXT:    mov r12, #1
4648; CHECK-ARM6-NEXT:  .LBB22_2: @ %atomicrmw.start
4649; CHECK-ARM6-NEXT:    @ Parent Loop BB22_1 Depth=1
4650; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
4651; CHECK-ARM6-NEXT:    ldrex r0, [r3]
4652; CHECK-ARM6-NEXT:    cmp r0, r1
4653; CHECK-ARM6-NEXT:    bne .LBB22_4
4654; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
4655; CHECK-ARM6-NEXT:    @ in Loop: Header=BB22_2 Depth=2
4656; CHECK-ARM6-NEXT:    strex r2, r12, [r3]
4657; CHECK-ARM6-NEXT:    cmp r2, #0
4658; CHECK-ARM6-NEXT:    bne .LBB22_2
4659; CHECK-ARM6-NEXT:  .LBB22_4: @ %atomicrmw.start
4660; CHECK-ARM6-NEXT:    @ in Loop: Header=BB22_1 Depth=1
4661; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
4662; CHECK-ARM6-NEXT:    sub r1, r0, r1
4663; CHECK-ARM6-NEXT:    clz r1, r1
4664; CHECK-ARM6-NEXT:    lsr r1, r1, #5
4665; CHECK-ARM6-NEXT:    cmp r1, #1
4666; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
4667; CHECK-ARM6-NEXT:    bne .LBB22_1
4668; CHECK-ARM6-NEXT:    b .LBB22_5
4669; CHECK-ARM6-NEXT:  .LBB22_5: @ %atomicrmw.end
4670; CHECK-ARM6-NEXT:    ldr r0, [sp] @ 4-byte Reload
4671; CHECK-ARM6-NEXT:    add sp, sp, #8
4672; CHECK-ARM6-NEXT:    bx lr
4673; CHECK-ARM6-NEXT:    .p2align 2
4674; CHECK-ARM6-NEXT:  @ %bb.6:
4675; CHECK-ARM6-NEXT:  .LCPI22_0:
4676; CHECK-ARM6-NEXT:    .long atomic_i32
4677;
4678; CHECK-THUMB7-LABEL: test_xchg_i32:
4679; CHECK-THUMB7:       @ %bb.0: @ %entry
4680; CHECK-THUMB7-NEXT:    .pad #8
4681; CHECK-THUMB7-NEXT:    sub sp, #8
4682; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i32
4683; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i32
4684; CHECK-THUMB7-NEXT:    ldr r0, [r0]
4685; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
4686; CHECK-THUMB7-NEXT:    b .LBB22_1
4687; CHECK-THUMB7-NEXT:  .LBB22_1: @ %atomicrmw.start
4688; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
4689; CHECK-THUMB7-NEXT:    @ Child Loop BB22_2 Depth 2
4690; CHECK-THUMB7-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
4691; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i32
4692; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i32
4693; CHECK-THUMB7-NEXT:    mov.w r12, #1
4694; CHECK-THUMB7-NEXT:  .LBB22_2: @ %atomicrmw.start
4695; CHECK-THUMB7-NEXT:    @ Parent Loop BB22_1 Depth=1
4696; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
4697; CHECK-THUMB7-NEXT:    ldrex r0, [r3]
4698; CHECK-THUMB7-NEXT:    cmp r0, r1
4699; CHECK-THUMB7-NEXT:    bne .LBB22_4
4700; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
4701; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB22_2 Depth=2
4702; CHECK-THUMB7-NEXT:    strex r2, r12, [r3]
4703; CHECK-THUMB7-NEXT:    cmp r2, #0
4704; CHECK-THUMB7-NEXT:    bne .LBB22_2
4705; CHECK-THUMB7-NEXT:  .LBB22_4: @ %atomicrmw.start
4706; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB22_1 Depth=1
4707; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
4708; CHECK-THUMB7-NEXT:    subs r1, r0, r1
4709; CHECK-THUMB7-NEXT:    clz r1, r1
4710; CHECK-THUMB7-NEXT:    lsrs r1, r1, #5
4711; CHECK-THUMB7-NEXT:    cmp r1, #1
4712; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
4713; CHECK-THUMB7-NEXT:    bne .LBB22_1
4714; CHECK-THUMB7-NEXT:    b .LBB22_5
4715; CHECK-THUMB7-NEXT:  .LBB22_5: @ %atomicrmw.end
4716; CHECK-THUMB7-NEXT:    ldr r0, [sp] @ 4-byte Reload
4717; CHECK-THUMB7-NEXT:    add sp, #8
4718; CHECK-THUMB7-NEXT:    bx lr
4719;
4720; CHECK-THUMB6-LABEL: test_xchg_i32:
4721; CHECK-THUMB6:       @ %bb.0: @ %entry
4722; CHECK-THUMB6-NEXT:    .save {r7, lr}
4723; CHECK-THUMB6-NEXT:    push {r7, lr}
4724; CHECK-THUMB6-NEXT:    ldr r0, .LCPI22_0
4725; CHECK-THUMB6-NEXT:    movs r1, #1
4726; CHECK-THUMB6-NEXT:    bl __sync_lock_test_and_set_4
4727; CHECK-THUMB6-NEXT:    pop {r7, pc}
4728; CHECK-THUMB6-NEXT:    .p2align 2
4729; CHECK-THUMB6-NEXT:  @ %bb.1:
4730; CHECK-THUMB6-NEXT:  .LCPI22_0:
4731; CHECK-THUMB6-NEXT:    .long atomic_i32
4732;
4733; CHECK-THUMB8BASE-LABEL: test_xchg_i32:
4734; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
4735; CHECK-THUMB8BASE-NEXT:    .save {r4, lr}
4736; CHECK-THUMB8BASE-NEXT:    push {r4, lr}
4737; CHECK-THUMB8BASE-NEXT:    .pad #8
4738; CHECK-THUMB8BASE-NEXT:    sub sp, #8
4739; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i32
4740; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i32
4741; CHECK-THUMB8BASE-NEXT:    ldr r0, [r0]
4742; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
4743; CHECK-THUMB8BASE-NEXT:    b .LBB22_1
4744; CHECK-THUMB8BASE-NEXT:  .LBB22_1: @ %atomicrmw.start
4745; CHECK-THUMB8BASE-NEXT:    @ =>This Loop Header: Depth=1
4746; CHECK-THUMB8BASE-NEXT:    @ Child Loop BB22_2 Depth 2
4747; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
4748; CHECK-THUMB8BASE-NEXT:    movw r3, :lower16:atomic_i32
4749; CHECK-THUMB8BASE-NEXT:    movt r3, :upper16:atomic_i32
4750; CHECK-THUMB8BASE-NEXT:    movs r4, #1
4751; CHECK-THUMB8BASE-NEXT:  .LBB22_2: @ %atomicrmw.start
4752; CHECK-THUMB8BASE-NEXT:    @ Parent Loop BB22_1 Depth=1
4753; CHECK-THUMB8BASE-NEXT:    @ => This Inner Loop Header: Depth=2
4754; CHECK-THUMB8BASE-NEXT:    ldrex r0, [r3]
4755; CHECK-THUMB8BASE-NEXT:    cmp r0, r1
4756; CHECK-THUMB8BASE-NEXT:    bne .LBB22_4
4757; CHECK-THUMB8BASE-NEXT:  @ %bb.3: @ %atomicrmw.start
4758; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB22_2 Depth=2
4759; CHECK-THUMB8BASE-NEXT:    strex r2, r4, [r3]
4760; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
4761; CHECK-THUMB8BASE-NEXT:    bne .LBB22_2
4762; CHECK-THUMB8BASE-NEXT:  .LBB22_4: @ %atomicrmw.start
4763; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB22_1 Depth=1
4764; CHECK-THUMB8BASE-NEXT:    str r0, [sp] @ 4-byte Spill
4765; CHECK-THUMB8BASE-NEXT:    subs r1, r0, r1
4766; CHECK-THUMB8BASE-NEXT:    rsbs r2, r1, #0
4767; CHECK-THUMB8BASE-NEXT:    adcs r1, r2
4768; CHECK-THUMB8BASE-NEXT:    cmp r1, #1
4769; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
4770; CHECK-THUMB8BASE-NEXT:    bne .LBB22_1
4771; CHECK-THUMB8BASE-NEXT:    b .LBB22_5
4772; CHECK-THUMB8BASE-NEXT:  .LBB22_5: @ %atomicrmw.end
4773; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp] @ 4-byte Reload
4774; CHECK-THUMB8BASE-NEXT:    add sp, #8
4775; CHECK-THUMB8BASE-NEXT:    pop {r4, pc}
4776entry:
4777  %0 = atomicrmw xchg i32* @atomic_i32, i32 1 monotonic
4778  ret i32 %0
4779}
4780define i32 @test_add_i32() {
4781; CHECK-ARM8-LABEL: test_add_i32:
4782; CHECK-ARM8:       @ %bb.0: @ %entry
4783; CHECK-ARM8-NEXT:    .pad #8
4784; CHECK-ARM8-NEXT:    sub sp, sp, #8
4785; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i32
4786; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i32
4787; CHECK-ARM8-NEXT:    ldr r0, [r0]
4788; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
4789; CHECK-ARM8-NEXT:    b .LBB23_1
4790; CHECK-ARM8-NEXT:  .LBB23_1: @ %atomicrmw.start
4791; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
4792; CHECK-ARM8-NEXT:    @ Child Loop BB23_2 Depth 2
4793; CHECK-ARM8-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
4794; CHECK-ARM8-NEXT:    add r12, r1, #1
4795; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i32
4796; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i32
4797; CHECK-ARM8-NEXT:  .LBB23_2: @ %atomicrmw.start
4798; CHECK-ARM8-NEXT:    @ Parent Loop BB23_1 Depth=1
4799; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
4800; CHECK-ARM8-NEXT:    ldrex r0, [r3]
4801; CHECK-ARM8-NEXT:    cmp r0, r1
4802; CHECK-ARM8-NEXT:    bne .LBB23_4
4803; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
4804; CHECK-ARM8-NEXT:    @ in Loop: Header=BB23_2 Depth=2
4805; CHECK-ARM8-NEXT:    strex r2, r12, [r3]
4806; CHECK-ARM8-NEXT:    cmp r2, #0
4807; CHECK-ARM8-NEXT:    bne .LBB23_2
4808; CHECK-ARM8-NEXT:  .LBB23_4: @ %atomicrmw.start
4809; CHECK-ARM8-NEXT:    @ in Loop: Header=BB23_1 Depth=1
4810; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
4811; CHECK-ARM8-NEXT:    sub r1, r0, r1
4812; CHECK-ARM8-NEXT:    clz r1, r1
4813; CHECK-ARM8-NEXT:    lsr r1, r1, #5
4814; CHECK-ARM8-NEXT:    cmp r1, #1
4815; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
4816; CHECK-ARM8-NEXT:    bne .LBB23_1
4817; CHECK-ARM8-NEXT:    b .LBB23_5
4818; CHECK-ARM8-NEXT:  .LBB23_5: @ %atomicrmw.end
4819; CHECK-ARM8-NEXT:    ldr r0, [sp] @ 4-byte Reload
4820; CHECK-ARM8-NEXT:    add sp, sp, #8
4821; CHECK-ARM8-NEXT:    bx lr
4822;
4823; CHECK-ARM6-LABEL: test_add_i32:
4824; CHECK-ARM6:       @ %bb.0: @ %entry
4825; CHECK-ARM6-NEXT:    .pad #8
4826; CHECK-ARM6-NEXT:    sub sp, sp, #8
4827; CHECK-ARM6-NEXT:    ldr r0, .LCPI23_0
4828; CHECK-ARM6-NEXT:    ldr r0, [r0]
4829; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
4830; CHECK-ARM6-NEXT:    b .LBB23_1
4831; CHECK-ARM6-NEXT:  .LBB23_1: @ %atomicrmw.start
4832; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
4833; CHECK-ARM6-NEXT:    @ Child Loop BB23_2 Depth 2
4834; CHECK-ARM6-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
4835; CHECK-ARM6-NEXT:    add r12, r1, #1
4836; CHECK-ARM6-NEXT:    ldr r3, .LCPI23_0
4837; CHECK-ARM6-NEXT:  .LBB23_2: @ %atomicrmw.start
4838; CHECK-ARM6-NEXT:    @ Parent Loop BB23_1 Depth=1
4839; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
4840; CHECK-ARM6-NEXT:    ldrex r0, [r3]
4841; CHECK-ARM6-NEXT:    cmp r0, r1
4842; CHECK-ARM6-NEXT:    bne .LBB23_4
4843; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
4844; CHECK-ARM6-NEXT:    @ in Loop: Header=BB23_2 Depth=2
4845; CHECK-ARM6-NEXT:    strex r2, r12, [r3]
4846; CHECK-ARM6-NEXT:    cmp r2, #0
4847; CHECK-ARM6-NEXT:    bne .LBB23_2
4848; CHECK-ARM6-NEXT:  .LBB23_4: @ %atomicrmw.start
4849; CHECK-ARM6-NEXT:    @ in Loop: Header=BB23_1 Depth=1
4850; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
4851; CHECK-ARM6-NEXT:    sub r1, r0, r1
4852; CHECK-ARM6-NEXT:    clz r1, r1
4853; CHECK-ARM6-NEXT:    lsr r1, r1, #5
4854; CHECK-ARM6-NEXT:    cmp r1, #1
4855; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
4856; CHECK-ARM6-NEXT:    bne .LBB23_1
4857; CHECK-ARM6-NEXT:    b .LBB23_5
4858; CHECK-ARM6-NEXT:  .LBB23_5: @ %atomicrmw.end
4859; CHECK-ARM6-NEXT:    ldr r0, [sp] @ 4-byte Reload
4860; CHECK-ARM6-NEXT:    add sp, sp, #8
4861; CHECK-ARM6-NEXT:    bx lr
4862; CHECK-ARM6-NEXT:    .p2align 2
4863; CHECK-ARM6-NEXT:  @ %bb.6:
4864; CHECK-ARM6-NEXT:  .LCPI23_0:
4865; CHECK-ARM6-NEXT:    .long atomic_i32
4866;
4867; CHECK-THUMB7-LABEL: test_add_i32:
4868; CHECK-THUMB7:       @ %bb.0: @ %entry
4869; CHECK-THUMB7-NEXT:    .pad #8
4870; CHECK-THUMB7-NEXT:    sub sp, #8
4871; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i32
4872; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i32
4873; CHECK-THUMB7-NEXT:    ldr r0, [r0]
4874; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
4875; CHECK-THUMB7-NEXT:    b .LBB23_1
4876; CHECK-THUMB7-NEXT:  .LBB23_1: @ %atomicrmw.start
4877; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
4878; CHECK-THUMB7-NEXT:    @ Child Loop BB23_2 Depth 2
4879; CHECK-THUMB7-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
4880; CHECK-THUMB7-NEXT:    add.w r12, r1, #1
4881; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i32
4882; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i32
4883; CHECK-THUMB7-NEXT:  .LBB23_2: @ %atomicrmw.start
4884; CHECK-THUMB7-NEXT:    @ Parent Loop BB23_1 Depth=1
4885; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
4886; CHECK-THUMB7-NEXT:    ldrex r0, [r3]
4887; CHECK-THUMB7-NEXT:    cmp r0, r1
4888; CHECK-THUMB7-NEXT:    bne .LBB23_4
4889; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
4890; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB23_2 Depth=2
4891; CHECK-THUMB7-NEXT:    strex r2, r12, [r3]
4892; CHECK-THUMB7-NEXT:    cmp r2, #0
4893; CHECK-THUMB7-NEXT:    bne .LBB23_2
4894; CHECK-THUMB7-NEXT:  .LBB23_4: @ %atomicrmw.start
4895; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB23_1 Depth=1
4896; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
4897; CHECK-THUMB7-NEXT:    subs r1, r0, r1
4898; CHECK-THUMB7-NEXT:    clz r1, r1
4899; CHECK-THUMB7-NEXT:    lsrs r1, r1, #5
4900; CHECK-THUMB7-NEXT:    cmp r1, #1
4901; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
4902; CHECK-THUMB7-NEXT:    bne .LBB23_1
4903; CHECK-THUMB7-NEXT:    b .LBB23_5
4904; CHECK-THUMB7-NEXT:  .LBB23_5: @ %atomicrmw.end
4905; CHECK-THUMB7-NEXT:    ldr r0, [sp] @ 4-byte Reload
4906; CHECK-THUMB7-NEXT:    add sp, #8
4907; CHECK-THUMB7-NEXT:    bx lr
4908;
4909; CHECK-THUMB6-LABEL: test_add_i32:
4910; CHECK-THUMB6:       @ %bb.0: @ %entry
4911; CHECK-THUMB6-NEXT:    .save {r7, lr}
4912; CHECK-THUMB6-NEXT:    push {r7, lr}
4913; CHECK-THUMB6-NEXT:    ldr r0, .LCPI23_0
4914; CHECK-THUMB6-NEXT:    movs r1, #1
4915; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_add_4
4916; CHECK-THUMB6-NEXT:    pop {r7, pc}
4917; CHECK-THUMB6-NEXT:    .p2align 2
4918; CHECK-THUMB6-NEXT:  @ %bb.1:
4919; CHECK-THUMB6-NEXT:  .LCPI23_0:
4920; CHECK-THUMB6-NEXT:    .long atomic_i32
4921;
4922; CHECK-THUMB8BASE-LABEL: test_add_i32:
4923; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
4924; CHECK-THUMB8BASE-NEXT:    .save {r4, lr}
4925; CHECK-THUMB8BASE-NEXT:    push {r4, lr}
4926; CHECK-THUMB8BASE-NEXT:    .pad #8
4927; CHECK-THUMB8BASE-NEXT:    sub sp, #8
4928; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i32
4929; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i32
4930; CHECK-THUMB8BASE-NEXT:    ldr r0, [r0]
4931; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
4932; CHECK-THUMB8BASE-NEXT:    b .LBB23_1
4933; CHECK-THUMB8BASE-NEXT:  .LBB23_1: @ %atomicrmw.start
4934; CHECK-THUMB8BASE-NEXT:    @ =>This Loop Header: Depth=1
4935; CHECK-THUMB8BASE-NEXT:    @ Child Loop BB23_2 Depth 2
4936; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
4937; CHECK-THUMB8BASE-NEXT:    adds r4, r1, #1
4938; CHECK-THUMB8BASE-NEXT:    movw r3, :lower16:atomic_i32
4939; CHECK-THUMB8BASE-NEXT:    movt r3, :upper16:atomic_i32
4940; CHECK-THUMB8BASE-NEXT:  .LBB23_2: @ %atomicrmw.start
4941; CHECK-THUMB8BASE-NEXT:    @ Parent Loop BB23_1 Depth=1
4942; CHECK-THUMB8BASE-NEXT:    @ => This Inner Loop Header: Depth=2
4943; CHECK-THUMB8BASE-NEXT:    ldrex r0, [r3]
4944; CHECK-THUMB8BASE-NEXT:    cmp r0, r1
4945; CHECK-THUMB8BASE-NEXT:    bne .LBB23_4
4946; CHECK-THUMB8BASE-NEXT:  @ %bb.3: @ %atomicrmw.start
4947; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB23_2 Depth=2
4948; CHECK-THUMB8BASE-NEXT:    strex r2, r4, [r3]
4949; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
4950; CHECK-THUMB8BASE-NEXT:    bne .LBB23_2
4951; CHECK-THUMB8BASE-NEXT:  .LBB23_4: @ %atomicrmw.start
4952; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB23_1 Depth=1
4953; CHECK-THUMB8BASE-NEXT:    str r0, [sp] @ 4-byte Spill
4954; CHECK-THUMB8BASE-NEXT:    subs r1, r0, r1
4955; CHECK-THUMB8BASE-NEXT:    rsbs r2, r1, #0
4956; CHECK-THUMB8BASE-NEXT:    adcs r1, r2
4957; CHECK-THUMB8BASE-NEXT:    cmp r1, #1
4958; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
4959; CHECK-THUMB8BASE-NEXT:    bne .LBB23_1
4960; CHECK-THUMB8BASE-NEXT:    b .LBB23_5
4961; CHECK-THUMB8BASE-NEXT:  .LBB23_5: @ %atomicrmw.end
4962; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp] @ 4-byte Reload
4963; CHECK-THUMB8BASE-NEXT:    add sp, #8
4964; CHECK-THUMB8BASE-NEXT:    pop {r4, pc}
4965entry:
4966  %0 = atomicrmw add i32* @atomic_i32, i32 1 monotonic
4967  ret i32 %0
4968}
4969define i32 @test_sub_i32() {
4970; CHECK-ARM8-LABEL: test_sub_i32:
4971; CHECK-ARM8:       @ %bb.0: @ %entry
4972; CHECK-ARM8-NEXT:    .pad #8
4973; CHECK-ARM8-NEXT:    sub sp, sp, #8
4974; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i32
4975; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i32
4976; CHECK-ARM8-NEXT:    ldr r0, [r0]
4977; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
4978; CHECK-ARM8-NEXT:    b .LBB24_1
4979; CHECK-ARM8-NEXT:  .LBB24_1: @ %atomicrmw.start
4980; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
4981; CHECK-ARM8-NEXT:    @ Child Loop BB24_2 Depth 2
4982; CHECK-ARM8-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
4983; CHECK-ARM8-NEXT:    sub r12, r1, #1
4984; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i32
4985; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i32
4986; CHECK-ARM8-NEXT:  .LBB24_2: @ %atomicrmw.start
4987; CHECK-ARM8-NEXT:    @ Parent Loop BB24_1 Depth=1
4988; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
4989; CHECK-ARM8-NEXT:    ldrex r0, [r3]
4990; CHECK-ARM8-NEXT:    cmp r0, r1
4991; CHECK-ARM8-NEXT:    bne .LBB24_4
4992; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
4993; CHECK-ARM8-NEXT:    @ in Loop: Header=BB24_2 Depth=2
4994; CHECK-ARM8-NEXT:    strex r2, r12, [r3]
4995; CHECK-ARM8-NEXT:    cmp r2, #0
4996; CHECK-ARM8-NEXT:    bne .LBB24_2
4997; CHECK-ARM8-NEXT:  .LBB24_4: @ %atomicrmw.start
4998; CHECK-ARM8-NEXT:    @ in Loop: Header=BB24_1 Depth=1
4999; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
5000; CHECK-ARM8-NEXT:    sub r1, r0, r1
5001; CHECK-ARM8-NEXT:    clz r1, r1
5002; CHECK-ARM8-NEXT:    lsr r1, r1, #5
5003; CHECK-ARM8-NEXT:    cmp r1, #1
5004; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5005; CHECK-ARM8-NEXT:    bne .LBB24_1
5006; CHECK-ARM8-NEXT:    b .LBB24_5
5007; CHECK-ARM8-NEXT:  .LBB24_5: @ %atomicrmw.end
5008; CHECK-ARM8-NEXT:    ldr r0, [sp] @ 4-byte Reload
5009; CHECK-ARM8-NEXT:    add sp, sp, #8
5010; CHECK-ARM8-NEXT:    bx lr
5011;
5012; CHECK-ARM6-LABEL: test_sub_i32:
5013; CHECK-ARM6:       @ %bb.0: @ %entry
5014; CHECK-ARM6-NEXT:    .pad #8
5015; CHECK-ARM6-NEXT:    sub sp, sp, #8
5016; CHECK-ARM6-NEXT:    ldr r0, .LCPI24_0
5017; CHECK-ARM6-NEXT:    ldr r0, [r0]
5018; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5019; CHECK-ARM6-NEXT:    b .LBB24_1
5020; CHECK-ARM6-NEXT:  .LBB24_1: @ %atomicrmw.start
5021; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
5022; CHECK-ARM6-NEXT:    @ Child Loop BB24_2 Depth 2
5023; CHECK-ARM6-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
5024; CHECK-ARM6-NEXT:    sub r12, r1, #1
5025; CHECK-ARM6-NEXT:    ldr r3, .LCPI24_0
5026; CHECK-ARM6-NEXT:  .LBB24_2: @ %atomicrmw.start
5027; CHECK-ARM6-NEXT:    @ Parent Loop BB24_1 Depth=1
5028; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
5029; CHECK-ARM6-NEXT:    ldrex r0, [r3]
5030; CHECK-ARM6-NEXT:    cmp r0, r1
5031; CHECK-ARM6-NEXT:    bne .LBB24_4
5032; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
5033; CHECK-ARM6-NEXT:    @ in Loop: Header=BB24_2 Depth=2
5034; CHECK-ARM6-NEXT:    strex r2, r12, [r3]
5035; CHECK-ARM6-NEXT:    cmp r2, #0
5036; CHECK-ARM6-NEXT:    bne .LBB24_2
5037; CHECK-ARM6-NEXT:  .LBB24_4: @ %atomicrmw.start
5038; CHECK-ARM6-NEXT:    @ in Loop: Header=BB24_1 Depth=1
5039; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
5040; CHECK-ARM6-NEXT:    sub r1, r0, r1
5041; CHECK-ARM6-NEXT:    clz r1, r1
5042; CHECK-ARM6-NEXT:    lsr r1, r1, #5
5043; CHECK-ARM6-NEXT:    cmp r1, #1
5044; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5045; CHECK-ARM6-NEXT:    bne .LBB24_1
5046; CHECK-ARM6-NEXT:    b .LBB24_5
5047; CHECK-ARM6-NEXT:  .LBB24_5: @ %atomicrmw.end
5048; CHECK-ARM6-NEXT:    ldr r0, [sp] @ 4-byte Reload
5049; CHECK-ARM6-NEXT:    add sp, sp, #8
5050; CHECK-ARM6-NEXT:    bx lr
5051; CHECK-ARM6-NEXT:    .p2align 2
5052; CHECK-ARM6-NEXT:  @ %bb.6:
5053; CHECK-ARM6-NEXT:  .LCPI24_0:
5054; CHECK-ARM6-NEXT:    .long atomic_i32
5055;
5056; CHECK-THUMB7-LABEL: test_sub_i32:
5057; CHECK-THUMB7:       @ %bb.0: @ %entry
5058; CHECK-THUMB7-NEXT:    .pad #8
5059; CHECK-THUMB7-NEXT:    sub sp, #8
5060; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i32
5061; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i32
5062; CHECK-THUMB7-NEXT:    ldr r0, [r0]
5063; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5064; CHECK-THUMB7-NEXT:    b .LBB24_1
5065; CHECK-THUMB7-NEXT:  .LBB24_1: @ %atomicrmw.start
5066; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
5067; CHECK-THUMB7-NEXT:    @ Child Loop BB24_2 Depth 2
5068; CHECK-THUMB7-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
5069; CHECK-THUMB7-NEXT:    sub.w r12, r1, #1
5070; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i32
5071; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i32
5072; CHECK-THUMB7-NEXT:  .LBB24_2: @ %atomicrmw.start
5073; CHECK-THUMB7-NEXT:    @ Parent Loop BB24_1 Depth=1
5074; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
5075; CHECK-THUMB7-NEXT:    ldrex r0, [r3]
5076; CHECK-THUMB7-NEXT:    cmp r0, r1
5077; CHECK-THUMB7-NEXT:    bne .LBB24_4
5078; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
5079; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB24_2 Depth=2
5080; CHECK-THUMB7-NEXT:    strex r2, r12, [r3]
5081; CHECK-THUMB7-NEXT:    cmp r2, #0
5082; CHECK-THUMB7-NEXT:    bne .LBB24_2
5083; CHECK-THUMB7-NEXT:  .LBB24_4: @ %atomicrmw.start
5084; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB24_1 Depth=1
5085; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
5086; CHECK-THUMB7-NEXT:    subs r1, r0, r1
5087; CHECK-THUMB7-NEXT:    clz r1, r1
5088; CHECK-THUMB7-NEXT:    lsrs r1, r1, #5
5089; CHECK-THUMB7-NEXT:    cmp r1, #1
5090; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5091; CHECK-THUMB7-NEXT:    bne .LBB24_1
5092; CHECK-THUMB7-NEXT:    b .LBB24_5
5093; CHECK-THUMB7-NEXT:  .LBB24_5: @ %atomicrmw.end
5094; CHECK-THUMB7-NEXT:    ldr r0, [sp] @ 4-byte Reload
5095; CHECK-THUMB7-NEXT:    add sp, #8
5096; CHECK-THUMB7-NEXT:    bx lr
5097;
5098; CHECK-THUMB6-LABEL: test_sub_i32:
5099; CHECK-THUMB6:       @ %bb.0: @ %entry
5100; CHECK-THUMB6-NEXT:    .save {r7, lr}
5101; CHECK-THUMB6-NEXT:    push {r7, lr}
5102; CHECK-THUMB6-NEXT:    ldr r0, .LCPI24_0
5103; CHECK-THUMB6-NEXT:    movs r1, #1
5104; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_sub_4
5105; CHECK-THUMB6-NEXT:    pop {r7, pc}
5106; CHECK-THUMB6-NEXT:    .p2align 2
5107; CHECK-THUMB6-NEXT:  @ %bb.1:
5108; CHECK-THUMB6-NEXT:  .LCPI24_0:
5109; CHECK-THUMB6-NEXT:    .long atomic_i32
5110;
5111; CHECK-THUMB8BASE-LABEL: test_sub_i32:
5112; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
5113; CHECK-THUMB8BASE-NEXT:    .save {r4, lr}
5114; CHECK-THUMB8BASE-NEXT:    push {r4, lr}
5115; CHECK-THUMB8BASE-NEXT:    .pad #8
5116; CHECK-THUMB8BASE-NEXT:    sub sp, #8
5117; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i32
5118; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i32
5119; CHECK-THUMB8BASE-NEXT:    ldr r0, [r0]
5120; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5121; CHECK-THUMB8BASE-NEXT:    b .LBB24_1
5122; CHECK-THUMB8BASE-NEXT:  .LBB24_1: @ %atomicrmw.start
5123; CHECK-THUMB8BASE-NEXT:    @ =>This Loop Header: Depth=1
5124; CHECK-THUMB8BASE-NEXT:    @ Child Loop BB24_2 Depth 2
5125; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
5126; CHECK-THUMB8BASE-NEXT:    subs r4, r1, #1
5127; CHECK-THUMB8BASE-NEXT:    movw r3, :lower16:atomic_i32
5128; CHECK-THUMB8BASE-NEXT:    movt r3, :upper16:atomic_i32
5129; CHECK-THUMB8BASE-NEXT:  .LBB24_2: @ %atomicrmw.start
5130; CHECK-THUMB8BASE-NEXT:    @ Parent Loop BB24_1 Depth=1
5131; CHECK-THUMB8BASE-NEXT:    @ => This Inner Loop Header: Depth=2
5132; CHECK-THUMB8BASE-NEXT:    ldrex r0, [r3]
5133; CHECK-THUMB8BASE-NEXT:    cmp r0, r1
5134; CHECK-THUMB8BASE-NEXT:    bne .LBB24_4
5135; CHECK-THUMB8BASE-NEXT:  @ %bb.3: @ %atomicrmw.start
5136; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB24_2 Depth=2
5137; CHECK-THUMB8BASE-NEXT:    strex r2, r4, [r3]
5138; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
5139; CHECK-THUMB8BASE-NEXT:    bne .LBB24_2
5140; CHECK-THUMB8BASE-NEXT:  .LBB24_4: @ %atomicrmw.start
5141; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB24_1 Depth=1
5142; CHECK-THUMB8BASE-NEXT:    str r0, [sp] @ 4-byte Spill
5143; CHECK-THUMB8BASE-NEXT:    subs r1, r0, r1
5144; CHECK-THUMB8BASE-NEXT:    rsbs r2, r1, #0
5145; CHECK-THUMB8BASE-NEXT:    adcs r1, r2
5146; CHECK-THUMB8BASE-NEXT:    cmp r1, #1
5147; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5148; CHECK-THUMB8BASE-NEXT:    bne .LBB24_1
5149; CHECK-THUMB8BASE-NEXT:    b .LBB24_5
5150; CHECK-THUMB8BASE-NEXT:  .LBB24_5: @ %atomicrmw.end
5151; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp] @ 4-byte Reload
5152; CHECK-THUMB8BASE-NEXT:    add sp, #8
5153; CHECK-THUMB8BASE-NEXT:    pop {r4, pc}
5154entry:
5155  %0 = atomicrmw sub i32* @atomic_i32, i32 1 monotonic
5156  ret i32 %0
5157}
5158define i32 @test_and_i32() {
5159; CHECK-ARM8-LABEL: test_and_i32:
5160; CHECK-ARM8:       @ %bb.0: @ %entry
5161; CHECK-ARM8-NEXT:    .pad #8
5162; CHECK-ARM8-NEXT:    sub sp, sp, #8
5163; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i32
5164; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i32
5165; CHECK-ARM8-NEXT:    ldr r0, [r0]
5166; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5167; CHECK-ARM8-NEXT:    b .LBB25_1
5168; CHECK-ARM8-NEXT:  .LBB25_1: @ %atomicrmw.start
5169; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
5170; CHECK-ARM8-NEXT:    @ Child Loop BB25_2 Depth 2
5171; CHECK-ARM8-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
5172; CHECK-ARM8-NEXT:    and r12, r1, #1
5173; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i32
5174; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i32
5175; CHECK-ARM8-NEXT:  .LBB25_2: @ %atomicrmw.start
5176; CHECK-ARM8-NEXT:    @ Parent Loop BB25_1 Depth=1
5177; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
5178; CHECK-ARM8-NEXT:    ldrex r0, [r3]
5179; CHECK-ARM8-NEXT:    cmp r0, r1
5180; CHECK-ARM8-NEXT:    bne .LBB25_4
5181; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
5182; CHECK-ARM8-NEXT:    @ in Loop: Header=BB25_2 Depth=2
5183; CHECK-ARM8-NEXT:    strex r2, r12, [r3]
5184; CHECK-ARM8-NEXT:    cmp r2, #0
5185; CHECK-ARM8-NEXT:    bne .LBB25_2
5186; CHECK-ARM8-NEXT:  .LBB25_4: @ %atomicrmw.start
5187; CHECK-ARM8-NEXT:    @ in Loop: Header=BB25_1 Depth=1
5188; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
5189; CHECK-ARM8-NEXT:    sub r1, r0, r1
5190; CHECK-ARM8-NEXT:    clz r1, r1
5191; CHECK-ARM8-NEXT:    lsr r1, r1, #5
5192; CHECK-ARM8-NEXT:    cmp r1, #1
5193; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5194; CHECK-ARM8-NEXT:    bne .LBB25_1
5195; CHECK-ARM8-NEXT:    b .LBB25_5
5196; CHECK-ARM8-NEXT:  .LBB25_5: @ %atomicrmw.end
5197; CHECK-ARM8-NEXT:    ldr r0, [sp] @ 4-byte Reload
5198; CHECK-ARM8-NEXT:    add sp, sp, #8
5199; CHECK-ARM8-NEXT:    bx lr
5200;
5201; CHECK-ARM6-LABEL: test_and_i32:
5202; CHECK-ARM6:       @ %bb.0: @ %entry
5203; CHECK-ARM6-NEXT:    .pad #8
5204; CHECK-ARM6-NEXT:    sub sp, sp, #8
5205; CHECK-ARM6-NEXT:    ldr r0, .LCPI25_0
5206; CHECK-ARM6-NEXT:    ldr r0, [r0]
5207; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5208; CHECK-ARM6-NEXT:    b .LBB25_1
5209; CHECK-ARM6-NEXT:  .LBB25_1: @ %atomicrmw.start
5210; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
5211; CHECK-ARM6-NEXT:    @ Child Loop BB25_2 Depth 2
5212; CHECK-ARM6-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
5213; CHECK-ARM6-NEXT:    and r12, r1, #1
5214; CHECK-ARM6-NEXT:    ldr r3, .LCPI25_0
5215; CHECK-ARM6-NEXT:  .LBB25_2: @ %atomicrmw.start
5216; CHECK-ARM6-NEXT:    @ Parent Loop BB25_1 Depth=1
5217; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
5218; CHECK-ARM6-NEXT:    ldrex r0, [r3]
5219; CHECK-ARM6-NEXT:    cmp r0, r1
5220; CHECK-ARM6-NEXT:    bne .LBB25_4
5221; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
5222; CHECK-ARM6-NEXT:    @ in Loop: Header=BB25_2 Depth=2
5223; CHECK-ARM6-NEXT:    strex r2, r12, [r3]
5224; CHECK-ARM6-NEXT:    cmp r2, #0
5225; CHECK-ARM6-NEXT:    bne .LBB25_2
5226; CHECK-ARM6-NEXT:  .LBB25_4: @ %atomicrmw.start
5227; CHECK-ARM6-NEXT:    @ in Loop: Header=BB25_1 Depth=1
5228; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
5229; CHECK-ARM6-NEXT:    sub r1, r0, r1
5230; CHECK-ARM6-NEXT:    clz r1, r1
5231; CHECK-ARM6-NEXT:    lsr r1, r1, #5
5232; CHECK-ARM6-NEXT:    cmp r1, #1
5233; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5234; CHECK-ARM6-NEXT:    bne .LBB25_1
5235; CHECK-ARM6-NEXT:    b .LBB25_5
5236; CHECK-ARM6-NEXT:  .LBB25_5: @ %atomicrmw.end
5237; CHECK-ARM6-NEXT:    ldr r0, [sp] @ 4-byte Reload
5238; CHECK-ARM6-NEXT:    add sp, sp, #8
5239; CHECK-ARM6-NEXT:    bx lr
5240; CHECK-ARM6-NEXT:    .p2align 2
5241; CHECK-ARM6-NEXT:  @ %bb.6:
5242; CHECK-ARM6-NEXT:  .LCPI25_0:
5243; CHECK-ARM6-NEXT:    .long atomic_i32
5244;
5245; CHECK-THUMB7-LABEL: test_and_i32:
5246; CHECK-THUMB7:       @ %bb.0: @ %entry
5247; CHECK-THUMB7-NEXT:    .pad #8
5248; CHECK-THUMB7-NEXT:    sub sp, #8
5249; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i32
5250; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i32
5251; CHECK-THUMB7-NEXT:    ldr r0, [r0]
5252; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5253; CHECK-THUMB7-NEXT:    b .LBB25_1
5254; CHECK-THUMB7-NEXT:  .LBB25_1: @ %atomicrmw.start
5255; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
5256; CHECK-THUMB7-NEXT:    @ Child Loop BB25_2 Depth 2
5257; CHECK-THUMB7-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
5258; CHECK-THUMB7-NEXT:    and r12, r1, #1
5259; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i32
5260; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i32
5261; CHECK-THUMB7-NEXT:  .LBB25_2: @ %atomicrmw.start
5262; CHECK-THUMB7-NEXT:    @ Parent Loop BB25_1 Depth=1
5263; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
5264; CHECK-THUMB7-NEXT:    ldrex r0, [r3]
5265; CHECK-THUMB7-NEXT:    cmp r0, r1
5266; CHECK-THUMB7-NEXT:    bne .LBB25_4
5267; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
5268; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB25_2 Depth=2
5269; CHECK-THUMB7-NEXT:    strex r2, r12, [r3]
5270; CHECK-THUMB7-NEXT:    cmp r2, #0
5271; CHECK-THUMB7-NEXT:    bne .LBB25_2
5272; CHECK-THUMB7-NEXT:  .LBB25_4: @ %atomicrmw.start
5273; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB25_1 Depth=1
5274; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
5275; CHECK-THUMB7-NEXT:    subs r1, r0, r1
5276; CHECK-THUMB7-NEXT:    clz r1, r1
5277; CHECK-THUMB7-NEXT:    lsrs r1, r1, #5
5278; CHECK-THUMB7-NEXT:    cmp r1, #1
5279; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5280; CHECK-THUMB7-NEXT:    bne .LBB25_1
5281; CHECK-THUMB7-NEXT:    b .LBB25_5
5282; CHECK-THUMB7-NEXT:  .LBB25_5: @ %atomicrmw.end
5283; CHECK-THUMB7-NEXT:    ldr r0, [sp] @ 4-byte Reload
5284; CHECK-THUMB7-NEXT:    add sp, #8
5285; CHECK-THUMB7-NEXT:    bx lr
5286;
5287; CHECK-THUMB6-LABEL: test_and_i32:
5288; CHECK-THUMB6:       @ %bb.0: @ %entry
5289; CHECK-THUMB6-NEXT:    .save {r7, lr}
5290; CHECK-THUMB6-NEXT:    push {r7, lr}
5291; CHECK-THUMB6-NEXT:    ldr r0, .LCPI25_0
5292; CHECK-THUMB6-NEXT:    movs r1, #1
5293; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_and_4
5294; CHECK-THUMB6-NEXT:    pop {r7, pc}
5295; CHECK-THUMB6-NEXT:    .p2align 2
5296; CHECK-THUMB6-NEXT:  @ %bb.1:
5297; CHECK-THUMB6-NEXT:  .LCPI25_0:
5298; CHECK-THUMB6-NEXT:    .long atomic_i32
5299;
5300; CHECK-THUMB8BASE-LABEL: test_and_i32:
5301; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
5302; CHECK-THUMB8BASE-NEXT:    .save {r4, lr}
5303; CHECK-THUMB8BASE-NEXT:    push {r4, lr}
5304; CHECK-THUMB8BASE-NEXT:    .pad #8
5305; CHECK-THUMB8BASE-NEXT:    sub sp, #8
5306; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i32
5307; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i32
5308; CHECK-THUMB8BASE-NEXT:    ldr r0, [r0]
5309; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5310; CHECK-THUMB8BASE-NEXT:    b .LBB25_1
5311; CHECK-THUMB8BASE-NEXT:  .LBB25_1: @ %atomicrmw.start
5312; CHECK-THUMB8BASE-NEXT:    @ =>This Loop Header: Depth=1
5313; CHECK-THUMB8BASE-NEXT:    @ Child Loop BB25_2 Depth 2
5314; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
5315; CHECK-THUMB8BASE-NEXT:    movs r0, #1
5316; CHECK-THUMB8BASE-NEXT:    mov r4, r1
5317; CHECK-THUMB8BASE-NEXT:    ands r4, r0
5318; CHECK-THUMB8BASE-NEXT:    movw r3, :lower16:atomic_i32
5319; CHECK-THUMB8BASE-NEXT:    movt r3, :upper16:atomic_i32
5320; CHECK-THUMB8BASE-NEXT:  .LBB25_2: @ %atomicrmw.start
5321; CHECK-THUMB8BASE-NEXT:    @ Parent Loop BB25_1 Depth=1
5322; CHECK-THUMB8BASE-NEXT:    @ => This Inner Loop Header: Depth=2
5323; CHECK-THUMB8BASE-NEXT:    ldrex r0, [r3]
5324; CHECK-THUMB8BASE-NEXT:    cmp r0, r1
5325; CHECK-THUMB8BASE-NEXT:    bne .LBB25_4
5326; CHECK-THUMB8BASE-NEXT:  @ %bb.3: @ %atomicrmw.start
5327; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB25_2 Depth=2
5328; CHECK-THUMB8BASE-NEXT:    strex r2, r4, [r3]
5329; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
5330; CHECK-THUMB8BASE-NEXT:    bne .LBB25_2
5331; CHECK-THUMB8BASE-NEXT:  .LBB25_4: @ %atomicrmw.start
5332; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB25_1 Depth=1
5333; CHECK-THUMB8BASE-NEXT:    str r0, [sp] @ 4-byte Spill
5334; CHECK-THUMB8BASE-NEXT:    subs r1, r0, r1
5335; CHECK-THUMB8BASE-NEXT:    rsbs r2, r1, #0
5336; CHECK-THUMB8BASE-NEXT:    adcs r1, r2
5337; CHECK-THUMB8BASE-NEXT:    cmp r1, #1
5338; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5339; CHECK-THUMB8BASE-NEXT:    bne .LBB25_1
5340; CHECK-THUMB8BASE-NEXT:    b .LBB25_5
5341; CHECK-THUMB8BASE-NEXT:  .LBB25_5: @ %atomicrmw.end
5342; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp] @ 4-byte Reload
5343; CHECK-THUMB8BASE-NEXT:    add sp, #8
5344; CHECK-THUMB8BASE-NEXT:    pop {r4, pc}
5345entry:
5346  %0 = atomicrmw and i32* @atomic_i32, i32 1 monotonic
5347  ret i32 %0
5348}
5349define i32 @test_nand_i32() {
5350; CHECK-ARM8-LABEL: test_nand_i32:
5351; CHECK-ARM8:       @ %bb.0: @ %entry
5352; CHECK-ARM8-NEXT:    .pad #8
5353; CHECK-ARM8-NEXT:    sub sp, sp, #8
5354; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i32
5355; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i32
5356; CHECK-ARM8-NEXT:    ldr r0, [r0]
5357; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5358; CHECK-ARM8-NEXT:    b .LBB26_1
5359; CHECK-ARM8-NEXT:  .LBB26_1: @ %atomicrmw.start
5360; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
5361; CHECK-ARM8-NEXT:    @ Child Loop BB26_2 Depth 2
5362; CHECK-ARM8-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
5363; CHECK-ARM8-NEXT:    mvn r0, r1
5364; CHECK-ARM8-NEXT:    mvn r2, #1
5365; CHECK-ARM8-NEXT:    orr r12, r0, r2
5366; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i32
5367; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i32
5368; CHECK-ARM8-NEXT:  .LBB26_2: @ %atomicrmw.start
5369; CHECK-ARM8-NEXT:    @ Parent Loop BB26_1 Depth=1
5370; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
5371; CHECK-ARM8-NEXT:    ldrex r0, [r3]
5372; CHECK-ARM8-NEXT:    cmp r0, r1
5373; CHECK-ARM8-NEXT:    bne .LBB26_4
5374; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
5375; CHECK-ARM8-NEXT:    @ in Loop: Header=BB26_2 Depth=2
5376; CHECK-ARM8-NEXT:    strex r2, r12, [r3]
5377; CHECK-ARM8-NEXT:    cmp r2, #0
5378; CHECK-ARM8-NEXT:    bne .LBB26_2
5379; CHECK-ARM8-NEXT:  .LBB26_4: @ %atomicrmw.start
5380; CHECK-ARM8-NEXT:    @ in Loop: Header=BB26_1 Depth=1
5381; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
5382; CHECK-ARM8-NEXT:    sub r1, r0, r1
5383; CHECK-ARM8-NEXT:    clz r1, r1
5384; CHECK-ARM8-NEXT:    lsr r1, r1, #5
5385; CHECK-ARM8-NEXT:    cmp r1, #1
5386; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5387; CHECK-ARM8-NEXT:    bne .LBB26_1
5388; CHECK-ARM8-NEXT:    b .LBB26_5
5389; CHECK-ARM8-NEXT:  .LBB26_5: @ %atomicrmw.end
5390; CHECK-ARM8-NEXT:    ldr r0, [sp] @ 4-byte Reload
5391; CHECK-ARM8-NEXT:    add sp, sp, #8
5392; CHECK-ARM8-NEXT:    bx lr
5393;
5394; CHECK-ARM6-LABEL: test_nand_i32:
5395; CHECK-ARM6:       @ %bb.0: @ %entry
5396; CHECK-ARM6-NEXT:    .pad #8
5397; CHECK-ARM6-NEXT:    sub sp, sp, #8
5398; CHECK-ARM6-NEXT:    ldr r0, .LCPI26_0
5399; CHECK-ARM6-NEXT:    ldr r0, [r0]
5400; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5401; CHECK-ARM6-NEXT:    b .LBB26_1
5402; CHECK-ARM6-NEXT:  .LBB26_1: @ %atomicrmw.start
5403; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
5404; CHECK-ARM6-NEXT:    @ Child Loop BB26_2 Depth 2
5405; CHECK-ARM6-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
5406; CHECK-ARM6-NEXT:    mvn r0, r1
5407; CHECK-ARM6-NEXT:    mvn r2, #1
5408; CHECK-ARM6-NEXT:    orr r12, r0, r2
5409; CHECK-ARM6-NEXT:    ldr r3, .LCPI26_0
5410; CHECK-ARM6-NEXT:  .LBB26_2: @ %atomicrmw.start
5411; CHECK-ARM6-NEXT:    @ Parent Loop BB26_1 Depth=1
5412; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
5413; CHECK-ARM6-NEXT:    ldrex r0, [r3]
5414; CHECK-ARM6-NEXT:    cmp r0, r1
5415; CHECK-ARM6-NEXT:    bne .LBB26_4
5416; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
5417; CHECK-ARM6-NEXT:    @ in Loop: Header=BB26_2 Depth=2
5418; CHECK-ARM6-NEXT:    strex r2, r12, [r3]
5419; CHECK-ARM6-NEXT:    cmp r2, #0
5420; CHECK-ARM6-NEXT:    bne .LBB26_2
5421; CHECK-ARM6-NEXT:  .LBB26_4: @ %atomicrmw.start
5422; CHECK-ARM6-NEXT:    @ in Loop: Header=BB26_1 Depth=1
5423; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
5424; CHECK-ARM6-NEXT:    sub r1, r0, r1
5425; CHECK-ARM6-NEXT:    clz r1, r1
5426; CHECK-ARM6-NEXT:    lsr r1, r1, #5
5427; CHECK-ARM6-NEXT:    cmp r1, #1
5428; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5429; CHECK-ARM6-NEXT:    bne .LBB26_1
5430; CHECK-ARM6-NEXT:    b .LBB26_5
5431; CHECK-ARM6-NEXT:  .LBB26_5: @ %atomicrmw.end
5432; CHECK-ARM6-NEXT:    ldr r0, [sp] @ 4-byte Reload
5433; CHECK-ARM6-NEXT:    add sp, sp, #8
5434; CHECK-ARM6-NEXT:    bx lr
5435; CHECK-ARM6-NEXT:    .p2align 2
5436; CHECK-ARM6-NEXT:  @ %bb.6:
5437; CHECK-ARM6-NEXT:  .LCPI26_0:
5438; CHECK-ARM6-NEXT:    .long atomic_i32
5439;
5440; CHECK-THUMB7-LABEL: test_nand_i32:
5441; CHECK-THUMB7:       @ %bb.0: @ %entry
5442; CHECK-THUMB7-NEXT:    .pad #8
5443; CHECK-THUMB7-NEXT:    sub sp, #8
5444; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i32
5445; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i32
5446; CHECK-THUMB7-NEXT:    ldr r0, [r0]
5447; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5448; CHECK-THUMB7-NEXT:    b .LBB26_1
5449; CHECK-THUMB7-NEXT:  .LBB26_1: @ %atomicrmw.start
5450; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
5451; CHECK-THUMB7-NEXT:    @ Child Loop BB26_2 Depth 2
5452; CHECK-THUMB7-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
5453; CHECK-THUMB7-NEXT:    mvn r0, #1
5454; CHECK-THUMB7-NEXT:    orn r12, r0, r1
5455; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i32
5456; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i32
5457; CHECK-THUMB7-NEXT:  .LBB26_2: @ %atomicrmw.start
5458; CHECK-THUMB7-NEXT:    @ Parent Loop BB26_1 Depth=1
5459; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
5460; CHECK-THUMB7-NEXT:    ldrex r0, [r3]
5461; CHECK-THUMB7-NEXT:    cmp r0, r1
5462; CHECK-THUMB7-NEXT:    bne .LBB26_4
5463; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
5464; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB26_2 Depth=2
5465; CHECK-THUMB7-NEXT:    strex r2, r12, [r3]
5466; CHECK-THUMB7-NEXT:    cmp r2, #0
5467; CHECK-THUMB7-NEXT:    bne .LBB26_2
5468; CHECK-THUMB7-NEXT:  .LBB26_4: @ %atomicrmw.start
5469; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB26_1 Depth=1
5470; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
5471; CHECK-THUMB7-NEXT:    subs r1, r0, r1
5472; CHECK-THUMB7-NEXT:    clz r1, r1
5473; CHECK-THUMB7-NEXT:    lsrs r1, r1, #5
5474; CHECK-THUMB7-NEXT:    cmp r1, #1
5475; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5476; CHECK-THUMB7-NEXT:    bne .LBB26_1
5477; CHECK-THUMB7-NEXT:    b .LBB26_5
5478; CHECK-THUMB7-NEXT:  .LBB26_5: @ %atomicrmw.end
5479; CHECK-THUMB7-NEXT:    ldr r0, [sp] @ 4-byte Reload
5480; CHECK-THUMB7-NEXT:    add sp, #8
5481; CHECK-THUMB7-NEXT:    bx lr
5482;
5483; CHECK-THUMB6-LABEL: test_nand_i32:
5484; CHECK-THUMB6:       @ %bb.0: @ %entry
5485; CHECK-THUMB6-NEXT:    .save {r7, lr}
5486; CHECK-THUMB6-NEXT:    push {r7, lr}
5487; CHECK-THUMB6-NEXT:    ldr r0, .LCPI26_0
5488; CHECK-THUMB6-NEXT:    movs r1, #1
5489; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_nand_4
5490; CHECK-THUMB6-NEXT:    pop {r7, pc}
5491; CHECK-THUMB6-NEXT:    .p2align 2
5492; CHECK-THUMB6-NEXT:  @ %bb.1:
5493; CHECK-THUMB6-NEXT:  .LCPI26_0:
5494; CHECK-THUMB6-NEXT:    .long atomic_i32
5495;
5496; CHECK-THUMB8BASE-LABEL: test_nand_i32:
5497; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
5498; CHECK-THUMB8BASE-NEXT:    .save {r4, lr}
5499; CHECK-THUMB8BASE-NEXT:    push {r4, lr}
5500; CHECK-THUMB8BASE-NEXT:    .pad #8
5501; CHECK-THUMB8BASE-NEXT:    sub sp, #8
5502; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i32
5503; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i32
5504; CHECK-THUMB8BASE-NEXT:    ldr r0, [r0]
5505; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5506; CHECK-THUMB8BASE-NEXT:    b .LBB26_1
5507; CHECK-THUMB8BASE-NEXT:  .LBB26_1: @ %atomicrmw.start
5508; CHECK-THUMB8BASE-NEXT:    @ =>This Loop Header: Depth=1
5509; CHECK-THUMB8BASE-NEXT:    @ Child Loop BB26_2 Depth 2
5510; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
5511; CHECK-THUMB8BASE-NEXT:    mvns r4, r1
5512; CHECK-THUMB8BASE-NEXT:    movs r0, #1
5513; CHECK-THUMB8BASE-NEXT:    mvns r0, r0
5514; CHECK-THUMB8BASE-NEXT:    orrs r4, r0
5515; CHECK-THUMB8BASE-NEXT:    movw r3, :lower16:atomic_i32
5516; CHECK-THUMB8BASE-NEXT:    movt r3, :upper16:atomic_i32
5517; CHECK-THUMB8BASE-NEXT:  .LBB26_2: @ %atomicrmw.start
5518; CHECK-THUMB8BASE-NEXT:    @ Parent Loop BB26_1 Depth=1
5519; CHECK-THUMB8BASE-NEXT:    @ => This Inner Loop Header: Depth=2
5520; CHECK-THUMB8BASE-NEXT:    ldrex r0, [r3]
5521; CHECK-THUMB8BASE-NEXT:    cmp r0, r1
5522; CHECK-THUMB8BASE-NEXT:    bne .LBB26_4
5523; CHECK-THUMB8BASE-NEXT:  @ %bb.3: @ %atomicrmw.start
5524; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB26_2 Depth=2
5525; CHECK-THUMB8BASE-NEXT:    strex r2, r4, [r3]
5526; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
5527; CHECK-THUMB8BASE-NEXT:    bne .LBB26_2
5528; CHECK-THUMB8BASE-NEXT:  .LBB26_4: @ %atomicrmw.start
5529; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB26_1 Depth=1
5530; CHECK-THUMB8BASE-NEXT:    str r0, [sp] @ 4-byte Spill
5531; CHECK-THUMB8BASE-NEXT:    subs r1, r0, r1
5532; CHECK-THUMB8BASE-NEXT:    rsbs r2, r1, #0
5533; CHECK-THUMB8BASE-NEXT:    adcs r1, r2
5534; CHECK-THUMB8BASE-NEXT:    cmp r1, #1
5535; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5536; CHECK-THUMB8BASE-NEXT:    bne .LBB26_1
5537; CHECK-THUMB8BASE-NEXT:    b .LBB26_5
5538; CHECK-THUMB8BASE-NEXT:  .LBB26_5: @ %atomicrmw.end
5539; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp] @ 4-byte Reload
5540; CHECK-THUMB8BASE-NEXT:    add sp, #8
5541; CHECK-THUMB8BASE-NEXT:    pop {r4, pc}
5542entry:
5543  %0 = atomicrmw nand i32* @atomic_i32, i32 1 monotonic
5544  ret i32 %0
5545}
5546define i32 @test_or_i32() {
5547; CHECK-ARM8-LABEL: test_or_i32:
5548; CHECK-ARM8:       @ %bb.0: @ %entry
5549; CHECK-ARM8-NEXT:    .pad #8
5550; CHECK-ARM8-NEXT:    sub sp, sp, #8
5551; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i32
5552; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i32
5553; CHECK-ARM8-NEXT:    ldr r0, [r0]
5554; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5555; CHECK-ARM8-NEXT:    b .LBB27_1
5556; CHECK-ARM8-NEXT:  .LBB27_1: @ %atomicrmw.start
5557; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
5558; CHECK-ARM8-NEXT:    @ Child Loop BB27_2 Depth 2
5559; CHECK-ARM8-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
5560; CHECK-ARM8-NEXT:    orr r12, r1, #1
5561; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i32
5562; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i32
5563; CHECK-ARM8-NEXT:  .LBB27_2: @ %atomicrmw.start
5564; CHECK-ARM8-NEXT:    @ Parent Loop BB27_1 Depth=1
5565; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
5566; CHECK-ARM8-NEXT:    ldrex r0, [r3]
5567; CHECK-ARM8-NEXT:    cmp r0, r1
5568; CHECK-ARM8-NEXT:    bne .LBB27_4
5569; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
5570; CHECK-ARM8-NEXT:    @ in Loop: Header=BB27_2 Depth=2
5571; CHECK-ARM8-NEXT:    strex r2, r12, [r3]
5572; CHECK-ARM8-NEXT:    cmp r2, #0
5573; CHECK-ARM8-NEXT:    bne .LBB27_2
5574; CHECK-ARM8-NEXT:  .LBB27_4: @ %atomicrmw.start
5575; CHECK-ARM8-NEXT:    @ in Loop: Header=BB27_1 Depth=1
5576; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
5577; CHECK-ARM8-NEXT:    sub r1, r0, r1
5578; CHECK-ARM8-NEXT:    clz r1, r1
5579; CHECK-ARM8-NEXT:    lsr r1, r1, #5
5580; CHECK-ARM8-NEXT:    cmp r1, #1
5581; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5582; CHECK-ARM8-NEXT:    bne .LBB27_1
5583; CHECK-ARM8-NEXT:    b .LBB27_5
5584; CHECK-ARM8-NEXT:  .LBB27_5: @ %atomicrmw.end
5585; CHECK-ARM8-NEXT:    ldr r0, [sp] @ 4-byte Reload
5586; CHECK-ARM8-NEXT:    add sp, sp, #8
5587; CHECK-ARM8-NEXT:    bx lr
5588;
5589; CHECK-ARM6-LABEL: test_or_i32:
5590; CHECK-ARM6:       @ %bb.0: @ %entry
5591; CHECK-ARM6-NEXT:    .pad #8
5592; CHECK-ARM6-NEXT:    sub sp, sp, #8
5593; CHECK-ARM6-NEXT:    ldr r0, .LCPI27_0
5594; CHECK-ARM6-NEXT:    ldr r0, [r0]
5595; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5596; CHECK-ARM6-NEXT:    b .LBB27_1
5597; CHECK-ARM6-NEXT:  .LBB27_1: @ %atomicrmw.start
5598; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
5599; CHECK-ARM6-NEXT:    @ Child Loop BB27_2 Depth 2
5600; CHECK-ARM6-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
5601; CHECK-ARM6-NEXT:    orr r12, r1, #1
5602; CHECK-ARM6-NEXT:    ldr r3, .LCPI27_0
5603; CHECK-ARM6-NEXT:  .LBB27_2: @ %atomicrmw.start
5604; CHECK-ARM6-NEXT:    @ Parent Loop BB27_1 Depth=1
5605; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
5606; CHECK-ARM6-NEXT:    ldrex r0, [r3]
5607; CHECK-ARM6-NEXT:    cmp r0, r1
5608; CHECK-ARM6-NEXT:    bne .LBB27_4
5609; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
5610; CHECK-ARM6-NEXT:    @ in Loop: Header=BB27_2 Depth=2
5611; CHECK-ARM6-NEXT:    strex r2, r12, [r3]
5612; CHECK-ARM6-NEXT:    cmp r2, #0
5613; CHECK-ARM6-NEXT:    bne .LBB27_2
5614; CHECK-ARM6-NEXT:  .LBB27_4: @ %atomicrmw.start
5615; CHECK-ARM6-NEXT:    @ in Loop: Header=BB27_1 Depth=1
5616; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
5617; CHECK-ARM6-NEXT:    sub r1, r0, r1
5618; CHECK-ARM6-NEXT:    clz r1, r1
5619; CHECK-ARM6-NEXT:    lsr r1, r1, #5
5620; CHECK-ARM6-NEXT:    cmp r1, #1
5621; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5622; CHECK-ARM6-NEXT:    bne .LBB27_1
5623; CHECK-ARM6-NEXT:    b .LBB27_5
5624; CHECK-ARM6-NEXT:  .LBB27_5: @ %atomicrmw.end
5625; CHECK-ARM6-NEXT:    ldr r0, [sp] @ 4-byte Reload
5626; CHECK-ARM6-NEXT:    add sp, sp, #8
5627; CHECK-ARM6-NEXT:    bx lr
5628; CHECK-ARM6-NEXT:    .p2align 2
5629; CHECK-ARM6-NEXT:  @ %bb.6:
5630; CHECK-ARM6-NEXT:  .LCPI27_0:
5631; CHECK-ARM6-NEXT:    .long atomic_i32
5632;
5633; CHECK-THUMB7-LABEL: test_or_i32:
5634; CHECK-THUMB7:       @ %bb.0: @ %entry
5635; CHECK-THUMB7-NEXT:    .pad #8
5636; CHECK-THUMB7-NEXT:    sub sp, #8
5637; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i32
5638; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i32
5639; CHECK-THUMB7-NEXT:    ldr r0, [r0]
5640; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5641; CHECK-THUMB7-NEXT:    b .LBB27_1
5642; CHECK-THUMB7-NEXT:  .LBB27_1: @ %atomicrmw.start
5643; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
5644; CHECK-THUMB7-NEXT:    @ Child Loop BB27_2 Depth 2
5645; CHECK-THUMB7-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
5646; CHECK-THUMB7-NEXT:    orr r12, r1, #1
5647; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i32
5648; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i32
5649; CHECK-THUMB7-NEXT:  .LBB27_2: @ %atomicrmw.start
5650; CHECK-THUMB7-NEXT:    @ Parent Loop BB27_1 Depth=1
5651; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
5652; CHECK-THUMB7-NEXT:    ldrex r0, [r3]
5653; CHECK-THUMB7-NEXT:    cmp r0, r1
5654; CHECK-THUMB7-NEXT:    bne .LBB27_4
5655; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
5656; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB27_2 Depth=2
5657; CHECK-THUMB7-NEXT:    strex r2, r12, [r3]
5658; CHECK-THUMB7-NEXT:    cmp r2, #0
5659; CHECK-THUMB7-NEXT:    bne .LBB27_2
5660; CHECK-THUMB7-NEXT:  .LBB27_4: @ %atomicrmw.start
5661; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB27_1 Depth=1
5662; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
5663; CHECK-THUMB7-NEXT:    subs r1, r0, r1
5664; CHECK-THUMB7-NEXT:    clz r1, r1
5665; CHECK-THUMB7-NEXT:    lsrs r1, r1, #5
5666; CHECK-THUMB7-NEXT:    cmp r1, #1
5667; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5668; CHECK-THUMB7-NEXT:    bne .LBB27_1
5669; CHECK-THUMB7-NEXT:    b .LBB27_5
5670; CHECK-THUMB7-NEXT:  .LBB27_5: @ %atomicrmw.end
5671; CHECK-THUMB7-NEXT:    ldr r0, [sp] @ 4-byte Reload
5672; CHECK-THUMB7-NEXT:    add sp, #8
5673; CHECK-THUMB7-NEXT:    bx lr
5674;
5675; CHECK-THUMB6-LABEL: test_or_i32:
5676; CHECK-THUMB6:       @ %bb.0: @ %entry
5677; CHECK-THUMB6-NEXT:    .save {r7, lr}
5678; CHECK-THUMB6-NEXT:    push {r7, lr}
5679; CHECK-THUMB6-NEXT:    ldr r0, .LCPI27_0
5680; CHECK-THUMB6-NEXT:    movs r1, #1
5681; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_or_4
5682; CHECK-THUMB6-NEXT:    pop {r7, pc}
5683; CHECK-THUMB6-NEXT:    .p2align 2
5684; CHECK-THUMB6-NEXT:  @ %bb.1:
5685; CHECK-THUMB6-NEXT:  .LCPI27_0:
5686; CHECK-THUMB6-NEXT:    .long atomic_i32
5687;
5688; CHECK-THUMB8BASE-LABEL: test_or_i32:
5689; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
5690; CHECK-THUMB8BASE-NEXT:    .save {r4, lr}
5691; CHECK-THUMB8BASE-NEXT:    push {r4, lr}
5692; CHECK-THUMB8BASE-NEXT:    .pad #8
5693; CHECK-THUMB8BASE-NEXT:    sub sp, #8
5694; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i32
5695; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i32
5696; CHECK-THUMB8BASE-NEXT:    ldr r0, [r0]
5697; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5698; CHECK-THUMB8BASE-NEXT:    b .LBB27_1
5699; CHECK-THUMB8BASE-NEXT:  .LBB27_1: @ %atomicrmw.start
5700; CHECK-THUMB8BASE-NEXT:    @ =>This Loop Header: Depth=1
5701; CHECK-THUMB8BASE-NEXT:    @ Child Loop BB27_2 Depth 2
5702; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
5703; CHECK-THUMB8BASE-NEXT:    movs r0, #1
5704; CHECK-THUMB8BASE-NEXT:    mov r4, r1
5705; CHECK-THUMB8BASE-NEXT:    orrs r4, r0
5706; CHECK-THUMB8BASE-NEXT:    movw r3, :lower16:atomic_i32
5707; CHECK-THUMB8BASE-NEXT:    movt r3, :upper16:atomic_i32
5708; CHECK-THUMB8BASE-NEXT:  .LBB27_2: @ %atomicrmw.start
5709; CHECK-THUMB8BASE-NEXT:    @ Parent Loop BB27_1 Depth=1
5710; CHECK-THUMB8BASE-NEXT:    @ => This Inner Loop Header: Depth=2
5711; CHECK-THUMB8BASE-NEXT:    ldrex r0, [r3]
5712; CHECK-THUMB8BASE-NEXT:    cmp r0, r1
5713; CHECK-THUMB8BASE-NEXT:    bne .LBB27_4
5714; CHECK-THUMB8BASE-NEXT:  @ %bb.3: @ %atomicrmw.start
5715; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB27_2 Depth=2
5716; CHECK-THUMB8BASE-NEXT:    strex r2, r4, [r3]
5717; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
5718; CHECK-THUMB8BASE-NEXT:    bne .LBB27_2
5719; CHECK-THUMB8BASE-NEXT:  .LBB27_4: @ %atomicrmw.start
5720; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB27_1 Depth=1
5721; CHECK-THUMB8BASE-NEXT:    str r0, [sp] @ 4-byte Spill
5722; CHECK-THUMB8BASE-NEXT:    subs r1, r0, r1
5723; CHECK-THUMB8BASE-NEXT:    rsbs r2, r1, #0
5724; CHECK-THUMB8BASE-NEXT:    adcs r1, r2
5725; CHECK-THUMB8BASE-NEXT:    cmp r1, #1
5726; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5727; CHECK-THUMB8BASE-NEXT:    bne .LBB27_1
5728; CHECK-THUMB8BASE-NEXT:    b .LBB27_5
5729; CHECK-THUMB8BASE-NEXT:  .LBB27_5: @ %atomicrmw.end
5730; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp] @ 4-byte Reload
5731; CHECK-THUMB8BASE-NEXT:    add sp, #8
5732; CHECK-THUMB8BASE-NEXT:    pop {r4, pc}
5733entry:
5734  %0 = atomicrmw or i32* @atomic_i32, i32 1 monotonic
5735  ret i32 %0
5736}
5737define i32 @test_xor_i32() {
5738; CHECK-ARM8-LABEL: test_xor_i32:
5739; CHECK-ARM8:       @ %bb.0: @ %entry
5740; CHECK-ARM8-NEXT:    .pad #8
5741; CHECK-ARM8-NEXT:    sub sp, sp, #8
5742; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i32
5743; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i32
5744; CHECK-ARM8-NEXT:    ldr r0, [r0]
5745; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5746; CHECK-ARM8-NEXT:    b .LBB28_1
5747; CHECK-ARM8-NEXT:  .LBB28_1: @ %atomicrmw.start
5748; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
5749; CHECK-ARM8-NEXT:    @ Child Loop BB28_2 Depth 2
5750; CHECK-ARM8-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
5751; CHECK-ARM8-NEXT:    eor r12, r1, #1
5752; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i32
5753; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i32
5754; CHECK-ARM8-NEXT:  .LBB28_2: @ %atomicrmw.start
5755; CHECK-ARM8-NEXT:    @ Parent Loop BB28_1 Depth=1
5756; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
5757; CHECK-ARM8-NEXT:    ldrex r0, [r3]
5758; CHECK-ARM8-NEXT:    cmp r0, r1
5759; CHECK-ARM8-NEXT:    bne .LBB28_4
5760; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
5761; CHECK-ARM8-NEXT:    @ in Loop: Header=BB28_2 Depth=2
5762; CHECK-ARM8-NEXT:    strex r2, r12, [r3]
5763; CHECK-ARM8-NEXT:    cmp r2, #0
5764; CHECK-ARM8-NEXT:    bne .LBB28_2
5765; CHECK-ARM8-NEXT:  .LBB28_4: @ %atomicrmw.start
5766; CHECK-ARM8-NEXT:    @ in Loop: Header=BB28_1 Depth=1
5767; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
5768; CHECK-ARM8-NEXT:    sub r1, r0, r1
5769; CHECK-ARM8-NEXT:    clz r1, r1
5770; CHECK-ARM8-NEXT:    lsr r1, r1, #5
5771; CHECK-ARM8-NEXT:    cmp r1, #1
5772; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5773; CHECK-ARM8-NEXT:    bne .LBB28_1
5774; CHECK-ARM8-NEXT:    b .LBB28_5
5775; CHECK-ARM8-NEXT:  .LBB28_5: @ %atomicrmw.end
5776; CHECK-ARM8-NEXT:    ldr r0, [sp] @ 4-byte Reload
5777; CHECK-ARM8-NEXT:    add sp, sp, #8
5778; CHECK-ARM8-NEXT:    bx lr
5779;
5780; CHECK-ARM6-LABEL: test_xor_i32:
5781; CHECK-ARM6:       @ %bb.0: @ %entry
5782; CHECK-ARM6-NEXT:    .pad #8
5783; CHECK-ARM6-NEXT:    sub sp, sp, #8
5784; CHECK-ARM6-NEXT:    ldr r0, .LCPI28_0
5785; CHECK-ARM6-NEXT:    ldr r0, [r0]
5786; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5787; CHECK-ARM6-NEXT:    b .LBB28_1
5788; CHECK-ARM6-NEXT:  .LBB28_1: @ %atomicrmw.start
5789; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
5790; CHECK-ARM6-NEXT:    @ Child Loop BB28_2 Depth 2
5791; CHECK-ARM6-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
5792; CHECK-ARM6-NEXT:    eor r12, r1, #1
5793; CHECK-ARM6-NEXT:    ldr r3, .LCPI28_0
5794; CHECK-ARM6-NEXT:  .LBB28_2: @ %atomicrmw.start
5795; CHECK-ARM6-NEXT:    @ Parent Loop BB28_1 Depth=1
5796; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
5797; CHECK-ARM6-NEXT:    ldrex r0, [r3]
5798; CHECK-ARM6-NEXT:    cmp r0, r1
5799; CHECK-ARM6-NEXT:    bne .LBB28_4
5800; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
5801; CHECK-ARM6-NEXT:    @ in Loop: Header=BB28_2 Depth=2
5802; CHECK-ARM6-NEXT:    strex r2, r12, [r3]
5803; CHECK-ARM6-NEXT:    cmp r2, #0
5804; CHECK-ARM6-NEXT:    bne .LBB28_2
5805; CHECK-ARM6-NEXT:  .LBB28_4: @ %atomicrmw.start
5806; CHECK-ARM6-NEXT:    @ in Loop: Header=BB28_1 Depth=1
5807; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
5808; CHECK-ARM6-NEXT:    sub r1, r0, r1
5809; CHECK-ARM6-NEXT:    clz r1, r1
5810; CHECK-ARM6-NEXT:    lsr r1, r1, #5
5811; CHECK-ARM6-NEXT:    cmp r1, #1
5812; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5813; CHECK-ARM6-NEXT:    bne .LBB28_1
5814; CHECK-ARM6-NEXT:    b .LBB28_5
5815; CHECK-ARM6-NEXT:  .LBB28_5: @ %atomicrmw.end
5816; CHECK-ARM6-NEXT:    ldr r0, [sp] @ 4-byte Reload
5817; CHECK-ARM6-NEXT:    add sp, sp, #8
5818; CHECK-ARM6-NEXT:    bx lr
5819; CHECK-ARM6-NEXT:    .p2align 2
5820; CHECK-ARM6-NEXT:  @ %bb.6:
5821; CHECK-ARM6-NEXT:  .LCPI28_0:
5822; CHECK-ARM6-NEXT:    .long atomic_i32
5823;
5824; CHECK-THUMB7-LABEL: test_xor_i32:
5825; CHECK-THUMB7:       @ %bb.0: @ %entry
5826; CHECK-THUMB7-NEXT:    .pad #8
5827; CHECK-THUMB7-NEXT:    sub sp, #8
5828; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i32
5829; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i32
5830; CHECK-THUMB7-NEXT:    ldr r0, [r0]
5831; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5832; CHECK-THUMB7-NEXT:    b .LBB28_1
5833; CHECK-THUMB7-NEXT:  .LBB28_1: @ %atomicrmw.start
5834; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
5835; CHECK-THUMB7-NEXT:    @ Child Loop BB28_2 Depth 2
5836; CHECK-THUMB7-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
5837; CHECK-THUMB7-NEXT:    eor r12, r1, #1
5838; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i32
5839; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i32
5840; CHECK-THUMB7-NEXT:  .LBB28_2: @ %atomicrmw.start
5841; CHECK-THUMB7-NEXT:    @ Parent Loop BB28_1 Depth=1
5842; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
5843; CHECK-THUMB7-NEXT:    ldrex r0, [r3]
5844; CHECK-THUMB7-NEXT:    cmp r0, r1
5845; CHECK-THUMB7-NEXT:    bne .LBB28_4
5846; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
5847; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB28_2 Depth=2
5848; CHECK-THUMB7-NEXT:    strex r2, r12, [r3]
5849; CHECK-THUMB7-NEXT:    cmp r2, #0
5850; CHECK-THUMB7-NEXT:    bne .LBB28_2
5851; CHECK-THUMB7-NEXT:  .LBB28_4: @ %atomicrmw.start
5852; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB28_1 Depth=1
5853; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
5854; CHECK-THUMB7-NEXT:    subs r1, r0, r1
5855; CHECK-THUMB7-NEXT:    clz r1, r1
5856; CHECK-THUMB7-NEXT:    lsrs r1, r1, #5
5857; CHECK-THUMB7-NEXT:    cmp r1, #1
5858; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5859; CHECK-THUMB7-NEXT:    bne .LBB28_1
5860; CHECK-THUMB7-NEXT:    b .LBB28_5
5861; CHECK-THUMB7-NEXT:  .LBB28_5: @ %atomicrmw.end
5862; CHECK-THUMB7-NEXT:    ldr r0, [sp] @ 4-byte Reload
5863; CHECK-THUMB7-NEXT:    add sp, #8
5864; CHECK-THUMB7-NEXT:    bx lr
5865;
5866; CHECK-THUMB6-LABEL: test_xor_i32:
5867; CHECK-THUMB6:       @ %bb.0: @ %entry
5868; CHECK-THUMB6-NEXT:    .save {r7, lr}
5869; CHECK-THUMB6-NEXT:    push {r7, lr}
5870; CHECK-THUMB6-NEXT:    ldr r0, .LCPI28_0
5871; CHECK-THUMB6-NEXT:    movs r1, #1
5872; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_xor_4
5873; CHECK-THUMB6-NEXT:    pop {r7, pc}
5874; CHECK-THUMB6-NEXT:    .p2align 2
5875; CHECK-THUMB6-NEXT:  @ %bb.1:
5876; CHECK-THUMB6-NEXT:  .LCPI28_0:
5877; CHECK-THUMB6-NEXT:    .long atomic_i32
5878;
5879; CHECK-THUMB8BASE-LABEL: test_xor_i32:
5880; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
5881; CHECK-THUMB8BASE-NEXT:    .save {r4, lr}
5882; CHECK-THUMB8BASE-NEXT:    push {r4, lr}
5883; CHECK-THUMB8BASE-NEXT:    .pad #8
5884; CHECK-THUMB8BASE-NEXT:    sub sp, #8
5885; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i32
5886; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i32
5887; CHECK-THUMB8BASE-NEXT:    ldr r0, [r0]
5888; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5889; CHECK-THUMB8BASE-NEXT:    b .LBB28_1
5890; CHECK-THUMB8BASE-NEXT:  .LBB28_1: @ %atomicrmw.start
5891; CHECK-THUMB8BASE-NEXT:    @ =>This Loop Header: Depth=1
5892; CHECK-THUMB8BASE-NEXT:    @ Child Loop BB28_2 Depth 2
5893; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
5894; CHECK-THUMB8BASE-NEXT:    movs r0, #1
5895; CHECK-THUMB8BASE-NEXT:    mov r4, r1
5896; CHECK-THUMB8BASE-NEXT:    eors r4, r0
5897; CHECK-THUMB8BASE-NEXT:    movw r3, :lower16:atomic_i32
5898; CHECK-THUMB8BASE-NEXT:    movt r3, :upper16:atomic_i32
5899; CHECK-THUMB8BASE-NEXT:  .LBB28_2: @ %atomicrmw.start
5900; CHECK-THUMB8BASE-NEXT:    @ Parent Loop BB28_1 Depth=1
5901; CHECK-THUMB8BASE-NEXT:    @ => This Inner Loop Header: Depth=2
5902; CHECK-THUMB8BASE-NEXT:    ldrex r0, [r3]
5903; CHECK-THUMB8BASE-NEXT:    cmp r0, r1
5904; CHECK-THUMB8BASE-NEXT:    bne .LBB28_4
5905; CHECK-THUMB8BASE-NEXT:  @ %bb.3: @ %atomicrmw.start
5906; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB28_2 Depth=2
5907; CHECK-THUMB8BASE-NEXT:    strex r2, r4, [r3]
5908; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
5909; CHECK-THUMB8BASE-NEXT:    bne .LBB28_2
5910; CHECK-THUMB8BASE-NEXT:  .LBB28_4: @ %atomicrmw.start
5911; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB28_1 Depth=1
5912; CHECK-THUMB8BASE-NEXT:    str r0, [sp] @ 4-byte Spill
5913; CHECK-THUMB8BASE-NEXT:    subs r1, r0, r1
5914; CHECK-THUMB8BASE-NEXT:    rsbs r2, r1, #0
5915; CHECK-THUMB8BASE-NEXT:    adcs r1, r2
5916; CHECK-THUMB8BASE-NEXT:    cmp r1, #1
5917; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5918; CHECK-THUMB8BASE-NEXT:    bne .LBB28_1
5919; CHECK-THUMB8BASE-NEXT:    b .LBB28_5
5920; CHECK-THUMB8BASE-NEXT:  .LBB28_5: @ %atomicrmw.end
5921; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp] @ 4-byte Reload
5922; CHECK-THUMB8BASE-NEXT:    add sp, #8
5923; CHECK-THUMB8BASE-NEXT:    pop {r4, pc}
5924entry:
5925  %0 = atomicrmw xor i32* @atomic_i32, i32 1 monotonic
5926  ret i32 %0
5927}
5928define i32 @test_max_i32() {
5929; CHECK-ARM8-LABEL: test_max_i32:
5930; CHECK-ARM8:       @ %bb.0: @ %entry
5931; CHECK-ARM8-NEXT:    .pad #8
5932; CHECK-ARM8-NEXT:    sub sp, sp, #8
5933; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i32
5934; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i32
5935; CHECK-ARM8-NEXT:    ldr r0, [r0]
5936; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5937; CHECK-ARM8-NEXT:    b .LBB29_1
5938; CHECK-ARM8-NEXT:  .LBB29_1: @ %atomicrmw.start
5939; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
5940; CHECK-ARM8-NEXT:    @ Child Loop BB29_2 Depth 2
5941; CHECK-ARM8-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
5942; CHECK-ARM8-NEXT:    mov r12, #1
5943; CHECK-ARM8-NEXT:    cmp r1, #1
5944; CHECK-ARM8-NEXT:    movgt r12, r1
5945; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i32
5946; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i32
5947; CHECK-ARM8-NEXT:  .LBB29_2: @ %atomicrmw.start
5948; CHECK-ARM8-NEXT:    @ Parent Loop BB29_1 Depth=1
5949; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
5950; CHECK-ARM8-NEXT:    ldrex r0, [r3]
5951; CHECK-ARM8-NEXT:    cmp r0, r1
5952; CHECK-ARM8-NEXT:    bne .LBB29_4
5953; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
5954; CHECK-ARM8-NEXT:    @ in Loop: Header=BB29_2 Depth=2
5955; CHECK-ARM8-NEXT:    strex r2, r12, [r3]
5956; CHECK-ARM8-NEXT:    cmp r2, #0
5957; CHECK-ARM8-NEXT:    bne .LBB29_2
5958; CHECK-ARM8-NEXT:  .LBB29_4: @ %atomicrmw.start
5959; CHECK-ARM8-NEXT:    @ in Loop: Header=BB29_1 Depth=1
5960; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
5961; CHECK-ARM8-NEXT:    sub r1, r0, r1
5962; CHECK-ARM8-NEXT:    clz r1, r1
5963; CHECK-ARM8-NEXT:    lsr r1, r1, #5
5964; CHECK-ARM8-NEXT:    cmp r1, #1
5965; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5966; CHECK-ARM8-NEXT:    bne .LBB29_1
5967; CHECK-ARM8-NEXT:    b .LBB29_5
5968; CHECK-ARM8-NEXT:  .LBB29_5: @ %atomicrmw.end
5969; CHECK-ARM8-NEXT:    ldr r0, [sp] @ 4-byte Reload
5970; CHECK-ARM8-NEXT:    add sp, sp, #8
5971; CHECK-ARM8-NEXT:    bx lr
5972;
5973; CHECK-ARM6-LABEL: test_max_i32:
5974; CHECK-ARM6:       @ %bb.0: @ %entry
5975; CHECK-ARM6-NEXT:    .pad #8
5976; CHECK-ARM6-NEXT:    sub sp, sp, #8
5977; CHECK-ARM6-NEXT:    ldr r0, .LCPI29_0
5978; CHECK-ARM6-NEXT:    ldr r0, [r0]
5979; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
5980; CHECK-ARM6-NEXT:    b .LBB29_1
5981; CHECK-ARM6-NEXT:  .LBB29_1: @ %atomicrmw.start
5982; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
5983; CHECK-ARM6-NEXT:    @ Child Loop BB29_2 Depth 2
5984; CHECK-ARM6-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
5985; CHECK-ARM6-NEXT:    mov r12, #1
5986; CHECK-ARM6-NEXT:    cmp r1, #1
5987; CHECK-ARM6-NEXT:    movgt r12, r1
5988; CHECK-ARM6-NEXT:    ldr r3, .LCPI29_0
5989; CHECK-ARM6-NEXT:  .LBB29_2: @ %atomicrmw.start
5990; CHECK-ARM6-NEXT:    @ Parent Loop BB29_1 Depth=1
5991; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
5992; CHECK-ARM6-NEXT:    ldrex r0, [r3]
5993; CHECK-ARM6-NEXT:    cmp r0, r1
5994; CHECK-ARM6-NEXT:    bne .LBB29_4
5995; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
5996; CHECK-ARM6-NEXT:    @ in Loop: Header=BB29_2 Depth=2
5997; CHECK-ARM6-NEXT:    strex r2, r12, [r3]
5998; CHECK-ARM6-NEXT:    cmp r2, #0
5999; CHECK-ARM6-NEXT:    bne .LBB29_2
6000; CHECK-ARM6-NEXT:  .LBB29_4: @ %atomicrmw.start
6001; CHECK-ARM6-NEXT:    @ in Loop: Header=BB29_1 Depth=1
6002; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
6003; CHECK-ARM6-NEXT:    sub r1, r0, r1
6004; CHECK-ARM6-NEXT:    clz r1, r1
6005; CHECK-ARM6-NEXT:    lsr r1, r1, #5
6006; CHECK-ARM6-NEXT:    cmp r1, #1
6007; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
6008; CHECK-ARM6-NEXT:    bne .LBB29_1
6009; CHECK-ARM6-NEXT:    b .LBB29_5
6010; CHECK-ARM6-NEXT:  .LBB29_5: @ %atomicrmw.end
6011; CHECK-ARM6-NEXT:    ldr r0, [sp] @ 4-byte Reload
6012; CHECK-ARM6-NEXT:    add sp, sp, #8
6013; CHECK-ARM6-NEXT:    bx lr
6014; CHECK-ARM6-NEXT:    .p2align 2
6015; CHECK-ARM6-NEXT:  @ %bb.6:
6016; CHECK-ARM6-NEXT:  .LCPI29_0:
6017; CHECK-ARM6-NEXT:    .long atomic_i32
6018;
6019; CHECK-THUMB7-LABEL: test_max_i32:
6020; CHECK-THUMB7:       @ %bb.0: @ %entry
6021; CHECK-THUMB7-NEXT:    .pad #8
6022; CHECK-THUMB7-NEXT:    sub sp, #8
6023; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i32
6024; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i32
6025; CHECK-THUMB7-NEXT:    ldr r0, [r0]
6026; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
6027; CHECK-THUMB7-NEXT:    b .LBB29_1
6028; CHECK-THUMB7-NEXT:  .LBB29_1: @ %atomicrmw.start
6029; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
6030; CHECK-THUMB7-NEXT:    @ Child Loop BB29_2 Depth 2
6031; CHECK-THUMB7-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
6032; CHECK-THUMB7-NEXT:    mov.w r12, #1
6033; CHECK-THUMB7-NEXT:    cmp r1, #1
6034; CHECK-THUMB7-NEXT:    it gt
6035; CHECK-THUMB7-NEXT:    movgt r12, r1
6036; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i32
6037; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i32
6038; CHECK-THUMB7-NEXT:  .LBB29_2: @ %atomicrmw.start
6039; CHECK-THUMB7-NEXT:    @ Parent Loop BB29_1 Depth=1
6040; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
6041; CHECK-THUMB7-NEXT:    ldrex r0, [r3]
6042; CHECK-THUMB7-NEXT:    cmp r0, r1
6043; CHECK-THUMB7-NEXT:    bne .LBB29_4
6044; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
6045; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB29_2 Depth=2
6046; CHECK-THUMB7-NEXT:    strex r2, r12, [r3]
6047; CHECK-THUMB7-NEXT:    cmp r2, #0
6048; CHECK-THUMB7-NEXT:    bne .LBB29_2
6049; CHECK-THUMB7-NEXT:  .LBB29_4: @ %atomicrmw.start
6050; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB29_1 Depth=1
6051; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
6052; CHECK-THUMB7-NEXT:    subs r1, r0, r1
6053; CHECK-THUMB7-NEXT:    clz r1, r1
6054; CHECK-THUMB7-NEXT:    lsrs r1, r1, #5
6055; CHECK-THUMB7-NEXT:    cmp r1, #1
6056; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
6057; CHECK-THUMB7-NEXT:    bne .LBB29_1
6058; CHECK-THUMB7-NEXT:    b .LBB29_5
6059; CHECK-THUMB7-NEXT:  .LBB29_5: @ %atomicrmw.end
6060; CHECK-THUMB7-NEXT:    ldr r0, [sp] @ 4-byte Reload
6061; CHECK-THUMB7-NEXT:    add sp, #8
6062; CHECK-THUMB7-NEXT:    bx lr
6063;
6064; CHECK-THUMB6-LABEL: test_max_i32:
6065; CHECK-THUMB6:       @ %bb.0: @ %entry
6066; CHECK-THUMB6-NEXT:    .save {r7, lr}
6067; CHECK-THUMB6-NEXT:    push {r7, lr}
6068; CHECK-THUMB6-NEXT:    ldr r0, .LCPI29_0
6069; CHECK-THUMB6-NEXT:    movs r1, #1
6070; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_max_4
6071; CHECK-THUMB6-NEXT:    pop {r7, pc}
6072; CHECK-THUMB6-NEXT:    .p2align 2
6073; CHECK-THUMB6-NEXT:  @ %bb.1:
6074; CHECK-THUMB6-NEXT:  .LCPI29_0:
6075; CHECK-THUMB6-NEXT:    .long atomic_i32
6076;
6077; CHECK-THUMB8BASE-LABEL: test_max_i32:
6078; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
6079; CHECK-THUMB8BASE-NEXT:    .save {r4, lr}
6080; CHECK-THUMB8BASE-NEXT:    push {r4, lr}
6081; CHECK-THUMB8BASE-NEXT:    .pad #20
6082; CHECK-THUMB8BASE-NEXT:    sub sp, #20
6083; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i32
6084; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i32
6085; CHECK-THUMB8BASE-NEXT:    ldr r0, [r0]
6086; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #16] @ 4-byte Spill
6087; CHECK-THUMB8BASE-NEXT:    b .LBB29_1
6088; CHECK-THUMB8BASE-NEXT:  .LBB29_1: @ %atomicrmw.start
6089; CHECK-THUMB8BASE-NEXT:    @ =>This Loop Header: Depth=1
6090; CHECK-THUMB8BASE-NEXT:    @ Child Loop BB29_4 Depth 2
6091; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #16] @ 4-byte Reload
6092; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
6093; CHECK-THUMB8BASE-NEXT:    movs r1, #1
6094; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #8] @ 4-byte Spill
6095; CHECK-THUMB8BASE-NEXT:    cmp r0, #1
6096; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #12] @ 4-byte Spill
6097; CHECK-THUMB8BASE-NEXT:    bgt .LBB29_3
6098; CHECK-THUMB8BASE-NEXT:  @ %bb.2: @ %atomicrmw.start
6099; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB29_1 Depth=1
6100; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #8] @ 4-byte Reload
6101; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #12] @ 4-byte Spill
6102; CHECK-THUMB8BASE-NEXT:  .LBB29_3: @ %atomicrmw.start
6103; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB29_1 Depth=1
6104; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
6105; CHECK-THUMB8BASE-NEXT:    ldr r4, [sp, #12] @ 4-byte Reload
6106; CHECK-THUMB8BASE-NEXT:    movw r3, :lower16:atomic_i32
6107; CHECK-THUMB8BASE-NEXT:    movt r3, :upper16:atomic_i32
6108; CHECK-THUMB8BASE-NEXT:  .LBB29_4: @ %atomicrmw.start
6109; CHECK-THUMB8BASE-NEXT:    @ Parent Loop BB29_1 Depth=1
6110; CHECK-THUMB8BASE-NEXT:    @ => This Inner Loop Header: Depth=2
6111; CHECK-THUMB8BASE-NEXT:    ldrex r0, [r3]
6112; CHECK-THUMB8BASE-NEXT:    cmp r0, r1
6113; CHECK-THUMB8BASE-NEXT:    bne .LBB29_6
6114; CHECK-THUMB8BASE-NEXT:  @ %bb.5: @ %atomicrmw.start
6115; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB29_4 Depth=2
6116; CHECK-THUMB8BASE-NEXT:    strex r2, r4, [r3]
6117; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
6118; CHECK-THUMB8BASE-NEXT:    bne .LBB29_4
6119; CHECK-THUMB8BASE-NEXT:  .LBB29_6: @ %atomicrmw.start
6120; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB29_1 Depth=1
6121; CHECK-THUMB8BASE-NEXT:    str r0, [sp] @ 4-byte Spill
6122; CHECK-THUMB8BASE-NEXT:    subs r1, r0, r1
6123; CHECK-THUMB8BASE-NEXT:    rsbs r2, r1, #0
6124; CHECK-THUMB8BASE-NEXT:    adcs r1, r2
6125; CHECK-THUMB8BASE-NEXT:    cmp r1, #1
6126; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #16] @ 4-byte Spill
6127; CHECK-THUMB8BASE-NEXT:    bne .LBB29_1
6128; CHECK-THUMB8BASE-NEXT:    b .LBB29_7
6129; CHECK-THUMB8BASE-NEXT:  .LBB29_7: @ %atomicrmw.end
6130; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp] @ 4-byte Reload
6131; CHECK-THUMB8BASE-NEXT:    add sp, #20
6132; CHECK-THUMB8BASE-NEXT:    pop {r4, pc}
6133entry:
6134  %0 = atomicrmw max i32* @atomic_i32, i32 1 monotonic
6135  ret i32 %0
6136}
6137define i32 @test_min_i32() {
6138; CHECK-ARM8-LABEL: test_min_i32:
6139; CHECK-ARM8:       @ %bb.0: @ %entry
6140; CHECK-ARM8-NEXT:    .pad #8
6141; CHECK-ARM8-NEXT:    sub sp, sp, #8
6142; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i32
6143; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i32
6144; CHECK-ARM8-NEXT:    ldr r0, [r0]
6145; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
6146; CHECK-ARM8-NEXT:    b .LBB30_1
6147; CHECK-ARM8-NEXT:  .LBB30_1: @ %atomicrmw.start
6148; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
6149; CHECK-ARM8-NEXT:    @ Child Loop BB30_2 Depth 2
6150; CHECK-ARM8-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
6151; CHECK-ARM8-NEXT:    mov r12, #1
6152; CHECK-ARM8-NEXT:    cmp r1, #2
6153; CHECK-ARM8-NEXT:    movlt r12, r1
6154; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i32
6155; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i32
6156; CHECK-ARM8-NEXT:  .LBB30_2: @ %atomicrmw.start
6157; CHECK-ARM8-NEXT:    @ Parent Loop BB30_1 Depth=1
6158; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
6159; CHECK-ARM8-NEXT:    ldrex r0, [r3]
6160; CHECK-ARM8-NEXT:    cmp r0, r1
6161; CHECK-ARM8-NEXT:    bne .LBB30_4
6162; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
6163; CHECK-ARM8-NEXT:    @ in Loop: Header=BB30_2 Depth=2
6164; CHECK-ARM8-NEXT:    strex r2, r12, [r3]
6165; CHECK-ARM8-NEXT:    cmp r2, #0
6166; CHECK-ARM8-NEXT:    bne .LBB30_2
6167; CHECK-ARM8-NEXT:  .LBB30_4: @ %atomicrmw.start
6168; CHECK-ARM8-NEXT:    @ in Loop: Header=BB30_1 Depth=1
6169; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
6170; CHECK-ARM8-NEXT:    sub r1, r0, r1
6171; CHECK-ARM8-NEXT:    clz r1, r1
6172; CHECK-ARM8-NEXT:    lsr r1, r1, #5
6173; CHECK-ARM8-NEXT:    cmp r1, #1
6174; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
6175; CHECK-ARM8-NEXT:    bne .LBB30_1
6176; CHECK-ARM8-NEXT:    b .LBB30_5
6177; CHECK-ARM8-NEXT:  .LBB30_5: @ %atomicrmw.end
6178; CHECK-ARM8-NEXT:    ldr r0, [sp] @ 4-byte Reload
6179; CHECK-ARM8-NEXT:    add sp, sp, #8
6180; CHECK-ARM8-NEXT:    bx lr
6181;
6182; CHECK-ARM6-LABEL: test_min_i32:
6183; CHECK-ARM6:       @ %bb.0: @ %entry
6184; CHECK-ARM6-NEXT:    .pad #8
6185; CHECK-ARM6-NEXT:    sub sp, sp, #8
6186; CHECK-ARM6-NEXT:    ldr r0, .LCPI30_0
6187; CHECK-ARM6-NEXT:    ldr r0, [r0]
6188; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
6189; CHECK-ARM6-NEXT:    b .LBB30_1
6190; CHECK-ARM6-NEXT:  .LBB30_1: @ %atomicrmw.start
6191; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
6192; CHECK-ARM6-NEXT:    @ Child Loop BB30_2 Depth 2
6193; CHECK-ARM6-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
6194; CHECK-ARM6-NEXT:    mov r12, #1
6195; CHECK-ARM6-NEXT:    cmp r1, #2
6196; CHECK-ARM6-NEXT:    movlt r12, r1
6197; CHECK-ARM6-NEXT:    ldr r3, .LCPI30_0
6198; CHECK-ARM6-NEXT:  .LBB30_2: @ %atomicrmw.start
6199; CHECK-ARM6-NEXT:    @ Parent Loop BB30_1 Depth=1
6200; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
6201; CHECK-ARM6-NEXT:    ldrex r0, [r3]
6202; CHECK-ARM6-NEXT:    cmp r0, r1
6203; CHECK-ARM6-NEXT:    bne .LBB30_4
6204; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
6205; CHECK-ARM6-NEXT:    @ in Loop: Header=BB30_2 Depth=2
6206; CHECK-ARM6-NEXT:    strex r2, r12, [r3]
6207; CHECK-ARM6-NEXT:    cmp r2, #0
6208; CHECK-ARM6-NEXT:    bne .LBB30_2
6209; CHECK-ARM6-NEXT:  .LBB30_4: @ %atomicrmw.start
6210; CHECK-ARM6-NEXT:    @ in Loop: Header=BB30_1 Depth=1
6211; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
6212; CHECK-ARM6-NEXT:    sub r1, r0, r1
6213; CHECK-ARM6-NEXT:    clz r1, r1
6214; CHECK-ARM6-NEXT:    lsr r1, r1, #5
6215; CHECK-ARM6-NEXT:    cmp r1, #1
6216; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
6217; CHECK-ARM6-NEXT:    bne .LBB30_1
6218; CHECK-ARM6-NEXT:    b .LBB30_5
6219; CHECK-ARM6-NEXT:  .LBB30_5: @ %atomicrmw.end
6220; CHECK-ARM6-NEXT:    ldr r0, [sp] @ 4-byte Reload
6221; CHECK-ARM6-NEXT:    add sp, sp, #8
6222; CHECK-ARM6-NEXT:    bx lr
6223; CHECK-ARM6-NEXT:    .p2align 2
6224; CHECK-ARM6-NEXT:  @ %bb.6:
6225; CHECK-ARM6-NEXT:  .LCPI30_0:
6226; CHECK-ARM6-NEXT:    .long atomic_i32
6227;
6228; CHECK-THUMB7-LABEL: test_min_i32:
6229; CHECK-THUMB7:       @ %bb.0: @ %entry
6230; CHECK-THUMB7-NEXT:    .pad #8
6231; CHECK-THUMB7-NEXT:    sub sp, #8
6232; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i32
6233; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i32
6234; CHECK-THUMB7-NEXT:    ldr r0, [r0]
6235; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
6236; CHECK-THUMB7-NEXT:    b .LBB30_1
6237; CHECK-THUMB7-NEXT:  .LBB30_1: @ %atomicrmw.start
6238; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
6239; CHECK-THUMB7-NEXT:    @ Child Loop BB30_2 Depth 2
6240; CHECK-THUMB7-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
6241; CHECK-THUMB7-NEXT:    mov.w r12, #1
6242; CHECK-THUMB7-NEXT:    cmp r1, #2
6243; CHECK-THUMB7-NEXT:    it lt
6244; CHECK-THUMB7-NEXT:    movlt r12, r1
6245; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i32
6246; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i32
6247; CHECK-THUMB7-NEXT:  .LBB30_2: @ %atomicrmw.start
6248; CHECK-THUMB7-NEXT:    @ Parent Loop BB30_1 Depth=1
6249; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
6250; CHECK-THUMB7-NEXT:    ldrex r0, [r3]
6251; CHECK-THUMB7-NEXT:    cmp r0, r1
6252; CHECK-THUMB7-NEXT:    bne .LBB30_4
6253; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
6254; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB30_2 Depth=2
6255; CHECK-THUMB7-NEXT:    strex r2, r12, [r3]
6256; CHECK-THUMB7-NEXT:    cmp r2, #0
6257; CHECK-THUMB7-NEXT:    bne .LBB30_2
6258; CHECK-THUMB7-NEXT:  .LBB30_4: @ %atomicrmw.start
6259; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB30_1 Depth=1
6260; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
6261; CHECK-THUMB7-NEXT:    subs r1, r0, r1
6262; CHECK-THUMB7-NEXT:    clz r1, r1
6263; CHECK-THUMB7-NEXT:    lsrs r1, r1, #5
6264; CHECK-THUMB7-NEXT:    cmp r1, #1
6265; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
6266; CHECK-THUMB7-NEXT:    bne .LBB30_1
6267; CHECK-THUMB7-NEXT:    b .LBB30_5
6268; CHECK-THUMB7-NEXT:  .LBB30_5: @ %atomicrmw.end
6269; CHECK-THUMB7-NEXT:    ldr r0, [sp] @ 4-byte Reload
6270; CHECK-THUMB7-NEXT:    add sp, #8
6271; CHECK-THUMB7-NEXT:    bx lr
6272;
6273; CHECK-THUMB6-LABEL: test_min_i32:
6274; CHECK-THUMB6:       @ %bb.0: @ %entry
6275; CHECK-THUMB6-NEXT:    .save {r7, lr}
6276; CHECK-THUMB6-NEXT:    push {r7, lr}
6277; CHECK-THUMB6-NEXT:    ldr r0, .LCPI30_0
6278; CHECK-THUMB6-NEXT:    movs r1, #1
6279; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_min_4
6280; CHECK-THUMB6-NEXT:    pop {r7, pc}
6281; CHECK-THUMB6-NEXT:    .p2align 2
6282; CHECK-THUMB6-NEXT:  @ %bb.1:
6283; CHECK-THUMB6-NEXT:  .LCPI30_0:
6284; CHECK-THUMB6-NEXT:    .long atomic_i32
6285;
6286; CHECK-THUMB8BASE-LABEL: test_min_i32:
6287; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
6288; CHECK-THUMB8BASE-NEXT:    .save {r4, lr}
6289; CHECK-THUMB8BASE-NEXT:    push {r4, lr}
6290; CHECK-THUMB8BASE-NEXT:    .pad #20
6291; CHECK-THUMB8BASE-NEXT:    sub sp, #20
6292; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i32
6293; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i32
6294; CHECK-THUMB8BASE-NEXT:    ldr r0, [r0]
6295; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #16] @ 4-byte Spill
6296; CHECK-THUMB8BASE-NEXT:    b .LBB30_1
6297; CHECK-THUMB8BASE-NEXT:  .LBB30_1: @ %atomicrmw.start
6298; CHECK-THUMB8BASE-NEXT:    @ =>This Loop Header: Depth=1
6299; CHECK-THUMB8BASE-NEXT:    @ Child Loop BB30_4 Depth 2
6300; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #16] @ 4-byte Reload
6301; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
6302; CHECK-THUMB8BASE-NEXT:    movs r1, #1
6303; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #8] @ 4-byte Spill
6304; CHECK-THUMB8BASE-NEXT:    cmp r0, #2
6305; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #12] @ 4-byte Spill
6306; CHECK-THUMB8BASE-NEXT:    blt .LBB30_3
6307; CHECK-THUMB8BASE-NEXT:  @ %bb.2: @ %atomicrmw.start
6308; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB30_1 Depth=1
6309; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #8] @ 4-byte Reload
6310; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #12] @ 4-byte Spill
6311; CHECK-THUMB8BASE-NEXT:  .LBB30_3: @ %atomicrmw.start
6312; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB30_1 Depth=1
6313; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
6314; CHECK-THUMB8BASE-NEXT:    ldr r4, [sp, #12] @ 4-byte Reload
6315; CHECK-THUMB8BASE-NEXT:    movw r3, :lower16:atomic_i32
6316; CHECK-THUMB8BASE-NEXT:    movt r3, :upper16:atomic_i32
6317; CHECK-THUMB8BASE-NEXT:  .LBB30_4: @ %atomicrmw.start
6318; CHECK-THUMB8BASE-NEXT:    @ Parent Loop BB30_1 Depth=1
6319; CHECK-THUMB8BASE-NEXT:    @ => This Inner Loop Header: Depth=2
6320; CHECK-THUMB8BASE-NEXT:    ldrex r0, [r3]
6321; CHECK-THUMB8BASE-NEXT:    cmp r0, r1
6322; CHECK-THUMB8BASE-NEXT:    bne .LBB30_6
6323; CHECK-THUMB8BASE-NEXT:  @ %bb.5: @ %atomicrmw.start
6324; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB30_4 Depth=2
6325; CHECK-THUMB8BASE-NEXT:    strex r2, r4, [r3]
6326; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
6327; CHECK-THUMB8BASE-NEXT:    bne .LBB30_4
6328; CHECK-THUMB8BASE-NEXT:  .LBB30_6: @ %atomicrmw.start
6329; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB30_1 Depth=1
6330; CHECK-THUMB8BASE-NEXT:    str r0, [sp] @ 4-byte Spill
6331; CHECK-THUMB8BASE-NEXT:    subs r1, r0, r1
6332; CHECK-THUMB8BASE-NEXT:    rsbs r2, r1, #0
6333; CHECK-THUMB8BASE-NEXT:    adcs r1, r2
6334; CHECK-THUMB8BASE-NEXT:    cmp r1, #1
6335; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #16] @ 4-byte Spill
6336; CHECK-THUMB8BASE-NEXT:    bne .LBB30_1
6337; CHECK-THUMB8BASE-NEXT:    b .LBB30_7
6338; CHECK-THUMB8BASE-NEXT:  .LBB30_7: @ %atomicrmw.end
6339; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp] @ 4-byte Reload
6340; CHECK-THUMB8BASE-NEXT:    add sp, #20
6341; CHECK-THUMB8BASE-NEXT:    pop {r4, pc}
6342entry:
6343  %0 = atomicrmw min i32* @atomic_i32, i32 1 monotonic
6344  ret i32 %0
6345}
6346define i32 @test_umax_i32() {
6347; CHECK-ARM8-LABEL: test_umax_i32:
6348; CHECK-ARM8:       @ %bb.0: @ %entry
6349; CHECK-ARM8-NEXT:    .pad #8
6350; CHECK-ARM8-NEXT:    sub sp, sp, #8
6351; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i32
6352; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i32
6353; CHECK-ARM8-NEXT:    ldr r0, [r0]
6354; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
6355; CHECK-ARM8-NEXT:    b .LBB31_1
6356; CHECK-ARM8-NEXT:  .LBB31_1: @ %atomicrmw.start
6357; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
6358; CHECK-ARM8-NEXT:    @ Child Loop BB31_2 Depth 2
6359; CHECK-ARM8-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
6360; CHECK-ARM8-NEXT:    mov r12, #1
6361; CHECK-ARM8-NEXT:    cmp r1, #1
6362; CHECK-ARM8-NEXT:    movhi r12, r1
6363; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i32
6364; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i32
6365; CHECK-ARM8-NEXT:  .LBB31_2: @ %atomicrmw.start
6366; CHECK-ARM8-NEXT:    @ Parent Loop BB31_1 Depth=1
6367; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
6368; CHECK-ARM8-NEXT:    ldrex r0, [r3]
6369; CHECK-ARM8-NEXT:    cmp r0, r1
6370; CHECK-ARM8-NEXT:    bne .LBB31_4
6371; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
6372; CHECK-ARM8-NEXT:    @ in Loop: Header=BB31_2 Depth=2
6373; CHECK-ARM8-NEXT:    strex r2, r12, [r3]
6374; CHECK-ARM8-NEXT:    cmp r2, #0
6375; CHECK-ARM8-NEXT:    bne .LBB31_2
6376; CHECK-ARM8-NEXT:  .LBB31_4: @ %atomicrmw.start
6377; CHECK-ARM8-NEXT:    @ in Loop: Header=BB31_1 Depth=1
6378; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
6379; CHECK-ARM8-NEXT:    sub r1, r0, r1
6380; CHECK-ARM8-NEXT:    clz r1, r1
6381; CHECK-ARM8-NEXT:    lsr r1, r1, #5
6382; CHECK-ARM8-NEXT:    cmp r1, #1
6383; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
6384; CHECK-ARM8-NEXT:    bne .LBB31_1
6385; CHECK-ARM8-NEXT:    b .LBB31_5
6386; CHECK-ARM8-NEXT:  .LBB31_5: @ %atomicrmw.end
6387; CHECK-ARM8-NEXT:    ldr r0, [sp] @ 4-byte Reload
6388; CHECK-ARM8-NEXT:    add sp, sp, #8
6389; CHECK-ARM8-NEXT:    bx lr
6390;
6391; CHECK-ARM6-LABEL: test_umax_i32:
6392; CHECK-ARM6:       @ %bb.0: @ %entry
6393; CHECK-ARM6-NEXT:    .pad #8
6394; CHECK-ARM6-NEXT:    sub sp, sp, #8
6395; CHECK-ARM6-NEXT:    ldr r0, .LCPI31_0
6396; CHECK-ARM6-NEXT:    ldr r0, [r0]
6397; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
6398; CHECK-ARM6-NEXT:    b .LBB31_1
6399; CHECK-ARM6-NEXT:  .LBB31_1: @ %atomicrmw.start
6400; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
6401; CHECK-ARM6-NEXT:    @ Child Loop BB31_2 Depth 2
6402; CHECK-ARM6-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
6403; CHECK-ARM6-NEXT:    mov r12, #1
6404; CHECK-ARM6-NEXT:    cmp r1, #1
6405; CHECK-ARM6-NEXT:    movhi r12, r1
6406; CHECK-ARM6-NEXT:    ldr r3, .LCPI31_0
6407; CHECK-ARM6-NEXT:  .LBB31_2: @ %atomicrmw.start
6408; CHECK-ARM6-NEXT:    @ Parent Loop BB31_1 Depth=1
6409; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
6410; CHECK-ARM6-NEXT:    ldrex r0, [r3]
6411; CHECK-ARM6-NEXT:    cmp r0, r1
6412; CHECK-ARM6-NEXT:    bne .LBB31_4
6413; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
6414; CHECK-ARM6-NEXT:    @ in Loop: Header=BB31_2 Depth=2
6415; CHECK-ARM6-NEXT:    strex r2, r12, [r3]
6416; CHECK-ARM6-NEXT:    cmp r2, #0
6417; CHECK-ARM6-NEXT:    bne .LBB31_2
6418; CHECK-ARM6-NEXT:  .LBB31_4: @ %atomicrmw.start
6419; CHECK-ARM6-NEXT:    @ in Loop: Header=BB31_1 Depth=1
6420; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
6421; CHECK-ARM6-NEXT:    sub r1, r0, r1
6422; CHECK-ARM6-NEXT:    clz r1, r1
6423; CHECK-ARM6-NEXT:    lsr r1, r1, #5
6424; CHECK-ARM6-NEXT:    cmp r1, #1
6425; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
6426; CHECK-ARM6-NEXT:    bne .LBB31_1
6427; CHECK-ARM6-NEXT:    b .LBB31_5
6428; CHECK-ARM6-NEXT:  .LBB31_5: @ %atomicrmw.end
6429; CHECK-ARM6-NEXT:    ldr r0, [sp] @ 4-byte Reload
6430; CHECK-ARM6-NEXT:    add sp, sp, #8
6431; CHECK-ARM6-NEXT:    bx lr
6432; CHECK-ARM6-NEXT:    .p2align 2
6433; CHECK-ARM6-NEXT:  @ %bb.6:
6434; CHECK-ARM6-NEXT:  .LCPI31_0:
6435; CHECK-ARM6-NEXT:    .long atomic_i32
6436;
6437; CHECK-THUMB7-LABEL: test_umax_i32:
6438; CHECK-THUMB7:       @ %bb.0: @ %entry
6439; CHECK-THUMB7-NEXT:    .pad #8
6440; CHECK-THUMB7-NEXT:    sub sp, #8
6441; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i32
6442; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i32
6443; CHECK-THUMB7-NEXT:    ldr r0, [r0]
6444; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
6445; CHECK-THUMB7-NEXT:    b .LBB31_1
6446; CHECK-THUMB7-NEXT:  .LBB31_1: @ %atomicrmw.start
6447; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
6448; CHECK-THUMB7-NEXT:    @ Child Loop BB31_2 Depth 2
6449; CHECK-THUMB7-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
6450; CHECK-THUMB7-NEXT:    mov.w r12, #1
6451; CHECK-THUMB7-NEXT:    cmp r1, #1
6452; CHECK-THUMB7-NEXT:    it hi
6453; CHECK-THUMB7-NEXT:    movhi r12, r1
6454; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i32
6455; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i32
6456; CHECK-THUMB7-NEXT:  .LBB31_2: @ %atomicrmw.start
6457; CHECK-THUMB7-NEXT:    @ Parent Loop BB31_1 Depth=1
6458; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
6459; CHECK-THUMB7-NEXT:    ldrex r0, [r3]
6460; CHECK-THUMB7-NEXT:    cmp r0, r1
6461; CHECK-THUMB7-NEXT:    bne .LBB31_4
6462; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
6463; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB31_2 Depth=2
6464; CHECK-THUMB7-NEXT:    strex r2, r12, [r3]
6465; CHECK-THUMB7-NEXT:    cmp r2, #0
6466; CHECK-THUMB7-NEXT:    bne .LBB31_2
6467; CHECK-THUMB7-NEXT:  .LBB31_4: @ %atomicrmw.start
6468; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB31_1 Depth=1
6469; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
6470; CHECK-THUMB7-NEXT:    subs r1, r0, r1
6471; CHECK-THUMB7-NEXT:    clz r1, r1
6472; CHECK-THUMB7-NEXT:    lsrs r1, r1, #5
6473; CHECK-THUMB7-NEXT:    cmp r1, #1
6474; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
6475; CHECK-THUMB7-NEXT:    bne .LBB31_1
6476; CHECK-THUMB7-NEXT:    b .LBB31_5
6477; CHECK-THUMB7-NEXT:  .LBB31_5: @ %atomicrmw.end
6478; CHECK-THUMB7-NEXT:    ldr r0, [sp] @ 4-byte Reload
6479; CHECK-THUMB7-NEXT:    add sp, #8
6480; CHECK-THUMB7-NEXT:    bx lr
6481;
6482; CHECK-THUMB6-LABEL: test_umax_i32:
6483; CHECK-THUMB6:       @ %bb.0: @ %entry
6484; CHECK-THUMB6-NEXT:    .save {r7, lr}
6485; CHECK-THUMB6-NEXT:    push {r7, lr}
6486; CHECK-THUMB6-NEXT:    ldr r0, .LCPI31_0
6487; CHECK-THUMB6-NEXT:    movs r1, #1
6488; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_umax_4
6489; CHECK-THUMB6-NEXT:    pop {r7, pc}
6490; CHECK-THUMB6-NEXT:    .p2align 2
6491; CHECK-THUMB6-NEXT:  @ %bb.1:
6492; CHECK-THUMB6-NEXT:  .LCPI31_0:
6493; CHECK-THUMB6-NEXT:    .long atomic_i32
6494;
6495; CHECK-THUMB8BASE-LABEL: test_umax_i32:
6496; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
6497; CHECK-THUMB8BASE-NEXT:    .save {r4, lr}
6498; CHECK-THUMB8BASE-NEXT:    push {r4, lr}
6499; CHECK-THUMB8BASE-NEXT:    .pad #20
6500; CHECK-THUMB8BASE-NEXT:    sub sp, #20
6501; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i32
6502; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i32
6503; CHECK-THUMB8BASE-NEXT:    ldr r0, [r0]
6504; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #16] @ 4-byte Spill
6505; CHECK-THUMB8BASE-NEXT:    b .LBB31_1
6506; CHECK-THUMB8BASE-NEXT:  .LBB31_1: @ %atomicrmw.start
6507; CHECK-THUMB8BASE-NEXT:    @ =>This Loop Header: Depth=1
6508; CHECK-THUMB8BASE-NEXT:    @ Child Loop BB31_4 Depth 2
6509; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #16] @ 4-byte Reload
6510; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
6511; CHECK-THUMB8BASE-NEXT:    movs r1, #1
6512; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #8] @ 4-byte Spill
6513; CHECK-THUMB8BASE-NEXT:    cmp r0, #1
6514; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #12] @ 4-byte Spill
6515; CHECK-THUMB8BASE-NEXT:    bhi .LBB31_3
6516; CHECK-THUMB8BASE-NEXT:  @ %bb.2: @ %atomicrmw.start
6517; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB31_1 Depth=1
6518; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #8] @ 4-byte Reload
6519; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #12] @ 4-byte Spill
6520; CHECK-THUMB8BASE-NEXT:  .LBB31_3: @ %atomicrmw.start
6521; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB31_1 Depth=1
6522; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
6523; CHECK-THUMB8BASE-NEXT:    ldr r4, [sp, #12] @ 4-byte Reload
6524; CHECK-THUMB8BASE-NEXT:    movw r3, :lower16:atomic_i32
6525; CHECK-THUMB8BASE-NEXT:    movt r3, :upper16:atomic_i32
6526; CHECK-THUMB8BASE-NEXT:  .LBB31_4: @ %atomicrmw.start
6527; CHECK-THUMB8BASE-NEXT:    @ Parent Loop BB31_1 Depth=1
6528; CHECK-THUMB8BASE-NEXT:    @ => This Inner Loop Header: Depth=2
6529; CHECK-THUMB8BASE-NEXT:    ldrex r0, [r3]
6530; CHECK-THUMB8BASE-NEXT:    cmp r0, r1
6531; CHECK-THUMB8BASE-NEXT:    bne .LBB31_6
6532; CHECK-THUMB8BASE-NEXT:  @ %bb.5: @ %atomicrmw.start
6533; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB31_4 Depth=2
6534; CHECK-THUMB8BASE-NEXT:    strex r2, r4, [r3]
6535; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
6536; CHECK-THUMB8BASE-NEXT:    bne .LBB31_4
6537; CHECK-THUMB8BASE-NEXT:  .LBB31_6: @ %atomicrmw.start
6538; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB31_1 Depth=1
6539; CHECK-THUMB8BASE-NEXT:    str r0, [sp] @ 4-byte Spill
6540; CHECK-THUMB8BASE-NEXT:    subs r1, r0, r1
6541; CHECK-THUMB8BASE-NEXT:    rsbs r2, r1, #0
6542; CHECK-THUMB8BASE-NEXT:    adcs r1, r2
6543; CHECK-THUMB8BASE-NEXT:    cmp r1, #1
6544; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #16] @ 4-byte Spill
6545; CHECK-THUMB8BASE-NEXT:    bne .LBB31_1
6546; CHECK-THUMB8BASE-NEXT:    b .LBB31_7
6547; CHECK-THUMB8BASE-NEXT:  .LBB31_7: @ %atomicrmw.end
6548; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp] @ 4-byte Reload
6549; CHECK-THUMB8BASE-NEXT:    add sp, #20
6550; CHECK-THUMB8BASE-NEXT:    pop {r4, pc}
6551entry:
6552  %0 = atomicrmw umax i32* @atomic_i32, i32 1 monotonic
6553  ret i32 %0
6554}
6555define i32 @test_umin_i32() {
6556; CHECK-ARM8-LABEL: test_umin_i32:
6557; CHECK-ARM8:       @ %bb.0: @ %entry
6558; CHECK-ARM8-NEXT:    .pad #8
6559; CHECK-ARM8-NEXT:    sub sp, sp, #8
6560; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i32
6561; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i32
6562; CHECK-ARM8-NEXT:    ldr r0, [r0]
6563; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
6564; CHECK-ARM8-NEXT:    b .LBB32_1
6565; CHECK-ARM8-NEXT:  .LBB32_1: @ %atomicrmw.start
6566; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
6567; CHECK-ARM8-NEXT:    @ Child Loop BB32_2 Depth 2
6568; CHECK-ARM8-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
6569; CHECK-ARM8-NEXT:    mov r12, #1
6570; CHECK-ARM8-NEXT:    cmp r1, #2
6571; CHECK-ARM8-NEXT:    movlo r12, r1
6572; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i32
6573; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i32
6574; CHECK-ARM8-NEXT:  .LBB32_2: @ %atomicrmw.start
6575; CHECK-ARM8-NEXT:    @ Parent Loop BB32_1 Depth=1
6576; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
6577; CHECK-ARM8-NEXT:    ldrex r0, [r3]
6578; CHECK-ARM8-NEXT:    cmp r0, r1
6579; CHECK-ARM8-NEXT:    bne .LBB32_4
6580; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
6581; CHECK-ARM8-NEXT:    @ in Loop: Header=BB32_2 Depth=2
6582; CHECK-ARM8-NEXT:    strex r2, r12, [r3]
6583; CHECK-ARM8-NEXT:    cmp r2, #0
6584; CHECK-ARM8-NEXT:    bne .LBB32_2
6585; CHECK-ARM8-NEXT:  .LBB32_4: @ %atomicrmw.start
6586; CHECK-ARM8-NEXT:    @ in Loop: Header=BB32_1 Depth=1
6587; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
6588; CHECK-ARM8-NEXT:    sub r1, r0, r1
6589; CHECK-ARM8-NEXT:    clz r1, r1
6590; CHECK-ARM8-NEXT:    lsr r1, r1, #5
6591; CHECK-ARM8-NEXT:    cmp r1, #1
6592; CHECK-ARM8-NEXT:    str r0, [sp, #4] @ 4-byte Spill
6593; CHECK-ARM8-NEXT:    bne .LBB32_1
6594; CHECK-ARM8-NEXT:    b .LBB32_5
6595; CHECK-ARM8-NEXT:  .LBB32_5: @ %atomicrmw.end
6596; CHECK-ARM8-NEXT:    ldr r0, [sp] @ 4-byte Reload
6597; CHECK-ARM8-NEXT:    add sp, sp, #8
6598; CHECK-ARM8-NEXT:    bx lr
6599;
6600; CHECK-ARM6-LABEL: test_umin_i32:
6601; CHECK-ARM6:       @ %bb.0: @ %entry
6602; CHECK-ARM6-NEXT:    .pad #8
6603; CHECK-ARM6-NEXT:    sub sp, sp, #8
6604; CHECK-ARM6-NEXT:    ldr r0, .LCPI32_0
6605; CHECK-ARM6-NEXT:    ldr r0, [r0]
6606; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
6607; CHECK-ARM6-NEXT:    b .LBB32_1
6608; CHECK-ARM6-NEXT:  .LBB32_1: @ %atomicrmw.start
6609; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
6610; CHECK-ARM6-NEXT:    @ Child Loop BB32_2 Depth 2
6611; CHECK-ARM6-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
6612; CHECK-ARM6-NEXT:    mov r12, #1
6613; CHECK-ARM6-NEXT:    cmp r1, #2
6614; CHECK-ARM6-NEXT:    movlo r12, r1
6615; CHECK-ARM6-NEXT:    ldr r3, .LCPI32_0
6616; CHECK-ARM6-NEXT:  .LBB32_2: @ %atomicrmw.start
6617; CHECK-ARM6-NEXT:    @ Parent Loop BB32_1 Depth=1
6618; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
6619; CHECK-ARM6-NEXT:    ldrex r0, [r3]
6620; CHECK-ARM6-NEXT:    cmp r0, r1
6621; CHECK-ARM6-NEXT:    bne .LBB32_4
6622; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
6623; CHECK-ARM6-NEXT:    @ in Loop: Header=BB32_2 Depth=2
6624; CHECK-ARM6-NEXT:    strex r2, r12, [r3]
6625; CHECK-ARM6-NEXT:    cmp r2, #0
6626; CHECK-ARM6-NEXT:    bne .LBB32_2
6627; CHECK-ARM6-NEXT:  .LBB32_4: @ %atomicrmw.start
6628; CHECK-ARM6-NEXT:    @ in Loop: Header=BB32_1 Depth=1
6629; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
6630; CHECK-ARM6-NEXT:    sub r1, r0, r1
6631; CHECK-ARM6-NEXT:    clz r1, r1
6632; CHECK-ARM6-NEXT:    lsr r1, r1, #5
6633; CHECK-ARM6-NEXT:    cmp r1, #1
6634; CHECK-ARM6-NEXT:    str r0, [sp, #4] @ 4-byte Spill
6635; CHECK-ARM6-NEXT:    bne .LBB32_1
6636; CHECK-ARM6-NEXT:    b .LBB32_5
6637; CHECK-ARM6-NEXT:  .LBB32_5: @ %atomicrmw.end
6638; CHECK-ARM6-NEXT:    ldr r0, [sp] @ 4-byte Reload
6639; CHECK-ARM6-NEXT:    add sp, sp, #8
6640; CHECK-ARM6-NEXT:    bx lr
6641; CHECK-ARM6-NEXT:    .p2align 2
6642; CHECK-ARM6-NEXT:  @ %bb.6:
6643; CHECK-ARM6-NEXT:  .LCPI32_0:
6644; CHECK-ARM6-NEXT:    .long atomic_i32
6645;
6646; CHECK-THUMB7-LABEL: test_umin_i32:
6647; CHECK-THUMB7:       @ %bb.0: @ %entry
6648; CHECK-THUMB7-NEXT:    .pad #8
6649; CHECK-THUMB7-NEXT:    sub sp, #8
6650; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i32
6651; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i32
6652; CHECK-THUMB7-NEXT:    ldr r0, [r0]
6653; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
6654; CHECK-THUMB7-NEXT:    b .LBB32_1
6655; CHECK-THUMB7-NEXT:  .LBB32_1: @ %atomicrmw.start
6656; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
6657; CHECK-THUMB7-NEXT:    @ Child Loop BB32_2 Depth 2
6658; CHECK-THUMB7-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
6659; CHECK-THUMB7-NEXT:    mov.w r12, #1
6660; CHECK-THUMB7-NEXT:    cmp r1, #2
6661; CHECK-THUMB7-NEXT:    it lo
6662; CHECK-THUMB7-NEXT:    movlo r12, r1
6663; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i32
6664; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i32
6665; CHECK-THUMB7-NEXT:  .LBB32_2: @ %atomicrmw.start
6666; CHECK-THUMB7-NEXT:    @ Parent Loop BB32_1 Depth=1
6667; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
6668; CHECK-THUMB7-NEXT:    ldrex r0, [r3]
6669; CHECK-THUMB7-NEXT:    cmp r0, r1
6670; CHECK-THUMB7-NEXT:    bne .LBB32_4
6671; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
6672; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB32_2 Depth=2
6673; CHECK-THUMB7-NEXT:    strex r2, r12, [r3]
6674; CHECK-THUMB7-NEXT:    cmp r2, #0
6675; CHECK-THUMB7-NEXT:    bne .LBB32_2
6676; CHECK-THUMB7-NEXT:  .LBB32_4: @ %atomicrmw.start
6677; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB32_1 Depth=1
6678; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
6679; CHECK-THUMB7-NEXT:    subs r1, r0, r1
6680; CHECK-THUMB7-NEXT:    clz r1, r1
6681; CHECK-THUMB7-NEXT:    lsrs r1, r1, #5
6682; CHECK-THUMB7-NEXT:    cmp r1, #1
6683; CHECK-THUMB7-NEXT:    str r0, [sp, #4] @ 4-byte Spill
6684; CHECK-THUMB7-NEXT:    bne .LBB32_1
6685; CHECK-THUMB7-NEXT:    b .LBB32_5
6686; CHECK-THUMB7-NEXT:  .LBB32_5: @ %atomicrmw.end
6687; CHECK-THUMB7-NEXT:    ldr r0, [sp] @ 4-byte Reload
6688; CHECK-THUMB7-NEXT:    add sp, #8
6689; CHECK-THUMB7-NEXT:    bx lr
6690;
6691; CHECK-THUMB6-LABEL: test_umin_i32:
6692; CHECK-THUMB6:       @ %bb.0: @ %entry
6693; CHECK-THUMB6-NEXT:    .save {r7, lr}
6694; CHECK-THUMB6-NEXT:    push {r7, lr}
6695; CHECK-THUMB6-NEXT:    ldr r0, .LCPI32_0
6696; CHECK-THUMB6-NEXT:    movs r1, #1
6697; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_umin_4
6698; CHECK-THUMB6-NEXT:    pop {r7, pc}
6699; CHECK-THUMB6-NEXT:    .p2align 2
6700; CHECK-THUMB6-NEXT:  @ %bb.1:
6701; CHECK-THUMB6-NEXT:  .LCPI32_0:
6702; CHECK-THUMB6-NEXT:    .long atomic_i32
6703;
6704; CHECK-THUMB8BASE-LABEL: test_umin_i32:
6705; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
6706; CHECK-THUMB8BASE-NEXT:    .save {r4, lr}
6707; CHECK-THUMB8BASE-NEXT:    push {r4, lr}
6708; CHECK-THUMB8BASE-NEXT:    .pad #20
6709; CHECK-THUMB8BASE-NEXT:    sub sp, #20
6710; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i32
6711; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i32
6712; CHECK-THUMB8BASE-NEXT:    ldr r0, [r0]
6713; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #16] @ 4-byte Spill
6714; CHECK-THUMB8BASE-NEXT:    b .LBB32_1
6715; CHECK-THUMB8BASE-NEXT:  .LBB32_1: @ %atomicrmw.start
6716; CHECK-THUMB8BASE-NEXT:    @ =>This Loop Header: Depth=1
6717; CHECK-THUMB8BASE-NEXT:    @ Child Loop BB32_4 Depth 2
6718; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #16] @ 4-byte Reload
6719; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4] @ 4-byte Spill
6720; CHECK-THUMB8BASE-NEXT:    movs r1, #1
6721; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #8] @ 4-byte Spill
6722; CHECK-THUMB8BASE-NEXT:    cmp r0, #2
6723; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #12] @ 4-byte Spill
6724; CHECK-THUMB8BASE-NEXT:    blo .LBB32_3
6725; CHECK-THUMB8BASE-NEXT:  @ %bb.2: @ %atomicrmw.start
6726; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB32_1 Depth=1
6727; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #8] @ 4-byte Reload
6728; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #12] @ 4-byte Spill
6729; CHECK-THUMB8BASE-NEXT:  .LBB32_3: @ %atomicrmw.start
6730; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB32_1 Depth=1
6731; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
6732; CHECK-THUMB8BASE-NEXT:    ldr r4, [sp, #12] @ 4-byte Reload
6733; CHECK-THUMB8BASE-NEXT:    movw r3, :lower16:atomic_i32
6734; CHECK-THUMB8BASE-NEXT:    movt r3, :upper16:atomic_i32
6735; CHECK-THUMB8BASE-NEXT:  .LBB32_4: @ %atomicrmw.start
6736; CHECK-THUMB8BASE-NEXT:    @ Parent Loop BB32_1 Depth=1
6737; CHECK-THUMB8BASE-NEXT:    @ => This Inner Loop Header: Depth=2
6738; CHECK-THUMB8BASE-NEXT:    ldrex r0, [r3]
6739; CHECK-THUMB8BASE-NEXT:    cmp r0, r1
6740; CHECK-THUMB8BASE-NEXT:    bne .LBB32_6
6741; CHECK-THUMB8BASE-NEXT:  @ %bb.5: @ %atomicrmw.start
6742; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB32_4 Depth=2
6743; CHECK-THUMB8BASE-NEXT:    strex r2, r4, [r3]
6744; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
6745; CHECK-THUMB8BASE-NEXT:    bne .LBB32_4
6746; CHECK-THUMB8BASE-NEXT:  .LBB32_6: @ %atomicrmw.start
6747; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB32_1 Depth=1
6748; CHECK-THUMB8BASE-NEXT:    str r0, [sp] @ 4-byte Spill
6749; CHECK-THUMB8BASE-NEXT:    subs r1, r0, r1
6750; CHECK-THUMB8BASE-NEXT:    rsbs r2, r1, #0
6751; CHECK-THUMB8BASE-NEXT:    adcs r1, r2
6752; CHECK-THUMB8BASE-NEXT:    cmp r1, #1
6753; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #16] @ 4-byte Spill
6754; CHECK-THUMB8BASE-NEXT:    bne .LBB32_1
6755; CHECK-THUMB8BASE-NEXT:    b .LBB32_7
6756; CHECK-THUMB8BASE-NEXT:  .LBB32_7: @ %atomicrmw.end
6757; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp] @ 4-byte Reload
6758; CHECK-THUMB8BASE-NEXT:    add sp, #20
6759; CHECK-THUMB8BASE-NEXT:    pop {r4, pc}
6760entry:
6761  %0 = atomicrmw umin i32* @atomic_i32, i32 1 monotonic
6762  ret i32 %0
6763}
6764
6765define i64 @test_xchg_i64() {
6766; CHECK-ARM8-LABEL: test_xchg_i64:
6767; CHECK-ARM8:       @ %bb.0: @ %entry
6768; CHECK-ARM8-NEXT:    .save {r4, r5, r6, r7, r8, r9, r11, lr}
6769; CHECK-ARM8-NEXT:    push {r4, r5, r6, r7, r8, r9, r11, lr}
6770; CHECK-ARM8-NEXT:    .pad #16
6771; CHECK-ARM8-NEXT:    sub sp, sp, #16
6772; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i64
6773; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i64
6774; CHECK-ARM8-NEXT:    ldr r1, [r0]
6775; CHECK-ARM8-NEXT:    ldr r0, [r0, #4]
6776; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
6777; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
6778; CHECK-ARM8-NEXT:    b .LBB33_1
6779; CHECK-ARM8-NEXT:  .LBB33_1: @ %atomicrmw.start
6780; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
6781; CHECK-ARM8-NEXT:    @ Child Loop BB33_2 Depth 2
6782; CHECK-ARM8-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
6783; CHECK-ARM8-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
6784; CHECK-ARM8-NEXT:    mov r6, r2
6785; CHECK-ARM8-NEXT:    mov r7, r1
6786; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i64
6787; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i64
6788; CHECK-ARM8-NEXT:    mov r0, #0
6789; CHECK-ARM8-NEXT:    mov r8, #1
6790; CHECK-ARM8-NEXT:    @ kill: def $r8 killed $r8 def $r8_r9
6791; CHECK-ARM8-NEXT:    mov r9, r0
6792; CHECK-ARM8-NEXT:  .LBB33_2: @ %atomicrmw.start
6793; CHECK-ARM8-NEXT:    @ Parent Loop BB33_1 Depth=1
6794; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
6795; CHECK-ARM8-NEXT:    ldrexd r4, r5, [r3]
6796; CHECK-ARM8-NEXT:    cmp r4, r6
6797; CHECK-ARM8-NEXT:    cmpeq r5, r7
6798; CHECK-ARM8-NEXT:    bne .LBB33_4
6799; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
6800; CHECK-ARM8-NEXT:    @ in Loop: Header=BB33_2 Depth=2
6801; CHECK-ARM8-NEXT:    strexd r0, r8, r9, [r3]
6802; CHECK-ARM8-NEXT:    cmp r0, #0
6803; CHECK-ARM8-NEXT:    bne .LBB33_2
6804; CHECK-ARM8-NEXT:  .LBB33_4: @ %atomicrmw.start
6805; CHECK-ARM8-NEXT:    @ in Loop: Header=BB33_1 Depth=1
6806; CHECK-ARM8-NEXT:    mov r0, r5
6807; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
6808; CHECK-ARM8-NEXT:    eor r3, r0, r1
6809; CHECK-ARM8-NEXT:    mov r1, r4
6810; CHECK-ARM8-NEXT:    str r1, [sp, #4] @ 4-byte Spill
6811; CHECK-ARM8-NEXT:    eor r2, r1, r2
6812; CHECK-ARM8-NEXT:    orr r2, r2, r3
6813; CHECK-ARM8-NEXT:    cmp r2, #0
6814; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
6815; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
6816; CHECK-ARM8-NEXT:    bne .LBB33_1
6817; CHECK-ARM8-NEXT:    b .LBB33_5
6818; CHECK-ARM8-NEXT:  .LBB33_5: @ %atomicrmw.end
6819; CHECK-ARM8-NEXT:    ldr r1, [sp] @ 4-byte Reload
6820; CHECK-ARM8-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
6821; CHECK-ARM8-NEXT:    add sp, sp, #16
6822; CHECK-ARM8-NEXT:    pop {r4, r5, r6, r7, r8, r9, r11, pc}
6823;
6824; CHECK-ARM6-LABEL: test_xchg_i64:
6825; CHECK-ARM6:       @ %bb.0: @ %entry
6826; CHECK-ARM6-NEXT:    .save {r4, r5, r6, r7, r8, r9, r11, lr}
6827; CHECK-ARM6-NEXT:    push {r4, r5, r6, r7, r8, r9, r11, lr}
6828; CHECK-ARM6-NEXT:    .pad #16
6829; CHECK-ARM6-NEXT:    sub sp, sp, #16
6830; CHECK-ARM6-NEXT:    ldr r0, .LCPI33_0
6831; CHECK-ARM6-NEXT:    ldr r1, [r0]
6832; CHECK-ARM6-NEXT:    ldr r0, [r0, #4]
6833; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
6834; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
6835; CHECK-ARM6-NEXT:    b .LBB33_1
6836; CHECK-ARM6-NEXT:  .LBB33_1: @ %atomicrmw.start
6837; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
6838; CHECK-ARM6-NEXT:    @ Child Loop BB33_2 Depth 2
6839; CHECK-ARM6-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
6840; CHECK-ARM6-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
6841; CHECK-ARM6-NEXT:    mov r6, r2
6842; CHECK-ARM6-NEXT:    mov r7, r1
6843; CHECK-ARM6-NEXT:    ldr r3, .LCPI33_0
6844; CHECK-ARM6-NEXT:    mov r0, #0
6845; CHECK-ARM6-NEXT:    mov r8, #1
6846; CHECK-ARM6-NEXT:    @ kill: def $r8 killed $r8 def $r8_r9
6847; CHECK-ARM6-NEXT:    mov r9, r0
6848; CHECK-ARM6-NEXT:  .LBB33_2: @ %atomicrmw.start
6849; CHECK-ARM6-NEXT:    @ Parent Loop BB33_1 Depth=1
6850; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
6851; CHECK-ARM6-NEXT:    ldrexd r4, r5, [r3]
6852; CHECK-ARM6-NEXT:    cmp r4, r6
6853; CHECK-ARM6-NEXT:    cmpeq r5, r7
6854; CHECK-ARM6-NEXT:    bne .LBB33_4
6855; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
6856; CHECK-ARM6-NEXT:    @ in Loop: Header=BB33_2 Depth=2
6857; CHECK-ARM6-NEXT:    strexd r0, r8, r9, [r3]
6858; CHECK-ARM6-NEXT:    cmp r0, #0
6859; CHECK-ARM6-NEXT:    bne .LBB33_2
6860; CHECK-ARM6-NEXT:  .LBB33_4: @ %atomicrmw.start
6861; CHECK-ARM6-NEXT:    @ in Loop: Header=BB33_1 Depth=1
6862; CHECK-ARM6-NEXT:    mov r0, r5
6863; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
6864; CHECK-ARM6-NEXT:    eor r3, r0, r1
6865; CHECK-ARM6-NEXT:    mov r1, r4
6866; CHECK-ARM6-NEXT:    str r1, [sp, #4] @ 4-byte Spill
6867; CHECK-ARM6-NEXT:    eor r2, r1, r2
6868; CHECK-ARM6-NEXT:    orr r2, r2, r3
6869; CHECK-ARM6-NEXT:    cmp r2, #0
6870; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
6871; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
6872; CHECK-ARM6-NEXT:    bne .LBB33_1
6873; CHECK-ARM6-NEXT:    b .LBB33_5
6874; CHECK-ARM6-NEXT:  .LBB33_5: @ %atomicrmw.end
6875; CHECK-ARM6-NEXT:    ldr r1, [sp] @ 4-byte Reload
6876; CHECK-ARM6-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
6877; CHECK-ARM6-NEXT:    add sp, sp, #16
6878; CHECK-ARM6-NEXT:    pop {r4, r5, r6, r7, r8, r9, r11, pc}
6879; CHECK-ARM6-NEXT:    .p2align 2
6880; CHECK-ARM6-NEXT:  @ %bb.6:
6881; CHECK-ARM6-NEXT:  .LCPI33_0:
6882; CHECK-ARM6-NEXT:    .long atomic_i64
6883;
6884; CHECK-THUMB7-LABEL: test_xchg_i64:
6885; CHECK-THUMB7:       @ %bb.0: @ %entry
6886; CHECK-THUMB7-NEXT:    .save {r4, r5, r6, r7, r8, r9, lr}
6887; CHECK-THUMB7-NEXT:    push.w {r4, r5, r6, r7, r8, r9, lr}
6888; CHECK-THUMB7-NEXT:    .pad #16
6889; CHECK-THUMB7-NEXT:    sub sp, #16
6890; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i64
6891; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i64
6892; CHECK-THUMB7-NEXT:    ldr r1, [r0]
6893; CHECK-THUMB7-NEXT:    ldr r0, [r0, #4]
6894; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
6895; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
6896; CHECK-THUMB7-NEXT:    b .LBB33_1
6897; CHECK-THUMB7-NEXT:  .LBB33_1: @ %atomicrmw.start
6898; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
6899; CHECK-THUMB7-NEXT:    @ Child Loop BB33_2 Depth 2
6900; CHECK-THUMB7-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
6901; CHECK-THUMB7-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
6902; CHECK-THUMB7-NEXT:    mov r6, r2
6903; CHECK-THUMB7-NEXT:    mov r7, r1
6904; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i64
6905; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i64
6906; CHECK-THUMB7-NEXT:    movs r0, #0
6907; CHECK-THUMB7-NEXT:    mov.w r8, #1
6908; CHECK-THUMB7-NEXT:    @ kill: def $r8 killed $r8 def $r8_r9
6909; CHECK-THUMB7-NEXT:    mov r9, r0
6910; CHECK-THUMB7-NEXT:  .LBB33_2: @ %atomicrmw.start
6911; CHECK-THUMB7-NEXT:    @ Parent Loop BB33_1 Depth=1
6912; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
6913; CHECK-THUMB7-NEXT:    ldrexd r4, r5, [r3]
6914; CHECK-THUMB7-NEXT:    cmp r4, r6
6915; CHECK-THUMB7-NEXT:    it eq
6916; CHECK-THUMB7-NEXT:    cmpeq r5, r7
6917; CHECK-THUMB7-NEXT:    bne .LBB33_4
6918; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
6919; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB33_2 Depth=2
6920; CHECK-THUMB7-NEXT:    strexd r0, r8, r9, [r3]
6921; CHECK-THUMB7-NEXT:    cmp r0, #0
6922; CHECK-THUMB7-NEXT:    bne .LBB33_2
6923; CHECK-THUMB7-NEXT:  .LBB33_4: @ %atomicrmw.start
6924; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB33_1 Depth=1
6925; CHECK-THUMB7-NEXT:    mov r0, r5
6926; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
6927; CHECK-THUMB7-NEXT:    eor.w r3, r0, r1
6928; CHECK-THUMB7-NEXT:    mov r1, r4
6929; CHECK-THUMB7-NEXT:    str r1, [sp, #4] @ 4-byte Spill
6930; CHECK-THUMB7-NEXT:    eors r2, r1
6931; CHECK-THUMB7-NEXT:    orrs r2, r3
6932; CHECK-THUMB7-NEXT:    cmp r2, #0
6933; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
6934; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
6935; CHECK-THUMB7-NEXT:    bne .LBB33_1
6936; CHECK-THUMB7-NEXT:    b .LBB33_5
6937; CHECK-THUMB7-NEXT:  .LBB33_5: @ %atomicrmw.end
6938; CHECK-THUMB7-NEXT:    ldr r1, [sp] @ 4-byte Reload
6939; CHECK-THUMB7-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
6940; CHECK-THUMB7-NEXT:    add sp, #16
6941; CHECK-THUMB7-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, pc}
6942;
6943; CHECK-THUMB6-LABEL: test_xchg_i64:
6944; CHECK-THUMB6:       @ %bb.0: @ %entry
6945; CHECK-THUMB6-NEXT:    .save {r7, lr}
6946; CHECK-THUMB6-NEXT:    push {r7, lr}
6947; CHECK-THUMB6-NEXT:    ldr r0, .LCPI33_0
6948; CHECK-THUMB6-NEXT:    movs r2, #1
6949; CHECK-THUMB6-NEXT:    movs r3, #0
6950; CHECK-THUMB6-NEXT:    bl __sync_lock_test_and_set_8
6951; CHECK-THUMB6-NEXT:    pop {r7, pc}
6952; CHECK-THUMB6-NEXT:    .p2align 2
6953; CHECK-THUMB6-NEXT:  @ %bb.1:
6954; CHECK-THUMB6-NEXT:  .LCPI33_0:
6955; CHECK-THUMB6-NEXT:    .long atomic_i64
6956;
6957; CHECK-THUMB8BASE-LABEL: test_xchg_i64:
6958; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
6959; CHECK-THUMB8BASE-NEXT:    .save {r7, lr}
6960; CHECK-THUMB8BASE-NEXT:    push {r7, lr}
6961; CHECK-THUMB8BASE-NEXT:    .pad #8
6962; CHECK-THUMB8BASE-NEXT:    sub sp, #8
6963; CHECK-THUMB8BASE-NEXT:    movs r3, #0
6964; CHECK-THUMB8BASE-NEXT:    str r3, [sp]
6965; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i64
6966; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i64
6967; CHECK-THUMB8BASE-NEXT:    movs r2, #1
6968; CHECK-THUMB8BASE-NEXT:    bl __atomic_exchange_8
6969; CHECK-THUMB8BASE-NEXT:    add sp, #8
6970; CHECK-THUMB8BASE-NEXT:    pop {r7, pc}
6971entry:
6972  %0 = atomicrmw xchg i64* @atomic_i64, i64 1 monotonic
6973  ret i64 %0
6974}
6975define i64 @test_add_i64() {
6976; CHECK-ARM8-LABEL: test_add_i64:
6977; CHECK-ARM8:       @ %bb.0: @ %entry
6978; CHECK-ARM8-NEXT:    .save {r4, r5, r6, r7, r8, r9, r11, lr}
6979; CHECK-ARM8-NEXT:    push {r4, r5, r6, r7, r8, r9, r11, lr}
6980; CHECK-ARM8-NEXT:    .pad #16
6981; CHECK-ARM8-NEXT:    sub sp, sp, #16
6982; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i64
6983; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i64
6984; CHECK-ARM8-NEXT:    ldr r1, [r0]
6985; CHECK-ARM8-NEXT:    ldr r0, [r0, #4]
6986; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
6987; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
6988; CHECK-ARM8-NEXT:    b .LBB34_1
6989; CHECK-ARM8-NEXT:  .LBB34_1: @ %atomicrmw.start
6990; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
6991; CHECK-ARM8-NEXT:    @ Child Loop BB34_2 Depth 2
6992; CHECK-ARM8-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
6993; CHECK-ARM8-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
6994; CHECK-ARM8-NEXT:    mov r6, r2
6995; CHECK-ARM8-NEXT:    mov r7, r1
6996; CHECK-ARM8-NEXT:    adds r8, r2, #1
6997; CHECK-ARM8-NEXT:    adc r0, r1, #0
6998; CHECK-ARM8-NEXT:    @ kill: def $r8 killed $r8 def $r8_r9
6999; CHECK-ARM8-NEXT:    mov r9, r0
7000; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i64
7001; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i64
7002; CHECK-ARM8-NEXT:  .LBB34_2: @ %atomicrmw.start
7003; CHECK-ARM8-NEXT:    @ Parent Loop BB34_1 Depth=1
7004; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
7005; CHECK-ARM8-NEXT:    ldrexd r4, r5, [r3]
7006; CHECK-ARM8-NEXT:    cmp r4, r6
7007; CHECK-ARM8-NEXT:    cmpeq r5, r7
7008; CHECK-ARM8-NEXT:    bne .LBB34_4
7009; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
7010; CHECK-ARM8-NEXT:    @ in Loop: Header=BB34_2 Depth=2
7011; CHECK-ARM8-NEXT:    strexd r0, r8, r9, [r3]
7012; CHECK-ARM8-NEXT:    cmp r0, #0
7013; CHECK-ARM8-NEXT:    bne .LBB34_2
7014; CHECK-ARM8-NEXT:  .LBB34_4: @ %atomicrmw.start
7015; CHECK-ARM8-NEXT:    @ in Loop: Header=BB34_1 Depth=1
7016; CHECK-ARM8-NEXT:    mov r0, r5
7017; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
7018; CHECK-ARM8-NEXT:    eor r3, r0, r1
7019; CHECK-ARM8-NEXT:    mov r1, r4
7020; CHECK-ARM8-NEXT:    str r1, [sp, #4] @ 4-byte Spill
7021; CHECK-ARM8-NEXT:    eor r2, r1, r2
7022; CHECK-ARM8-NEXT:    orr r2, r2, r3
7023; CHECK-ARM8-NEXT:    cmp r2, #0
7024; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7025; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7026; CHECK-ARM8-NEXT:    bne .LBB34_1
7027; CHECK-ARM8-NEXT:    b .LBB34_5
7028; CHECK-ARM8-NEXT:  .LBB34_5: @ %atomicrmw.end
7029; CHECK-ARM8-NEXT:    ldr r1, [sp] @ 4-byte Reload
7030; CHECK-ARM8-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
7031; CHECK-ARM8-NEXT:    add sp, sp, #16
7032; CHECK-ARM8-NEXT:    pop {r4, r5, r6, r7, r8, r9, r11, pc}
7033;
7034; CHECK-ARM6-LABEL: test_add_i64:
7035; CHECK-ARM6:       @ %bb.0: @ %entry
7036; CHECK-ARM6-NEXT:    .save {r4, r5, r6, r7, r8, r9, r11, lr}
7037; CHECK-ARM6-NEXT:    push {r4, r5, r6, r7, r8, r9, r11, lr}
7038; CHECK-ARM6-NEXT:    .pad #16
7039; CHECK-ARM6-NEXT:    sub sp, sp, #16
7040; CHECK-ARM6-NEXT:    ldr r0, .LCPI34_0
7041; CHECK-ARM6-NEXT:    ldr r1, [r0]
7042; CHECK-ARM6-NEXT:    ldr r0, [r0, #4]
7043; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7044; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7045; CHECK-ARM6-NEXT:    b .LBB34_1
7046; CHECK-ARM6-NEXT:  .LBB34_1: @ %atomicrmw.start
7047; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
7048; CHECK-ARM6-NEXT:    @ Child Loop BB34_2 Depth 2
7049; CHECK-ARM6-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
7050; CHECK-ARM6-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
7051; CHECK-ARM6-NEXT:    mov r6, r2
7052; CHECK-ARM6-NEXT:    mov r7, r1
7053; CHECK-ARM6-NEXT:    adds r8, r2, #1
7054; CHECK-ARM6-NEXT:    adc r0, r1, #0
7055; CHECK-ARM6-NEXT:    @ kill: def $r8 killed $r8 def $r8_r9
7056; CHECK-ARM6-NEXT:    mov r9, r0
7057; CHECK-ARM6-NEXT:    ldr r3, .LCPI34_0
7058; CHECK-ARM6-NEXT:  .LBB34_2: @ %atomicrmw.start
7059; CHECK-ARM6-NEXT:    @ Parent Loop BB34_1 Depth=1
7060; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
7061; CHECK-ARM6-NEXT:    ldrexd r4, r5, [r3]
7062; CHECK-ARM6-NEXT:    cmp r4, r6
7063; CHECK-ARM6-NEXT:    cmpeq r5, r7
7064; CHECK-ARM6-NEXT:    bne .LBB34_4
7065; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
7066; CHECK-ARM6-NEXT:    @ in Loop: Header=BB34_2 Depth=2
7067; CHECK-ARM6-NEXT:    strexd r0, r8, r9, [r3]
7068; CHECK-ARM6-NEXT:    cmp r0, #0
7069; CHECK-ARM6-NEXT:    bne .LBB34_2
7070; CHECK-ARM6-NEXT:  .LBB34_4: @ %atomicrmw.start
7071; CHECK-ARM6-NEXT:    @ in Loop: Header=BB34_1 Depth=1
7072; CHECK-ARM6-NEXT:    mov r0, r5
7073; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
7074; CHECK-ARM6-NEXT:    eor r3, r0, r1
7075; CHECK-ARM6-NEXT:    mov r1, r4
7076; CHECK-ARM6-NEXT:    str r1, [sp, #4] @ 4-byte Spill
7077; CHECK-ARM6-NEXT:    eor r2, r1, r2
7078; CHECK-ARM6-NEXT:    orr r2, r2, r3
7079; CHECK-ARM6-NEXT:    cmp r2, #0
7080; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7081; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7082; CHECK-ARM6-NEXT:    bne .LBB34_1
7083; CHECK-ARM6-NEXT:    b .LBB34_5
7084; CHECK-ARM6-NEXT:  .LBB34_5: @ %atomicrmw.end
7085; CHECK-ARM6-NEXT:    ldr r1, [sp] @ 4-byte Reload
7086; CHECK-ARM6-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
7087; CHECK-ARM6-NEXT:    add sp, sp, #16
7088; CHECK-ARM6-NEXT:    pop {r4, r5, r6, r7, r8, r9, r11, pc}
7089; CHECK-ARM6-NEXT:    .p2align 2
7090; CHECK-ARM6-NEXT:  @ %bb.6:
7091; CHECK-ARM6-NEXT:  .LCPI34_0:
7092; CHECK-ARM6-NEXT:    .long atomic_i64
7093;
7094; CHECK-THUMB7-LABEL: test_add_i64:
7095; CHECK-THUMB7:       @ %bb.0: @ %entry
7096; CHECK-THUMB7-NEXT:    .save {r4, r5, r6, r7, r8, r9, lr}
7097; CHECK-THUMB7-NEXT:    push.w {r4, r5, r6, r7, r8, r9, lr}
7098; CHECK-THUMB7-NEXT:    .pad #16
7099; CHECK-THUMB7-NEXT:    sub sp, #16
7100; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i64
7101; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i64
7102; CHECK-THUMB7-NEXT:    ldr r1, [r0]
7103; CHECK-THUMB7-NEXT:    ldr r0, [r0, #4]
7104; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7105; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7106; CHECK-THUMB7-NEXT:    b .LBB34_1
7107; CHECK-THUMB7-NEXT:  .LBB34_1: @ %atomicrmw.start
7108; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
7109; CHECK-THUMB7-NEXT:    @ Child Loop BB34_2 Depth 2
7110; CHECK-THUMB7-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
7111; CHECK-THUMB7-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
7112; CHECK-THUMB7-NEXT:    mov r6, r2
7113; CHECK-THUMB7-NEXT:    mov r7, r1
7114; CHECK-THUMB7-NEXT:    adds.w r8, r2, #1
7115; CHECK-THUMB7-NEXT:    adc r0, r1, #0
7116; CHECK-THUMB7-NEXT:    @ kill: def $r8 killed $r8 def $r8_r9
7117; CHECK-THUMB7-NEXT:    mov r9, r0
7118; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i64
7119; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i64
7120; CHECK-THUMB7-NEXT:  .LBB34_2: @ %atomicrmw.start
7121; CHECK-THUMB7-NEXT:    @ Parent Loop BB34_1 Depth=1
7122; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
7123; CHECK-THUMB7-NEXT:    ldrexd r4, r5, [r3]
7124; CHECK-THUMB7-NEXT:    cmp r4, r6
7125; CHECK-THUMB7-NEXT:    it eq
7126; CHECK-THUMB7-NEXT:    cmpeq r5, r7
7127; CHECK-THUMB7-NEXT:    bne .LBB34_4
7128; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
7129; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB34_2 Depth=2
7130; CHECK-THUMB7-NEXT:    strexd r0, r8, r9, [r3]
7131; CHECK-THUMB7-NEXT:    cmp r0, #0
7132; CHECK-THUMB7-NEXT:    bne .LBB34_2
7133; CHECK-THUMB7-NEXT:  .LBB34_4: @ %atomicrmw.start
7134; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB34_1 Depth=1
7135; CHECK-THUMB7-NEXT:    mov r0, r5
7136; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
7137; CHECK-THUMB7-NEXT:    eor.w r3, r0, r1
7138; CHECK-THUMB7-NEXT:    mov r1, r4
7139; CHECK-THUMB7-NEXT:    str r1, [sp, #4] @ 4-byte Spill
7140; CHECK-THUMB7-NEXT:    eors r2, r1
7141; CHECK-THUMB7-NEXT:    orrs r2, r3
7142; CHECK-THUMB7-NEXT:    cmp r2, #0
7143; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7144; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7145; CHECK-THUMB7-NEXT:    bne .LBB34_1
7146; CHECK-THUMB7-NEXT:    b .LBB34_5
7147; CHECK-THUMB7-NEXT:  .LBB34_5: @ %atomicrmw.end
7148; CHECK-THUMB7-NEXT:    ldr r1, [sp] @ 4-byte Reload
7149; CHECK-THUMB7-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
7150; CHECK-THUMB7-NEXT:    add sp, #16
7151; CHECK-THUMB7-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, pc}
7152;
7153; CHECK-THUMB6-LABEL: test_add_i64:
7154; CHECK-THUMB6:       @ %bb.0: @ %entry
7155; CHECK-THUMB6-NEXT:    .save {r7, lr}
7156; CHECK-THUMB6-NEXT:    push {r7, lr}
7157; CHECK-THUMB6-NEXT:    ldr r0, .LCPI34_0
7158; CHECK-THUMB6-NEXT:    movs r2, #1
7159; CHECK-THUMB6-NEXT:    movs r3, #0
7160; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_add_8
7161; CHECK-THUMB6-NEXT:    pop {r7, pc}
7162; CHECK-THUMB6-NEXT:    .p2align 2
7163; CHECK-THUMB6-NEXT:  @ %bb.1:
7164; CHECK-THUMB6-NEXT:  .LCPI34_0:
7165; CHECK-THUMB6-NEXT:    .long atomic_i64
7166;
7167; CHECK-THUMB8BASE-LABEL: test_add_i64:
7168; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
7169; CHECK-THUMB8BASE-NEXT:    .save {r7, lr}
7170; CHECK-THUMB8BASE-NEXT:    push {r7, lr}
7171; CHECK-THUMB8BASE-NEXT:    .pad #8
7172; CHECK-THUMB8BASE-NEXT:    sub sp, #8
7173; CHECK-THUMB8BASE-NEXT:    movs r3, #0
7174; CHECK-THUMB8BASE-NEXT:    str r3, [sp]
7175; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i64
7176; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i64
7177; CHECK-THUMB8BASE-NEXT:    movs r2, #1
7178; CHECK-THUMB8BASE-NEXT:    bl __atomic_fetch_add_8
7179; CHECK-THUMB8BASE-NEXT:    add sp, #8
7180; CHECK-THUMB8BASE-NEXT:    pop {r7, pc}
7181entry:
7182  %0 = atomicrmw add i64* @atomic_i64, i64 1 monotonic
7183  ret i64 %0
7184}
7185define i64 @test_sub_i64() {
7186; CHECK-ARM8-LABEL: test_sub_i64:
7187; CHECK-ARM8:       @ %bb.0: @ %entry
7188; CHECK-ARM8-NEXT:    .save {r4, r5, r6, r7, r8, r9, r11, lr}
7189; CHECK-ARM8-NEXT:    push {r4, r5, r6, r7, r8, r9, r11, lr}
7190; CHECK-ARM8-NEXT:    .pad #16
7191; CHECK-ARM8-NEXT:    sub sp, sp, #16
7192; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i64
7193; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i64
7194; CHECK-ARM8-NEXT:    ldr r1, [r0]
7195; CHECK-ARM8-NEXT:    ldr r0, [r0, #4]
7196; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7197; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7198; CHECK-ARM8-NEXT:    b .LBB35_1
7199; CHECK-ARM8-NEXT:  .LBB35_1: @ %atomicrmw.start
7200; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
7201; CHECK-ARM8-NEXT:    @ Child Loop BB35_2 Depth 2
7202; CHECK-ARM8-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
7203; CHECK-ARM8-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
7204; CHECK-ARM8-NEXT:    mov r6, r2
7205; CHECK-ARM8-NEXT:    mov r7, r1
7206; CHECK-ARM8-NEXT:    subs r8, r2, #1
7207; CHECK-ARM8-NEXT:    sbc r0, r1, #0
7208; CHECK-ARM8-NEXT:    @ kill: def $r8 killed $r8 def $r8_r9
7209; CHECK-ARM8-NEXT:    mov r9, r0
7210; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i64
7211; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i64
7212; CHECK-ARM8-NEXT:  .LBB35_2: @ %atomicrmw.start
7213; CHECK-ARM8-NEXT:    @ Parent Loop BB35_1 Depth=1
7214; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
7215; CHECK-ARM8-NEXT:    ldrexd r4, r5, [r3]
7216; CHECK-ARM8-NEXT:    cmp r4, r6
7217; CHECK-ARM8-NEXT:    cmpeq r5, r7
7218; CHECK-ARM8-NEXT:    bne .LBB35_4
7219; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
7220; CHECK-ARM8-NEXT:    @ in Loop: Header=BB35_2 Depth=2
7221; CHECK-ARM8-NEXT:    strexd r0, r8, r9, [r3]
7222; CHECK-ARM8-NEXT:    cmp r0, #0
7223; CHECK-ARM8-NEXT:    bne .LBB35_2
7224; CHECK-ARM8-NEXT:  .LBB35_4: @ %atomicrmw.start
7225; CHECK-ARM8-NEXT:    @ in Loop: Header=BB35_1 Depth=1
7226; CHECK-ARM8-NEXT:    mov r0, r5
7227; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
7228; CHECK-ARM8-NEXT:    eor r3, r0, r1
7229; CHECK-ARM8-NEXT:    mov r1, r4
7230; CHECK-ARM8-NEXT:    str r1, [sp, #4] @ 4-byte Spill
7231; CHECK-ARM8-NEXT:    eor r2, r1, r2
7232; CHECK-ARM8-NEXT:    orr r2, r2, r3
7233; CHECK-ARM8-NEXT:    cmp r2, #0
7234; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7235; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7236; CHECK-ARM8-NEXT:    bne .LBB35_1
7237; CHECK-ARM8-NEXT:    b .LBB35_5
7238; CHECK-ARM8-NEXT:  .LBB35_5: @ %atomicrmw.end
7239; CHECK-ARM8-NEXT:    ldr r1, [sp] @ 4-byte Reload
7240; CHECK-ARM8-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
7241; CHECK-ARM8-NEXT:    add sp, sp, #16
7242; CHECK-ARM8-NEXT:    pop {r4, r5, r6, r7, r8, r9, r11, pc}
7243;
7244; CHECK-ARM6-LABEL: test_sub_i64:
7245; CHECK-ARM6:       @ %bb.0: @ %entry
7246; CHECK-ARM6-NEXT:    .save {r4, r5, r6, r7, r8, r9, r11, lr}
7247; CHECK-ARM6-NEXT:    push {r4, r5, r6, r7, r8, r9, r11, lr}
7248; CHECK-ARM6-NEXT:    .pad #16
7249; CHECK-ARM6-NEXT:    sub sp, sp, #16
7250; CHECK-ARM6-NEXT:    ldr r0, .LCPI35_0
7251; CHECK-ARM6-NEXT:    ldr r1, [r0]
7252; CHECK-ARM6-NEXT:    ldr r0, [r0, #4]
7253; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7254; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7255; CHECK-ARM6-NEXT:    b .LBB35_1
7256; CHECK-ARM6-NEXT:  .LBB35_1: @ %atomicrmw.start
7257; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
7258; CHECK-ARM6-NEXT:    @ Child Loop BB35_2 Depth 2
7259; CHECK-ARM6-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
7260; CHECK-ARM6-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
7261; CHECK-ARM6-NEXT:    mov r6, r2
7262; CHECK-ARM6-NEXT:    mov r7, r1
7263; CHECK-ARM6-NEXT:    subs r8, r2, #1
7264; CHECK-ARM6-NEXT:    sbc r0, r1, #0
7265; CHECK-ARM6-NEXT:    @ kill: def $r8 killed $r8 def $r8_r9
7266; CHECK-ARM6-NEXT:    mov r9, r0
7267; CHECK-ARM6-NEXT:    ldr r3, .LCPI35_0
7268; CHECK-ARM6-NEXT:  .LBB35_2: @ %atomicrmw.start
7269; CHECK-ARM6-NEXT:    @ Parent Loop BB35_1 Depth=1
7270; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
7271; CHECK-ARM6-NEXT:    ldrexd r4, r5, [r3]
7272; CHECK-ARM6-NEXT:    cmp r4, r6
7273; CHECK-ARM6-NEXT:    cmpeq r5, r7
7274; CHECK-ARM6-NEXT:    bne .LBB35_4
7275; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
7276; CHECK-ARM6-NEXT:    @ in Loop: Header=BB35_2 Depth=2
7277; CHECK-ARM6-NEXT:    strexd r0, r8, r9, [r3]
7278; CHECK-ARM6-NEXT:    cmp r0, #0
7279; CHECK-ARM6-NEXT:    bne .LBB35_2
7280; CHECK-ARM6-NEXT:  .LBB35_4: @ %atomicrmw.start
7281; CHECK-ARM6-NEXT:    @ in Loop: Header=BB35_1 Depth=1
7282; CHECK-ARM6-NEXT:    mov r0, r5
7283; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
7284; CHECK-ARM6-NEXT:    eor r3, r0, r1
7285; CHECK-ARM6-NEXT:    mov r1, r4
7286; CHECK-ARM6-NEXT:    str r1, [sp, #4] @ 4-byte Spill
7287; CHECK-ARM6-NEXT:    eor r2, r1, r2
7288; CHECK-ARM6-NEXT:    orr r2, r2, r3
7289; CHECK-ARM6-NEXT:    cmp r2, #0
7290; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7291; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7292; CHECK-ARM6-NEXT:    bne .LBB35_1
7293; CHECK-ARM6-NEXT:    b .LBB35_5
7294; CHECK-ARM6-NEXT:  .LBB35_5: @ %atomicrmw.end
7295; CHECK-ARM6-NEXT:    ldr r1, [sp] @ 4-byte Reload
7296; CHECK-ARM6-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
7297; CHECK-ARM6-NEXT:    add sp, sp, #16
7298; CHECK-ARM6-NEXT:    pop {r4, r5, r6, r7, r8, r9, r11, pc}
7299; CHECK-ARM6-NEXT:    .p2align 2
7300; CHECK-ARM6-NEXT:  @ %bb.6:
7301; CHECK-ARM6-NEXT:  .LCPI35_0:
7302; CHECK-ARM6-NEXT:    .long atomic_i64
7303;
7304; CHECK-THUMB7-LABEL: test_sub_i64:
7305; CHECK-THUMB7:       @ %bb.0: @ %entry
7306; CHECK-THUMB7-NEXT:    .save {r4, r5, r6, r7, r8, r9, lr}
7307; CHECK-THUMB7-NEXT:    push.w {r4, r5, r6, r7, r8, r9, lr}
7308; CHECK-THUMB7-NEXT:    .pad #16
7309; CHECK-THUMB7-NEXT:    sub sp, #16
7310; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i64
7311; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i64
7312; CHECK-THUMB7-NEXT:    ldr r1, [r0]
7313; CHECK-THUMB7-NEXT:    ldr r0, [r0, #4]
7314; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7315; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7316; CHECK-THUMB7-NEXT:    b .LBB35_1
7317; CHECK-THUMB7-NEXT:  .LBB35_1: @ %atomicrmw.start
7318; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
7319; CHECK-THUMB7-NEXT:    @ Child Loop BB35_2 Depth 2
7320; CHECK-THUMB7-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
7321; CHECK-THUMB7-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
7322; CHECK-THUMB7-NEXT:    mov r6, r2
7323; CHECK-THUMB7-NEXT:    mov r7, r1
7324; CHECK-THUMB7-NEXT:    subs.w r8, r2, #1
7325; CHECK-THUMB7-NEXT:    sbc r0, r1, #0
7326; CHECK-THUMB7-NEXT:    @ kill: def $r8 killed $r8 def $r8_r9
7327; CHECK-THUMB7-NEXT:    mov r9, r0
7328; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i64
7329; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i64
7330; CHECK-THUMB7-NEXT:  .LBB35_2: @ %atomicrmw.start
7331; CHECK-THUMB7-NEXT:    @ Parent Loop BB35_1 Depth=1
7332; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
7333; CHECK-THUMB7-NEXT:    ldrexd r4, r5, [r3]
7334; CHECK-THUMB7-NEXT:    cmp r4, r6
7335; CHECK-THUMB7-NEXT:    it eq
7336; CHECK-THUMB7-NEXT:    cmpeq r5, r7
7337; CHECK-THUMB7-NEXT:    bne .LBB35_4
7338; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
7339; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB35_2 Depth=2
7340; CHECK-THUMB7-NEXT:    strexd r0, r8, r9, [r3]
7341; CHECK-THUMB7-NEXT:    cmp r0, #0
7342; CHECK-THUMB7-NEXT:    bne .LBB35_2
7343; CHECK-THUMB7-NEXT:  .LBB35_4: @ %atomicrmw.start
7344; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB35_1 Depth=1
7345; CHECK-THUMB7-NEXT:    mov r0, r5
7346; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
7347; CHECK-THUMB7-NEXT:    eor.w r3, r0, r1
7348; CHECK-THUMB7-NEXT:    mov r1, r4
7349; CHECK-THUMB7-NEXT:    str r1, [sp, #4] @ 4-byte Spill
7350; CHECK-THUMB7-NEXT:    eors r2, r1
7351; CHECK-THUMB7-NEXT:    orrs r2, r3
7352; CHECK-THUMB7-NEXT:    cmp r2, #0
7353; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7354; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7355; CHECK-THUMB7-NEXT:    bne .LBB35_1
7356; CHECK-THUMB7-NEXT:    b .LBB35_5
7357; CHECK-THUMB7-NEXT:  .LBB35_5: @ %atomicrmw.end
7358; CHECK-THUMB7-NEXT:    ldr r1, [sp] @ 4-byte Reload
7359; CHECK-THUMB7-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
7360; CHECK-THUMB7-NEXT:    add sp, #16
7361; CHECK-THUMB7-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, pc}
7362;
7363; CHECK-THUMB6-LABEL: test_sub_i64:
7364; CHECK-THUMB6:       @ %bb.0: @ %entry
7365; CHECK-THUMB6-NEXT:    .save {r7, lr}
7366; CHECK-THUMB6-NEXT:    push {r7, lr}
7367; CHECK-THUMB6-NEXT:    ldr r0, .LCPI35_0
7368; CHECK-THUMB6-NEXT:    movs r2, #1
7369; CHECK-THUMB6-NEXT:    movs r3, #0
7370; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_sub_8
7371; CHECK-THUMB6-NEXT:    pop {r7, pc}
7372; CHECK-THUMB6-NEXT:    .p2align 2
7373; CHECK-THUMB6-NEXT:  @ %bb.1:
7374; CHECK-THUMB6-NEXT:  .LCPI35_0:
7375; CHECK-THUMB6-NEXT:    .long atomic_i64
7376;
7377; CHECK-THUMB8BASE-LABEL: test_sub_i64:
7378; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
7379; CHECK-THUMB8BASE-NEXT:    .save {r7, lr}
7380; CHECK-THUMB8BASE-NEXT:    push {r7, lr}
7381; CHECK-THUMB8BASE-NEXT:    .pad #8
7382; CHECK-THUMB8BASE-NEXT:    sub sp, #8
7383; CHECK-THUMB8BASE-NEXT:    movs r3, #0
7384; CHECK-THUMB8BASE-NEXT:    str r3, [sp]
7385; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i64
7386; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i64
7387; CHECK-THUMB8BASE-NEXT:    movs r2, #1
7388; CHECK-THUMB8BASE-NEXT:    bl __atomic_fetch_sub_8
7389; CHECK-THUMB8BASE-NEXT:    add sp, #8
7390; CHECK-THUMB8BASE-NEXT:    pop {r7, pc}
7391entry:
7392  %0 = atomicrmw sub i64* @atomic_i64, i64 1 monotonic
7393  ret i64 %0
7394}
7395define i64 @test_and_i64() {
7396; CHECK-ARM8-LABEL: test_and_i64:
7397; CHECK-ARM8:       @ %bb.0: @ %entry
7398; CHECK-ARM8-NEXT:    .save {r4, r5, r6, r7, r8, r9, r11, lr}
7399; CHECK-ARM8-NEXT:    push {r4, r5, r6, r7, r8, r9, r11, lr}
7400; CHECK-ARM8-NEXT:    .pad #16
7401; CHECK-ARM8-NEXT:    sub sp, sp, #16
7402; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i64
7403; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i64
7404; CHECK-ARM8-NEXT:    ldr r1, [r0]
7405; CHECK-ARM8-NEXT:    ldr r0, [r0, #4]
7406; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7407; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7408; CHECK-ARM8-NEXT:    b .LBB36_1
7409; CHECK-ARM8-NEXT:  .LBB36_1: @ %atomicrmw.start
7410; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
7411; CHECK-ARM8-NEXT:    @ Child Loop BB36_2 Depth 2
7412; CHECK-ARM8-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
7413; CHECK-ARM8-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
7414; CHECK-ARM8-NEXT:    and r8, r2, #1
7415; CHECK-ARM8-NEXT:    mov r0, #0
7416; CHECK-ARM8-NEXT:    @ kill: def $r8 killed $r8 def $r8_r9
7417; CHECK-ARM8-NEXT:    mov r9, r0
7418; CHECK-ARM8-NEXT:    mov r6, r2
7419; CHECK-ARM8-NEXT:    mov r7, r1
7420; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i64
7421; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i64
7422; CHECK-ARM8-NEXT:  .LBB36_2: @ %atomicrmw.start
7423; CHECK-ARM8-NEXT:    @ Parent Loop BB36_1 Depth=1
7424; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
7425; CHECK-ARM8-NEXT:    ldrexd r4, r5, [r3]
7426; CHECK-ARM8-NEXT:    cmp r4, r6
7427; CHECK-ARM8-NEXT:    cmpeq r5, r7
7428; CHECK-ARM8-NEXT:    bne .LBB36_4
7429; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
7430; CHECK-ARM8-NEXT:    @ in Loop: Header=BB36_2 Depth=2
7431; CHECK-ARM8-NEXT:    strexd r0, r8, r9, [r3]
7432; CHECK-ARM8-NEXT:    cmp r0, #0
7433; CHECK-ARM8-NEXT:    bne .LBB36_2
7434; CHECK-ARM8-NEXT:  .LBB36_4: @ %atomicrmw.start
7435; CHECK-ARM8-NEXT:    @ in Loop: Header=BB36_1 Depth=1
7436; CHECK-ARM8-NEXT:    mov r0, r5
7437; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
7438; CHECK-ARM8-NEXT:    eor r3, r0, r1
7439; CHECK-ARM8-NEXT:    mov r1, r4
7440; CHECK-ARM8-NEXT:    str r1, [sp, #4] @ 4-byte Spill
7441; CHECK-ARM8-NEXT:    eor r2, r1, r2
7442; CHECK-ARM8-NEXT:    orr r2, r2, r3
7443; CHECK-ARM8-NEXT:    cmp r2, #0
7444; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7445; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7446; CHECK-ARM8-NEXT:    bne .LBB36_1
7447; CHECK-ARM8-NEXT:    b .LBB36_5
7448; CHECK-ARM8-NEXT:  .LBB36_5: @ %atomicrmw.end
7449; CHECK-ARM8-NEXT:    ldr r1, [sp] @ 4-byte Reload
7450; CHECK-ARM8-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
7451; CHECK-ARM8-NEXT:    add sp, sp, #16
7452; CHECK-ARM8-NEXT:    pop {r4, r5, r6, r7, r8, r9, r11, pc}
7453;
7454; CHECK-ARM6-LABEL: test_and_i64:
7455; CHECK-ARM6:       @ %bb.0: @ %entry
7456; CHECK-ARM6-NEXT:    .save {r4, r5, r6, r7, r8, r9, r11, lr}
7457; CHECK-ARM6-NEXT:    push {r4, r5, r6, r7, r8, r9, r11, lr}
7458; CHECK-ARM6-NEXT:    .pad #16
7459; CHECK-ARM6-NEXT:    sub sp, sp, #16
7460; CHECK-ARM6-NEXT:    ldr r0, .LCPI36_0
7461; CHECK-ARM6-NEXT:    ldr r1, [r0]
7462; CHECK-ARM6-NEXT:    ldr r0, [r0, #4]
7463; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7464; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7465; CHECK-ARM6-NEXT:    b .LBB36_1
7466; CHECK-ARM6-NEXT:  .LBB36_1: @ %atomicrmw.start
7467; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
7468; CHECK-ARM6-NEXT:    @ Child Loop BB36_2 Depth 2
7469; CHECK-ARM6-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
7470; CHECK-ARM6-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
7471; CHECK-ARM6-NEXT:    and r8, r2, #1
7472; CHECK-ARM6-NEXT:    mov r0, #0
7473; CHECK-ARM6-NEXT:    @ kill: def $r8 killed $r8 def $r8_r9
7474; CHECK-ARM6-NEXT:    mov r9, r0
7475; CHECK-ARM6-NEXT:    mov r6, r2
7476; CHECK-ARM6-NEXT:    mov r7, r1
7477; CHECK-ARM6-NEXT:    ldr r3, .LCPI36_0
7478; CHECK-ARM6-NEXT:  .LBB36_2: @ %atomicrmw.start
7479; CHECK-ARM6-NEXT:    @ Parent Loop BB36_1 Depth=1
7480; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
7481; CHECK-ARM6-NEXT:    ldrexd r4, r5, [r3]
7482; CHECK-ARM6-NEXT:    cmp r4, r6
7483; CHECK-ARM6-NEXT:    cmpeq r5, r7
7484; CHECK-ARM6-NEXT:    bne .LBB36_4
7485; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
7486; CHECK-ARM6-NEXT:    @ in Loop: Header=BB36_2 Depth=2
7487; CHECK-ARM6-NEXT:    strexd r0, r8, r9, [r3]
7488; CHECK-ARM6-NEXT:    cmp r0, #0
7489; CHECK-ARM6-NEXT:    bne .LBB36_2
7490; CHECK-ARM6-NEXT:  .LBB36_4: @ %atomicrmw.start
7491; CHECK-ARM6-NEXT:    @ in Loop: Header=BB36_1 Depth=1
7492; CHECK-ARM6-NEXT:    mov r0, r5
7493; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
7494; CHECK-ARM6-NEXT:    eor r3, r0, r1
7495; CHECK-ARM6-NEXT:    mov r1, r4
7496; CHECK-ARM6-NEXT:    str r1, [sp, #4] @ 4-byte Spill
7497; CHECK-ARM6-NEXT:    eor r2, r1, r2
7498; CHECK-ARM6-NEXT:    orr r2, r2, r3
7499; CHECK-ARM6-NEXT:    cmp r2, #0
7500; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7501; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7502; CHECK-ARM6-NEXT:    bne .LBB36_1
7503; CHECK-ARM6-NEXT:    b .LBB36_5
7504; CHECK-ARM6-NEXT:  .LBB36_5: @ %atomicrmw.end
7505; CHECK-ARM6-NEXT:    ldr r1, [sp] @ 4-byte Reload
7506; CHECK-ARM6-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
7507; CHECK-ARM6-NEXT:    add sp, sp, #16
7508; CHECK-ARM6-NEXT:    pop {r4, r5, r6, r7, r8, r9, r11, pc}
7509; CHECK-ARM6-NEXT:    .p2align 2
7510; CHECK-ARM6-NEXT:  @ %bb.6:
7511; CHECK-ARM6-NEXT:  .LCPI36_0:
7512; CHECK-ARM6-NEXT:    .long atomic_i64
7513;
7514; CHECK-THUMB7-LABEL: test_and_i64:
7515; CHECK-THUMB7:       @ %bb.0: @ %entry
7516; CHECK-THUMB7-NEXT:    .save {r4, r5, r6, r7, r8, r9, lr}
7517; CHECK-THUMB7-NEXT:    push.w {r4, r5, r6, r7, r8, r9, lr}
7518; CHECK-THUMB7-NEXT:    .pad #16
7519; CHECK-THUMB7-NEXT:    sub sp, #16
7520; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i64
7521; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i64
7522; CHECK-THUMB7-NEXT:    ldr r1, [r0]
7523; CHECK-THUMB7-NEXT:    ldr r0, [r0, #4]
7524; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7525; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7526; CHECK-THUMB7-NEXT:    b .LBB36_1
7527; CHECK-THUMB7-NEXT:  .LBB36_1: @ %atomicrmw.start
7528; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
7529; CHECK-THUMB7-NEXT:    @ Child Loop BB36_2 Depth 2
7530; CHECK-THUMB7-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
7531; CHECK-THUMB7-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
7532; CHECK-THUMB7-NEXT:    and r8, r2, #1
7533; CHECK-THUMB7-NEXT:    movs r0, #0
7534; CHECK-THUMB7-NEXT:    @ kill: def $r8 killed $r8 def $r8_r9
7535; CHECK-THUMB7-NEXT:    mov r9, r0
7536; CHECK-THUMB7-NEXT:    mov r6, r2
7537; CHECK-THUMB7-NEXT:    mov r7, r1
7538; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i64
7539; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i64
7540; CHECK-THUMB7-NEXT:  .LBB36_2: @ %atomicrmw.start
7541; CHECK-THUMB7-NEXT:    @ Parent Loop BB36_1 Depth=1
7542; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
7543; CHECK-THUMB7-NEXT:    ldrexd r4, r5, [r3]
7544; CHECK-THUMB7-NEXT:    cmp r4, r6
7545; CHECK-THUMB7-NEXT:    it eq
7546; CHECK-THUMB7-NEXT:    cmpeq r5, r7
7547; CHECK-THUMB7-NEXT:    bne .LBB36_4
7548; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
7549; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB36_2 Depth=2
7550; CHECK-THUMB7-NEXT:    strexd r0, r8, r9, [r3]
7551; CHECK-THUMB7-NEXT:    cmp r0, #0
7552; CHECK-THUMB7-NEXT:    bne .LBB36_2
7553; CHECK-THUMB7-NEXT:  .LBB36_4: @ %atomicrmw.start
7554; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB36_1 Depth=1
7555; CHECK-THUMB7-NEXT:    mov r0, r5
7556; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
7557; CHECK-THUMB7-NEXT:    eor.w r3, r0, r1
7558; CHECK-THUMB7-NEXT:    mov r1, r4
7559; CHECK-THUMB7-NEXT:    str r1, [sp, #4] @ 4-byte Spill
7560; CHECK-THUMB7-NEXT:    eors r2, r1
7561; CHECK-THUMB7-NEXT:    orrs r2, r3
7562; CHECK-THUMB7-NEXT:    cmp r2, #0
7563; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7564; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7565; CHECK-THUMB7-NEXT:    bne .LBB36_1
7566; CHECK-THUMB7-NEXT:    b .LBB36_5
7567; CHECK-THUMB7-NEXT:  .LBB36_5: @ %atomicrmw.end
7568; CHECK-THUMB7-NEXT:    ldr r1, [sp] @ 4-byte Reload
7569; CHECK-THUMB7-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
7570; CHECK-THUMB7-NEXT:    add sp, #16
7571; CHECK-THUMB7-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, pc}
7572;
7573; CHECK-THUMB6-LABEL: test_and_i64:
7574; CHECK-THUMB6:       @ %bb.0: @ %entry
7575; CHECK-THUMB6-NEXT:    .save {r7, lr}
7576; CHECK-THUMB6-NEXT:    push {r7, lr}
7577; CHECK-THUMB6-NEXT:    ldr r0, .LCPI36_0
7578; CHECK-THUMB6-NEXT:    movs r2, #1
7579; CHECK-THUMB6-NEXT:    movs r3, #0
7580; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_and_8
7581; CHECK-THUMB6-NEXT:    pop {r7, pc}
7582; CHECK-THUMB6-NEXT:    .p2align 2
7583; CHECK-THUMB6-NEXT:  @ %bb.1:
7584; CHECK-THUMB6-NEXT:  .LCPI36_0:
7585; CHECK-THUMB6-NEXT:    .long atomic_i64
7586;
7587; CHECK-THUMB8BASE-LABEL: test_and_i64:
7588; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
7589; CHECK-THUMB8BASE-NEXT:    .save {r7, lr}
7590; CHECK-THUMB8BASE-NEXT:    push {r7, lr}
7591; CHECK-THUMB8BASE-NEXT:    .pad #8
7592; CHECK-THUMB8BASE-NEXT:    sub sp, #8
7593; CHECK-THUMB8BASE-NEXT:    movs r3, #0
7594; CHECK-THUMB8BASE-NEXT:    str r3, [sp]
7595; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i64
7596; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i64
7597; CHECK-THUMB8BASE-NEXT:    movs r2, #1
7598; CHECK-THUMB8BASE-NEXT:    bl __atomic_fetch_and_8
7599; CHECK-THUMB8BASE-NEXT:    add sp, #8
7600; CHECK-THUMB8BASE-NEXT:    pop {r7, pc}
7601entry:
7602  %0 = atomicrmw and i64* @atomic_i64, i64 1 monotonic
7603  ret i64 %0
7604}
7605define i64 @test_nand_i64() {
7606; CHECK-ARM8-LABEL: test_nand_i64:
7607; CHECK-ARM8:       @ %bb.0: @ %entry
7608; CHECK-ARM8-NEXT:    .save {r4, r5, r6, r7, r8, r9, r11, lr}
7609; CHECK-ARM8-NEXT:    push {r4, r5, r6, r7, r8, r9, r11, lr}
7610; CHECK-ARM8-NEXT:    .pad #16
7611; CHECK-ARM8-NEXT:    sub sp, sp, #16
7612; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i64
7613; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i64
7614; CHECK-ARM8-NEXT:    ldr r1, [r0]
7615; CHECK-ARM8-NEXT:    ldr r0, [r0, #4]
7616; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7617; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7618; CHECK-ARM8-NEXT:    b .LBB37_1
7619; CHECK-ARM8-NEXT:  .LBB37_1: @ %atomicrmw.start
7620; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
7621; CHECK-ARM8-NEXT:    @ Child Loop BB37_2 Depth 2
7622; CHECK-ARM8-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
7623; CHECK-ARM8-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
7624; CHECK-ARM8-NEXT:    mov r6, r2
7625; CHECK-ARM8-NEXT:    mov r7, r1
7626; CHECK-ARM8-NEXT:    mvn r0, r2
7627; CHECK-ARM8-NEXT:    mvn r3, #1
7628; CHECK-ARM8-NEXT:    orr r8, r0, r3
7629; CHECK-ARM8-NEXT:    mvn r0, #0
7630; CHECK-ARM8-NEXT:    @ kill: def $r8 killed $r8 def $r8_r9
7631; CHECK-ARM8-NEXT:    mov r9, r0
7632; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i64
7633; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i64
7634; CHECK-ARM8-NEXT:  .LBB37_2: @ %atomicrmw.start
7635; CHECK-ARM8-NEXT:    @ Parent Loop BB37_1 Depth=1
7636; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
7637; CHECK-ARM8-NEXT:    ldrexd r4, r5, [r3]
7638; CHECK-ARM8-NEXT:    cmp r4, r6
7639; CHECK-ARM8-NEXT:    cmpeq r5, r7
7640; CHECK-ARM8-NEXT:    bne .LBB37_4
7641; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
7642; CHECK-ARM8-NEXT:    @ in Loop: Header=BB37_2 Depth=2
7643; CHECK-ARM8-NEXT:    strexd r0, r8, r9, [r3]
7644; CHECK-ARM8-NEXT:    cmp r0, #0
7645; CHECK-ARM8-NEXT:    bne .LBB37_2
7646; CHECK-ARM8-NEXT:  .LBB37_4: @ %atomicrmw.start
7647; CHECK-ARM8-NEXT:    @ in Loop: Header=BB37_1 Depth=1
7648; CHECK-ARM8-NEXT:    mov r0, r5
7649; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
7650; CHECK-ARM8-NEXT:    eor r3, r0, r1
7651; CHECK-ARM8-NEXT:    mov r1, r4
7652; CHECK-ARM8-NEXT:    str r1, [sp, #4] @ 4-byte Spill
7653; CHECK-ARM8-NEXT:    eor r2, r1, r2
7654; CHECK-ARM8-NEXT:    orr r2, r2, r3
7655; CHECK-ARM8-NEXT:    cmp r2, #0
7656; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7657; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7658; CHECK-ARM8-NEXT:    bne .LBB37_1
7659; CHECK-ARM8-NEXT:    b .LBB37_5
7660; CHECK-ARM8-NEXT:  .LBB37_5: @ %atomicrmw.end
7661; CHECK-ARM8-NEXT:    ldr r1, [sp] @ 4-byte Reload
7662; CHECK-ARM8-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
7663; CHECK-ARM8-NEXT:    add sp, sp, #16
7664; CHECK-ARM8-NEXT:    pop {r4, r5, r6, r7, r8, r9, r11, pc}
7665;
7666; CHECK-ARM6-LABEL: test_nand_i64:
7667; CHECK-ARM6:       @ %bb.0: @ %entry
7668; CHECK-ARM6-NEXT:    .save {r4, r5, r6, r7, r8, r9, r11, lr}
7669; CHECK-ARM6-NEXT:    push {r4, r5, r6, r7, r8, r9, r11, lr}
7670; CHECK-ARM6-NEXT:    .pad #16
7671; CHECK-ARM6-NEXT:    sub sp, sp, #16
7672; CHECK-ARM6-NEXT:    ldr r0, .LCPI37_0
7673; CHECK-ARM6-NEXT:    ldr r1, [r0]
7674; CHECK-ARM6-NEXT:    ldr r0, [r0, #4]
7675; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7676; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7677; CHECK-ARM6-NEXT:    b .LBB37_1
7678; CHECK-ARM6-NEXT:  .LBB37_1: @ %atomicrmw.start
7679; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
7680; CHECK-ARM6-NEXT:    @ Child Loop BB37_2 Depth 2
7681; CHECK-ARM6-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
7682; CHECK-ARM6-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
7683; CHECK-ARM6-NEXT:    mov r6, r2
7684; CHECK-ARM6-NEXT:    mov r7, r1
7685; CHECK-ARM6-NEXT:    mvn r0, r2
7686; CHECK-ARM6-NEXT:    mvn r3, #1
7687; CHECK-ARM6-NEXT:    orr r8, r0, r3
7688; CHECK-ARM6-NEXT:    mvn r0, #0
7689; CHECK-ARM6-NEXT:    @ kill: def $r8 killed $r8 def $r8_r9
7690; CHECK-ARM6-NEXT:    mov r9, r0
7691; CHECK-ARM6-NEXT:    ldr r3, .LCPI37_0
7692; CHECK-ARM6-NEXT:  .LBB37_2: @ %atomicrmw.start
7693; CHECK-ARM6-NEXT:    @ Parent Loop BB37_1 Depth=1
7694; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
7695; CHECK-ARM6-NEXT:    ldrexd r4, r5, [r3]
7696; CHECK-ARM6-NEXT:    cmp r4, r6
7697; CHECK-ARM6-NEXT:    cmpeq r5, r7
7698; CHECK-ARM6-NEXT:    bne .LBB37_4
7699; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
7700; CHECK-ARM6-NEXT:    @ in Loop: Header=BB37_2 Depth=2
7701; CHECK-ARM6-NEXT:    strexd r0, r8, r9, [r3]
7702; CHECK-ARM6-NEXT:    cmp r0, #0
7703; CHECK-ARM6-NEXT:    bne .LBB37_2
7704; CHECK-ARM6-NEXT:  .LBB37_4: @ %atomicrmw.start
7705; CHECK-ARM6-NEXT:    @ in Loop: Header=BB37_1 Depth=1
7706; CHECK-ARM6-NEXT:    mov r0, r5
7707; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
7708; CHECK-ARM6-NEXT:    eor r3, r0, r1
7709; CHECK-ARM6-NEXT:    mov r1, r4
7710; CHECK-ARM6-NEXT:    str r1, [sp, #4] @ 4-byte Spill
7711; CHECK-ARM6-NEXT:    eor r2, r1, r2
7712; CHECK-ARM6-NEXT:    orr r2, r2, r3
7713; CHECK-ARM6-NEXT:    cmp r2, #0
7714; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7715; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7716; CHECK-ARM6-NEXT:    bne .LBB37_1
7717; CHECK-ARM6-NEXT:    b .LBB37_5
7718; CHECK-ARM6-NEXT:  .LBB37_5: @ %atomicrmw.end
7719; CHECK-ARM6-NEXT:    ldr r1, [sp] @ 4-byte Reload
7720; CHECK-ARM6-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
7721; CHECK-ARM6-NEXT:    add sp, sp, #16
7722; CHECK-ARM6-NEXT:    pop {r4, r5, r6, r7, r8, r9, r11, pc}
7723; CHECK-ARM6-NEXT:    .p2align 2
7724; CHECK-ARM6-NEXT:  @ %bb.6:
7725; CHECK-ARM6-NEXT:  .LCPI37_0:
7726; CHECK-ARM6-NEXT:    .long atomic_i64
7727;
7728; CHECK-THUMB7-LABEL: test_nand_i64:
7729; CHECK-THUMB7:       @ %bb.0: @ %entry
7730; CHECK-THUMB7-NEXT:    .save {r4, r5, r6, r7, r8, r9, lr}
7731; CHECK-THUMB7-NEXT:    push.w {r4, r5, r6, r7, r8, r9, lr}
7732; CHECK-THUMB7-NEXT:    .pad #16
7733; CHECK-THUMB7-NEXT:    sub sp, #16
7734; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i64
7735; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i64
7736; CHECK-THUMB7-NEXT:    ldr r1, [r0]
7737; CHECK-THUMB7-NEXT:    ldr r0, [r0, #4]
7738; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7739; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7740; CHECK-THUMB7-NEXT:    b .LBB37_1
7741; CHECK-THUMB7-NEXT:  .LBB37_1: @ %atomicrmw.start
7742; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
7743; CHECK-THUMB7-NEXT:    @ Child Loop BB37_2 Depth 2
7744; CHECK-THUMB7-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
7745; CHECK-THUMB7-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
7746; CHECK-THUMB7-NEXT:    mov r6, r2
7747; CHECK-THUMB7-NEXT:    mov r7, r1
7748; CHECK-THUMB7-NEXT:    mvn r0, #1
7749; CHECK-THUMB7-NEXT:    orn r8, r0, r2
7750; CHECK-THUMB7-NEXT:    mov.w r0, #-1
7751; CHECK-THUMB7-NEXT:    @ kill: def $r8 killed $r8 def $r8_r9
7752; CHECK-THUMB7-NEXT:    mov r9, r0
7753; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i64
7754; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i64
7755; CHECK-THUMB7-NEXT:  .LBB37_2: @ %atomicrmw.start
7756; CHECK-THUMB7-NEXT:    @ Parent Loop BB37_1 Depth=1
7757; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
7758; CHECK-THUMB7-NEXT:    ldrexd r4, r5, [r3]
7759; CHECK-THUMB7-NEXT:    cmp r4, r6
7760; CHECK-THUMB7-NEXT:    it eq
7761; CHECK-THUMB7-NEXT:    cmpeq r5, r7
7762; CHECK-THUMB7-NEXT:    bne .LBB37_4
7763; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
7764; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB37_2 Depth=2
7765; CHECK-THUMB7-NEXT:    strexd r0, r8, r9, [r3]
7766; CHECK-THUMB7-NEXT:    cmp r0, #0
7767; CHECK-THUMB7-NEXT:    bne .LBB37_2
7768; CHECK-THUMB7-NEXT:  .LBB37_4: @ %atomicrmw.start
7769; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB37_1 Depth=1
7770; CHECK-THUMB7-NEXT:    mov r0, r5
7771; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
7772; CHECK-THUMB7-NEXT:    eor.w r3, r0, r1
7773; CHECK-THUMB7-NEXT:    mov r1, r4
7774; CHECK-THUMB7-NEXT:    str r1, [sp, #4] @ 4-byte Spill
7775; CHECK-THUMB7-NEXT:    eors r2, r1
7776; CHECK-THUMB7-NEXT:    orrs r2, r3
7777; CHECK-THUMB7-NEXT:    cmp r2, #0
7778; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7779; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7780; CHECK-THUMB7-NEXT:    bne .LBB37_1
7781; CHECK-THUMB7-NEXT:    b .LBB37_5
7782; CHECK-THUMB7-NEXT:  .LBB37_5: @ %atomicrmw.end
7783; CHECK-THUMB7-NEXT:    ldr r1, [sp] @ 4-byte Reload
7784; CHECK-THUMB7-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
7785; CHECK-THUMB7-NEXT:    add sp, #16
7786; CHECK-THUMB7-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, pc}
7787;
7788; CHECK-THUMB6-LABEL: test_nand_i64:
7789; CHECK-THUMB6:       @ %bb.0: @ %entry
7790; CHECK-THUMB6-NEXT:    .save {r7, lr}
7791; CHECK-THUMB6-NEXT:    push {r7, lr}
7792; CHECK-THUMB6-NEXT:    ldr r0, .LCPI37_0
7793; CHECK-THUMB6-NEXT:    movs r2, #1
7794; CHECK-THUMB6-NEXT:    movs r3, #0
7795; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_nand_8
7796; CHECK-THUMB6-NEXT:    pop {r7, pc}
7797; CHECK-THUMB6-NEXT:    .p2align 2
7798; CHECK-THUMB6-NEXT:  @ %bb.1:
7799; CHECK-THUMB6-NEXT:  .LCPI37_0:
7800; CHECK-THUMB6-NEXT:    .long atomic_i64
7801;
7802; CHECK-THUMB8BASE-LABEL: test_nand_i64:
7803; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
7804; CHECK-THUMB8BASE-NEXT:    .save {r7, lr}
7805; CHECK-THUMB8BASE-NEXT:    push {r7, lr}
7806; CHECK-THUMB8BASE-NEXT:    .pad #8
7807; CHECK-THUMB8BASE-NEXT:    sub sp, #8
7808; CHECK-THUMB8BASE-NEXT:    movs r3, #0
7809; CHECK-THUMB8BASE-NEXT:    str r3, [sp]
7810; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i64
7811; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i64
7812; CHECK-THUMB8BASE-NEXT:    movs r2, #1
7813; CHECK-THUMB8BASE-NEXT:    bl __atomic_fetch_nand_8
7814; CHECK-THUMB8BASE-NEXT:    add sp, #8
7815; CHECK-THUMB8BASE-NEXT:    pop {r7, pc}
7816entry:
7817  %0 = atomicrmw nand i64* @atomic_i64, i64 1 monotonic
7818  ret i64 %0
7819}
7820define i64 @test_or_i64() {
7821; CHECK-ARM8-LABEL: test_or_i64:
7822; CHECK-ARM8:       @ %bb.0: @ %entry
7823; CHECK-ARM8-NEXT:    .save {r4, r5, r6, r7, r8, r9, r11, lr}
7824; CHECK-ARM8-NEXT:    push {r4, r5, r6, r7, r8, r9, r11, lr}
7825; CHECK-ARM8-NEXT:    .pad #16
7826; CHECK-ARM8-NEXT:    sub sp, sp, #16
7827; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i64
7828; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i64
7829; CHECK-ARM8-NEXT:    ldr r1, [r0]
7830; CHECK-ARM8-NEXT:    ldr r0, [r0, #4]
7831; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7832; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7833; CHECK-ARM8-NEXT:    b .LBB38_1
7834; CHECK-ARM8-NEXT:  .LBB38_1: @ %atomicrmw.start
7835; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
7836; CHECK-ARM8-NEXT:    @ Child Loop BB38_2 Depth 2
7837; CHECK-ARM8-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
7838; CHECK-ARM8-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
7839; CHECK-ARM8-NEXT:    orr r8, r2, #1
7840; CHECK-ARM8-NEXT:    @ kill: def $r8 killed $r8 def $r8_r9
7841; CHECK-ARM8-NEXT:    mov r9, r1
7842; CHECK-ARM8-NEXT:    mov r6, r2
7843; CHECK-ARM8-NEXT:    mov r7, r1
7844; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i64
7845; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i64
7846; CHECK-ARM8-NEXT:  .LBB38_2: @ %atomicrmw.start
7847; CHECK-ARM8-NEXT:    @ Parent Loop BB38_1 Depth=1
7848; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
7849; CHECK-ARM8-NEXT:    ldrexd r4, r5, [r3]
7850; CHECK-ARM8-NEXT:    cmp r4, r6
7851; CHECK-ARM8-NEXT:    cmpeq r5, r7
7852; CHECK-ARM8-NEXT:    bne .LBB38_4
7853; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
7854; CHECK-ARM8-NEXT:    @ in Loop: Header=BB38_2 Depth=2
7855; CHECK-ARM8-NEXT:    strexd r0, r8, r9, [r3]
7856; CHECK-ARM8-NEXT:    cmp r0, #0
7857; CHECK-ARM8-NEXT:    bne .LBB38_2
7858; CHECK-ARM8-NEXT:  .LBB38_4: @ %atomicrmw.start
7859; CHECK-ARM8-NEXT:    @ in Loop: Header=BB38_1 Depth=1
7860; CHECK-ARM8-NEXT:    mov r0, r5
7861; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
7862; CHECK-ARM8-NEXT:    eor r3, r0, r1
7863; CHECK-ARM8-NEXT:    mov r1, r4
7864; CHECK-ARM8-NEXT:    str r1, [sp, #4] @ 4-byte Spill
7865; CHECK-ARM8-NEXT:    eor r2, r1, r2
7866; CHECK-ARM8-NEXT:    orr r2, r2, r3
7867; CHECK-ARM8-NEXT:    cmp r2, #0
7868; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7869; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7870; CHECK-ARM8-NEXT:    bne .LBB38_1
7871; CHECK-ARM8-NEXT:    b .LBB38_5
7872; CHECK-ARM8-NEXT:  .LBB38_5: @ %atomicrmw.end
7873; CHECK-ARM8-NEXT:    ldr r1, [sp] @ 4-byte Reload
7874; CHECK-ARM8-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
7875; CHECK-ARM8-NEXT:    add sp, sp, #16
7876; CHECK-ARM8-NEXT:    pop {r4, r5, r6, r7, r8, r9, r11, pc}
7877;
7878; CHECK-ARM6-LABEL: test_or_i64:
7879; CHECK-ARM6:       @ %bb.0: @ %entry
7880; CHECK-ARM6-NEXT:    .save {r4, r5, r6, r7, r8, r9, r11, lr}
7881; CHECK-ARM6-NEXT:    push {r4, r5, r6, r7, r8, r9, r11, lr}
7882; CHECK-ARM6-NEXT:    .pad #16
7883; CHECK-ARM6-NEXT:    sub sp, sp, #16
7884; CHECK-ARM6-NEXT:    ldr r0, .LCPI38_0
7885; CHECK-ARM6-NEXT:    ldr r1, [r0]
7886; CHECK-ARM6-NEXT:    ldr r0, [r0, #4]
7887; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7888; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7889; CHECK-ARM6-NEXT:    b .LBB38_1
7890; CHECK-ARM6-NEXT:  .LBB38_1: @ %atomicrmw.start
7891; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
7892; CHECK-ARM6-NEXT:    @ Child Loop BB38_2 Depth 2
7893; CHECK-ARM6-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
7894; CHECK-ARM6-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
7895; CHECK-ARM6-NEXT:    orr r8, r2, #1
7896; CHECK-ARM6-NEXT:    @ kill: def $r8 killed $r8 def $r8_r9
7897; CHECK-ARM6-NEXT:    mov r9, r1
7898; CHECK-ARM6-NEXT:    mov r6, r2
7899; CHECK-ARM6-NEXT:    mov r7, r1
7900; CHECK-ARM6-NEXT:    ldr r3, .LCPI38_0
7901; CHECK-ARM6-NEXT:  .LBB38_2: @ %atomicrmw.start
7902; CHECK-ARM6-NEXT:    @ Parent Loop BB38_1 Depth=1
7903; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
7904; CHECK-ARM6-NEXT:    ldrexd r4, r5, [r3]
7905; CHECK-ARM6-NEXT:    cmp r4, r6
7906; CHECK-ARM6-NEXT:    cmpeq r5, r7
7907; CHECK-ARM6-NEXT:    bne .LBB38_4
7908; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
7909; CHECK-ARM6-NEXT:    @ in Loop: Header=BB38_2 Depth=2
7910; CHECK-ARM6-NEXT:    strexd r0, r8, r9, [r3]
7911; CHECK-ARM6-NEXT:    cmp r0, #0
7912; CHECK-ARM6-NEXT:    bne .LBB38_2
7913; CHECK-ARM6-NEXT:  .LBB38_4: @ %atomicrmw.start
7914; CHECK-ARM6-NEXT:    @ in Loop: Header=BB38_1 Depth=1
7915; CHECK-ARM6-NEXT:    mov r0, r5
7916; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
7917; CHECK-ARM6-NEXT:    eor r3, r0, r1
7918; CHECK-ARM6-NEXT:    mov r1, r4
7919; CHECK-ARM6-NEXT:    str r1, [sp, #4] @ 4-byte Spill
7920; CHECK-ARM6-NEXT:    eor r2, r1, r2
7921; CHECK-ARM6-NEXT:    orr r2, r2, r3
7922; CHECK-ARM6-NEXT:    cmp r2, #0
7923; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7924; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7925; CHECK-ARM6-NEXT:    bne .LBB38_1
7926; CHECK-ARM6-NEXT:    b .LBB38_5
7927; CHECK-ARM6-NEXT:  .LBB38_5: @ %atomicrmw.end
7928; CHECK-ARM6-NEXT:    ldr r1, [sp] @ 4-byte Reload
7929; CHECK-ARM6-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
7930; CHECK-ARM6-NEXT:    add sp, sp, #16
7931; CHECK-ARM6-NEXT:    pop {r4, r5, r6, r7, r8, r9, r11, pc}
7932; CHECK-ARM6-NEXT:    .p2align 2
7933; CHECK-ARM6-NEXT:  @ %bb.6:
7934; CHECK-ARM6-NEXT:  .LCPI38_0:
7935; CHECK-ARM6-NEXT:    .long atomic_i64
7936;
7937; CHECK-THUMB7-LABEL: test_or_i64:
7938; CHECK-THUMB7:       @ %bb.0: @ %entry
7939; CHECK-THUMB7-NEXT:    .save {r4, r5, r6, r7, r8, r9, lr}
7940; CHECK-THUMB7-NEXT:    push.w {r4, r5, r6, r7, r8, r9, lr}
7941; CHECK-THUMB7-NEXT:    .pad #16
7942; CHECK-THUMB7-NEXT:    sub sp, #16
7943; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i64
7944; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i64
7945; CHECK-THUMB7-NEXT:    ldr r1, [r0]
7946; CHECK-THUMB7-NEXT:    ldr r0, [r0, #4]
7947; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7948; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7949; CHECK-THUMB7-NEXT:    b .LBB38_1
7950; CHECK-THUMB7-NEXT:  .LBB38_1: @ %atomicrmw.start
7951; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
7952; CHECK-THUMB7-NEXT:    @ Child Loop BB38_2 Depth 2
7953; CHECK-THUMB7-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
7954; CHECK-THUMB7-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
7955; CHECK-THUMB7-NEXT:    orr r8, r2, #1
7956; CHECK-THUMB7-NEXT:    @ kill: def $r8 killed $r8 def $r8_r9
7957; CHECK-THUMB7-NEXT:    mov r9, r1
7958; CHECK-THUMB7-NEXT:    mov r6, r2
7959; CHECK-THUMB7-NEXT:    mov r7, r1
7960; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i64
7961; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i64
7962; CHECK-THUMB7-NEXT:  .LBB38_2: @ %atomicrmw.start
7963; CHECK-THUMB7-NEXT:    @ Parent Loop BB38_1 Depth=1
7964; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
7965; CHECK-THUMB7-NEXT:    ldrexd r4, r5, [r3]
7966; CHECK-THUMB7-NEXT:    cmp r4, r6
7967; CHECK-THUMB7-NEXT:    it eq
7968; CHECK-THUMB7-NEXT:    cmpeq r5, r7
7969; CHECK-THUMB7-NEXT:    bne .LBB38_4
7970; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
7971; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB38_2 Depth=2
7972; CHECK-THUMB7-NEXT:    strexd r0, r8, r9, [r3]
7973; CHECK-THUMB7-NEXT:    cmp r0, #0
7974; CHECK-THUMB7-NEXT:    bne .LBB38_2
7975; CHECK-THUMB7-NEXT:  .LBB38_4: @ %atomicrmw.start
7976; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB38_1 Depth=1
7977; CHECK-THUMB7-NEXT:    mov r0, r5
7978; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
7979; CHECK-THUMB7-NEXT:    eor.w r3, r0, r1
7980; CHECK-THUMB7-NEXT:    mov r1, r4
7981; CHECK-THUMB7-NEXT:    str r1, [sp, #4] @ 4-byte Spill
7982; CHECK-THUMB7-NEXT:    eors r2, r1
7983; CHECK-THUMB7-NEXT:    orrs r2, r3
7984; CHECK-THUMB7-NEXT:    cmp r2, #0
7985; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7986; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7987; CHECK-THUMB7-NEXT:    bne .LBB38_1
7988; CHECK-THUMB7-NEXT:    b .LBB38_5
7989; CHECK-THUMB7-NEXT:  .LBB38_5: @ %atomicrmw.end
7990; CHECK-THUMB7-NEXT:    ldr r1, [sp] @ 4-byte Reload
7991; CHECK-THUMB7-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
7992; CHECK-THUMB7-NEXT:    add sp, #16
7993; CHECK-THUMB7-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, pc}
7994;
7995; CHECK-THUMB6-LABEL: test_or_i64:
7996; CHECK-THUMB6:       @ %bb.0: @ %entry
7997; CHECK-THUMB6-NEXT:    .save {r7, lr}
7998; CHECK-THUMB6-NEXT:    push {r7, lr}
7999; CHECK-THUMB6-NEXT:    ldr r0, .LCPI38_0
8000; CHECK-THUMB6-NEXT:    movs r2, #1
8001; CHECK-THUMB6-NEXT:    movs r3, #0
8002; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_or_8
8003; CHECK-THUMB6-NEXT:    pop {r7, pc}
8004; CHECK-THUMB6-NEXT:    .p2align 2
8005; CHECK-THUMB6-NEXT:  @ %bb.1:
8006; CHECK-THUMB6-NEXT:  .LCPI38_0:
8007; CHECK-THUMB6-NEXT:    .long atomic_i64
8008;
8009; CHECK-THUMB8BASE-LABEL: test_or_i64:
8010; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
8011; CHECK-THUMB8BASE-NEXT:    .save {r7, lr}
8012; CHECK-THUMB8BASE-NEXT:    push {r7, lr}
8013; CHECK-THUMB8BASE-NEXT:    .pad #8
8014; CHECK-THUMB8BASE-NEXT:    sub sp, #8
8015; CHECK-THUMB8BASE-NEXT:    movs r3, #0
8016; CHECK-THUMB8BASE-NEXT:    str r3, [sp]
8017; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i64
8018; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i64
8019; CHECK-THUMB8BASE-NEXT:    movs r2, #1
8020; CHECK-THUMB8BASE-NEXT:    bl __atomic_fetch_or_8
8021; CHECK-THUMB8BASE-NEXT:    add sp, #8
8022; CHECK-THUMB8BASE-NEXT:    pop {r7, pc}
8023entry:
8024  %0 = atomicrmw or i64* @atomic_i64, i64 1 monotonic
8025  ret i64 %0
8026}
8027define i64 @test_xor_i64() {
8028; CHECK-ARM8-LABEL: test_xor_i64:
8029; CHECK-ARM8:       @ %bb.0: @ %entry
8030; CHECK-ARM8-NEXT:    .save {r4, r5, r6, r7, r8, r9, r11, lr}
8031; CHECK-ARM8-NEXT:    push {r4, r5, r6, r7, r8, r9, r11, lr}
8032; CHECK-ARM8-NEXT:    .pad #16
8033; CHECK-ARM8-NEXT:    sub sp, sp, #16
8034; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i64
8035; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i64
8036; CHECK-ARM8-NEXT:    ldr r1, [r0]
8037; CHECK-ARM8-NEXT:    ldr r0, [r0, #4]
8038; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8039; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8040; CHECK-ARM8-NEXT:    b .LBB39_1
8041; CHECK-ARM8-NEXT:  .LBB39_1: @ %atomicrmw.start
8042; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
8043; CHECK-ARM8-NEXT:    @ Child Loop BB39_2 Depth 2
8044; CHECK-ARM8-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
8045; CHECK-ARM8-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
8046; CHECK-ARM8-NEXT:    eor r8, r2, #1
8047; CHECK-ARM8-NEXT:    @ kill: def $r8 killed $r8 def $r8_r9
8048; CHECK-ARM8-NEXT:    mov r9, r1
8049; CHECK-ARM8-NEXT:    mov r6, r2
8050; CHECK-ARM8-NEXT:    mov r7, r1
8051; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i64
8052; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i64
8053; CHECK-ARM8-NEXT:  .LBB39_2: @ %atomicrmw.start
8054; CHECK-ARM8-NEXT:    @ Parent Loop BB39_1 Depth=1
8055; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
8056; CHECK-ARM8-NEXT:    ldrexd r4, r5, [r3]
8057; CHECK-ARM8-NEXT:    cmp r4, r6
8058; CHECK-ARM8-NEXT:    cmpeq r5, r7
8059; CHECK-ARM8-NEXT:    bne .LBB39_4
8060; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
8061; CHECK-ARM8-NEXT:    @ in Loop: Header=BB39_2 Depth=2
8062; CHECK-ARM8-NEXT:    strexd r0, r8, r9, [r3]
8063; CHECK-ARM8-NEXT:    cmp r0, #0
8064; CHECK-ARM8-NEXT:    bne .LBB39_2
8065; CHECK-ARM8-NEXT:  .LBB39_4: @ %atomicrmw.start
8066; CHECK-ARM8-NEXT:    @ in Loop: Header=BB39_1 Depth=1
8067; CHECK-ARM8-NEXT:    mov r0, r5
8068; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
8069; CHECK-ARM8-NEXT:    eor r3, r0, r1
8070; CHECK-ARM8-NEXT:    mov r1, r4
8071; CHECK-ARM8-NEXT:    str r1, [sp, #4] @ 4-byte Spill
8072; CHECK-ARM8-NEXT:    eor r2, r1, r2
8073; CHECK-ARM8-NEXT:    orr r2, r2, r3
8074; CHECK-ARM8-NEXT:    cmp r2, #0
8075; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8076; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8077; CHECK-ARM8-NEXT:    bne .LBB39_1
8078; CHECK-ARM8-NEXT:    b .LBB39_5
8079; CHECK-ARM8-NEXT:  .LBB39_5: @ %atomicrmw.end
8080; CHECK-ARM8-NEXT:    ldr r1, [sp] @ 4-byte Reload
8081; CHECK-ARM8-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
8082; CHECK-ARM8-NEXT:    add sp, sp, #16
8083; CHECK-ARM8-NEXT:    pop {r4, r5, r6, r7, r8, r9, r11, pc}
8084;
8085; CHECK-ARM6-LABEL: test_xor_i64:
8086; CHECK-ARM6:       @ %bb.0: @ %entry
8087; CHECK-ARM6-NEXT:    .save {r4, r5, r6, r7, r8, r9, r11, lr}
8088; CHECK-ARM6-NEXT:    push {r4, r5, r6, r7, r8, r9, r11, lr}
8089; CHECK-ARM6-NEXT:    .pad #16
8090; CHECK-ARM6-NEXT:    sub sp, sp, #16
8091; CHECK-ARM6-NEXT:    ldr r0, .LCPI39_0
8092; CHECK-ARM6-NEXT:    ldr r1, [r0]
8093; CHECK-ARM6-NEXT:    ldr r0, [r0, #4]
8094; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8095; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8096; CHECK-ARM6-NEXT:    b .LBB39_1
8097; CHECK-ARM6-NEXT:  .LBB39_1: @ %atomicrmw.start
8098; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
8099; CHECK-ARM6-NEXT:    @ Child Loop BB39_2 Depth 2
8100; CHECK-ARM6-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
8101; CHECK-ARM6-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
8102; CHECK-ARM6-NEXT:    eor r8, r2, #1
8103; CHECK-ARM6-NEXT:    @ kill: def $r8 killed $r8 def $r8_r9
8104; CHECK-ARM6-NEXT:    mov r9, r1
8105; CHECK-ARM6-NEXT:    mov r6, r2
8106; CHECK-ARM6-NEXT:    mov r7, r1
8107; CHECK-ARM6-NEXT:    ldr r3, .LCPI39_0
8108; CHECK-ARM6-NEXT:  .LBB39_2: @ %atomicrmw.start
8109; CHECK-ARM6-NEXT:    @ Parent Loop BB39_1 Depth=1
8110; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
8111; CHECK-ARM6-NEXT:    ldrexd r4, r5, [r3]
8112; CHECK-ARM6-NEXT:    cmp r4, r6
8113; CHECK-ARM6-NEXT:    cmpeq r5, r7
8114; CHECK-ARM6-NEXT:    bne .LBB39_4
8115; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
8116; CHECK-ARM6-NEXT:    @ in Loop: Header=BB39_2 Depth=2
8117; CHECK-ARM6-NEXT:    strexd r0, r8, r9, [r3]
8118; CHECK-ARM6-NEXT:    cmp r0, #0
8119; CHECK-ARM6-NEXT:    bne .LBB39_2
8120; CHECK-ARM6-NEXT:  .LBB39_4: @ %atomicrmw.start
8121; CHECK-ARM6-NEXT:    @ in Loop: Header=BB39_1 Depth=1
8122; CHECK-ARM6-NEXT:    mov r0, r5
8123; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
8124; CHECK-ARM6-NEXT:    eor r3, r0, r1
8125; CHECK-ARM6-NEXT:    mov r1, r4
8126; CHECK-ARM6-NEXT:    str r1, [sp, #4] @ 4-byte Spill
8127; CHECK-ARM6-NEXT:    eor r2, r1, r2
8128; CHECK-ARM6-NEXT:    orr r2, r2, r3
8129; CHECK-ARM6-NEXT:    cmp r2, #0
8130; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8131; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8132; CHECK-ARM6-NEXT:    bne .LBB39_1
8133; CHECK-ARM6-NEXT:    b .LBB39_5
8134; CHECK-ARM6-NEXT:  .LBB39_5: @ %atomicrmw.end
8135; CHECK-ARM6-NEXT:    ldr r1, [sp] @ 4-byte Reload
8136; CHECK-ARM6-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
8137; CHECK-ARM6-NEXT:    add sp, sp, #16
8138; CHECK-ARM6-NEXT:    pop {r4, r5, r6, r7, r8, r9, r11, pc}
8139; CHECK-ARM6-NEXT:    .p2align 2
8140; CHECK-ARM6-NEXT:  @ %bb.6:
8141; CHECK-ARM6-NEXT:  .LCPI39_0:
8142; CHECK-ARM6-NEXT:    .long atomic_i64
8143;
8144; CHECK-THUMB7-LABEL: test_xor_i64:
8145; CHECK-THUMB7:       @ %bb.0: @ %entry
8146; CHECK-THUMB7-NEXT:    .save {r4, r5, r6, r7, r8, r9, lr}
8147; CHECK-THUMB7-NEXT:    push.w {r4, r5, r6, r7, r8, r9, lr}
8148; CHECK-THUMB7-NEXT:    .pad #16
8149; CHECK-THUMB7-NEXT:    sub sp, #16
8150; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i64
8151; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i64
8152; CHECK-THUMB7-NEXT:    ldr r1, [r0]
8153; CHECK-THUMB7-NEXT:    ldr r0, [r0, #4]
8154; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8155; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8156; CHECK-THUMB7-NEXT:    b .LBB39_1
8157; CHECK-THUMB7-NEXT:  .LBB39_1: @ %atomicrmw.start
8158; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
8159; CHECK-THUMB7-NEXT:    @ Child Loop BB39_2 Depth 2
8160; CHECK-THUMB7-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
8161; CHECK-THUMB7-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
8162; CHECK-THUMB7-NEXT:    eor r8, r2, #1
8163; CHECK-THUMB7-NEXT:    @ kill: def $r8 killed $r8 def $r8_r9
8164; CHECK-THUMB7-NEXT:    mov r9, r1
8165; CHECK-THUMB7-NEXT:    mov r6, r2
8166; CHECK-THUMB7-NEXT:    mov r7, r1
8167; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i64
8168; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i64
8169; CHECK-THUMB7-NEXT:  .LBB39_2: @ %atomicrmw.start
8170; CHECK-THUMB7-NEXT:    @ Parent Loop BB39_1 Depth=1
8171; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
8172; CHECK-THUMB7-NEXT:    ldrexd r4, r5, [r3]
8173; CHECK-THUMB7-NEXT:    cmp r4, r6
8174; CHECK-THUMB7-NEXT:    it eq
8175; CHECK-THUMB7-NEXT:    cmpeq r5, r7
8176; CHECK-THUMB7-NEXT:    bne .LBB39_4
8177; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
8178; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB39_2 Depth=2
8179; CHECK-THUMB7-NEXT:    strexd r0, r8, r9, [r3]
8180; CHECK-THUMB7-NEXT:    cmp r0, #0
8181; CHECK-THUMB7-NEXT:    bne .LBB39_2
8182; CHECK-THUMB7-NEXT:  .LBB39_4: @ %atomicrmw.start
8183; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB39_1 Depth=1
8184; CHECK-THUMB7-NEXT:    mov r0, r5
8185; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
8186; CHECK-THUMB7-NEXT:    eor.w r3, r0, r1
8187; CHECK-THUMB7-NEXT:    mov r1, r4
8188; CHECK-THUMB7-NEXT:    str r1, [sp, #4] @ 4-byte Spill
8189; CHECK-THUMB7-NEXT:    eors r2, r1
8190; CHECK-THUMB7-NEXT:    orrs r2, r3
8191; CHECK-THUMB7-NEXT:    cmp r2, #0
8192; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8193; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8194; CHECK-THUMB7-NEXT:    bne .LBB39_1
8195; CHECK-THUMB7-NEXT:    b .LBB39_5
8196; CHECK-THUMB7-NEXT:  .LBB39_5: @ %atomicrmw.end
8197; CHECK-THUMB7-NEXT:    ldr r1, [sp] @ 4-byte Reload
8198; CHECK-THUMB7-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
8199; CHECK-THUMB7-NEXT:    add sp, #16
8200; CHECK-THUMB7-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, pc}
8201;
8202; CHECK-THUMB6-LABEL: test_xor_i64:
8203; CHECK-THUMB6:       @ %bb.0: @ %entry
8204; CHECK-THUMB6-NEXT:    .save {r7, lr}
8205; CHECK-THUMB6-NEXT:    push {r7, lr}
8206; CHECK-THUMB6-NEXT:    ldr r0, .LCPI39_0
8207; CHECK-THUMB6-NEXT:    movs r2, #1
8208; CHECK-THUMB6-NEXT:    movs r3, #0
8209; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_xor_8
8210; CHECK-THUMB6-NEXT:    pop {r7, pc}
8211; CHECK-THUMB6-NEXT:    .p2align 2
8212; CHECK-THUMB6-NEXT:  @ %bb.1:
8213; CHECK-THUMB6-NEXT:  .LCPI39_0:
8214; CHECK-THUMB6-NEXT:    .long atomic_i64
8215;
8216; CHECK-THUMB8BASE-LABEL: test_xor_i64:
8217; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
8218; CHECK-THUMB8BASE-NEXT:    .save {r7, lr}
8219; CHECK-THUMB8BASE-NEXT:    push {r7, lr}
8220; CHECK-THUMB8BASE-NEXT:    .pad #8
8221; CHECK-THUMB8BASE-NEXT:    sub sp, #8
8222; CHECK-THUMB8BASE-NEXT:    movs r3, #0
8223; CHECK-THUMB8BASE-NEXT:    str r3, [sp]
8224; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i64
8225; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i64
8226; CHECK-THUMB8BASE-NEXT:    movs r2, #1
8227; CHECK-THUMB8BASE-NEXT:    bl __atomic_fetch_xor_8
8228; CHECK-THUMB8BASE-NEXT:    add sp, #8
8229; CHECK-THUMB8BASE-NEXT:    pop {r7, pc}
8230entry:
8231  %0 = atomicrmw xor i64* @atomic_i64, i64 1 monotonic
8232  ret i64 %0
8233}
8234
8235define i64 @test_max_i64() {
8236; CHECK-ARM8-LABEL: test_max_i64:
8237; CHECK-ARM8:       @ %bb.0: @ %entry
8238; CHECK-ARM8-NEXT:    .save {r4, r5, r6, r7, r8, r9, r11, lr}
8239; CHECK-ARM8-NEXT:    push {r4, r5, r6, r7, r8, r9, r11, lr}
8240; CHECK-ARM8-NEXT:    .pad #16
8241; CHECK-ARM8-NEXT:    sub sp, sp, #16
8242; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i64
8243; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i64
8244; CHECK-ARM8-NEXT:    ldr r1, [r0]
8245; CHECK-ARM8-NEXT:    ldr r0, [r0, #4]
8246; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8247; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8248; CHECK-ARM8-NEXT:    b .LBB40_1
8249; CHECK-ARM8-NEXT:  .LBB40_1: @ %atomicrmw.start
8250; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
8251; CHECK-ARM8-NEXT:    @ Child Loop BB40_2 Depth 2
8252; CHECK-ARM8-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
8253; CHECK-ARM8-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
8254; CHECK-ARM8-NEXT:    mov r6, r2
8255; CHECK-ARM8-NEXT:    mov r7, r1
8256; CHECK-ARM8-NEXT:    rsbs r0, r2, #1
8257; CHECK-ARM8-NEXT:    rscs r0, r1, #0
8258; CHECK-ARM8-NEXT:    mov r0, #0
8259; CHECK-ARM8-NEXT:    movwlt r0, #1
8260; CHECK-ARM8-NEXT:    mov r8, #1
8261; CHECK-ARM8-NEXT:    cmp r0, #0
8262; CHECK-ARM8-NEXT:    movne r8, r2
8263; CHECK-ARM8-NEXT:    cmp r0, #0
8264; CHECK-ARM8-NEXT:    movne r0, r1
8265; CHECK-ARM8-NEXT:    @ kill: def $r8 killed $r8 def $r8_r9
8266; CHECK-ARM8-NEXT:    mov r9, r0
8267; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i64
8268; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i64
8269; CHECK-ARM8-NEXT:  .LBB40_2: @ %atomicrmw.start
8270; CHECK-ARM8-NEXT:    @ Parent Loop BB40_1 Depth=1
8271; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
8272; CHECK-ARM8-NEXT:    ldrexd r4, r5, [r3]
8273; CHECK-ARM8-NEXT:    cmp r4, r6
8274; CHECK-ARM8-NEXT:    cmpeq r5, r7
8275; CHECK-ARM8-NEXT:    bne .LBB40_4
8276; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
8277; CHECK-ARM8-NEXT:    @ in Loop: Header=BB40_2 Depth=2
8278; CHECK-ARM8-NEXT:    strexd r0, r8, r9, [r3]
8279; CHECK-ARM8-NEXT:    cmp r0, #0
8280; CHECK-ARM8-NEXT:    bne .LBB40_2
8281; CHECK-ARM8-NEXT:  .LBB40_4: @ %atomicrmw.start
8282; CHECK-ARM8-NEXT:    @ in Loop: Header=BB40_1 Depth=1
8283; CHECK-ARM8-NEXT:    mov r0, r5
8284; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
8285; CHECK-ARM8-NEXT:    eor r3, r0, r1
8286; CHECK-ARM8-NEXT:    mov r1, r4
8287; CHECK-ARM8-NEXT:    str r1, [sp, #4] @ 4-byte Spill
8288; CHECK-ARM8-NEXT:    eor r2, r1, r2
8289; CHECK-ARM8-NEXT:    orr r2, r2, r3
8290; CHECK-ARM8-NEXT:    cmp r2, #0
8291; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8292; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8293; CHECK-ARM8-NEXT:    bne .LBB40_1
8294; CHECK-ARM8-NEXT:    b .LBB40_5
8295; CHECK-ARM8-NEXT:  .LBB40_5: @ %atomicrmw.end
8296; CHECK-ARM8-NEXT:    ldr r1, [sp] @ 4-byte Reload
8297; CHECK-ARM8-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
8298; CHECK-ARM8-NEXT:    add sp, sp, #16
8299; CHECK-ARM8-NEXT:    pop {r4, r5, r6, r7, r8, r9, r11, pc}
8300;
8301; CHECK-ARM6-LABEL: test_max_i64:
8302; CHECK-ARM6:       @ %bb.0: @ %entry
8303; CHECK-ARM6-NEXT:    .save {r4, r5, r6, r7, r8, r9, r11, lr}
8304; CHECK-ARM6-NEXT:    push {r4, r5, r6, r7, r8, r9, r11, lr}
8305; CHECK-ARM6-NEXT:    .pad #16
8306; CHECK-ARM6-NEXT:    sub sp, sp, #16
8307; CHECK-ARM6-NEXT:    ldr r0, .LCPI40_0
8308; CHECK-ARM6-NEXT:    ldr r1, [r0]
8309; CHECK-ARM6-NEXT:    ldr r0, [r0, #4]
8310; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8311; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8312; CHECK-ARM6-NEXT:    b .LBB40_1
8313; CHECK-ARM6-NEXT:  .LBB40_1: @ %atomicrmw.start
8314; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
8315; CHECK-ARM6-NEXT:    @ Child Loop BB40_2 Depth 2
8316; CHECK-ARM6-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
8317; CHECK-ARM6-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
8318; CHECK-ARM6-NEXT:    mov r6, r2
8319; CHECK-ARM6-NEXT:    mov r7, r1
8320; CHECK-ARM6-NEXT:    rsbs r0, r2, #1
8321; CHECK-ARM6-NEXT:    rscs r0, r1, #0
8322; CHECK-ARM6-NEXT:    mov r0, #0
8323; CHECK-ARM6-NEXT:    movlt r0, #1
8324; CHECK-ARM6-NEXT:    mov r8, #1
8325; CHECK-ARM6-NEXT:    cmp r0, #0
8326; CHECK-ARM6-NEXT:    movne r8, r2
8327; CHECK-ARM6-NEXT:    cmp r0, #0
8328; CHECK-ARM6-NEXT:    movne r0, r1
8329; CHECK-ARM6-NEXT:    @ kill: def $r8 killed $r8 def $r8_r9
8330; CHECK-ARM6-NEXT:    mov r9, r0
8331; CHECK-ARM6-NEXT:    ldr r3, .LCPI40_0
8332; CHECK-ARM6-NEXT:  .LBB40_2: @ %atomicrmw.start
8333; CHECK-ARM6-NEXT:    @ Parent Loop BB40_1 Depth=1
8334; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
8335; CHECK-ARM6-NEXT:    ldrexd r4, r5, [r3]
8336; CHECK-ARM6-NEXT:    cmp r4, r6
8337; CHECK-ARM6-NEXT:    cmpeq r5, r7
8338; CHECK-ARM6-NEXT:    bne .LBB40_4
8339; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
8340; CHECK-ARM6-NEXT:    @ in Loop: Header=BB40_2 Depth=2
8341; CHECK-ARM6-NEXT:    strexd r0, r8, r9, [r3]
8342; CHECK-ARM6-NEXT:    cmp r0, #0
8343; CHECK-ARM6-NEXT:    bne .LBB40_2
8344; CHECK-ARM6-NEXT:  .LBB40_4: @ %atomicrmw.start
8345; CHECK-ARM6-NEXT:    @ in Loop: Header=BB40_1 Depth=1
8346; CHECK-ARM6-NEXT:    mov r0, r5
8347; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
8348; CHECK-ARM6-NEXT:    eor r3, r0, r1
8349; CHECK-ARM6-NEXT:    mov r1, r4
8350; CHECK-ARM6-NEXT:    str r1, [sp, #4] @ 4-byte Spill
8351; CHECK-ARM6-NEXT:    eor r2, r1, r2
8352; CHECK-ARM6-NEXT:    orr r2, r2, r3
8353; CHECK-ARM6-NEXT:    cmp r2, #0
8354; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8355; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8356; CHECK-ARM6-NEXT:    bne .LBB40_1
8357; CHECK-ARM6-NEXT:    b .LBB40_5
8358; CHECK-ARM6-NEXT:  .LBB40_5: @ %atomicrmw.end
8359; CHECK-ARM6-NEXT:    ldr r1, [sp] @ 4-byte Reload
8360; CHECK-ARM6-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
8361; CHECK-ARM6-NEXT:    add sp, sp, #16
8362; CHECK-ARM6-NEXT:    pop {r4, r5, r6, r7, r8, r9, r11, pc}
8363; CHECK-ARM6-NEXT:    .p2align 2
8364; CHECK-ARM6-NEXT:  @ %bb.6:
8365; CHECK-ARM6-NEXT:  .LCPI40_0:
8366; CHECK-ARM6-NEXT:    .long atomic_i64
8367;
8368; CHECK-THUMB7-LABEL: test_max_i64:
8369; CHECK-THUMB7:       @ %bb.0: @ %entry
8370; CHECK-THUMB7-NEXT:    .save {r4, r5, r6, r7, r8, r9, lr}
8371; CHECK-THUMB7-NEXT:    push.w {r4, r5, r6, r7, r8, r9, lr}
8372; CHECK-THUMB7-NEXT:    .pad #16
8373; CHECK-THUMB7-NEXT:    sub sp, #16
8374; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i64
8375; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i64
8376; CHECK-THUMB7-NEXT:    ldr r1, [r0]
8377; CHECK-THUMB7-NEXT:    ldr r0, [r0, #4]
8378; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8379; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8380; CHECK-THUMB7-NEXT:    b .LBB40_1
8381; CHECK-THUMB7-NEXT:  .LBB40_1: @ %atomicrmw.start
8382; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
8383; CHECK-THUMB7-NEXT:    @ Child Loop BB40_2 Depth 2
8384; CHECK-THUMB7-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
8385; CHECK-THUMB7-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
8386; CHECK-THUMB7-NEXT:    rsbs.w r0, r2, #1
8387; CHECK-THUMB7-NEXT:    mov.w r0, #0
8388; CHECK-THUMB7-NEXT:    sbcs.w r3, r0, r1
8389; CHECK-THUMB7-NEXT:    it lt
8390; CHECK-THUMB7-NEXT:    movlt r0, #1
8391; CHECK-THUMB7-NEXT:    mov r6, r2
8392; CHECK-THUMB7-NEXT:    mov r7, r1
8393; CHECK-THUMB7-NEXT:    mov.w r8, #1
8394; CHECK-THUMB7-NEXT:    cmp r0, #0
8395; CHECK-THUMB7-NEXT:    it ne
8396; CHECK-THUMB7-NEXT:    movne r8, r2
8397; CHECK-THUMB7-NEXT:    cmp r0, #0
8398; CHECK-THUMB7-NEXT:    it ne
8399; CHECK-THUMB7-NEXT:    movne r0, r1
8400; CHECK-THUMB7-NEXT:    @ kill: def $r8 killed $r8 def $r8_r9
8401; CHECK-THUMB7-NEXT:    mov r9, r0
8402; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i64
8403; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i64
8404; CHECK-THUMB7-NEXT:  .LBB40_2: @ %atomicrmw.start
8405; CHECK-THUMB7-NEXT:    @ Parent Loop BB40_1 Depth=1
8406; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
8407; CHECK-THUMB7-NEXT:    ldrexd r4, r5, [r3]
8408; CHECK-THUMB7-NEXT:    cmp r4, r6
8409; CHECK-THUMB7-NEXT:    it eq
8410; CHECK-THUMB7-NEXT:    cmpeq r5, r7
8411; CHECK-THUMB7-NEXT:    bne .LBB40_4
8412; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
8413; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB40_2 Depth=2
8414; CHECK-THUMB7-NEXT:    strexd r0, r8, r9, [r3]
8415; CHECK-THUMB7-NEXT:    cmp r0, #0
8416; CHECK-THUMB7-NEXT:    bne .LBB40_2
8417; CHECK-THUMB7-NEXT:  .LBB40_4: @ %atomicrmw.start
8418; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB40_1 Depth=1
8419; CHECK-THUMB7-NEXT:    mov r0, r5
8420; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
8421; CHECK-THUMB7-NEXT:    eor.w r3, r0, r1
8422; CHECK-THUMB7-NEXT:    mov r1, r4
8423; CHECK-THUMB7-NEXT:    str r1, [sp, #4] @ 4-byte Spill
8424; CHECK-THUMB7-NEXT:    eors r2, r1
8425; CHECK-THUMB7-NEXT:    orrs r2, r3
8426; CHECK-THUMB7-NEXT:    cmp r2, #0
8427; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8428; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8429; CHECK-THUMB7-NEXT:    bne .LBB40_1
8430; CHECK-THUMB7-NEXT:    b .LBB40_5
8431; CHECK-THUMB7-NEXT:  .LBB40_5: @ %atomicrmw.end
8432; CHECK-THUMB7-NEXT:    ldr r1, [sp] @ 4-byte Reload
8433; CHECK-THUMB7-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
8434; CHECK-THUMB7-NEXT:    add sp, #16
8435; CHECK-THUMB7-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, pc}
8436;
8437; CHECK-THUMB6-LABEL: test_max_i64:
8438; CHECK-THUMB6:       @ %bb.0: @ %entry
8439; CHECK-THUMB6-NEXT:    .save {r7, lr}
8440; CHECK-THUMB6-NEXT:    push {r7, lr}
8441; CHECK-THUMB6-NEXT:    ldr r0, .LCPI40_0
8442; CHECK-THUMB6-NEXT:    movs r2, #1
8443; CHECK-THUMB6-NEXT:    movs r3, #0
8444; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_max_8
8445; CHECK-THUMB6-NEXT:    pop {r7, pc}
8446; CHECK-THUMB6-NEXT:    .p2align 2
8447; CHECK-THUMB6-NEXT:  @ %bb.1:
8448; CHECK-THUMB6-NEXT:  .LCPI40_0:
8449; CHECK-THUMB6-NEXT:    .long atomic_i64
8450;
8451; CHECK-THUMB8BASE-LABEL: test_max_i64:
8452; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
8453; CHECK-THUMB8BASE-NEXT:    .save {r4, lr}
8454; CHECK-THUMB8BASE-NEXT:    push {r4, lr}
8455; CHECK-THUMB8BASE-NEXT:    .pad #72
8456; CHECK-THUMB8BASE-NEXT:    sub sp, #72
8457; CHECK-THUMB8BASE-NEXT:    movw r1, :lower16:atomic_i64
8458; CHECK-THUMB8BASE-NEXT:    movt r1, :upper16:atomic_i64
8459; CHECK-THUMB8BASE-NEXT:    ldr r0, [r1, #4]
8460; CHECK-THUMB8BASE-NEXT:    ldr r1, [r1]
8461; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #56] @ 4-byte Spill
8462; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #60] @ 4-byte Spill
8463; CHECK-THUMB8BASE-NEXT:    b .LBB40_1
8464; CHECK-THUMB8BASE-NEXT:  .LBB40_1: @ %atomicrmw.start
8465; CHECK-THUMB8BASE-NEXT:    @ =>This Inner Loop Header: Depth=1
8466; CHECK-THUMB8BASE-NEXT:    ldr r3, [sp, #56] @ 4-byte Reload
8467; CHECK-THUMB8BASE-NEXT:    ldr r2, [sp, #60] @ 4-byte Reload
8468; CHECK-THUMB8BASE-NEXT:    str r2, [sp, #36] @ 4-byte Spill
8469; CHECK-THUMB8BASE-NEXT:    str r3, [sp, #40] @ 4-byte Spill
8470; CHECK-THUMB8BASE-NEXT:    movs r1, #0
8471; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #44] @ 4-byte Spill
8472; CHECK-THUMB8BASE-NEXT:    movs r0, #1
8473; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #48] @ 4-byte Spill
8474; CHECK-THUMB8BASE-NEXT:    subs r3, r0, r3
8475; CHECK-THUMB8BASE-NEXT:    sbcs r1, r2
8476; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #52] @ 4-byte Spill
8477; CHECK-THUMB8BASE-NEXT:    blt .LBB40_3
8478; CHECK-THUMB8BASE-NEXT:  @ %bb.2: @ %atomicrmw.start
8479; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB40_1 Depth=1
8480; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #44] @ 4-byte Reload
8481; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #52] @ 4-byte Spill
8482; CHECK-THUMB8BASE-NEXT:  .LBB40_3: @ %atomicrmw.start
8483; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB40_1 Depth=1
8484; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #40] @ 4-byte Reload
8485; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #52] @ 4-byte Reload
8486; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #28] @ 4-byte Spill
8487; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #32] @ 4-byte Spill
8488; CHECK-THUMB8BASE-NEXT:    cbnz r1, .LBB40_5
8489; CHECK-THUMB8BASE-NEXT:  @ %bb.4: @ %atomicrmw.start
8490; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB40_1 Depth=1
8491; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #48] @ 4-byte Reload
8492; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #32] @ 4-byte Spill
8493; CHECK-THUMB8BASE-NEXT:  .LBB40_5: @ %atomicrmw.start
8494; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB40_1 Depth=1
8495; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #36] @ 4-byte Reload
8496; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #28] @ 4-byte Reload
8497; CHECK-THUMB8BASE-NEXT:    ldr r2, [sp, #32] @ 4-byte Reload
8498; CHECK-THUMB8BASE-NEXT:    str r2, [sp, #20] @ 4-byte Spill
8499; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #24] @ 4-byte Spill
8500; CHECK-THUMB8BASE-NEXT:    cbnz r1, .LBB40_7
8501; CHECK-THUMB8BASE-NEXT:  @ %bb.6: @ %atomicrmw.start
8502; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB40_1 Depth=1
8503; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #28] @ 4-byte Reload
8504; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #24] @ 4-byte Spill
8505; CHECK-THUMB8BASE-NEXT:  .LBB40_7: @ %atomicrmw.start
8506; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB40_1 Depth=1
8507; CHECK-THUMB8BASE-NEXT:    ldr r2, [sp, #20] @ 4-byte Reload
8508; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #44] @ 4-byte Reload
8509; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #36] @ 4-byte Reload
8510; CHECK-THUMB8BASE-NEXT:    ldr r4, [sp, #40] @ 4-byte Reload
8511; CHECK-THUMB8BASE-NEXT:    ldr r3, [sp, #24] @ 4-byte Reload
8512; CHECK-THUMB8BASE-NEXT:    str r4, [sp, #64]
8513; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #68]
8514; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4]
8515; CHECK-THUMB8BASE-NEXT:    str r0, [sp]
8516; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i64
8517; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i64
8518; CHECK-THUMB8BASE-NEXT:    add r1, sp, #64
8519; CHECK-THUMB8BASE-NEXT:    bl __atomic_compare_exchange_8
8520; CHECK-THUMB8BASE-NEXT:    mov r2, r0
8521; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #68]
8522; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8523; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #64]
8524; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #16] @ 4-byte Spill
8525; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
8526; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #56] @ 4-byte Spill
8527; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #60] @ 4-byte Spill
8528; CHECK-THUMB8BASE-NEXT:    beq .LBB40_1
8529; CHECK-THUMB8BASE-NEXT:    b .LBB40_8
8530; CHECK-THUMB8BASE-NEXT:  .LBB40_8: @ %atomicrmw.end
8531; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
8532; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #16] @ 4-byte Reload
8533; CHECK-THUMB8BASE-NEXT:    add sp, #72
8534; CHECK-THUMB8BASE-NEXT:    pop {r4, pc}
8535entry:
8536  %0 = atomicrmw max i64* @atomic_i64, i64 1 monotonic
8537  ret i64 %0
8538}
8539define i64 @test_min_i64() {
8540; CHECK-ARM8-LABEL: test_min_i64:
8541; CHECK-ARM8:       @ %bb.0: @ %entry
8542; CHECK-ARM8-NEXT:    .save {r4, r5, r6, r7, r8, r9, r11, lr}
8543; CHECK-ARM8-NEXT:    push {r4, r5, r6, r7, r8, r9, r11, lr}
8544; CHECK-ARM8-NEXT:    .pad #16
8545; CHECK-ARM8-NEXT:    sub sp, sp, #16
8546; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i64
8547; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i64
8548; CHECK-ARM8-NEXT:    ldr r1, [r0]
8549; CHECK-ARM8-NEXT:    ldr r0, [r0, #4]
8550; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8551; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8552; CHECK-ARM8-NEXT:    b .LBB41_1
8553; CHECK-ARM8-NEXT:  .LBB41_1: @ %atomicrmw.start
8554; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
8555; CHECK-ARM8-NEXT:    @ Child Loop BB41_2 Depth 2
8556; CHECK-ARM8-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
8557; CHECK-ARM8-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
8558; CHECK-ARM8-NEXT:    mov r6, r2
8559; CHECK-ARM8-NEXT:    mov r7, r1
8560; CHECK-ARM8-NEXT:    subs r0, r2, #2
8561; CHECK-ARM8-NEXT:    sbcs r0, r1, #0
8562; CHECK-ARM8-NEXT:    mov r0, #0
8563; CHECK-ARM8-NEXT:    movwlt r0, #1
8564; CHECK-ARM8-NEXT:    mov r8, #1
8565; CHECK-ARM8-NEXT:    cmp r0, #0
8566; CHECK-ARM8-NEXT:    movne r8, r2
8567; CHECK-ARM8-NEXT:    cmp r0, #0
8568; CHECK-ARM8-NEXT:    movne r0, r1
8569; CHECK-ARM8-NEXT:    @ kill: def $r8 killed $r8 def $r8_r9
8570; CHECK-ARM8-NEXT:    mov r9, r0
8571; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i64
8572; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i64
8573; CHECK-ARM8-NEXT:  .LBB41_2: @ %atomicrmw.start
8574; CHECK-ARM8-NEXT:    @ Parent Loop BB41_1 Depth=1
8575; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
8576; CHECK-ARM8-NEXT:    ldrexd r4, r5, [r3]
8577; CHECK-ARM8-NEXT:    cmp r4, r6
8578; CHECK-ARM8-NEXT:    cmpeq r5, r7
8579; CHECK-ARM8-NEXT:    bne .LBB41_4
8580; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
8581; CHECK-ARM8-NEXT:    @ in Loop: Header=BB41_2 Depth=2
8582; CHECK-ARM8-NEXT:    strexd r0, r8, r9, [r3]
8583; CHECK-ARM8-NEXT:    cmp r0, #0
8584; CHECK-ARM8-NEXT:    bne .LBB41_2
8585; CHECK-ARM8-NEXT:  .LBB41_4: @ %atomicrmw.start
8586; CHECK-ARM8-NEXT:    @ in Loop: Header=BB41_1 Depth=1
8587; CHECK-ARM8-NEXT:    mov r0, r5
8588; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
8589; CHECK-ARM8-NEXT:    eor r3, r0, r1
8590; CHECK-ARM8-NEXT:    mov r1, r4
8591; CHECK-ARM8-NEXT:    str r1, [sp, #4] @ 4-byte Spill
8592; CHECK-ARM8-NEXT:    eor r2, r1, r2
8593; CHECK-ARM8-NEXT:    orr r2, r2, r3
8594; CHECK-ARM8-NEXT:    cmp r2, #0
8595; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8596; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8597; CHECK-ARM8-NEXT:    bne .LBB41_1
8598; CHECK-ARM8-NEXT:    b .LBB41_5
8599; CHECK-ARM8-NEXT:  .LBB41_5: @ %atomicrmw.end
8600; CHECK-ARM8-NEXT:    ldr r1, [sp] @ 4-byte Reload
8601; CHECK-ARM8-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
8602; CHECK-ARM8-NEXT:    add sp, sp, #16
8603; CHECK-ARM8-NEXT:    pop {r4, r5, r6, r7, r8, r9, r11, pc}
8604;
8605; CHECK-ARM6-LABEL: test_min_i64:
8606; CHECK-ARM6:       @ %bb.0: @ %entry
8607; CHECK-ARM6-NEXT:    .save {r4, r5, r6, r7, r8, r9, r11, lr}
8608; CHECK-ARM6-NEXT:    push {r4, r5, r6, r7, r8, r9, r11, lr}
8609; CHECK-ARM6-NEXT:    .pad #16
8610; CHECK-ARM6-NEXT:    sub sp, sp, #16
8611; CHECK-ARM6-NEXT:    ldr r0, .LCPI41_0
8612; CHECK-ARM6-NEXT:    ldr r1, [r0]
8613; CHECK-ARM6-NEXT:    ldr r0, [r0, #4]
8614; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8615; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8616; CHECK-ARM6-NEXT:    b .LBB41_1
8617; CHECK-ARM6-NEXT:  .LBB41_1: @ %atomicrmw.start
8618; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
8619; CHECK-ARM6-NEXT:    @ Child Loop BB41_2 Depth 2
8620; CHECK-ARM6-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
8621; CHECK-ARM6-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
8622; CHECK-ARM6-NEXT:    mov r6, r2
8623; CHECK-ARM6-NEXT:    mov r7, r1
8624; CHECK-ARM6-NEXT:    subs r0, r2, #2
8625; CHECK-ARM6-NEXT:    sbcs r0, r1, #0
8626; CHECK-ARM6-NEXT:    mov r0, #0
8627; CHECK-ARM6-NEXT:    movlt r0, #1
8628; CHECK-ARM6-NEXT:    mov r8, #1
8629; CHECK-ARM6-NEXT:    cmp r0, #0
8630; CHECK-ARM6-NEXT:    movne r8, r2
8631; CHECK-ARM6-NEXT:    cmp r0, #0
8632; CHECK-ARM6-NEXT:    movne r0, r1
8633; CHECK-ARM6-NEXT:    @ kill: def $r8 killed $r8 def $r8_r9
8634; CHECK-ARM6-NEXT:    mov r9, r0
8635; CHECK-ARM6-NEXT:    ldr r3, .LCPI41_0
8636; CHECK-ARM6-NEXT:  .LBB41_2: @ %atomicrmw.start
8637; CHECK-ARM6-NEXT:    @ Parent Loop BB41_1 Depth=1
8638; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
8639; CHECK-ARM6-NEXT:    ldrexd r4, r5, [r3]
8640; CHECK-ARM6-NEXT:    cmp r4, r6
8641; CHECK-ARM6-NEXT:    cmpeq r5, r7
8642; CHECK-ARM6-NEXT:    bne .LBB41_4
8643; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
8644; CHECK-ARM6-NEXT:    @ in Loop: Header=BB41_2 Depth=2
8645; CHECK-ARM6-NEXT:    strexd r0, r8, r9, [r3]
8646; CHECK-ARM6-NEXT:    cmp r0, #0
8647; CHECK-ARM6-NEXT:    bne .LBB41_2
8648; CHECK-ARM6-NEXT:  .LBB41_4: @ %atomicrmw.start
8649; CHECK-ARM6-NEXT:    @ in Loop: Header=BB41_1 Depth=1
8650; CHECK-ARM6-NEXT:    mov r0, r5
8651; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
8652; CHECK-ARM6-NEXT:    eor r3, r0, r1
8653; CHECK-ARM6-NEXT:    mov r1, r4
8654; CHECK-ARM6-NEXT:    str r1, [sp, #4] @ 4-byte Spill
8655; CHECK-ARM6-NEXT:    eor r2, r1, r2
8656; CHECK-ARM6-NEXT:    orr r2, r2, r3
8657; CHECK-ARM6-NEXT:    cmp r2, #0
8658; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8659; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8660; CHECK-ARM6-NEXT:    bne .LBB41_1
8661; CHECK-ARM6-NEXT:    b .LBB41_5
8662; CHECK-ARM6-NEXT:  .LBB41_5: @ %atomicrmw.end
8663; CHECK-ARM6-NEXT:    ldr r1, [sp] @ 4-byte Reload
8664; CHECK-ARM6-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
8665; CHECK-ARM6-NEXT:    add sp, sp, #16
8666; CHECK-ARM6-NEXT:    pop {r4, r5, r6, r7, r8, r9, r11, pc}
8667; CHECK-ARM6-NEXT:    .p2align 2
8668; CHECK-ARM6-NEXT:  @ %bb.6:
8669; CHECK-ARM6-NEXT:  .LCPI41_0:
8670; CHECK-ARM6-NEXT:    .long atomic_i64
8671;
8672; CHECK-THUMB7-LABEL: test_min_i64:
8673; CHECK-THUMB7:       @ %bb.0: @ %entry
8674; CHECK-THUMB7-NEXT:    .save {r4, r5, r6, r7, r8, r9, lr}
8675; CHECK-THUMB7-NEXT:    push.w {r4, r5, r6, r7, r8, r9, lr}
8676; CHECK-THUMB7-NEXT:    .pad #16
8677; CHECK-THUMB7-NEXT:    sub sp, #16
8678; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i64
8679; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i64
8680; CHECK-THUMB7-NEXT:    ldr r1, [r0]
8681; CHECK-THUMB7-NEXT:    ldr r0, [r0, #4]
8682; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8683; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8684; CHECK-THUMB7-NEXT:    b .LBB41_1
8685; CHECK-THUMB7-NEXT:  .LBB41_1: @ %atomicrmw.start
8686; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
8687; CHECK-THUMB7-NEXT:    @ Child Loop BB41_2 Depth 2
8688; CHECK-THUMB7-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
8689; CHECK-THUMB7-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
8690; CHECK-THUMB7-NEXT:    mov r6, r2
8691; CHECK-THUMB7-NEXT:    mov r7, r1
8692; CHECK-THUMB7-NEXT:    subs r0, r2, #2
8693; CHECK-THUMB7-NEXT:    sbcs r0, r1, #0
8694; CHECK-THUMB7-NEXT:    mov.w r0, #0
8695; CHECK-THUMB7-NEXT:    it lt
8696; CHECK-THUMB7-NEXT:    movlt r0, #1
8697; CHECK-THUMB7-NEXT:    mov.w r8, #1
8698; CHECK-THUMB7-NEXT:    cmp r0, #0
8699; CHECK-THUMB7-NEXT:    it ne
8700; CHECK-THUMB7-NEXT:    movne r8, r2
8701; CHECK-THUMB7-NEXT:    cmp r0, #0
8702; CHECK-THUMB7-NEXT:    it ne
8703; CHECK-THUMB7-NEXT:    movne r0, r1
8704; CHECK-THUMB7-NEXT:    @ kill: def $r8 killed $r8 def $r8_r9
8705; CHECK-THUMB7-NEXT:    mov r9, r0
8706; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i64
8707; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i64
8708; CHECK-THUMB7-NEXT:  .LBB41_2: @ %atomicrmw.start
8709; CHECK-THUMB7-NEXT:    @ Parent Loop BB41_1 Depth=1
8710; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
8711; CHECK-THUMB7-NEXT:    ldrexd r4, r5, [r3]
8712; CHECK-THUMB7-NEXT:    cmp r4, r6
8713; CHECK-THUMB7-NEXT:    it eq
8714; CHECK-THUMB7-NEXT:    cmpeq r5, r7
8715; CHECK-THUMB7-NEXT:    bne .LBB41_4
8716; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
8717; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB41_2 Depth=2
8718; CHECK-THUMB7-NEXT:    strexd r0, r8, r9, [r3]
8719; CHECK-THUMB7-NEXT:    cmp r0, #0
8720; CHECK-THUMB7-NEXT:    bne .LBB41_2
8721; CHECK-THUMB7-NEXT:  .LBB41_4: @ %atomicrmw.start
8722; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB41_1 Depth=1
8723; CHECK-THUMB7-NEXT:    mov r0, r5
8724; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
8725; CHECK-THUMB7-NEXT:    eor.w r3, r0, r1
8726; CHECK-THUMB7-NEXT:    mov r1, r4
8727; CHECK-THUMB7-NEXT:    str r1, [sp, #4] @ 4-byte Spill
8728; CHECK-THUMB7-NEXT:    eors r2, r1
8729; CHECK-THUMB7-NEXT:    orrs r2, r3
8730; CHECK-THUMB7-NEXT:    cmp r2, #0
8731; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8732; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8733; CHECK-THUMB7-NEXT:    bne .LBB41_1
8734; CHECK-THUMB7-NEXT:    b .LBB41_5
8735; CHECK-THUMB7-NEXT:  .LBB41_5: @ %atomicrmw.end
8736; CHECK-THUMB7-NEXT:    ldr r1, [sp] @ 4-byte Reload
8737; CHECK-THUMB7-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
8738; CHECK-THUMB7-NEXT:    add sp, #16
8739; CHECK-THUMB7-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, pc}
8740;
8741; CHECK-THUMB6-LABEL: test_min_i64:
8742; CHECK-THUMB6:       @ %bb.0: @ %entry
8743; CHECK-THUMB6-NEXT:    .save {r7, lr}
8744; CHECK-THUMB6-NEXT:    push {r7, lr}
8745; CHECK-THUMB6-NEXT:    ldr r0, .LCPI41_0
8746; CHECK-THUMB6-NEXT:    movs r2, #1
8747; CHECK-THUMB6-NEXT:    movs r3, #0
8748; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_min_8
8749; CHECK-THUMB6-NEXT:    pop {r7, pc}
8750; CHECK-THUMB6-NEXT:    .p2align 2
8751; CHECK-THUMB6-NEXT:  @ %bb.1:
8752; CHECK-THUMB6-NEXT:  .LCPI41_0:
8753; CHECK-THUMB6-NEXT:    .long atomic_i64
8754;
8755; CHECK-THUMB8BASE-LABEL: test_min_i64:
8756; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
8757; CHECK-THUMB8BASE-NEXT:    .save {r4, lr}
8758; CHECK-THUMB8BASE-NEXT:    push {r4, lr}
8759; CHECK-THUMB8BASE-NEXT:    .pad #72
8760; CHECK-THUMB8BASE-NEXT:    sub sp, #72
8761; CHECK-THUMB8BASE-NEXT:    movw r1, :lower16:atomic_i64
8762; CHECK-THUMB8BASE-NEXT:    movt r1, :upper16:atomic_i64
8763; CHECK-THUMB8BASE-NEXT:    ldr r0, [r1, #4]
8764; CHECK-THUMB8BASE-NEXT:    ldr r1, [r1]
8765; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #56] @ 4-byte Spill
8766; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #60] @ 4-byte Spill
8767; CHECK-THUMB8BASE-NEXT:    b .LBB41_1
8768; CHECK-THUMB8BASE-NEXT:  .LBB41_1: @ %atomicrmw.start
8769; CHECK-THUMB8BASE-NEXT:    @ =>This Inner Loop Header: Depth=1
8770; CHECK-THUMB8BASE-NEXT:    ldr r3, [sp, #56] @ 4-byte Reload
8771; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #60] @ 4-byte Reload
8772; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #36] @ 4-byte Spill
8773; CHECK-THUMB8BASE-NEXT:    str r3, [sp, #40] @ 4-byte Spill
8774; CHECK-THUMB8BASE-NEXT:    movs r0, #1
8775; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #44] @ 4-byte Spill
8776; CHECK-THUMB8BASE-NEXT:    movs r2, #0
8777; CHECK-THUMB8BASE-NEXT:    str r2, [sp, #48] @ 4-byte Spill
8778; CHECK-THUMB8BASE-NEXT:    subs r3, r3, #2
8779; CHECK-THUMB8BASE-NEXT:    sbcs r1, r2
8780; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #52] @ 4-byte Spill
8781; CHECK-THUMB8BASE-NEXT:    blt .LBB41_3
8782; CHECK-THUMB8BASE-NEXT:  @ %bb.2: @ %atomicrmw.start
8783; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB41_1 Depth=1
8784; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #48] @ 4-byte Reload
8785; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #52] @ 4-byte Spill
8786; CHECK-THUMB8BASE-NEXT:  .LBB41_3: @ %atomicrmw.start
8787; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB41_1 Depth=1
8788; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #40] @ 4-byte Reload
8789; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #52] @ 4-byte Reload
8790; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #28] @ 4-byte Spill
8791; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #32] @ 4-byte Spill
8792; CHECK-THUMB8BASE-NEXT:    cbnz r1, .LBB41_5
8793; CHECK-THUMB8BASE-NEXT:  @ %bb.4: @ %atomicrmw.start
8794; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB41_1 Depth=1
8795; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #44] @ 4-byte Reload
8796; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #32] @ 4-byte Spill
8797; CHECK-THUMB8BASE-NEXT:  .LBB41_5: @ %atomicrmw.start
8798; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB41_1 Depth=1
8799; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #36] @ 4-byte Reload
8800; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #28] @ 4-byte Reload
8801; CHECK-THUMB8BASE-NEXT:    ldr r2, [sp, #32] @ 4-byte Reload
8802; CHECK-THUMB8BASE-NEXT:    str r2, [sp, #20] @ 4-byte Spill
8803; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #24] @ 4-byte Spill
8804; CHECK-THUMB8BASE-NEXT:    cbnz r1, .LBB41_7
8805; CHECK-THUMB8BASE-NEXT:  @ %bb.6: @ %atomicrmw.start
8806; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB41_1 Depth=1
8807; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #28] @ 4-byte Reload
8808; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #24] @ 4-byte Spill
8809; CHECK-THUMB8BASE-NEXT:  .LBB41_7: @ %atomicrmw.start
8810; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB41_1 Depth=1
8811; CHECK-THUMB8BASE-NEXT:    ldr r2, [sp, #20] @ 4-byte Reload
8812; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #48] @ 4-byte Reload
8813; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #36] @ 4-byte Reload
8814; CHECK-THUMB8BASE-NEXT:    ldr r4, [sp, #40] @ 4-byte Reload
8815; CHECK-THUMB8BASE-NEXT:    ldr r3, [sp, #24] @ 4-byte Reload
8816; CHECK-THUMB8BASE-NEXT:    str r4, [sp, #64]
8817; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #68]
8818; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4]
8819; CHECK-THUMB8BASE-NEXT:    str r0, [sp]
8820; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i64
8821; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i64
8822; CHECK-THUMB8BASE-NEXT:    add r1, sp, #64
8823; CHECK-THUMB8BASE-NEXT:    bl __atomic_compare_exchange_8
8824; CHECK-THUMB8BASE-NEXT:    mov r2, r0
8825; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #68]
8826; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8827; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #64]
8828; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #16] @ 4-byte Spill
8829; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
8830; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #56] @ 4-byte Spill
8831; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #60] @ 4-byte Spill
8832; CHECK-THUMB8BASE-NEXT:    beq .LBB41_1
8833; CHECK-THUMB8BASE-NEXT:    b .LBB41_8
8834; CHECK-THUMB8BASE-NEXT:  .LBB41_8: @ %atomicrmw.end
8835; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
8836; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #16] @ 4-byte Reload
8837; CHECK-THUMB8BASE-NEXT:    add sp, #72
8838; CHECK-THUMB8BASE-NEXT:    pop {r4, pc}
8839entry:
8840  %0 = atomicrmw min i64* @atomic_i64, i64 1 monotonic
8841  ret i64 %0
8842}
8843define i64 @test_umax_i64() {
8844; CHECK-ARM8-LABEL: test_umax_i64:
8845; CHECK-ARM8:       @ %bb.0: @ %entry
8846; CHECK-ARM8-NEXT:    .save {r4, r5, r6, r7, r8, r9, r11, lr}
8847; CHECK-ARM8-NEXT:    push {r4, r5, r6, r7, r8, r9, r11, lr}
8848; CHECK-ARM8-NEXT:    .pad #16
8849; CHECK-ARM8-NEXT:    sub sp, sp, #16
8850; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i64
8851; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i64
8852; CHECK-ARM8-NEXT:    ldr r1, [r0]
8853; CHECK-ARM8-NEXT:    ldr r0, [r0, #4]
8854; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8855; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8856; CHECK-ARM8-NEXT:    b .LBB42_1
8857; CHECK-ARM8-NEXT:  .LBB42_1: @ %atomicrmw.start
8858; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
8859; CHECK-ARM8-NEXT:    @ Child Loop BB42_2 Depth 2
8860; CHECK-ARM8-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
8861; CHECK-ARM8-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
8862; CHECK-ARM8-NEXT:    mov r6, r2
8863; CHECK-ARM8-NEXT:    mov r7, r1
8864; CHECK-ARM8-NEXT:    rsbs r0, r2, #1
8865; CHECK-ARM8-NEXT:    rscs r0, r1, #0
8866; CHECK-ARM8-NEXT:    mov r0, #0
8867; CHECK-ARM8-NEXT:    movwlo r0, #1
8868; CHECK-ARM8-NEXT:    mov r8, #1
8869; CHECK-ARM8-NEXT:    cmp r0, #0
8870; CHECK-ARM8-NEXT:    movne r8, r2
8871; CHECK-ARM8-NEXT:    cmp r0, #0
8872; CHECK-ARM8-NEXT:    movne r0, r1
8873; CHECK-ARM8-NEXT:    @ kill: def $r8 killed $r8 def $r8_r9
8874; CHECK-ARM8-NEXT:    mov r9, r0
8875; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i64
8876; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i64
8877; CHECK-ARM8-NEXT:  .LBB42_2: @ %atomicrmw.start
8878; CHECK-ARM8-NEXT:    @ Parent Loop BB42_1 Depth=1
8879; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
8880; CHECK-ARM8-NEXT:    ldrexd r4, r5, [r3]
8881; CHECK-ARM8-NEXT:    cmp r4, r6
8882; CHECK-ARM8-NEXT:    cmpeq r5, r7
8883; CHECK-ARM8-NEXT:    bne .LBB42_4
8884; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
8885; CHECK-ARM8-NEXT:    @ in Loop: Header=BB42_2 Depth=2
8886; CHECK-ARM8-NEXT:    strexd r0, r8, r9, [r3]
8887; CHECK-ARM8-NEXT:    cmp r0, #0
8888; CHECK-ARM8-NEXT:    bne .LBB42_2
8889; CHECK-ARM8-NEXT:  .LBB42_4: @ %atomicrmw.start
8890; CHECK-ARM8-NEXT:    @ in Loop: Header=BB42_1 Depth=1
8891; CHECK-ARM8-NEXT:    mov r0, r5
8892; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
8893; CHECK-ARM8-NEXT:    eor r3, r0, r1
8894; CHECK-ARM8-NEXT:    mov r1, r4
8895; CHECK-ARM8-NEXT:    str r1, [sp, #4] @ 4-byte Spill
8896; CHECK-ARM8-NEXT:    eor r2, r1, r2
8897; CHECK-ARM8-NEXT:    orr r2, r2, r3
8898; CHECK-ARM8-NEXT:    cmp r2, #0
8899; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8900; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8901; CHECK-ARM8-NEXT:    bne .LBB42_1
8902; CHECK-ARM8-NEXT:    b .LBB42_5
8903; CHECK-ARM8-NEXT:  .LBB42_5: @ %atomicrmw.end
8904; CHECK-ARM8-NEXT:    ldr r1, [sp] @ 4-byte Reload
8905; CHECK-ARM8-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
8906; CHECK-ARM8-NEXT:    add sp, sp, #16
8907; CHECK-ARM8-NEXT:    pop {r4, r5, r6, r7, r8, r9, r11, pc}
8908;
8909; CHECK-ARM6-LABEL: test_umax_i64:
8910; CHECK-ARM6:       @ %bb.0: @ %entry
8911; CHECK-ARM6-NEXT:    .save {r4, r5, r6, r7, r8, r9, r11, lr}
8912; CHECK-ARM6-NEXT:    push {r4, r5, r6, r7, r8, r9, r11, lr}
8913; CHECK-ARM6-NEXT:    .pad #16
8914; CHECK-ARM6-NEXT:    sub sp, sp, #16
8915; CHECK-ARM6-NEXT:    ldr r0, .LCPI42_0
8916; CHECK-ARM6-NEXT:    ldr r1, [r0]
8917; CHECK-ARM6-NEXT:    ldr r0, [r0, #4]
8918; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8919; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8920; CHECK-ARM6-NEXT:    b .LBB42_1
8921; CHECK-ARM6-NEXT:  .LBB42_1: @ %atomicrmw.start
8922; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
8923; CHECK-ARM6-NEXT:    @ Child Loop BB42_2 Depth 2
8924; CHECK-ARM6-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
8925; CHECK-ARM6-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
8926; CHECK-ARM6-NEXT:    mov r6, r2
8927; CHECK-ARM6-NEXT:    mov r7, r1
8928; CHECK-ARM6-NEXT:    rsbs r0, r2, #1
8929; CHECK-ARM6-NEXT:    rscs r0, r1, #0
8930; CHECK-ARM6-NEXT:    mov r0, #0
8931; CHECK-ARM6-NEXT:    movlo r0, #1
8932; CHECK-ARM6-NEXT:    mov r8, #1
8933; CHECK-ARM6-NEXT:    cmp r0, #0
8934; CHECK-ARM6-NEXT:    movne r8, r2
8935; CHECK-ARM6-NEXT:    cmp r0, #0
8936; CHECK-ARM6-NEXT:    movne r0, r1
8937; CHECK-ARM6-NEXT:    @ kill: def $r8 killed $r8 def $r8_r9
8938; CHECK-ARM6-NEXT:    mov r9, r0
8939; CHECK-ARM6-NEXT:    ldr r3, .LCPI42_0
8940; CHECK-ARM6-NEXT:  .LBB42_2: @ %atomicrmw.start
8941; CHECK-ARM6-NEXT:    @ Parent Loop BB42_1 Depth=1
8942; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
8943; CHECK-ARM6-NEXT:    ldrexd r4, r5, [r3]
8944; CHECK-ARM6-NEXT:    cmp r4, r6
8945; CHECK-ARM6-NEXT:    cmpeq r5, r7
8946; CHECK-ARM6-NEXT:    bne .LBB42_4
8947; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
8948; CHECK-ARM6-NEXT:    @ in Loop: Header=BB42_2 Depth=2
8949; CHECK-ARM6-NEXT:    strexd r0, r8, r9, [r3]
8950; CHECK-ARM6-NEXT:    cmp r0, #0
8951; CHECK-ARM6-NEXT:    bne .LBB42_2
8952; CHECK-ARM6-NEXT:  .LBB42_4: @ %atomicrmw.start
8953; CHECK-ARM6-NEXT:    @ in Loop: Header=BB42_1 Depth=1
8954; CHECK-ARM6-NEXT:    mov r0, r5
8955; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
8956; CHECK-ARM6-NEXT:    eor r3, r0, r1
8957; CHECK-ARM6-NEXT:    mov r1, r4
8958; CHECK-ARM6-NEXT:    str r1, [sp, #4] @ 4-byte Spill
8959; CHECK-ARM6-NEXT:    eor r2, r1, r2
8960; CHECK-ARM6-NEXT:    orr r2, r2, r3
8961; CHECK-ARM6-NEXT:    cmp r2, #0
8962; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8963; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8964; CHECK-ARM6-NEXT:    bne .LBB42_1
8965; CHECK-ARM6-NEXT:    b .LBB42_5
8966; CHECK-ARM6-NEXT:  .LBB42_5: @ %atomicrmw.end
8967; CHECK-ARM6-NEXT:    ldr r1, [sp] @ 4-byte Reload
8968; CHECK-ARM6-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
8969; CHECK-ARM6-NEXT:    add sp, sp, #16
8970; CHECK-ARM6-NEXT:    pop {r4, r5, r6, r7, r8, r9, r11, pc}
8971; CHECK-ARM6-NEXT:    .p2align 2
8972; CHECK-ARM6-NEXT:  @ %bb.6:
8973; CHECK-ARM6-NEXT:  .LCPI42_0:
8974; CHECK-ARM6-NEXT:    .long atomic_i64
8975;
8976; CHECK-THUMB7-LABEL: test_umax_i64:
8977; CHECK-THUMB7:       @ %bb.0: @ %entry
8978; CHECK-THUMB7-NEXT:    .save {r4, r5, r6, r7, r8, r9, lr}
8979; CHECK-THUMB7-NEXT:    push.w {r4, r5, r6, r7, r8, r9, lr}
8980; CHECK-THUMB7-NEXT:    .pad #16
8981; CHECK-THUMB7-NEXT:    sub sp, #16
8982; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i64
8983; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i64
8984; CHECK-THUMB7-NEXT:    ldr r1, [r0]
8985; CHECK-THUMB7-NEXT:    ldr r0, [r0, #4]
8986; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8987; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8988; CHECK-THUMB7-NEXT:    b .LBB42_1
8989; CHECK-THUMB7-NEXT:  .LBB42_1: @ %atomicrmw.start
8990; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
8991; CHECK-THUMB7-NEXT:    @ Child Loop BB42_2 Depth 2
8992; CHECK-THUMB7-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
8993; CHECK-THUMB7-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
8994; CHECK-THUMB7-NEXT:    rsbs.w r0, r2, #1
8995; CHECK-THUMB7-NEXT:    mov.w r0, #0
8996; CHECK-THUMB7-NEXT:    sbcs.w r3, r0, r1
8997; CHECK-THUMB7-NEXT:    it lo
8998; CHECK-THUMB7-NEXT:    movlo r0, #1
8999; CHECK-THUMB7-NEXT:    mov r6, r2
9000; CHECK-THUMB7-NEXT:    mov r7, r1
9001; CHECK-THUMB7-NEXT:    mov.w r8, #1
9002; CHECK-THUMB7-NEXT:    cmp r0, #0
9003; CHECK-THUMB7-NEXT:    it ne
9004; CHECK-THUMB7-NEXT:    movne r8, r2
9005; CHECK-THUMB7-NEXT:    cmp r0, #0
9006; CHECK-THUMB7-NEXT:    it ne
9007; CHECK-THUMB7-NEXT:    movne r0, r1
9008; CHECK-THUMB7-NEXT:    @ kill: def $r8 killed $r8 def $r8_r9
9009; CHECK-THUMB7-NEXT:    mov r9, r0
9010; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i64
9011; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i64
9012; CHECK-THUMB7-NEXT:  .LBB42_2: @ %atomicrmw.start
9013; CHECK-THUMB7-NEXT:    @ Parent Loop BB42_1 Depth=1
9014; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
9015; CHECK-THUMB7-NEXT:    ldrexd r4, r5, [r3]
9016; CHECK-THUMB7-NEXT:    cmp r4, r6
9017; CHECK-THUMB7-NEXT:    it eq
9018; CHECK-THUMB7-NEXT:    cmpeq r5, r7
9019; CHECK-THUMB7-NEXT:    bne .LBB42_4
9020; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
9021; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB42_2 Depth=2
9022; CHECK-THUMB7-NEXT:    strexd r0, r8, r9, [r3]
9023; CHECK-THUMB7-NEXT:    cmp r0, #0
9024; CHECK-THUMB7-NEXT:    bne .LBB42_2
9025; CHECK-THUMB7-NEXT:  .LBB42_4: @ %atomicrmw.start
9026; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB42_1 Depth=1
9027; CHECK-THUMB7-NEXT:    mov r0, r5
9028; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
9029; CHECK-THUMB7-NEXT:    eor.w r3, r0, r1
9030; CHECK-THUMB7-NEXT:    mov r1, r4
9031; CHECK-THUMB7-NEXT:    str r1, [sp, #4] @ 4-byte Spill
9032; CHECK-THUMB7-NEXT:    eors r2, r1
9033; CHECK-THUMB7-NEXT:    orrs r2, r3
9034; CHECK-THUMB7-NEXT:    cmp r2, #0
9035; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
9036; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
9037; CHECK-THUMB7-NEXT:    bne .LBB42_1
9038; CHECK-THUMB7-NEXT:    b .LBB42_5
9039; CHECK-THUMB7-NEXT:  .LBB42_5: @ %atomicrmw.end
9040; CHECK-THUMB7-NEXT:    ldr r1, [sp] @ 4-byte Reload
9041; CHECK-THUMB7-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
9042; CHECK-THUMB7-NEXT:    add sp, #16
9043; CHECK-THUMB7-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, pc}
9044;
9045; CHECK-THUMB6-LABEL: test_umax_i64:
9046; CHECK-THUMB6:       @ %bb.0: @ %entry
9047; CHECK-THUMB6-NEXT:    .save {r7, lr}
9048; CHECK-THUMB6-NEXT:    push {r7, lr}
9049; CHECK-THUMB6-NEXT:    ldr r0, .LCPI42_0
9050; CHECK-THUMB6-NEXT:    movs r2, #1
9051; CHECK-THUMB6-NEXT:    movs r3, #0
9052; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_umax_8
9053; CHECK-THUMB6-NEXT:    pop {r7, pc}
9054; CHECK-THUMB6-NEXT:    .p2align 2
9055; CHECK-THUMB6-NEXT:  @ %bb.1:
9056; CHECK-THUMB6-NEXT:  .LCPI42_0:
9057; CHECK-THUMB6-NEXT:    .long atomic_i64
9058;
9059; CHECK-THUMB8BASE-LABEL: test_umax_i64:
9060; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
9061; CHECK-THUMB8BASE-NEXT:    .save {r4, lr}
9062; CHECK-THUMB8BASE-NEXT:    push {r4, lr}
9063; CHECK-THUMB8BASE-NEXT:    .pad #72
9064; CHECK-THUMB8BASE-NEXT:    sub sp, #72
9065; CHECK-THUMB8BASE-NEXT:    movw r1, :lower16:atomic_i64
9066; CHECK-THUMB8BASE-NEXT:    movt r1, :upper16:atomic_i64
9067; CHECK-THUMB8BASE-NEXT:    ldr r0, [r1, #4]
9068; CHECK-THUMB8BASE-NEXT:    ldr r1, [r1]
9069; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #56] @ 4-byte Spill
9070; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #60] @ 4-byte Spill
9071; CHECK-THUMB8BASE-NEXT:    b .LBB42_1
9072; CHECK-THUMB8BASE-NEXT:  .LBB42_1: @ %atomicrmw.start
9073; CHECK-THUMB8BASE-NEXT:    @ =>This Inner Loop Header: Depth=1
9074; CHECK-THUMB8BASE-NEXT:    ldr r3, [sp, #56] @ 4-byte Reload
9075; CHECK-THUMB8BASE-NEXT:    ldr r2, [sp, #60] @ 4-byte Reload
9076; CHECK-THUMB8BASE-NEXT:    str r2, [sp, #36] @ 4-byte Spill
9077; CHECK-THUMB8BASE-NEXT:    str r3, [sp, #40] @ 4-byte Spill
9078; CHECK-THUMB8BASE-NEXT:    movs r1, #0
9079; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #44] @ 4-byte Spill
9080; CHECK-THUMB8BASE-NEXT:    movs r0, #1
9081; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #48] @ 4-byte Spill
9082; CHECK-THUMB8BASE-NEXT:    subs r3, r0, r3
9083; CHECK-THUMB8BASE-NEXT:    sbcs r1, r2
9084; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #52] @ 4-byte Spill
9085; CHECK-THUMB8BASE-NEXT:    blo .LBB42_3
9086; CHECK-THUMB8BASE-NEXT:  @ %bb.2: @ %atomicrmw.start
9087; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB42_1 Depth=1
9088; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #44] @ 4-byte Reload
9089; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #52] @ 4-byte Spill
9090; CHECK-THUMB8BASE-NEXT:  .LBB42_3: @ %atomicrmw.start
9091; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB42_1 Depth=1
9092; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #40] @ 4-byte Reload
9093; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #52] @ 4-byte Reload
9094; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #28] @ 4-byte Spill
9095; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #32] @ 4-byte Spill
9096; CHECK-THUMB8BASE-NEXT:    cbnz r1, .LBB42_5
9097; CHECK-THUMB8BASE-NEXT:  @ %bb.4: @ %atomicrmw.start
9098; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB42_1 Depth=1
9099; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #48] @ 4-byte Reload
9100; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #32] @ 4-byte Spill
9101; CHECK-THUMB8BASE-NEXT:  .LBB42_5: @ %atomicrmw.start
9102; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB42_1 Depth=1
9103; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #36] @ 4-byte Reload
9104; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #28] @ 4-byte Reload
9105; CHECK-THUMB8BASE-NEXT:    ldr r2, [sp, #32] @ 4-byte Reload
9106; CHECK-THUMB8BASE-NEXT:    str r2, [sp, #20] @ 4-byte Spill
9107; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #24] @ 4-byte Spill
9108; CHECK-THUMB8BASE-NEXT:    cbnz r1, .LBB42_7
9109; CHECK-THUMB8BASE-NEXT:  @ %bb.6: @ %atomicrmw.start
9110; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB42_1 Depth=1
9111; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #28] @ 4-byte Reload
9112; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #24] @ 4-byte Spill
9113; CHECK-THUMB8BASE-NEXT:  .LBB42_7: @ %atomicrmw.start
9114; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB42_1 Depth=1
9115; CHECK-THUMB8BASE-NEXT:    ldr r2, [sp, #20] @ 4-byte Reload
9116; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #44] @ 4-byte Reload
9117; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #36] @ 4-byte Reload
9118; CHECK-THUMB8BASE-NEXT:    ldr r4, [sp, #40] @ 4-byte Reload
9119; CHECK-THUMB8BASE-NEXT:    ldr r3, [sp, #24] @ 4-byte Reload
9120; CHECK-THUMB8BASE-NEXT:    str r4, [sp, #64]
9121; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #68]
9122; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4]
9123; CHECK-THUMB8BASE-NEXT:    str r0, [sp]
9124; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i64
9125; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i64
9126; CHECK-THUMB8BASE-NEXT:    add r1, sp, #64
9127; CHECK-THUMB8BASE-NEXT:    bl __atomic_compare_exchange_8
9128; CHECK-THUMB8BASE-NEXT:    mov r2, r0
9129; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #68]
9130; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #12] @ 4-byte Spill
9131; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #64]
9132; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #16] @ 4-byte Spill
9133; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
9134; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #56] @ 4-byte Spill
9135; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #60] @ 4-byte Spill
9136; CHECK-THUMB8BASE-NEXT:    beq .LBB42_1
9137; CHECK-THUMB8BASE-NEXT:    b .LBB42_8
9138; CHECK-THUMB8BASE-NEXT:  .LBB42_8: @ %atomicrmw.end
9139; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
9140; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #16] @ 4-byte Reload
9141; CHECK-THUMB8BASE-NEXT:    add sp, #72
9142; CHECK-THUMB8BASE-NEXT:    pop {r4, pc}
9143entry:
9144  %0 = atomicrmw umax i64* @atomic_i64, i64 1 monotonic
9145  ret i64 %0
9146}
9147define i64 @test_umin_i64() {
9148; CHECK-ARM8-LABEL: test_umin_i64:
9149; CHECK-ARM8:       @ %bb.0: @ %entry
9150; CHECK-ARM8-NEXT:    .save {r4, r5, r6, r7, r8, r9, r11, lr}
9151; CHECK-ARM8-NEXT:    push {r4, r5, r6, r7, r8, r9, r11, lr}
9152; CHECK-ARM8-NEXT:    .pad #16
9153; CHECK-ARM8-NEXT:    sub sp, sp, #16
9154; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i64
9155; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i64
9156; CHECK-ARM8-NEXT:    ldr r1, [r0]
9157; CHECK-ARM8-NEXT:    ldr r0, [r0, #4]
9158; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
9159; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
9160; CHECK-ARM8-NEXT:    b .LBB43_1
9161; CHECK-ARM8-NEXT:  .LBB43_1: @ %atomicrmw.start
9162; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
9163; CHECK-ARM8-NEXT:    @ Child Loop BB43_2 Depth 2
9164; CHECK-ARM8-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
9165; CHECK-ARM8-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
9166; CHECK-ARM8-NEXT:    mov r6, r2
9167; CHECK-ARM8-NEXT:    mov r7, r1
9168; CHECK-ARM8-NEXT:    subs r0, r2, #2
9169; CHECK-ARM8-NEXT:    sbcs r0, r1, #0
9170; CHECK-ARM8-NEXT:    mov r0, #0
9171; CHECK-ARM8-NEXT:    movwlo r0, #1
9172; CHECK-ARM8-NEXT:    mov r8, #1
9173; CHECK-ARM8-NEXT:    cmp r0, #0
9174; CHECK-ARM8-NEXT:    movne r8, r2
9175; CHECK-ARM8-NEXT:    cmp r0, #0
9176; CHECK-ARM8-NEXT:    movne r0, r1
9177; CHECK-ARM8-NEXT:    @ kill: def $r8 killed $r8 def $r8_r9
9178; CHECK-ARM8-NEXT:    mov r9, r0
9179; CHECK-ARM8-NEXT:    movw r3, :lower16:atomic_i64
9180; CHECK-ARM8-NEXT:    movt r3, :upper16:atomic_i64
9181; CHECK-ARM8-NEXT:  .LBB43_2: @ %atomicrmw.start
9182; CHECK-ARM8-NEXT:    @ Parent Loop BB43_1 Depth=1
9183; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
9184; CHECK-ARM8-NEXT:    ldrexd r4, r5, [r3]
9185; CHECK-ARM8-NEXT:    cmp r4, r6
9186; CHECK-ARM8-NEXT:    cmpeq r5, r7
9187; CHECK-ARM8-NEXT:    bne .LBB43_4
9188; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
9189; CHECK-ARM8-NEXT:    @ in Loop: Header=BB43_2 Depth=2
9190; CHECK-ARM8-NEXT:    strexd r0, r8, r9, [r3]
9191; CHECK-ARM8-NEXT:    cmp r0, #0
9192; CHECK-ARM8-NEXT:    bne .LBB43_2
9193; CHECK-ARM8-NEXT:  .LBB43_4: @ %atomicrmw.start
9194; CHECK-ARM8-NEXT:    @ in Loop: Header=BB43_1 Depth=1
9195; CHECK-ARM8-NEXT:    mov r0, r5
9196; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
9197; CHECK-ARM8-NEXT:    eor r3, r0, r1
9198; CHECK-ARM8-NEXT:    mov r1, r4
9199; CHECK-ARM8-NEXT:    str r1, [sp, #4] @ 4-byte Spill
9200; CHECK-ARM8-NEXT:    eor r2, r1, r2
9201; CHECK-ARM8-NEXT:    orr r2, r2, r3
9202; CHECK-ARM8-NEXT:    cmp r2, #0
9203; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
9204; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
9205; CHECK-ARM8-NEXT:    bne .LBB43_1
9206; CHECK-ARM8-NEXT:    b .LBB43_5
9207; CHECK-ARM8-NEXT:  .LBB43_5: @ %atomicrmw.end
9208; CHECK-ARM8-NEXT:    ldr r1, [sp] @ 4-byte Reload
9209; CHECK-ARM8-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
9210; CHECK-ARM8-NEXT:    add sp, sp, #16
9211; CHECK-ARM8-NEXT:    pop {r4, r5, r6, r7, r8, r9, r11, pc}
9212;
9213; CHECK-ARM6-LABEL: test_umin_i64:
9214; CHECK-ARM6:       @ %bb.0: @ %entry
9215; CHECK-ARM6-NEXT:    .save {r4, r5, r6, r7, r8, r9, r11, lr}
9216; CHECK-ARM6-NEXT:    push {r4, r5, r6, r7, r8, r9, r11, lr}
9217; CHECK-ARM6-NEXT:    .pad #16
9218; CHECK-ARM6-NEXT:    sub sp, sp, #16
9219; CHECK-ARM6-NEXT:    ldr r0, .LCPI43_0
9220; CHECK-ARM6-NEXT:    ldr r1, [r0]
9221; CHECK-ARM6-NEXT:    ldr r0, [r0, #4]
9222; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
9223; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
9224; CHECK-ARM6-NEXT:    b .LBB43_1
9225; CHECK-ARM6-NEXT:  .LBB43_1: @ %atomicrmw.start
9226; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
9227; CHECK-ARM6-NEXT:    @ Child Loop BB43_2 Depth 2
9228; CHECK-ARM6-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
9229; CHECK-ARM6-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
9230; CHECK-ARM6-NEXT:    mov r6, r2
9231; CHECK-ARM6-NEXT:    mov r7, r1
9232; CHECK-ARM6-NEXT:    subs r0, r2, #2
9233; CHECK-ARM6-NEXT:    sbcs r0, r1, #0
9234; CHECK-ARM6-NEXT:    mov r0, #0
9235; CHECK-ARM6-NEXT:    movlo r0, #1
9236; CHECK-ARM6-NEXT:    mov r8, #1
9237; CHECK-ARM6-NEXT:    cmp r0, #0
9238; CHECK-ARM6-NEXT:    movne r8, r2
9239; CHECK-ARM6-NEXT:    cmp r0, #0
9240; CHECK-ARM6-NEXT:    movne r0, r1
9241; CHECK-ARM6-NEXT:    @ kill: def $r8 killed $r8 def $r8_r9
9242; CHECK-ARM6-NEXT:    mov r9, r0
9243; CHECK-ARM6-NEXT:    ldr r3, .LCPI43_0
9244; CHECK-ARM6-NEXT:  .LBB43_2: @ %atomicrmw.start
9245; CHECK-ARM6-NEXT:    @ Parent Loop BB43_1 Depth=1
9246; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
9247; CHECK-ARM6-NEXT:    ldrexd r4, r5, [r3]
9248; CHECK-ARM6-NEXT:    cmp r4, r6
9249; CHECK-ARM6-NEXT:    cmpeq r5, r7
9250; CHECK-ARM6-NEXT:    bne .LBB43_4
9251; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
9252; CHECK-ARM6-NEXT:    @ in Loop: Header=BB43_2 Depth=2
9253; CHECK-ARM6-NEXT:    strexd r0, r8, r9, [r3]
9254; CHECK-ARM6-NEXT:    cmp r0, #0
9255; CHECK-ARM6-NEXT:    bne .LBB43_2
9256; CHECK-ARM6-NEXT:  .LBB43_4: @ %atomicrmw.start
9257; CHECK-ARM6-NEXT:    @ in Loop: Header=BB43_1 Depth=1
9258; CHECK-ARM6-NEXT:    mov r0, r5
9259; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
9260; CHECK-ARM6-NEXT:    eor r3, r0, r1
9261; CHECK-ARM6-NEXT:    mov r1, r4
9262; CHECK-ARM6-NEXT:    str r1, [sp, #4] @ 4-byte Spill
9263; CHECK-ARM6-NEXT:    eor r2, r1, r2
9264; CHECK-ARM6-NEXT:    orr r2, r2, r3
9265; CHECK-ARM6-NEXT:    cmp r2, #0
9266; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
9267; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
9268; CHECK-ARM6-NEXT:    bne .LBB43_1
9269; CHECK-ARM6-NEXT:    b .LBB43_5
9270; CHECK-ARM6-NEXT:  .LBB43_5: @ %atomicrmw.end
9271; CHECK-ARM6-NEXT:    ldr r1, [sp] @ 4-byte Reload
9272; CHECK-ARM6-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
9273; CHECK-ARM6-NEXT:    add sp, sp, #16
9274; CHECK-ARM6-NEXT:    pop {r4, r5, r6, r7, r8, r9, r11, pc}
9275; CHECK-ARM6-NEXT:    .p2align 2
9276; CHECK-ARM6-NEXT:  @ %bb.6:
9277; CHECK-ARM6-NEXT:  .LCPI43_0:
9278; CHECK-ARM6-NEXT:    .long atomic_i64
9279;
9280; CHECK-THUMB7-LABEL: test_umin_i64:
9281; CHECK-THUMB7:       @ %bb.0: @ %entry
9282; CHECK-THUMB7-NEXT:    .save {r4, r5, r6, r7, r8, r9, lr}
9283; CHECK-THUMB7-NEXT:    push.w {r4, r5, r6, r7, r8, r9, lr}
9284; CHECK-THUMB7-NEXT:    .pad #16
9285; CHECK-THUMB7-NEXT:    sub sp, #16
9286; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i64
9287; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i64
9288; CHECK-THUMB7-NEXT:    ldr r1, [r0]
9289; CHECK-THUMB7-NEXT:    ldr r0, [r0, #4]
9290; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
9291; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
9292; CHECK-THUMB7-NEXT:    b .LBB43_1
9293; CHECK-THUMB7-NEXT:  .LBB43_1: @ %atomicrmw.start
9294; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
9295; CHECK-THUMB7-NEXT:    @ Child Loop BB43_2 Depth 2
9296; CHECK-THUMB7-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
9297; CHECK-THUMB7-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
9298; CHECK-THUMB7-NEXT:    mov r6, r2
9299; CHECK-THUMB7-NEXT:    mov r7, r1
9300; CHECK-THUMB7-NEXT:    subs r0, r2, #2
9301; CHECK-THUMB7-NEXT:    sbcs r0, r1, #0
9302; CHECK-THUMB7-NEXT:    mov.w r0, #0
9303; CHECK-THUMB7-NEXT:    it lo
9304; CHECK-THUMB7-NEXT:    movlo r0, #1
9305; CHECK-THUMB7-NEXT:    mov.w r8, #1
9306; CHECK-THUMB7-NEXT:    cmp r0, #0
9307; CHECK-THUMB7-NEXT:    it ne
9308; CHECK-THUMB7-NEXT:    movne r8, r2
9309; CHECK-THUMB7-NEXT:    cmp r0, #0
9310; CHECK-THUMB7-NEXT:    it ne
9311; CHECK-THUMB7-NEXT:    movne r0, r1
9312; CHECK-THUMB7-NEXT:    @ kill: def $r8 killed $r8 def $r8_r9
9313; CHECK-THUMB7-NEXT:    mov r9, r0
9314; CHECK-THUMB7-NEXT:    movw r3, :lower16:atomic_i64
9315; CHECK-THUMB7-NEXT:    movt r3, :upper16:atomic_i64
9316; CHECK-THUMB7-NEXT:  .LBB43_2: @ %atomicrmw.start
9317; CHECK-THUMB7-NEXT:    @ Parent Loop BB43_1 Depth=1
9318; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
9319; CHECK-THUMB7-NEXT:    ldrexd r4, r5, [r3]
9320; CHECK-THUMB7-NEXT:    cmp r4, r6
9321; CHECK-THUMB7-NEXT:    it eq
9322; CHECK-THUMB7-NEXT:    cmpeq r5, r7
9323; CHECK-THUMB7-NEXT:    bne .LBB43_4
9324; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
9325; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB43_2 Depth=2
9326; CHECK-THUMB7-NEXT:    strexd r0, r8, r9, [r3]
9327; CHECK-THUMB7-NEXT:    cmp r0, #0
9328; CHECK-THUMB7-NEXT:    bne .LBB43_2
9329; CHECK-THUMB7-NEXT:  .LBB43_4: @ %atomicrmw.start
9330; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB43_1 Depth=1
9331; CHECK-THUMB7-NEXT:    mov r0, r5
9332; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
9333; CHECK-THUMB7-NEXT:    eor.w r3, r0, r1
9334; CHECK-THUMB7-NEXT:    mov r1, r4
9335; CHECK-THUMB7-NEXT:    str r1, [sp, #4] @ 4-byte Spill
9336; CHECK-THUMB7-NEXT:    eors r2, r1
9337; CHECK-THUMB7-NEXT:    orrs r2, r3
9338; CHECK-THUMB7-NEXT:    cmp r2, #0
9339; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
9340; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
9341; CHECK-THUMB7-NEXT:    bne .LBB43_1
9342; CHECK-THUMB7-NEXT:    b .LBB43_5
9343; CHECK-THUMB7-NEXT:  .LBB43_5: @ %atomicrmw.end
9344; CHECK-THUMB7-NEXT:    ldr r1, [sp] @ 4-byte Reload
9345; CHECK-THUMB7-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
9346; CHECK-THUMB7-NEXT:    add sp, #16
9347; CHECK-THUMB7-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, pc}
9348;
9349; CHECK-THUMB6-LABEL: test_umin_i64:
9350; CHECK-THUMB6:       @ %bb.0: @ %entry
9351; CHECK-THUMB6-NEXT:    .save {r7, lr}
9352; CHECK-THUMB6-NEXT:    push {r7, lr}
9353; CHECK-THUMB6-NEXT:    ldr r0, .LCPI43_0
9354; CHECK-THUMB6-NEXT:    movs r2, #1
9355; CHECK-THUMB6-NEXT:    movs r3, #0
9356; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_umin_8
9357; CHECK-THUMB6-NEXT:    pop {r7, pc}
9358; CHECK-THUMB6-NEXT:    .p2align 2
9359; CHECK-THUMB6-NEXT:  @ %bb.1:
9360; CHECK-THUMB6-NEXT:  .LCPI43_0:
9361; CHECK-THUMB6-NEXT:    .long atomic_i64
9362;
9363; CHECK-THUMB8BASE-LABEL: test_umin_i64:
9364; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
9365; CHECK-THUMB8BASE-NEXT:    .save {r4, lr}
9366; CHECK-THUMB8BASE-NEXT:    push {r4, lr}
9367; CHECK-THUMB8BASE-NEXT:    .pad #72
9368; CHECK-THUMB8BASE-NEXT:    sub sp, #72
9369; CHECK-THUMB8BASE-NEXT:    movw r1, :lower16:atomic_i64
9370; CHECK-THUMB8BASE-NEXT:    movt r1, :upper16:atomic_i64
9371; CHECK-THUMB8BASE-NEXT:    ldr r0, [r1, #4]
9372; CHECK-THUMB8BASE-NEXT:    ldr r1, [r1]
9373; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #56] @ 4-byte Spill
9374; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #60] @ 4-byte Spill
9375; CHECK-THUMB8BASE-NEXT:    b .LBB43_1
9376; CHECK-THUMB8BASE-NEXT:  .LBB43_1: @ %atomicrmw.start
9377; CHECK-THUMB8BASE-NEXT:    @ =>This Inner Loop Header: Depth=1
9378; CHECK-THUMB8BASE-NEXT:    ldr r3, [sp, #56] @ 4-byte Reload
9379; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #60] @ 4-byte Reload
9380; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #36] @ 4-byte Spill
9381; CHECK-THUMB8BASE-NEXT:    str r3, [sp, #40] @ 4-byte Spill
9382; CHECK-THUMB8BASE-NEXT:    movs r0, #1
9383; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #44] @ 4-byte Spill
9384; CHECK-THUMB8BASE-NEXT:    movs r2, #0
9385; CHECK-THUMB8BASE-NEXT:    str r2, [sp, #48] @ 4-byte Spill
9386; CHECK-THUMB8BASE-NEXT:    subs r3, r3, #2
9387; CHECK-THUMB8BASE-NEXT:    sbcs r1, r2
9388; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #52] @ 4-byte Spill
9389; CHECK-THUMB8BASE-NEXT:    blo .LBB43_3
9390; CHECK-THUMB8BASE-NEXT:  @ %bb.2: @ %atomicrmw.start
9391; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB43_1 Depth=1
9392; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #48] @ 4-byte Reload
9393; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #52] @ 4-byte Spill
9394; CHECK-THUMB8BASE-NEXT:  .LBB43_3: @ %atomicrmw.start
9395; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB43_1 Depth=1
9396; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #40] @ 4-byte Reload
9397; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #52] @ 4-byte Reload
9398; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #28] @ 4-byte Spill
9399; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #32] @ 4-byte Spill
9400; CHECK-THUMB8BASE-NEXT:    cbnz r1, .LBB43_5
9401; CHECK-THUMB8BASE-NEXT:  @ %bb.4: @ %atomicrmw.start
9402; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB43_1 Depth=1
9403; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #44] @ 4-byte Reload
9404; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #32] @ 4-byte Spill
9405; CHECK-THUMB8BASE-NEXT:  .LBB43_5: @ %atomicrmw.start
9406; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB43_1 Depth=1
9407; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #36] @ 4-byte Reload
9408; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #28] @ 4-byte Reload
9409; CHECK-THUMB8BASE-NEXT:    ldr r2, [sp, #32] @ 4-byte Reload
9410; CHECK-THUMB8BASE-NEXT:    str r2, [sp, #20] @ 4-byte Spill
9411; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #24] @ 4-byte Spill
9412; CHECK-THUMB8BASE-NEXT:    cbnz r1, .LBB43_7
9413; CHECK-THUMB8BASE-NEXT:  @ %bb.6: @ %atomicrmw.start
9414; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB43_1 Depth=1
9415; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #28] @ 4-byte Reload
9416; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #24] @ 4-byte Spill
9417; CHECK-THUMB8BASE-NEXT:  .LBB43_7: @ %atomicrmw.start
9418; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB43_1 Depth=1
9419; CHECK-THUMB8BASE-NEXT:    ldr r2, [sp, #20] @ 4-byte Reload
9420; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #48] @ 4-byte Reload
9421; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #36] @ 4-byte Reload
9422; CHECK-THUMB8BASE-NEXT:    ldr r4, [sp, #40] @ 4-byte Reload
9423; CHECK-THUMB8BASE-NEXT:    ldr r3, [sp, #24] @ 4-byte Reload
9424; CHECK-THUMB8BASE-NEXT:    str r4, [sp, #64]
9425; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #68]
9426; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4]
9427; CHECK-THUMB8BASE-NEXT:    str r0, [sp]
9428; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i64
9429; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i64
9430; CHECK-THUMB8BASE-NEXT:    add r1, sp, #64
9431; CHECK-THUMB8BASE-NEXT:    bl __atomic_compare_exchange_8
9432; CHECK-THUMB8BASE-NEXT:    mov r2, r0
9433; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #68]
9434; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #12] @ 4-byte Spill
9435; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #64]
9436; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #16] @ 4-byte Spill
9437; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
9438; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #56] @ 4-byte Spill
9439; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #60] @ 4-byte Spill
9440; CHECK-THUMB8BASE-NEXT:    beq .LBB43_1
9441; CHECK-THUMB8BASE-NEXT:    b .LBB43_8
9442; CHECK-THUMB8BASE-NEXT:  .LBB43_8: @ %atomicrmw.end
9443; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
9444; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #16] @ 4-byte Reload
9445; CHECK-THUMB8BASE-NEXT:    add sp, #72
9446; CHECK-THUMB8BASE-NEXT:    pop {r4, pc}
9447entry:
9448  %0 = atomicrmw umin i64* @atomic_i64, i64 1 monotonic
9449  ret i64 %0
9450}
9451