xref: /llvm-project/llvm/test/CodeGen/ARM/atomicrmw_exclusive_monitor_ints.ll (revision e0ed0333f0fed2e73f805afd58b61176a87aa3ad)
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 ptr @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 ptr @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 ptr @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 ptr @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 ptr @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 ptr @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 ptr @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:    cmp r0, #1
1426; CHECK-ARM8-NEXT:    mov r12, #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:    cmp r0, #1
1472; CHECK-ARM6-NEXT:    mov r12, #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:    cmp r0, #1
1522; CHECK-THUMB7-NEXT:    mov.w r12, #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 ptr @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:    cmp r0, #2
1647; CHECK-ARM8-NEXT:    mov r12, #1
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:    cmp r0, #2
1693; CHECK-ARM6-NEXT:    mov r12, #1
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:    cmp r0, #2
1743; CHECK-THUMB7-NEXT:    mov.w r12, #1
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 ptr @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:    cmp r1, #1
1870; CHECK-ARM8-NEXT:    mov lr, #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:    cmp r1, #1
1917; CHECK-ARM6-NEXT:    mov lr, #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:    cmp r1, #1
1968; CHECK-THUMB7-NEXT:    mov.w r12, #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 ptr @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:    cmp r1, #2
2095; CHECK-ARM8-NEXT:    mov lr, #1
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:    cmp r1, #2
2142; CHECK-ARM6-NEXT:    mov lr, #1
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:    cmp r1, #2
2193; CHECK-THUMB7-NEXT:    mov.w r12, #1
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 ptr @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 ptr @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 ptr @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 ptr @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 ptr @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 ptr @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 ptr @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 ptr @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:    cmp r0, #1
3713; CHECK-ARM8-NEXT:    mov r12, #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:    cmp r0, #1
3759; CHECK-ARM6-NEXT:    mov r12, #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:    cmp r0, #1
3809; CHECK-THUMB7-NEXT:    mov.w r12, #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 ptr @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:    cmp r0, #2
3934; CHECK-ARM8-NEXT:    mov r12, #1
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:    cmp r0, #2
3980; CHECK-ARM6-NEXT:    mov r12, #1
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:    cmp r0, #2
4030; CHECK-THUMB7-NEXT:    mov.w r12, #1
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 ptr @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:    cmp r1, #1
4157; CHECK-ARM8-NEXT:    mov lr, #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:    cmp r1, #1
4204; CHECK-ARM6-NEXT:    mov lr, #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:    cmp r1, #1
4255; CHECK-THUMB7-NEXT:    mov.w r12, #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 ptr @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:    cmp r1, #2
4382; CHECK-ARM8-NEXT:    mov lr, #1
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:    cmp r1, #2
4429; CHECK-ARM6-NEXT:    mov lr, #1
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:    cmp r1, #2
4480; CHECK-THUMB7-NEXT:    mov.w r12, #1
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 ptr @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 ptr @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 ptr @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 ptr @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 ptr @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 ptr @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 ptr @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 ptr @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:    cmp r1, #1
5943; CHECK-ARM8-NEXT:    mov r12, #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:    cmp r1, #1
5986; CHECK-ARM6-NEXT:    mov r12, #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:    cmp r1, #1
6033; CHECK-THUMB7-NEXT:    mov.w r12, #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 ptr @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:    cmp r1, #2
6152; CHECK-ARM8-NEXT:    mov r12, #1
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:    cmp r1, #2
6195; CHECK-ARM6-NEXT:    mov r12, #1
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:    cmp r1, #2
6242; CHECK-THUMB7-NEXT:    mov.w r12, #1
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 ptr @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:    cmp r1, #1
6361; CHECK-ARM8-NEXT:    mov r12, #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:    cmp r1, #1
6404; CHECK-ARM6-NEXT:    mov r12, #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:    cmp r1, #1
6451; CHECK-THUMB7-NEXT:    mov.w r12, #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 ptr @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:    cmp r1, #2
6570; CHECK-ARM8-NEXT:    mov r12, #1
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:    cmp r1, #2
6613; CHECK-ARM6-NEXT:    mov r12, #1
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:    cmp r1, #2
6660; CHECK-THUMB7-NEXT:    mov.w r12, #1
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 ptr @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, r10, r11, lr}
6769; CHECK-ARM8-NEXT:    push {r4, r5, r6, r7, r8, r9, r10, 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:    movw r6, :lower16:atomic_i64
6785; CHECK-ARM8-NEXT:    movt r6, :upper16:atomic_i64
6786; CHECK-ARM8-NEXT:    @ implicit-def: $r0
6787; CHECK-ARM8-NEXT:    @ implicit-def: $r3
6788; CHECK-ARM8-NEXT:    @ kill: def $r6 killed $r6 def $r6_r7
6789; CHECK-ARM8-NEXT:    mov r7, r0
6790; CHECK-ARM8-NEXT:    mov r8, r2
6791; CHECK-ARM8-NEXT:    mov r9, r1
6792; CHECK-ARM8-NEXT:    mov r0, #0
6793; CHECK-ARM8-NEXT:    mov r10, #1
6794; CHECK-ARM8-NEXT:    @ kill: def $r10 killed $r10 def $r10_r11
6795; CHECK-ARM8-NEXT:    mov r11, r0
6796; CHECK-ARM8-NEXT:  .LBB33_2: @ %atomicrmw.start
6797; CHECK-ARM8-NEXT:    @ Parent Loop BB33_1 Depth=1
6798; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
6799; CHECK-ARM8-NEXT:    ldrexd r4, r5, [r6]
6800; CHECK-ARM8-NEXT:    cmp r4, r8
6801; CHECK-ARM8-NEXT:    cmpeq r5, r9
6802; CHECK-ARM8-NEXT:    bne .LBB33_4
6803; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
6804; CHECK-ARM8-NEXT:    @ in Loop: Header=BB33_2 Depth=2
6805; CHECK-ARM8-NEXT:    strexd r7, r10, r11, [r6]
6806; CHECK-ARM8-NEXT:    cmp r7, #0
6807; CHECK-ARM8-NEXT:    bne .LBB33_2
6808; CHECK-ARM8-NEXT:  .LBB33_4: @ %atomicrmw.start
6809; CHECK-ARM8-NEXT:    @ in Loop: Header=BB33_1 Depth=1
6810; CHECK-ARM8-NEXT:    mov r0, r5
6811; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
6812; CHECK-ARM8-NEXT:    eor r3, r0, r1
6813; CHECK-ARM8-NEXT:    mov r1, r4
6814; CHECK-ARM8-NEXT:    str r1, [sp, #4] @ 4-byte Spill
6815; CHECK-ARM8-NEXT:    eor r2, r1, r2
6816; CHECK-ARM8-NEXT:    orr r2, r2, r3
6817; CHECK-ARM8-NEXT:    cmp r2, #0
6818; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
6819; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
6820; CHECK-ARM8-NEXT:    bne .LBB33_1
6821; CHECK-ARM8-NEXT:    b .LBB33_5
6822; CHECK-ARM8-NEXT:  .LBB33_5: @ %atomicrmw.end
6823; CHECK-ARM8-NEXT:    ldr r1, [sp] @ 4-byte Reload
6824; CHECK-ARM8-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
6825; CHECK-ARM8-NEXT:    add sp, sp, #16
6826; CHECK-ARM8-NEXT:    pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
6827;
6828; CHECK-ARM6-LABEL: test_xchg_i64:
6829; CHECK-ARM6:       @ %bb.0: @ %entry
6830; CHECK-ARM6-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
6831; CHECK-ARM6-NEXT:    push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
6832; CHECK-ARM6-NEXT:    .pad #16
6833; CHECK-ARM6-NEXT:    sub sp, sp, #16
6834; CHECK-ARM6-NEXT:    ldr r0, .LCPI33_0
6835; CHECK-ARM6-NEXT:    ldr r1, [r0]
6836; CHECK-ARM6-NEXT:    ldr r0, [r0, #4]
6837; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
6838; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
6839; CHECK-ARM6-NEXT:    b .LBB33_1
6840; CHECK-ARM6-NEXT:  .LBB33_1: @ %atomicrmw.start
6841; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
6842; CHECK-ARM6-NEXT:    @ Child Loop BB33_2 Depth 2
6843; CHECK-ARM6-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
6844; CHECK-ARM6-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
6845; CHECK-ARM6-NEXT:    ldr r6, .LCPI33_0
6846; CHECK-ARM6-NEXT:    @ implicit-def: $r0
6847; CHECK-ARM6-NEXT:    @ implicit-def: $r3
6848; CHECK-ARM6-NEXT:    @ kill: def $r6 killed $r6 def $r6_r7
6849; CHECK-ARM6-NEXT:    mov r7, r0
6850; CHECK-ARM6-NEXT:    mov r8, r2
6851; CHECK-ARM6-NEXT:    mov r9, r1
6852; CHECK-ARM6-NEXT:    mov r0, #0
6853; CHECK-ARM6-NEXT:    mov r10, #1
6854; CHECK-ARM6-NEXT:    @ kill: def $r10 killed $r10 def $r10_r11
6855; CHECK-ARM6-NEXT:    mov r11, r0
6856; CHECK-ARM6-NEXT:  .LBB33_2: @ %atomicrmw.start
6857; CHECK-ARM6-NEXT:    @ Parent Loop BB33_1 Depth=1
6858; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
6859; CHECK-ARM6-NEXT:    ldrexd r4, r5, [r6]
6860; CHECK-ARM6-NEXT:    cmp r4, r8
6861; CHECK-ARM6-NEXT:    cmpeq r5, r9
6862; CHECK-ARM6-NEXT:    bne .LBB33_4
6863; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
6864; CHECK-ARM6-NEXT:    @ in Loop: Header=BB33_2 Depth=2
6865; CHECK-ARM6-NEXT:    strexd r7, r10, r11, [r6]
6866; CHECK-ARM6-NEXT:    cmp r7, #0
6867; CHECK-ARM6-NEXT:    bne .LBB33_2
6868; CHECK-ARM6-NEXT:  .LBB33_4: @ %atomicrmw.start
6869; CHECK-ARM6-NEXT:    @ in Loop: Header=BB33_1 Depth=1
6870; CHECK-ARM6-NEXT:    mov r0, r5
6871; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
6872; CHECK-ARM6-NEXT:    eor r3, r0, r1
6873; CHECK-ARM6-NEXT:    mov r1, r4
6874; CHECK-ARM6-NEXT:    str r1, [sp, #4] @ 4-byte Spill
6875; CHECK-ARM6-NEXT:    eor r2, r1, r2
6876; CHECK-ARM6-NEXT:    orr r2, r2, r3
6877; CHECK-ARM6-NEXT:    cmp r2, #0
6878; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
6879; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
6880; CHECK-ARM6-NEXT:    bne .LBB33_1
6881; CHECK-ARM6-NEXT:    b .LBB33_5
6882; CHECK-ARM6-NEXT:  .LBB33_5: @ %atomicrmw.end
6883; CHECK-ARM6-NEXT:    ldr r1, [sp] @ 4-byte Reload
6884; CHECK-ARM6-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
6885; CHECK-ARM6-NEXT:    add sp, sp, #16
6886; CHECK-ARM6-NEXT:    pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
6887; CHECK-ARM6-NEXT:    .p2align 2
6888; CHECK-ARM6-NEXT:  @ %bb.6:
6889; CHECK-ARM6-NEXT:  .LCPI33_0:
6890; CHECK-ARM6-NEXT:    .long atomic_i64
6891;
6892; CHECK-THUMB7-LABEL: test_xchg_i64:
6893; CHECK-THUMB7:       @ %bb.0: @ %entry
6894; CHECK-THUMB7-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
6895; CHECK-THUMB7-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11, lr}
6896; CHECK-THUMB7-NEXT:    .pad #16
6897; CHECK-THUMB7-NEXT:    sub sp, #16
6898; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i64
6899; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i64
6900; CHECK-THUMB7-NEXT:    ldr r1, [r0]
6901; CHECK-THUMB7-NEXT:    ldr r0, [r0, #4]
6902; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
6903; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
6904; CHECK-THUMB7-NEXT:    b .LBB33_1
6905; CHECK-THUMB7-NEXT:  .LBB33_1: @ %atomicrmw.start
6906; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
6907; CHECK-THUMB7-NEXT:    @ Child Loop BB33_2 Depth 2
6908; CHECK-THUMB7-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
6909; CHECK-THUMB7-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
6910; CHECK-THUMB7-NEXT:    movw r6, :lower16:atomic_i64
6911; CHECK-THUMB7-NEXT:    movt r6, :upper16:atomic_i64
6912; CHECK-THUMB7-NEXT:    @ implicit-def: $r0
6913; CHECK-THUMB7-NEXT:    @ implicit-def: $r3
6914; CHECK-THUMB7-NEXT:    @ kill: def $r6 killed $r6 def $r6_r7
6915; CHECK-THUMB7-NEXT:    mov r7, r0
6916; CHECK-THUMB7-NEXT:    mov r8, r2
6917; CHECK-THUMB7-NEXT:    mov r9, r1
6918; CHECK-THUMB7-NEXT:    movs r0, #0
6919; CHECK-THUMB7-NEXT:    mov.w r10, #1
6920; CHECK-THUMB7-NEXT:    @ kill: def $r10 killed $r10 def $r10_r11
6921; CHECK-THUMB7-NEXT:    mov r11, r0
6922; CHECK-THUMB7-NEXT:  .LBB33_2: @ %atomicrmw.start
6923; CHECK-THUMB7-NEXT:    @ Parent Loop BB33_1 Depth=1
6924; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
6925; CHECK-THUMB7-NEXT:    ldrexd r4, r5, [r6]
6926; CHECK-THUMB7-NEXT:    cmp r4, r8
6927; CHECK-THUMB7-NEXT:    it eq
6928; CHECK-THUMB7-NEXT:    cmpeq r5, r9
6929; CHECK-THUMB7-NEXT:    bne .LBB33_4
6930; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
6931; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB33_2 Depth=2
6932; CHECK-THUMB7-NEXT:    strexd r7, r10, r11, [r6]
6933; CHECK-THUMB7-NEXT:    cmp r7, #0
6934; CHECK-THUMB7-NEXT:    bne .LBB33_2
6935; CHECK-THUMB7-NEXT:  .LBB33_4: @ %atomicrmw.start
6936; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB33_1 Depth=1
6937; CHECK-THUMB7-NEXT:    mov r0, r5
6938; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
6939; CHECK-THUMB7-NEXT:    eor.w r3, r0, r1
6940; CHECK-THUMB7-NEXT:    mov r1, r4
6941; CHECK-THUMB7-NEXT:    str r1, [sp, #4] @ 4-byte Spill
6942; CHECK-THUMB7-NEXT:    eors r2, r1
6943; CHECK-THUMB7-NEXT:    orrs r2, r3
6944; CHECK-THUMB7-NEXT:    cmp r2, #0
6945; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
6946; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
6947; CHECK-THUMB7-NEXT:    bne .LBB33_1
6948; CHECK-THUMB7-NEXT:    b .LBB33_5
6949; CHECK-THUMB7-NEXT:  .LBB33_5: @ %atomicrmw.end
6950; CHECK-THUMB7-NEXT:    ldr r1, [sp] @ 4-byte Reload
6951; CHECK-THUMB7-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
6952; CHECK-THUMB7-NEXT:    add sp, #16
6953; CHECK-THUMB7-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11, pc}
6954;
6955; CHECK-THUMB6-LABEL: test_xchg_i64:
6956; CHECK-THUMB6:       @ %bb.0: @ %entry
6957; CHECK-THUMB6-NEXT:    .save {r7, lr}
6958; CHECK-THUMB6-NEXT:    push {r7, lr}
6959; CHECK-THUMB6-NEXT:    ldr r0, .LCPI33_0
6960; CHECK-THUMB6-NEXT:    movs r2, #1
6961; CHECK-THUMB6-NEXT:    movs r3, #0
6962; CHECK-THUMB6-NEXT:    bl __sync_lock_test_and_set_8
6963; CHECK-THUMB6-NEXT:    pop {r7, pc}
6964; CHECK-THUMB6-NEXT:    .p2align 2
6965; CHECK-THUMB6-NEXT:  @ %bb.1:
6966; CHECK-THUMB6-NEXT:  .LCPI33_0:
6967; CHECK-THUMB6-NEXT:    .long atomic_i64
6968;
6969; CHECK-THUMB8BASE-LABEL: test_xchg_i64:
6970; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
6971; CHECK-THUMB8BASE-NEXT:    .save {r7, lr}
6972; CHECK-THUMB8BASE-NEXT:    push {r7, lr}
6973; CHECK-THUMB8BASE-NEXT:    .pad #8
6974; CHECK-THUMB8BASE-NEXT:    sub sp, #8
6975; CHECK-THUMB8BASE-NEXT:    movs r3, #0
6976; CHECK-THUMB8BASE-NEXT:    str r3, [sp]
6977; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i64
6978; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i64
6979; CHECK-THUMB8BASE-NEXT:    movs r2, #1
6980; CHECK-THUMB8BASE-NEXT:    bl __atomic_exchange_8
6981; CHECK-THUMB8BASE-NEXT:    add sp, #8
6982; CHECK-THUMB8BASE-NEXT:    pop {r7, pc}
6983entry:
6984  %0 = atomicrmw xchg ptr @atomic_i64, i64 1 monotonic
6985  ret i64 %0
6986}
6987define i64 @test_add_i64() {
6988; CHECK-ARM8-LABEL: test_add_i64:
6989; CHECK-ARM8:       @ %bb.0: @ %entry
6990; CHECK-ARM8-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
6991; CHECK-ARM8-NEXT:    push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
6992; CHECK-ARM8-NEXT:    .pad #16
6993; CHECK-ARM8-NEXT:    sub sp, sp, #16
6994; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i64
6995; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i64
6996; CHECK-ARM8-NEXT:    ldr r1, [r0]
6997; CHECK-ARM8-NEXT:    ldr r0, [r0, #4]
6998; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
6999; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7000; CHECK-ARM8-NEXT:    b .LBB34_1
7001; CHECK-ARM8-NEXT:  .LBB34_1: @ %atomicrmw.start
7002; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
7003; CHECK-ARM8-NEXT:    @ Child Loop BB34_2 Depth 2
7004; CHECK-ARM8-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
7005; CHECK-ARM8-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
7006; CHECK-ARM8-NEXT:    mov r8, r2
7007; CHECK-ARM8-NEXT:    mov r9, r1
7008; CHECK-ARM8-NEXT:    adds r10, r2, #1
7009; CHECK-ARM8-NEXT:    adc r0, r1, #0
7010; CHECK-ARM8-NEXT:    @ kill: def $r10 killed $r10 def $r10_r11
7011; CHECK-ARM8-NEXT:    mov r11, r0
7012; CHECK-ARM8-NEXT:    movw r6, :lower16:atomic_i64
7013; CHECK-ARM8-NEXT:    movt r6, :upper16:atomic_i64
7014; CHECK-ARM8-NEXT:    @ implicit-def: $r0
7015; CHECK-ARM8-NEXT:    @ implicit-def: $r3
7016; CHECK-ARM8-NEXT:    @ kill: def $r6 killed $r6 def $r6_r7
7017; CHECK-ARM8-NEXT:    mov r7, r0
7018; CHECK-ARM8-NEXT:  .LBB34_2: @ %atomicrmw.start
7019; CHECK-ARM8-NEXT:    @ Parent Loop BB34_1 Depth=1
7020; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
7021; CHECK-ARM8-NEXT:    ldrexd r4, r5, [r6]
7022; CHECK-ARM8-NEXT:    cmp r4, r8
7023; CHECK-ARM8-NEXT:    cmpeq r5, r9
7024; CHECK-ARM8-NEXT:    bne .LBB34_4
7025; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
7026; CHECK-ARM8-NEXT:    @ in Loop: Header=BB34_2 Depth=2
7027; CHECK-ARM8-NEXT:    strexd r7, r10, r11, [r6]
7028; CHECK-ARM8-NEXT:    cmp r7, #0
7029; CHECK-ARM8-NEXT:    bne .LBB34_2
7030; CHECK-ARM8-NEXT:  .LBB34_4: @ %atomicrmw.start
7031; CHECK-ARM8-NEXT:    @ in Loop: Header=BB34_1 Depth=1
7032; CHECK-ARM8-NEXT:    mov r0, r5
7033; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
7034; CHECK-ARM8-NEXT:    eor r3, r0, r1
7035; CHECK-ARM8-NEXT:    mov r1, r4
7036; CHECK-ARM8-NEXT:    str r1, [sp, #4] @ 4-byte Spill
7037; CHECK-ARM8-NEXT:    eor r2, r1, r2
7038; CHECK-ARM8-NEXT:    orr r2, r2, r3
7039; CHECK-ARM8-NEXT:    cmp r2, #0
7040; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7041; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7042; CHECK-ARM8-NEXT:    bne .LBB34_1
7043; CHECK-ARM8-NEXT:    b .LBB34_5
7044; CHECK-ARM8-NEXT:  .LBB34_5: @ %atomicrmw.end
7045; CHECK-ARM8-NEXT:    ldr r1, [sp] @ 4-byte Reload
7046; CHECK-ARM8-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
7047; CHECK-ARM8-NEXT:    add sp, sp, #16
7048; CHECK-ARM8-NEXT:    pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
7049;
7050; CHECK-ARM6-LABEL: test_add_i64:
7051; CHECK-ARM6:       @ %bb.0: @ %entry
7052; CHECK-ARM6-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
7053; CHECK-ARM6-NEXT:    push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
7054; CHECK-ARM6-NEXT:    .pad #16
7055; CHECK-ARM6-NEXT:    sub sp, sp, #16
7056; CHECK-ARM6-NEXT:    ldr r0, .LCPI34_0
7057; CHECK-ARM6-NEXT:    ldr r1, [r0]
7058; CHECK-ARM6-NEXT:    ldr r0, [r0, #4]
7059; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7060; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7061; CHECK-ARM6-NEXT:    b .LBB34_1
7062; CHECK-ARM6-NEXT:  .LBB34_1: @ %atomicrmw.start
7063; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
7064; CHECK-ARM6-NEXT:    @ Child Loop BB34_2 Depth 2
7065; CHECK-ARM6-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
7066; CHECK-ARM6-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
7067; CHECK-ARM6-NEXT:    mov r8, r2
7068; CHECK-ARM6-NEXT:    mov r9, r1
7069; CHECK-ARM6-NEXT:    adds r10, r2, #1
7070; CHECK-ARM6-NEXT:    adc r0, r1, #0
7071; CHECK-ARM6-NEXT:    @ kill: def $r10 killed $r10 def $r10_r11
7072; CHECK-ARM6-NEXT:    mov r11, r0
7073; CHECK-ARM6-NEXT:    ldr r6, .LCPI34_0
7074; CHECK-ARM6-NEXT:    @ implicit-def: $r0
7075; CHECK-ARM6-NEXT:    @ implicit-def: $r3
7076; CHECK-ARM6-NEXT:    @ kill: def $r6 killed $r6 def $r6_r7
7077; CHECK-ARM6-NEXT:    mov r7, r0
7078; CHECK-ARM6-NEXT:  .LBB34_2: @ %atomicrmw.start
7079; CHECK-ARM6-NEXT:    @ Parent Loop BB34_1 Depth=1
7080; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
7081; CHECK-ARM6-NEXT:    ldrexd r4, r5, [r6]
7082; CHECK-ARM6-NEXT:    cmp r4, r8
7083; CHECK-ARM6-NEXT:    cmpeq r5, r9
7084; CHECK-ARM6-NEXT:    bne .LBB34_4
7085; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
7086; CHECK-ARM6-NEXT:    @ in Loop: Header=BB34_2 Depth=2
7087; CHECK-ARM6-NEXT:    strexd r7, r10, r11, [r6]
7088; CHECK-ARM6-NEXT:    cmp r7, #0
7089; CHECK-ARM6-NEXT:    bne .LBB34_2
7090; CHECK-ARM6-NEXT:  .LBB34_4: @ %atomicrmw.start
7091; CHECK-ARM6-NEXT:    @ in Loop: Header=BB34_1 Depth=1
7092; CHECK-ARM6-NEXT:    mov r0, r5
7093; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
7094; CHECK-ARM6-NEXT:    eor r3, r0, r1
7095; CHECK-ARM6-NEXT:    mov r1, r4
7096; CHECK-ARM6-NEXT:    str r1, [sp, #4] @ 4-byte Spill
7097; CHECK-ARM6-NEXT:    eor r2, r1, r2
7098; CHECK-ARM6-NEXT:    orr r2, r2, r3
7099; CHECK-ARM6-NEXT:    cmp r2, #0
7100; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7101; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7102; CHECK-ARM6-NEXT:    bne .LBB34_1
7103; CHECK-ARM6-NEXT:    b .LBB34_5
7104; CHECK-ARM6-NEXT:  .LBB34_5: @ %atomicrmw.end
7105; CHECK-ARM6-NEXT:    ldr r1, [sp] @ 4-byte Reload
7106; CHECK-ARM6-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
7107; CHECK-ARM6-NEXT:    add sp, sp, #16
7108; CHECK-ARM6-NEXT:    pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
7109; CHECK-ARM6-NEXT:    .p2align 2
7110; CHECK-ARM6-NEXT:  @ %bb.6:
7111; CHECK-ARM6-NEXT:  .LCPI34_0:
7112; CHECK-ARM6-NEXT:    .long atomic_i64
7113;
7114; CHECK-THUMB7-LABEL: test_add_i64:
7115; CHECK-THUMB7:       @ %bb.0: @ %entry
7116; CHECK-THUMB7-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
7117; CHECK-THUMB7-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11, lr}
7118; CHECK-THUMB7-NEXT:    .pad #16
7119; CHECK-THUMB7-NEXT:    sub sp, #16
7120; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i64
7121; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i64
7122; CHECK-THUMB7-NEXT:    ldr r1, [r0]
7123; CHECK-THUMB7-NEXT:    ldr r0, [r0, #4]
7124; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7125; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7126; CHECK-THUMB7-NEXT:    b .LBB34_1
7127; CHECK-THUMB7-NEXT:  .LBB34_1: @ %atomicrmw.start
7128; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
7129; CHECK-THUMB7-NEXT:    @ Child Loop BB34_2 Depth 2
7130; CHECK-THUMB7-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
7131; CHECK-THUMB7-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
7132; CHECK-THUMB7-NEXT:    mov r8, r2
7133; CHECK-THUMB7-NEXT:    mov r9, r1
7134; CHECK-THUMB7-NEXT:    adds.w r10, r2, #1
7135; CHECK-THUMB7-NEXT:    adc r0, r1, #0
7136; CHECK-THUMB7-NEXT:    @ kill: def $r10 killed $r10 def $r10_r11
7137; CHECK-THUMB7-NEXT:    mov r11, r0
7138; CHECK-THUMB7-NEXT:    movw r6, :lower16:atomic_i64
7139; CHECK-THUMB7-NEXT:    movt r6, :upper16:atomic_i64
7140; CHECK-THUMB7-NEXT:    @ implicit-def: $r0
7141; CHECK-THUMB7-NEXT:    @ implicit-def: $r3
7142; CHECK-THUMB7-NEXT:    @ kill: def $r6 killed $r6 def $r6_r7
7143; CHECK-THUMB7-NEXT:    mov r7, r0
7144; CHECK-THUMB7-NEXT:  .LBB34_2: @ %atomicrmw.start
7145; CHECK-THUMB7-NEXT:    @ Parent Loop BB34_1 Depth=1
7146; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
7147; CHECK-THUMB7-NEXT:    ldrexd r4, r5, [r6]
7148; CHECK-THUMB7-NEXT:    cmp r4, r8
7149; CHECK-THUMB7-NEXT:    it eq
7150; CHECK-THUMB7-NEXT:    cmpeq r5, r9
7151; CHECK-THUMB7-NEXT:    bne .LBB34_4
7152; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
7153; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB34_2 Depth=2
7154; CHECK-THUMB7-NEXT:    strexd r7, r10, r11, [r6]
7155; CHECK-THUMB7-NEXT:    cmp r7, #0
7156; CHECK-THUMB7-NEXT:    bne .LBB34_2
7157; CHECK-THUMB7-NEXT:  .LBB34_4: @ %atomicrmw.start
7158; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB34_1 Depth=1
7159; CHECK-THUMB7-NEXT:    mov r0, r5
7160; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
7161; CHECK-THUMB7-NEXT:    eor.w r3, r0, r1
7162; CHECK-THUMB7-NEXT:    mov r1, r4
7163; CHECK-THUMB7-NEXT:    str r1, [sp, #4] @ 4-byte Spill
7164; CHECK-THUMB7-NEXT:    eors r2, r1
7165; CHECK-THUMB7-NEXT:    orrs r2, r3
7166; CHECK-THUMB7-NEXT:    cmp r2, #0
7167; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7168; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7169; CHECK-THUMB7-NEXT:    bne .LBB34_1
7170; CHECK-THUMB7-NEXT:    b .LBB34_5
7171; CHECK-THUMB7-NEXT:  .LBB34_5: @ %atomicrmw.end
7172; CHECK-THUMB7-NEXT:    ldr r1, [sp] @ 4-byte Reload
7173; CHECK-THUMB7-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
7174; CHECK-THUMB7-NEXT:    add sp, #16
7175; CHECK-THUMB7-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11, pc}
7176;
7177; CHECK-THUMB6-LABEL: test_add_i64:
7178; CHECK-THUMB6:       @ %bb.0: @ %entry
7179; CHECK-THUMB6-NEXT:    .save {r7, lr}
7180; CHECK-THUMB6-NEXT:    push {r7, lr}
7181; CHECK-THUMB6-NEXT:    ldr r0, .LCPI34_0
7182; CHECK-THUMB6-NEXT:    movs r2, #1
7183; CHECK-THUMB6-NEXT:    movs r3, #0
7184; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_add_8
7185; CHECK-THUMB6-NEXT:    pop {r7, pc}
7186; CHECK-THUMB6-NEXT:    .p2align 2
7187; CHECK-THUMB6-NEXT:  @ %bb.1:
7188; CHECK-THUMB6-NEXT:  .LCPI34_0:
7189; CHECK-THUMB6-NEXT:    .long atomic_i64
7190;
7191; CHECK-THUMB8BASE-LABEL: test_add_i64:
7192; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
7193; CHECK-THUMB8BASE-NEXT:    .save {r7, lr}
7194; CHECK-THUMB8BASE-NEXT:    push {r7, lr}
7195; CHECK-THUMB8BASE-NEXT:    .pad #8
7196; CHECK-THUMB8BASE-NEXT:    sub sp, #8
7197; CHECK-THUMB8BASE-NEXT:    movs r3, #0
7198; CHECK-THUMB8BASE-NEXT:    str r3, [sp]
7199; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i64
7200; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i64
7201; CHECK-THUMB8BASE-NEXT:    movs r2, #1
7202; CHECK-THUMB8BASE-NEXT:    bl __atomic_fetch_add_8
7203; CHECK-THUMB8BASE-NEXT:    add sp, #8
7204; CHECK-THUMB8BASE-NEXT:    pop {r7, pc}
7205entry:
7206  %0 = atomicrmw add ptr @atomic_i64, i64 1 monotonic
7207  ret i64 %0
7208}
7209define i64 @test_sub_i64() {
7210; CHECK-ARM8-LABEL: test_sub_i64:
7211; CHECK-ARM8:       @ %bb.0: @ %entry
7212; CHECK-ARM8-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
7213; CHECK-ARM8-NEXT:    push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
7214; CHECK-ARM8-NEXT:    .pad #16
7215; CHECK-ARM8-NEXT:    sub sp, sp, #16
7216; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i64
7217; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i64
7218; CHECK-ARM8-NEXT:    ldr r1, [r0]
7219; CHECK-ARM8-NEXT:    ldr r0, [r0, #4]
7220; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7221; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7222; CHECK-ARM8-NEXT:    b .LBB35_1
7223; CHECK-ARM8-NEXT:  .LBB35_1: @ %atomicrmw.start
7224; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
7225; CHECK-ARM8-NEXT:    @ Child Loop BB35_2 Depth 2
7226; CHECK-ARM8-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
7227; CHECK-ARM8-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
7228; CHECK-ARM8-NEXT:    mov r8, r2
7229; CHECK-ARM8-NEXT:    mov r9, r1
7230; CHECK-ARM8-NEXT:    subs r10, r2, #1
7231; CHECK-ARM8-NEXT:    sbc r0, r1, #0
7232; CHECK-ARM8-NEXT:    @ kill: def $r10 killed $r10 def $r10_r11
7233; CHECK-ARM8-NEXT:    mov r11, r0
7234; CHECK-ARM8-NEXT:    movw r6, :lower16:atomic_i64
7235; CHECK-ARM8-NEXT:    movt r6, :upper16:atomic_i64
7236; CHECK-ARM8-NEXT:    @ implicit-def: $r0
7237; CHECK-ARM8-NEXT:    @ implicit-def: $r3
7238; CHECK-ARM8-NEXT:    @ kill: def $r6 killed $r6 def $r6_r7
7239; CHECK-ARM8-NEXT:    mov r7, r0
7240; CHECK-ARM8-NEXT:  .LBB35_2: @ %atomicrmw.start
7241; CHECK-ARM8-NEXT:    @ Parent Loop BB35_1 Depth=1
7242; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
7243; CHECK-ARM8-NEXT:    ldrexd r4, r5, [r6]
7244; CHECK-ARM8-NEXT:    cmp r4, r8
7245; CHECK-ARM8-NEXT:    cmpeq r5, r9
7246; CHECK-ARM8-NEXT:    bne .LBB35_4
7247; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
7248; CHECK-ARM8-NEXT:    @ in Loop: Header=BB35_2 Depth=2
7249; CHECK-ARM8-NEXT:    strexd r7, r10, r11, [r6]
7250; CHECK-ARM8-NEXT:    cmp r7, #0
7251; CHECK-ARM8-NEXT:    bne .LBB35_2
7252; CHECK-ARM8-NEXT:  .LBB35_4: @ %atomicrmw.start
7253; CHECK-ARM8-NEXT:    @ in Loop: Header=BB35_1 Depth=1
7254; CHECK-ARM8-NEXT:    mov r0, r5
7255; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
7256; CHECK-ARM8-NEXT:    eor r3, r0, r1
7257; CHECK-ARM8-NEXT:    mov r1, r4
7258; CHECK-ARM8-NEXT:    str r1, [sp, #4] @ 4-byte Spill
7259; CHECK-ARM8-NEXT:    eor r2, r1, r2
7260; CHECK-ARM8-NEXT:    orr r2, r2, r3
7261; CHECK-ARM8-NEXT:    cmp r2, #0
7262; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7263; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7264; CHECK-ARM8-NEXT:    bne .LBB35_1
7265; CHECK-ARM8-NEXT:    b .LBB35_5
7266; CHECK-ARM8-NEXT:  .LBB35_5: @ %atomicrmw.end
7267; CHECK-ARM8-NEXT:    ldr r1, [sp] @ 4-byte Reload
7268; CHECK-ARM8-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
7269; CHECK-ARM8-NEXT:    add sp, sp, #16
7270; CHECK-ARM8-NEXT:    pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
7271;
7272; CHECK-ARM6-LABEL: test_sub_i64:
7273; CHECK-ARM6:       @ %bb.0: @ %entry
7274; CHECK-ARM6-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
7275; CHECK-ARM6-NEXT:    push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
7276; CHECK-ARM6-NEXT:    .pad #16
7277; CHECK-ARM6-NEXT:    sub sp, sp, #16
7278; CHECK-ARM6-NEXT:    ldr r0, .LCPI35_0
7279; CHECK-ARM6-NEXT:    ldr r1, [r0]
7280; CHECK-ARM6-NEXT:    ldr r0, [r0, #4]
7281; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7282; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7283; CHECK-ARM6-NEXT:    b .LBB35_1
7284; CHECK-ARM6-NEXT:  .LBB35_1: @ %atomicrmw.start
7285; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
7286; CHECK-ARM6-NEXT:    @ Child Loop BB35_2 Depth 2
7287; CHECK-ARM6-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
7288; CHECK-ARM6-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
7289; CHECK-ARM6-NEXT:    mov r8, r2
7290; CHECK-ARM6-NEXT:    mov r9, r1
7291; CHECK-ARM6-NEXT:    subs r10, r2, #1
7292; CHECK-ARM6-NEXT:    sbc r0, r1, #0
7293; CHECK-ARM6-NEXT:    @ kill: def $r10 killed $r10 def $r10_r11
7294; CHECK-ARM6-NEXT:    mov r11, r0
7295; CHECK-ARM6-NEXT:    ldr r6, .LCPI35_0
7296; CHECK-ARM6-NEXT:    @ implicit-def: $r0
7297; CHECK-ARM6-NEXT:    @ implicit-def: $r3
7298; CHECK-ARM6-NEXT:    @ kill: def $r6 killed $r6 def $r6_r7
7299; CHECK-ARM6-NEXT:    mov r7, r0
7300; CHECK-ARM6-NEXT:  .LBB35_2: @ %atomicrmw.start
7301; CHECK-ARM6-NEXT:    @ Parent Loop BB35_1 Depth=1
7302; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
7303; CHECK-ARM6-NEXT:    ldrexd r4, r5, [r6]
7304; CHECK-ARM6-NEXT:    cmp r4, r8
7305; CHECK-ARM6-NEXT:    cmpeq r5, r9
7306; CHECK-ARM6-NEXT:    bne .LBB35_4
7307; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
7308; CHECK-ARM6-NEXT:    @ in Loop: Header=BB35_2 Depth=2
7309; CHECK-ARM6-NEXT:    strexd r7, r10, r11, [r6]
7310; CHECK-ARM6-NEXT:    cmp r7, #0
7311; CHECK-ARM6-NEXT:    bne .LBB35_2
7312; CHECK-ARM6-NEXT:  .LBB35_4: @ %atomicrmw.start
7313; CHECK-ARM6-NEXT:    @ in Loop: Header=BB35_1 Depth=1
7314; CHECK-ARM6-NEXT:    mov r0, r5
7315; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
7316; CHECK-ARM6-NEXT:    eor r3, r0, r1
7317; CHECK-ARM6-NEXT:    mov r1, r4
7318; CHECK-ARM6-NEXT:    str r1, [sp, #4] @ 4-byte Spill
7319; CHECK-ARM6-NEXT:    eor r2, r1, r2
7320; CHECK-ARM6-NEXT:    orr r2, r2, r3
7321; CHECK-ARM6-NEXT:    cmp r2, #0
7322; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7323; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7324; CHECK-ARM6-NEXT:    bne .LBB35_1
7325; CHECK-ARM6-NEXT:    b .LBB35_5
7326; CHECK-ARM6-NEXT:  .LBB35_5: @ %atomicrmw.end
7327; CHECK-ARM6-NEXT:    ldr r1, [sp] @ 4-byte Reload
7328; CHECK-ARM6-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
7329; CHECK-ARM6-NEXT:    add sp, sp, #16
7330; CHECK-ARM6-NEXT:    pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
7331; CHECK-ARM6-NEXT:    .p2align 2
7332; CHECK-ARM6-NEXT:  @ %bb.6:
7333; CHECK-ARM6-NEXT:  .LCPI35_0:
7334; CHECK-ARM6-NEXT:    .long atomic_i64
7335;
7336; CHECK-THUMB7-LABEL: test_sub_i64:
7337; CHECK-THUMB7:       @ %bb.0: @ %entry
7338; CHECK-THUMB7-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
7339; CHECK-THUMB7-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11, lr}
7340; CHECK-THUMB7-NEXT:    .pad #16
7341; CHECK-THUMB7-NEXT:    sub sp, #16
7342; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i64
7343; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i64
7344; CHECK-THUMB7-NEXT:    ldr r1, [r0]
7345; CHECK-THUMB7-NEXT:    ldr r0, [r0, #4]
7346; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7347; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7348; CHECK-THUMB7-NEXT:    b .LBB35_1
7349; CHECK-THUMB7-NEXT:  .LBB35_1: @ %atomicrmw.start
7350; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
7351; CHECK-THUMB7-NEXT:    @ Child Loop BB35_2 Depth 2
7352; CHECK-THUMB7-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
7353; CHECK-THUMB7-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
7354; CHECK-THUMB7-NEXT:    mov r8, r2
7355; CHECK-THUMB7-NEXT:    mov r9, r1
7356; CHECK-THUMB7-NEXT:    subs.w r10, r2, #1
7357; CHECK-THUMB7-NEXT:    sbc r0, r1, #0
7358; CHECK-THUMB7-NEXT:    @ kill: def $r10 killed $r10 def $r10_r11
7359; CHECK-THUMB7-NEXT:    mov r11, r0
7360; CHECK-THUMB7-NEXT:    movw r6, :lower16:atomic_i64
7361; CHECK-THUMB7-NEXT:    movt r6, :upper16:atomic_i64
7362; CHECK-THUMB7-NEXT:    @ implicit-def: $r0
7363; CHECK-THUMB7-NEXT:    @ implicit-def: $r3
7364; CHECK-THUMB7-NEXT:    @ kill: def $r6 killed $r6 def $r6_r7
7365; CHECK-THUMB7-NEXT:    mov r7, r0
7366; CHECK-THUMB7-NEXT:  .LBB35_2: @ %atomicrmw.start
7367; CHECK-THUMB7-NEXT:    @ Parent Loop BB35_1 Depth=1
7368; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
7369; CHECK-THUMB7-NEXT:    ldrexd r4, r5, [r6]
7370; CHECK-THUMB7-NEXT:    cmp r4, r8
7371; CHECK-THUMB7-NEXT:    it eq
7372; CHECK-THUMB7-NEXT:    cmpeq r5, r9
7373; CHECK-THUMB7-NEXT:    bne .LBB35_4
7374; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
7375; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB35_2 Depth=2
7376; CHECK-THUMB7-NEXT:    strexd r7, r10, r11, [r6]
7377; CHECK-THUMB7-NEXT:    cmp r7, #0
7378; CHECK-THUMB7-NEXT:    bne .LBB35_2
7379; CHECK-THUMB7-NEXT:  .LBB35_4: @ %atomicrmw.start
7380; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB35_1 Depth=1
7381; CHECK-THUMB7-NEXT:    mov r0, r5
7382; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
7383; CHECK-THUMB7-NEXT:    eor.w r3, r0, r1
7384; CHECK-THUMB7-NEXT:    mov r1, r4
7385; CHECK-THUMB7-NEXT:    str r1, [sp, #4] @ 4-byte Spill
7386; CHECK-THUMB7-NEXT:    eors r2, r1
7387; CHECK-THUMB7-NEXT:    orrs r2, r3
7388; CHECK-THUMB7-NEXT:    cmp r2, #0
7389; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7390; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7391; CHECK-THUMB7-NEXT:    bne .LBB35_1
7392; CHECK-THUMB7-NEXT:    b .LBB35_5
7393; CHECK-THUMB7-NEXT:  .LBB35_5: @ %atomicrmw.end
7394; CHECK-THUMB7-NEXT:    ldr r1, [sp] @ 4-byte Reload
7395; CHECK-THUMB7-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
7396; CHECK-THUMB7-NEXT:    add sp, #16
7397; CHECK-THUMB7-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11, pc}
7398;
7399; CHECK-THUMB6-LABEL: test_sub_i64:
7400; CHECK-THUMB6:       @ %bb.0: @ %entry
7401; CHECK-THUMB6-NEXT:    .save {r7, lr}
7402; CHECK-THUMB6-NEXT:    push {r7, lr}
7403; CHECK-THUMB6-NEXT:    ldr r0, .LCPI35_0
7404; CHECK-THUMB6-NEXT:    movs r2, #1
7405; CHECK-THUMB6-NEXT:    movs r3, #0
7406; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_sub_8
7407; CHECK-THUMB6-NEXT:    pop {r7, pc}
7408; CHECK-THUMB6-NEXT:    .p2align 2
7409; CHECK-THUMB6-NEXT:  @ %bb.1:
7410; CHECK-THUMB6-NEXT:  .LCPI35_0:
7411; CHECK-THUMB6-NEXT:    .long atomic_i64
7412;
7413; CHECK-THUMB8BASE-LABEL: test_sub_i64:
7414; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
7415; CHECK-THUMB8BASE-NEXT:    .save {r7, lr}
7416; CHECK-THUMB8BASE-NEXT:    push {r7, lr}
7417; CHECK-THUMB8BASE-NEXT:    .pad #8
7418; CHECK-THUMB8BASE-NEXT:    sub sp, #8
7419; CHECK-THUMB8BASE-NEXT:    movs r3, #0
7420; CHECK-THUMB8BASE-NEXT:    str r3, [sp]
7421; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i64
7422; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i64
7423; CHECK-THUMB8BASE-NEXT:    movs r2, #1
7424; CHECK-THUMB8BASE-NEXT:    bl __atomic_fetch_sub_8
7425; CHECK-THUMB8BASE-NEXT:    add sp, #8
7426; CHECK-THUMB8BASE-NEXT:    pop {r7, pc}
7427entry:
7428  %0 = atomicrmw sub ptr @atomic_i64, i64 1 monotonic
7429  ret i64 %0
7430}
7431define i64 @test_and_i64() {
7432; CHECK-ARM8-LABEL: test_and_i64:
7433; CHECK-ARM8:       @ %bb.0: @ %entry
7434; CHECK-ARM8-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
7435; CHECK-ARM8-NEXT:    push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
7436; CHECK-ARM8-NEXT:    .pad #16
7437; CHECK-ARM8-NEXT:    sub sp, sp, #16
7438; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i64
7439; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i64
7440; CHECK-ARM8-NEXT:    ldr r1, [r0]
7441; CHECK-ARM8-NEXT:    ldr r0, [r0, #4]
7442; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7443; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7444; CHECK-ARM8-NEXT:    b .LBB36_1
7445; CHECK-ARM8-NEXT:  .LBB36_1: @ %atomicrmw.start
7446; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
7447; CHECK-ARM8-NEXT:    @ Child Loop BB36_2 Depth 2
7448; CHECK-ARM8-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
7449; CHECK-ARM8-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
7450; CHECK-ARM8-NEXT:    and r10, r2, #1
7451; CHECK-ARM8-NEXT:    mov r0, #0
7452; CHECK-ARM8-NEXT:    @ kill: def $r10 killed $r10 def $r10_r11
7453; CHECK-ARM8-NEXT:    mov r11, r0
7454; CHECK-ARM8-NEXT:    mov r8, r2
7455; CHECK-ARM8-NEXT:    mov r9, r1
7456; CHECK-ARM8-NEXT:    movw r6, :lower16:atomic_i64
7457; CHECK-ARM8-NEXT:    movt r6, :upper16:atomic_i64
7458; CHECK-ARM8-NEXT:    @ implicit-def: $r0
7459; CHECK-ARM8-NEXT:    @ implicit-def: $r3
7460; CHECK-ARM8-NEXT:    @ kill: def $r6 killed $r6 def $r6_r7
7461; CHECK-ARM8-NEXT:    mov r7, r0
7462; CHECK-ARM8-NEXT:  .LBB36_2: @ %atomicrmw.start
7463; CHECK-ARM8-NEXT:    @ Parent Loop BB36_1 Depth=1
7464; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
7465; CHECK-ARM8-NEXT:    ldrexd r4, r5, [r6]
7466; CHECK-ARM8-NEXT:    cmp r4, r8
7467; CHECK-ARM8-NEXT:    cmpeq r5, r9
7468; CHECK-ARM8-NEXT:    bne .LBB36_4
7469; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
7470; CHECK-ARM8-NEXT:    @ in Loop: Header=BB36_2 Depth=2
7471; CHECK-ARM8-NEXT:    strexd r7, r10, r11, [r6]
7472; CHECK-ARM8-NEXT:    cmp r7, #0
7473; CHECK-ARM8-NEXT:    bne .LBB36_2
7474; CHECK-ARM8-NEXT:  .LBB36_4: @ %atomicrmw.start
7475; CHECK-ARM8-NEXT:    @ in Loop: Header=BB36_1 Depth=1
7476; CHECK-ARM8-NEXT:    mov r0, r5
7477; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
7478; CHECK-ARM8-NEXT:    eor r3, r0, r1
7479; CHECK-ARM8-NEXT:    mov r1, r4
7480; CHECK-ARM8-NEXT:    str r1, [sp, #4] @ 4-byte Spill
7481; CHECK-ARM8-NEXT:    eor r2, r1, r2
7482; CHECK-ARM8-NEXT:    orr r2, r2, r3
7483; CHECK-ARM8-NEXT:    cmp r2, #0
7484; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7485; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7486; CHECK-ARM8-NEXT:    bne .LBB36_1
7487; CHECK-ARM8-NEXT:    b .LBB36_5
7488; CHECK-ARM8-NEXT:  .LBB36_5: @ %atomicrmw.end
7489; CHECK-ARM8-NEXT:    ldr r1, [sp] @ 4-byte Reload
7490; CHECK-ARM8-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
7491; CHECK-ARM8-NEXT:    add sp, sp, #16
7492; CHECK-ARM8-NEXT:    pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
7493;
7494; CHECK-ARM6-LABEL: test_and_i64:
7495; CHECK-ARM6:       @ %bb.0: @ %entry
7496; CHECK-ARM6-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
7497; CHECK-ARM6-NEXT:    push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
7498; CHECK-ARM6-NEXT:    .pad #16
7499; CHECK-ARM6-NEXT:    sub sp, sp, #16
7500; CHECK-ARM6-NEXT:    ldr r0, .LCPI36_0
7501; CHECK-ARM6-NEXT:    ldr r1, [r0]
7502; CHECK-ARM6-NEXT:    ldr r0, [r0, #4]
7503; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7504; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7505; CHECK-ARM6-NEXT:    b .LBB36_1
7506; CHECK-ARM6-NEXT:  .LBB36_1: @ %atomicrmw.start
7507; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
7508; CHECK-ARM6-NEXT:    @ Child Loop BB36_2 Depth 2
7509; CHECK-ARM6-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
7510; CHECK-ARM6-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
7511; CHECK-ARM6-NEXT:    and r10, r2, #1
7512; CHECK-ARM6-NEXT:    mov r0, #0
7513; CHECK-ARM6-NEXT:    @ kill: def $r10 killed $r10 def $r10_r11
7514; CHECK-ARM6-NEXT:    mov r11, r0
7515; CHECK-ARM6-NEXT:    mov r8, r2
7516; CHECK-ARM6-NEXT:    mov r9, r1
7517; CHECK-ARM6-NEXT:    ldr r6, .LCPI36_0
7518; CHECK-ARM6-NEXT:    @ implicit-def: $r0
7519; CHECK-ARM6-NEXT:    @ implicit-def: $r3
7520; CHECK-ARM6-NEXT:    @ kill: def $r6 killed $r6 def $r6_r7
7521; CHECK-ARM6-NEXT:    mov r7, r0
7522; CHECK-ARM6-NEXT:  .LBB36_2: @ %atomicrmw.start
7523; CHECK-ARM6-NEXT:    @ Parent Loop BB36_1 Depth=1
7524; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
7525; CHECK-ARM6-NEXT:    ldrexd r4, r5, [r6]
7526; CHECK-ARM6-NEXT:    cmp r4, r8
7527; CHECK-ARM6-NEXT:    cmpeq r5, r9
7528; CHECK-ARM6-NEXT:    bne .LBB36_4
7529; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
7530; CHECK-ARM6-NEXT:    @ in Loop: Header=BB36_2 Depth=2
7531; CHECK-ARM6-NEXT:    strexd r7, r10, r11, [r6]
7532; CHECK-ARM6-NEXT:    cmp r7, #0
7533; CHECK-ARM6-NEXT:    bne .LBB36_2
7534; CHECK-ARM6-NEXT:  .LBB36_4: @ %atomicrmw.start
7535; CHECK-ARM6-NEXT:    @ in Loop: Header=BB36_1 Depth=1
7536; CHECK-ARM6-NEXT:    mov r0, r5
7537; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
7538; CHECK-ARM6-NEXT:    eor r3, r0, r1
7539; CHECK-ARM6-NEXT:    mov r1, r4
7540; CHECK-ARM6-NEXT:    str r1, [sp, #4] @ 4-byte Spill
7541; CHECK-ARM6-NEXT:    eor r2, r1, r2
7542; CHECK-ARM6-NEXT:    orr r2, r2, r3
7543; CHECK-ARM6-NEXT:    cmp r2, #0
7544; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7545; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7546; CHECK-ARM6-NEXT:    bne .LBB36_1
7547; CHECK-ARM6-NEXT:    b .LBB36_5
7548; CHECK-ARM6-NEXT:  .LBB36_5: @ %atomicrmw.end
7549; CHECK-ARM6-NEXT:    ldr r1, [sp] @ 4-byte Reload
7550; CHECK-ARM6-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
7551; CHECK-ARM6-NEXT:    add sp, sp, #16
7552; CHECK-ARM6-NEXT:    pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
7553; CHECK-ARM6-NEXT:    .p2align 2
7554; CHECK-ARM6-NEXT:  @ %bb.6:
7555; CHECK-ARM6-NEXT:  .LCPI36_0:
7556; CHECK-ARM6-NEXT:    .long atomic_i64
7557;
7558; CHECK-THUMB7-LABEL: test_and_i64:
7559; CHECK-THUMB7:       @ %bb.0: @ %entry
7560; CHECK-THUMB7-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
7561; CHECK-THUMB7-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11, lr}
7562; CHECK-THUMB7-NEXT:    .pad #16
7563; CHECK-THUMB7-NEXT:    sub sp, #16
7564; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i64
7565; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i64
7566; CHECK-THUMB7-NEXT:    ldr r1, [r0]
7567; CHECK-THUMB7-NEXT:    ldr r0, [r0, #4]
7568; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7569; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7570; CHECK-THUMB7-NEXT:    b .LBB36_1
7571; CHECK-THUMB7-NEXT:  .LBB36_1: @ %atomicrmw.start
7572; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
7573; CHECK-THUMB7-NEXT:    @ Child Loop BB36_2 Depth 2
7574; CHECK-THUMB7-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
7575; CHECK-THUMB7-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
7576; CHECK-THUMB7-NEXT:    and r10, r2, #1
7577; CHECK-THUMB7-NEXT:    movs r0, #0
7578; CHECK-THUMB7-NEXT:    @ kill: def $r10 killed $r10 def $r10_r11
7579; CHECK-THUMB7-NEXT:    mov r11, r0
7580; CHECK-THUMB7-NEXT:    mov r8, r2
7581; CHECK-THUMB7-NEXT:    mov r9, r1
7582; CHECK-THUMB7-NEXT:    movw r6, :lower16:atomic_i64
7583; CHECK-THUMB7-NEXT:    movt r6, :upper16:atomic_i64
7584; CHECK-THUMB7-NEXT:    @ implicit-def: $r0
7585; CHECK-THUMB7-NEXT:    @ implicit-def: $r3
7586; CHECK-THUMB7-NEXT:    @ kill: def $r6 killed $r6 def $r6_r7
7587; CHECK-THUMB7-NEXT:    mov r7, r0
7588; CHECK-THUMB7-NEXT:  .LBB36_2: @ %atomicrmw.start
7589; CHECK-THUMB7-NEXT:    @ Parent Loop BB36_1 Depth=1
7590; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
7591; CHECK-THUMB7-NEXT:    ldrexd r4, r5, [r6]
7592; CHECK-THUMB7-NEXT:    cmp r4, r8
7593; CHECK-THUMB7-NEXT:    it eq
7594; CHECK-THUMB7-NEXT:    cmpeq r5, r9
7595; CHECK-THUMB7-NEXT:    bne .LBB36_4
7596; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
7597; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB36_2 Depth=2
7598; CHECK-THUMB7-NEXT:    strexd r7, r10, r11, [r6]
7599; CHECK-THUMB7-NEXT:    cmp r7, #0
7600; CHECK-THUMB7-NEXT:    bne .LBB36_2
7601; CHECK-THUMB7-NEXT:  .LBB36_4: @ %atomicrmw.start
7602; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB36_1 Depth=1
7603; CHECK-THUMB7-NEXT:    mov r0, r5
7604; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
7605; CHECK-THUMB7-NEXT:    eor.w r3, r0, r1
7606; CHECK-THUMB7-NEXT:    mov r1, r4
7607; CHECK-THUMB7-NEXT:    str r1, [sp, #4] @ 4-byte Spill
7608; CHECK-THUMB7-NEXT:    eors r2, r1
7609; CHECK-THUMB7-NEXT:    orrs r2, r3
7610; CHECK-THUMB7-NEXT:    cmp r2, #0
7611; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7612; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7613; CHECK-THUMB7-NEXT:    bne .LBB36_1
7614; CHECK-THUMB7-NEXT:    b .LBB36_5
7615; CHECK-THUMB7-NEXT:  .LBB36_5: @ %atomicrmw.end
7616; CHECK-THUMB7-NEXT:    ldr r1, [sp] @ 4-byte Reload
7617; CHECK-THUMB7-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
7618; CHECK-THUMB7-NEXT:    add sp, #16
7619; CHECK-THUMB7-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11, pc}
7620;
7621; CHECK-THUMB6-LABEL: test_and_i64:
7622; CHECK-THUMB6:       @ %bb.0: @ %entry
7623; CHECK-THUMB6-NEXT:    .save {r7, lr}
7624; CHECK-THUMB6-NEXT:    push {r7, lr}
7625; CHECK-THUMB6-NEXT:    ldr r0, .LCPI36_0
7626; CHECK-THUMB6-NEXT:    movs r2, #1
7627; CHECK-THUMB6-NEXT:    movs r3, #0
7628; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_and_8
7629; CHECK-THUMB6-NEXT:    pop {r7, pc}
7630; CHECK-THUMB6-NEXT:    .p2align 2
7631; CHECK-THUMB6-NEXT:  @ %bb.1:
7632; CHECK-THUMB6-NEXT:  .LCPI36_0:
7633; CHECK-THUMB6-NEXT:    .long atomic_i64
7634;
7635; CHECK-THUMB8BASE-LABEL: test_and_i64:
7636; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
7637; CHECK-THUMB8BASE-NEXT:    .save {r7, lr}
7638; CHECK-THUMB8BASE-NEXT:    push {r7, lr}
7639; CHECK-THUMB8BASE-NEXT:    .pad #8
7640; CHECK-THUMB8BASE-NEXT:    sub sp, #8
7641; CHECK-THUMB8BASE-NEXT:    movs r3, #0
7642; CHECK-THUMB8BASE-NEXT:    str r3, [sp]
7643; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i64
7644; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i64
7645; CHECK-THUMB8BASE-NEXT:    movs r2, #1
7646; CHECK-THUMB8BASE-NEXT:    bl __atomic_fetch_and_8
7647; CHECK-THUMB8BASE-NEXT:    add sp, #8
7648; CHECK-THUMB8BASE-NEXT:    pop {r7, pc}
7649entry:
7650  %0 = atomicrmw and ptr @atomic_i64, i64 1 monotonic
7651  ret i64 %0
7652}
7653define i64 @test_nand_i64() {
7654; CHECK-ARM8-LABEL: test_nand_i64:
7655; CHECK-ARM8:       @ %bb.0: @ %entry
7656; CHECK-ARM8-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
7657; CHECK-ARM8-NEXT:    push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
7658; CHECK-ARM8-NEXT:    .pad #16
7659; CHECK-ARM8-NEXT:    sub sp, sp, #16
7660; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i64
7661; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i64
7662; CHECK-ARM8-NEXT:    ldr r1, [r0]
7663; CHECK-ARM8-NEXT:    ldr r0, [r0, #4]
7664; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7665; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7666; CHECK-ARM8-NEXT:    b .LBB37_1
7667; CHECK-ARM8-NEXT:  .LBB37_1: @ %atomicrmw.start
7668; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
7669; CHECK-ARM8-NEXT:    @ Child Loop BB37_2 Depth 2
7670; CHECK-ARM8-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
7671; CHECK-ARM8-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
7672; CHECK-ARM8-NEXT:    mov r8, r2
7673; CHECK-ARM8-NEXT:    mov r9, r1
7674; CHECK-ARM8-NEXT:    mvn r0, r2
7675; CHECK-ARM8-NEXT:    mvn r3, #1
7676; CHECK-ARM8-NEXT:    orr r10, r0, r3
7677; CHECK-ARM8-NEXT:    mvn r0, #0
7678; CHECK-ARM8-NEXT:    @ kill: def $r10 killed $r10 def $r10_r11
7679; CHECK-ARM8-NEXT:    mov r11, r0
7680; CHECK-ARM8-NEXT:    movw r6, :lower16:atomic_i64
7681; CHECK-ARM8-NEXT:    movt r6, :upper16:atomic_i64
7682; CHECK-ARM8-NEXT:    @ implicit-def: $r0
7683; CHECK-ARM8-NEXT:    @ implicit-def: $r3
7684; CHECK-ARM8-NEXT:    @ kill: def $r6 killed $r6 def $r6_r7
7685; CHECK-ARM8-NEXT:    mov r7, r0
7686; CHECK-ARM8-NEXT:  .LBB37_2: @ %atomicrmw.start
7687; CHECK-ARM8-NEXT:    @ Parent Loop BB37_1 Depth=1
7688; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
7689; CHECK-ARM8-NEXT:    ldrexd r4, r5, [r6]
7690; CHECK-ARM8-NEXT:    cmp r4, r8
7691; CHECK-ARM8-NEXT:    cmpeq r5, r9
7692; CHECK-ARM8-NEXT:    bne .LBB37_4
7693; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
7694; CHECK-ARM8-NEXT:    @ in Loop: Header=BB37_2 Depth=2
7695; CHECK-ARM8-NEXT:    strexd r7, r10, r11, [r6]
7696; CHECK-ARM8-NEXT:    cmp r7, #0
7697; CHECK-ARM8-NEXT:    bne .LBB37_2
7698; CHECK-ARM8-NEXT:  .LBB37_4: @ %atomicrmw.start
7699; CHECK-ARM8-NEXT:    @ in Loop: Header=BB37_1 Depth=1
7700; CHECK-ARM8-NEXT:    mov r0, r5
7701; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
7702; CHECK-ARM8-NEXT:    eor r3, r0, r1
7703; CHECK-ARM8-NEXT:    mov r1, r4
7704; CHECK-ARM8-NEXT:    str r1, [sp, #4] @ 4-byte Spill
7705; CHECK-ARM8-NEXT:    eor r2, r1, r2
7706; CHECK-ARM8-NEXT:    orr r2, r2, r3
7707; CHECK-ARM8-NEXT:    cmp r2, #0
7708; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7709; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7710; CHECK-ARM8-NEXT:    bne .LBB37_1
7711; CHECK-ARM8-NEXT:    b .LBB37_5
7712; CHECK-ARM8-NEXT:  .LBB37_5: @ %atomicrmw.end
7713; CHECK-ARM8-NEXT:    ldr r1, [sp] @ 4-byte Reload
7714; CHECK-ARM8-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
7715; CHECK-ARM8-NEXT:    add sp, sp, #16
7716; CHECK-ARM8-NEXT:    pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
7717;
7718; CHECK-ARM6-LABEL: test_nand_i64:
7719; CHECK-ARM6:       @ %bb.0: @ %entry
7720; CHECK-ARM6-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
7721; CHECK-ARM6-NEXT:    push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
7722; CHECK-ARM6-NEXT:    .pad #16
7723; CHECK-ARM6-NEXT:    sub sp, sp, #16
7724; CHECK-ARM6-NEXT:    ldr r0, .LCPI37_0
7725; CHECK-ARM6-NEXT:    ldr r1, [r0]
7726; CHECK-ARM6-NEXT:    ldr r0, [r0, #4]
7727; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7728; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7729; CHECK-ARM6-NEXT:    b .LBB37_1
7730; CHECK-ARM6-NEXT:  .LBB37_1: @ %atomicrmw.start
7731; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
7732; CHECK-ARM6-NEXT:    @ Child Loop BB37_2 Depth 2
7733; CHECK-ARM6-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
7734; CHECK-ARM6-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
7735; CHECK-ARM6-NEXT:    mov r8, r2
7736; CHECK-ARM6-NEXT:    mov r9, r1
7737; CHECK-ARM6-NEXT:    mvn r0, r2
7738; CHECK-ARM6-NEXT:    mvn r3, #1
7739; CHECK-ARM6-NEXT:    orr r10, r0, r3
7740; CHECK-ARM6-NEXT:    mvn r0, #0
7741; CHECK-ARM6-NEXT:    @ kill: def $r10 killed $r10 def $r10_r11
7742; CHECK-ARM6-NEXT:    mov r11, r0
7743; CHECK-ARM6-NEXT:    ldr r6, .LCPI37_0
7744; CHECK-ARM6-NEXT:    @ implicit-def: $r0
7745; CHECK-ARM6-NEXT:    @ implicit-def: $r3
7746; CHECK-ARM6-NEXT:    @ kill: def $r6 killed $r6 def $r6_r7
7747; CHECK-ARM6-NEXT:    mov r7, r0
7748; CHECK-ARM6-NEXT:  .LBB37_2: @ %atomicrmw.start
7749; CHECK-ARM6-NEXT:    @ Parent Loop BB37_1 Depth=1
7750; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
7751; CHECK-ARM6-NEXT:    ldrexd r4, r5, [r6]
7752; CHECK-ARM6-NEXT:    cmp r4, r8
7753; CHECK-ARM6-NEXT:    cmpeq r5, r9
7754; CHECK-ARM6-NEXT:    bne .LBB37_4
7755; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
7756; CHECK-ARM6-NEXT:    @ in Loop: Header=BB37_2 Depth=2
7757; CHECK-ARM6-NEXT:    strexd r7, r10, r11, [r6]
7758; CHECK-ARM6-NEXT:    cmp r7, #0
7759; CHECK-ARM6-NEXT:    bne .LBB37_2
7760; CHECK-ARM6-NEXT:  .LBB37_4: @ %atomicrmw.start
7761; CHECK-ARM6-NEXT:    @ in Loop: Header=BB37_1 Depth=1
7762; CHECK-ARM6-NEXT:    mov r0, r5
7763; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
7764; CHECK-ARM6-NEXT:    eor r3, r0, r1
7765; CHECK-ARM6-NEXT:    mov r1, r4
7766; CHECK-ARM6-NEXT:    str r1, [sp, #4] @ 4-byte Spill
7767; CHECK-ARM6-NEXT:    eor r2, r1, r2
7768; CHECK-ARM6-NEXT:    orr r2, r2, r3
7769; CHECK-ARM6-NEXT:    cmp r2, #0
7770; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7771; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7772; CHECK-ARM6-NEXT:    bne .LBB37_1
7773; CHECK-ARM6-NEXT:    b .LBB37_5
7774; CHECK-ARM6-NEXT:  .LBB37_5: @ %atomicrmw.end
7775; CHECK-ARM6-NEXT:    ldr r1, [sp] @ 4-byte Reload
7776; CHECK-ARM6-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
7777; CHECK-ARM6-NEXT:    add sp, sp, #16
7778; CHECK-ARM6-NEXT:    pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
7779; CHECK-ARM6-NEXT:    .p2align 2
7780; CHECK-ARM6-NEXT:  @ %bb.6:
7781; CHECK-ARM6-NEXT:  .LCPI37_0:
7782; CHECK-ARM6-NEXT:    .long atomic_i64
7783;
7784; CHECK-THUMB7-LABEL: test_nand_i64:
7785; CHECK-THUMB7:       @ %bb.0: @ %entry
7786; CHECK-THUMB7-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
7787; CHECK-THUMB7-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11, lr}
7788; CHECK-THUMB7-NEXT:    .pad #16
7789; CHECK-THUMB7-NEXT:    sub sp, #16
7790; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i64
7791; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i64
7792; CHECK-THUMB7-NEXT:    ldr r1, [r0]
7793; CHECK-THUMB7-NEXT:    ldr r0, [r0, #4]
7794; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7795; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7796; CHECK-THUMB7-NEXT:    b .LBB37_1
7797; CHECK-THUMB7-NEXT:  .LBB37_1: @ %atomicrmw.start
7798; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
7799; CHECK-THUMB7-NEXT:    @ Child Loop BB37_2 Depth 2
7800; CHECK-THUMB7-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
7801; CHECK-THUMB7-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
7802; CHECK-THUMB7-NEXT:    mov r8, r2
7803; CHECK-THUMB7-NEXT:    mov r9, r1
7804; CHECK-THUMB7-NEXT:    mvn r0, #1
7805; CHECK-THUMB7-NEXT:    orn r10, r0, r2
7806; CHECK-THUMB7-NEXT:    mov.w r0, #-1
7807; CHECK-THUMB7-NEXT:    @ kill: def $r10 killed $r10 def $r10_r11
7808; CHECK-THUMB7-NEXT:    mov r11, r0
7809; CHECK-THUMB7-NEXT:    movw r6, :lower16:atomic_i64
7810; CHECK-THUMB7-NEXT:    movt r6, :upper16:atomic_i64
7811; CHECK-THUMB7-NEXT:    @ implicit-def: $r0
7812; CHECK-THUMB7-NEXT:    @ implicit-def: $r3
7813; CHECK-THUMB7-NEXT:    @ kill: def $r6 killed $r6 def $r6_r7
7814; CHECK-THUMB7-NEXT:    mov r7, r0
7815; CHECK-THUMB7-NEXT:  .LBB37_2: @ %atomicrmw.start
7816; CHECK-THUMB7-NEXT:    @ Parent Loop BB37_1 Depth=1
7817; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
7818; CHECK-THUMB7-NEXT:    ldrexd r4, r5, [r6]
7819; CHECK-THUMB7-NEXT:    cmp r4, r8
7820; CHECK-THUMB7-NEXT:    it eq
7821; CHECK-THUMB7-NEXT:    cmpeq r5, r9
7822; CHECK-THUMB7-NEXT:    bne .LBB37_4
7823; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
7824; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB37_2 Depth=2
7825; CHECK-THUMB7-NEXT:    strexd r7, r10, r11, [r6]
7826; CHECK-THUMB7-NEXT:    cmp r7, #0
7827; CHECK-THUMB7-NEXT:    bne .LBB37_2
7828; CHECK-THUMB7-NEXT:  .LBB37_4: @ %atomicrmw.start
7829; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB37_1 Depth=1
7830; CHECK-THUMB7-NEXT:    mov r0, r5
7831; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
7832; CHECK-THUMB7-NEXT:    eor.w r3, r0, r1
7833; CHECK-THUMB7-NEXT:    mov r1, r4
7834; CHECK-THUMB7-NEXT:    str r1, [sp, #4] @ 4-byte Spill
7835; CHECK-THUMB7-NEXT:    eors r2, r1
7836; CHECK-THUMB7-NEXT:    orrs r2, r3
7837; CHECK-THUMB7-NEXT:    cmp r2, #0
7838; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7839; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7840; CHECK-THUMB7-NEXT:    bne .LBB37_1
7841; CHECK-THUMB7-NEXT:    b .LBB37_5
7842; CHECK-THUMB7-NEXT:  .LBB37_5: @ %atomicrmw.end
7843; CHECK-THUMB7-NEXT:    ldr r1, [sp] @ 4-byte Reload
7844; CHECK-THUMB7-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
7845; CHECK-THUMB7-NEXT:    add sp, #16
7846; CHECK-THUMB7-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11, pc}
7847;
7848; CHECK-THUMB6-LABEL: test_nand_i64:
7849; CHECK-THUMB6:       @ %bb.0: @ %entry
7850; CHECK-THUMB6-NEXT:    .save {r7, lr}
7851; CHECK-THUMB6-NEXT:    push {r7, lr}
7852; CHECK-THUMB6-NEXT:    ldr r0, .LCPI37_0
7853; CHECK-THUMB6-NEXT:    movs r2, #1
7854; CHECK-THUMB6-NEXT:    movs r3, #0
7855; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_nand_8
7856; CHECK-THUMB6-NEXT:    pop {r7, pc}
7857; CHECK-THUMB6-NEXT:    .p2align 2
7858; CHECK-THUMB6-NEXT:  @ %bb.1:
7859; CHECK-THUMB6-NEXT:  .LCPI37_0:
7860; CHECK-THUMB6-NEXT:    .long atomic_i64
7861;
7862; CHECK-THUMB8BASE-LABEL: test_nand_i64:
7863; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
7864; CHECK-THUMB8BASE-NEXT:    .save {r7, lr}
7865; CHECK-THUMB8BASE-NEXT:    push {r7, lr}
7866; CHECK-THUMB8BASE-NEXT:    .pad #8
7867; CHECK-THUMB8BASE-NEXT:    sub sp, #8
7868; CHECK-THUMB8BASE-NEXT:    movs r3, #0
7869; CHECK-THUMB8BASE-NEXT:    str r3, [sp]
7870; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i64
7871; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i64
7872; CHECK-THUMB8BASE-NEXT:    movs r2, #1
7873; CHECK-THUMB8BASE-NEXT:    bl __atomic_fetch_nand_8
7874; CHECK-THUMB8BASE-NEXT:    add sp, #8
7875; CHECK-THUMB8BASE-NEXT:    pop {r7, pc}
7876entry:
7877  %0 = atomicrmw nand ptr @atomic_i64, i64 1 monotonic
7878  ret i64 %0
7879}
7880define i64 @test_or_i64() {
7881; CHECK-ARM8-LABEL: test_or_i64:
7882; CHECK-ARM8:       @ %bb.0: @ %entry
7883; CHECK-ARM8-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
7884; CHECK-ARM8-NEXT:    push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
7885; CHECK-ARM8-NEXT:    .pad #16
7886; CHECK-ARM8-NEXT:    sub sp, sp, #16
7887; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i64
7888; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i64
7889; CHECK-ARM8-NEXT:    ldr r1, [r0]
7890; CHECK-ARM8-NEXT:    ldr r0, [r0, #4]
7891; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7892; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7893; CHECK-ARM8-NEXT:    b .LBB38_1
7894; CHECK-ARM8-NEXT:  .LBB38_1: @ %atomicrmw.start
7895; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
7896; CHECK-ARM8-NEXT:    @ Child Loop BB38_2 Depth 2
7897; CHECK-ARM8-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
7898; CHECK-ARM8-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
7899; CHECK-ARM8-NEXT:    orr r10, r2, #1
7900; CHECK-ARM8-NEXT:    @ kill: def $r10 killed $r10 def $r10_r11
7901; CHECK-ARM8-NEXT:    mov r11, r1
7902; CHECK-ARM8-NEXT:    mov r8, r2
7903; CHECK-ARM8-NEXT:    mov r9, r1
7904; CHECK-ARM8-NEXT:    movw r6, :lower16:atomic_i64
7905; CHECK-ARM8-NEXT:    movt r6, :upper16:atomic_i64
7906; CHECK-ARM8-NEXT:    @ implicit-def: $r0
7907; CHECK-ARM8-NEXT:    @ implicit-def: $r3
7908; CHECK-ARM8-NEXT:    @ kill: def $r6 killed $r6 def $r6_r7
7909; CHECK-ARM8-NEXT:    mov r7, r0
7910; CHECK-ARM8-NEXT:  .LBB38_2: @ %atomicrmw.start
7911; CHECK-ARM8-NEXT:    @ Parent Loop BB38_1 Depth=1
7912; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
7913; CHECK-ARM8-NEXT:    ldrexd r4, r5, [r6]
7914; CHECK-ARM8-NEXT:    cmp r4, r8
7915; CHECK-ARM8-NEXT:    cmpeq r5, r9
7916; CHECK-ARM8-NEXT:    bne .LBB38_4
7917; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
7918; CHECK-ARM8-NEXT:    @ in Loop: Header=BB38_2 Depth=2
7919; CHECK-ARM8-NEXT:    strexd r7, r10, r11, [r6]
7920; CHECK-ARM8-NEXT:    cmp r7, #0
7921; CHECK-ARM8-NEXT:    bne .LBB38_2
7922; CHECK-ARM8-NEXT:  .LBB38_4: @ %atomicrmw.start
7923; CHECK-ARM8-NEXT:    @ in Loop: Header=BB38_1 Depth=1
7924; CHECK-ARM8-NEXT:    mov r0, r5
7925; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
7926; CHECK-ARM8-NEXT:    eor r3, r0, r1
7927; CHECK-ARM8-NEXT:    mov r1, r4
7928; CHECK-ARM8-NEXT:    str r1, [sp, #4] @ 4-byte Spill
7929; CHECK-ARM8-NEXT:    eor r2, r1, r2
7930; CHECK-ARM8-NEXT:    orr r2, r2, r3
7931; CHECK-ARM8-NEXT:    cmp r2, #0
7932; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7933; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7934; CHECK-ARM8-NEXT:    bne .LBB38_1
7935; CHECK-ARM8-NEXT:    b .LBB38_5
7936; CHECK-ARM8-NEXT:  .LBB38_5: @ %atomicrmw.end
7937; CHECK-ARM8-NEXT:    ldr r1, [sp] @ 4-byte Reload
7938; CHECK-ARM8-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
7939; CHECK-ARM8-NEXT:    add sp, sp, #16
7940; CHECK-ARM8-NEXT:    pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
7941;
7942; CHECK-ARM6-LABEL: test_or_i64:
7943; CHECK-ARM6:       @ %bb.0: @ %entry
7944; CHECK-ARM6-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
7945; CHECK-ARM6-NEXT:    push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
7946; CHECK-ARM6-NEXT:    .pad #16
7947; CHECK-ARM6-NEXT:    sub sp, sp, #16
7948; CHECK-ARM6-NEXT:    ldr r0, .LCPI38_0
7949; CHECK-ARM6-NEXT:    ldr r1, [r0]
7950; CHECK-ARM6-NEXT:    ldr r0, [r0, #4]
7951; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7952; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7953; CHECK-ARM6-NEXT:    b .LBB38_1
7954; CHECK-ARM6-NEXT:  .LBB38_1: @ %atomicrmw.start
7955; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
7956; CHECK-ARM6-NEXT:    @ Child Loop BB38_2 Depth 2
7957; CHECK-ARM6-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
7958; CHECK-ARM6-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
7959; CHECK-ARM6-NEXT:    orr r10, r2, #1
7960; CHECK-ARM6-NEXT:    @ kill: def $r10 killed $r10 def $r10_r11
7961; CHECK-ARM6-NEXT:    mov r11, r1
7962; CHECK-ARM6-NEXT:    mov r8, r2
7963; CHECK-ARM6-NEXT:    mov r9, r1
7964; CHECK-ARM6-NEXT:    ldr r6, .LCPI38_0
7965; CHECK-ARM6-NEXT:    @ implicit-def: $r0
7966; CHECK-ARM6-NEXT:    @ implicit-def: $r3
7967; CHECK-ARM6-NEXT:    @ kill: def $r6 killed $r6 def $r6_r7
7968; CHECK-ARM6-NEXT:    mov r7, r0
7969; CHECK-ARM6-NEXT:  .LBB38_2: @ %atomicrmw.start
7970; CHECK-ARM6-NEXT:    @ Parent Loop BB38_1 Depth=1
7971; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
7972; CHECK-ARM6-NEXT:    ldrexd r4, r5, [r6]
7973; CHECK-ARM6-NEXT:    cmp r4, r8
7974; CHECK-ARM6-NEXT:    cmpeq r5, r9
7975; CHECK-ARM6-NEXT:    bne .LBB38_4
7976; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
7977; CHECK-ARM6-NEXT:    @ in Loop: Header=BB38_2 Depth=2
7978; CHECK-ARM6-NEXT:    strexd r7, r10, r11, [r6]
7979; CHECK-ARM6-NEXT:    cmp r7, #0
7980; CHECK-ARM6-NEXT:    bne .LBB38_2
7981; CHECK-ARM6-NEXT:  .LBB38_4: @ %atomicrmw.start
7982; CHECK-ARM6-NEXT:    @ in Loop: Header=BB38_1 Depth=1
7983; CHECK-ARM6-NEXT:    mov r0, r5
7984; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
7985; CHECK-ARM6-NEXT:    eor r3, r0, r1
7986; CHECK-ARM6-NEXT:    mov r1, r4
7987; CHECK-ARM6-NEXT:    str r1, [sp, #4] @ 4-byte Spill
7988; CHECK-ARM6-NEXT:    eor r2, r1, r2
7989; CHECK-ARM6-NEXT:    orr r2, r2, r3
7990; CHECK-ARM6-NEXT:    cmp r2, #0
7991; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
7992; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
7993; CHECK-ARM6-NEXT:    bne .LBB38_1
7994; CHECK-ARM6-NEXT:    b .LBB38_5
7995; CHECK-ARM6-NEXT:  .LBB38_5: @ %atomicrmw.end
7996; CHECK-ARM6-NEXT:    ldr r1, [sp] @ 4-byte Reload
7997; CHECK-ARM6-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
7998; CHECK-ARM6-NEXT:    add sp, sp, #16
7999; CHECK-ARM6-NEXT:    pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
8000; CHECK-ARM6-NEXT:    .p2align 2
8001; CHECK-ARM6-NEXT:  @ %bb.6:
8002; CHECK-ARM6-NEXT:  .LCPI38_0:
8003; CHECK-ARM6-NEXT:    .long atomic_i64
8004;
8005; CHECK-THUMB7-LABEL: test_or_i64:
8006; CHECK-THUMB7:       @ %bb.0: @ %entry
8007; CHECK-THUMB7-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
8008; CHECK-THUMB7-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11, lr}
8009; CHECK-THUMB7-NEXT:    .pad #16
8010; CHECK-THUMB7-NEXT:    sub sp, #16
8011; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i64
8012; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i64
8013; CHECK-THUMB7-NEXT:    ldr r1, [r0]
8014; CHECK-THUMB7-NEXT:    ldr r0, [r0, #4]
8015; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8016; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8017; CHECK-THUMB7-NEXT:    b .LBB38_1
8018; CHECK-THUMB7-NEXT:  .LBB38_1: @ %atomicrmw.start
8019; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
8020; CHECK-THUMB7-NEXT:    @ Child Loop BB38_2 Depth 2
8021; CHECK-THUMB7-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
8022; CHECK-THUMB7-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
8023; CHECK-THUMB7-NEXT:    orr r10, r2, #1
8024; CHECK-THUMB7-NEXT:    @ kill: def $r10 killed $r10 def $r10_r11
8025; CHECK-THUMB7-NEXT:    mov r11, r1
8026; CHECK-THUMB7-NEXT:    mov r8, r2
8027; CHECK-THUMB7-NEXT:    mov r9, r1
8028; CHECK-THUMB7-NEXT:    movw r6, :lower16:atomic_i64
8029; CHECK-THUMB7-NEXT:    movt r6, :upper16:atomic_i64
8030; CHECK-THUMB7-NEXT:    @ implicit-def: $r0
8031; CHECK-THUMB7-NEXT:    @ implicit-def: $r3
8032; CHECK-THUMB7-NEXT:    @ kill: def $r6 killed $r6 def $r6_r7
8033; CHECK-THUMB7-NEXT:    mov r7, r0
8034; CHECK-THUMB7-NEXT:  .LBB38_2: @ %atomicrmw.start
8035; CHECK-THUMB7-NEXT:    @ Parent Loop BB38_1 Depth=1
8036; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
8037; CHECK-THUMB7-NEXT:    ldrexd r4, r5, [r6]
8038; CHECK-THUMB7-NEXT:    cmp r4, r8
8039; CHECK-THUMB7-NEXT:    it eq
8040; CHECK-THUMB7-NEXT:    cmpeq r5, r9
8041; CHECK-THUMB7-NEXT:    bne .LBB38_4
8042; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
8043; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB38_2 Depth=2
8044; CHECK-THUMB7-NEXT:    strexd r7, r10, r11, [r6]
8045; CHECK-THUMB7-NEXT:    cmp r7, #0
8046; CHECK-THUMB7-NEXT:    bne .LBB38_2
8047; CHECK-THUMB7-NEXT:  .LBB38_4: @ %atomicrmw.start
8048; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB38_1 Depth=1
8049; CHECK-THUMB7-NEXT:    mov r0, r5
8050; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
8051; CHECK-THUMB7-NEXT:    eor.w r3, r0, r1
8052; CHECK-THUMB7-NEXT:    mov r1, r4
8053; CHECK-THUMB7-NEXT:    str r1, [sp, #4] @ 4-byte Spill
8054; CHECK-THUMB7-NEXT:    eors r2, r1
8055; CHECK-THUMB7-NEXT:    orrs r2, r3
8056; CHECK-THUMB7-NEXT:    cmp r2, #0
8057; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8058; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8059; CHECK-THUMB7-NEXT:    bne .LBB38_1
8060; CHECK-THUMB7-NEXT:    b .LBB38_5
8061; CHECK-THUMB7-NEXT:  .LBB38_5: @ %atomicrmw.end
8062; CHECK-THUMB7-NEXT:    ldr r1, [sp] @ 4-byte Reload
8063; CHECK-THUMB7-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
8064; CHECK-THUMB7-NEXT:    add sp, #16
8065; CHECK-THUMB7-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11, pc}
8066;
8067; CHECK-THUMB6-LABEL: test_or_i64:
8068; CHECK-THUMB6:       @ %bb.0: @ %entry
8069; CHECK-THUMB6-NEXT:    .save {r7, lr}
8070; CHECK-THUMB6-NEXT:    push {r7, lr}
8071; CHECK-THUMB6-NEXT:    ldr r0, .LCPI38_0
8072; CHECK-THUMB6-NEXT:    movs r2, #1
8073; CHECK-THUMB6-NEXT:    movs r3, #0
8074; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_or_8
8075; CHECK-THUMB6-NEXT:    pop {r7, pc}
8076; CHECK-THUMB6-NEXT:    .p2align 2
8077; CHECK-THUMB6-NEXT:  @ %bb.1:
8078; CHECK-THUMB6-NEXT:  .LCPI38_0:
8079; CHECK-THUMB6-NEXT:    .long atomic_i64
8080;
8081; CHECK-THUMB8BASE-LABEL: test_or_i64:
8082; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
8083; CHECK-THUMB8BASE-NEXT:    .save {r7, lr}
8084; CHECK-THUMB8BASE-NEXT:    push {r7, lr}
8085; CHECK-THUMB8BASE-NEXT:    .pad #8
8086; CHECK-THUMB8BASE-NEXT:    sub sp, #8
8087; CHECK-THUMB8BASE-NEXT:    movs r3, #0
8088; CHECK-THUMB8BASE-NEXT:    str r3, [sp]
8089; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i64
8090; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i64
8091; CHECK-THUMB8BASE-NEXT:    movs r2, #1
8092; CHECK-THUMB8BASE-NEXT:    bl __atomic_fetch_or_8
8093; CHECK-THUMB8BASE-NEXT:    add sp, #8
8094; CHECK-THUMB8BASE-NEXT:    pop {r7, pc}
8095entry:
8096  %0 = atomicrmw or ptr @atomic_i64, i64 1 monotonic
8097  ret i64 %0
8098}
8099define i64 @test_xor_i64() {
8100; CHECK-ARM8-LABEL: test_xor_i64:
8101; CHECK-ARM8:       @ %bb.0: @ %entry
8102; CHECK-ARM8-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
8103; CHECK-ARM8-NEXT:    push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
8104; CHECK-ARM8-NEXT:    .pad #16
8105; CHECK-ARM8-NEXT:    sub sp, sp, #16
8106; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i64
8107; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i64
8108; CHECK-ARM8-NEXT:    ldr r1, [r0]
8109; CHECK-ARM8-NEXT:    ldr r0, [r0, #4]
8110; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8111; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8112; CHECK-ARM8-NEXT:    b .LBB39_1
8113; CHECK-ARM8-NEXT:  .LBB39_1: @ %atomicrmw.start
8114; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
8115; CHECK-ARM8-NEXT:    @ Child Loop BB39_2 Depth 2
8116; CHECK-ARM8-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
8117; CHECK-ARM8-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
8118; CHECK-ARM8-NEXT:    eor r10, r2, #1
8119; CHECK-ARM8-NEXT:    @ kill: def $r10 killed $r10 def $r10_r11
8120; CHECK-ARM8-NEXT:    mov r11, r1
8121; CHECK-ARM8-NEXT:    mov r8, r2
8122; CHECK-ARM8-NEXT:    mov r9, r1
8123; CHECK-ARM8-NEXT:    movw r6, :lower16:atomic_i64
8124; CHECK-ARM8-NEXT:    movt r6, :upper16:atomic_i64
8125; CHECK-ARM8-NEXT:    @ implicit-def: $r0
8126; CHECK-ARM8-NEXT:    @ implicit-def: $r3
8127; CHECK-ARM8-NEXT:    @ kill: def $r6 killed $r6 def $r6_r7
8128; CHECK-ARM8-NEXT:    mov r7, r0
8129; CHECK-ARM8-NEXT:  .LBB39_2: @ %atomicrmw.start
8130; CHECK-ARM8-NEXT:    @ Parent Loop BB39_1 Depth=1
8131; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
8132; CHECK-ARM8-NEXT:    ldrexd r4, r5, [r6]
8133; CHECK-ARM8-NEXT:    cmp r4, r8
8134; CHECK-ARM8-NEXT:    cmpeq r5, r9
8135; CHECK-ARM8-NEXT:    bne .LBB39_4
8136; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
8137; CHECK-ARM8-NEXT:    @ in Loop: Header=BB39_2 Depth=2
8138; CHECK-ARM8-NEXT:    strexd r7, r10, r11, [r6]
8139; CHECK-ARM8-NEXT:    cmp r7, #0
8140; CHECK-ARM8-NEXT:    bne .LBB39_2
8141; CHECK-ARM8-NEXT:  .LBB39_4: @ %atomicrmw.start
8142; CHECK-ARM8-NEXT:    @ in Loop: Header=BB39_1 Depth=1
8143; CHECK-ARM8-NEXT:    mov r0, r5
8144; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
8145; CHECK-ARM8-NEXT:    eor r3, r0, r1
8146; CHECK-ARM8-NEXT:    mov r1, r4
8147; CHECK-ARM8-NEXT:    str r1, [sp, #4] @ 4-byte Spill
8148; CHECK-ARM8-NEXT:    eor r2, r1, r2
8149; CHECK-ARM8-NEXT:    orr r2, r2, r3
8150; CHECK-ARM8-NEXT:    cmp r2, #0
8151; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8152; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8153; CHECK-ARM8-NEXT:    bne .LBB39_1
8154; CHECK-ARM8-NEXT:    b .LBB39_5
8155; CHECK-ARM8-NEXT:  .LBB39_5: @ %atomicrmw.end
8156; CHECK-ARM8-NEXT:    ldr r1, [sp] @ 4-byte Reload
8157; CHECK-ARM8-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
8158; CHECK-ARM8-NEXT:    add sp, sp, #16
8159; CHECK-ARM8-NEXT:    pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
8160;
8161; CHECK-ARM6-LABEL: test_xor_i64:
8162; CHECK-ARM6:       @ %bb.0: @ %entry
8163; CHECK-ARM6-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
8164; CHECK-ARM6-NEXT:    push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
8165; CHECK-ARM6-NEXT:    .pad #16
8166; CHECK-ARM6-NEXT:    sub sp, sp, #16
8167; CHECK-ARM6-NEXT:    ldr r0, .LCPI39_0
8168; CHECK-ARM6-NEXT:    ldr r1, [r0]
8169; CHECK-ARM6-NEXT:    ldr r0, [r0, #4]
8170; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8171; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8172; CHECK-ARM6-NEXT:    b .LBB39_1
8173; CHECK-ARM6-NEXT:  .LBB39_1: @ %atomicrmw.start
8174; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
8175; CHECK-ARM6-NEXT:    @ Child Loop BB39_2 Depth 2
8176; CHECK-ARM6-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
8177; CHECK-ARM6-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
8178; CHECK-ARM6-NEXT:    eor r10, r2, #1
8179; CHECK-ARM6-NEXT:    @ kill: def $r10 killed $r10 def $r10_r11
8180; CHECK-ARM6-NEXT:    mov r11, r1
8181; CHECK-ARM6-NEXT:    mov r8, r2
8182; CHECK-ARM6-NEXT:    mov r9, r1
8183; CHECK-ARM6-NEXT:    ldr r6, .LCPI39_0
8184; CHECK-ARM6-NEXT:    @ implicit-def: $r0
8185; CHECK-ARM6-NEXT:    @ implicit-def: $r3
8186; CHECK-ARM6-NEXT:    @ kill: def $r6 killed $r6 def $r6_r7
8187; CHECK-ARM6-NEXT:    mov r7, r0
8188; CHECK-ARM6-NEXT:  .LBB39_2: @ %atomicrmw.start
8189; CHECK-ARM6-NEXT:    @ Parent Loop BB39_1 Depth=1
8190; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
8191; CHECK-ARM6-NEXT:    ldrexd r4, r5, [r6]
8192; CHECK-ARM6-NEXT:    cmp r4, r8
8193; CHECK-ARM6-NEXT:    cmpeq r5, r9
8194; CHECK-ARM6-NEXT:    bne .LBB39_4
8195; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
8196; CHECK-ARM6-NEXT:    @ in Loop: Header=BB39_2 Depth=2
8197; CHECK-ARM6-NEXT:    strexd r7, r10, r11, [r6]
8198; CHECK-ARM6-NEXT:    cmp r7, #0
8199; CHECK-ARM6-NEXT:    bne .LBB39_2
8200; CHECK-ARM6-NEXT:  .LBB39_4: @ %atomicrmw.start
8201; CHECK-ARM6-NEXT:    @ in Loop: Header=BB39_1 Depth=1
8202; CHECK-ARM6-NEXT:    mov r0, r5
8203; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
8204; CHECK-ARM6-NEXT:    eor r3, r0, r1
8205; CHECK-ARM6-NEXT:    mov r1, r4
8206; CHECK-ARM6-NEXT:    str r1, [sp, #4] @ 4-byte Spill
8207; CHECK-ARM6-NEXT:    eor r2, r1, r2
8208; CHECK-ARM6-NEXT:    orr r2, r2, r3
8209; CHECK-ARM6-NEXT:    cmp r2, #0
8210; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8211; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8212; CHECK-ARM6-NEXT:    bne .LBB39_1
8213; CHECK-ARM6-NEXT:    b .LBB39_5
8214; CHECK-ARM6-NEXT:  .LBB39_5: @ %atomicrmw.end
8215; CHECK-ARM6-NEXT:    ldr r1, [sp] @ 4-byte Reload
8216; CHECK-ARM6-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
8217; CHECK-ARM6-NEXT:    add sp, sp, #16
8218; CHECK-ARM6-NEXT:    pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
8219; CHECK-ARM6-NEXT:    .p2align 2
8220; CHECK-ARM6-NEXT:  @ %bb.6:
8221; CHECK-ARM6-NEXT:  .LCPI39_0:
8222; CHECK-ARM6-NEXT:    .long atomic_i64
8223;
8224; CHECK-THUMB7-LABEL: test_xor_i64:
8225; CHECK-THUMB7:       @ %bb.0: @ %entry
8226; CHECK-THUMB7-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
8227; CHECK-THUMB7-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11, lr}
8228; CHECK-THUMB7-NEXT:    .pad #16
8229; CHECK-THUMB7-NEXT:    sub sp, #16
8230; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i64
8231; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i64
8232; CHECK-THUMB7-NEXT:    ldr r1, [r0]
8233; CHECK-THUMB7-NEXT:    ldr r0, [r0, #4]
8234; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8235; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8236; CHECK-THUMB7-NEXT:    b .LBB39_1
8237; CHECK-THUMB7-NEXT:  .LBB39_1: @ %atomicrmw.start
8238; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
8239; CHECK-THUMB7-NEXT:    @ Child Loop BB39_2 Depth 2
8240; CHECK-THUMB7-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
8241; CHECK-THUMB7-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
8242; CHECK-THUMB7-NEXT:    eor r10, r2, #1
8243; CHECK-THUMB7-NEXT:    @ kill: def $r10 killed $r10 def $r10_r11
8244; CHECK-THUMB7-NEXT:    mov r11, r1
8245; CHECK-THUMB7-NEXT:    mov r8, r2
8246; CHECK-THUMB7-NEXT:    mov r9, r1
8247; CHECK-THUMB7-NEXT:    movw r6, :lower16:atomic_i64
8248; CHECK-THUMB7-NEXT:    movt r6, :upper16:atomic_i64
8249; CHECK-THUMB7-NEXT:    @ implicit-def: $r0
8250; CHECK-THUMB7-NEXT:    @ implicit-def: $r3
8251; CHECK-THUMB7-NEXT:    @ kill: def $r6 killed $r6 def $r6_r7
8252; CHECK-THUMB7-NEXT:    mov r7, r0
8253; CHECK-THUMB7-NEXT:  .LBB39_2: @ %atomicrmw.start
8254; CHECK-THUMB7-NEXT:    @ Parent Loop BB39_1 Depth=1
8255; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
8256; CHECK-THUMB7-NEXT:    ldrexd r4, r5, [r6]
8257; CHECK-THUMB7-NEXT:    cmp r4, r8
8258; CHECK-THUMB7-NEXT:    it eq
8259; CHECK-THUMB7-NEXT:    cmpeq r5, r9
8260; CHECK-THUMB7-NEXT:    bne .LBB39_4
8261; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
8262; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB39_2 Depth=2
8263; CHECK-THUMB7-NEXT:    strexd r7, r10, r11, [r6]
8264; CHECK-THUMB7-NEXT:    cmp r7, #0
8265; CHECK-THUMB7-NEXT:    bne .LBB39_2
8266; CHECK-THUMB7-NEXT:  .LBB39_4: @ %atomicrmw.start
8267; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB39_1 Depth=1
8268; CHECK-THUMB7-NEXT:    mov r0, r5
8269; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
8270; CHECK-THUMB7-NEXT:    eor.w r3, r0, r1
8271; CHECK-THUMB7-NEXT:    mov r1, r4
8272; CHECK-THUMB7-NEXT:    str r1, [sp, #4] @ 4-byte Spill
8273; CHECK-THUMB7-NEXT:    eors r2, r1
8274; CHECK-THUMB7-NEXT:    orrs r2, r3
8275; CHECK-THUMB7-NEXT:    cmp r2, #0
8276; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8277; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8278; CHECK-THUMB7-NEXT:    bne .LBB39_1
8279; CHECK-THUMB7-NEXT:    b .LBB39_5
8280; CHECK-THUMB7-NEXT:  .LBB39_5: @ %atomicrmw.end
8281; CHECK-THUMB7-NEXT:    ldr r1, [sp] @ 4-byte Reload
8282; CHECK-THUMB7-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
8283; CHECK-THUMB7-NEXT:    add sp, #16
8284; CHECK-THUMB7-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11, pc}
8285;
8286; CHECK-THUMB6-LABEL: test_xor_i64:
8287; CHECK-THUMB6:       @ %bb.0: @ %entry
8288; CHECK-THUMB6-NEXT:    .save {r7, lr}
8289; CHECK-THUMB6-NEXT:    push {r7, lr}
8290; CHECK-THUMB6-NEXT:    ldr r0, .LCPI39_0
8291; CHECK-THUMB6-NEXT:    movs r2, #1
8292; CHECK-THUMB6-NEXT:    movs r3, #0
8293; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_xor_8
8294; CHECK-THUMB6-NEXT:    pop {r7, pc}
8295; CHECK-THUMB6-NEXT:    .p2align 2
8296; CHECK-THUMB6-NEXT:  @ %bb.1:
8297; CHECK-THUMB6-NEXT:  .LCPI39_0:
8298; CHECK-THUMB6-NEXT:    .long atomic_i64
8299;
8300; CHECK-THUMB8BASE-LABEL: test_xor_i64:
8301; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
8302; CHECK-THUMB8BASE-NEXT:    .save {r7, lr}
8303; CHECK-THUMB8BASE-NEXT:    push {r7, lr}
8304; CHECK-THUMB8BASE-NEXT:    .pad #8
8305; CHECK-THUMB8BASE-NEXT:    sub sp, #8
8306; CHECK-THUMB8BASE-NEXT:    movs r3, #0
8307; CHECK-THUMB8BASE-NEXT:    str r3, [sp]
8308; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i64
8309; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i64
8310; CHECK-THUMB8BASE-NEXT:    movs r2, #1
8311; CHECK-THUMB8BASE-NEXT:    bl __atomic_fetch_xor_8
8312; CHECK-THUMB8BASE-NEXT:    add sp, #8
8313; CHECK-THUMB8BASE-NEXT:    pop {r7, pc}
8314entry:
8315  %0 = atomicrmw xor ptr @atomic_i64, i64 1 monotonic
8316  ret i64 %0
8317}
8318
8319define i64 @test_max_i64() {
8320; CHECK-ARM8-LABEL: test_max_i64:
8321; CHECK-ARM8:       @ %bb.0: @ %entry
8322; CHECK-ARM8-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
8323; CHECK-ARM8-NEXT:    push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
8324; CHECK-ARM8-NEXT:    .pad #16
8325; CHECK-ARM8-NEXT:    sub sp, sp, #16
8326; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i64
8327; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i64
8328; CHECK-ARM8-NEXT:    ldr r1, [r0]
8329; CHECK-ARM8-NEXT:    ldr r0, [r0, #4]
8330; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8331; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8332; CHECK-ARM8-NEXT:    b .LBB40_1
8333; CHECK-ARM8-NEXT:  .LBB40_1: @ %atomicrmw.start
8334; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
8335; CHECK-ARM8-NEXT:    @ Child Loop BB40_2 Depth 2
8336; CHECK-ARM8-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
8337; CHECK-ARM8-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
8338; CHECK-ARM8-NEXT:    mov r8, r2
8339; CHECK-ARM8-NEXT:    mov r9, r1
8340; CHECK-ARM8-NEXT:    rsbs r0, r2, #1
8341; CHECK-ARM8-NEXT:    rscs r0, r1, #0
8342; CHECK-ARM8-NEXT:    mov r0, #0
8343; CHECK-ARM8-NEXT:    movwlt r0, #1
8344; CHECK-ARM8-NEXT:    mov r10, #1
8345; CHECK-ARM8-NEXT:    movlt r10, r2
8346; CHECK-ARM8-NEXT:    cmp r0, #0
8347; CHECK-ARM8-NEXT:    movne r0, r1
8348; CHECK-ARM8-NEXT:    @ kill: def $r10 killed $r10 def $r10_r11
8349; CHECK-ARM8-NEXT:    mov r11, r0
8350; CHECK-ARM8-NEXT:    movw r6, :lower16:atomic_i64
8351; CHECK-ARM8-NEXT:    movt r6, :upper16:atomic_i64
8352; CHECK-ARM8-NEXT:    @ implicit-def: $r0
8353; CHECK-ARM8-NEXT:    @ implicit-def: $r3
8354; CHECK-ARM8-NEXT:    @ kill: def $r6 killed $r6 def $r6_r7
8355; CHECK-ARM8-NEXT:    mov r7, r0
8356; CHECK-ARM8-NEXT:  .LBB40_2: @ %atomicrmw.start
8357; CHECK-ARM8-NEXT:    @ Parent Loop BB40_1 Depth=1
8358; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
8359; CHECK-ARM8-NEXT:    ldrexd r4, r5, [r6]
8360; CHECK-ARM8-NEXT:    cmp r4, r8
8361; CHECK-ARM8-NEXT:    cmpeq r5, r9
8362; CHECK-ARM8-NEXT:    bne .LBB40_4
8363; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
8364; CHECK-ARM8-NEXT:    @ in Loop: Header=BB40_2 Depth=2
8365; CHECK-ARM8-NEXT:    strexd r7, r10, r11, [r6]
8366; CHECK-ARM8-NEXT:    cmp r7, #0
8367; CHECK-ARM8-NEXT:    bne .LBB40_2
8368; CHECK-ARM8-NEXT:  .LBB40_4: @ %atomicrmw.start
8369; CHECK-ARM8-NEXT:    @ in Loop: Header=BB40_1 Depth=1
8370; CHECK-ARM8-NEXT:    mov r0, r5
8371; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
8372; CHECK-ARM8-NEXT:    eor r3, r0, r1
8373; CHECK-ARM8-NEXT:    mov r1, r4
8374; CHECK-ARM8-NEXT:    str r1, [sp, #4] @ 4-byte Spill
8375; CHECK-ARM8-NEXT:    eor r2, r1, r2
8376; CHECK-ARM8-NEXT:    orr r2, r2, r3
8377; CHECK-ARM8-NEXT:    cmp r2, #0
8378; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8379; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8380; CHECK-ARM8-NEXT:    bne .LBB40_1
8381; CHECK-ARM8-NEXT:    b .LBB40_5
8382; CHECK-ARM8-NEXT:  .LBB40_5: @ %atomicrmw.end
8383; CHECK-ARM8-NEXT:    ldr r1, [sp] @ 4-byte Reload
8384; CHECK-ARM8-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
8385; CHECK-ARM8-NEXT:    add sp, sp, #16
8386; CHECK-ARM8-NEXT:    pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
8387;
8388; CHECK-ARM6-LABEL: test_max_i64:
8389; CHECK-ARM6:       @ %bb.0: @ %entry
8390; CHECK-ARM6-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
8391; CHECK-ARM6-NEXT:    push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
8392; CHECK-ARM6-NEXT:    .pad #16
8393; CHECK-ARM6-NEXT:    sub sp, sp, #16
8394; CHECK-ARM6-NEXT:    ldr r0, .LCPI40_0
8395; CHECK-ARM6-NEXT:    ldr r1, [r0]
8396; CHECK-ARM6-NEXT:    ldr r0, [r0, #4]
8397; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8398; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8399; CHECK-ARM6-NEXT:    b .LBB40_1
8400; CHECK-ARM6-NEXT:  .LBB40_1: @ %atomicrmw.start
8401; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
8402; CHECK-ARM6-NEXT:    @ Child Loop BB40_2 Depth 2
8403; CHECK-ARM6-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
8404; CHECK-ARM6-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
8405; CHECK-ARM6-NEXT:    mov r8, r2
8406; CHECK-ARM6-NEXT:    mov r9, r1
8407; CHECK-ARM6-NEXT:    rsbs r0, r2, #1
8408; CHECK-ARM6-NEXT:    rscs r0, r1, #0
8409; CHECK-ARM6-NEXT:    mov r0, #0
8410; CHECK-ARM6-NEXT:    movlt r0, #1
8411; CHECK-ARM6-NEXT:    mov r10, #1
8412; CHECK-ARM6-NEXT:    movlt r10, r2
8413; CHECK-ARM6-NEXT:    cmp r0, #0
8414; CHECK-ARM6-NEXT:    movne r0, r1
8415; CHECK-ARM6-NEXT:    @ kill: def $r10 killed $r10 def $r10_r11
8416; CHECK-ARM6-NEXT:    mov r11, r0
8417; CHECK-ARM6-NEXT:    ldr r6, .LCPI40_0
8418; CHECK-ARM6-NEXT:    @ implicit-def: $r0
8419; CHECK-ARM6-NEXT:    @ implicit-def: $r3
8420; CHECK-ARM6-NEXT:    @ kill: def $r6 killed $r6 def $r6_r7
8421; CHECK-ARM6-NEXT:    mov r7, r0
8422; CHECK-ARM6-NEXT:  .LBB40_2: @ %atomicrmw.start
8423; CHECK-ARM6-NEXT:    @ Parent Loop BB40_1 Depth=1
8424; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
8425; CHECK-ARM6-NEXT:    ldrexd r4, r5, [r6]
8426; CHECK-ARM6-NEXT:    cmp r4, r8
8427; CHECK-ARM6-NEXT:    cmpeq r5, r9
8428; CHECK-ARM6-NEXT:    bne .LBB40_4
8429; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
8430; CHECK-ARM6-NEXT:    @ in Loop: Header=BB40_2 Depth=2
8431; CHECK-ARM6-NEXT:    strexd r7, r10, r11, [r6]
8432; CHECK-ARM6-NEXT:    cmp r7, #0
8433; CHECK-ARM6-NEXT:    bne .LBB40_2
8434; CHECK-ARM6-NEXT:  .LBB40_4: @ %atomicrmw.start
8435; CHECK-ARM6-NEXT:    @ in Loop: Header=BB40_1 Depth=1
8436; CHECK-ARM6-NEXT:    mov r0, r5
8437; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
8438; CHECK-ARM6-NEXT:    eor r3, r0, r1
8439; CHECK-ARM6-NEXT:    mov r1, r4
8440; CHECK-ARM6-NEXT:    str r1, [sp, #4] @ 4-byte Spill
8441; CHECK-ARM6-NEXT:    eor r2, r1, r2
8442; CHECK-ARM6-NEXT:    orr r2, r2, r3
8443; CHECK-ARM6-NEXT:    cmp r2, #0
8444; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8445; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8446; CHECK-ARM6-NEXT:    bne .LBB40_1
8447; CHECK-ARM6-NEXT:    b .LBB40_5
8448; CHECK-ARM6-NEXT:  .LBB40_5: @ %atomicrmw.end
8449; CHECK-ARM6-NEXT:    ldr r1, [sp] @ 4-byte Reload
8450; CHECK-ARM6-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
8451; CHECK-ARM6-NEXT:    add sp, sp, #16
8452; CHECK-ARM6-NEXT:    pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
8453; CHECK-ARM6-NEXT:    .p2align 2
8454; CHECK-ARM6-NEXT:  @ %bb.6:
8455; CHECK-ARM6-NEXT:  .LCPI40_0:
8456; CHECK-ARM6-NEXT:    .long atomic_i64
8457;
8458; CHECK-THUMB7-LABEL: test_max_i64:
8459; CHECK-THUMB7:       @ %bb.0: @ %entry
8460; CHECK-THUMB7-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
8461; CHECK-THUMB7-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11, lr}
8462; CHECK-THUMB7-NEXT:    .pad #16
8463; CHECK-THUMB7-NEXT:    sub sp, #16
8464; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i64
8465; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i64
8466; CHECK-THUMB7-NEXT:    ldr r1, [r0]
8467; CHECK-THUMB7-NEXT:    ldr r0, [r0, #4]
8468; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8469; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8470; CHECK-THUMB7-NEXT:    b .LBB40_1
8471; CHECK-THUMB7-NEXT:  .LBB40_1: @ %atomicrmw.start
8472; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
8473; CHECK-THUMB7-NEXT:    @ Child Loop BB40_2 Depth 2
8474; CHECK-THUMB7-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
8475; CHECK-THUMB7-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
8476; CHECK-THUMB7-NEXT:    rsbs.w r0, r2, #1
8477; CHECK-THUMB7-NEXT:    mov.w r0, #0
8478; CHECK-THUMB7-NEXT:    sbcs.w r3, r0, r1
8479; CHECK-THUMB7-NEXT:    it lt
8480; CHECK-THUMB7-NEXT:    movlt r0, #1
8481; CHECK-THUMB7-NEXT:    mov r8, r2
8482; CHECK-THUMB7-NEXT:    mov r9, r1
8483; CHECK-THUMB7-NEXT:    mov.w r10, #1
8484; CHECK-THUMB7-NEXT:    it lt
8485; CHECK-THUMB7-NEXT:    movlt r10, r2
8486; CHECK-THUMB7-NEXT:    cmp r0, #0
8487; CHECK-THUMB7-NEXT:    it ne
8488; CHECK-THUMB7-NEXT:    movne r0, r1
8489; CHECK-THUMB7-NEXT:    @ kill: def $r10 killed $r10 def $r10_r11
8490; CHECK-THUMB7-NEXT:    mov r11, r0
8491; CHECK-THUMB7-NEXT:    movw r6, :lower16:atomic_i64
8492; CHECK-THUMB7-NEXT:    movt r6, :upper16:atomic_i64
8493; CHECK-THUMB7-NEXT:    @ implicit-def: $r0
8494; CHECK-THUMB7-NEXT:    @ implicit-def: $r3
8495; CHECK-THUMB7-NEXT:    @ kill: def $r6 killed $r6 def $r6_r7
8496; CHECK-THUMB7-NEXT:    mov r7, r0
8497; CHECK-THUMB7-NEXT:  .LBB40_2: @ %atomicrmw.start
8498; CHECK-THUMB7-NEXT:    @ Parent Loop BB40_1 Depth=1
8499; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
8500; CHECK-THUMB7-NEXT:    ldrexd r4, r5, [r6]
8501; CHECK-THUMB7-NEXT:    cmp r4, r8
8502; CHECK-THUMB7-NEXT:    it eq
8503; CHECK-THUMB7-NEXT:    cmpeq r5, r9
8504; CHECK-THUMB7-NEXT:    bne .LBB40_4
8505; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
8506; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB40_2 Depth=2
8507; CHECK-THUMB7-NEXT:    strexd r7, r10, r11, [r6]
8508; CHECK-THUMB7-NEXT:    cmp r7, #0
8509; CHECK-THUMB7-NEXT:    bne .LBB40_2
8510; CHECK-THUMB7-NEXT:  .LBB40_4: @ %atomicrmw.start
8511; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB40_1 Depth=1
8512; CHECK-THUMB7-NEXT:    mov r0, r5
8513; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
8514; CHECK-THUMB7-NEXT:    eor.w r3, r0, r1
8515; CHECK-THUMB7-NEXT:    mov r1, r4
8516; CHECK-THUMB7-NEXT:    str r1, [sp, #4] @ 4-byte Spill
8517; CHECK-THUMB7-NEXT:    eors r2, r1
8518; CHECK-THUMB7-NEXT:    orrs r2, r3
8519; CHECK-THUMB7-NEXT:    cmp r2, #0
8520; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8521; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8522; CHECK-THUMB7-NEXT:    bne .LBB40_1
8523; CHECK-THUMB7-NEXT:    b .LBB40_5
8524; CHECK-THUMB7-NEXT:  .LBB40_5: @ %atomicrmw.end
8525; CHECK-THUMB7-NEXT:    ldr r1, [sp] @ 4-byte Reload
8526; CHECK-THUMB7-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
8527; CHECK-THUMB7-NEXT:    add sp, #16
8528; CHECK-THUMB7-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11, pc}
8529;
8530; CHECK-THUMB6-LABEL: test_max_i64:
8531; CHECK-THUMB6:       @ %bb.0: @ %entry
8532; CHECK-THUMB6-NEXT:    .save {r7, lr}
8533; CHECK-THUMB6-NEXT:    push {r7, lr}
8534; CHECK-THUMB6-NEXT:    ldr r0, .LCPI40_0
8535; CHECK-THUMB6-NEXT:    movs r2, #1
8536; CHECK-THUMB6-NEXT:    movs r3, #0
8537; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_max_8
8538; CHECK-THUMB6-NEXT:    pop {r7, pc}
8539; CHECK-THUMB6-NEXT:    .p2align 2
8540; CHECK-THUMB6-NEXT:  @ %bb.1:
8541; CHECK-THUMB6-NEXT:  .LCPI40_0:
8542; CHECK-THUMB6-NEXT:    .long atomic_i64
8543;
8544; CHECK-THUMB8BASE-LABEL: test_max_i64:
8545; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
8546; CHECK-THUMB8BASE-NEXT:    .save {r4, lr}
8547; CHECK-THUMB8BASE-NEXT:    push {r4, lr}
8548; CHECK-THUMB8BASE-NEXT:    .pad #72
8549; CHECK-THUMB8BASE-NEXT:    sub sp, #72
8550; CHECK-THUMB8BASE-NEXT:    movw r1, :lower16:atomic_i64
8551; CHECK-THUMB8BASE-NEXT:    movt r1, :upper16:atomic_i64
8552; CHECK-THUMB8BASE-NEXT:    ldr r0, [r1, #4]
8553; CHECK-THUMB8BASE-NEXT:    ldr r1, [r1]
8554; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #56] @ 4-byte Spill
8555; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #60] @ 4-byte Spill
8556; CHECK-THUMB8BASE-NEXT:    b .LBB40_1
8557; CHECK-THUMB8BASE-NEXT:  .LBB40_1: @ %atomicrmw.start
8558; CHECK-THUMB8BASE-NEXT:    @ =>This Inner Loop Header: Depth=1
8559; CHECK-THUMB8BASE-NEXT:    ldr r3, [sp, #56] @ 4-byte Reload
8560; CHECK-THUMB8BASE-NEXT:    ldr r2, [sp, #60] @ 4-byte Reload
8561; CHECK-THUMB8BASE-NEXT:    str r2, [sp, #36] @ 4-byte Spill
8562; CHECK-THUMB8BASE-NEXT:    str r3, [sp, #40] @ 4-byte Spill
8563; CHECK-THUMB8BASE-NEXT:    movs r1, #0
8564; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #44] @ 4-byte Spill
8565; CHECK-THUMB8BASE-NEXT:    movs r0, #1
8566; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #48] @ 4-byte Spill
8567; CHECK-THUMB8BASE-NEXT:    subs r3, r0, r3
8568; CHECK-THUMB8BASE-NEXT:    sbcs r1, r2
8569; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #52] @ 4-byte Spill
8570; CHECK-THUMB8BASE-NEXT:    blt .LBB40_3
8571; CHECK-THUMB8BASE-NEXT:  @ %bb.2: @ %atomicrmw.start
8572; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB40_1 Depth=1
8573; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #44] @ 4-byte Reload
8574; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #52] @ 4-byte Spill
8575; CHECK-THUMB8BASE-NEXT:  .LBB40_3: @ %atomicrmw.start
8576; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB40_1 Depth=1
8577; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #40] @ 4-byte Reload
8578; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #52] @ 4-byte Reload
8579; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #28] @ 4-byte Spill
8580; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #32] @ 4-byte Spill
8581; CHECK-THUMB8BASE-NEXT:    blt .LBB40_5
8582; CHECK-THUMB8BASE-NEXT:  @ %bb.4: @ %atomicrmw.start
8583; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB40_1 Depth=1
8584; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #48] @ 4-byte Reload
8585; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #32] @ 4-byte Spill
8586; CHECK-THUMB8BASE-NEXT:  .LBB40_5: @ %atomicrmw.start
8587; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB40_1 Depth=1
8588; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #36] @ 4-byte Reload
8589; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #28] @ 4-byte Reload
8590; CHECK-THUMB8BASE-NEXT:    ldr r2, [sp, #32] @ 4-byte Reload
8591; CHECK-THUMB8BASE-NEXT:    str r2, [sp, #20] @ 4-byte Spill
8592; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #24] @ 4-byte Spill
8593; CHECK-THUMB8BASE-NEXT:    cbnz r1, .LBB40_7
8594; CHECK-THUMB8BASE-NEXT:  @ %bb.6: @ %atomicrmw.start
8595; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB40_1 Depth=1
8596; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #28] @ 4-byte Reload
8597; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #24] @ 4-byte Spill
8598; CHECK-THUMB8BASE-NEXT:  .LBB40_7: @ %atomicrmw.start
8599; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB40_1 Depth=1
8600; CHECK-THUMB8BASE-NEXT:    ldr r2, [sp, #20] @ 4-byte Reload
8601; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #44] @ 4-byte Reload
8602; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #36] @ 4-byte Reload
8603; CHECK-THUMB8BASE-NEXT:    ldr r4, [sp, #40] @ 4-byte Reload
8604; CHECK-THUMB8BASE-NEXT:    ldr r3, [sp, #24] @ 4-byte Reload
8605; CHECK-THUMB8BASE-NEXT:    str r4, [sp, #64]
8606; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #68]
8607; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4]
8608; CHECK-THUMB8BASE-NEXT:    str r0, [sp]
8609; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i64
8610; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i64
8611; CHECK-THUMB8BASE-NEXT:    add r1, sp, #64
8612; CHECK-THUMB8BASE-NEXT:    bl __atomic_compare_exchange_8
8613; CHECK-THUMB8BASE-NEXT:    mov r2, r0
8614; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #68]
8615; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8616; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #64]
8617; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #16] @ 4-byte Spill
8618; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
8619; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #56] @ 4-byte Spill
8620; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #60] @ 4-byte Spill
8621; CHECK-THUMB8BASE-NEXT:    beq .LBB40_1
8622; CHECK-THUMB8BASE-NEXT:    b .LBB40_8
8623; CHECK-THUMB8BASE-NEXT:  .LBB40_8: @ %atomicrmw.end
8624; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
8625; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #16] @ 4-byte Reload
8626; CHECK-THUMB8BASE-NEXT:    add sp, #72
8627; CHECK-THUMB8BASE-NEXT:    pop {r4, pc}
8628entry:
8629  %0 = atomicrmw max ptr @atomic_i64, i64 1 monotonic
8630  ret i64 %0
8631}
8632define i64 @test_min_i64() {
8633; CHECK-ARM8-LABEL: test_min_i64:
8634; CHECK-ARM8:       @ %bb.0: @ %entry
8635; CHECK-ARM8-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
8636; CHECK-ARM8-NEXT:    push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
8637; CHECK-ARM8-NEXT:    .pad #16
8638; CHECK-ARM8-NEXT:    sub sp, sp, #16
8639; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i64
8640; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i64
8641; CHECK-ARM8-NEXT:    ldr r1, [r0]
8642; CHECK-ARM8-NEXT:    ldr r0, [r0, #4]
8643; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8644; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8645; CHECK-ARM8-NEXT:    b .LBB41_1
8646; CHECK-ARM8-NEXT:  .LBB41_1: @ %atomicrmw.start
8647; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
8648; CHECK-ARM8-NEXT:    @ Child Loop BB41_2 Depth 2
8649; CHECK-ARM8-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
8650; CHECK-ARM8-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
8651; CHECK-ARM8-NEXT:    mov r8, r2
8652; CHECK-ARM8-NEXT:    mov r9, r1
8653; CHECK-ARM8-NEXT:    subs r0, r2, #2
8654; CHECK-ARM8-NEXT:    sbcs r0, r1, #0
8655; CHECK-ARM8-NEXT:    mov r0, #0
8656; CHECK-ARM8-NEXT:    movwlt r0, #1
8657; CHECK-ARM8-NEXT:    mov r10, #1
8658; CHECK-ARM8-NEXT:    movlt r10, r2
8659; CHECK-ARM8-NEXT:    cmp r0, #0
8660; CHECK-ARM8-NEXT:    movne r0, r1
8661; CHECK-ARM8-NEXT:    @ kill: def $r10 killed $r10 def $r10_r11
8662; CHECK-ARM8-NEXT:    mov r11, r0
8663; CHECK-ARM8-NEXT:    movw r6, :lower16:atomic_i64
8664; CHECK-ARM8-NEXT:    movt r6, :upper16:atomic_i64
8665; CHECK-ARM8-NEXT:    @ implicit-def: $r0
8666; CHECK-ARM8-NEXT:    @ implicit-def: $r3
8667; CHECK-ARM8-NEXT:    @ kill: def $r6 killed $r6 def $r6_r7
8668; CHECK-ARM8-NEXT:    mov r7, r0
8669; CHECK-ARM8-NEXT:  .LBB41_2: @ %atomicrmw.start
8670; CHECK-ARM8-NEXT:    @ Parent Loop BB41_1 Depth=1
8671; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
8672; CHECK-ARM8-NEXT:    ldrexd r4, r5, [r6]
8673; CHECK-ARM8-NEXT:    cmp r4, r8
8674; CHECK-ARM8-NEXT:    cmpeq r5, r9
8675; CHECK-ARM8-NEXT:    bne .LBB41_4
8676; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
8677; CHECK-ARM8-NEXT:    @ in Loop: Header=BB41_2 Depth=2
8678; CHECK-ARM8-NEXT:    strexd r7, r10, r11, [r6]
8679; CHECK-ARM8-NEXT:    cmp r7, #0
8680; CHECK-ARM8-NEXT:    bne .LBB41_2
8681; CHECK-ARM8-NEXT:  .LBB41_4: @ %atomicrmw.start
8682; CHECK-ARM8-NEXT:    @ in Loop: Header=BB41_1 Depth=1
8683; CHECK-ARM8-NEXT:    mov r0, r5
8684; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
8685; CHECK-ARM8-NEXT:    eor r3, r0, r1
8686; CHECK-ARM8-NEXT:    mov r1, r4
8687; CHECK-ARM8-NEXT:    str r1, [sp, #4] @ 4-byte Spill
8688; CHECK-ARM8-NEXT:    eor r2, r1, r2
8689; CHECK-ARM8-NEXT:    orr r2, r2, r3
8690; CHECK-ARM8-NEXT:    cmp r2, #0
8691; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8692; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8693; CHECK-ARM8-NEXT:    bne .LBB41_1
8694; CHECK-ARM8-NEXT:    b .LBB41_5
8695; CHECK-ARM8-NEXT:  .LBB41_5: @ %atomicrmw.end
8696; CHECK-ARM8-NEXT:    ldr r1, [sp] @ 4-byte Reload
8697; CHECK-ARM8-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
8698; CHECK-ARM8-NEXT:    add sp, sp, #16
8699; CHECK-ARM8-NEXT:    pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
8700;
8701; CHECK-ARM6-LABEL: test_min_i64:
8702; CHECK-ARM6:       @ %bb.0: @ %entry
8703; CHECK-ARM6-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
8704; CHECK-ARM6-NEXT:    push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
8705; CHECK-ARM6-NEXT:    .pad #16
8706; CHECK-ARM6-NEXT:    sub sp, sp, #16
8707; CHECK-ARM6-NEXT:    ldr r0, .LCPI41_0
8708; CHECK-ARM6-NEXT:    ldr r1, [r0]
8709; CHECK-ARM6-NEXT:    ldr r0, [r0, #4]
8710; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8711; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8712; CHECK-ARM6-NEXT:    b .LBB41_1
8713; CHECK-ARM6-NEXT:  .LBB41_1: @ %atomicrmw.start
8714; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
8715; CHECK-ARM6-NEXT:    @ Child Loop BB41_2 Depth 2
8716; CHECK-ARM6-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
8717; CHECK-ARM6-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
8718; CHECK-ARM6-NEXT:    mov r8, r2
8719; CHECK-ARM6-NEXT:    mov r9, r1
8720; CHECK-ARM6-NEXT:    subs r0, r2, #2
8721; CHECK-ARM6-NEXT:    sbcs r0, r1, #0
8722; CHECK-ARM6-NEXT:    mov r0, #0
8723; CHECK-ARM6-NEXT:    movlt r0, #1
8724; CHECK-ARM6-NEXT:    mov r10, #1
8725; CHECK-ARM6-NEXT:    movlt r10, r2
8726; CHECK-ARM6-NEXT:    cmp r0, #0
8727; CHECK-ARM6-NEXT:    movne r0, r1
8728; CHECK-ARM6-NEXT:    @ kill: def $r10 killed $r10 def $r10_r11
8729; CHECK-ARM6-NEXT:    mov r11, r0
8730; CHECK-ARM6-NEXT:    ldr r6, .LCPI41_0
8731; CHECK-ARM6-NEXT:    @ implicit-def: $r0
8732; CHECK-ARM6-NEXT:    @ implicit-def: $r3
8733; CHECK-ARM6-NEXT:    @ kill: def $r6 killed $r6 def $r6_r7
8734; CHECK-ARM6-NEXT:    mov r7, r0
8735; CHECK-ARM6-NEXT:  .LBB41_2: @ %atomicrmw.start
8736; CHECK-ARM6-NEXT:    @ Parent Loop BB41_1 Depth=1
8737; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
8738; CHECK-ARM6-NEXT:    ldrexd r4, r5, [r6]
8739; CHECK-ARM6-NEXT:    cmp r4, r8
8740; CHECK-ARM6-NEXT:    cmpeq r5, r9
8741; CHECK-ARM6-NEXT:    bne .LBB41_4
8742; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
8743; CHECK-ARM6-NEXT:    @ in Loop: Header=BB41_2 Depth=2
8744; CHECK-ARM6-NEXT:    strexd r7, r10, r11, [r6]
8745; CHECK-ARM6-NEXT:    cmp r7, #0
8746; CHECK-ARM6-NEXT:    bne .LBB41_2
8747; CHECK-ARM6-NEXT:  .LBB41_4: @ %atomicrmw.start
8748; CHECK-ARM6-NEXT:    @ in Loop: Header=BB41_1 Depth=1
8749; CHECK-ARM6-NEXT:    mov r0, r5
8750; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
8751; CHECK-ARM6-NEXT:    eor r3, r0, r1
8752; CHECK-ARM6-NEXT:    mov r1, r4
8753; CHECK-ARM6-NEXT:    str r1, [sp, #4] @ 4-byte Spill
8754; CHECK-ARM6-NEXT:    eor r2, r1, r2
8755; CHECK-ARM6-NEXT:    orr r2, r2, r3
8756; CHECK-ARM6-NEXT:    cmp r2, #0
8757; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8758; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8759; CHECK-ARM6-NEXT:    bne .LBB41_1
8760; CHECK-ARM6-NEXT:    b .LBB41_5
8761; CHECK-ARM6-NEXT:  .LBB41_5: @ %atomicrmw.end
8762; CHECK-ARM6-NEXT:    ldr r1, [sp] @ 4-byte Reload
8763; CHECK-ARM6-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
8764; CHECK-ARM6-NEXT:    add sp, sp, #16
8765; CHECK-ARM6-NEXT:    pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
8766; CHECK-ARM6-NEXT:    .p2align 2
8767; CHECK-ARM6-NEXT:  @ %bb.6:
8768; CHECK-ARM6-NEXT:  .LCPI41_0:
8769; CHECK-ARM6-NEXT:    .long atomic_i64
8770;
8771; CHECK-THUMB7-LABEL: test_min_i64:
8772; CHECK-THUMB7:       @ %bb.0: @ %entry
8773; CHECK-THUMB7-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
8774; CHECK-THUMB7-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11, lr}
8775; CHECK-THUMB7-NEXT:    .pad #16
8776; CHECK-THUMB7-NEXT:    sub sp, #16
8777; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i64
8778; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i64
8779; CHECK-THUMB7-NEXT:    ldr r1, [r0]
8780; CHECK-THUMB7-NEXT:    ldr r0, [r0, #4]
8781; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8782; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8783; CHECK-THUMB7-NEXT:    b .LBB41_1
8784; CHECK-THUMB7-NEXT:  .LBB41_1: @ %atomicrmw.start
8785; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
8786; CHECK-THUMB7-NEXT:    @ Child Loop BB41_2 Depth 2
8787; CHECK-THUMB7-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
8788; CHECK-THUMB7-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
8789; CHECK-THUMB7-NEXT:    mov r8, r2
8790; CHECK-THUMB7-NEXT:    mov r9, r1
8791; CHECK-THUMB7-NEXT:    subs r0, r2, #2
8792; CHECK-THUMB7-NEXT:    sbcs r0, r1, #0
8793; CHECK-THUMB7-NEXT:    mov.w r0, #0
8794; CHECK-THUMB7-NEXT:    it lt
8795; CHECK-THUMB7-NEXT:    movlt r0, #1
8796; CHECK-THUMB7-NEXT:    mov.w r10, #1
8797; CHECK-THUMB7-NEXT:    it lt
8798; CHECK-THUMB7-NEXT:    movlt r10, r2
8799; CHECK-THUMB7-NEXT:    cmp r0, #0
8800; CHECK-THUMB7-NEXT:    it ne
8801; CHECK-THUMB7-NEXT:    movne r0, r1
8802; CHECK-THUMB7-NEXT:    @ kill: def $r10 killed $r10 def $r10_r11
8803; CHECK-THUMB7-NEXT:    mov r11, r0
8804; CHECK-THUMB7-NEXT:    movw r6, :lower16:atomic_i64
8805; CHECK-THUMB7-NEXT:    movt r6, :upper16:atomic_i64
8806; CHECK-THUMB7-NEXT:    @ implicit-def: $r0
8807; CHECK-THUMB7-NEXT:    @ implicit-def: $r3
8808; CHECK-THUMB7-NEXT:    @ kill: def $r6 killed $r6 def $r6_r7
8809; CHECK-THUMB7-NEXT:    mov r7, r0
8810; CHECK-THUMB7-NEXT:  .LBB41_2: @ %atomicrmw.start
8811; CHECK-THUMB7-NEXT:    @ Parent Loop BB41_1 Depth=1
8812; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
8813; CHECK-THUMB7-NEXT:    ldrexd r4, r5, [r6]
8814; CHECK-THUMB7-NEXT:    cmp r4, r8
8815; CHECK-THUMB7-NEXT:    it eq
8816; CHECK-THUMB7-NEXT:    cmpeq r5, r9
8817; CHECK-THUMB7-NEXT:    bne .LBB41_4
8818; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
8819; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB41_2 Depth=2
8820; CHECK-THUMB7-NEXT:    strexd r7, r10, r11, [r6]
8821; CHECK-THUMB7-NEXT:    cmp r7, #0
8822; CHECK-THUMB7-NEXT:    bne .LBB41_2
8823; CHECK-THUMB7-NEXT:  .LBB41_4: @ %atomicrmw.start
8824; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB41_1 Depth=1
8825; CHECK-THUMB7-NEXT:    mov r0, r5
8826; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
8827; CHECK-THUMB7-NEXT:    eor.w r3, r0, r1
8828; CHECK-THUMB7-NEXT:    mov r1, r4
8829; CHECK-THUMB7-NEXT:    str r1, [sp, #4] @ 4-byte Spill
8830; CHECK-THUMB7-NEXT:    eors r2, r1
8831; CHECK-THUMB7-NEXT:    orrs r2, r3
8832; CHECK-THUMB7-NEXT:    cmp r2, #0
8833; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8834; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8835; CHECK-THUMB7-NEXT:    bne .LBB41_1
8836; CHECK-THUMB7-NEXT:    b .LBB41_5
8837; CHECK-THUMB7-NEXT:  .LBB41_5: @ %atomicrmw.end
8838; CHECK-THUMB7-NEXT:    ldr r1, [sp] @ 4-byte Reload
8839; CHECK-THUMB7-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
8840; CHECK-THUMB7-NEXT:    add sp, #16
8841; CHECK-THUMB7-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11, pc}
8842;
8843; CHECK-THUMB6-LABEL: test_min_i64:
8844; CHECK-THUMB6:       @ %bb.0: @ %entry
8845; CHECK-THUMB6-NEXT:    .save {r7, lr}
8846; CHECK-THUMB6-NEXT:    push {r7, lr}
8847; CHECK-THUMB6-NEXT:    ldr r0, .LCPI41_0
8848; CHECK-THUMB6-NEXT:    movs r2, #1
8849; CHECK-THUMB6-NEXT:    movs r3, #0
8850; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_min_8
8851; CHECK-THUMB6-NEXT:    pop {r7, pc}
8852; CHECK-THUMB6-NEXT:    .p2align 2
8853; CHECK-THUMB6-NEXT:  @ %bb.1:
8854; CHECK-THUMB6-NEXT:  .LCPI41_0:
8855; CHECK-THUMB6-NEXT:    .long atomic_i64
8856;
8857; CHECK-THUMB8BASE-LABEL: test_min_i64:
8858; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
8859; CHECK-THUMB8BASE-NEXT:    .save {r4, lr}
8860; CHECK-THUMB8BASE-NEXT:    push {r4, lr}
8861; CHECK-THUMB8BASE-NEXT:    .pad #72
8862; CHECK-THUMB8BASE-NEXT:    sub sp, #72
8863; CHECK-THUMB8BASE-NEXT:    movw r1, :lower16:atomic_i64
8864; CHECK-THUMB8BASE-NEXT:    movt r1, :upper16:atomic_i64
8865; CHECK-THUMB8BASE-NEXT:    ldr r0, [r1, #4]
8866; CHECK-THUMB8BASE-NEXT:    ldr r1, [r1]
8867; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #56] @ 4-byte Spill
8868; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #60] @ 4-byte Spill
8869; CHECK-THUMB8BASE-NEXT:    b .LBB41_1
8870; CHECK-THUMB8BASE-NEXT:  .LBB41_1: @ %atomicrmw.start
8871; CHECK-THUMB8BASE-NEXT:    @ =>This Inner Loop Header: Depth=1
8872; CHECK-THUMB8BASE-NEXT:    ldr r3, [sp, #56] @ 4-byte Reload
8873; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #60] @ 4-byte Reload
8874; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #36] @ 4-byte Spill
8875; CHECK-THUMB8BASE-NEXT:    str r3, [sp, #40] @ 4-byte Spill
8876; CHECK-THUMB8BASE-NEXT:    movs r0, #1
8877; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #44] @ 4-byte Spill
8878; CHECK-THUMB8BASE-NEXT:    movs r2, #0
8879; CHECK-THUMB8BASE-NEXT:    str r2, [sp, #48] @ 4-byte Spill
8880; CHECK-THUMB8BASE-NEXT:    subs r3, r3, #2
8881; CHECK-THUMB8BASE-NEXT:    sbcs r1, r2
8882; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #52] @ 4-byte Spill
8883; CHECK-THUMB8BASE-NEXT:    blt .LBB41_3
8884; CHECK-THUMB8BASE-NEXT:  @ %bb.2: @ %atomicrmw.start
8885; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB41_1 Depth=1
8886; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #48] @ 4-byte Reload
8887; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #52] @ 4-byte Spill
8888; CHECK-THUMB8BASE-NEXT:  .LBB41_3: @ %atomicrmw.start
8889; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB41_1 Depth=1
8890; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #40] @ 4-byte Reload
8891; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #52] @ 4-byte Reload
8892; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #28] @ 4-byte Spill
8893; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #32] @ 4-byte Spill
8894; CHECK-THUMB8BASE-NEXT:    blt .LBB41_5
8895; CHECK-THUMB8BASE-NEXT:  @ %bb.4: @ %atomicrmw.start
8896; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB41_1 Depth=1
8897; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #44] @ 4-byte Reload
8898; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #32] @ 4-byte Spill
8899; CHECK-THUMB8BASE-NEXT:  .LBB41_5: @ %atomicrmw.start
8900; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB41_1 Depth=1
8901; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #36] @ 4-byte Reload
8902; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #28] @ 4-byte Reload
8903; CHECK-THUMB8BASE-NEXT:    ldr r2, [sp, #32] @ 4-byte Reload
8904; CHECK-THUMB8BASE-NEXT:    str r2, [sp, #20] @ 4-byte Spill
8905; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #24] @ 4-byte Spill
8906; CHECK-THUMB8BASE-NEXT:    cbnz r1, .LBB41_7
8907; CHECK-THUMB8BASE-NEXT:  @ %bb.6: @ %atomicrmw.start
8908; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB41_1 Depth=1
8909; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #28] @ 4-byte Reload
8910; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #24] @ 4-byte Spill
8911; CHECK-THUMB8BASE-NEXT:  .LBB41_7: @ %atomicrmw.start
8912; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB41_1 Depth=1
8913; CHECK-THUMB8BASE-NEXT:    ldr r2, [sp, #20] @ 4-byte Reload
8914; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #48] @ 4-byte Reload
8915; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #36] @ 4-byte Reload
8916; CHECK-THUMB8BASE-NEXT:    ldr r4, [sp, #40] @ 4-byte Reload
8917; CHECK-THUMB8BASE-NEXT:    ldr r3, [sp, #24] @ 4-byte Reload
8918; CHECK-THUMB8BASE-NEXT:    str r4, [sp, #64]
8919; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #68]
8920; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4]
8921; CHECK-THUMB8BASE-NEXT:    str r0, [sp]
8922; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i64
8923; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i64
8924; CHECK-THUMB8BASE-NEXT:    add r1, sp, #64
8925; CHECK-THUMB8BASE-NEXT:    bl __atomic_compare_exchange_8
8926; CHECK-THUMB8BASE-NEXT:    mov r2, r0
8927; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #68]
8928; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8929; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #64]
8930; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #16] @ 4-byte Spill
8931; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
8932; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #56] @ 4-byte Spill
8933; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #60] @ 4-byte Spill
8934; CHECK-THUMB8BASE-NEXT:    beq .LBB41_1
8935; CHECK-THUMB8BASE-NEXT:    b .LBB41_8
8936; CHECK-THUMB8BASE-NEXT:  .LBB41_8: @ %atomicrmw.end
8937; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
8938; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #16] @ 4-byte Reload
8939; CHECK-THUMB8BASE-NEXT:    add sp, #72
8940; CHECK-THUMB8BASE-NEXT:    pop {r4, pc}
8941entry:
8942  %0 = atomicrmw min ptr @atomic_i64, i64 1 monotonic
8943  ret i64 %0
8944}
8945define i64 @test_umax_i64() {
8946; CHECK-ARM8-LABEL: test_umax_i64:
8947; CHECK-ARM8:       @ %bb.0: @ %entry
8948; CHECK-ARM8-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
8949; CHECK-ARM8-NEXT:    push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
8950; CHECK-ARM8-NEXT:    .pad #16
8951; CHECK-ARM8-NEXT:    sub sp, sp, #16
8952; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i64
8953; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i64
8954; CHECK-ARM8-NEXT:    ldr r1, [r0]
8955; CHECK-ARM8-NEXT:    ldr r0, [r0, #4]
8956; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
8957; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
8958; CHECK-ARM8-NEXT:    b .LBB42_1
8959; CHECK-ARM8-NEXT:  .LBB42_1: @ %atomicrmw.start
8960; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
8961; CHECK-ARM8-NEXT:    @ Child Loop BB42_2 Depth 2
8962; CHECK-ARM8-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
8963; CHECK-ARM8-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
8964; CHECK-ARM8-NEXT:    mov r8, r2
8965; CHECK-ARM8-NEXT:    mov r9, r1
8966; CHECK-ARM8-NEXT:    rsbs r0, r2, #1
8967; CHECK-ARM8-NEXT:    rscs r0, r1, #0
8968; CHECK-ARM8-NEXT:    mov r0, #0
8969; CHECK-ARM8-NEXT:    movwlo r0, #1
8970; CHECK-ARM8-NEXT:    mov r10, #1
8971; CHECK-ARM8-NEXT:    movlo r10, r2
8972; CHECK-ARM8-NEXT:    cmp r0, #0
8973; CHECK-ARM8-NEXT:    movne r0, r1
8974; CHECK-ARM8-NEXT:    @ kill: def $r10 killed $r10 def $r10_r11
8975; CHECK-ARM8-NEXT:    mov r11, r0
8976; CHECK-ARM8-NEXT:    movw r6, :lower16:atomic_i64
8977; CHECK-ARM8-NEXT:    movt r6, :upper16:atomic_i64
8978; CHECK-ARM8-NEXT:    @ implicit-def: $r0
8979; CHECK-ARM8-NEXT:    @ implicit-def: $r3
8980; CHECK-ARM8-NEXT:    @ kill: def $r6 killed $r6 def $r6_r7
8981; CHECK-ARM8-NEXT:    mov r7, r0
8982; CHECK-ARM8-NEXT:  .LBB42_2: @ %atomicrmw.start
8983; CHECK-ARM8-NEXT:    @ Parent Loop BB42_1 Depth=1
8984; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
8985; CHECK-ARM8-NEXT:    ldrexd r4, r5, [r6]
8986; CHECK-ARM8-NEXT:    cmp r4, r8
8987; CHECK-ARM8-NEXT:    cmpeq r5, r9
8988; CHECK-ARM8-NEXT:    bne .LBB42_4
8989; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
8990; CHECK-ARM8-NEXT:    @ in Loop: Header=BB42_2 Depth=2
8991; CHECK-ARM8-NEXT:    strexd r7, r10, r11, [r6]
8992; CHECK-ARM8-NEXT:    cmp r7, #0
8993; CHECK-ARM8-NEXT:    bne .LBB42_2
8994; CHECK-ARM8-NEXT:  .LBB42_4: @ %atomicrmw.start
8995; CHECK-ARM8-NEXT:    @ in Loop: Header=BB42_1 Depth=1
8996; CHECK-ARM8-NEXT:    mov r0, r5
8997; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
8998; CHECK-ARM8-NEXT:    eor r3, r0, r1
8999; CHECK-ARM8-NEXT:    mov r1, r4
9000; CHECK-ARM8-NEXT:    str r1, [sp, #4] @ 4-byte Spill
9001; CHECK-ARM8-NEXT:    eor r2, r1, r2
9002; CHECK-ARM8-NEXT:    orr r2, r2, r3
9003; CHECK-ARM8-NEXT:    cmp r2, #0
9004; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
9005; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
9006; CHECK-ARM8-NEXT:    bne .LBB42_1
9007; CHECK-ARM8-NEXT:    b .LBB42_5
9008; CHECK-ARM8-NEXT:  .LBB42_5: @ %atomicrmw.end
9009; CHECK-ARM8-NEXT:    ldr r1, [sp] @ 4-byte Reload
9010; CHECK-ARM8-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
9011; CHECK-ARM8-NEXT:    add sp, sp, #16
9012; CHECK-ARM8-NEXT:    pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
9013;
9014; CHECK-ARM6-LABEL: test_umax_i64:
9015; CHECK-ARM6:       @ %bb.0: @ %entry
9016; CHECK-ARM6-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
9017; CHECK-ARM6-NEXT:    push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
9018; CHECK-ARM6-NEXT:    .pad #16
9019; CHECK-ARM6-NEXT:    sub sp, sp, #16
9020; CHECK-ARM6-NEXT:    ldr r0, .LCPI42_0
9021; CHECK-ARM6-NEXT:    ldr r1, [r0]
9022; CHECK-ARM6-NEXT:    ldr r0, [r0, #4]
9023; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
9024; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
9025; CHECK-ARM6-NEXT:    b .LBB42_1
9026; CHECK-ARM6-NEXT:  .LBB42_1: @ %atomicrmw.start
9027; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
9028; CHECK-ARM6-NEXT:    @ Child Loop BB42_2 Depth 2
9029; CHECK-ARM6-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
9030; CHECK-ARM6-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
9031; CHECK-ARM6-NEXT:    mov r8, r2
9032; CHECK-ARM6-NEXT:    mov r9, r1
9033; CHECK-ARM6-NEXT:    rsbs r0, r2, #1
9034; CHECK-ARM6-NEXT:    rscs r0, r1, #0
9035; CHECK-ARM6-NEXT:    mov r0, #0
9036; CHECK-ARM6-NEXT:    movlo r0, #1
9037; CHECK-ARM6-NEXT:    mov r10, #1
9038; CHECK-ARM6-NEXT:    movlo r10, r2
9039; CHECK-ARM6-NEXT:    cmp r0, #0
9040; CHECK-ARM6-NEXT:    movne r0, r1
9041; CHECK-ARM6-NEXT:    @ kill: def $r10 killed $r10 def $r10_r11
9042; CHECK-ARM6-NEXT:    mov r11, r0
9043; CHECK-ARM6-NEXT:    ldr r6, .LCPI42_0
9044; CHECK-ARM6-NEXT:    @ implicit-def: $r0
9045; CHECK-ARM6-NEXT:    @ implicit-def: $r3
9046; CHECK-ARM6-NEXT:    @ kill: def $r6 killed $r6 def $r6_r7
9047; CHECK-ARM6-NEXT:    mov r7, r0
9048; CHECK-ARM6-NEXT:  .LBB42_2: @ %atomicrmw.start
9049; CHECK-ARM6-NEXT:    @ Parent Loop BB42_1 Depth=1
9050; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
9051; CHECK-ARM6-NEXT:    ldrexd r4, r5, [r6]
9052; CHECK-ARM6-NEXT:    cmp r4, r8
9053; CHECK-ARM6-NEXT:    cmpeq r5, r9
9054; CHECK-ARM6-NEXT:    bne .LBB42_4
9055; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
9056; CHECK-ARM6-NEXT:    @ in Loop: Header=BB42_2 Depth=2
9057; CHECK-ARM6-NEXT:    strexd r7, r10, r11, [r6]
9058; CHECK-ARM6-NEXT:    cmp r7, #0
9059; CHECK-ARM6-NEXT:    bne .LBB42_2
9060; CHECK-ARM6-NEXT:  .LBB42_4: @ %atomicrmw.start
9061; CHECK-ARM6-NEXT:    @ in Loop: Header=BB42_1 Depth=1
9062; CHECK-ARM6-NEXT:    mov r0, r5
9063; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
9064; CHECK-ARM6-NEXT:    eor r3, r0, r1
9065; CHECK-ARM6-NEXT:    mov r1, r4
9066; CHECK-ARM6-NEXT:    str r1, [sp, #4] @ 4-byte Spill
9067; CHECK-ARM6-NEXT:    eor r2, r1, r2
9068; CHECK-ARM6-NEXT:    orr r2, r2, r3
9069; CHECK-ARM6-NEXT:    cmp r2, #0
9070; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
9071; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
9072; CHECK-ARM6-NEXT:    bne .LBB42_1
9073; CHECK-ARM6-NEXT:    b .LBB42_5
9074; CHECK-ARM6-NEXT:  .LBB42_5: @ %atomicrmw.end
9075; CHECK-ARM6-NEXT:    ldr r1, [sp] @ 4-byte Reload
9076; CHECK-ARM6-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
9077; CHECK-ARM6-NEXT:    add sp, sp, #16
9078; CHECK-ARM6-NEXT:    pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
9079; CHECK-ARM6-NEXT:    .p2align 2
9080; CHECK-ARM6-NEXT:  @ %bb.6:
9081; CHECK-ARM6-NEXT:  .LCPI42_0:
9082; CHECK-ARM6-NEXT:    .long atomic_i64
9083;
9084; CHECK-THUMB7-LABEL: test_umax_i64:
9085; CHECK-THUMB7:       @ %bb.0: @ %entry
9086; CHECK-THUMB7-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
9087; CHECK-THUMB7-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11, lr}
9088; CHECK-THUMB7-NEXT:    .pad #16
9089; CHECK-THUMB7-NEXT:    sub sp, #16
9090; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i64
9091; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i64
9092; CHECK-THUMB7-NEXT:    ldr r1, [r0]
9093; CHECK-THUMB7-NEXT:    ldr r0, [r0, #4]
9094; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
9095; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
9096; CHECK-THUMB7-NEXT:    b .LBB42_1
9097; CHECK-THUMB7-NEXT:  .LBB42_1: @ %atomicrmw.start
9098; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
9099; CHECK-THUMB7-NEXT:    @ Child Loop BB42_2 Depth 2
9100; CHECK-THUMB7-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
9101; CHECK-THUMB7-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
9102; CHECK-THUMB7-NEXT:    rsbs.w r0, r2, #1
9103; CHECK-THUMB7-NEXT:    mov.w r0, #0
9104; CHECK-THUMB7-NEXT:    sbcs.w r3, r0, r1
9105; CHECK-THUMB7-NEXT:    it lo
9106; CHECK-THUMB7-NEXT:    movlo r0, #1
9107; CHECK-THUMB7-NEXT:    mov r8, r2
9108; CHECK-THUMB7-NEXT:    mov r9, r1
9109; CHECK-THUMB7-NEXT:    mov.w r10, #1
9110; CHECK-THUMB7-NEXT:    it lo
9111; CHECK-THUMB7-NEXT:    movlo r10, r2
9112; CHECK-THUMB7-NEXT:    cmp r0, #0
9113; CHECK-THUMB7-NEXT:    it ne
9114; CHECK-THUMB7-NEXT:    movne r0, r1
9115; CHECK-THUMB7-NEXT:    @ kill: def $r10 killed $r10 def $r10_r11
9116; CHECK-THUMB7-NEXT:    mov r11, r0
9117; CHECK-THUMB7-NEXT:    movw r6, :lower16:atomic_i64
9118; CHECK-THUMB7-NEXT:    movt r6, :upper16:atomic_i64
9119; CHECK-THUMB7-NEXT:    @ implicit-def: $r0
9120; CHECK-THUMB7-NEXT:    @ implicit-def: $r3
9121; CHECK-THUMB7-NEXT:    @ kill: def $r6 killed $r6 def $r6_r7
9122; CHECK-THUMB7-NEXT:    mov r7, r0
9123; CHECK-THUMB7-NEXT:  .LBB42_2: @ %atomicrmw.start
9124; CHECK-THUMB7-NEXT:    @ Parent Loop BB42_1 Depth=1
9125; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
9126; CHECK-THUMB7-NEXT:    ldrexd r4, r5, [r6]
9127; CHECK-THUMB7-NEXT:    cmp r4, r8
9128; CHECK-THUMB7-NEXT:    it eq
9129; CHECK-THUMB7-NEXT:    cmpeq r5, r9
9130; CHECK-THUMB7-NEXT:    bne .LBB42_4
9131; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
9132; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB42_2 Depth=2
9133; CHECK-THUMB7-NEXT:    strexd r7, r10, r11, [r6]
9134; CHECK-THUMB7-NEXT:    cmp r7, #0
9135; CHECK-THUMB7-NEXT:    bne .LBB42_2
9136; CHECK-THUMB7-NEXT:  .LBB42_4: @ %atomicrmw.start
9137; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB42_1 Depth=1
9138; CHECK-THUMB7-NEXT:    mov r0, r5
9139; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
9140; CHECK-THUMB7-NEXT:    eor.w r3, r0, r1
9141; CHECK-THUMB7-NEXT:    mov r1, r4
9142; CHECK-THUMB7-NEXT:    str r1, [sp, #4] @ 4-byte Spill
9143; CHECK-THUMB7-NEXT:    eors r2, r1
9144; CHECK-THUMB7-NEXT:    orrs r2, r3
9145; CHECK-THUMB7-NEXT:    cmp r2, #0
9146; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
9147; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
9148; CHECK-THUMB7-NEXT:    bne .LBB42_1
9149; CHECK-THUMB7-NEXT:    b .LBB42_5
9150; CHECK-THUMB7-NEXT:  .LBB42_5: @ %atomicrmw.end
9151; CHECK-THUMB7-NEXT:    ldr r1, [sp] @ 4-byte Reload
9152; CHECK-THUMB7-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
9153; CHECK-THUMB7-NEXT:    add sp, #16
9154; CHECK-THUMB7-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11, pc}
9155;
9156; CHECK-THUMB6-LABEL: test_umax_i64:
9157; CHECK-THUMB6:       @ %bb.0: @ %entry
9158; CHECK-THUMB6-NEXT:    .save {r7, lr}
9159; CHECK-THUMB6-NEXT:    push {r7, lr}
9160; CHECK-THUMB6-NEXT:    ldr r0, .LCPI42_0
9161; CHECK-THUMB6-NEXT:    movs r2, #1
9162; CHECK-THUMB6-NEXT:    movs r3, #0
9163; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_umax_8
9164; CHECK-THUMB6-NEXT:    pop {r7, pc}
9165; CHECK-THUMB6-NEXT:    .p2align 2
9166; CHECK-THUMB6-NEXT:  @ %bb.1:
9167; CHECK-THUMB6-NEXT:  .LCPI42_0:
9168; CHECK-THUMB6-NEXT:    .long atomic_i64
9169;
9170; CHECK-THUMB8BASE-LABEL: test_umax_i64:
9171; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
9172; CHECK-THUMB8BASE-NEXT:    .save {r4, lr}
9173; CHECK-THUMB8BASE-NEXT:    push {r4, lr}
9174; CHECK-THUMB8BASE-NEXT:    .pad #72
9175; CHECK-THUMB8BASE-NEXT:    sub sp, #72
9176; CHECK-THUMB8BASE-NEXT:    movw r1, :lower16:atomic_i64
9177; CHECK-THUMB8BASE-NEXT:    movt r1, :upper16:atomic_i64
9178; CHECK-THUMB8BASE-NEXT:    ldr r0, [r1, #4]
9179; CHECK-THUMB8BASE-NEXT:    ldr r1, [r1]
9180; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #56] @ 4-byte Spill
9181; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #60] @ 4-byte Spill
9182; CHECK-THUMB8BASE-NEXT:    b .LBB42_1
9183; CHECK-THUMB8BASE-NEXT:  .LBB42_1: @ %atomicrmw.start
9184; CHECK-THUMB8BASE-NEXT:    @ =>This Inner Loop Header: Depth=1
9185; CHECK-THUMB8BASE-NEXT:    ldr r3, [sp, #56] @ 4-byte Reload
9186; CHECK-THUMB8BASE-NEXT:    ldr r2, [sp, #60] @ 4-byte Reload
9187; CHECK-THUMB8BASE-NEXT:    str r2, [sp, #36] @ 4-byte Spill
9188; CHECK-THUMB8BASE-NEXT:    str r3, [sp, #40] @ 4-byte Spill
9189; CHECK-THUMB8BASE-NEXT:    movs r1, #0
9190; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #44] @ 4-byte Spill
9191; CHECK-THUMB8BASE-NEXT:    movs r0, #1
9192; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #48] @ 4-byte Spill
9193; CHECK-THUMB8BASE-NEXT:    subs r3, r0, r3
9194; CHECK-THUMB8BASE-NEXT:    sbcs r1, r2
9195; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #52] @ 4-byte Spill
9196; CHECK-THUMB8BASE-NEXT:    blo .LBB42_3
9197; CHECK-THUMB8BASE-NEXT:  @ %bb.2: @ %atomicrmw.start
9198; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB42_1 Depth=1
9199; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #44] @ 4-byte Reload
9200; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #52] @ 4-byte Spill
9201; CHECK-THUMB8BASE-NEXT:  .LBB42_3: @ %atomicrmw.start
9202; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB42_1 Depth=1
9203; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #40] @ 4-byte Reload
9204; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #52] @ 4-byte Reload
9205; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #28] @ 4-byte Spill
9206; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #32] @ 4-byte Spill
9207; CHECK-THUMB8BASE-NEXT:    blo .LBB42_5
9208; CHECK-THUMB8BASE-NEXT:  @ %bb.4: @ %atomicrmw.start
9209; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB42_1 Depth=1
9210; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #48] @ 4-byte Reload
9211; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #32] @ 4-byte Spill
9212; CHECK-THUMB8BASE-NEXT:  .LBB42_5: @ %atomicrmw.start
9213; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB42_1 Depth=1
9214; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #36] @ 4-byte Reload
9215; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #28] @ 4-byte Reload
9216; CHECK-THUMB8BASE-NEXT:    ldr r2, [sp, #32] @ 4-byte Reload
9217; CHECK-THUMB8BASE-NEXT:    str r2, [sp, #20] @ 4-byte Spill
9218; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #24] @ 4-byte Spill
9219; CHECK-THUMB8BASE-NEXT:    cbnz r1, .LBB42_7
9220; CHECK-THUMB8BASE-NEXT:  @ %bb.6: @ %atomicrmw.start
9221; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB42_1 Depth=1
9222; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #28] @ 4-byte Reload
9223; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #24] @ 4-byte Spill
9224; CHECK-THUMB8BASE-NEXT:  .LBB42_7: @ %atomicrmw.start
9225; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB42_1 Depth=1
9226; CHECK-THUMB8BASE-NEXT:    ldr r2, [sp, #20] @ 4-byte Reload
9227; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #44] @ 4-byte Reload
9228; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #36] @ 4-byte Reload
9229; CHECK-THUMB8BASE-NEXT:    ldr r4, [sp, #40] @ 4-byte Reload
9230; CHECK-THUMB8BASE-NEXT:    ldr r3, [sp, #24] @ 4-byte Reload
9231; CHECK-THUMB8BASE-NEXT:    str r4, [sp, #64]
9232; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #68]
9233; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4]
9234; CHECK-THUMB8BASE-NEXT:    str r0, [sp]
9235; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i64
9236; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i64
9237; CHECK-THUMB8BASE-NEXT:    add r1, sp, #64
9238; CHECK-THUMB8BASE-NEXT:    bl __atomic_compare_exchange_8
9239; CHECK-THUMB8BASE-NEXT:    mov r2, r0
9240; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #68]
9241; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #12] @ 4-byte Spill
9242; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #64]
9243; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #16] @ 4-byte Spill
9244; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
9245; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #56] @ 4-byte Spill
9246; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #60] @ 4-byte Spill
9247; CHECK-THUMB8BASE-NEXT:    beq .LBB42_1
9248; CHECK-THUMB8BASE-NEXT:    b .LBB42_8
9249; CHECK-THUMB8BASE-NEXT:  .LBB42_8: @ %atomicrmw.end
9250; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
9251; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #16] @ 4-byte Reload
9252; CHECK-THUMB8BASE-NEXT:    add sp, #72
9253; CHECK-THUMB8BASE-NEXT:    pop {r4, pc}
9254entry:
9255  %0 = atomicrmw umax ptr @atomic_i64, i64 1 monotonic
9256  ret i64 %0
9257}
9258define i64 @test_umin_i64() {
9259; CHECK-ARM8-LABEL: test_umin_i64:
9260; CHECK-ARM8:       @ %bb.0: @ %entry
9261; CHECK-ARM8-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
9262; CHECK-ARM8-NEXT:    push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
9263; CHECK-ARM8-NEXT:    .pad #16
9264; CHECK-ARM8-NEXT:    sub sp, sp, #16
9265; CHECK-ARM8-NEXT:    movw r0, :lower16:atomic_i64
9266; CHECK-ARM8-NEXT:    movt r0, :upper16:atomic_i64
9267; CHECK-ARM8-NEXT:    ldr r1, [r0]
9268; CHECK-ARM8-NEXT:    ldr r0, [r0, #4]
9269; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
9270; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
9271; CHECK-ARM8-NEXT:    b .LBB43_1
9272; CHECK-ARM8-NEXT:  .LBB43_1: @ %atomicrmw.start
9273; CHECK-ARM8-NEXT:    @ =>This Loop Header: Depth=1
9274; CHECK-ARM8-NEXT:    @ Child Loop BB43_2 Depth 2
9275; CHECK-ARM8-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
9276; CHECK-ARM8-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
9277; CHECK-ARM8-NEXT:    mov r8, r2
9278; CHECK-ARM8-NEXT:    mov r9, r1
9279; CHECK-ARM8-NEXT:    subs r0, r2, #2
9280; CHECK-ARM8-NEXT:    sbcs r0, r1, #0
9281; CHECK-ARM8-NEXT:    mov r0, #0
9282; CHECK-ARM8-NEXT:    movwlo r0, #1
9283; CHECK-ARM8-NEXT:    mov r10, #1
9284; CHECK-ARM8-NEXT:    movlo r10, r2
9285; CHECK-ARM8-NEXT:    cmp r0, #0
9286; CHECK-ARM8-NEXT:    movne r0, r1
9287; CHECK-ARM8-NEXT:    @ kill: def $r10 killed $r10 def $r10_r11
9288; CHECK-ARM8-NEXT:    mov r11, r0
9289; CHECK-ARM8-NEXT:    movw r6, :lower16:atomic_i64
9290; CHECK-ARM8-NEXT:    movt r6, :upper16:atomic_i64
9291; CHECK-ARM8-NEXT:    @ implicit-def: $r0
9292; CHECK-ARM8-NEXT:    @ implicit-def: $r3
9293; CHECK-ARM8-NEXT:    @ kill: def $r6 killed $r6 def $r6_r7
9294; CHECK-ARM8-NEXT:    mov r7, r0
9295; CHECK-ARM8-NEXT:  .LBB43_2: @ %atomicrmw.start
9296; CHECK-ARM8-NEXT:    @ Parent Loop BB43_1 Depth=1
9297; CHECK-ARM8-NEXT:    @ => This Inner Loop Header: Depth=2
9298; CHECK-ARM8-NEXT:    ldrexd r4, r5, [r6]
9299; CHECK-ARM8-NEXT:    cmp r4, r8
9300; CHECK-ARM8-NEXT:    cmpeq r5, r9
9301; CHECK-ARM8-NEXT:    bne .LBB43_4
9302; CHECK-ARM8-NEXT:  @ %bb.3: @ %atomicrmw.start
9303; CHECK-ARM8-NEXT:    @ in Loop: Header=BB43_2 Depth=2
9304; CHECK-ARM8-NEXT:    strexd r7, r10, r11, [r6]
9305; CHECK-ARM8-NEXT:    cmp r7, #0
9306; CHECK-ARM8-NEXT:    bne .LBB43_2
9307; CHECK-ARM8-NEXT:  .LBB43_4: @ %atomicrmw.start
9308; CHECK-ARM8-NEXT:    @ in Loop: Header=BB43_1 Depth=1
9309; CHECK-ARM8-NEXT:    mov r0, r5
9310; CHECK-ARM8-NEXT:    str r0, [sp] @ 4-byte Spill
9311; CHECK-ARM8-NEXT:    eor r3, r0, r1
9312; CHECK-ARM8-NEXT:    mov r1, r4
9313; CHECK-ARM8-NEXT:    str r1, [sp, #4] @ 4-byte Spill
9314; CHECK-ARM8-NEXT:    eor r2, r1, r2
9315; CHECK-ARM8-NEXT:    orr r2, r2, r3
9316; CHECK-ARM8-NEXT:    cmp r2, #0
9317; CHECK-ARM8-NEXT:    str r1, [sp, #8] @ 4-byte Spill
9318; CHECK-ARM8-NEXT:    str r0, [sp, #12] @ 4-byte Spill
9319; CHECK-ARM8-NEXT:    bne .LBB43_1
9320; CHECK-ARM8-NEXT:    b .LBB43_5
9321; CHECK-ARM8-NEXT:  .LBB43_5: @ %atomicrmw.end
9322; CHECK-ARM8-NEXT:    ldr r1, [sp] @ 4-byte Reload
9323; CHECK-ARM8-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
9324; CHECK-ARM8-NEXT:    add sp, sp, #16
9325; CHECK-ARM8-NEXT:    pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
9326;
9327; CHECK-ARM6-LABEL: test_umin_i64:
9328; CHECK-ARM6:       @ %bb.0: @ %entry
9329; CHECK-ARM6-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
9330; CHECK-ARM6-NEXT:    push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
9331; CHECK-ARM6-NEXT:    .pad #16
9332; CHECK-ARM6-NEXT:    sub sp, sp, #16
9333; CHECK-ARM6-NEXT:    ldr r0, .LCPI43_0
9334; CHECK-ARM6-NEXT:    ldr r1, [r0]
9335; CHECK-ARM6-NEXT:    ldr r0, [r0, #4]
9336; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
9337; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
9338; CHECK-ARM6-NEXT:    b .LBB43_1
9339; CHECK-ARM6-NEXT:  .LBB43_1: @ %atomicrmw.start
9340; CHECK-ARM6-NEXT:    @ =>This Loop Header: Depth=1
9341; CHECK-ARM6-NEXT:    @ Child Loop BB43_2 Depth 2
9342; CHECK-ARM6-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
9343; CHECK-ARM6-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
9344; CHECK-ARM6-NEXT:    mov r8, r2
9345; CHECK-ARM6-NEXT:    mov r9, r1
9346; CHECK-ARM6-NEXT:    subs r0, r2, #2
9347; CHECK-ARM6-NEXT:    sbcs r0, r1, #0
9348; CHECK-ARM6-NEXT:    mov r0, #0
9349; CHECK-ARM6-NEXT:    movlo r0, #1
9350; CHECK-ARM6-NEXT:    mov r10, #1
9351; CHECK-ARM6-NEXT:    movlo r10, r2
9352; CHECK-ARM6-NEXT:    cmp r0, #0
9353; CHECK-ARM6-NEXT:    movne r0, r1
9354; CHECK-ARM6-NEXT:    @ kill: def $r10 killed $r10 def $r10_r11
9355; CHECK-ARM6-NEXT:    mov r11, r0
9356; CHECK-ARM6-NEXT:    ldr r6, .LCPI43_0
9357; CHECK-ARM6-NEXT:    @ implicit-def: $r0
9358; CHECK-ARM6-NEXT:    @ implicit-def: $r3
9359; CHECK-ARM6-NEXT:    @ kill: def $r6 killed $r6 def $r6_r7
9360; CHECK-ARM6-NEXT:    mov r7, r0
9361; CHECK-ARM6-NEXT:  .LBB43_2: @ %atomicrmw.start
9362; CHECK-ARM6-NEXT:    @ Parent Loop BB43_1 Depth=1
9363; CHECK-ARM6-NEXT:    @ => This Inner Loop Header: Depth=2
9364; CHECK-ARM6-NEXT:    ldrexd r4, r5, [r6]
9365; CHECK-ARM6-NEXT:    cmp r4, r8
9366; CHECK-ARM6-NEXT:    cmpeq r5, r9
9367; CHECK-ARM6-NEXT:    bne .LBB43_4
9368; CHECK-ARM6-NEXT:  @ %bb.3: @ %atomicrmw.start
9369; CHECK-ARM6-NEXT:    @ in Loop: Header=BB43_2 Depth=2
9370; CHECK-ARM6-NEXT:    strexd r7, r10, r11, [r6]
9371; CHECK-ARM6-NEXT:    cmp r7, #0
9372; CHECK-ARM6-NEXT:    bne .LBB43_2
9373; CHECK-ARM6-NEXT:  .LBB43_4: @ %atomicrmw.start
9374; CHECK-ARM6-NEXT:    @ in Loop: Header=BB43_1 Depth=1
9375; CHECK-ARM6-NEXT:    mov r0, r5
9376; CHECK-ARM6-NEXT:    str r0, [sp] @ 4-byte Spill
9377; CHECK-ARM6-NEXT:    eor r3, r0, r1
9378; CHECK-ARM6-NEXT:    mov r1, r4
9379; CHECK-ARM6-NEXT:    str r1, [sp, #4] @ 4-byte Spill
9380; CHECK-ARM6-NEXT:    eor r2, r1, r2
9381; CHECK-ARM6-NEXT:    orr r2, r2, r3
9382; CHECK-ARM6-NEXT:    cmp r2, #0
9383; CHECK-ARM6-NEXT:    str r1, [sp, #8] @ 4-byte Spill
9384; CHECK-ARM6-NEXT:    str r0, [sp, #12] @ 4-byte Spill
9385; CHECK-ARM6-NEXT:    bne .LBB43_1
9386; CHECK-ARM6-NEXT:    b .LBB43_5
9387; CHECK-ARM6-NEXT:  .LBB43_5: @ %atomicrmw.end
9388; CHECK-ARM6-NEXT:    ldr r1, [sp] @ 4-byte Reload
9389; CHECK-ARM6-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
9390; CHECK-ARM6-NEXT:    add sp, sp, #16
9391; CHECK-ARM6-NEXT:    pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
9392; CHECK-ARM6-NEXT:    .p2align 2
9393; CHECK-ARM6-NEXT:  @ %bb.6:
9394; CHECK-ARM6-NEXT:  .LCPI43_0:
9395; CHECK-ARM6-NEXT:    .long atomic_i64
9396;
9397; CHECK-THUMB7-LABEL: test_umin_i64:
9398; CHECK-THUMB7:       @ %bb.0: @ %entry
9399; CHECK-THUMB7-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
9400; CHECK-THUMB7-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11, lr}
9401; CHECK-THUMB7-NEXT:    .pad #16
9402; CHECK-THUMB7-NEXT:    sub sp, #16
9403; CHECK-THUMB7-NEXT:    movw r0, :lower16:atomic_i64
9404; CHECK-THUMB7-NEXT:    movt r0, :upper16:atomic_i64
9405; CHECK-THUMB7-NEXT:    ldr r1, [r0]
9406; CHECK-THUMB7-NEXT:    ldr r0, [r0, #4]
9407; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
9408; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
9409; CHECK-THUMB7-NEXT:    b .LBB43_1
9410; CHECK-THUMB7-NEXT:  .LBB43_1: @ %atomicrmw.start
9411; CHECK-THUMB7-NEXT:    @ =>This Loop Header: Depth=1
9412; CHECK-THUMB7-NEXT:    @ Child Loop BB43_2 Depth 2
9413; CHECK-THUMB7-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
9414; CHECK-THUMB7-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
9415; CHECK-THUMB7-NEXT:    mov r8, r2
9416; CHECK-THUMB7-NEXT:    mov r9, r1
9417; CHECK-THUMB7-NEXT:    subs r0, r2, #2
9418; CHECK-THUMB7-NEXT:    sbcs r0, r1, #0
9419; CHECK-THUMB7-NEXT:    mov.w r0, #0
9420; CHECK-THUMB7-NEXT:    it lo
9421; CHECK-THUMB7-NEXT:    movlo r0, #1
9422; CHECK-THUMB7-NEXT:    mov.w r10, #1
9423; CHECK-THUMB7-NEXT:    it lo
9424; CHECK-THUMB7-NEXT:    movlo r10, r2
9425; CHECK-THUMB7-NEXT:    cmp r0, #0
9426; CHECK-THUMB7-NEXT:    it ne
9427; CHECK-THUMB7-NEXT:    movne r0, r1
9428; CHECK-THUMB7-NEXT:    @ kill: def $r10 killed $r10 def $r10_r11
9429; CHECK-THUMB7-NEXT:    mov r11, r0
9430; CHECK-THUMB7-NEXT:    movw r6, :lower16:atomic_i64
9431; CHECK-THUMB7-NEXT:    movt r6, :upper16:atomic_i64
9432; CHECK-THUMB7-NEXT:    @ implicit-def: $r0
9433; CHECK-THUMB7-NEXT:    @ implicit-def: $r3
9434; CHECK-THUMB7-NEXT:    @ kill: def $r6 killed $r6 def $r6_r7
9435; CHECK-THUMB7-NEXT:    mov r7, r0
9436; CHECK-THUMB7-NEXT:  .LBB43_2: @ %atomicrmw.start
9437; CHECK-THUMB7-NEXT:    @ Parent Loop BB43_1 Depth=1
9438; CHECK-THUMB7-NEXT:    @ => This Inner Loop Header: Depth=2
9439; CHECK-THUMB7-NEXT:    ldrexd r4, r5, [r6]
9440; CHECK-THUMB7-NEXT:    cmp r4, r8
9441; CHECK-THUMB7-NEXT:    it eq
9442; CHECK-THUMB7-NEXT:    cmpeq r5, r9
9443; CHECK-THUMB7-NEXT:    bne .LBB43_4
9444; CHECK-THUMB7-NEXT:  @ %bb.3: @ %atomicrmw.start
9445; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB43_2 Depth=2
9446; CHECK-THUMB7-NEXT:    strexd r7, r10, r11, [r6]
9447; CHECK-THUMB7-NEXT:    cmp r7, #0
9448; CHECK-THUMB7-NEXT:    bne .LBB43_2
9449; CHECK-THUMB7-NEXT:  .LBB43_4: @ %atomicrmw.start
9450; CHECK-THUMB7-NEXT:    @ in Loop: Header=BB43_1 Depth=1
9451; CHECK-THUMB7-NEXT:    mov r0, r5
9452; CHECK-THUMB7-NEXT:    str r0, [sp] @ 4-byte Spill
9453; CHECK-THUMB7-NEXT:    eor.w r3, r0, r1
9454; CHECK-THUMB7-NEXT:    mov r1, r4
9455; CHECK-THUMB7-NEXT:    str r1, [sp, #4] @ 4-byte Spill
9456; CHECK-THUMB7-NEXT:    eors r2, r1
9457; CHECK-THUMB7-NEXT:    orrs r2, r3
9458; CHECK-THUMB7-NEXT:    cmp r2, #0
9459; CHECK-THUMB7-NEXT:    str r1, [sp, #8] @ 4-byte Spill
9460; CHECK-THUMB7-NEXT:    str r0, [sp, #12] @ 4-byte Spill
9461; CHECK-THUMB7-NEXT:    bne .LBB43_1
9462; CHECK-THUMB7-NEXT:    b .LBB43_5
9463; CHECK-THUMB7-NEXT:  .LBB43_5: @ %atomicrmw.end
9464; CHECK-THUMB7-NEXT:    ldr r1, [sp] @ 4-byte Reload
9465; CHECK-THUMB7-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
9466; CHECK-THUMB7-NEXT:    add sp, #16
9467; CHECK-THUMB7-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11, pc}
9468;
9469; CHECK-THUMB6-LABEL: test_umin_i64:
9470; CHECK-THUMB6:       @ %bb.0: @ %entry
9471; CHECK-THUMB6-NEXT:    .save {r7, lr}
9472; CHECK-THUMB6-NEXT:    push {r7, lr}
9473; CHECK-THUMB6-NEXT:    ldr r0, .LCPI43_0
9474; CHECK-THUMB6-NEXT:    movs r2, #1
9475; CHECK-THUMB6-NEXT:    movs r3, #0
9476; CHECK-THUMB6-NEXT:    bl __sync_fetch_and_umin_8
9477; CHECK-THUMB6-NEXT:    pop {r7, pc}
9478; CHECK-THUMB6-NEXT:    .p2align 2
9479; CHECK-THUMB6-NEXT:  @ %bb.1:
9480; CHECK-THUMB6-NEXT:  .LCPI43_0:
9481; CHECK-THUMB6-NEXT:    .long atomic_i64
9482;
9483; CHECK-THUMB8BASE-LABEL: test_umin_i64:
9484; CHECK-THUMB8BASE:       @ %bb.0: @ %entry
9485; CHECK-THUMB8BASE-NEXT:    .save {r4, lr}
9486; CHECK-THUMB8BASE-NEXT:    push {r4, lr}
9487; CHECK-THUMB8BASE-NEXT:    .pad #72
9488; CHECK-THUMB8BASE-NEXT:    sub sp, #72
9489; CHECK-THUMB8BASE-NEXT:    movw r1, :lower16:atomic_i64
9490; CHECK-THUMB8BASE-NEXT:    movt r1, :upper16:atomic_i64
9491; CHECK-THUMB8BASE-NEXT:    ldr r0, [r1, #4]
9492; CHECK-THUMB8BASE-NEXT:    ldr r1, [r1]
9493; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #56] @ 4-byte Spill
9494; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #60] @ 4-byte Spill
9495; CHECK-THUMB8BASE-NEXT:    b .LBB43_1
9496; CHECK-THUMB8BASE-NEXT:  .LBB43_1: @ %atomicrmw.start
9497; CHECK-THUMB8BASE-NEXT:    @ =>This Inner Loop Header: Depth=1
9498; CHECK-THUMB8BASE-NEXT:    ldr r3, [sp, #56] @ 4-byte Reload
9499; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #60] @ 4-byte Reload
9500; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #36] @ 4-byte Spill
9501; CHECK-THUMB8BASE-NEXT:    str r3, [sp, #40] @ 4-byte Spill
9502; CHECK-THUMB8BASE-NEXT:    movs r0, #1
9503; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #44] @ 4-byte Spill
9504; CHECK-THUMB8BASE-NEXT:    movs r2, #0
9505; CHECK-THUMB8BASE-NEXT:    str r2, [sp, #48] @ 4-byte Spill
9506; CHECK-THUMB8BASE-NEXT:    subs r3, r3, #2
9507; CHECK-THUMB8BASE-NEXT:    sbcs r1, r2
9508; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #52] @ 4-byte Spill
9509; CHECK-THUMB8BASE-NEXT:    blo .LBB43_3
9510; CHECK-THUMB8BASE-NEXT:  @ %bb.2: @ %atomicrmw.start
9511; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB43_1 Depth=1
9512; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #48] @ 4-byte Reload
9513; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #52] @ 4-byte Spill
9514; CHECK-THUMB8BASE-NEXT:  .LBB43_3: @ %atomicrmw.start
9515; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB43_1 Depth=1
9516; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #40] @ 4-byte Reload
9517; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #52] @ 4-byte Reload
9518; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #28] @ 4-byte Spill
9519; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #32] @ 4-byte Spill
9520; CHECK-THUMB8BASE-NEXT:    blo .LBB43_5
9521; CHECK-THUMB8BASE-NEXT:  @ %bb.4: @ %atomicrmw.start
9522; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB43_1 Depth=1
9523; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #44] @ 4-byte Reload
9524; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #32] @ 4-byte Spill
9525; CHECK-THUMB8BASE-NEXT:  .LBB43_5: @ %atomicrmw.start
9526; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB43_1 Depth=1
9527; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #36] @ 4-byte Reload
9528; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #28] @ 4-byte Reload
9529; CHECK-THUMB8BASE-NEXT:    ldr r2, [sp, #32] @ 4-byte Reload
9530; CHECK-THUMB8BASE-NEXT:    str r2, [sp, #20] @ 4-byte Spill
9531; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #24] @ 4-byte Spill
9532; CHECK-THUMB8BASE-NEXT:    cbnz r1, .LBB43_7
9533; CHECK-THUMB8BASE-NEXT:  @ %bb.6: @ %atomicrmw.start
9534; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB43_1 Depth=1
9535; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #28] @ 4-byte Reload
9536; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #24] @ 4-byte Spill
9537; CHECK-THUMB8BASE-NEXT:  .LBB43_7: @ %atomicrmw.start
9538; CHECK-THUMB8BASE-NEXT:    @ in Loop: Header=BB43_1 Depth=1
9539; CHECK-THUMB8BASE-NEXT:    ldr r2, [sp, #20] @ 4-byte Reload
9540; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #48] @ 4-byte Reload
9541; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #36] @ 4-byte Reload
9542; CHECK-THUMB8BASE-NEXT:    ldr r4, [sp, #40] @ 4-byte Reload
9543; CHECK-THUMB8BASE-NEXT:    ldr r3, [sp, #24] @ 4-byte Reload
9544; CHECK-THUMB8BASE-NEXT:    str r4, [sp, #64]
9545; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #68]
9546; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #4]
9547; CHECK-THUMB8BASE-NEXT:    str r0, [sp]
9548; CHECK-THUMB8BASE-NEXT:    movw r0, :lower16:atomic_i64
9549; CHECK-THUMB8BASE-NEXT:    movt r0, :upper16:atomic_i64
9550; CHECK-THUMB8BASE-NEXT:    add r1, sp, #64
9551; CHECK-THUMB8BASE-NEXT:    bl __atomic_compare_exchange_8
9552; CHECK-THUMB8BASE-NEXT:    mov r2, r0
9553; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #68]
9554; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #12] @ 4-byte Spill
9555; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #64]
9556; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #16] @ 4-byte Spill
9557; CHECK-THUMB8BASE-NEXT:    cmp r2, #0
9558; CHECK-THUMB8BASE-NEXT:    str r1, [sp, #56] @ 4-byte Spill
9559; CHECK-THUMB8BASE-NEXT:    str r0, [sp, #60] @ 4-byte Spill
9560; CHECK-THUMB8BASE-NEXT:    beq .LBB43_1
9561; CHECK-THUMB8BASE-NEXT:    b .LBB43_8
9562; CHECK-THUMB8BASE-NEXT:  .LBB43_8: @ %atomicrmw.end
9563; CHECK-THUMB8BASE-NEXT:    ldr r1, [sp, #12] @ 4-byte Reload
9564; CHECK-THUMB8BASE-NEXT:    ldr r0, [sp, #16] @ 4-byte Reload
9565; CHECK-THUMB8BASE-NEXT:    add sp, #72
9566; CHECK-THUMB8BASE-NEXT:    pop {r4, pc}
9567entry:
9568  %0 = atomicrmw umin ptr @atomic_i64, i64 1 monotonic
9569  ret i64 %0
9570}
9571