1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=arm-linux-gnueabi -asm-verbose=false -verify-machineinstrs | FileCheck %s -check-prefix=CHECK-ARM
3; RUN: llc < %s -mtriple=thumb-linux-gnueabi -asm-verbose=false -verify-machineinstrs | FileCheck %s -check-prefix=CHECK-THUMB
4
5; RUN: llc < %s -mtriple=armv6-linux-gnueabi -asm-verbose=false -verify-machineinstrs | FileCheck %s -check-prefix=CHECK-ARMV6
6; RUN: llc < %s -mtriple=thumbv6-linux-gnueabi -asm-verbose=false -verify-machineinstrs | FileCheck %s -check-prefix=CHECK-THUMBV6
7
8; RUN: llc < %s -mtriple=armv7-linux-gnueabi -asm-verbose=false -verify-machineinstrs | FileCheck %s -check-prefix=CHECK-ARMV7
9; RUN: llc < %s -mtriple=thumbv7-linux-gnueabi -asm-verbose=false -verify-machineinstrs | FileCheck %s -check-prefix=CHECK-THUMBV7
10
11define zeroext i1 @test_cmpxchg_res_i8(i8* %addr, i8 %desired, i8 zeroext %new) {
12; CHECK-ARM-LABEL: test_cmpxchg_res_i8:
13; CHECK-ARM:         .save {r4, lr}
14; CHECK-ARM-NEXT:    push {r4, lr}
15; CHECK-ARM-NEXT:    mov r4, r1
16; CHECK-ARM-NEXT:    bl __sync_val_compare_and_swap_1
17; CHECK-ARM-NEXT:    and r1, r4, #255
18; CHECK-ARM-NEXT:    sub r0, r0, r1
19; CHECK-ARM-NEXT:    rsbs r1, r0, #0
20; CHECK-ARM-NEXT:    adc r0, r0, r1
21; CHECK-ARM-NEXT:    pop {r4, lr}
22; CHECK-ARM-NEXT:    mov pc, lr
23;
24; CHECK-THUMB-LABEL: test_cmpxchg_res_i8:
25; CHECK-THUMB:         .save {r4, lr}
26; CHECK-THUMB-NEXT:    push {r4, lr}
27; CHECK-THUMB-NEXT:    movs r4, r1
28; CHECK-THUMB-NEXT:    bl __sync_val_compare_and_swap_1
29; CHECK-THUMB-NEXT:    movs r1, #255
30; CHECK-THUMB-NEXT:    ands r1, r4
31; CHECK-THUMB-NEXT:    subs r1, r0, r1
32; CHECK-THUMB-NEXT:    rsbs r0, r1, #0
33; CHECK-THUMB-NEXT:    adcs r0, r1
34; CHECK-THUMB-NEXT:    pop {r4}
35; CHECK-THUMB-NEXT:    pop {r1}
36; CHECK-THUMB-NEXT:    bx r1
37;
38; CHECK-ARMV6-LABEL: test_cmpxchg_res_i8:
39; CHECK-ARMV6:         uxtb r1, r1
40; CHECK-ARMV6-NEXT:  .LBB0_1:
41; CHECK-ARMV6-NEXT:    ldrexb r3, [r0]
42; CHECK-ARMV6-NEXT:    cmp r3, r1
43; CHECK-ARMV6-NEXT:    movne r0, #0
44; CHECK-ARMV6-NEXT:    bxne lr
45; CHECK-ARMV6-NEXT:  .LBB0_2:
46; CHECK-ARMV6-NEXT:    strexb r3, r2, [r0]
47; CHECK-ARMV6-NEXT:    cmp r3, #0
48; CHECK-ARMV6-NEXT:    moveq r0, #1
49; CHECK-ARMV6-NEXT:    bxeq lr
50; CHECK-ARMV6-NEXT:    b .LBB0_1
51;
52; CHECK-THUMBV6-LABEL: test_cmpxchg_res_i8:
53; CHECK-THUMBV6:         .save {r4, lr}
54; CHECK-THUMBV6-NEXT:    push {r4, lr}
55; CHECK-THUMBV6-NEXT:    mov r4, r1
56; CHECK-THUMBV6-NEXT:    bl __sync_val_compare_and_swap_1
57; CHECK-THUMBV6-NEXT:    uxtb r1, r4
58; CHECK-THUMBV6-NEXT:    subs r1, r0, r1
59; CHECK-THUMBV6-NEXT:    rsbs r0, r1, #0
60; CHECK-THUMBV6-NEXT:    adcs r0, r1
61; CHECK-THUMBV6-NEXT:    pop {r4, pc}
62;
63; CHECK-ARMV7-LABEL: test_cmpxchg_res_i8:
64; CHECK-ARMV7:         uxtb r1, r1
65; CHECK-ARMV7-NEXT:  .LBB0_1:
66; CHECK-ARMV7-NEXT:    ldrexb r3, [r0]
67; CHECK-ARMV7-NEXT:    cmp r3, r1
68; CHECK-ARMV7-NEXT:    bne .LBB0_3
69; CHECK-ARMV7-NEXT:    strexb r3, r2, [r0]
70; CHECK-ARMV7-NEXT:    cmp r3, #0
71; CHECK-ARMV7-NEXT:    moveq r0, #1
72; CHECK-ARMV7-NEXT:    bxeq lr
73; CHECK-ARMV7-NEXT:    b .LBB0_1
74; CHECK-ARMV7-NEXT:  .LBB0_3:
75; CHECK-ARMV7-NEXT:    mov r0, #0
76; CHECK-ARMV7-NEXT:    clrex
77; CHECK-ARMV7-NEXT:    bx lr
78;
79; CHECK-THUMBV7-LABEL: test_cmpxchg_res_i8:
80; CHECK-THUMBV7:         uxtb r1, r1
81; CHECK-THUMBV7-NEXT:  .LBB0_1:
82; CHECK-THUMBV7-NEXT:    ldrexb r3, [r0]
83; CHECK-THUMBV7-NEXT:    cmp r3, r1
84; CHECK-THUMBV7-NEXT:    bne .LBB0_3
85; CHECK-THUMBV7-NEXT:    strexb r3, r2, [r0]
86; CHECK-THUMBV7-NEXT:    cmp r3, #0
87; CHECK-THUMBV7-NEXT:    itt eq
88; CHECK-THUMBV7-NEXT:    moveq r0, #1
89; CHECK-THUMBV7-NEXT:    bxeq lr
90; CHECK-THUMBV7-NEXT:    b .LBB0_1
91; CHECK-THUMBV7-NEXT:  .LBB0_3:
92; CHECK-THUMBV7-NEXT:    movs r0, #0
93; CHECK-THUMBV7-NEXT:    clrex
94; CHECK-THUMBV7-NEXT:    bx lr
95entry:
96  %0 = cmpxchg i8* %addr, i8 %desired, i8 %new monotonic monotonic
97  %1 = extractvalue { i8, i1 } %0, 1
98  ret i1 %1
99}
100