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