9571 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; Test the instruction sequences produced by atomicrmw instructions. In3; particular, ensure there are no stores/spills inserted between the exclusive4; 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-ARM87; RUN: llc -mtriple=armv6-unknown-none-eabi -O0 -o - %s | FileCheck %s --check-prefix=CHECK-ARM68; RUN: llc -mtriple=thumbv7-unknown-none-eabi -O0 -o - %s | FileCheck %s --check-prefix=CHECK-THUMB79; RUN: llc -mtriple=thumbv6-unknown-none-eabi -O0 -o - %s | FileCheck %s --check-prefix=CHECK-THUMB610; RUN: llc -mtriple=thumbv8m.base-unknown-none-eabi -O0 -o - %s | FileCheck %s --check-prefix=CHECK-THUMB8BASE11 12@atomic_i8 = external global i813@atomic_i16 = external global i1614@atomic_i32 = external global i3215@atomic_i64 = external global i6416 17define i8 @test_xchg_i8() {18; CHECK-ARM8-LABEL: test_xchg_i8:19; CHECK-ARM8: @ %bb.0: @ %entry20; CHECK-ARM8-NEXT: .pad #821; CHECK-ARM8-NEXT: sub sp, sp, #822; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i823; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i824; CHECK-ARM8-NEXT: ldrb r0, [r0]25; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill26; CHECK-ARM8-NEXT: b .LBB0_127; CHECK-ARM8-NEXT: .LBB0_1: @ %atomicrmw.start28; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=129; CHECK-ARM8-NEXT: @ Child Loop BB0_2 Depth 230; CHECK-ARM8-NEXT: ldr r1, [sp, #4] @ 4-byte Reload31; CHECK-ARM8-NEXT: movw r3, :lower16:atomic_i832; CHECK-ARM8-NEXT: movt r3, :upper16:atomic_i833; CHECK-ARM8-NEXT: mov r12, #134; CHECK-ARM8-NEXT: uxtb r1, r135; CHECK-ARM8-NEXT: .LBB0_2: @ %atomicrmw.start36; CHECK-ARM8-NEXT: @ Parent Loop BB0_1 Depth=137; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=238; CHECK-ARM8-NEXT: ldrexb r0, [r3]39; CHECK-ARM8-NEXT: cmp r0, r140; CHECK-ARM8-NEXT: bne .LBB0_441; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start42; CHECK-ARM8-NEXT: @ in Loop: Header=BB0_2 Depth=243; CHECK-ARM8-NEXT: strexb r2, r12, [r3]44; CHECK-ARM8-NEXT: cmp r2, #045; CHECK-ARM8-NEXT: bne .LBB0_246; CHECK-ARM8-NEXT: .LBB0_4: @ %atomicrmw.start47; CHECK-ARM8-NEXT: @ in Loop: Header=BB0_1 Depth=148; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill49; CHECK-ARM8-NEXT: uxtb r1, r150; CHECK-ARM8-NEXT: sub r1, r0, r151; CHECK-ARM8-NEXT: clz r1, r152; CHECK-ARM8-NEXT: lsr r1, r1, #553; CHECK-ARM8-NEXT: cmp r1, #154; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill55; CHECK-ARM8-NEXT: bne .LBB0_156; CHECK-ARM8-NEXT: b .LBB0_557; CHECK-ARM8-NEXT: .LBB0_5: @ %atomicrmw.end58; CHECK-ARM8-NEXT: ldr r0, [sp] @ 4-byte Reload59; CHECK-ARM8-NEXT: add sp, sp, #860; CHECK-ARM8-NEXT: bx lr61;62; CHECK-ARM6-LABEL: test_xchg_i8:63; CHECK-ARM6: @ %bb.0: @ %entry64; CHECK-ARM6-NEXT: .pad #865; CHECK-ARM6-NEXT: sub sp, sp, #866; CHECK-ARM6-NEXT: ldr r0, .LCPI0_067; CHECK-ARM6-NEXT: ldrb r0, [r0]68; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill69; CHECK-ARM6-NEXT: b .LBB0_170; CHECK-ARM6-NEXT: .LBB0_1: @ %atomicrmw.start71; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=172; CHECK-ARM6-NEXT: @ Child Loop BB0_2 Depth 273; CHECK-ARM6-NEXT: ldr r1, [sp, #4] @ 4-byte Reload74; CHECK-ARM6-NEXT: ldr r3, .LCPI0_075; CHECK-ARM6-NEXT: mov r12, #176; CHECK-ARM6-NEXT: uxtb r1, r177; CHECK-ARM6-NEXT: .LBB0_2: @ %atomicrmw.start78; CHECK-ARM6-NEXT: @ Parent Loop BB0_1 Depth=179; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=280; CHECK-ARM6-NEXT: ldrexb r0, [r3]81; CHECK-ARM6-NEXT: cmp r0, r182; CHECK-ARM6-NEXT: bne .LBB0_483; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start84; CHECK-ARM6-NEXT: @ in Loop: Header=BB0_2 Depth=285; CHECK-ARM6-NEXT: strexb r2, r12, [r3]86; CHECK-ARM6-NEXT: cmp r2, #087; CHECK-ARM6-NEXT: bne .LBB0_288; CHECK-ARM6-NEXT: .LBB0_4: @ %atomicrmw.start89; CHECK-ARM6-NEXT: @ in Loop: Header=BB0_1 Depth=190; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill91; CHECK-ARM6-NEXT: uxtb r1, r192; CHECK-ARM6-NEXT: sub r1, r0, r193; CHECK-ARM6-NEXT: clz r1, r194; CHECK-ARM6-NEXT: lsr r1, r1, #595; CHECK-ARM6-NEXT: cmp r1, #196; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill97; CHECK-ARM6-NEXT: bne .LBB0_198; CHECK-ARM6-NEXT: b .LBB0_599; CHECK-ARM6-NEXT: .LBB0_5: @ %atomicrmw.end100; CHECK-ARM6-NEXT: ldr r0, [sp] @ 4-byte Reload101; CHECK-ARM6-NEXT: add sp, sp, #8102; CHECK-ARM6-NEXT: bx lr103; CHECK-ARM6-NEXT: .p2align 2104; CHECK-ARM6-NEXT: @ %bb.6:105; CHECK-ARM6-NEXT: .LCPI0_0:106; CHECK-ARM6-NEXT: .long atomic_i8107;108; CHECK-THUMB7-LABEL: test_xchg_i8:109; CHECK-THUMB7: @ %bb.0: @ %entry110; CHECK-THUMB7-NEXT: .pad #8111; CHECK-THUMB7-NEXT: sub sp, #8112; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i8113; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i8114; CHECK-THUMB7-NEXT: ldrb r0, [r0]115; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill116; CHECK-THUMB7-NEXT: b .LBB0_1117; CHECK-THUMB7-NEXT: .LBB0_1: @ %atomicrmw.start118; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=1119; CHECK-THUMB7-NEXT: @ Child Loop BB0_2 Depth 2120; CHECK-THUMB7-NEXT: ldr r1, [sp, #4] @ 4-byte Reload121; CHECK-THUMB7-NEXT: movw r3, :lower16:atomic_i8122; CHECK-THUMB7-NEXT: movt r3, :upper16:atomic_i8123; CHECK-THUMB7-NEXT: mov.w r12, #1124; CHECK-THUMB7-NEXT: uxtb r1, r1125; CHECK-THUMB7-NEXT: .LBB0_2: @ %atomicrmw.start126; CHECK-THUMB7-NEXT: @ Parent Loop BB0_1 Depth=1127; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=2128; CHECK-THUMB7-NEXT: ldrexb r0, [r3]129; CHECK-THUMB7-NEXT: cmp r0, r1130; CHECK-THUMB7-NEXT: bne .LBB0_4131; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start132; CHECK-THUMB7-NEXT: @ in Loop: Header=BB0_2 Depth=2133; CHECK-THUMB7-NEXT: strexb r2, r12, [r3]134; CHECK-THUMB7-NEXT: cmp r2, #0135; CHECK-THUMB7-NEXT: bne .LBB0_2136; CHECK-THUMB7-NEXT: .LBB0_4: @ %atomicrmw.start137; CHECK-THUMB7-NEXT: @ in Loop: Header=BB0_1 Depth=1138; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill139; CHECK-THUMB7-NEXT: uxtb r1, r1140; CHECK-THUMB7-NEXT: subs r1, r0, r1141; CHECK-THUMB7-NEXT: clz r1, r1142; CHECK-THUMB7-NEXT: lsrs r1, r1, #5143; CHECK-THUMB7-NEXT: cmp r1, #1144; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill145; CHECK-THUMB7-NEXT: bne .LBB0_1146; CHECK-THUMB7-NEXT: b .LBB0_5147; CHECK-THUMB7-NEXT: .LBB0_5: @ %atomicrmw.end148; CHECK-THUMB7-NEXT: ldr r0, [sp] @ 4-byte Reload149; CHECK-THUMB7-NEXT: add sp, #8150; CHECK-THUMB7-NEXT: bx lr151;152; CHECK-THUMB6-LABEL: test_xchg_i8:153; CHECK-THUMB6: @ %bb.0: @ %entry154; CHECK-THUMB6-NEXT: .save {r7, lr}155; CHECK-THUMB6-NEXT: push {r7, lr}156; CHECK-THUMB6-NEXT: ldr r0, .LCPI0_0157; CHECK-THUMB6-NEXT: movs r1, #1158; CHECK-THUMB6-NEXT: bl __sync_lock_test_and_set_1159; CHECK-THUMB6-NEXT: pop {r7, pc}160; CHECK-THUMB6-NEXT: .p2align 2161; CHECK-THUMB6-NEXT: @ %bb.1:162; CHECK-THUMB6-NEXT: .LCPI0_0:163; CHECK-THUMB6-NEXT: .long atomic_i8164;165; CHECK-THUMB8BASE-LABEL: test_xchg_i8:166; CHECK-THUMB8BASE: @ %bb.0: @ %entry167; CHECK-THUMB8BASE-NEXT: .save {r4, lr}168; CHECK-THUMB8BASE-NEXT: push {r4, lr}169; CHECK-THUMB8BASE-NEXT: .pad #8170; CHECK-THUMB8BASE-NEXT: sub sp, #8171; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i8172; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i8173; CHECK-THUMB8BASE-NEXT: ldrb r0, [r0]174; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill175; CHECK-THUMB8BASE-NEXT: b .LBB0_1176; CHECK-THUMB8BASE-NEXT: .LBB0_1: @ %atomicrmw.start177; CHECK-THUMB8BASE-NEXT: @ =>This Loop Header: Depth=1178; CHECK-THUMB8BASE-NEXT: @ Child Loop BB0_2 Depth 2179; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #4] @ 4-byte Reload180; CHECK-THUMB8BASE-NEXT: movw r3, :lower16:atomic_i8181; CHECK-THUMB8BASE-NEXT: movt r3, :upper16:atomic_i8182; CHECK-THUMB8BASE-NEXT: movs r4, #1183; CHECK-THUMB8BASE-NEXT: uxtb r1, r1184; CHECK-THUMB8BASE-NEXT: .LBB0_2: @ %atomicrmw.start185; CHECK-THUMB8BASE-NEXT: @ Parent Loop BB0_1 Depth=1186; CHECK-THUMB8BASE-NEXT: @ => This Inner Loop Header: Depth=2187; CHECK-THUMB8BASE-NEXT: ldrexb r0, [r3]188; CHECK-THUMB8BASE-NEXT: cmp r0, r1189; CHECK-THUMB8BASE-NEXT: bne .LBB0_4190; CHECK-THUMB8BASE-NEXT: @ %bb.3: @ %atomicrmw.start191; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB0_2 Depth=2192; CHECK-THUMB8BASE-NEXT: strexb r2, r4, [r3]193; CHECK-THUMB8BASE-NEXT: cmp r2, #0194; CHECK-THUMB8BASE-NEXT: bne .LBB0_2195; CHECK-THUMB8BASE-NEXT: .LBB0_4: @ %atomicrmw.start196; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB0_1 Depth=1197; CHECK-THUMB8BASE-NEXT: str r0, [sp] @ 4-byte Spill198; CHECK-THUMB8BASE-NEXT: uxtb r1, r1199; CHECK-THUMB8BASE-NEXT: subs r1, r0, r1200; CHECK-THUMB8BASE-NEXT: rsbs r2, r1, #0201; CHECK-THUMB8BASE-NEXT: adcs r1, r2202; CHECK-THUMB8BASE-NEXT: cmp r1, #1203; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill204; CHECK-THUMB8BASE-NEXT: bne .LBB0_1205; CHECK-THUMB8BASE-NEXT: b .LBB0_5206; CHECK-THUMB8BASE-NEXT: .LBB0_5: @ %atomicrmw.end207; CHECK-THUMB8BASE-NEXT: ldr r0, [sp] @ 4-byte Reload208; CHECK-THUMB8BASE-NEXT: add sp, #8209; CHECK-THUMB8BASE-NEXT: pop {r4, pc}210entry:211 %0 = atomicrmw xchg ptr @atomic_i8, i8 1 monotonic212 ret i8 %0213}214define i8 @test_add_i8() {215; CHECK-ARM8-LABEL: test_add_i8:216; CHECK-ARM8: @ %bb.0: @ %entry217; CHECK-ARM8-NEXT: .pad #8218; CHECK-ARM8-NEXT: sub sp, sp, #8219; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i8220; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i8221; CHECK-ARM8-NEXT: ldrb r0, [r0]222; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill223; CHECK-ARM8-NEXT: b .LBB1_1224; CHECK-ARM8-NEXT: .LBB1_1: @ %atomicrmw.start225; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=1226; CHECK-ARM8-NEXT: @ Child Loop BB1_2 Depth 2227; CHECK-ARM8-NEXT: ldr r1, [sp, #4] @ 4-byte Reload228; CHECK-ARM8-NEXT: add r12, r1, #1229; CHECK-ARM8-NEXT: movw r3, :lower16:atomic_i8230; CHECK-ARM8-NEXT: movt r3, :upper16:atomic_i8231; CHECK-ARM8-NEXT: uxtb r1, r1232; CHECK-ARM8-NEXT: .LBB1_2: @ %atomicrmw.start233; CHECK-ARM8-NEXT: @ Parent Loop BB1_1 Depth=1234; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=2235; CHECK-ARM8-NEXT: ldrexb r0, [r3]236; CHECK-ARM8-NEXT: cmp r0, r1237; CHECK-ARM8-NEXT: bne .LBB1_4238; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start239; CHECK-ARM8-NEXT: @ in Loop: Header=BB1_2 Depth=2240; CHECK-ARM8-NEXT: strexb r2, r12, [r3]241; CHECK-ARM8-NEXT: cmp r2, #0242; CHECK-ARM8-NEXT: bne .LBB1_2243; CHECK-ARM8-NEXT: .LBB1_4: @ %atomicrmw.start244; CHECK-ARM8-NEXT: @ in Loop: Header=BB1_1 Depth=1245; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill246; CHECK-ARM8-NEXT: uxtb r1, r1247; CHECK-ARM8-NEXT: sub r1, r0, r1248; CHECK-ARM8-NEXT: clz r1, r1249; CHECK-ARM8-NEXT: lsr r1, r1, #5250; CHECK-ARM8-NEXT: cmp r1, #1251; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill252; CHECK-ARM8-NEXT: bne .LBB1_1253; CHECK-ARM8-NEXT: b .LBB1_5254; CHECK-ARM8-NEXT: .LBB1_5: @ %atomicrmw.end255; CHECK-ARM8-NEXT: ldr r0, [sp] @ 4-byte Reload256; CHECK-ARM8-NEXT: add sp, sp, #8257; CHECK-ARM8-NEXT: bx lr258;259; CHECK-ARM6-LABEL: test_add_i8:260; CHECK-ARM6: @ %bb.0: @ %entry261; CHECK-ARM6-NEXT: .pad #8262; CHECK-ARM6-NEXT: sub sp, sp, #8263; CHECK-ARM6-NEXT: ldr r0, .LCPI1_0264; CHECK-ARM6-NEXT: ldrb r0, [r0]265; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill266; CHECK-ARM6-NEXT: b .LBB1_1267; CHECK-ARM6-NEXT: .LBB1_1: @ %atomicrmw.start268; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=1269; CHECK-ARM6-NEXT: @ Child Loop BB1_2 Depth 2270; CHECK-ARM6-NEXT: ldr r1, [sp, #4] @ 4-byte Reload271; CHECK-ARM6-NEXT: add r12, r1, #1272; CHECK-ARM6-NEXT: ldr r3, .LCPI1_0273; CHECK-ARM6-NEXT: uxtb r1, r1274; CHECK-ARM6-NEXT: .LBB1_2: @ %atomicrmw.start275; CHECK-ARM6-NEXT: @ Parent Loop BB1_1 Depth=1276; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=2277; CHECK-ARM6-NEXT: ldrexb r0, [r3]278; CHECK-ARM6-NEXT: cmp r0, r1279; CHECK-ARM6-NEXT: bne .LBB1_4280; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start281; CHECK-ARM6-NEXT: @ in Loop: Header=BB1_2 Depth=2282; CHECK-ARM6-NEXT: strexb r2, r12, [r3]283; CHECK-ARM6-NEXT: cmp r2, #0284; CHECK-ARM6-NEXT: bne .LBB1_2285; CHECK-ARM6-NEXT: .LBB1_4: @ %atomicrmw.start286; CHECK-ARM6-NEXT: @ in Loop: Header=BB1_1 Depth=1287; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill288; CHECK-ARM6-NEXT: uxtb r1, r1289; CHECK-ARM6-NEXT: sub r1, r0, r1290; CHECK-ARM6-NEXT: clz r1, r1291; CHECK-ARM6-NEXT: lsr r1, r1, #5292; CHECK-ARM6-NEXT: cmp r1, #1293; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill294; CHECK-ARM6-NEXT: bne .LBB1_1295; CHECK-ARM6-NEXT: b .LBB1_5296; CHECK-ARM6-NEXT: .LBB1_5: @ %atomicrmw.end297; CHECK-ARM6-NEXT: ldr r0, [sp] @ 4-byte Reload298; CHECK-ARM6-NEXT: add sp, sp, #8299; CHECK-ARM6-NEXT: bx lr300; CHECK-ARM6-NEXT: .p2align 2301; CHECK-ARM6-NEXT: @ %bb.6:302; CHECK-ARM6-NEXT: .LCPI1_0:303; CHECK-ARM6-NEXT: .long atomic_i8304;305; CHECK-THUMB7-LABEL: test_add_i8:306; CHECK-THUMB7: @ %bb.0: @ %entry307; CHECK-THUMB7-NEXT: .pad #8308; CHECK-THUMB7-NEXT: sub sp, #8309; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i8310; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i8311; CHECK-THUMB7-NEXT: ldrb r0, [r0]312; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill313; CHECK-THUMB7-NEXT: b .LBB1_1314; CHECK-THUMB7-NEXT: .LBB1_1: @ %atomicrmw.start315; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=1316; CHECK-THUMB7-NEXT: @ Child Loop BB1_2 Depth 2317; CHECK-THUMB7-NEXT: ldr r1, [sp, #4] @ 4-byte Reload318; CHECK-THUMB7-NEXT: add.w r12, r1, #1319; CHECK-THUMB7-NEXT: movw r3, :lower16:atomic_i8320; CHECK-THUMB7-NEXT: movt r3, :upper16:atomic_i8321; CHECK-THUMB7-NEXT: uxtb r1, r1322; CHECK-THUMB7-NEXT: .LBB1_2: @ %atomicrmw.start323; CHECK-THUMB7-NEXT: @ Parent Loop BB1_1 Depth=1324; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=2325; CHECK-THUMB7-NEXT: ldrexb r0, [r3]326; CHECK-THUMB7-NEXT: cmp r0, r1327; CHECK-THUMB7-NEXT: bne .LBB1_4328; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start329; CHECK-THUMB7-NEXT: @ in Loop: Header=BB1_2 Depth=2330; CHECK-THUMB7-NEXT: strexb r2, r12, [r3]331; CHECK-THUMB7-NEXT: cmp r2, #0332; CHECK-THUMB7-NEXT: bne .LBB1_2333; CHECK-THUMB7-NEXT: .LBB1_4: @ %atomicrmw.start334; CHECK-THUMB7-NEXT: @ in Loop: Header=BB1_1 Depth=1335; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill336; CHECK-THUMB7-NEXT: uxtb r1, r1337; CHECK-THUMB7-NEXT: subs r1, r0, r1338; CHECK-THUMB7-NEXT: clz r1, r1339; CHECK-THUMB7-NEXT: lsrs r1, r1, #5340; CHECK-THUMB7-NEXT: cmp r1, #1341; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill342; CHECK-THUMB7-NEXT: bne .LBB1_1343; CHECK-THUMB7-NEXT: b .LBB1_5344; CHECK-THUMB7-NEXT: .LBB1_5: @ %atomicrmw.end345; CHECK-THUMB7-NEXT: ldr r0, [sp] @ 4-byte Reload346; CHECK-THUMB7-NEXT: add sp, #8347; CHECK-THUMB7-NEXT: bx lr348;349; CHECK-THUMB6-LABEL: test_add_i8:350; CHECK-THUMB6: @ %bb.0: @ %entry351; CHECK-THUMB6-NEXT: .save {r7, lr}352; CHECK-THUMB6-NEXT: push {r7, lr}353; CHECK-THUMB6-NEXT: ldr r0, .LCPI1_0354; CHECK-THUMB6-NEXT: movs r1, #1355; CHECK-THUMB6-NEXT: bl __sync_fetch_and_add_1356; CHECK-THUMB6-NEXT: pop {r7, pc}357; CHECK-THUMB6-NEXT: .p2align 2358; CHECK-THUMB6-NEXT: @ %bb.1:359; CHECK-THUMB6-NEXT: .LCPI1_0:360; CHECK-THUMB6-NEXT: .long atomic_i8361;362; CHECK-THUMB8BASE-LABEL: test_add_i8:363; CHECK-THUMB8BASE: @ %bb.0: @ %entry364; CHECK-THUMB8BASE-NEXT: .save {r4, lr}365; CHECK-THUMB8BASE-NEXT: push {r4, lr}366; CHECK-THUMB8BASE-NEXT: .pad #8367; CHECK-THUMB8BASE-NEXT: sub sp, #8368; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i8369; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i8370; CHECK-THUMB8BASE-NEXT: ldrb r0, [r0]371; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill372; CHECK-THUMB8BASE-NEXT: b .LBB1_1373; CHECK-THUMB8BASE-NEXT: .LBB1_1: @ %atomicrmw.start374; CHECK-THUMB8BASE-NEXT: @ =>This Loop Header: Depth=1375; CHECK-THUMB8BASE-NEXT: @ Child Loop BB1_2 Depth 2376; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #4] @ 4-byte Reload377; CHECK-THUMB8BASE-NEXT: adds r4, r1, #1378; CHECK-THUMB8BASE-NEXT: movw r3, :lower16:atomic_i8379; CHECK-THUMB8BASE-NEXT: movt r3, :upper16:atomic_i8380; CHECK-THUMB8BASE-NEXT: uxtb r1, r1381; CHECK-THUMB8BASE-NEXT: .LBB1_2: @ %atomicrmw.start382; CHECK-THUMB8BASE-NEXT: @ Parent Loop BB1_1 Depth=1383; CHECK-THUMB8BASE-NEXT: @ => This Inner Loop Header: Depth=2384; CHECK-THUMB8BASE-NEXT: ldrexb r0, [r3]385; CHECK-THUMB8BASE-NEXT: cmp r0, r1386; CHECK-THUMB8BASE-NEXT: bne .LBB1_4387; CHECK-THUMB8BASE-NEXT: @ %bb.3: @ %atomicrmw.start388; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB1_2 Depth=2389; CHECK-THUMB8BASE-NEXT: strexb r2, r4, [r3]390; CHECK-THUMB8BASE-NEXT: cmp r2, #0391; CHECK-THUMB8BASE-NEXT: bne .LBB1_2392; CHECK-THUMB8BASE-NEXT: .LBB1_4: @ %atomicrmw.start393; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB1_1 Depth=1394; CHECK-THUMB8BASE-NEXT: str r0, [sp] @ 4-byte Spill395; CHECK-THUMB8BASE-NEXT: uxtb r1, r1396; CHECK-THUMB8BASE-NEXT: subs r1, r0, r1397; CHECK-THUMB8BASE-NEXT: rsbs r2, r1, #0398; CHECK-THUMB8BASE-NEXT: adcs r1, r2399; CHECK-THUMB8BASE-NEXT: cmp r1, #1400; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill401; CHECK-THUMB8BASE-NEXT: bne .LBB1_1402; CHECK-THUMB8BASE-NEXT: b .LBB1_5403; CHECK-THUMB8BASE-NEXT: .LBB1_5: @ %atomicrmw.end404; CHECK-THUMB8BASE-NEXT: ldr r0, [sp] @ 4-byte Reload405; CHECK-THUMB8BASE-NEXT: add sp, #8406; CHECK-THUMB8BASE-NEXT: pop {r4, pc}407entry:408 %0 = atomicrmw add ptr @atomic_i8, i8 1 monotonic409 ret i8 %0410}411define i8 @test_sub_i8() {412; CHECK-ARM8-LABEL: test_sub_i8:413; CHECK-ARM8: @ %bb.0: @ %entry414; CHECK-ARM8-NEXT: .pad #8415; CHECK-ARM8-NEXT: sub sp, sp, #8416; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i8417; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i8418; CHECK-ARM8-NEXT: ldrb r0, [r0]419; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill420; CHECK-ARM8-NEXT: b .LBB2_1421; CHECK-ARM8-NEXT: .LBB2_1: @ %atomicrmw.start422; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=1423; CHECK-ARM8-NEXT: @ Child Loop BB2_2 Depth 2424; CHECK-ARM8-NEXT: ldr r1, [sp, #4] @ 4-byte Reload425; CHECK-ARM8-NEXT: sub r12, r1, #1426; CHECK-ARM8-NEXT: movw r3, :lower16:atomic_i8427; CHECK-ARM8-NEXT: movt r3, :upper16:atomic_i8428; CHECK-ARM8-NEXT: uxtb r1, r1429; CHECK-ARM8-NEXT: .LBB2_2: @ %atomicrmw.start430; CHECK-ARM8-NEXT: @ Parent Loop BB2_1 Depth=1431; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=2432; CHECK-ARM8-NEXT: ldrexb r0, [r3]433; CHECK-ARM8-NEXT: cmp r0, r1434; CHECK-ARM8-NEXT: bne .LBB2_4435; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start436; CHECK-ARM8-NEXT: @ in Loop: Header=BB2_2 Depth=2437; CHECK-ARM8-NEXT: strexb r2, r12, [r3]438; CHECK-ARM8-NEXT: cmp r2, #0439; CHECK-ARM8-NEXT: bne .LBB2_2440; CHECK-ARM8-NEXT: .LBB2_4: @ %atomicrmw.start441; CHECK-ARM8-NEXT: @ in Loop: Header=BB2_1 Depth=1442; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill443; CHECK-ARM8-NEXT: uxtb r1, r1444; CHECK-ARM8-NEXT: sub r1, r0, r1445; CHECK-ARM8-NEXT: clz r1, r1446; CHECK-ARM8-NEXT: lsr r1, r1, #5447; CHECK-ARM8-NEXT: cmp r1, #1448; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill449; CHECK-ARM8-NEXT: bne .LBB2_1450; CHECK-ARM8-NEXT: b .LBB2_5451; CHECK-ARM8-NEXT: .LBB2_5: @ %atomicrmw.end452; CHECK-ARM8-NEXT: ldr r0, [sp] @ 4-byte Reload453; CHECK-ARM8-NEXT: add sp, sp, #8454; CHECK-ARM8-NEXT: bx lr455;456; CHECK-ARM6-LABEL: test_sub_i8:457; CHECK-ARM6: @ %bb.0: @ %entry458; CHECK-ARM6-NEXT: .pad #8459; CHECK-ARM6-NEXT: sub sp, sp, #8460; CHECK-ARM6-NEXT: ldr r0, .LCPI2_0461; CHECK-ARM6-NEXT: ldrb r0, [r0]462; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill463; CHECK-ARM6-NEXT: b .LBB2_1464; CHECK-ARM6-NEXT: .LBB2_1: @ %atomicrmw.start465; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=1466; CHECK-ARM6-NEXT: @ Child Loop BB2_2 Depth 2467; CHECK-ARM6-NEXT: ldr r1, [sp, #4] @ 4-byte Reload468; CHECK-ARM6-NEXT: sub r12, r1, #1469; CHECK-ARM6-NEXT: ldr r3, .LCPI2_0470; CHECK-ARM6-NEXT: uxtb r1, r1471; CHECK-ARM6-NEXT: .LBB2_2: @ %atomicrmw.start472; CHECK-ARM6-NEXT: @ Parent Loop BB2_1 Depth=1473; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=2474; CHECK-ARM6-NEXT: ldrexb r0, [r3]475; CHECK-ARM6-NEXT: cmp r0, r1476; CHECK-ARM6-NEXT: bne .LBB2_4477; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start478; CHECK-ARM6-NEXT: @ in Loop: Header=BB2_2 Depth=2479; CHECK-ARM6-NEXT: strexb r2, r12, [r3]480; CHECK-ARM6-NEXT: cmp r2, #0481; CHECK-ARM6-NEXT: bne .LBB2_2482; CHECK-ARM6-NEXT: .LBB2_4: @ %atomicrmw.start483; CHECK-ARM6-NEXT: @ in Loop: Header=BB2_1 Depth=1484; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill485; CHECK-ARM6-NEXT: uxtb r1, r1486; CHECK-ARM6-NEXT: sub r1, r0, r1487; CHECK-ARM6-NEXT: clz r1, r1488; CHECK-ARM6-NEXT: lsr r1, r1, #5489; CHECK-ARM6-NEXT: cmp r1, #1490; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill491; CHECK-ARM6-NEXT: bne .LBB2_1492; CHECK-ARM6-NEXT: b .LBB2_5493; CHECK-ARM6-NEXT: .LBB2_5: @ %atomicrmw.end494; CHECK-ARM6-NEXT: ldr r0, [sp] @ 4-byte Reload495; CHECK-ARM6-NEXT: add sp, sp, #8496; CHECK-ARM6-NEXT: bx lr497; CHECK-ARM6-NEXT: .p2align 2498; CHECK-ARM6-NEXT: @ %bb.6:499; CHECK-ARM6-NEXT: .LCPI2_0:500; CHECK-ARM6-NEXT: .long atomic_i8501;502; CHECK-THUMB7-LABEL: test_sub_i8:503; CHECK-THUMB7: @ %bb.0: @ %entry504; CHECK-THUMB7-NEXT: .pad #8505; CHECK-THUMB7-NEXT: sub sp, #8506; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i8507; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i8508; CHECK-THUMB7-NEXT: ldrb r0, [r0]509; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill510; CHECK-THUMB7-NEXT: b .LBB2_1511; CHECK-THUMB7-NEXT: .LBB2_1: @ %atomicrmw.start512; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=1513; CHECK-THUMB7-NEXT: @ Child Loop BB2_2 Depth 2514; CHECK-THUMB7-NEXT: ldr r1, [sp, #4] @ 4-byte Reload515; CHECK-THUMB7-NEXT: sub.w r12, r1, #1516; CHECK-THUMB7-NEXT: movw r3, :lower16:atomic_i8517; CHECK-THUMB7-NEXT: movt r3, :upper16:atomic_i8518; CHECK-THUMB7-NEXT: uxtb r1, r1519; CHECK-THUMB7-NEXT: .LBB2_2: @ %atomicrmw.start520; CHECK-THUMB7-NEXT: @ Parent Loop BB2_1 Depth=1521; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=2522; CHECK-THUMB7-NEXT: ldrexb r0, [r3]523; CHECK-THUMB7-NEXT: cmp r0, r1524; CHECK-THUMB7-NEXT: bne .LBB2_4525; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start526; CHECK-THUMB7-NEXT: @ in Loop: Header=BB2_2 Depth=2527; CHECK-THUMB7-NEXT: strexb r2, r12, [r3]528; CHECK-THUMB7-NEXT: cmp r2, #0529; CHECK-THUMB7-NEXT: bne .LBB2_2530; CHECK-THUMB7-NEXT: .LBB2_4: @ %atomicrmw.start531; CHECK-THUMB7-NEXT: @ in Loop: Header=BB2_1 Depth=1532; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill533; CHECK-THUMB7-NEXT: uxtb r1, r1534; CHECK-THUMB7-NEXT: subs r1, r0, r1535; CHECK-THUMB7-NEXT: clz r1, r1536; CHECK-THUMB7-NEXT: lsrs r1, r1, #5537; CHECK-THUMB7-NEXT: cmp r1, #1538; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill539; CHECK-THUMB7-NEXT: bne .LBB2_1540; CHECK-THUMB7-NEXT: b .LBB2_5541; CHECK-THUMB7-NEXT: .LBB2_5: @ %atomicrmw.end542; CHECK-THUMB7-NEXT: ldr r0, [sp] @ 4-byte Reload543; CHECK-THUMB7-NEXT: add sp, #8544; CHECK-THUMB7-NEXT: bx lr545;546; CHECK-THUMB6-LABEL: test_sub_i8:547; CHECK-THUMB6: @ %bb.0: @ %entry548; CHECK-THUMB6-NEXT: .save {r7, lr}549; CHECK-THUMB6-NEXT: push {r7, lr}550; CHECK-THUMB6-NEXT: ldr r0, .LCPI2_0551; CHECK-THUMB6-NEXT: movs r1, #1552; CHECK-THUMB6-NEXT: bl __sync_fetch_and_sub_1553; CHECK-THUMB6-NEXT: pop {r7, pc}554; CHECK-THUMB6-NEXT: .p2align 2555; CHECK-THUMB6-NEXT: @ %bb.1:556; CHECK-THUMB6-NEXT: .LCPI2_0:557; CHECK-THUMB6-NEXT: .long atomic_i8558;559; CHECK-THUMB8BASE-LABEL: test_sub_i8:560; CHECK-THUMB8BASE: @ %bb.0: @ %entry561; CHECK-THUMB8BASE-NEXT: .save {r4, lr}562; CHECK-THUMB8BASE-NEXT: push {r4, lr}563; CHECK-THUMB8BASE-NEXT: .pad #8564; CHECK-THUMB8BASE-NEXT: sub sp, #8565; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i8566; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i8567; CHECK-THUMB8BASE-NEXT: ldrb r0, [r0]568; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill569; CHECK-THUMB8BASE-NEXT: b .LBB2_1570; CHECK-THUMB8BASE-NEXT: .LBB2_1: @ %atomicrmw.start571; CHECK-THUMB8BASE-NEXT: @ =>This Loop Header: Depth=1572; CHECK-THUMB8BASE-NEXT: @ Child Loop BB2_2 Depth 2573; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #4] @ 4-byte Reload574; CHECK-THUMB8BASE-NEXT: subs r4, r1, #1575; CHECK-THUMB8BASE-NEXT: movw r3, :lower16:atomic_i8576; CHECK-THUMB8BASE-NEXT: movt r3, :upper16:atomic_i8577; CHECK-THUMB8BASE-NEXT: uxtb r1, r1578; CHECK-THUMB8BASE-NEXT: .LBB2_2: @ %atomicrmw.start579; CHECK-THUMB8BASE-NEXT: @ Parent Loop BB2_1 Depth=1580; CHECK-THUMB8BASE-NEXT: @ => This Inner Loop Header: Depth=2581; CHECK-THUMB8BASE-NEXT: ldrexb r0, [r3]582; CHECK-THUMB8BASE-NEXT: cmp r0, r1583; CHECK-THUMB8BASE-NEXT: bne .LBB2_4584; CHECK-THUMB8BASE-NEXT: @ %bb.3: @ %atomicrmw.start585; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB2_2 Depth=2586; CHECK-THUMB8BASE-NEXT: strexb r2, r4, [r3]587; CHECK-THUMB8BASE-NEXT: cmp r2, #0588; CHECK-THUMB8BASE-NEXT: bne .LBB2_2589; CHECK-THUMB8BASE-NEXT: .LBB2_4: @ %atomicrmw.start590; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB2_1 Depth=1591; CHECK-THUMB8BASE-NEXT: str r0, [sp] @ 4-byte Spill592; CHECK-THUMB8BASE-NEXT: uxtb r1, r1593; CHECK-THUMB8BASE-NEXT: subs r1, r0, r1594; CHECK-THUMB8BASE-NEXT: rsbs r2, r1, #0595; CHECK-THUMB8BASE-NEXT: adcs r1, r2596; CHECK-THUMB8BASE-NEXT: cmp r1, #1597; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill598; CHECK-THUMB8BASE-NEXT: bne .LBB2_1599; CHECK-THUMB8BASE-NEXT: b .LBB2_5600; CHECK-THUMB8BASE-NEXT: .LBB2_5: @ %atomicrmw.end601; CHECK-THUMB8BASE-NEXT: ldr r0, [sp] @ 4-byte Reload602; CHECK-THUMB8BASE-NEXT: add sp, #8603; CHECK-THUMB8BASE-NEXT: pop {r4, pc}604entry:605 %0 = atomicrmw sub ptr @atomic_i8, i8 1 monotonic606 ret i8 %0607}608define i8 @test_and_i8() {609; CHECK-ARM8-LABEL: test_and_i8:610; CHECK-ARM8: @ %bb.0: @ %entry611; CHECK-ARM8-NEXT: .pad #8612; CHECK-ARM8-NEXT: sub sp, sp, #8613; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i8614; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i8615; CHECK-ARM8-NEXT: ldrb r0, [r0]616; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill617; CHECK-ARM8-NEXT: b .LBB3_1618; CHECK-ARM8-NEXT: .LBB3_1: @ %atomicrmw.start619; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=1620; CHECK-ARM8-NEXT: @ Child Loop BB3_2 Depth 2621; CHECK-ARM8-NEXT: ldr r1, [sp, #4] @ 4-byte Reload622; CHECK-ARM8-NEXT: and r12, r1, #1623; CHECK-ARM8-NEXT: movw r3, :lower16:atomic_i8624; CHECK-ARM8-NEXT: movt r3, :upper16:atomic_i8625; CHECK-ARM8-NEXT: uxtb r1, r1626; CHECK-ARM8-NEXT: .LBB3_2: @ %atomicrmw.start627; CHECK-ARM8-NEXT: @ Parent Loop BB3_1 Depth=1628; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=2629; CHECK-ARM8-NEXT: ldrexb r0, [r3]630; CHECK-ARM8-NEXT: cmp r0, r1631; CHECK-ARM8-NEXT: bne .LBB3_4632; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start633; CHECK-ARM8-NEXT: @ in Loop: Header=BB3_2 Depth=2634; CHECK-ARM8-NEXT: strexb r2, r12, [r3]635; CHECK-ARM8-NEXT: cmp r2, #0636; CHECK-ARM8-NEXT: bne .LBB3_2637; CHECK-ARM8-NEXT: .LBB3_4: @ %atomicrmw.start638; CHECK-ARM8-NEXT: @ in Loop: Header=BB3_1 Depth=1639; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill640; CHECK-ARM8-NEXT: uxtb r1, r1641; CHECK-ARM8-NEXT: sub r1, r0, r1642; CHECK-ARM8-NEXT: clz r1, r1643; CHECK-ARM8-NEXT: lsr r1, r1, #5644; CHECK-ARM8-NEXT: cmp r1, #1645; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill646; CHECK-ARM8-NEXT: bne .LBB3_1647; CHECK-ARM8-NEXT: b .LBB3_5648; CHECK-ARM8-NEXT: .LBB3_5: @ %atomicrmw.end649; CHECK-ARM8-NEXT: ldr r0, [sp] @ 4-byte Reload650; CHECK-ARM8-NEXT: add sp, sp, #8651; CHECK-ARM8-NEXT: bx lr652;653; CHECK-ARM6-LABEL: test_and_i8:654; CHECK-ARM6: @ %bb.0: @ %entry655; CHECK-ARM6-NEXT: .pad #8656; CHECK-ARM6-NEXT: sub sp, sp, #8657; CHECK-ARM6-NEXT: ldr r0, .LCPI3_0658; CHECK-ARM6-NEXT: ldrb r0, [r0]659; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill660; CHECK-ARM6-NEXT: b .LBB3_1661; CHECK-ARM6-NEXT: .LBB3_1: @ %atomicrmw.start662; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=1663; CHECK-ARM6-NEXT: @ Child Loop BB3_2 Depth 2664; CHECK-ARM6-NEXT: ldr r1, [sp, #4] @ 4-byte Reload665; CHECK-ARM6-NEXT: and r12, r1, #1666; CHECK-ARM6-NEXT: ldr r3, .LCPI3_0667; CHECK-ARM6-NEXT: uxtb r1, r1668; CHECK-ARM6-NEXT: .LBB3_2: @ %atomicrmw.start669; CHECK-ARM6-NEXT: @ Parent Loop BB3_1 Depth=1670; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=2671; CHECK-ARM6-NEXT: ldrexb r0, [r3]672; CHECK-ARM6-NEXT: cmp r0, r1673; CHECK-ARM6-NEXT: bne .LBB3_4674; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start675; CHECK-ARM6-NEXT: @ in Loop: Header=BB3_2 Depth=2676; CHECK-ARM6-NEXT: strexb r2, r12, [r3]677; CHECK-ARM6-NEXT: cmp r2, #0678; CHECK-ARM6-NEXT: bne .LBB3_2679; CHECK-ARM6-NEXT: .LBB3_4: @ %atomicrmw.start680; CHECK-ARM6-NEXT: @ in Loop: Header=BB3_1 Depth=1681; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill682; CHECK-ARM6-NEXT: uxtb r1, r1683; CHECK-ARM6-NEXT: sub r1, r0, r1684; CHECK-ARM6-NEXT: clz r1, r1685; CHECK-ARM6-NEXT: lsr r1, r1, #5686; CHECK-ARM6-NEXT: cmp r1, #1687; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill688; CHECK-ARM6-NEXT: bne .LBB3_1689; CHECK-ARM6-NEXT: b .LBB3_5690; CHECK-ARM6-NEXT: .LBB3_5: @ %atomicrmw.end691; CHECK-ARM6-NEXT: ldr r0, [sp] @ 4-byte Reload692; CHECK-ARM6-NEXT: add sp, sp, #8693; CHECK-ARM6-NEXT: bx lr694; CHECK-ARM6-NEXT: .p2align 2695; CHECK-ARM6-NEXT: @ %bb.6:696; CHECK-ARM6-NEXT: .LCPI3_0:697; CHECK-ARM6-NEXT: .long atomic_i8698;699; CHECK-THUMB7-LABEL: test_and_i8:700; CHECK-THUMB7: @ %bb.0: @ %entry701; CHECK-THUMB7-NEXT: .pad #8702; CHECK-THUMB7-NEXT: sub sp, #8703; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i8704; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i8705; CHECK-THUMB7-NEXT: ldrb r0, [r0]706; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill707; CHECK-THUMB7-NEXT: b .LBB3_1708; CHECK-THUMB7-NEXT: .LBB3_1: @ %atomicrmw.start709; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=1710; CHECK-THUMB7-NEXT: @ Child Loop BB3_2 Depth 2711; CHECK-THUMB7-NEXT: ldr r1, [sp, #4] @ 4-byte Reload712; CHECK-THUMB7-NEXT: and r12, r1, #1713; CHECK-THUMB7-NEXT: movw r3, :lower16:atomic_i8714; CHECK-THUMB7-NEXT: movt r3, :upper16:atomic_i8715; CHECK-THUMB7-NEXT: uxtb r1, r1716; CHECK-THUMB7-NEXT: .LBB3_2: @ %atomicrmw.start717; CHECK-THUMB7-NEXT: @ Parent Loop BB3_1 Depth=1718; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=2719; CHECK-THUMB7-NEXT: ldrexb r0, [r3]720; CHECK-THUMB7-NEXT: cmp r0, r1721; CHECK-THUMB7-NEXT: bne .LBB3_4722; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start723; CHECK-THUMB7-NEXT: @ in Loop: Header=BB3_2 Depth=2724; CHECK-THUMB7-NEXT: strexb r2, r12, [r3]725; CHECK-THUMB7-NEXT: cmp r2, #0726; CHECK-THUMB7-NEXT: bne .LBB3_2727; CHECK-THUMB7-NEXT: .LBB3_4: @ %atomicrmw.start728; CHECK-THUMB7-NEXT: @ in Loop: Header=BB3_1 Depth=1729; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill730; CHECK-THUMB7-NEXT: uxtb r1, r1731; CHECK-THUMB7-NEXT: subs r1, r0, r1732; CHECK-THUMB7-NEXT: clz r1, r1733; CHECK-THUMB7-NEXT: lsrs r1, r1, #5734; CHECK-THUMB7-NEXT: cmp r1, #1735; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill736; CHECK-THUMB7-NEXT: bne .LBB3_1737; CHECK-THUMB7-NEXT: b .LBB3_5738; CHECK-THUMB7-NEXT: .LBB3_5: @ %atomicrmw.end739; CHECK-THUMB7-NEXT: ldr r0, [sp] @ 4-byte Reload740; CHECK-THUMB7-NEXT: add sp, #8741; CHECK-THUMB7-NEXT: bx lr742;743; CHECK-THUMB6-LABEL: test_and_i8:744; CHECK-THUMB6: @ %bb.0: @ %entry745; CHECK-THUMB6-NEXT: .save {r7, lr}746; CHECK-THUMB6-NEXT: push {r7, lr}747; CHECK-THUMB6-NEXT: ldr r0, .LCPI3_0748; CHECK-THUMB6-NEXT: movs r1, #1749; CHECK-THUMB6-NEXT: bl __sync_fetch_and_and_1750; CHECK-THUMB6-NEXT: pop {r7, pc}751; CHECK-THUMB6-NEXT: .p2align 2752; CHECK-THUMB6-NEXT: @ %bb.1:753; CHECK-THUMB6-NEXT: .LCPI3_0:754; CHECK-THUMB6-NEXT: .long atomic_i8755;756; CHECK-THUMB8BASE-LABEL: test_and_i8:757; CHECK-THUMB8BASE: @ %bb.0: @ %entry758; CHECK-THUMB8BASE-NEXT: .save {r4, lr}759; CHECK-THUMB8BASE-NEXT: push {r4, lr}760; CHECK-THUMB8BASE-NEXT: .pad #8761; CHECK-THUMB8BASE-NEXT: sub sp, #8762; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i8763; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i8764; CHECK-THUMB8BASE-NEXT: ldrb r0, [r0]765; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill766; CHECK-THUMB8BASE-NEXT: b .LBB3_1767; CHECK-THUMB8BASE-NEXT: .LBB3_1: @ %atomicrmw.start768; CHECK-THUMB8BASE-NEXT: @ =>This Loop Header: Depth=1769; CHECK-THUMB8BASE-NEXT: @ Child Loop BB3_2 Depth 2770; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #4] @ 4-byte Reload771; CHECK-THUMB8BASE-NEXT: movs r0, #1772; CHECK-THUMB8BASE-NEXT: mov r4, r1773; CHECK-THUMB8BASE-NEXT: ands r4, r0774; CHECK-THUMB8BASE-NEXT: movw r3, :lower16:atomic_i8775; CHECK-THUMB8BASE-NEXT: movt r3, :upper16:atomic_i8776; CHECK-THUMB8BASE-NEXT: uxtb r1, r1777; CHECK-THUMB8BASE-NEXT: .LBB3_2: @ %atomicrmw.start778; CHECK-THUMB8BASE-NEXT: @ Parent Loop BB3_1 Depth=1779; CHECK-THUMB8BASE-NEXT: @ => This Inner Loop Header: Depth=2780; CHECK-THUMB8BASE-NEXT: ldrexb r0, [r3]781; CHECK-THUMB8BASE-NEXT: cmp r0, r1782; CHECK-THUMB8BASE-NEXT: bne .LBB3_4783; CHECK-THUMB8BASE-NEXT: @ %bb.3: @ %atomicrmw.start784; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB3_2 Depth=2785; CHECK-THUMB8BASE-NEXT: strexb r2, r4, [r3]786; CHECK-THUMB8BASE-NEXT: cmp r2, #0787; CHECK-THUMB8BASE-NEXT: bne .LBB3_2788; CHECK-THUMB8BASE-NEXT: .LBB3_4: @ %atomicrmw.start789; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB3_1 Depth=1790; CHECK-THUMB8BASE-NEXT: str r0, [sp] @ 4-byte Spill791; CHECK-THUMB8BASE-NEXT: uxtb r1, r1792; CHECK-THUMB8BASE-NEXT: subs r1, r0, r1793; CHECK-THUMB8BASE-NEXT: rsbs r2, r1, #0794; CHECK-THUMB8BASE-NEXT: adcs r1, r2795; CHECK-THUMB8BASE-NEXT: cmp r1, #1796; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill797; CHECK-THUMB8BASE-NEXT: bne .LBB3_1798; CHECK-THUMB8BASE-NEXT: b .LBB3_5799; CHECK-THUMB8BASE-NEXT: .LBB3_5: @ %atomicrmw.end800; CHECK-THUMB8BASE-NEXT: ldr r0, [sp] @ 4-byte Reload801; CHECK-THUMB8BASE-NEXT: add sp, #8802; CHECK-THUMB8BASE-NEXT: pop {r4, pc}803entry:804 %0 = atomicrmw and ptr @atomic_i8, i8 1 monotonic805 ret i8 %0806}807define i8 @test_nand_i8() {808; CHECK-ARM8-LABEL: test_nand_i8:809; CHECK-ARM8: @ %bb.0: @ %entry810; CHECK-ARM8-NEXT: .pad #8811; CHECK-ARM8-NEXT: sub sp, sp, #8812; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i8813; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i8814; CHECK-ARM8-NEXT: ldrb r0, [r0]815; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill816; CHECK-ARM8-NEXT: b .LBB4_1817; CHECK-ARM8-NEXT: .LBB4_1: @ %atomicrmw.start818; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=1819; CHECK-ARM8-NEXT: @ Child Loop BB4_2 Depth 2820; CHECK-ARM8-NEXT: ldr r1, [sp, #4] @ 4-byte Reload821; CHECK-ARM8-NEXT: mvn r0, r1822; CHECK-ARM8-NEXT: mvn r2, #1823; CHECK-ARM8-NEXT: orr r12, r0, r2824; CHECK-ARM8-NEXT: movw r3, :lower16:atomic_i8825; CHECK-ARM8-NEXT: movt r3, :upper16:atomic_i8826; CHECK-ARM8-NEXT: uxtb r1, r1827; CHECK-ARM8-NEXT: .LBB4_2: @ %atomicrmw.start828; CHECK-ARM8-NEXT: @ Parent Loop BB4_1 Depth=1829; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=2830; CHECK-ARM8-NEXT: ldrexb r0, [r3]831; CHECK-ARM8-NEXT: cmp r0, r1832; CHECK-ARM8-NEXT: bne .LBB4_4833; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start834; CHECK-ARM8-NEXT: @ in Loop: Header=BB4_2 Depth=2835; CHECK-ARM8-NEXT: strexb r2, r12, [r3]836; CHECK-ARM8-NEXT: cmp r2, #0837; CHECK-ARM8-NEXT: bne .LBB4_2838; CHECK-ARM8-NEXT: .LBB4_4: @ %atomicrmw.start839; CHECK-ARM8-NEXT: @ in Loop: Header=BB4_1 Depth=1840; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill841; CHECK-ARM8-NEXT: uxtb r1, r1842; CHECK-ARM8-NEXT: sub r1, r0, r1843; CHECK-ARM8-NEXT: clz r1, r1844; CHECK-ARM8-NEXT: lsr r1, r1, #5845; CHECK-ARM8-NEXT: cmp r1, #1846; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill847; CHECK-ARM8-NEXT: bne .LBB4_1848; CHECK-ARM8-NEXT: b .LBB4_5849; CHECK-ARM8-NEXT: .LBB4_5: @ %atomicrmw.end850; CHECK-ARM8-NEXT: ldr r0, [sp] @ 4-byte Reload851; CHECK-ARM8-NEXT: add sp, sp, #8852; CHECK-ARM8-NEXT: bx lr853;854; CHECK-ARM6-LABEL: test_nand_i8:855; CHECK-ARM6: @ %bb.0: @ %entry856; CHECK-ARM6-NEXT: .pad #8857; CHECK-ARM6-NEXT: sub sp, sp, #8858; CHECK-ARM6-NEXT: ldr r0, .LCPI4_0859; CHECK-ARM6-NEXT: ldrb r0, [r0]860; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill861; CHECK-ARM6-NEXT: b .LBB4_1862; CHECK-ARM6-NEXT: .LBB4_1: @ %atomicrmw.start863; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=1864; CHECK-ARM6-NEXT: @ Child Loop BB4_2 Depth 2865; CHECK-ARM6-NEXT: ldr r1, [sp, #4] @ 4-byte Reload866; CHECK-ARM6-NEXT: mvn r0, r1867; CHECK-ARM6-NEXT: mvn r2, #1868; CHECK-ARM6-NEXT: orr r12, r0, r2869; CHECK-ARM6-NEXT: ldr r3, .LCPI4_0870; CHECK-ARM6-NEXT: uxtb r1, r1871; CHECK-ARM6-NEXT: .LBB4_2: @ %atomicrmw.start872; CHECK-ARM6-NEXT: @ Parent Loop BB4_1 Depth=1873; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=2874; CHECK-ARM6-NEXT: ldrexb r0, [r3]875; CHECK-ARM6-NEXT: cmp r0, r1876; CHECK-ARM6-NEXT: bne .LBB4_4877; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start878; CHECK-ARM6-NEXT: @ in Loop: Header=BB4_2 Depth=2879; CHECK-ARM6-NEXT: strexb r2, r12, [r3]880; CHECK-ARM6-NEXT: cmp r2, #0881; CHECK-ARM6-NEXT: bne .LBB4_2882; CHECK-ARM6-NEXT: .LBB4_4: @ %atomicrmw.start883; CHECK-ARM6-NEXT: @ in Loop: Header=BB4_1 Depth=1884; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill885; CHECK-ARM6-NEXT: uxtb r1, r1886; CHECK-ARM6-NEXT: sub r1, r0, r1887; CHECK-ARM6-NEXT: clz r1, r1888; CHECK-ARM6-NEXT: lsr r1, r1, #5889; CHECK-ARM6-NEXT: cmp r1, #1890; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill891; CHECK-ARM6-NEXT: bne .LBB4_1892; CHECK-ARM6-NEXT: b .LBB4_5893; CHECK-ARM6-NEXT: .LBB4_5: @ %atomicrmw.end894; CHECK-ARM6-NEXT: ldr r0, [sp] @ 4-byte Reload895; CHECK-ARM6-NEXT: add sp, sp, #8896; CHECK-ARM6-NEXT: bx lr897; CHECK-ARM6-NEXT: .p2align 2898; CHECK-ARM6-NEXT: @ %bb.6:899; CHECK-ARM6-NEXT: .LCPI4_0:900; CHECK-ARM6-NEXT: .long atomic_i8901;902; CHECK-THUMB7-LABEL: test_nand_i8:903; CHECK-THUMB7: @ %bb.0: @ %entry904; CHECK-THUMB7-NEXT: .pad #8905; CHECK-THUMB7-NEXT: sub sp, #8906; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i8907; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i8908; CHECK-THUMB7-NEXT: ldrb r0, [r0]909; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill910; CHECK-THUMB7-NEXT: b .LBB4_1911; CHECK-THUMB7-NEXT: .LBB4_1: @ %atomicrmw.start912; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=1913; CHECK-THUMB7-NEXT: @ Child Loop BB4_2 Depth 2914; CHECK-THUMB7-NEXT: ldr r1, [sp, #4] @ 4-byte Reload915; CHECK-THUMB7-NEXT: mvn r0, #1916; CHECK-THUMB7-NEXT: orn r12, r0, r1917; CHECK-THUMB7-NEXT: movw r3, :lower16:atomic_i8918; CHECK-THUMB7-NEXT: movt r3, :upper16:atomic_i8919; CHECK-THUMB7-NEXT: uxtb r1, r1920; CHECK-THUMB7-NEXT: .LBB4_2: @ %atomicrmw.start921; CHECK-THUMB7-NEXT: @ Parent Loop BB4_1 Depth=1922; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=2923; CHECK-THUMB7-NEXT: ldrexb r0, [r3]924; CHECK-THUMB7-NEXT: cmp r0, r1925; CHECK-THUMB7-NEXT: bne .LBB4_4926; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start927; CHECK-THUMB7-NEXT: @ in Loop: Header=BB4_2 Depth=2928; CHECK-THUMB7-NEXT: strexb r2, r12, [r3]929; CHECK-THUMB7-NEXT: cmp r2, #0930; CHECK-THUMB7-NEXT: bne .LBB4_2931; CHECK-THUMB7-NEXT: .LBB4_4: @ %atomicrmw.start932; CHECK-THUMB7-NEXT: @ in Loop: Header=BB4_1 Depth=1933; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill934; CHECK-THUMB7-NEXT: uxtb r1, r1935; CHECK-THUMB7-NEXT: subs r1, r0, r1936; CHECK-THUMB7-NEXT: clz r1, r1937; CHECK-THUMB7-NEXT: lsrs r1, r1, #5938; CHECK-THUMB7-NEXT: cmp r1, #1939; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill940; CHECK-THUMB7-NEXT: bne .LBB4_1941; CHECK-THUMB7-NEXT: b .LBB4_5942; CHECK-THUMB7-NEXT: .LBB4_5: @ %atomicrmw.end943; CHECK-THUMB7-NEXT: ldr r0, [sp] @ 4-byte Reload944; CHECK-THUMB7-NEXT: add sp, #8945; CHECK-THUMB7-NEXT: bx lr946;947; CHECK-THUMB6-LABEL: test_nand_i8:948; CHECK-THUMB6: @ %bb.0: @ %entry949; CHECK-THUMB6-NEXT: .save {r7, lr}950; CHECK-THUMB6-NEXT: push {r7, lr}951; CHECK-THUMB6-NEXT: ldr r0, .LCPI4_0952; CHECK-THUMB6-NEXT: movs r1, #1953; CHECK-THUMB6-NEXT: bl __sync_fetch_and_nand_1954; CHECK-THUMB6-NEXT: pop {r7, pc}955; CHECK-THUMB6-NEXT: .p2align 2956; CHECK-THUMB6-NEXT: @ %bb.1:957; CHECK-THUMB6-NEXT: .LCPI4_0:958; CHECK-THUMB6-NEXT: .long atomic_i8959;960; CHECK-THUMB8BASE-LABEL: test_nand_i8:961; CHECK-THUMB8BASE: @ %bb.0: @ %entry962; CHECK-THUMB8BASE-NEXT: .save {r4, lr}963; CHECK-THUMB8BASE-NEXT: push {r4, lr}964; CHECK-THUMB8BASE-NEXT: .pad #8965; CHECK-THUMB8BASE-NEXT: sub sp, #8966; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i8967; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i8968; CHECK-THUMB8BASE-NEXT: ldrb r0, [r0]969; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill970; CHECK-THUMB8BASE-NEXT: b .LBB4_1971; CHECK-THUMB8BASE-NEXT: .LBB4_1: @ %atomicrmw.start972; CHECK-THUMB8BASE-NEXT: @ =>This Loop Header: Depth=1973; CHECK-THUMB8BASE-NEXT: @ Child Loop BB4_2 Depth 2974; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #4] @ 4-byte Reload975; CHECK-THUMB8BASE-NEXT: mvns r4, r1976; CHECK-THUMB8BASE-NEXT: movs r0, #1977; CHECK-THUMB8BASE-NEXT: mvns r0, r0978; CHECK-THUMB8BASE-NEXT: orrs r4, r0979; CHECK-THUMB8BASE-NEXT: movw r3, :lower16:atomic_i8980; CHECK-THUMB8BASE-NEXT: movt r3, :upper16:atomic_i8981; CHECK-THUMB8BASE-NEXT: uxtb r1, r1982; CHECK-THUMB8BASE-NEXT: .LBB4_2: @ %atomicrmw.start983; CHECK-THUMB8BASE-NEXT: @ Parent Loop BB4_1 Depth=1984; CHECK-THUMB8BASE-NEXT: @ => This Inner Loop Header: Depth=2985; CHECK-THUMB8BASE-NEXT: ldrexb r0, [r3]986; CHECK-THUMB8BASE-NEXT: cmp r0, r1987; CHECK-THUMB8BASE-NEXT: bne .LBB4_4988; CHECK-THUMB8BASE-NEXT: @ %bb.3: @ %atomicrmw.start989; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB4_2 Depth=2990; CHECK-THUMB8BASE-NEXT: strexb r2, r4, [r3]991; CHECK-THUMB8BASE-NEXT: cmp r2, #0992; CHECK-THUMB8BASE-NEXT: bne .LBB4_2993; CHECK-THUMB8BASE-NEXT: .LBB4_4: @ %atomicrmw.start994; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB4_1 Depth=1995; CHECK-THUMB8BASE-NEXT: str r0, [sp] @ 4-byte Spill996; CHECK-THUMB8BASE-NEXT: uxtb r1, r1997; CHECK-THUMB8BASE-NEXT: subs r1, r0, r1998; CHECK-THUMB8BASE-NEXT: rsbs r2, r1, #0999; CHECK-THUMB8BASE-NEXT: adcs r1, r21000; CHECK-THUMB8BASE-NEXT: cmp r1, #11001; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill1002; CHECK-THUMB8BASE-NEXT: bne .LBB4_11003; CHECK-THUMB8BASE-NEXT: b .LBB4_51004; CHECK-THUMB8BASE-NEXT: .LBB4_5: @ %atomicrmw.end1005; CHECK-THUMB8BASE-NEXT: ldr r0, [sp] @ 4-byte Reload1006; CHECK-THUMB8BASE-NEXT: add sp, #81007; CHECK-THUMB8BASE-NEXT: pop {r4, pc}1008entry:1009 %0 = atomicrmw nand ptr @atomic_i8, i8 1 monotonic1010 ret i8 %01011}1012define i8 @test_or_i8() {1013; CHECK-ARM8-LABEL: test_or_i8:1014; CHECK-ARM8: @ %bb.0: @ %entry1015; CHECK-ARM8-NEXT: .pad #81016; CHECK-ARM8-NEXT: sub sp, sp, #81017; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i81018; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i81019; CHECK-ARM8-NEXT: ldrb r0, [r0]1020; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill1021; CHECK-ARM8-NEXT: b .LBB5_11022; CHECK-ARM8-NEXT: .LBB5_1: @ %atomicrmw.start1023; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=11024; CHECK-ARM8-NEXT: @ Child Loop BB5_2 Depth 21025; CHECK-ARM8-NEXT: ldr r1, [sp, #4] @ 4-byte Reload1026; CHECK-ARM8-NEXT: orr r12, r1, #11027; CHECK-ARM8-NEXT: movw r3, :lower16:atomic_i81028; CHECK-ARM8-NEXT: movt r3, :upper16:atomic_i81029; CHECK-ARM8-NEXT: uxtb r1, r11030; CHECK-ARM8-NEXT: .LBB5_2: @ %atomicrmw.start1031; CHECK-ARM8-NEXT: @ Parent Loop BB5_1 Depth=11032; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=21033; CHECK-ARM8-NEXT: ldrexb r0, [r3]1034; CHECK-ARM8-NEXT: cmp r0, r11035; CHECK-ARM8-NEXT: bne .LBB5_41036; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start1037; CHECK-ARM8-NEXT: @ in Loop: Header=BB5_2 Depth=21038; CHECK-ARM8-NEXT: strexb r2, r12, [r3]1039; CHECK-ARM8-NEXT: cmp r2, #01040; CHECK-ARM8-NEXT: bne .LBB5_21041; CHECK-ARM8-NEXT: .LBB5_4: @ %atomicrmw.start1042; CHECK-ARM8-NEXT: @ in Loop: Header=BB5_1 Depth=11043; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill1044; CHECK-ARM8-NEXT: uxtb r1, r11045; CHECK-ARM8-NEXT: sub r1, r0, r11046; CHECK-ARM8-NEXT: clz r1, r11047; CHECK-ARM8-NEXT: lsr r1, r1, #51048; CHECK-ARM8-NEXT: cmp r1, #11049; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill1050; CHECK-ARM8-NEXT: bne .LBB5_11051; CHECK-ARM8-NEXT: b .LBB5_51052; CHECK-ARM8-NEXT: .LBB5_5: @ %atomicrmw.end1053; CHECK-ARM8-NEXT: ldr r0, [sp] @ 4-byte Reload1054; CHECK-ARM8-NEXT: add sp, sp, #81055; CHECK-ARM8-NEXT: bx lr1056;1057; CHECK-ARM6-LABEL: test_or_i8:1058; CHECK-ARM6: @ %bb.0: @ %entry1059; CHECK-ARM6-NEXT: .pad #81060; CHECK-ARM6-NEXT: sub sp, sp, #81061; CHECK-ARM6-NEXT: ldr r0, .LCPI5_01062; CHECK-ARM6-NEXT: ldrb r0, [r0]1063; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill1064; CHECK-ARM6-NEXT: b .LBB5_11065; CHECK-ARM6-NEXT: .LBB5_1: @ %atomicrmw.start1066; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=11067; CHECK-ARM6-NEXT: @ Child Loop BB5_2 Depth 21068; CHECK-ARM6-NEXT: ldr r1, [sp, #4] @ 4-byte Reload1069; CHECK-ARM6-NEXT: orr r12, r1, #11070; CHECK-ARM6-NEXT: ldr r3, .LCPI5_01071; CHECK-ARM6-NEXT: uxtb r1, r11072; CHECK-ARM6-NEXT: .LBB5_2: @ %atomicrmw.start1073; CHECK-ARM6-NEXT: @ Parent Loop BB5_1 Depth=11074; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=21075; CHECK-ARM6-NEXT: ldrexb r0, [r3]1076; CHECK-ARM6-NEXT: cmp r0, r11077; CHECK-ARM6-NEXT: bne .LBB5_41078; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start1079; CHECK-ARM6-NEXT: @ in Loop: Header=BB5_2 Depth=21080; CHECK-ARM6-NEXT: strexb r2, r12, [r3]1081; CHECK-ARM6-NEXT: cmp r2, #01082; CHECK-ARM6-NEXT: bne .LBB5_21083; CHECK-ARM6-NEXT: .LBB5_4: @ %atomicrmw.start1084; CHECK-ARM6-NEXT: @ in Loop: Header=BB5_1 Depth=11085; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill1086; CHECK-ARM6-NEXT: uxtb r1, r11087; CHECK-ARM6-NEXT: sub r1, r0, r11088; CHECK-ARM6-NEXT: clz r1, r11089; CHECK-ARM6-NEXT: lsr r1, r1, #51090; CHECK-ARM6-NEXT: cmp r1, #11091; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill1092; CHECK-ARM6-NEXT: bne .LBB5_11093; CHECK-ARM6-NEXT: b .LBB5_51094; CHECK-ARM6-NEXT: .LBB5_5: @ %atomicrmw.end1095; CHECK-ARM6-NEXT: ldr r0, [sp] @ 4-byte Reload1096; CHECK-ARM6-NEXT: add sp, sp, #81097; CHECK-ARM6-NEXT: bx lr1098; CHECK-ARM6-NEXT: .p2align 21099; CHECK-ARM6-NEXT: @ %bb.6:1100; CHECK-ARM6-NEXT: .LCPI5_0:1101; CHECK-ARM6-NEXT: .long atomic_i81102;1103; CHECK-THUMB7-LABEL: test_or_i8:1104; CHECK-THUMB7: @ %bb.0: @ %entry1105; CHECK-THUMB7-NEXT: .pad #81106; CHECK-THUMB7-NEXT: sub sp, #81107; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i81108; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i81109; CHECK-THUMB7-NEXT: ldrb r0, [r0]1110; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill1111; CHECK-THUMB7-NEXT: b .LBB5_11112; CHECK-THUMB7-NEXT: .LBB5_1: @ %atomicrmw.start1113; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=11114; CHECK-THUMB7-NEXT: @ Child Loop BB5_2 Depth 21115; CHECK-THUMB7-NEXT: ldr r1, [sp, #4] @ 4-byte Reload1116; CHECK-THUMB7-NEXT: orr r12, r1, #11117; CHECK-THUMB7-NEXT: movw r3, :lower16:atomic_i81118; CHECK-THUMB7-NEXT: movt r3, :upper16:atomic_i81119; CHECK-THUMB7-NEXT: uxtb r1, r11120; CHECK-THUMB7-NEXT: .LBB5_2: @ %atomicrmw.start1121; CHECK-THUMB7-NEXT: @ Parent Loop BB5_1 Depth=11122; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=21123; CHECK-THUMB7-NEXT: ldrexb r0, [r3]1124; CHECK-THUMB7-NEXT: cmp r0, r11125; CHECK-THUMB7-NEXT: bne .LBB5_41126; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start1127; CHECK-THUMB7-NEXT: @ in Loop: Header=BB5_2 Depth=21128; CHECK-THUMB7-NEXT: strexb r2, r12, [r3]1129; CHECK-THUMB7-NEXT: cmp r2, #01130; CHECK-THUMB7-NEXT: bne .LBB5_21131; CHECK-THUMB7-NEXT: .LBB5_4: @ %atomicrmw.start1132; CHECK-THUMB7-NEXT: @ in Loop: Header=BB5_1 Depth=11133; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill1134; CHECK-THUMB7-NEXT: uxtb r1, r11135; CHECK-THUMB7-NEXT: subs r1, r0, r11136; CHECK-THUMB7-NEXT: clz r1, r11137; CHECK-THUMB7-NEXT: lsrs r1, r1, #51138; CHECK-THUMB7-NEXT: cmp r1, #11139; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill1140; CHECK-THUMB7-NEXT: bne .LBB5_11141; CHECK-THUMB7-NEXT: b .LBB5_51142; CHECK-THUMB7-NEXT: .LBB5_5: @ %atomicrmw.end1143; CHECK-THUMB7-NEXT: ldr r0, [sp] @ 4-byte Reload1144; CHECK-THUMB7-NEXT: add sp, #81145; CHECK-THUMB7-NEXT: bx lr1146;1147; CHECK-THUMB6-LABEL: test_or_i8:1148; CHECK-THUMB6: @ %bb.0: @ %entry1149; CHECK-THUMB6-NEXT: .save {r7, lr}1150; CHECK-THUMB6-NEXT: push {r7, lr}1151; CHECK-THUMB6-NEXT: ldr r0, .LCPI5_01152; CHECK-THUMB6-NEXT: movs r1, #11153; CHECK-THUMB6-NEXT: bl __sync_fetch_and_or_11154; CHECK-THUMB6-NEXT: pop {r7, pc}1155; CHECK-THUMB6-NEXT: .p2align 21156; CHECK-THUMB6-NEXT: @ %bb.1:1157; CHECK-THUMB6-NEXT: .LCPI5_0:1158; CHECK-THUMB6-NEXT: .long atomic_i81159;1160; CHECK-THUMB8BASE-LABEL: test_or_i8:1161; CHECK-THUMB8BASE: @ %bb.0: @ %entry1162; CHECK-THUMB8BASE-NEXT: .save {r4, lr}1163; CHECK-THUMB8BASE-NEXT: push {r4, lr}1164; CHECK-THUMB8BASE-NEXT: .pad #81165; CHECK-THUMB8BASE-NEXT: sub sp, #81166; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i81167; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i81168; CHECK-THUMB8BASE-NEXT: ldrb r0, [r0]1169; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill1170; CHECK-THUMB8BASE-NEXT: b .LBB5_11171; CHECK-THUMB8BASE-NEXT: .LBB5_1: @ %atomicrmw.start1172; CHECK-THUMB8BASE-NEXT: @ =>This Loop Header: Depth=11173; CHECK-THUMB8BASE-NEXT: @ Child Loop BB5_2 Depth 21174; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #4] @ 4-byte Reload1175; CHECK-THUMB8BASE-NEXT: movs r0, #11176; CHECK-THUMB8BASE-NEXT: mov r4, r11177; CHECK-THUMB8BASE-NEXT: orrs r4, r01178; CHECK-THUMB8BASE-NEXT: movw r3, :lower16:atomic_i81179; CHECK-THUMB8BASE-NEXT: movt r3, :upper16:atomic_i81180; CHECK-THUMB8BASE-NEXT: uxtb r1, r11181; CHECK-THUMB8BASE-NEXT: .LBB5_2: @ %atomicrmw.start1182; CHECK-THUMB8BASE-NEXT: @ Parent Loop BB5_1 Depth=11183; CHECK-THUMB8BASE-NEXT: @ => This Inner Loop Header: Depth=21184; CHECK-THUMB8BASE-NEXT: ldrexb r0, [r3]1185; CHECK-THUMB8BASE-NEXT: cmp r0, r11186; CHECK-THUMB8BASE-NEXT: bne .LBB5_41187; CHECK-THUMB8BASE-NEXT: @ %bb.3: @ %atomicrmw.start1188; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB5_2 Depth=21189; CHECK-THUMB8BASE-NEXT: strexb r2, r4, [r3]1190; CHECK-THUMB8BASE-NEXT: cmp r2, #01191; CHECK-THUMB8BASE-NEXT: bne .LBB5_21192; CHECK-THUMB8BASE-NEXT: .LBB5_4: @ %atomicrmw.start1193; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB5_1 Depth=11194; CHECK-THUMB8BASE-NEXT: str r0, [sp] @ 4-byte Spill1195; CHECK-THUMB8BASE-NEXT: uxtb r1, r11196; CHECK-THUMB8BASE-NEXT: subs r1, r0, r11197; CHECK-THUMB8BASE-NEXT: rsbs r2, r1, #01198; CHECK-THUMB8BASE-NEXT: adcs r1, r21199; CHECK-THUMB8BASE-NEXT: cmp r1, #11200; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill1201; CHECK-THUMB8BASE-NEXT: bne .LBB5_11202; CHECK-THUMB8BASE-NEXT: b .LBB5_51203; CHECK-THUMB8BASE-NEXT: .LBB5_5: @ %atomicrmw.end1204; CHECK-THUMB8BASE-NEXT: ldr r0, [sp] @ 4-byte Reload1205; CHECK-THUMB8BASE-NEXT: add sp, #81206; CHECK-THUMB8BASE-NEXT: pop {r4, pc}1207entry:1208 %0 = atomicrmw or ptr @atomic_i8, i8 1 monotonic1209 ret i8 %01210}1211define i8 @test_xor_i8() {1212; CHECK-ARM8-LABEL: test_xor_i8:1213; CHECK-ARM8: @ %bb.0: @ %entry1214; CHECK-ARM8-NEXT: .pad #81215; CHECK-ARM8-NEXT: sub sp, sp, #81216; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i81217; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i81218; CHECK-ARM8-NEXT: ldrb r0, [r0]1219; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill1220; CHECK-ARM8-NEXT: b .LBB6_11221; CHECK-ARM8-NEXT: .LBB6_1: @ %atomicrmw.start1222; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=11223; CHECK-ARM8-NEXT: @ Child Loop BB6_2 Depth 21224; CHECK-ARM8-NEXT: ldr r1, [sp, #4] @ 4-byte Reload1225; CHECK-ARM8-NEXT: eor r12, r1, #11226; CHECK-ARM8-NEXT: movw r3, :lower16:atomic_i81227; CHECK-ARM8-NEXT: movt r3, :upper16:atomic_i81228; CHECK-ARM8-NEXT: uxtb r1, r11229; CHECK-ARM8-NEXT: .LBB6_2: @ %atomicrmw.start1230; CHECK-ARM8-NEXT: @ Parent Loop BB6_1 Depth=11231; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=21232; CHECK-ARM8-NEXT: ldrexb r0, [r3]1233; CHECK-ARM8-NEXT: cmp r0, r11234; CHECK-ARM8-NEXT: bne .LBB6_41235; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start1236; CHECK-ARM8-NEXT: @ in Loop: Header=BB6_2 Depth=21237; CHECK-ARM8-NEXT: strexb r2, r12, [r3]1238; CHECK-ARM8-NEXT: cmp r2, #01239; CHECK-ARM8-NEXT: bne .LBB6_21240; CHECK-ARM8-NEXT: .LBB6_4: @ %atomicrmw.start1241; CHECK-ARM8-NEXT: @ in Loop: Header=BB6_1 Depth=11242; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill1243; CHECK-ARM8-NEXT: uxtb r1, r11244; CHECK-ARM8-NEXT: sub r1, r0, r11245; CHECK-ARM8-NEXT: clz r1, r11246; CHECK-ARM8-NEXT: lsr r1, r1, #51247; CHECK-ARM8-NEXT: cmp r1, #11248; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill1249; CHECK-ARM8-NEXT: bne .LBB6_11250; CHECK-ARM8-NEXT: b .LBB6_51251; CHECK-ARM8-NEXT: .LBB6_5: @ %atomicrmw.end1252; CHECK-ARM8-NEXT: ldr r0, [sp] @ 4-byte Reload1253; CHECK-ARM8-NEXT: add sp, sp, #81254; CHECK-ARM8-NEXT: bx lr1255;1256; CHECK-ARM6-LABEL: test_xor_i8:1257; CHECK-ARM6: @ %bb.0: @ %entry1258; CHECK-ARM6-NEXT: .pad #81259; CHECK-ARM6-NEXT: sub sp, sp, #81260; CHECK-ARM6-NEXT: ldr r0, .LCPI6_01261; CHECK-ARM6-NEXT: ldrb r0, [r0]1262; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill1263; CHECK-ARM6-NEXT: b .LBB6_11264; CHECK-ARM6-NEXT: .LBB6_1: @ %atomicrmw.start1265; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=11266; CHECK-ARM6-NEXT: @ Child Loop BB6_2 Depth 21267; CHECK-ARM6-NEXT: ldr r1, [sp, #4] @ 4-byte Reload1268; CHECK-ARM6-NEXT: eor r12, r1, #11269; CHECK-ARM6-NEXT: ldr r3, .LCPI6_01270; CHECK-ARM6-NEXT: uxtb r1, r11271; CHECK-ARM6-NEXT: .LBB6_2: @ %atomicrmw.start1272; CHECK-ARM6-NEXT: @ Parent Loop BB6_1 Depth=11273; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=21274; CHECK-ARM6-NEXT: ldrexb r0, [r3]1275; CHECK-ARM6-NEXT: cmp r0, r11276; CHECK-ARM6-NEXT: bne .LBB6_41277; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start1278; CHECK-ARM6-NEXT: @ in Loop: Header=BB6_2 Depth=21279; CHECK-ARM6-NEXT: strexb r2, r12, [r3]1280; CHECK-ARM6-NEXT: cmp r2, #01281; CHECK-ARM6-NEXT: bne .LBB6_21282; CHECK-ARM6-NEXT: .LBB6_4: @ %atomicrmw.start1283; CHECK-ARM6-NEXT: @ in Loop: Header=BB6_1 Depth=11284; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill1285; CHECK-ARM6-NEXT: uxtb r1, r11286; CHECK-ARM6-NEXT: sub r1, r0, r11287; CHECK-ARM6-NEXT: clz r1, r11288; CHECK-ARM6-NEXT: lsr r1, r1, #51289; CHECK-ARM6-NEXT: cmp r1, #11290; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill1291; CHECK-ARM6-NEXT: bne .LBB6_11292; CHECK-ARM6-NEXT: b .LBB6_51293; CHECK-ARM6-NEXT: .LBB6_5: @ %atomicrmw.end1294; CHECK-ARM6-NEXT: ldr r0, [sp] @ 4-byte Reload1295; CHECK-ARM6-NEXT: add sp, sp, #81296; CHECK-ARM6-NEXT: bx lr1297; CHECK-ARM6-NEXT: .p2align 21298; CHECK-ARM6-NEXT: @ %bb.6:1299; CHECK-ARM6-NEXT: .LCPI6_0:1300; CHECK-ARM6-NEXT: .long atomic_i81301;1302; CHECK-THUMB7-LABEL: test_xor_i8:1303; CHECK-THUMB7: @ %bb.0: @ %entry1304; CHECK-THUMB7-NEXT: .pad #81305; CHECK-THUMB7-NEXT: sub sp, #81306; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i81307; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i81308; CHECK-THUMB7-NEXT: ldrb r0, [r0]1309; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill1310; CHECK-THUMB7-NEXT: b .LBB6_11311; CHECK-THUMB7-NEXT: .LBB6_1: @ %atomicrmw.start1312; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=11313; CHECK-THUMB7-NEXT: @ Child Loop BB6_2 Depth 21314; CHECK-THUMB7-NEXT: ldr r1, [sp, #4] @ 4-byte Reload1315; CHECK-THUMB7-NEXT: eor r12, r1, #11316; CHECK-THUMB7-NEXT: movw r3, :lower16:atomic_i81317; CHECK-THUMB7-NEXT: movt r3, :upper16:atomic_i81318; CHECK-THUMB7-NEXT: uxtb r1, r11319; CHECK-THUMB7-NEXT: .LBB6_2: @ %atomicrmw.start1320; CHECK-THUMB7-NEXT: @ Parent Loop BB6_1 Depth=11321; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=21322; CHECK-THUMB7-NEXT: ldrexb r0, [r3]1323; CHECK-THUMB7-NEXT: cmp r0, r11324; CHECK-THUMB7-NEXT: bne .LBB6_41325; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start1326; CHECK-THUMB7-NEXT: @ in Loop: Header=BB6_2 Depth=21327; CHECK-THUMB7-NEXT: strexb r2, r12, [r3]1328; CHECK-THUMB7-NEXT: cmp r2, #01329; CHECK-THUMB7-NEXT: bne .LBB6_21330; CHECK-THUMB7-NEXT: .LBB6_4: @ %atomicrmw.start1331; CHECK-THUMB7-NEXT: @ in Loop: Header=BB6_1 Depth=11332; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill1333; CHECK-THUMB7-NEXT: uxtb r1, r11334; CHECK-THUMB7-NEXT: subs r1, r0, r11335; CHECK-THUMB7-NEXT: clz r1, r11336; CHECK-THUMB7-NEXT: lsrs r1, r1, #51337; CHECK-THUMB7-NEXT: cmp r1, #11338; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill1339; CHECK-THUMB7-NEXT: bne .LBB6_11340; CHECK-THUMB7-NEXT: b .LBB6_51341; CHECK-THUMB7-NEXT: .LBB6_5: @ %atomicrmw.end1342; CHECK-THUMB7-NEXT: ldr r0, [sp] @ 4-byte Reload1343; CHECK-THUMB7-NEXT: add sp, #81344; CHECK-THUMB7-NEXT: bx lr1345;1346; CHECK-THUMB6-LABEL: test_xor_i8:1347; CHECK-THUMB6: @ %bb.0: @ %entry1348; CHECK-THUMB6-NEXT: .save {r7, lr}1349; CHECK-THUMB6-NEXT: push {r7, lr}1350; CHECK-THUMB6-NEXT: ldr r0, .LCPI6_01351; CHECK-THUMB6-NEXT: movs r1, #11352; CHECK-THUMB6-NEXT: bl __sync_fetch_and_xor_11353; CHECK-THUMB6-NEXT: pop {r7, pc}1354; CHECK-THUMB6-NEXT: .p2align 21355; CHECK-THUMB6-NEXT: @ %bb.1:1356; CHECK-THUMB6-NEXT: .LCPI6_0:1357; CHECK-THUMB6-NEXT: .long atomic_i81358;1359; CHECK-THUMB8BASE-LABEL: test_xor_i8:1360; CHECK-THUMB8BASE: @ %bb.0: @ %entry1361; CHECK-THUMB8BASE-NEXT: .save {r4, lr}1362; CHECK-THUMB8BASE-NEXT: push {r4, lr}1363; CHECK-THUMB8BASE-NEXT: .pad #81364; CHECK-THUMB8BASE-NEXT: sub sp, #81365; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i81366; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i81367; CHECK-THUMB8BASE-NEXT: ldrb r0, [r0]1368; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill1369; CHECK-THUMB8BASE-NEXT: b .LBB6_11370; CHECK-THUMB8BASE-NEXT: .LBB6_1: @ %atomicrmw.start1371; CHECK-THUMB8BASE-NEXT: @ =>This Loop Header: Depth=11372; CHECK-THUMB8BASE-NEXT: @ Child Loop BB6_2 Depth 21373; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #4] @ 4-byte Reload1374; CHECK-THUMB8BASE-NEXT: movs r0, #11375; CHECK-THUMB8BASE-NEXT: mov r4, r11376; CHECK-THUMB8BASE-NEXT: eors r4, r01377; CHECK-THUMB8BASE-NEXT: movw r3, :lower16:atomic_i81378; CHECK-THUMB8BASE-NEXT: movt r3, :upper16:atomic_i81379; CHECK-THUMB8BASE-NEXT: uxtb r1, r11380; CHECK-THUMB8BASE-NEXT: .LBB6_2: @ %atomicrmw.start1381; CHECK-THUMB8BASE-NEXT: @ Parent Loop BB6_1 Depth=11382; CHECK-THUMB8BASE-NEXT: @ => This Inner Loop Header: Depth=21383; CHECK-THUMB8BASE-NEXT: ldrexb r0, [r3]1384; CHECK-THUMB8BASE-NEXT: cmp r0, r11385; CHECK-THUMB8BASE-NEXT: bne .LBB6_41386; CHECK-THUMB8BASE-NEXT: @ %bb.3: @ %atomicrmw.start1387; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB6_2 Depth=21388; CHECK-THUMB8BASE-NEXT: strexb r2, r4, [r3]1389; CHECK-THUMB8BASE-NEXT: cmp r2, #01390; CHECK-THUMB8BASE-NEXT: bne .LBB6_21391; CHECK-THUMB8BASE-NEXT: .LBB6_4: @ %atomicrmw.start1392; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB6_1 Depth=11393; CHECK-THUMB8BASE-NEXT: str r0, [sp] @ 4-byte Spill1394; CHECK-THUMB8BASE-NEXT: uxtb r1, r11395; CHECK-THUMB8BASE-NEXT: subs r1, r0, r11396; CHECK-THUMB8BASE-NEXT: rsbs r2, r1, #01397; CHECK-THUMB8BASE-NEXT: adcs r1, r21398; CHECK-THUMB8BASE-NEXT: cmp r1, #11399; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill1400; CHECK-THUMB8BASE-NEXT: bne .LBB6_11401; CHECK-THUMB8BASE-NEXT: b .LBB6_51402; CHECK-THUMB8BASE-NEXT: .LBB6_5: @ %atomicrmw.end1403; CHECK-THUMB8BASE-NEXT: ldr r0, [sp] @ 4-byte Reload1404; CHECK-THUMB8BASE-NEXT: add sp, #81405; CHECK-THUMB8BASE-NEXT: pop {r4, pc}1406entry:1407 %0 = atomicrmw xor ptr @atomic_i8, i8 1 monotonic1408 ret i8 %01409}1410define i8 @test_max_i8() {1411; CHECK-ARM8-LABEL: test_max_i8:1412; CHECK-ARM8: @ %bb.0: @ %entry1413; CHECK-ARM8-NEXT: .pad #81414; CHECK-ARM8-NEXT: sub sp, sp, #81415; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i81416; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i81417; CHECK-ARM8-NEXT: ldrb r0, [r0]1418; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill1419; CHECK-ARM8-NEXT: b .LBB7_11420; CHECK-ARM8-NEXT: .LBB7_1: @ %atomicrmw.start1421; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=11422; CHECK-ARM8-NEXT: @ Child Loop BB7_2 Depth 21423; CHECK-ARM8-NEXT: ldr r1, [sp, #4] @ 4-byte Reload1424; CHECK-ARM8-NEXT: sxtb r0, r11425; CHECK-ARM8-NEXT: cmp r0, #11426; CHECK-ARM8-NEXT: mov r12, #11427; CHECK-ARM8-NEXT: movgt r12, r11428; CHECK-ARM8-NEXT: movw r3, :lower16:atomic_i81429; CHECK-ARM8-NEXT: movt r3, :upper16:atomic_i81430; CHECK-ARM8-NEXT: uxtb r1, r11431; CHECK-ARM8-NEXT: .LBB7_2: @ %atomicrmw.start1432; CHECK-ARM8-NEXT: @ Parent Loop BB7_1 Depth=11433; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=21434; CHECK-ARM8-NEXT: ldrexb r0, [r3]1435; CHECK-ARM8-NEXT: cmp r0, r11436; CHECK-ARM8-NEXT: bne .LBB7_41437; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start1438; CHECK-ARM8-NEXT: @ in Loop: Header=BB7_2 Depth=21439; CHECK-ARM8-NEXT: strexb r2, r12, [r3]1440; CHECK-ARM8-NEXT: cmp r2, #01441; CHECK-ARM8-NEXT: bne .LBB7_21442; CHECK-ARM8-NEXT: .LBB7_4: @ %atomicrmw.start1443; CHECK-ARM8-NEXT: @ in Loop: Header=BB7_1 Depth=11444; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill1445; CHECK-ARM8-NEXT: uxtb r1, r11446; CHECK-ARM8-NEXT: sub r1, r0, r11447; CHECK-ARM8-NEXT: clz r1, r11448; CHECK-ARM8-NEXT: lsr r1, r1, #51449; CHECK-ARM8-NEXT: cmp r1, #11450; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill1451; CHECK-ARM8-NEXT: bne .LBB7_11452; CHECK-ARM8-NEXT: b .LBB7_51453; CHECK-ARM8-NEXT: .LBB7_5: @ %atomicrmw.end1454; CHECK-ARM8-NEXT: ldr r0, [sp] @ 4-byte Reload1455; CHECK-ARM8-NEXT: add sp, sp, #81456; CHECK-ARM8-NEXT: bx lr1457;1458; CHECK-ARM6-LABEL: test_max_i8:1459; CHECK-ARM6: @ %bb.0: @ %entry1460; CHECK-ARM6-NEXT: .pad #81461; CHECK-ARM6-NEXT: sub sp, sp, #81462; CHECK-ARM6-NEXT: ldr r0, .LCPI7_01463; CHECK-ARM6-NEXT: ldrb r0, [r0]1464; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill1465; CHECK-ARM6-NEXT: b .LBB7_11466; CHECK-ARM6-NEXT: .LBB7_1: @ %atomicrmw.start1467; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=11468; CHECK-ARM6-NEXT: @ Child Loop BB7_2 Depth 21469; CHECK-ARM6-NEXT: ldr r1, [sp, #4] @ 4-byte Reload1470; CHECK-ARM6-NEXT: sxtb r0, r11471; CHECK-ARM6-NEXT: cmp r0, #11472; CHECK-ARM6-NEXT: mov r12, #11473; CHECK-ARM6-NEXT: movgt r12, r11474; CHECK-ARM6-NEXT: ldr r3, .LCPI7_01475; CHECK-ARM6-NEXT: uxtb r1, r11476; CHECK-ARM6-NEXT: .LBB7_2: @ %atomicrmw.start1477; CHECK-ARM6-NEXT: @ Parent Loop BB7_1 Depth=11478; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=21479; CHECK-ARM6-NEXT: ldrexb r0, [r3]1480; CHECK-ARM6-NEXT: cmp r0, r11481; CHECK-ARM6-NEXT: bne .LBB7_41482; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start1483; CHECK-ARM6-NEXT: @ in Loop: Header=BB7_2 Depth=21484; CHECK-ARM6-NEXT: strexb r2, r12, [r3]1485; CHECK-ARM6-NEXT: cmp r2, #01486; CHECK-ARM6-NEXT: bne .LBB7_21487; CHECK-ARM6-NEXT: .LBB7_4: @ %atomicrmw.start1488; CHECK-ARM6-NEXT: @ in Loop: Header=BB7_1 Depth=11489; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill1490; CHECK-ARM6-NEXT: uxtb r1, r11491; CHECK-ARM6-NEXT: sub r1, r0, r11492; CHECK-ARM6-NEXT: clz r1, r11493; CHECK-ARM6-NEXT: lsr r1, r1, #51494; CHECK-ARM6-NEXT: cmp r1, #11495; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill1496; CHECK-ARM6-NEXT: bne .LBB7_11497; CHECK-ARM6-NEXT: b .LBB7_51498; CHECK-ARM6-NEXT: .LBB7_5: @ %atomicrmw.end1499; CHECK-ARM6-NEXT: ldr r0, [sp] @ 4-byte Reload1500; CHECK-ARM6-NEXT: add sp, sp, #81501; CHECK-ARM6-NEXT: bx lr1502; CHECK-ARM6-NEXT: .p2align 21503; CHECK-ARM6-NEXT: @ %bb.6:1504; CHECK-ARM6-NEXT: .LCPI7_0:1505; CHECK-ARM6-NEXT: .long atomic_i81506;1507; CHECK-THUMB7-LABEL: test_max_i8:1508; CHECK-THUMB7: @ %bb.0: @ %entry1509; CHECK-THUMB7-NEXT: .pad #81510; CHECK-THUMB7-NEXT: sub sp, #81511; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i81512; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i81513; CHECK-THUMB7-NEXT: ldrb r0, [r0]1514; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill1515; CHECK-THUMB7-NEXT: b .LBB7_11516; CHECK-THUMB7-NEXT: .LBB7_1: @ %atomicrmw.start1517; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=11518; CHECK-THUMB7-NEXT: @ Child Loop BB7_2 Depth 21519; CHECK-THUMB7-NEXT: ldr r1, [sp, #4] @ 4-byte Reload1520; CHECK-THUMB7-NEXT: sxtb r0, r11521; CHECK-THUMB7-NEXT: cmp r0, #11522; CHECK-THUMB7-NEXT: mov.w r12, #11523; CHECK-THUMB7-NEXT: it gt1524; CHECK-THUMB7-NEXT: movgt r12, r11525; CHECK-THUMB7-NEXT: movw r3, :lower16:atomic_i81526; CHECK-THUMB7-NEXT: movt r3, :upper16:atomic_i81527; CHECK-THUMB7-NEXT: uxtb r1, r11528; CHECK-THUMB7-NEXT: .LBB7_2: @ %atomicrmw.start1529; CHECK-THUMB7-NEXT: @ Parent Loop BB7_1 Depth=11530; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=21531; CHECK-THUMB7-NEXT: ldrexb r0, [r3]1532; CHECK-THUMB7-NEXT: cmp r0, r11533; CHECK-THUMB7-NEXT: bne .LBB7_41534; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start1535; CHECK-THUMB7-NEXT: @ in Loop: Header=BB7_2 Depth=21536; CHECK-THUMB7-NEXT: strexb r2, r12, [r3]1537; CHECK-THUMB7-NEXT: cmp r2, #01538; CHECK-THUMB7-NEXT: bne .LBB7_21539; CHECK-THUMB7-NEXT: .LBB7_4: @ %atomicrmw.start1540; CHECK-THUMB7-NEXT: @ in Loop: Header=BB7_1 Depth=11541; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill1542; CHECK-THUMB7-NEXT: uxtb r1, r11543; CHECK-THUMB7-NEXT: subs r1, r0, r11544; CHECK-THUMB7-NEXT: clz r1, r11545; CHECK-THUMB7-NEXT: lsrs r1, r1, #51546; CHECK-THUMB7-NEXT: cmp r1, #11547; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill1548; CHECK-THUMB7-NEXT: bne .LBB7_11549; CHECK-THUMB7-NEXT: b .LBB7_51550; CHECK-THUMB7-NEXT: .LBB7_5: @ %atomicrmw.end1551; CHECK-THUMB7-NEXT: ldr r0, [sp] @ 4-byte Reload1552; CHECK-THUMB7-NEXT: add sp, #81553; CHECK-THUMB7-NEXT: bx lr1554;1555; CHECK-THUMB6-LABEL: test_max_i8:1556; CHECK-THUMB6: @ %bb.0: @ %entry1557; CHECK-THUMB6-NEXT: .save {r7, lr}1558; CHECK-THUMB6-NEXT: push {r7, lr}1559; CHECK-THUMB6-NEXT: ldr r0, .LCPI7_01560; CHECK-THUMB6-NEXT: movs r1, #11561; CHECK-THUMB6-NEXT: bl __sync_fetch_and_max_11562; CHECK-THUMB6-NEXT: pop {r7, pc}1563; CHECK-THUMB6-NEXT: .p2align 21564; CHECK-THUMB6-NEXT: @ %bb.1:1565; CHECK-THUMB6-NEXT: .LCPI7_0:1566; CHECK-THUMB6-NEXT: .long atomic_i81567;1568; CHECK-THUMB8BASE-LABEL: test_max_i8:1569; CHECK-THUMB8BASE: @ %bb.0: @ %entry1570; CHECK-THUMB8BASE-NEXT: .save {r4, lr}1571; CHECK-THUMB8BASE-NEXT: push {r4, lr}1572; CHECK-THUMB8BASE-NEXT: .pad #201573; CHECK-THUMB8BASE-NEXT: sub sp, #201574; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i81575; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i81576; CHECK-THUMB8BASE-NEXT: ldrb r0, [r0]1577; CHECK-THUMB8BASE-NEXT: str r0, [sp, #16] @ 4-byte Spill1578; CHECK-THUMB8BASE-NEXT: b .LBB7_11579; CHECK-THUMB8BASE-NEXT: .LBB7_1: @ %atomicrmw.start1580; CHECK-THUMB8BASE-NEXT: @ =>This Loop Header: Depth=11581; CHECK-THUMB8BASE-NEXT: @ Child Loop BB7_4 Depth 21582; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #16] @ 4-byte Reload1583; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill1584; CHECK-THUMB8BASE-NEXT: sxtb r1, r01585; CHECK-THUMB8BASE-NEXT: movs r2, #11586; CHECK-THUMB8BASE-NEXT: str r2, [sp, #8] @ 4-byte Spill1587; CHECK-THUMB8BASE-NEXT: cmp r1, #11588; CHECK-THUMB8BASE-NEXT: str r0, [sp, #12] @ 4-byte Spill1589; CHECK-THUMB8BASE-NEXT: bgt .LBB7_31590; CHECK-THUMB8BASE-NEXT: @ %bb.2: @ %atomicrmw.start1591; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB7_1 Depth=11592; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #8] @ 4-byte Reload1593; CHECK-THUMB8BASE-NEXT: str r0, [sp, #12] @ 4-byte Spill1594; CHECK-THUMB8BASE-NEXT: .LBB7_3: @ %atomicrmw.start1595; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB7_1 Depth=11596; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #4] @ 4-byte Reload1597; CHECK-THUMB8BASE-NEXT: ldr r4, [sp, #12] @ 4-byte Reload1598; CHECK-THUMB8BASE-NEXT: movw r3, :lower16:atomic_i81599; CHECK-THUMB8BASE-NEXT: movt r3, :upper16:atomic_i81600; CHECK-THUMB8BASE-NEXT: uxtb r1, r11601; CHECK-THUMB8BASE-NEXT: .LBB7_4: @ %atomicrmw.start1602; CHECK-THUMB8BASE-NEXT: @ Parent Loop BB7_1 Depth=11603; CHECK-THUMB8BASE-NEXT: @ => This Inner Loop Header: Depth=21604; CHECK-THUMB8BASE-NEXT: ldrexb r0, [r3]1605; CHECK-THUMB8BASE-NEXT: cmp r0, r11606; CHECK-THUMB8BASE-NEXT: bne .LBB7_61607; CHECK-THUMB8BASE-NEXT: @ %bb.5: @ %atomicrmw.start1608; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB7_4 Depth=21609; CHECK-THUMB8BASE-NEXT: strexb r2, r4, [r3]1610; CHECK-THUMB8BASE-NEXT: cmp r2, #01611; CHECK-THUMB8BASE-NEXT: bne .LBB7_41612; CHECK-THUMB8BASE-NEXT: .LBB7_6: @ %atomicrmw.start1613; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB7_1 Depth=11614; CHECK-THUMB8BASE-NEXT: str r0, [sp] @ 4-byte Spill1615; CHECK-THUMB8BASE-NEXT: uxtb r1, r11616; CHECK-THUMB8BASE-NEXT: subs r1, r0, r11617; CHECK-THUMB8BASE-NEXT: rsbs r2, r1, #01618; CHECK-THUMB8BASE-NEXT: adcs r1, r21619; CHECK-THUMB8BASE-NEXT: cmp r1, #11620; CHECK-THUMB8BASE-NEXT: str r0, [sp, #16] @ 4-byte Spill1621; CHECK-THUMB8BASE-NEXT: bne .LBB7_11622; CHECK-THUMB8BASE-NEXT: b .LBB7_71623; CHECK-THUMB8BASE-NEXT: .LBB7_7: @ %atomicrmw.end1624; CHECK-THUMB8BASE-NEXT: ldr r0, [sp] @ 4-byte Reload1625; CHECK-THUMB8BASE-NEXT: add sp, #201626; CHECK-THUMB8BASE-NEXT: pop {r4, pc}1627entry:1628 %0 = atomicrmw max ptr @atomic_i8, i8 1 monotonic1629 ret i8 %01630}1631define i8 @test_min_i8() {1632; CHECK-ARM8-LABEL: test_min_i8:1633; CHECK-ARM8: @ %bb.0: @ %entry1634; CHECK-ARM8-NEXT: .pad #81635; CHECK-ARM8-NEXT: sub sp, sp, #81636; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i81637; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i81638; CHECK-ARM8-NEXT: ldrb r0, [r0]1639; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill1640; CHECK-ARM8-NEXT: b .LBB8_11641; CHECK-ARM8-NEXT: .LBB8_1: @ %atomicrmw.start1642; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=11643; CHECK-ARM8-NEXT: @ Child Loop BB8_2 Depth 21644; CHECK-ARM8-NEXT: ldr r1, [sp, #4] @ 4-byte Reload1645; CHECK-ARM8-NEXT: sxtb r0, r11646; CHECK-ARM8-NEXT: cmp r0, #21647; CHECK-ARM8-NEXT: mov r12, #11648; CHECK-ARM8-NEXT: movlt r12, r11649; CHECK-ARM8-NEXT: movw r3, :lower16:atomic_i81650; CHECK-ARM8-NEXT: movt r3, :upper16:atomic_i81651; CHECK-ARM8-NEXT: uxtb r1, r11652; CHECK-ARM8-NEXT: .LBB8_2: @ %atomicrmw.start1653; CHECK-ARM8-NEXT: @ Parent Loop BB8_1 Depth=11654; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=21655; CHECK-ARM8-NEXT: ldrexb r0, [r3]1656; CHECK-ARM8-NEXT: cmp r0, r11657; CHECK-ARM8-NEXT: bne .LBB8_41658; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start1659; CHECK-ARM8-NEXT: @ in Loop: Header=BB8_2 Depth=21660; CHECK-ARM8-NEXT: strexb r2, r12, [r3]1661; CHECK-ARM8-NEXT: cmp r2, #01662; CHECK-ARM8-NEXT: bne .LBB8_21663; CHECK-ARM8-NEXT: .LBB8_4: @ %atomicrmw.start1664; CHECK-ARM8-NEXT: @ in Loop: Header=BB8_1 Depth=11665; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill1666; CHECK-ARM8-NEXT: uxtb r1, r11667; CHECK-ARM8-NEXT: sub r1, r0, r11668; CHECK-ARM8-NEXT: clz r1, r11669; CHECK-ARM8-NEXT: lsr r1, r1, #51670; CHECK-ARM8-NEXT: cmp r1, #11671; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill1672; CHECK-ARM8-NEXT: bne .LBB8_11673; CHECK-ARM8-NEXT: b .LBB8_51674; CHECK-ARM8-NEXT: .LBB8_5: @ %atomicrmw.end1675; CHECK-ARM8-NEXT: ldr r0, [sp] @ 4-byte Reload1676; CHECK-ARM8-NEXT: add sp, sp, #81677; CHECK-ARM8-NEXT: bx lr1678;1679; CHECK-ARM6-LABEL: test_min_i8:1680; CHECK-ARM6: @ %bb.0: @ %entry1681; CHECK-ARM6-NEXT: .pad #81682; CHECK-ARM6-NEXT: sub sp, sp, #81683; CHECK-ARM6-NEXT: ldr r0, .LCPI8_01684; CHECK-ARM6-NEXT: ldrb r0, [r0]1685; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill1686; CHECK-ARM6-NEXT: b .LBB8_11687; CHECK-ARM6-NEXT: .LBB8_1: @ %atomicrmw.start1688; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=11689; CHECK-ARM6-NEXT: @ Child Loop BB8_2 Depth 21690; CHECK-ARM6-NEXT: ldr r1, [sp, #4] @ 4-byte Reload1691; CHECK-ARM6-NEXT: sxtb r0, r11692; CHECK-ARM6-NEXT: cmp r0, #21693; CHECK-ARM6-NEXT: mov r12, #11694; CHECK-ARM6-NEXT: movlt r12, r11695; CHECK-ARM6-NEXT: ldr r3, .LCPI8_01696; CHECK-ARM6-NEXT: uxtb r1, r11697; CHECK-ARM6-NEXT: .LBB8_2: @ %atomicrmw.start1698; CHECK-ARM6-NEXT: @ Parent Loop BB8_1 Depth=11699; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=21700; CHECK-ARM6-NEXT: ldrexb r0, [r3]1701; CHECK-ARM6-NEXT: cmp r0, r11702; CHECK-ARM6-NEXT: bne .LBB8_41703; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start1704; CHECK-ARM6-NEXT: @ in Loop: Header=BB8_2 Depth=21705; CHECK-ARM6-NEXT: strexb r2, r12, [r3]1706; CHECK-ARM6-NEXT: cmp r2, #01707; CHECK-ARM6-NEXT: bne .LBB8_21708; CHECK-ARM6-NEXT: .LBB8_4: @ %atomicrmw.start1709; CHECK-ARM6-NEXT: @ in Loop: Header=BB8_1 Depth=11710; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill1711; CHECK-ARM6-NEXT: uxtb r1, r11712; CHECK-ARM6-NEXT: sub r1, r0, r11713; CHECK-ARM6-NEXT: clz r1, r11714; CHECK-ARM6-NEXT: lsr r1, r1, #51715; CHECK-ARM6-NEXT: cmp r1, #11716; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill1717; CHECK-ARM6-NEXT: bne .LBB8_11718; CHECK-ARM6-NEXT: b .LBB8_51719; CHECK-ARM6-NEXT: .LBB8_5: @ %atomicrmw.end1720; CHECK-ARM6-NEXT: ldr r0, [sp] @ 4-byte Reload1721; CHECK-ARM6-NEXT: add sp, sp, #81722; CHECK-ARM6-NEXT: bx lr1723; CHECK-ARM6-NEXT: .p2align 21724; CHECK-ARM6-NEXT: @ %bb.6:1725; CHECK-ARM6-NEXT: .LCPI8_0:1726; CHECK-ARM6-NEXT: .long atomic_i81727;1728; CHECK-THUMB7-LABEL: test_min_i8:1729; CHECK-THUMB7: @ %bb.0: @ %entry1730; CHECK-THUMB7-NEXT: .pad #81731; CHECK-THUMB7-NEXT: sub sp, #81732; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i81733; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i81734; CHECK-THUMB7-NEXT: ldrb r0, [r0]1735; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill1736; CHECK-THUMB7-NEXT: b .LBB8_11737; CHECK-THUMB7-NEXT: .LBB8_1: @ %atomicrmw.start1738; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=11739; CHECK-THUMB7-NEXT: @ Child Loop BB8_2 Depth 21740; CHECK-THUMB7-NEXT: ldr r1, [sp, #4] @ 4-byte Reload1741; CHECK-THUMB7-NEXT: sxtb r0, r11742; CHECK-THUMB7-NEXT: cmp r0, #21743; CHECK-THUMB7-NEXT: mov.w r12, #11744; CHECK-THUMB7-NEXT: it lt1745; CHECK-THUMB7-NEXT: movlt r12, r11746; CHECK-THUMB7-NEXT: movw r3, :lower16:atomic_i81747; CHECK-THUMB7-NEXT: movt r3, :upper16:atomic_i81748; CHECK-THUMB7-NEXT: uxtb r1, r11749; CHECK-THUMB7-NEXT: .LBB8_2: @ %atomicrmw.start1750; CHECK-THUMB7-NEXT: @ Parent Loop BB8_1 Depth=11751; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=21752; CHECK-THUMB7-NEXT: ldrexb r0, [r3]1753; CHECK-THUMB7-NEXT: cmp r0, r11754; CHECK-THUMB7-NEXT: bne .LBB8_41755; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start1756; CHECK-THUMB7-NEXT: @ in Loop: Header=BB8_2 Depth=21757; CHECK-THUMB7-NEXT: strexb r2, r12, [r3]1758; CHECK-THUMB7-NEXT: cmp r2, #01759; CHECK-THUMB7-NEXT: bne .LBB8_21760; CHECK-THUMB7-NEXT: .LBB8_4: @ %atomicrmw.start1761; CHECK-THUMB7-NEXT: @ in Loop: Header=BB8_1 Depth=11762; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill1763; CHECK-THUMB7-NEXT: uxtb r1, r11764; CHECK-THUMB7-NEXT: subs r1, r0, r11765; CHECK-THUMB7-NEXT: clz r1, r11766; CHECK-THUMB7-NEXT: lsrs r1, r1, #51767; CHECK-THUMB7-NEXT: cmp r1, #11768; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill1769; CHECK-THUMB7-NEXT: bne .LBB8_11770; CHECK-THUMB7-NEXT: b .LBB8_51771; CHECK-THUMB7-NEXT: .LBB8_5: @ %atomicrmw.end1772; CHECK-THUMB7-NEXT: ldr r0, [sp] @ 4-byte Reload1773; CHECK-THUMB7-NEXT: add sp, #81774; CHECK-THUMB7-NEXT: bx lr1775;1776; CHECK-THUMB6-LABEL: test_min_i8:1777; CHECK-THUMB6: @ %bb.0: @ %entry1778; CHECK-THUMB6-NEXT: .save {r7, lr}1779; CHECK-THUMB6-NEXT: push {r7, lr}1780; CHECK-THUMB6-NEXT: ldr r0, .LCPI8_01781; CHECK-THUMB6-NEXT: movs r1, #11782; CHECK-THUMB6-NEXT: bl __sync_fetch_and_min_11783; CHECK-THUMB6-NEXT: pop {r7, pc}1784; CHECK-THUMB6-NEXT: .p2align 21785; CHECK-THUMB6-NEXT: @ %bb.1:1786; CHECK-THUMB6-NEXT: .LCPI8_0:1787; CHECK-THUMB6-NEXT: .long atomic_i81788;1789; CHECK-THUMB8BASE-LABEL: test_min_i8:1790; CHECK-THUMB8BASE: @ %bb.0: @ %entry1791; CHECK-THUMB8BASE-NEXT: .save {r4, lr}1792; CHECK-THUMB8BASE-NEXT: push {r4, lr}1793; CHECK-THUMB8BASE-NEXT: .pad #201794; CHECK-THUMB8BASE-NEXT: sub sp, #201795; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i81796; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i81797; CHECK-THUMB8BASE-NEXT: ldrb r0, [r0]1798; CHECK-THUMB8BASE-NEXT: str r0, [sp, #16] @ 4-byte Spill1799; CHECK-THUMB8BASE-NEXT: b .LBB8_11800; CHECK-THUMB8BASE-NEXT: .LBB8_1: @ %atomicrmw.start1801; CHECK-THUMB8BASE-NEXT: @ =>This Loop Header: Depth=11802; CHECK-THUMB8BASE-NEXT: @ Child Loop BB8_4 Depth 21803; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #16] @ 4-byte Reload1804; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill1805; CHECK-THUMB8BASE-NEXT: sxtb r1, r01806; CHECK-THUMB8BASE-NEXT: movs r2, #11807; CHECK-THUMB8BASE-NEXT: str r2, [sp, #8] @ 4-byte Spill1808; CHECK-THUMB8BASE-NEXT: cmp r1, #21809; CHECK-THUMB8BASE-NEXT: str r0, [sp, #12] @ 4-byte Spill1810; CHECK-THUMB8BASE-NEXT: blt .LBB8_31811; CHECK-THUMB8BASE-NEXT: @ %bb.2: @ %atomicrmw.start1812; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB8_1 Depth=11813; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #8] @ 4-byte Reload1814; CHECK-THUMB8BASE-NEXT: str r0, [sp, #12] @ 4-byte Spill1815; CHECK-THUMB8BASE-NEXT: .LBB8_3: @ %atomicrmw.start1816; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB8_1 Depth=11817; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #4] @ 4-byte Reload1818; CHECK-THUMB8BASE-NEXT: ldr r4, [sp, #12] @ 4-byte Reload1819; CHECK-THUMB8BASE-NEXT: movw r3, :lower16:atomic_i81820; CHECK-THUMB8BASE-NEXT: movt r3, :upper16:atomic_i81821; CHECK-THUMB8BASE-NEXT: uxtb r1, r11822; CHECK-THUMB8BASE-NEXT: .LBB8_4: @ %atomicrmw.start1823; CHECK-THUMB8BASE-NEXT: @ Parent Loop BB8_1 Depth=11824; CHECK-THUMB8BASE-NEXT: @ => This Inner Loop Header: Depth=21825; CHECK-THUMB8BASE-NEXT: ldrexb r0, [r3]1826; CHECK-THUMB8BASE-NEXT: cmp r0, r11827; CHECK-THUMB8BASE-NEXT: bne .LBB8_61828; CHECK-THUMB8BASE-NEXT: @ %bb.5: @ %atomicrmw.start1829; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB8_4 Depth=21830; CHECK-THUMB8BASE-NEXT: strexb r2, r4, [r3]1831; CHECK-THUMB8BASE-NEXT: cmp r2, #01832; CHECK-THUMB8BASE-NEXT: bne .LBB8_41833; CHECK-THUMB8BASE-NEXT: .LBB8_6: @ %atomicrmw.start1834; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB8_1 Depth=11835; CHECK-THUMB8BASE-NEXT: str r0, [sp] @ 4-byte Spill1836; CHECK-THUMB8BASE-NEXT: uxtb r1, r11837; CHECK-THUMB8BASE-NEXT: subs r1, r0, r11838; CHECK-THUMB8BASE-NEXT: rsbs r2, r1, #01839; CHECK-THUMB8BASE-NEXT: adcs r1, r21840; CHECK-THUMB8BASE-NEXT: cmp r1, #11841; CHECK-THUMB8BASE-NEXT: str r0, [sp, #16] @ 4-byte Spill1842; CHECK-THUMB8BASE-NEXT: bne .LBB8_11843; CHECK-THUMB8BASE-NEXT: b .LBB8_71844; CHECK-THUMB8BASE-NEXT: .LBB8_7: @ %atomicrmw.end1845; CHECK-THUMB8BASE-NEXT: ldr r0, [sp] @ 4-byte Reload1846; CHECK-THUMB8BASE-NEXT: add sp, #201847; CHECK-THUMB8BASE-NEXT: pop {r4, pc}1848entry:1849 %0 = atomicrmw min ptr @atomic_i8, i8 1 monotonic1850 ret i8 %01851}1852define i8 @test_umax_i8() {1853; CHECK-ARM8-LABEL: test_umax_i8:1854; CHECK-ARM8: @ %bb.0: @ %entry1855; CHECK-ARM8-NEXT: .save {r11, lr}1856; CHECK-ARM8-NEXT: push {r11, lr}1857; CHECK-ARM8-NEXT: .pad #81858; CHECK-ARM8-NEXT: sub sp, sp, #81859; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i81860; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i81861; CHECK-ARM8-NEXT: ldrb r0, [r0]1862; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill1863; CHECK-ARM8-NEXT: b .LBB9_11864; CHECK-ARM8-NEXT: .LBB9_1: @ %atomicrmw.start1865; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=11866; CHECK-ARM8-NEXT: @ Child Loop BB9_2 Depth 21867; CHECK-ARM8-NEXT: ldr r12, [sp, #4] @ 4-byte Reload1868; CHECK-ARM8-NEXT: uxtb r1, r121869; CHECK-ARM8-NEXT: cmp r1, #11870; CHECK-ARM8-NEXT: mov lr, #11871; CHECK-ARM8-NEXT: movhi lr, r121872; CHECK-ARM8-NEXT: movw r3, :lower16:atomic_i81873; CHECK-ARM8-NEXT: movt r3, :upper16:atomic_i81874; CHECK-ARM8-NEXT: uxtb r12, r121875; CHECK-ARM8-NEXT: .LBB9_2: @ %atomicrmw.start1876; CHECK-ARM8-NEXT: @ Parent Loop BB9_1 Depth=11877; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=21878; CHECK-ARM8-NEXT: ldrexb r0, [r3]1879; CHECK-ARM8-NEXT: cmp r0, r121880; CHECK-ARM8-NEXT: bne .LBB9_41881; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start1882; CHECK-ARM8-NEXT: @ in Loop: Header=BB9_2 Depth=21883; CHECK-ARM8-NEXT: strexb r2, lr, [r3]1884; CHECK-ARM8-NEXT: cmp r2, #01885; CHECK-ARM8-NEXT: bne .LBB9_21886; CHECK-ARM8-NEXT: .LBB9_4: @ %atomicrmw.start1887; CHECK-ARM8-NEXT: @ in Loop: Header=BB9_1 Depth=11888; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill1889; CHECK-ARM8-NEXT: sub r1, r0, r11890; CHECK-ARM8-NEXT: clz r1, r11891; CHECK-ARM8-NEXT: lsr r1, r1, #51892; CHECK-ARM8-NEXT: cmp r1, #11893; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill1894; CHECK-ARM8-NEXT: bne .LBB9_11895; CHECK-ARM8-NEXT: b .LBB9_51896; CHECK-ARM8-NEXT: .LBB9_5: @ %atomicrmw.end1897; CHECK-ARM8-NEXT: ldr r0, [sp] @ 4-byte Reload1898; CHECK-ARM8-NEXT: add sp, sp, #81899; CHECK-ARM8-NEXT: pop {r11, pc}1900;1901; CHECK-ARM6-LABEL: test_umax_i8:1902; CHECK-ARM6: @ %bb.0: @ %entry1903; CHECK-ARM6-NEXT: .save {r11, lr}1904; CHECK-ARM6-NEXT: push {r11, lr}1905; CHECK-ARM6-NEXT: .pad #81906; CHECK-ARM6-NEXT: sub sp, sp, #81907; CHECK-ARM6-NEXT: ldr r0, .LCPI9_01908; CHECK-ARM6-NEXT: ldrb r0, [r0]1909; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill1910; CHECK-ARM6-NEXT: b .LBB9_11911; CHECK-ARM6-NEXT: .LBB9_1: @ %atomicrmw.start1912; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=11913; CHECK-ARM6-NEXT: @ Child Loop BB9_2 Depth 21914; CHECK-ARM6-NEXT: ldr r12, [sp, #4] @ 4-byte Reload1915; CHECK-ARM6-NEXT: uxtb r1, r121916; CHECK-ARM6-NEXT: cmp r1, #11917; CHECK-ARM6-NEXT: mov lr, #11918; CHECK-ARM6-NEXT: movhi lr, r121919; CHECK-ARM6-NEXT: ldr r3, .LCPI9_01920; CHECK-ARM6-NEXT: uxtb r12, r121921; CHECK-ARM6-NEXT: .LBB9_2: @ %atomicrmw.start1922; CHECK-ARM6-NEXT: @ Parent Loop BB9_1 Depth=11923; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=21924; CHECK-ARM6-NEXT: ldrexb r0, [r3]1925; CHECK-ARM6-NEXT: cmp r0, r121926; CHECK-ARM6-NEXT: bne .LBB9_41927; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start1928; CHECK-ARM6-NEXT: @ in Loop: Header=BB9_2 Depth=21929; CHECK-ARM6-NEXT: strexb r2, lr, [r3]1930; CHECK-ARM6-NEXT: cmp r2, #01931; CHECK-ARM6-NEXT: bne .LBB9_21932; CHECK-ARM6-NEXT: .LBB9_4: @ %atomicrmw.start1933; CHECK-ARM6-NEXT: @ in Loop: Header=BB9_1 Depth=11934; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill1935; CHECK-ARM6-NEXT: sub r1, r0, r11936; CHECK-ARM6-NEXT: clz r1, r11937; CHECK-ARM6-NEXT: lsr r1, r1, #51938; CHECK-ARM6-NEXT: cmp r1, #11939; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill1940; CHECK-ARM6-NEXT: bne .LBB9_11941; CHECK-ARM6-NEXT: b .LBB9_51942; CHECK-ARM6-NEXT: .LBB9_5: @ %atomicrmw.end1943; CHECK-ARM6-NEXT: ldr r0, [sp] @ 4-byte Reload1944; CHECK-ARM6-NEXT: add sp, sp, #81945; CHECK-ARM6-NEXT: pop {r11, pc}1946; CHECK-ARM6-NEXT: .p2align 21947; CHECK-ARM6-NEXT: @ %bb.6:1948; CHECK-ARM6-NEXT: .LCPI9_0:1949; CHECK-ARM6-NEXT: .long atomic_i81950;1951; CHECK-THUMB7-LABEL: test_umax_i8:1952; CHECK-THUMB7: @ %bb.0: @ %entry1953; CHECK-THUMB7-NEXT: .save {r4, lr}1954; CHECK-THUMB7-NEXT: push {r4, lr}1955; CHECK-THUMB7-NEXT: .pad #81956; CHECK-THUMB7-NEXT: sub sp, #81957; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i81958; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i81959; CHECK-THUMB7-NEXT: ldrb r0, [r0]1960; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill1961; CHECK-THUMB7-NEXT: b .LBB9_11962; CHECK-THUMB7-NEXT: .LBB9_1: @ %atomicrmw.start1963; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=11964; CHECK-THUMB7-NEXT: @ Child Loop BB9_2 Depth 21965; CHECK-THUMB7-NEXT: ldr r4, [sp, #4] @ 4-byte Reload1966; CHECK-THUMB7-NEXT: uxtb r1, r41967; CHECK-THUMB7-NEXT: cmp r1, #11968; CHECK-THUMB7-NEXT: mov.w r12, #11969; CHECK-THUMB7-NEXT: it hi1970; CHECK-THUMB7-NEXT: movhi r12, r41971; CHECK-THUMB7-NEXT: movw r3, :lower16:atomic_i81972; CHECK-THUMB7-NEXT: movt r3, :upper16:atomic_i81973; CHECK-THUMB7-NEXT: uxtb r4, r41974; CHECK-THUMB7-NEXT: .LBB9_2: @ %atomicrmw.start1975; CHECK-THUMB7-NEXT: @ Parent Loop BB9_1 Depth=11976; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=21977; CHECK-THUMB7-NEXT: ldrexb r0, [r3]1978; CHECK-THUMB7-NEXT: cmp r0, r41979; CHECK-THUMB7-NEXT: bne .LBB9_41980; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start1981; CHECK-THUMB7-NEXT: @ in Loop: Header=BB9_2 Depth=21982; CHECK-THUMB7-NEXT: strexb r2, r12, [r3]1983; CHECK-THUMB7-NEXT: cmp r2, #01984; CHECK-THUMB7-NEXT: bne .LBB9_21985; CHECK-THUMB7-NEXT: .LBB9_4: @ %atomicrmw.start1986; CHECK-THUMB7-NEXT: @ in Loop: Header=BB9_1 Depth=11987; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill1988; CHECK-THUMB7-NEXT: subs r1, r0, r11989; CHECK-THUMB7-NEXT: clz r1, r11990; CHECK-THUMB7-NEXT: lsrs r1, r1, #51991; CHECK-THUMB7-NEXT: cmp r1, #11992; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill1993; CHECK-THUMB7-NEXT: bne .LBB9_11994; CHECK-THUMB7-NEXT: b .LBB9_51995; CHECK-THUMB7-NEXT: .LBB9_5: @ %atomicrmw.end1996; CHECK-THUMB7-NEXT: ldr r0, [sp] @ 4-byte Reload1997; CHECK-THUMB7-NEXT: add sp, #81998; CHECK-THUMB7-NEXT: pop {r4, pc}1999;2000; CHECK-THUMB6-LABEL: test_umax_i8:2001; CHECK-THUMB6: @ %bb.0: @ %entry2002; CHECK-THUMB6-NEXT: .save {r7, lr}2003; CHECK-THUMB6-NEXT: push {r7, lr}2004; CHECK-THUMB6-NEXT: ldr r0, .LCPI9_02005; CHECK-THUMB6-NEXT: movs r1, #12006; CHECK-THUMB6-NEXT: bl __sync_fetch_and_umax_12007; CHECK-THUMB6-NEXT: pop {r7, pc}2008; CHECK-THUMB6-NEXT: .p2align 22009; CHECK-THUMB6-NEXT: @ %bb.1:2010; CHECK-THUMB6-NEXT: .LCPI9_0:2011; CHECK-THUMB6-NEXT: .long atomic_i82012;2013; CHECK-THUMB8BASE-LABEL: test_umax_i8:2014; CHECK-THUMB8BASE: @ %bb.0: @ %entry2015; CHECK-THUMB8BASE-NEXT: .save {r4, r5, r7, lr}2016; CHECK-THUMB8BASE-NEXT: push {r4, r5, r7, lr}2017; CHECK-THUMB8BASE-NEXT: .pad #242018; CHECK-THUMB8BASE-NEXT: sub sp, #242019; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i82020; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i82021; CHECK-THUMB8BASE-NEXT: ldrb r0, [r0]2022; CHECK-THUMB8BASE-NEXT: str r0, [sp, #20] @ 4-byte Spill2023; CHECK-THUMB8BASE-NEXT: b .LBB9_12024; CHECK-THUMB8BASE-NEXT: .LBB9_1: @ %atomicrmw.start2025; CHECK-THUMB8BASE-NEXT: @ =>This Loop Header: Depth=12026; CHECK-THUMB8BASE-NEXT: @ Child Loop BB9_4 Depth 22027; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #20] @ 4-byte Reload2028; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill2029; CHECK-THUMB8BASE-NEXT: uxtb r1, r02030; CHECK-THUMB8BASE-NEXT: str r1, [sp, #8] @ 4-byte Spill2031; CHECK-THUMB8BASE-NEXT: movs r2, #12032; CHECK-THUMB8BASE-NEXT: str r2, [sp, #12] @ 4-byte Spill2033; CHECK-THUMB8BASE-NEXT: cmp r1, #12034; CHECK-THUMB8BASE-NEXT: str r0, [sp, #16] @ 4-byte Spill2035; CHECK-THUMB8BASE-NEXT: bhi .LBB9_32036; CHECK-THUMB8BASE-NEXT: @ %bb.2: @ %atomicrmw.start2037; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB9_1 Depth=12038; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #12] @ 4-byte Reload2039; CHECK-THUMB8BASE-NEXT: str r0, [sp, #16] @ 4-byte Spill2040; CHECK-THUMB8BASE-NEXT: .LBB9_3: @ %atomicrmw.start2041; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB9_1 Depth=12042; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #8] @ 4-byte Reload2043; CHECK-THUMB8BASE-NEXT: ldr r4, [sp, #4] @ 4-byte Reload2044; CHECK-THUMB8BASE-NEXT: ldr r5, [sp, #16] @ 4-byte Reload2045; CHECK-THUMB8BASE-NEXT: movw r3, :lower16:atomic_i82046; CHECK-THUMB8BASE-NEXT: movt r3, :upper16:atomic_i82047; CHECK-THUMB8BASE-NEXT: uxtb r4, r42048; CHECK-THUMB8BASE-NEXT: .LBB9_4: @ %atomicrmw.start2049; CHECK-THUMB8BASE-NEXT: @ Parent Loop BB9_1 Depth=12050; CHECK-THUMB8BASE-NEXT: @ => This Inner Loop Header: Depth=22051; CHECK-THUMB8BASE-NEXT: ldrexb r0, [r3]2052; CHECK-THUMB8BASE-NEXT: cmp r0, r42053; CHECK-THUMB8BASE-NEXT: bne .LBB9_62054; CHECK-THUMB8BASE-NEXT: @ %bb.5: @ %atomicrmw.start2055; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB9_4 Depth=22056; CHECK-THUMB8BASE-NEXT: strexb r2, r5, [r3]2057; CHECK-THUMB8BASE-NEXT: cmp r2, #02058; CHECK-THUMB8BASE-NEXT: bne .LBB9_42059; CHECK-THUMB8BASE-NEXT: .LBB9_6: @ %atomicrmw.start2060; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB9_1 Depth=12061; CHECK-THUMB8BASE-NEXT: str r0, [sp] @ 4-byte Spill2062; CHECK-THUMB8BASE-NEXT: subs r1, r0, r12063; CHECK-THUMB8BASE-NEXT: rsbs r2, r1, #02064; CHECK-THUMB8BASE-NEXT: adcs r1, r22065; CHECK-THUMB8BASE-NEXT: cmp r1, #12066; CHECK-THUMB8BASE-NEXT: str r0, [sp, #20] @ 4-byte Spill2067; CHECK-THUMB8BASE-NEXT: bne .LBB9_12068; CHECK-THUMB8BASE-NEXT: b .LBB9_72069; CHECK-THUMB8BASE-NEXT: .LBB9_7: @ %atomicrmw.end2070; CHECK-THUMB8BASE-NEXT: ldr r0, [sp] @ 4-byte Reload2071; CHECK-THUMB8BASE-NEXT: add sp, #242072; CHECK-THUMB8BASE-NEXT: pop {r4, r5, r7, pc}2073entry:2074 %0 = atomicrmw umax ptr @atomic_i8, i8 1 monotonic2075 ret i8 %02076}2077define i8 @test_umin_i8() {2078; CHECK-ARM8-LABEL: test_umin_i8:2079; CHECK-ARM8: @ %bb.0: @ %entry2080; CHECK-ARM8-NEXT: .save {r11, lr}2081; CHECK-ARM8-NEXT: push {r11, lr}2082; CHECK-ARM8-NEXT: .pad #82083; CHECK-ARM8-NEXT: sub sp, sp, #82084; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i82085; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i82086; CHECK-ARM8-NEXT: ldrb r0, [r0]2087; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill2088; CHECK-ARM8-NEXT: b .LBB10_12089; CHECK-ARM8-NEXT: .LBB10_1: @ %atomicrmw.start2090; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=12091; CHECK-ARM8-NEXT: @ Child Loop BB10_2 Depth 22092; CHECK-ARM8-NEXT: ldr r12, [sp, #4] @ 4-byte Reload2093; CHECK-ARM8-NEXT: uxtb r1, r122094; CHECK-ARM8-NEXT: cmp r1, #22095; CHECK-ARM8-NEXT: mov lr, #12096; CHECK-ARM8-NEXT: movlo lr, r122097; CHECK-ARM8-NEXT: movw r3, :lower16:atomic_i82098; CHECK-ARM8-NEXT: movt r3, :upper16:atomic_i82099; CHECK-ARM8-NEXT: uxtb r12, r122100; CHECK-ARM8-NEXT: .LBB10_2: @ %atomicrmw.start2101; CHECK-ARM8-NEXT: @ Parent Loop BB10_1 Depth=12102; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=22103; CHECK-ARM8-NEXT: ldrexb r0, [r3]2104; CHECK-ARM8-NEXT: cmp r0, r122105; CHECK-ARM8-NEXT: bne .LBB10_42106; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start2107; CHECK-ARM8-NEXT: @ in Loop: Header=BB10_2 Depth=22108; CHECK-ARM8-NEXT: strexb r2, lr, [r3]2109; CHECK-ARM8-NEXT: cmp r2, #02110; CHECK-ARM8-NEXT: bne .LBB10_22111; CHECK-ARM8-NEXT: .LBB10_4: @ %atomicrmw.start2112; CHECK-ARM8-NEXT: @ in Loop: Header=BB10_1 Depth=12113; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill2114; CHECK-ARM8-NEXT: sub r1, r0, r12115; CHECK-ARM8-NEXT: clz r1, r12116; CHECK-ARM8-NEXT: lsr r1, r1, #52117; CHECK-ARM8-NEXT: cmp r1, #12118; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill2119; CHECK-ARM8-NEXT: bne .LBB10_12120; CHECK-ARM8-NEXT: b .LBB10_52121; CHECK-ARM8-NEXT: .LBB10_5: @ %atomicrmw.end2122; CHECK-ARM8-NEXT: ldr r0, [sp] @ 4-byte Reload2123; CHECK-ARM8-NEXT: add sp, sp, #82124; CHECK-ARM8-NEXT: pop {r11, pc}2125;2126; CHECK-ARM6-LABEL: test_umin_i8:2127; CHECK-ARM6: @ %bb.0: @ %entry2128; CHECK-ARM6-NEXT: .save {r11, lr}2129; CHECK-ARM6-NEXT: push {r11, lr}2130; CHECK-ARM6-NEXT: .pad #82131; CHECK-ARM6-NEXT: sub sp, sp, #82132; CHECK-ARM6-NEXT: ldr r0, .LCPI10_02133; CHECK-ARM6-NEXT: ldrb r0, [r0]2134; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill2135; CHECK-ARM6-NEXT: b .LBB10_12136; CHECK-ARM6-NEXT: .LBB10_1: @ %atomicrmw.start2137; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=12138; CHECK-ARM6-NEXT: @ Child Loop BB10_2 Depth 22139; CHECK-ARM6-NEXT: ldr r12, [sp, #4] @ 4-byte Reload2140; CHECK-ARM6-NEXT: uxtb r1, r122141; CHECK-ARM6-NEXT: cmp r1, #22142; CHECK-ARM6-NEXT: mov lr, #12143; CHECK-ARM6-NEXT: movlo lr, r122144; CHECK-ARM6-NEXT: ldr r3, .LCPI10_02145; CHECK-ARM6-NEXT: uxtb r12, r122146; CHECK-ARM6-NEXT: .LBB10_2: @ %atomicrmw.start2147; CHECK-ARM6-NEXT: @ Parent Loop BB10_1 Depth=12148; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=22149; CHECK-ARM6-NEXT: ldrexb r0, [r3]2150; CHECK-ARM6-NEXT: cmp r0, r122151; CHECK-ARM6-NEXT: bne .LBB10_42152; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start2153; CHECK-ARM6-NEXT: @ in Loop: Header=BB10_2 Depth=22154; CHECK-ARM6-NEXT: strexb r2, lr, [r3]2155; CHECK-ARM6-NEXT: cmp r2, #02156; CHECK-ARM6-NEXT: bne .LBB10_22157; CHECK-ARM6-NEXT: .LBB10_4: @ %atomicrmw.start2158; CHECK-ARM6-NEXT: @ in Loop: Header=BB10_1 Depth=12159; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill2160; CHECK-ARM6-NEXT: sub r1, r0, r12161; CHECK-ARM6-NEXT: clz r1, r12162; CHECK-ARM6-NEXT: lsr r1, r1, #52163; CHECK-ARM6-NEXT: cmp r1, #12164; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill2165; CHECK-ARM6-NEXT: bne .LBB10_12166; CHECK-ARM6-NEXT: b .LBB10_52167; CHECK-ARM6-NEXT: .LBB10_5: @ %atomicrmw.end2168; CHECK-ARM6-NEXT: ldr r0, [sp] @ 4-byte Reload2169; CHECK-ARM6-NEXT: add sp, sp, #82170; CHECK-ARM6-NEXT: pop {r11, pc}2171; CHECK-ARM6-NEXT: .p2align 22172; CHECK-ARM6-NEXT: @ %bb.6:2173; CHECK-ARM6-NEXT: .LCPI10_0:2174; CHECK-ARM6-NEXT: .long atomic_i82175;2176; CHECK-THUMB7-LABEL: test_umin_i8:2177; CHECK-THUMB7: @ %bb.0: @ %entry2178; CHECK-THUMB7-NEXT: .save {r4, lr}2179; CHECK-THUMB7-NEXT: push {r4, lr}2180; CHECK-THUMB7-NEXT: .pad #82181; CHECK-THUMB7-NEXT: sub sp, #82182; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i82183; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i82184; CHECK-THUMB7-NEXT: ldrb r0, [r0]2185; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill2186; CHECK-THUMB7-NEXT: b .LBB10_12187; CHECK-THUMB7-NEXT: .LBB10_1: @ %atomicrmw.start2188; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=12189; CHECK-THUMB7-NEXT: @ Child Loop BB10_2 Depth 22190; CHECK-THUMB7-NEXT: ldr r4, [sp, #4] @ 4-byte Reload2191; CHECK-THUMB7-NEXT: uxtb r1, r42192; CHECK-THUMB7-NEXT: cmp r1, #22193; CHECK-THUMB7-NEXT: mov.w r12, #12194; CHECK-THUMB7-NEXT: it lo2195; CHECK-THUMB7-NEXT: movlo r12, r42196; CHECK-THUMB7-NEXT: movw r3, :lower16:atomic_i82197; CHECK-THUMB7-NEXT: movt r3, :upper16:atomic_i82198; CHECK-THUMB7-NEXT: uxtb r4, r42199; CHECK-THUMB7-NEXT: .LBB10_2: @ %atomicrmw.start2200; CHECK-THUMB7-NEXT: @ Parent Loop BB10_1 Depth=12201; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=22202; CHECK-THUMB7-NEXT: ldrexb r0, [r3]2203; CHECK-THUMB7-NEXT: cmp r0, r42204; CHECK-THUMB7-NEXT: bne .LBB10_42205; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start2206; CHECK-THUMB7-NEXT: @ in Loop: Header=BB10_2 Depth=22207; CHECK-THUMB7-NEXT: strexb r2, r12, [r3]2208; CHECK-THUMB7-NEXT: cmp r2, #02209; CHECK-THUMB7-NEXT: bne .LBB10_22210; CHECK-THUMB7-NEXT: .LBB10_4: @ %atomicrmw.start2211; CHECK-THUMB7-NEXT: @ in Loop: Header=BB10_1 Depth=12212; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill2213; CHECK-THUMB7-NEXT: subs r1, r0, r12214; CHECK-THUMB7-NEXT: clz r1, r12215; CHECK-THUMB7-NEXT: lsrs r1, r1, #52216; CHECK-THUMB7-NEXT: cmp r1, #12217; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill2218; CHECK-THUMB7-NEXT: bne .LBB10_12219; CHECK-THUMB7-NEXT: b .LBB10_52220; CHECK-THUMB7-NEXT: .LBB10_5: @ %atomicrmw.end2221; CHECK-THUMB7-NEXT: ldr r0, [sp] @ 4-byte Reload2222; CHECK-THUMB7-NEXT: add sp, #82223; CHECK-THUMB7-NEXT: pop {r4, pc}2224;2225; CHECK-THUMB6-LABEL: test_umin_i8:2226; CHECK-THUMB6: @ %bb.0: @ %entry2227; CHECK-THUMB6-NEXT: .save {r7, lr}2228; CHECK-THUMB6-NEXT: push {r7, lr}2229; CHECK-THUMB6-NEXT: ldr r0, .LCPI10_02230; CHECK-THUMB6-NEXT: movs r1, #12231; CHECK-THUMB6-NEXT: bl __sync_fetch_and_umin_12232; CHECK-THUMB6-NEXT: pop {r7, pc}2233; CHECK-THUMB6-NEXT: .p2align 22234; CHECK-THUMB6-NEXT: @ %bb.1:2235; CHECK-THUMB6-NEXT: .LCPI10_0:2236; CHECK-THUMB6-NEXT: .long atomic_i82237;2238; CHECK-THUMB8BASE-LABEL: test_umin_i8:2239; CHECK-THUMB8BASE: @ %bb.0: @ %entry2240; CHECK-THUMB8BASE-NEXT: .save {r4, r5, r7, lr}2241; CHECK-THUMB8BASE-NEXT: push {r4, r5, r7, lr}2242; CHECK-THUMB8BASE-NEXT: .pad #242243; CHECK-THUMB8BASE-NEXT: sub sp, #242244; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i82245; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i82246; CHECK-THUMB8BASE-NEXT: ldrb r0, [r0]2247; CHECK-THUMB8BASE-NEXT: str r0, [sp, #20] @ 4-byte Spill2248; CHECK-THUMB8BASE-NEXT: b .LBB10_12249; CHECK-THUMB8BASE-NEXT: .LBB10_1: @ %atomicrmw.start2250; CHECK-THUMB8BASE-NEXT: @ =>This Loop Header: Depth=12251; CHECK-THUMB8BASE-NEXT: @ Child Loop BB10_4 Depth 22252; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #20] @ 4-byte Reload2253; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill2254; CHECK-THUMB8BASE-NEXT: uxtb r1, r02255; CHECK-THUMB8BASE-NEXT: str r1, [sp, #8] @ 4-byte Spill2256; CHECK-THUMB8BASE-NEXT: movs r2, #12257; CHECK-THUMB8BASE-NEXT: str r2, [sp, #12] @ 4-byte Spill2258; CHECK-THUMB8BASE-NEXT: cmp r1, #22259; CHECK-THUMB8BASE-NEXT: str r0, [sp, #16] @ 4-byte Spill2260; CHECK-THUMB8BASE-NEXT: blo .LBB10_32261; CHECK-THUMB8BASE-NEXT: @ %bb.2: @ %atomicrmw.start2262; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB10_1 Depth=12263; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #12] @ 4-byte Reload2264; CHECK-THUMB8BASE-NEXT: str r0, [sp, #16] @ 4-byte Spill2265; CHECK-THUMB8BASE-NEXT: .LBB10_3: @ %atomicrmw.start2266; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB10_1 Depth=12267; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #8] @ 4-byte Reload2268; CHECK-THUMB8BASE-NEXT: ldr r4, [sp, #4] @ 4-byte Reload2269; CHECK-THUMB8BASE-NEXT: ldr r5, [sp, #16] @ 4-byte Reload2270; CHECK-THUMB8BASE-NEXT: movw r3, :lower16:atomic_i82271; CHECK-THUMB8BASE-NEXT: movt r3, :upper16:atomic_i82272; CHECK-THUMB8BASE-NEXT: uxtb r4, r42273; CHECK-THUMB8BASE-NEXT: .LBB10_4: @ %atomicrmw.start2274; CHECK-THUMB8BASE-NEXT: @ Parent Loop BB10_1 Depth=12275; CHECK-THUMB8BASE-NEXT: @ => This Inner Loop Header: Depth=22276; CHECK-THUMB8BASE-NEXT: ldrexb r0, [r3]2277; CHECK-THUMB8BASE-NEXT: cmp r0, r42278; CHECK-THUMB8BASE-NEXT: bne .LBB10_62279; CHECK-THUMB8BASE-NEXT: @ %bb.5: @ %atomicrmw.start2280; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB10_4 Depth=22281; CHECK-THUMB8BASE-NEXT: strexb r2, r5, [r3]2282; CHECK-THUMB8BASE-NEXT: cmp r2, #02283; CHECK-THUMB8BASE-NEXT: bne .LBB10_42284; CHECK-THUMB8BASE-NEXT: .LBB10_6: @ %atomicrmw.start2285; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB10_1 Depth=12286; CHECK-THUMB8BASE-NEXT: str r0, [sp] @ 4-byte Spill2287; CHECK-THUMB8BASE-NEXT: subs r1, r0, r12288; CHECK-THUMB8BASE-NEXT: rsbs r2, r1, #02289; CHECK-THUMB8BASE-NEXT: adcs r1, r22290; CHECK-THUMB8BASE-NEXT: cmp r1, #12291; CHECK-THUMB8BASE-NEXT: str r0, [sp, #20] @ 4-byte Spill2292; CHECK-THUMB8BASE-NEXT: bne .LBB10_12293; CHECK-THUMB8BASE-NEXT: b .LBB10_72294; CHECK-THUMB8BASE-NEXT: .LBB10_7: @ %atomicrmw.end2295; CHECK-THUMB8BASE-NEXT: ldr r0, [sp] @ 4-byte Reload2296; CHECK-THUMB8BASE-NEXT: add sp, #242297; CHECK-THUMB8BASE-NEXT: pop {r4, r5, r7, pc}2298entry:2299 %0 = atomicrmw umin ptr @atomic_i8, i8 1 monotonic2300 ret i8 %02301}2302 2303 2304define i16 @test_xchg_i16() {2305; CHECK-ARM8-LABEL: test_xchg_i16:2306; CHECK-ARM8: @ %bb.0: @ %entry2307; CHECK-ARM8-NEXT: .pad #82308; CHECK-ARM8-NEXT: sub sp, sp, #82309; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i162310; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i162311; CHECK-ARM8-NEXT: ldrh r0, [r0]2312; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill2313; CHECK-ARM8-NEXT: b .LBB11_12314; CHECK-ARM8-NEXT: .LBB11_1: @ %atomicrmw.start2315; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=12316; CHECK-ARM8-NEXT: @ Child Loop BB11_2 Depth 22317; CHECK-ARM8-NEXT: ldr r1, [sp, #4] @ 4-byte Reload2318; CHECK-ARM8-NEXT: movw r3, :lower16:atomic_i162319; CHECK-ARM8-NEXT: movt r3, :upper16:atomic_i162320; CHECK-ARM8-NEXT: mov r12, #12321; CHECK-ARM8-NEXT: uxth r1, r12322; CHECK-ARM8-NEXT: .LBB11_2: @ %atomicrmw.start2323; CHECK-ARM8-NEXT: @ Parent Loop BB11_1 Depth=12324; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=22325; CHECK-ARM8-NEXT: ldrexh r0, [r3]2326; CHECK-ARM8-NEXT: cmp r0, r12327; CHECK-ARM8-NEXT: bne .LBB11_42328; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start2329; CHECK-ARM8-NEXT: @ in Loop: Header=BB11_2 Depth=22330; CHECK-ARM8-NEXT: strexh r2, r12, [r3]2331; CHECK-ARM8-NEXT: cmp r2, #02332; CHECK-ARM8-NEXT: bne .LBB11_22333; CHECK-ARM8-NEXT: .LBB11_4: @ %atomicrmw.start2334; CHECK-ARM8-NEXT: @ in Loop: Header=BB11_1 Depth=12335; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill2336; CHECK-ARM8-NEXT: uxth r1, r12337; CHECK-ARM8-NEXT: sub r1, r0, r12338; CHECK-ARM8-NEXT: clz r1, r12339; CHECK-ARM8-NEXT: lsr r1, r1, #52340; CHECK-ARM8-NEXT: cmp r1, #12341; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill2342; CHECK-ARM8-NEXT: bne .LBB11_12343; CHECK-ARM8-NEXT: b .LBB11_52344; CHECK-ARM8-NEXT: .LBB11_5: @ %atomicrmw.end2345; CHECK-ARM8-NEXT: ldr r0, [sp] @ 4-byte Reload2346; CHECK-ARM8-NEXT: add sp, sp, #82347; CHECK-ARM8-NEXT: bx lr2348;2349; CHECK-ARM6-LABEL: test_xchg_i16:2350; CHECK-ARM6: @ %bb.0: @ %entry2351; CHECK-ARM6-NEXT: .pad #82352; CHECK-ARM6-NEXT: sub sp, sp, #82353; CHECK-ARM6-NEXT: ldr r0, .LCPI11_02354; CHECK-ARM6-NEXT: ldrh r0, [r0]2355; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill2356; CHECK-ARM6-NEXT: b .LBB11_12357; CHECK-ARM6-NEXT: .LBB11_1: @ %atomicrmw.start2358; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=12359; CHECK-ARM6-NEXT: @ Child Loop BB11_2 Depth 22360; CHECK-ARM6-NEXT: ldr r1, [sp, #4] @ 4-byte Reload2361; CHECK-ARM6-NEXT: ldr r3, .LCPI11_02362; CHECK-ARM6-NEXT: mov r12, #12363; CHECK-ARM6-NEXT: uxth r1, r12364; CHECK-ARM6-NEXT: .LBB11_2: @ %atomicrmw.start2365; CHECK-ARM6-NEXT: @ Parent Loop BB11_1 Depth=12366; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=22367; CHECK-ARM6-NEXT: ldrexh r0, [r3]2368; CHECK-ARM6-NEXT: cmp r0, r12369; CHECK-ARM6-NEXT: bne .LBB11_42370; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start2371; CHECK-ARM6-NEXT: @ in Loop: Header=BB11_2 Depth=22372; CHECK-ARM6-NEXT: strexh r2, r12, [r3]2373; CHECK-ARM6-NEXT: cmp r2, #02374; CHECK-ARM6-NEXT: bne .LBB11_22375; CHECK-ARM6-NEXT: .LBB11_4: @ %atomicrmw.start2376; CHECK-ARM6-NEXT: @ in Loop: Header=BB11_1 Depth=12377; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill2378; CHECK-ARM6-NEXT: uxth r1, r12379; CHECK-ARM6-NEXT: sub r1, r0, r12380; CHECK-ARM6-NEXT: clz r1, r12381; CHECK-ARM6-NEXT: lsr r1, r1, #52382; CHECK-ARM6-NEXT: cmp r1, #12383; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill2384; CHECK-ARM6-NEXT: bne .LBB11_12385; CHECK-ARM6-NEXT: b .LBB11_52386; CHECK-ARM6-NEXT: .LBB11_5: @ %atomicrmw.end2387; CHECK-ARM6-NEXT: ldr r0, [sp] @ 4-byte Reload2388; CHECK-ARM6-NEXT: add sp, sp, #82389; CHECK-ARM6-NEXT: bx lr2390; CHECK-ARM6-NEXT: .p2align 22391; CHECK-ARM6-NEXT: @ %bb.6:2392; CHECK-ARM6-NEXT: .LCPI11_0:2393; CHECK-ARM6-NEXT: .long atomic_i162394;2395; CHECK-THUMB7-LABEL: test_xchg_i16:2396; CHECK-THUMB7: @ %bb.0: @ %entry2397; CHECK-THUMB7-NEXT: .pad #82398; CHECK-THUMB7-NEXT: sub sp, #82399; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i162400; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i162401; CHECK-THUMB7-NEXT: ldrh r0, [r0]2402; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill2403; CHECK-THUMB7-NEXT: b .LBB11_12404; CHECK-THUMB7-NEXT: .LBB11_1: @ %atomicrmw.start2405; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=12406; CHECK-THUMB7-NEXT: @ Child Loop BB11_2 Depth 22407; CHECK-THUMB7-NEXT: ldr r1, [sp, #4] @ 4-byte Reload2408; CHECK-THUMB7-NEXT: movw r3, :lower16:atomic_i162409; CHECK-THUMB7-NEXT: movt r3, :upper16:atomic_i162410; CHECK-THUMB7-NEXT: mov.w r12, #12411; CHECK-THUMB7-NEXT: uxth r1, r12412; CHECK-THUMB7-NEXT: .LBB11_2: @ %atomicrmw.start2413; CHECK-THUMB7-NEXT: @ Parent Loop BB11_1 Depth=12414; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=22415; CHECK-THUMB7-NEXT: ldrexh r0, [r3]2416; CHECK-THUMB7-NEXT: cmp r0, r12417; CHECK-THUMB7-NEXT: bne .LBB11_42418; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start2419; CHECK-THUMB7-NEXT: @ in Loop: Header=BB11_2 Depth=22420; CHECK-THUMB7-NEXT: strexh r2, r12, [r3]2421; CHECK-THUMB7-NEXT: cmp r2, #02422; CHECK-THUMB7-NEXT: bne .LBB11_22423; CHECK-THUMB7-NEXT: .LBB11_4: @ %atomicrmw.start2424; CHECK-THUMB7-NEXT: @ in Loop: Header=BB11_1 Depth=12425; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill2426; CHECK-THUMB7-NEXT: uxth r1, r12427; CHECK-THUMB7-NEXT: subs r1, r0, r12428; CHECK-THUMB7-NEXT: clz r1, r12429; CHECK-THUMB7-NEXT: lsrs r1, r1, #52430; CHECK-THUMB7-NEXT: cmp r1, #12431; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill2432; CHECK-THUMB7-NEXT: bne .LBB11_12433; CHECK-THUMB7-NEXT: b .LBB11_52434; CHECK-THUMB7-NEXT: .LBB11_5: @ %atomicrmw.end2435; CHECK-THUMB7-NEXT: ldr r0, [sp] @ 4-byte Reload2436; CHECK-THUMB7-NEXT: add sp, #82437; CHECK-THUMB7-NEXT: bx lr2438;2439; CHECK-THUMB6-LABEL: test_xchg_i16:2440; CHECK-THUMB6: @ %bb.0: @ %entry2441; CHECK-THUMB6-NEXT: .save {r7, lr}2442; CHECK-THUMB6-NEXT: push {r7, lr}2443; CHECK-THUMB6-NEXT: ldr r0, .LCPI11_02444; CHECK-THUMB6-NEXT: movs r1, #12445; CHECK-THUMB6-NEXT: bl __sync_lock_test_and_set_22446; CHECK-THUMB6-NEXT: pop {r7, pc}2447; CHECK-THUMB6-NEXT: .p2align 22448; CHECK-THUMB6-NEXT: @ %bb.1:2449; CHECK-THUMB6-NEXT: .LCPI11_0:2450; CHECK-THUMB6-NEXT: .long atomic_i162451;2452; CHECK-THUMB8BASE-LABEL: test_xchg_i16:2453; CHECK-THUMB8BASE: @ %bb.0: @ %entry2454; CHECK-THUMB8BASE-NEXT: .save {r4, lr}2455; CHECK-THUMB8BASE-NEXT: push {r4, lr}2456; CHECK-THUMB8BASE-NEXT: .pad #82457; CHECK-THUMB8BASE-NEXT: sub sp, #82458; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i162459; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i162460; CHECK-THUMB8BASE-NEXT: ldrh r0, [r0]2461; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill2462; CHECK-THUMB8BASE-NEXT: b .LBB11_12463; CHECK-THUMB8BASE-NEXT: .LBB11_1: @ %atomicrmw.start2464; CHECK-THUMB8BASE-NEXT: @ =>This Loop Header: Depth=12465; CHECK-THUMB8BASE-NEXT: @ Child Loop BB11_2 Depth 22466; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #4] @ 4-byte Reload2467; CHECK-THUMB8BASE-NEXT: movw r3, :lower16:atomic_i162468; CHECK-THUMB8BASE-NEXT: movt r3, :upper16:atomic_i162469; CHECK-THUMB8BASE-NEXT: movs r4, #12470; CHECK-THUMB8BASE-NEXT: uxth r1, r12471; CHECK-THUMB8BASE-NEXT: .LBB11_2: @ %atomicrmw.start2472; CHECK-THUMB8BASE-NEXT: @ Parent Loop BB11_1 Depth=12473; CHECK-THUMB8BASE-NEXT: @ => This Inner Loop Header: Depth=22474; CHECK-THUMB8BASE-NEXT: ldrexh r0, [r3]2475; CHECK-THUMB8BASE-NEXT: cmp r0, r12476; CHECK-THUMB8BASE-NEXT: bne .LBB11_42477; CHECK-THUMB8BASE-NEXT: @ %bb.3: @ %atomicrmw.start2478; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB11_2 Depth=22479; CHECK-THUMB8BASE-NEXT: strexh r2, r4, [r3]2480; CHECK-THUMB8BASE-NEXT: cmp r2, #02481; CHECK-THUMB8BASE-NEXT: bne .LBB11_22482; CHECK-THUMB8BASE-NEXT: .LBB11_4: @ %atomicrmw.start2483; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB11_1 Depth=12484; CHECK-THUMB8BASE-NEXT: str r0, [sp] @ 4-byte Spill2485; CHECK-THUMB8BASE-NEXT: uxth r1, r12486; CHECK-THUMB8BASE-NEXT: subs r1, r0, r12487; CHECK-THUMB8BASE-NEXT: rsbs r2, r1, #02488; CHECK-THUMB8BASE-NEXT: adcs r1, r22489; CHECK-THUMB8BASE-NEXT: cmp r1, #12490; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill2491; CHECK-THUMB8BASE-NEXT: bne .LBB11_12492; CHECK-THUMB8BASE-NEXT: b .LBB11_52493; CHECK-THUMB8BASE-NEXT: .LBB11_5: @ %atomicrmw.end2494; CHECK-THUMB8BASE-NEXT: ldr r0, [sp] @ 4-byte Reload2495; CHECK-THUMB8BASE-NEXT: add sp, #82496; CHECK-THUMB8BASE-NEXT: pop {r4, pc}2497entry:2498 %0 = atomicrmw xchg ptr @atomic_i16, i16 1 monotonic2499 ret i16 %02500}2501define i16 @test_add_i16() {2502; CHECK-ARM8-LABEL: test_add_i16:2503; CHECK-ARM8: @ %bb.0: @ %entry2504; CHECK-ARM8-NEXT: .pad #82505; CHECK-ARM8-NEXT: sub sp, sp, #82506; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i162507; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i162508; CHECK-ARM8-NEXT: ldrh r0, [r0]2509; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill2510; CHECK-ARM8-NEXT: b .LBB12_12511; CHECK-ARM8-NEXT: .LBB12_1: @ %atomicrmw.start2512; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=12513; CHECK-ARM8-NEXT: @ Child Loop BB12_2 Depth 22514; CHECK-ARM8-NEXT: ldr r1, [sp, #4] @ 4-byte Reload2515; CHECK-ARM8-NEXT: add r12, r1, #12516; CHECK-ARM8-NEXT: movw r3, :lower16:atomic_i162517; CHECK-ARM8-NEXT: movt r3, :upper16:atomic_i162518; CHECK-ARM8-NEXT: uxth r1, r12519; CHECK-ARM8-NEXT: .LBB12_2: @ %atomicrmw.start2520; CHECK-ARM8-NEXT: @ Parent Loop BB12_1 Depth=12521; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=22522; CHECK-ARM8-NEXT: ldrexh r0, [r3]2523; CHECK-ARM8-NEXT: cmp r0, r12524; CHECK-ARM8-NEXT: bne .LBB12_42525; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start2526; CHECK-ARM8-NEXT: @ in Loop: Header=BB12_2 Depth=22527; CHECK-ARM8-NEXT: strexh r2, r12, [r3]2528; CHECK-ARM8-NEXT: cmp r2, #02529; CHECK-ARM8-NEXT: bne .LBB12_22530; CHECK-ARM8-NEXT: .LBB12_4: @ %atomicrmw.start2531; CHECK-ARM8-NEXT: @ in Loop: Header=BB12_1 Depth=12532; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill2533; CHECK-ARM8-NEXT: uxth r1, r12534; CHECK-ARM8-NEXT: sub r1, r0, r12535; CHECK-ARM8-NEXT: clz r1, r12536; CHECK-ARM8-NEXT: lsr r1, r1, #52537; CHECK-ARM8-NEXT: cmp r1, #12538; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill2539; CHECK-ARM8-NEXT: bne .LBB12_12540; CHECK-ARM8-NEXT: b .LBB12_52541; CHECK-ARM8-NEXT: .LBB12_5: @ %atomicrmw.end2542; CHECK-ARM8-NEXT: ldr r0, [sp] @ 4-byte Reload2543; CHECK-ARM8-NEXT: add sp, sp, #82544; CHECK-ARM8-NEXT: bx lr2545;2546; CHECK-ARM6-LABEL: test_add_i16:2547; CHECK-ARM6: @ %bb.0: @ %entry2548; CHECK-ARM6-NEXT: .pad #82549; CHECK-ARM6-NEXT: sub sp, sp, #82550; CHECK-ARM6-NEXT: ldr r0, .LCPI12_02551; CHECK-ARM6-NEXT: ldrh r0, [r0]2552; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill2553; CHECK-ARM6-NEXT: b .LBB12_12554; CHECK-ARM6-NEXT: .LBB12_1: @ %atomicrmw.start2555; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=12556; CHECK-ARM6-NEXT: @ Child Loop BB12_2 Depth 22557; CHECK-ARM6-NEXT: ldr r1, [sp, #4] @ 4-byte Reload2558; CHECK-ARM6-NEXT: add r12, r1, #12559; CHECK-ARM6-NEXT: ldr r3, .LCPI12_02560; CHECK-ARM6-NEXT: uxth r1, r12561; CHECK-ARM6-NEXT: .LBB12_2: @ %atomicrmw.start2562; CHECK-ARM6-NEXT: @ Parent Loop BB12_1 Depth=12563; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=22564; CHECK-ARM6-NEXT: ldrexh r0, [r3]2565; CHECK-ARM6-NEXT: cmp r0, r12566; CHECK-ARM6-NEXT: bne .LBB12_42567; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start2568; CHECK-ARM6-NEXT: @ in Loop: Header=BB12_2 Depth=22569; CHECK-ARM6-NEXT: strexh r2, r12, [r3]2570; CHECK-ARM6-NEXT: cmp r2, #02571; CHECK-ARM6-NEXT: bne .LBB12_22572; CHECK-ARM6-NEXT: .LBB12_4: @ %atomicrmw.start2573; CHECK-ARM6-NEXT: @ in Loop: Header=BB12_1 Depth=12574; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill2575; CHECK-ARM6-NEXT: uxth r1, r12576; CHECK-ARM6-NEXT: sub r1, r0, r12577; CHECK-ARM6-NEXT: clz r1, r12578; CHECK-ARM6-NEXT: lsr r1, r1, #52579; CHECK-ARM6-NEXT: cmp r1, #12580; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill2581; CHECK-ARM6-NEXT: bne .LBB12_12582; CHECK-ARM6-NEXT: b .LBB12_52583; CHECK-ARM6-NEXT: .LBB12_5: @ %atomicrmw.end2584; CHECK-ARM6-NEXT: ldr r0, [sp] @ 4-byte Reload2585; CHECK-ARM6-NEXT: add sp, sp, #82586; CHECK-ARM6-NEXT: bx lr2587; CHECK-ARM6-NEXT: .p2align 22588; CHECK-ARM6-NEXT: @ %bb.6:2589; CHECK-ARM6-NEXT: .LCPI12_0:2590; CHECK-ARM6-NEXT: .long atomic_i162591;2592; CHECK-THUMB7-LABEL: test_add_i16:2593; CHECK-THUMB7: @ %bb.0: @ %entry2594; CHECK-THUMB7-NEXT: .pad #82595; CHECK-THUMB7-NEXT: sub sp, #82596; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i162597; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i162598; CHECK-THUMB7-NEXT: ldrh r0, [r0]2599; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill2600; CHECK-THUMB7-NEXT: b .LBB12_12601; CHECK-THUMB7-NEXT: .LBB12_1: @ %atomicrmw.start2602; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=12603; CHECK-THUMB7-NEXT: @ Child Loop BB12_2 Depth 22604; CHECK-THUMB7-NEXT: ldr r1, [sp, #4] @ 4-byte Reload2605; CHECK-THUMB7-NEXT: add.w r12, r1, #12606; CHECK-THUMB7-NEXT: movw r3, :lower16:atomic_i162607; CHECK-THUMB7-NEXT: movt r3, :upper16:atomic_i162608; CHECK-THUMB7-NEXT: uxth r1, r12609; CHECK-THUMB7-NEXT: .LBB12_2: @ %atomicrmw.start2610; CHECK-THUMB7-NEXT: @ Parent Loop BB12_1 Depth=12611; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=22612; CHECK-THUMB7-NEXT: ldrexh r0, [r3]2613; CHECK-THUMB7-NEXT: cmp r0, r12614; CHECK-THUMB7-NEXT: bne .LBB12_42615; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start2616; CHECK-THUMB7-NEXT: @ in Loop: Header=BB12_2 Depth=22617; CHECK-THUMB7-NEXT: strexh r2, r12, [r3]2618; CHECK-THUMB7-NEXT: cmp r2, #02619; CHECK-THUMB7-NEXT: bne .LBB12_22620; CHECK-THUMB7-NEXT: .LBB12_4: @ %atomicrmw.start2621; CHECK-THUMB7-NEXT: @ in Loop: Header=BB12_1 Depth=12622; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill2623; CHECK-THUMB7-NEXT: uxth r1, r12624; CHECK-THUMB7-NEXT: subs r1, r0, r12625; CHECK-THUMB7-NEXT: clz r1, r12626; CHECK-THUMB7-NEXT: lsrs r1, r1, #52627; CHECK-THUMB7-NEXT: cmp r1, #12628; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill2629; CHECK-THUMB7-NEXT: bne .LBB12_12630; CHECK-THUMB7-NEXT: b .LBB12_52631; CHECK-THUMB7-NEXT: .LBB12_5: @ %atomicrmw.end2632; CHECK-THUMB7-NEXT: ldr r0, [sp] @ 4-byte Reload2633; CHECK-THUMB7-NEXT: add sp, #82634; CHECK-THUMB7-NEXT: bx lr2635;2636; CHECK-THUMB6-LABEL: test_add_i16:2637; CHECK-THUMB6: @ %bb.0: @ %entry2638; CHECK-THUMB6-NEXT: .save {r7, lr}2639; CHECK-THUMB6-NEXT: push {r7, lr}2640; CHECK-THUMB6-NEXT: ldr r0, .LCPI12_02641; CHECK-THUMB6-NEXT: movs r1, #12642; CHECK-THUMB6-NEXT: bl __sync_fetch_and_add_22643; CHECK-THUMB6-NEXT: pop {r7, pc}2644; CHECK-THUMB6-NEXT: .p2align 22645; CHECK-THUMB6-NEXT: @ %bb.1:2646; CHECK-THUMB6-NEXT: .LCPI12_0:2647; CHECK-THUMB6-NEXT: .long atomic_i162648;2649; CHECK-THUMB8BASE-LABEL: test_add_i16:2650; CHECK-THUMB8BASE: @ %bb.0: @ %entry2651; CHECK-THUMB8BASE-NEXT: .save {r4, lr}2652; CHECK-THUMB8BASE-NEXT: push {r4, lr}2653; CHECK-THUMB8BASE-NEXT: .pad #82654; CHECK-THUMB8BASE-NEXT: sub sp, #82655; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i162656; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i162657; CHECK-THUMB8BASE-NEXT: ldrh r0, [r0]2658; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill2659; CHECK-THUMB8BASE-NEXT: b .LBB12_12660; CHECK-THUMB8BASE-NEXT: .LBB12_1: @ %atomicrmw.start2661; CHECK-THUMB8BASE-NEXT: @ =>This Loop Header: Depth=12662; CHECK-THUMB8BASE-NEXT: @ Child Loop BB12_2 Depth 22663; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #4] @ 4-byte Reload2664; CHECK-THUMB8BASE-NEXT: adds r4, r1, #12665; CHECK-THUMB8BASE-NEXT: movw r3, :lower16:atomic_i162666; CHECK-THUMB8BASE-NEXT: movt r3, :upper16:atomic_i162667; CHECK-THUMB8BASE-NEXT: uxth r1, r12668; CHECK-THUMB8BASE-NEXT: .LBB12_2: @ %atomicrmw.start2669; CHECK-THUMB8BASE-NEXT: @ Parent Loop BB12_1 Depth=12670; CHECK-THUMB8BASE-NEXT: @ => This Inner Loop Header: Depth=22671; CHECK-THUMB8BASE-NEXT: ldrexh r0, [r3]2672; CHECK-THUMB8BASE-NEXT: cmp r0, r12673; CHECK-THUMB8BASE-NEXT: bne .LBB12_42674; CHECK-THUMB8BASE-NEXT: @ %bb.3: @ %atomicrmw.start2675; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB12_2 Depth=22676; CHECK-THUMB8BASE-NEXT: strexh r2, r4, [r3]2677; CHECK-THUMB8BASE-NEXT: cmp r2, #02678; CHECK-THUMB8BASE-NEXT: bne .LBB12_22679; CHECK-THUMB8BASE-NEXT: .LBB12_4: @ %atomicrmw.start2680; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB12_1 Depth=12681; CHECK-THUMB8BASE-NEXT: str r0, [sp] @ 4-byte Spill2682; CHECK-THUMB8BASE-NEXT: uxth r1, r12683; CHECK-THUMB8BASE-NEXT: subs r1, r0, r12684; CHECK-THUMB8BASE-NEXT: rsbs r2, r1, #02685; CHECK-THUMB8BASE-NEXT: adcs r1, r22686; CHECK-THUMB8BASE-NEXT: cmp r1, #12687; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill2688; CHECK-THUMB8BASE-NEXT: bne .LBB12_12689; CHECK-THUMB8BASE-NEXT: b .LBB12_52690; CHECK-THUMB8BASE-NEXT: .LBB12_5: @ %atomicrmw.end2691; CHECK-THUMB8BASE-NEXT: ldr r0, [sp] @ 4-byte Reload2692; CHECK-THUMB8BASE-NEXT: add sp, #82693; CHECK-THUMB8BASE-NEXT: pop {r4, pc}2694entry:2695 %0 = atomicrmw add ptr @atomic_i16, i16 1 monotonic2696 ret i16 %02697}2698define i16 @test_sub_i16() {2699; CHECK-ARM8-LABEL: test_sub_i16:2700; CHECK-ARM8: @ %bb.0: @ %entry2701; CHECK-ARM8-NEXT: .pad #82702; CHECK-ARM8-NEXT: sub sp, sp, #82703; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i162704; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i162705; CHECK-ARM8-NEXT: ldrh r0, [r0]2706; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill2707; CHECK-ARM8-NEXT: b .LBB13_12708; CHECK-ARM8-NEXT: .LBB13_1: @ %atomicrmw.start2709; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=12710; CHECK-ARM8-NEXT: @ Child Loop BB13_2 Depth 22711; CHECK-ARM8-NEXT: ldr r1, [sp, #4] @ 4-byte Reload2712; CHECK-ARM8-NEXT: sub r12, r1, #12713; CHECK-ARM8-NEXT: movw r3, :lower16:atomic_i162714; CHECK-ARM8-NEXT: movt r3, :upper16:atomic_i162715; CHECK-ARM8-NEXT: uxth r1, r12716; CHECK-ARM8-NEXT: .LBB13_2: @ %atomicrmw.start2717; CHECK-ARM8-NEXT: @ Parent Loop BB13_1 Depth=12718; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=22719; CHECK-ARM8-NEXT: ldrexh r0, [r3]2720; CHECK-ARM8-NEXT: cmp r0, r12721; CHECK-ARM8-NEXT: bne .LBB13_42722; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start2723; CHECK-ARM8-NEXT: @ in Loop: Header=BB13_2 Depth=22724; CHECK-ARM8-NEXT: strexh r2, r12, [r3]2725; CHECK-ARM8-NEXT: cmp r2, #02726; CHECK-ARM8-NEXT: bne .LBB13_22727; CHECK-ARM8-NEXT: .LBB13_4: @ %atomicrmw.start2728; CHECK-ARM8-NEXT: @ in Loop: Header=BB13_1 Depth=12729; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill2730; CHECK-ARM8-NEXT: uxth r1, r12731; CHECK-ARM8-NEXT: sub r1, r0, r12732; CHECK-ARM8-NEXT: clz r1, r12733; CHECK-ARM8-NEXT: lsr r1, r1, #52734; CHECK-ARM8-NEXT: cmp r1, #12735; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill2736; CHECK-ARM8-NEXT: bne .LBB13_12737; CHECK-ARM8-NEXT: b .LBB13_52738; CHECK-ARM8-NEXT: .LBB13_5: @ %atomicrmw.end2739; CHECK-ARM8-NEXT: ldr r0, [sp] @ 4-byte Reload2740; CHECK-ARM8-NEXT: add sp, sp, #82741; CHECK-ARM8-NEXT: bx lr2742;2743; CHECK-ARM6-LABEL: test_sub_i16:2744; CHECK-ARM6: @ %bb.0: @ %entry2745; CHECK-ARM6-NEXT: .pad #82746; CHECK-ARM6-NEXT: sub sp, sp, #82747; CHECK-ARM6-NEXT: ldr r0, .LCPI13_02748; CHECK-ARM6-NEXT: ldrh r0, [r0]2749; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill2750; CHECK-ARM6-NEXT: b .LBB13_12751; CHECK-ARM6-NEXT: .LBB13_1: @ %atomicrmw.start2752; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=12753; CHECK-ARM6-NEXT: @ Child Loop BB13_2 Depth 22754; CHECK-ARM6-NEXT: ldr r1, [sp, #4] @ 4-byte Reload2755; CHECK-ARM6-NEXT: sub r12, r1, #12756; CHECK-ARM6-NEXT: ldr r3, .LCPI13_02757; CHECK-ARM6-NEXT: uxth r1, r12758; CHECK-ARM6-NEXT: .LBB13_2: @ %atomicrmw.start2759; CHECK-ARM6-NEXT: @ Parent Loop BB13_1 Depth=12760; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=22761; CHECK-ARM6-NEXT: ldrexh r0, [r3]2762; CHECK-ARM6-NEXT: cmp r0, r12763; CHECK-ARM6-NEXT: bne .LBB13_42764; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start2765; CHECK-ARM6-NEXT: @ in Loop: Header=BB13_2 Depth=22766; CHECK-ARM6-NEXT: strexh r2, r12, [r3]2767; CHECK-ARM6-NEXT: cmp r2, #02768; CHECK-ARM6-NEXT: bne .LBB13_22769; CHECK-ARM6-NEXT: .LBB13_4: @ %atomicrmw.start2770; CHECK-ARM6-NEXT: @ in Loop: Header=BB13_1 Depth=12771; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill2772; CHECK-ARM6-NEXT: uxth r1, r12773; CHECK-ARM6-NEXT: sub r1, r0, r12774; CHECK-ARM6-NEXT: clz r1, r12775; CHECK-ARM6-NEXT: lsr r1, r1, #52776; CHECK-ARM6-NEXT: cmp r1, #12777; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill2778; CHECK-ARM6-NEXT: bne .LBB13_12779; CHECK-ARM6-NEXT: b .LBB13_52780; CHECK-ARM6-NEXT: .LBB13_5: @ %atomicrmw.end2781; CHECK-ARM6-NEXT: ldr r0, [sp] @ 4-byte Reload2782; CHECK-ARM6-NEXT: add sp, sp, #82783; CHECK-ARM6-NEXT: bx lr2784; CHECK-ARM6-NEXT: .p2align 22785; CHECK-ARM6-NEXT: @ %bb.6:2786; CHECK-ARM6-NEXT: .LCPI13_0:2787; CHECK-ARM6-NEXT: .long atomic_i162788;2789; CHECK-THUMB7-LABEL: test_sub_i16:2790; CHECK-THUMB7: @ %bb.0: @ %entry2791; CHECK-THUMB7-NEXT: .pad #82792; CHECK-THUMB7-NEXT: sub sp, #82793; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i162794; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i162795; CHECK-THUMB7-NEXT: ldrh r0, [r0]2796; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill2797; CHECK-THUMB7-NEXT: b .LBB13_12798; CHECK-THUMB7-NEXT: .LBB13_1: @ %atomicrmw.start2799; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=12800; CHECK-THUMB7-NEXT: @ Child Loop BB13_2 Depth 22801; CHECK-THUMB7-NEXT: ldr r1, [sp, #4] @ 4-byte Reload2802; CHECK-THUMB7-NEXT: sub.w r12, r1, #12803; CHECK-THUMB7-NEXT: movw r3, :lower16:atomic_i162804; CHECK-THUMB7-NEXT: movt r3, :upper16:atomic_i162805; CHECK-THUMB7-NEXT: uxth r1, r12806; CHECK-THUMB7-NEXT: .LBB13_2: @ %atomicrmw.start2807; CHECK-THUMB7-NEXT: @ Parent Loop BB13_1 Depth=12808; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=22809; CHECK-THUMB7-NEXT: ldrexh r0, [r3]2810; CHECK-THUMB7-NEXT: cmp r0, r12811; CHECK-THUMB7-NEXT: bne .LBB13_42812; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start2813; CHECK-THUMB7-NEXT: @ in Loop: Header=BB13_2 Depth=22814; CHECK-THUMB7-NEXT: strexh r2, r12, [r3]2815; CHECK-THUMB7-NEXT: cmp r2, #02816; CHECK-THUMB7-NEXT: bne .LBB13_22817; CHECK-THUMB7-NEXT: .LBB13_4: @ %atomicrmw.start2818; CHECK-THUMB7-NEXT: @ in Loop: Header=BB13_1 Depth=12819; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill2820; CHECK-THUMB7-NEXT: uxth r1, r12821; CHECK-THUMB7-NEXT: subs r1, r0, r12822; CHECK-THUMB7-NEXT: clz r1, r12823; CHECK-THUMB7-NEXT: lsrs r1, r1, #52824; CHECK-THUMB7-NEXT: cmp r1, #12825; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill2826; CHECK-THUMB7-NEXT: bne .LBB13_12827; CHECK-THUMB7-NEXT: b .LBB13_52828; CHECK-THUMB7-NEXT: .LBB13_5: @ %atomicrmw.end2829; CHECK-THUMB7-NEXT: ldr r0, [sp] @ 4-byte Reload2830; CHECK-THUMB7-NEXT: add sp, #82831; CHECK-THUMB7-NEXT: bx lr2832;2833; CHECK-THUMB6-LABEL: test_sub_i16:2834; CHECK-THUMB6: @ %bb.0: @ %entry2835; CHECK-THUMB6-NEXT: .save {r7, lr}2836; CHECK-THUMB6-NEXT: push {r7, lr}2837; CHECK-THUMB6-NEXT: ldr r0, .LCPI13_02838; CHECK-THUMB6-NEXT: movs r1, #12839; CHECK-THUMB6-NEXT: bl __sync_fetch_and_sub_22840; CHECK-THUMB6-NEXT: pop {r7, pc}2841; CHECK-THUMB6-NEXT: .p2align 22842; CHECK-THUMB6-NEXT: @ %bb.1:2843; CHECK-THUMB6-NEXT: .LCPI13_0:2844; CHECK-THUMB6-NEXT: .long atomic_i162845;2846; CHECK-THUMB8BASE-LABEL: test_sub_i16:2847; CHECK-THUMB8BASE: @ %bb.0: @ %entry2848; CHECK-THUMB8BASE-NEXT: .save {r4, lr}2849; CHECK-THUMB8BASE-NEXT: push {r4, lr}2850; CHECK-THUMB8BASE-NEXT: .pad #82851; CHECK-THUMB8BASE-NEXT: sub sp, #82852; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i162853; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i162854; CHECK-THUMB8BASE-NEXT: ldrh r0, [r0]2855; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill2856; CHECK-THUMB8BASE-NEXT: b .LBB13_12857; CHECK-THUMB8BASE-NEXT: .LBB13_1: @ %atomicrmw.start2858; CHECK-THUMB8BASE-NEXT: @ =>This Loop Header: Depth=12859; CHECK-THUMB8BASE-NEXT: @ Child Loop BB13_2 Depth 22860; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #4] @ 4-byte Reload2861; CHECK-THUMB8BASE-NEXT: subs r4, r1, #12862; CHECK-THUMB8BASE-NEXT: movw r3, :lower16:atomic_i162863; CHECK-THUMB8BASE-NEXT: movt r3, :upper16:atomic_i162864; CHECK-THUMB8BASE-NEXT: uxth r1, r12865; CHECK-THUMB8BASE-NEXT: .LBB13_2: @ %atomicrmw.start2866; CHECK-THUMB8BASE-NEXT: @ Parent Loop BB13_1 Depth=12867; CHECK-THUMB8BASE-NEXT: @ => This Inner Loop Header: Depth=22868; CHECK-THUMB8BASE-NEXT: ldrexh r0, [r3]2869; CHECK-THUMB8BASE-NEXT: cmp r0, r12870; CHECK-THUMB8BASE-NEXT: bne .LBB13_42871; CHECK-THUMB8BASE-NEXT: @ %bb.3: @ %atomicrmw.start2872; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB13_2 Depth=22873; CHECK-THUMB8BASE-NEXT: strexh r2, r4, [r3]2874; CHECK-THUMB8BASE-NEXT: cmp r2, #02875; CHECK-THUMB8BASE-NEXT: bne .LBB13_22876; CHECK-THUMB8BASE-NEXT: .LBB13_4: @ %atomicrmw.start2877; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB13_1 Depth=12878; CHECK-THUMB8BASE-NEXT: str r0, [sp] @ 4-byte Spill2879; CHECK-THUMB8BASE-NEXT: uxth r1, r12880; CHECK-THUMB8BASE-NEXT: subs r1, r0, r12881; CHECK-THUMB8BASE-NEXT: rsbs r2, r1, #02882; CHECK-THUMB8BASE-NEXT: adcs r1, r22883; CHECK-THUMB8BASE-NEXT: cmp r1, #12884; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill2885; CHECK-THUMB8BASE-NEXT: bne .LBB13_12886; CHECK-THUMB8BASE-NEXT: b .LBB13_52887; CHECK-THUMB8BASE-NEXT: .LBB13_5: @ %atomicrmw.end2888; CHECK-THUMB8BASE-NEXT: ldr r0, [sp] @ 4-byte Reload2889; CHECK-THUMB8BASE-NEXT: add sp, #82890; CHECK-THUMB8BASE-NEXT: pop {r4, pc}2891entry:2892 %0 = atomicrmw sub ptr @atomic_i16, i16 1 monotonic2893 ret i16 %02894}2895define i16 @test_and_i16() {2896; CHECK-ARM8-LABEL: test_and_i16:2897; CHECK-ARM8: @ %bb.0: @ %entry2898; CHECK-ARM8-NEXT: .pad #82899; CHECK-ARM8-NEXT: sub sp, sp, #82900; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i162901; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i162902; CHECK-ARM8-NEXT: ldrh r0, [r0]2903; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill2904; CHECK-ARM8-NEXT: b .LBB14_12905; CHECK-ARM8-NEXT: .LBB14_1: @ %atomicrmw.start2906; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=12907; CHECK-ARM8-NEXT: @ Child Loop BB14_2 Depth 22908; CHECK-ARM8-NEXT: ldr r1, [sp, #4] @ 4-byte Reload2909; CHECK-ARM8-NEXT: and r12, r1, #12910; CHECK-ARM8-NEXT: movw r3, :lower16:atomic_i162911; CHECK-ARM8-NEXT: movt r3, :upper16:atomic_i162912; CHECK-ARM8-NEXT: uxth r1, r12913; CHECK-ARM8-NEXT: .LBB14_2: @ %atomicrmw.start2914; CHECK-ARM8-NEXT: @ Parent Loop BB14_1 Depth=12915; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=22916; CHECK-ARM8-NEXT: ldrexh r0, [r3]2917; CHECK-ARM8-NEXT: cmp r0, r12918; CHECK-ARM8-NEXT: bne .LBB14_42919; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start2920; CHECK-ARM8-NEXT: @ in Loop: Header=BB14_2 Depth=22921; CHECK-ARM8-NEXT: strexh r2, r12, [r3]2922; CHECK-ARM8-NEXT: cmp r2, #02923; CHECK-ARM8-NEXT: bne .LBB14_22924; CHECK-ARM8-NEXT: .LBB14_4: @ %atomicrmw.start2925; CHECK-ARM8-NEXT: @ in Loop: Header=BB14_1 Depth=12926; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill2927; CHECK-ARM8-NEXT: uxth r1, r12928; CHECK-ARM8-NEXT: sub r1, r0, r12929; CHECK-ARM8-NEXT: clz r1, r12930; CHECK-ARM8-NEXT: lsr r1, r1, #52931; CHECK-ARM8-NEXT: cmp r1, #12932; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill2933; CHECK-ARM8-NEXT: bne .LBB14_12934; CHECK-ARM8-NEXT: b .LBB14_52935; CHECK-ARM8-NEXT: .LBB14_5: @ %atomicrmw.end2936; CHECK-ARM8-NEXT: ldr r0, [sp] @ 4-byte Reload2937; CHECK-ARM8-NEXT: add sp, sp, #82938; CHECK-ARM8-NEXT: bx lr2939;2940; CHECK-ARM6-LABEL: test_and_i16:2941; CHECK-ARM6: @ %bb.0: @ %entry2942; CHECK-ARM6-NEXT: .pad #82943; CHECK-ARM6-NEXT: sub sp, sp, #82944; CHECK-ARM6-NEXT: ldr r0, .LCPI14_02945; CHECK-ARM6-NEXT: ldrh r0, [r0]2946; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill2947; CHECK-ARM6-NEXT: b .LBB14_12948; CHECK-ARM6-NEXT: .LBB14_1: @ %atomicrmw.start2949; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=12950; CHECK-ARM6-NEXT: @ Child Loop BB14_2 Depth 22951; CHECK-ARM6-NEXT: ldr r1, [sp, #4] @ 4-byte Reload2952; CHECK-ARM6-NEXT: and r12, r1, #12953; CHECK-ARM6-NEXT: ldr r3, .LCPI14_02954; CHECK-ARM6-NEXT: uxth r1, r12955; CHECK-ARM6-NEXT: .LBB14_2: @ %atomicrmw.start2956; CHECK-ARM6-NEXT: @ Parent Loop BB14_1 Depth=12957; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=22958; CHECK-ARM6-NEXT: ldrexh r0, [r3]2959; CHECK-ARM6-NEXT: cmp r0, r12960; CHECK-ARM6-NEXT: bne .LBB14_42961; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start2962; CHECK-ARM6-NEXT: @ in Loop: Header=BB14_2 Depth=22963; CHECK-ARM6-NEXT: strexh r2, r12, [r3]2964; CHECK-ARM6-NEXT: cmp r2, #02965; CHECK-ARM6-NEXT: bne .LBB14_22966; CHECK-ARM6-NEXT: .LBB14_4: @ %atomicrmw.start2967; CHECK-ARM6-NEXT: @ in Loop: Header=BB14_1 Depth=12968; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill2969; CHECK-ARM6-NEXT: uxth r1, r12970; CHECK-ARM6-NEXT: sub r1, r0, r12971; CHECK-ARM6-NEXT: clz r1, r12972; CHECK-ARM6-NEXT: lsr r1, r1, #52973; CHECK-ARM6-NEXT: cmp r1, #12974; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill2975; CHECK-ARM6-NEXT: bne .LBB14_12976; CHECK-ARM6-NEXT: b .LBB14_52977; CHECK-ARM6-NEXT: .LBB14_5: @ %atomicrmw.end2978; CHECK-ARM6-NEXT: ldr r0, [sp] @ 4-byte Reload2979; CHECK-ARM6-NEXT: add sp, sp, #82980; CHECK-ARM6-NEXT: bx lr2981; CHECK-ARM6-NEXT: .p2align 22982; CHECK-ARM6-NEXT: @ %bb.6:2983; CHECK-ARM6-NEXT: .LCPI14_0:2984; CHECK-ARM6-NEXT: .long atomic_i162985;2986; CHECK-THUMB7-LABEL: test_and_i16:2987; CHECK-THUMB7: @ %bb.0: @ %entry2988; CHECK-THUMB7-NEXT: .pad #82989; CHECK-THUMB7-NEXT: sub sp, #82990; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i162991; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i162992; CHECK-THUMB7-NEXT: ldrh r0, [r0]2993; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill2994; CHECK-THUMB7-NEXT: b .LBB14_12995; CHECK-THUMB7-NEXT: .LBB14_1: @ %atomicrmw.start2996; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=12997; CHECK-THUMB7-NEXT: @ Child Loop BB14_2 Depth 22998; CHECK-THUMB7-NEXT: ldr r1, [sp, #4] @ 4-byte Reload2999; CHECK-THUMB7-NEXT: and r12, r1, #13000; CHECK-THUMB7-NEXT: movw r3, :lower16:atomic_i163001; CHECK-THUMB7-NEXT: movt r3, :upper16:atomic_i163002; CHECK-THUMB7-NEXT: uxth r1, r13003; CHECK-THUMB7-NEXT: .LBB14_2: @ %atomicrmw.start3004; CHECK-THUMB7-NEXT: @ Parent Loop BB14_1 Depth=13005; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=23006; CHECK-THUMB7-NEXT: ldrexh r0, [r3]3007; CHECK-THUMB7-NEXT: cmp r0, r13008; CHECK-THUMB7-NEXT: bne .LBB14_43009; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start3010; CHECK-THUMB7-NEXT: @ in Loop: Header=BB14_2 Depth=23011; CHECK-THUMB7-NEXT: strexh r2, r12, [r3]3012; CHECK-THUMB7-NEXT: cmp r2, #03013; CHECK-THUMB7-NEXT: bne .LBB14_23014; CHECK-THUMB7-NEXT: .LBB14_4: @ %atomicrmw.start3015; CHECK-THUMB7-NEXT: @ in Loop: Header=BB14_1 Depth=13016; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill3017; CHECK-THUMB7-NEXT: uxth r1, r13018; CHECK-THUMB7-NEXT: subs r1, r0, r13019; CHECK-THUMB7-NEXT: clz r1, r13020; CHECK-THUMB7-NEXT: lsrs r1, r1, #53021; CHECK-THUMB7-NEXT: cmp r1, #13022; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill3023; CHECK-THUMB7-NEXT: bne .LBB14_13024; CHECK-THUMB7-NEXT: b .LBB14_53025; CHECK-THUMB7-NEXT: .LBB14_5: @ %atomicrmw.end3026; CHECK-THUMB7-NEXT: ldr r0, [sp] @ 4-byte Reload3027; CHECK-THUMB7-NEXT: add sp, #83028; CHECK-THUMB7-NEXT: bx lr3029;3030; CHECK-THUMB6-LABEL: test_and_i16:3031; CHECK-THUMB6: @ %bb.0: @ %entry3032; CHECK-THUMB6-NEXT: .save {r7, lr}3033; CHECK-THUMB6-NEXT: push {r7, lr}3034; CHECK-THUMB6-NEXT: ldr r0, .LCPI14_03035; CHECK-THUMB6-NEXT: movs r1, #13036; CHECK-THUMB6-NEXT: bl __sync_fetch_and_and_23037; CHECK-THUMB6-NEXT: pop {r7, pc}3038; CHECK-THUMB6-NEXT: .p2align 23039; CHECK-THUMB6-NEXT: @ %bb.1:3040; CHECK-THUMB6-NEXT: .LCPI14_0:3041; CHECK-THUMB6-NEXT: .long atomic_i163042;3043; CHECK-THUMB8BASE-LABEL: test_and_i16:3044; CHECK-THUMB8BASE: @ %bb.0: @ %entry3045; CHECK-THUMB8BASE-NEXT: .save {r4, lr}3046; CHECK-THUMB8BASE-NEXT: push {r4, lr}3047; CHECK-THUMB8BASE-NEXT: .pad #83048; CHECK-THUMB8BASE-NEXT: sub sp, #83049; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i163050; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i163051; CHECK-THUMB8BASE-NEXT: ldrh r0, [r0]3052; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill3053; CHECK-THUMB8BASE-NEXT: b .LBB14_13054; CHECK-THUMB8BASE-NEXT: .LBB14_1: @ %atomicrmw.start3055; CHECK-THUMB8BASE-NEXT: @ =>This Loop Header: Depth=13056; CHECK-THUMB8BASE-NEXT: @ Child Loop BB14_2 Depth 23057; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #4] @ 4-byte Reload3058; CHECK-THUMB8BASE-NEXT: movs r0, #13059; CHECK-THUMB8BASE-NEXT: mov r4, r13060; CHECK-THUMB8BASE-NEXT: ands r4, r03061; CHECK-THUMB8BASE-NEXT: movw r3, :lower16:atomic_i163062; CHECK-THUMB8BASE-NEXT: movt r3, :upper16:atomic_i163063; CHECK-THUMB8BASE-NEXT: uxth r1, r13064; CHECK-THUMB8BASE-NEXT: .LBB14_2: @ %atomicrmw.start3065; CHECK-THUMB8BASE-NEXT: @ Parent Loop BB14_1 Depth=13066; CHECK-THUMB8BASE-NEXT: @ => This Inner Loop Header: Depth=23067; CHECK-THUMB8BASE-NEXT: ldrexh r0, [r3]3068; CHECK-THUMB8BASE-NEXT: cmp r0, r13069; CHECK-THUMB8BASE-NEXT: bne .LBB14_43070; CHECK-THUMB8BASE-NEXT: @ %bb.3: @ %atomicrmw.start3071; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB14_2 Depth=23072; CHECK-THUMB8BASE-NEXT: strexh r2, r4, [r3]3073; CHECK-THUMB8BASE-NEXT: cmp r2, #03074; CHECK-THUMB8BASE-NEXT: bne .LBB14_23075; CHECK-THUMB8BASE-NEXT: .LBB14_4: @ %atomicrmw.start3076; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB14_1 Depth=13077; CHECK-THUMB8BASE-NEXT: str r0, [sp] @ 4-byte Spill3078; CHECK-THUMB8BASE-NEXT: uxth r1, r13079; CHECK-THUMB8BASE-NEXT: subs r1, r0, r13080; CHECK-THUMB8BASE-NEXT: rsbs r2, r1, #03081; CHECK-THUMB8BASE-NEXT: adcs r1, r23082; CHECK-THUMB8BASE-NEXT: cmp r1, #13083; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill3084; CHECK-THUMB8BASE-NEXT: bne .LBB14_13085; CHECK-THUMB8BASE-NEXT: b .LBB14_53086; CHECK-THUMB8BASE-NEXT: .LBB14_5: @ %atomicrmw.end3087; CHECK-THUMB8BASE-NEXT: ldr r0, [sp] @ 4-byte Reload3088; CHECK-THUMB8BASE-NEXT: add sp, #83089; CHECK-THUMB8BASE-NEXT: pop {r4, pc}3090entry:3091 %0 = atomicrmw and ptr @atomic_i16, i16 1 monotonic3092 ret i16 %03093}3094define i16 @test_nand_i16() {3095; CHECK-ARM8-LABEL: test_nand_i16:3096; CHECK-ARM8: @ %bb.0: @ %entry3097; CHECK-ARM8-NEXT: .pad #83098; CHECK-ARM8-NEXT: sub sp, sp, #83099; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i163100; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i163101; CHECK-ARM8-NEXT: ldrh r0, [r0]3102; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill3103; CHECK-ARM8-NEXT: b .LBB15_13104; CHECK-ARM8-NEXT: .LBB15_1: @ %atomicrmw.start3105; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=13106; CHECK-ARM8-NEXT: @ Child Loop BB15_2 Depth 23107; CHECK-ARM8-NEXT: ldr r1, [sp, #4] @ 4-byte Reload3108; CHECK-ARM8-NEXT: mvn r0, r13109; CHECK-ARM8-NEXT: mvn r2, #13110; CHECK-ARM8-NEXT: orr r12, r0, r23111; CHECK-ARM8-NEXT: movw r3, :lower16:atomic_i163112; CHECK-ARM8-NEXT: movt r3, :upper16:atomic_i163113; CHECK-ARM8-NEXT: uxth r1, r13114; CHECK-ARM8-NEXT: .LBB15_2: @ %atomicrmw.start3115; CHECK-ARM8-NEXT: @ Parent Loop BB15_1 Depth=13116; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=23117; CHECK-ARM8-NEXT: ldrexh r0, [r3]3118; CHECK-ARM8-NEXT: cmp r0, r13119; CHECK-ARM8-NEXT: bne .LBB15_43120; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start3121; CHECK-ARM8-NEXT: @ in Loop: Header=BB15_2 Depth=23122; CHECK-ARM8-NEXT: strexh r2, r12, [r3]3123; CHECK-ARM8-NEXT: cmp r2, #03124; CHECK-ARM8-NEXT: bne .LBB15_23125; CHECK-ARM8-NEXT: .LBB15_4: @ %atomicrmw.start3126; CHECK-ARM8-NEXT: @ in Loop: Header=BB15_1 Depth=13127; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill3128; CHECK-ARM8-NEXT: uxth r1, r13129; CHECK-ARM8-NEXT: sub r1, r0, r13130; CHECK-ARM8-NEXT: clz r1, r13131; CHECK-ARM8-NEXT: lsr r1, r1, #53132; CHECK-ARM8-NEXT: cmp r1, #13133; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill3134; CHECK-ARM8-NEXT: bne .LBB15_13135; CHECK-ARM8-NEXT: b .LBB15_53136; CHECK-ARM8-NEXT: .LBB15_5: @ %atomicrmw.end3137; CHECK-ARM8-NEXT: ldr r0, [sp] @ 4-byte Reload3138; CHECK-ARM8-NEXT: add sp, sp, #83139; CHECK-ARM8-NEXT: bx lr3140;3141; CHECK-ARM6-LABEL: test_nand_i16:3142; CHECK-ARM6: @ %bb.0: @ %entry3143; CHECK-ARM6-NEXT: .pad #83144; CHECK-ARM6-NEXT: sub sp, sp, #83145; CHECK-ARM6-NEXT: ldr r0, .LCPI15_03146; CHECK-ARM6-NEXT: ldrh r0, [r0]3147; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill3148; CHECK-ARM6-NEXT: b .LBB15_13149; CHECK-ARM6-NEXT: .LBB15_1: @ %atomicrmw.start3150; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=13151; CHECK-ARM6-NEXT: @ Child Loop BB15_2 Depth 23152; CHECK-ARM6-NEXT: ldr r1, [sp, #4] @ 4-byte Reload3153; CHECK-ARM6-NEXT: mvn r0, r13154; CHECK-ARM6-NEXT: mvn r2, #13155; CHECK-ARM6-NEXT: orr r12, r0, r23156; CHECK-ARM6-NEXT: ldr r3, .LCPI15_03157; CHECK-ARM6-NEXT: uxth r1, r13158; CHECK-ARM6-NEXT: .LBB15_2: @ %atomicrmw.start3159; CHECK-ARM6-NEXT: @ Parent Loop BB15_1 Depth=13160; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=23161; CHECK-ARM6-NEXT: ldrexh r0, [r3]3162; CHECK-ARM6-NEXT: cmp r0, r13163; CHECK-ARM6-NEXT: bne .LBB15_43164; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start3165; CHECK-ARM6-NEXT: @ in Loop: Header=BB15_2 Depth=23166; CHECK-ARM6-NEXT: strexh r2, r12, [r3]3167; CHECK-ARM6-NEXT: cmp r2, #03168; CHECK-ARM6-NEXT: bne .LBB15_23169; CHECK-ARM6-NEXT: .LBB15_4: @ %atomicrmw.start3170; CHECK-ARM6-NEXT: @ in Loop: Header=BB15_1 Depth=13171; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill3172; CHECK-ARM6-NEXT: uxth r1, r13173; CHECK-ARM6-NEXT: sub r1, r0, r13174; CHECK-ARM6-NEXT: clz r1, r13175; CHECK-ARM6-NEXT: lsr r1, r1, #53176; CHECK-ARM6-NEXT: cmp r1, #13177; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill3178; CHECK-ARM6-NEXT: bne .LBB15_13179; CHECK-ARM6-NEXT: b .LBB15_53180; CHECK-ARM6-NEXT: .LBB15_5: @ %atomicrmw.end3181; CHECK-ARM6-NEXT: ldr r0, [sp] @ 4-byte Reload3182; CHECK-ARM6-NEXT: add sp, sp, #83183; CHECK-ARM6-NEXT: bx lr3184; CHECK-ARM6-NEXT: .p2align 23185; CHECK-ARM6-NEXT: @ %bb.6:3186; CHECK-ARM6-NEXT: .LCPI15_0:3187; CHECK-ARM6-NEXT: .long atomic_i163188;3189; CHECK-THUMB7-LABEL: test_nand_i16:3190; CHECK-THUMB7: @ %bb.0: @ %entry3191; CHECK-THUMB7-NEXT: .pad #83192; CHECK-THUMB7-NEXT: sub sp, #83193; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i163194; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i163195; CHECK-THUMB7-NEXT: ldrh r0, [r0]3196; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill3197; CHECK-THUMB7-NEXT: b .LBB15_13198; CHECK-THUMB7-NEXT: .LBB15_1: @ %atomicrmw.start3199; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=13200; CHECK-THUMB7-NEXT: @ Child Loop BB15_2 Depth 23201; CHECK-THUMB7-NEXT: ldr r1, [sp, #4] @ 4-byte Reload3202; CHECK-THUMB7-NEXT: mvn r0, #13203; CHECK-THUMB7-NEXT: orn r12, r0, r13204; CHECK-THUMB7-NEXT: movw r3, :lower16:atomic_i163205; CHECK-THUMB7-NEXT: movt r3, :upper16:atomic_i163206; CHECK-THUMB7-NEXT: uxth r1, r13207; CHECK-THUMB7-NEXT: .LBB15_2: @ %atomicrmw.start3208; CHECK-THUMB7-NEXT: @ Parent Loop BB15_1 Depth=13209; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=23210; CHECK-THUMB7-NEXT: ldrexh r0, [r3]3211; CHECK-THUMB7-NEXT: cmp r0, r13212; CHECK-THUMB7-NEXT: bne .LBB15_43213; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start3214; CHECK-THUMB7-NEXT: @ in Loop: Header=BB15_2 Depth=23215; CHECK-THUMB7-NEXT: strexh r2, r12, [r3]3216; CHECK-THUMB7-NEXT: cmp r2, #03217; CHECK-THUMB7-NEXT: bne .LBB15_23218; CHECK-THUMB7-NEXT: .LBB15_4: @ %atomicrmw.start3219; CHECK-THUMB7-NEXT: @ in Loop: Header=BB15_1 Depth=13220; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill3221; CHECK-THUMB7-NEXT: uxth r1, r13222; CHECK-THUMB7-NEXT: subs r1, r0, r13223; CHECK-THUMB7-NEXT: clz r1, r13224; CHECK-THUMB7-NEXT: lsrs r1, r1, #53225; CHECK-THUMB7-NEXT: cmp r1, #13226; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill3227; CHECK-THUMB7-NEXT: bne .LBB15_13228; CHECK-THUMB7-NEXT: b .LBB15_53229; CHECK-THUMB7-NEXT: .LBB15_5: @ %atomicrmw.end3230; CHECK-THUMB7-NEXT: ldr r0, [sp] @ 4-byte Reload3231; CHECK-THUMB7-NEXT: add sp, #83232; CHECK-THUMB7-NEXT: bx lr3233;3234; CHECK-THUMB6-LABEL: test_nand_i16:3235; CHECK-THUMB6: @ %bb.0: @ %entry3236; CHECK-THUMB6-NEXT: .save {r7, lr}3237; CHECK-THUMB6-NEXT: push {r7, lr}3238; CHECK-THUMB6-NEXT: ldr r0, .LCPI15_03239; CHECK-THUMB6-NEXT: movs r1, #13240; CHECK-THUMB6-NEXT: bl __sync_fetch_and_nand_23241; CHECK-THUMB6-NEXT: pop {r7, pc}3242; CHECK-THUMB6-NEXT: .p2align 23243; CHECK-THUMB6-NEXT: @ %bb.1:3244; CHECK-THUMB6-NEXT: .LCPI15_0:3245; CHECK-THUMB6-NEXT: .long atomic_i163246;3247; CHECK-THUMB8BASE-LABEL: test_nand_i16:3248; CHECK-THUMB8BASE: @ %bb.0: @ %entry3249; CHECK-THUMB8BASE-NEXT: .save {r4, lr}3250; CHECK-THUMB8BASE-NEXT: push {r4, lr}3251; CHECK-THUMB8BASE-NEXT: .pad #83252; CHECK-THUMB8BASE-NEXT: sub sp, #83253; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i163254; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i163255; CHECK-THUMB8BASE-NEXT: ldrh r0, [r0]3256; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill3257; CHECK-THUMB8BASE-NEXT: b .LBB15_13258; CHECK-THUMB8BASE-NEXT: .LBB15_1: @ %atomicrmw.start3259; CHECK-THUMB8BASE-NEXT: @ =>This Loop Header: Depth=13260; CHECK-THUMB8BASE-NEXT: @ Child Loop BB15_2 Depth 23261; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #4] @ 4-byte Reload3262; CHECK-THUMB8BASE-NEXT: mvns r4, r13263; CHECK-THUMB8BASE-NEXT: movs r0, #13264; CHECK-THUMB8BASE-NEXT: mvns r0, r03265; CHECK-THUMB8BASE-NEXT: orrs r4, r03266; CHECK-THUMB8BASE-NEXT: movw r3, :lower16:atomic_i163267; CHECK-THUMB8BASE-NEXT: movt r3, :upper16:atomic_i163268; CHECK-THUMB8BASE-NEXT: uxth r1, r13269; CHECK-THUMB8BASE-NEXT: .LBB15_2: @ %atomicrmw.start3270; CHECK-THUMB8BASE-NEXT: @ Parent Loop BB15_1 Depth=13271; CHECK-THUMB8BASE-NEXT: @ => This Inner Loop Header: Depth=23272; CHECK-THUMB8BASE-NEXT: ldrexh r0, [r3]3273; CHECK-THUMB8BASE-NEXT: cmp r0, r13274; CHECK-THUMB8BASE-NEXT: bne .LBB15_43275; CHECK-THUMB8BASE-NEXT: @ %bb.3: @ %atomicrmw.start3276; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB15_2 Depth=23277; CHECK-THUMB8BASE-NEXT: strexh r2, r4, [r3]3278; CHECK-THUMB8BASE-NEXT: cmp r2, #03279; CHECK-THUMB8BASE-NEXT: bne .LBB15_23280; CHECK-THUMB8BASE-NEXT: .LBB15_4: @ %atomicrmw.start3281; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB15_1 Depth=13282; CHECK-THUMB8BASE-NEXT: str r0, [sp] @ 4-byte Spill3283; CHECK-THUMB8BASE-NEXT: uxth r1, r13284; CHECK-THUMB8BASE-NEXT: subs r1, r0, r13285; CHECK-THUMB8BASE-NEXT: rsbs r2, r1, #03286; CHECK-THUMB8BASE-NEXT: adcs r1, r23287; CHECK-THUMB8BASE-NEXT: cmp r1, #13288; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill3289; CHECK-THUMB8BASE-NEXT: bne .LBB15_13290; CHECK-THUMB8BASE-NEXT: b .LBB15_53291; CHECK-THUMB8BASE-NEXT: .LBB15_5: @ %atomicrmw.end3292; CHECK-THUMB8BASE-NEXT: ldr r0, [sp] @ 4-byte Reload3293; CHECK-THUMB8BASE-NEXT: add sp, #83294; CHECK-THUMB8BASE-NEXT: pop {r4, pc}3295entry:3296 %0 = atomicrmw nand ptr @atomic_i16, i16 1 monotonic3297 ret i16 %03298}3299define i16 @test_or_i16() {3300; CHECK-ARM8-LABEL: test_or_i16:3301; CHECK-ARM8: @ %bb.0: @ %entry3302; CHECK-ARM8-NEXT: .pad #83303; CHECK-ARM8-NEXT: sub sp, sp, #83304; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i163305; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i163306; CHECK-ARM8-NEXT: ldrh r0, [r0]3307; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill3308; CHECK-ARM8-NEXT: b .LBB16_13309; CHECK-ARM8-NEXT: .LBB16_1: @ %atomicrmw.start3310; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=13311; CHECK-ARM8-NEXT: @ Child Loop BB16_2 Depth 23312; CHECK-ARM8-NEXT: ldr r1, [sp, #4] @ 4-byte Reload3313; CHECK-ARM8-NEXT: orr r12, r1, #13314; CHECK-ARM8-NEXT: movw r3, :lower16:atomic_i163315; CHECK-ARM8-NEXT: movt r3, :upper16:atomic_i163316; CHECK-ARM8-NEXT: uxth r1, r13317; CHECK-ARM8-NEXT: .LBB16_2: @ %atomicrmw.start3318; CHECK-ARM8-NEXT: @ Parent Loop BB16_1 Depth=13319; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=23320; CHECK-ARM8-NEXT: ldrexh r0, [r3]3321; CHECK-ARM8-NEXT: cmp r0, r13322; CHECK-ARM8-NEXT: bne .LBB16_43323; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start3324; CHECK-ARM8-NEXT: @ in Loop: Header=BB16_2 Depth=23325; CHECK-ARM8-NEXT: strexh r2, r12, [r3]3326; CHECK-ARM8-NEXT: cmp r2, #03327; CHECK-ARM8-NEXT: bne .LBB16_23328; CHECK-ARM8-NEXT: .LBB16_4: @ %atomicrmw.start3329; CHECK-ARM8-NEXT: @ in Loop: Header=BB16_1 Depth=13330; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill3331; CHECK-ARM8-NEXT: uxth r1, r13332; CHECK-ARM8-NEXT: sub r1, r0, r13333; CHECK-ARM8-NEXT: clz r1, r13334; CHECK-ARM8-NEXT: lsr r1, r1, #53335; CHECK-ARM8-NEXT: cmp r1, #13336; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill3337; CHECK-ARM8-NEXT: bne .LBB16_13338; CHECK-ARM8-NEXT: b .LBB16_53339; CHECK-ARM8-NEXT: .LBB16_5: @ %atomicrmw.end3340; CHECK-ARM8-NEXT: ldr r0, [sp] @ 4-byte Reload3341; CHECK-ARM8-NEXT: add sp, sp, #83342; CHECK-ARM8-NEXT: bx lr3343;3344; CHECK-ARM6-LABEL: test_or_i16:3345; CHECK-ARM6: @ %bb.0: @ %entry3346; CHECK-ARM6-NEXT: .pad #83347; CHECK-ARM6-NEXT: sub sp, sp, #83348; CHECK-ARM6-NEXT: ldr r0, .LCPI16_03349; CHECK-ARM6-NEXT: ldrh r0, [r0]3350; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill3351; CHECK-ARM6-NEXT: b .LBB16_13352; CHECK-ARM6-NEXT: .LBB16_1: @ %atomicrmw.start3353; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=13354; CHECK-ARM6-NEXT: @ Child Loop BB16_2 Depth 23355; CHECK-ARM6-NEXT: ldr r1, [sp, #4] @ 4-byte Reload3356; CHECK-ARM6-NEXT: orr r12, r1, #13357; CHECK-ARM6-NEXT: ldr r3, .LCPI16_03358; CHECK-ARM6-NEXT: uxth r1, r13359; CHECK-ARM6-NEXT: .LBB16_2: @ %atomicrmw.start3360; CHECK-ARM6-NEXT: @ Parent Loop BB16_1 Depth=13361; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=23362; CHECK-ARM6-NEXT: ldrexh r0, [r3]3363; CHECK-ARM6-NEXT: cmp r0, r13364; CHECK-ARM6-NEXT: bne .LBB16_43365; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start3366; CHECK-ARM6-NEXT: @ in Loop: Header=BB16_2 Depth=23367; CHECK-ARM6-NEXT: strexh r2, r12, [r3]3368; CHECK-ARM6-NEXT: cmp r2, #03369; CHECK-ARM6-NEXT: bne .LBB16_23370; CHECK-ARM6-NEXT: .LBB16_4: @ %atomicrmw.start3371; CHECK-ARM6-NEXT: @ in Loop: Header=BB16_1 Depth=13372; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill3373; CHECK-ARM6-NEXT: uxth r1, r13374; CHECK-ARM6-NEXT: sub r1, r0, r13375; CHECK-ARM6-NEXT: clz r1, r13376; CHECK-ARM6-NEXT: lsr r1, r1, #53377; CHECK-ARM6-NEXT: cmp r1, #13378; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill3379; CHECK-ARM6-NEXT: bne .LBB16_13380; CHECK-ARM6-NEXT: b .LBB16_53381; CHECK-ARM6-NEXT: .LBB16_5: @ %atomicrmw.end3382; CHECK-ARM6-NEXT: ldr r0, [sp] @ 4-byte Reload3383; CHECK-ARM6-NEXT: add sp, sp, #83384; CHECK-ARM6-NEXT: bx lr3385; CHECK-ARM6-NEXT: .p2align 23386; CHECK-ARM6-NEXT: @ %bb.6:3387; CHECK-ARM6-NEXT: .LCPI16_0:3388; CHECK-ARM6-NEXT: .long atomic_i163389;3390; CHECK-THUMB7-LABEL: test_or_i16:3391; CHECK-THUMB7: @ %bb.0: @ %entry3392; CHECK-THUMB7-NEXT: .pad #83393; CHECK-THUMB7-NEXT: sub sp, #83394; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i163395; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i163396; CHECK-THUMB7-NEXT: ldrh r0, [r0]3397; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill3398; CHECK-THUMB7-NEXT: b .LBB16_13399; CHECK-THUMB7-NEXT: .LBB16_1: @ %atomicrmw.start3400; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=13401; CHECK-THUMB7-NEXT: @ Child Loop BB16_2 Depth 23402; CHECK-THUMB7-NEXT: ldr r1, [sp, #4] @ 4-byte Reload3403; CHECK-THUMB7-NEXT: orr r12, r1, #13404; CHECK-THUMB7-NEXT: movw r3, :lower16:atomic_i163405; CHECK-THUMB7-NEXT: movt r3, :upper16:atomic_i163406; CHECK-THUMB7-NEXT: uxth r1, r13407; CHECK-THUMB7-NEXT: .LBB16_2: @ %atomicrmw.start3408; CHECK-THUMB7-NEXT: @ Parent Loop BB16_1 Depth=13409; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=23410; CHECK-THUMB7-NEXT: ldrexh r0, [r3]3411; CHECK-THUMB7-NEXT: cmp r0, r13412; CHECK-THUMB7-NEXT: bne .LBB16_43413; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start3414; CHECK-THUMB7-NEXT: @ in Loop: Header=BB16_2 Depth=23415; CHECK-THUMB7-NEXT: strexh r2, r12, [r3]3416; CHECK-THUMB7-NEXT: cmp r2, #03417; CHECK-THUMB7-NEXT: bne .LBB16_23418; CHECK-THUMB7-NEXT: .LBB16_4: @ %atomicrmw.start3419; CHECK-THUMB7-NEXT: @ in Loop: Header=BB16_1 Depth=13420; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill3421; CHECK-THUMB7-NEXT: uxth r1, r13422; CHECK-THUMB7-NEXT: subs r1, r0, r13423; CHECK-THUMB7-NEXT: clz r1, r13424; CHECK-THUMB7-NEXT: lsrs r1, r1, #53425; CHECK-THUMB7-NEXT: cmp r1, #13426; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill3427; CHECK-THUMB7-NEXT: bne .LBB16_13428; CHECK-THUMB7-NEXT: b .LBB16_53429; CHECK-THUMB7-NEXT: .LBB16_5: @ %atomicrmw.end3430; CHECK-THUMB7-NEXT: ldr r0, [sp] @ 4-byte Reload3431; CHECK-THUMB7-NEXT: add sp, #83432; CHECK-THUMB7-NEXT: bx lr3433;3434; CHECK-THUMB6-LABEL: test_or_i16:3435; CHECK-THUMB6: @ %bb.0: @ %entry3436; CHECK-THUMB6-NEXT: .save {r7, lr}3437; CHECK-THUMB6-NEXT: push {r7, lr}3438; CHECK-THUMB6-NEXT: ldr r0, .LCPI16_03439; CHECK-THUMB6-NEXT: movs r1, #13440; CHECK-THUMB6-NEXT: bl __sync_fetch_and_or_23441; CHECK-THUMB6-NEXT: pop {r7, pc}3442; CHECK-THUMB6-NEXT: .p2align 23443; CHECK-THUMB6-NEXT: @ %bb.1:3444; CHECK-THUMB6-NEXT: .LCPI16_0:3445; CHECK-THUMB6-NEXT: .long atomic_i163446;3447; CHECK-THUMB8BASE-LABEL: test_or_i16:3448; CHECK-THUMB8BASE: @ %bb.0: @ %entry3449; CHECK-THUMB8BASE-NEXT: .save {r4, lr}3450; CHECK-THUMB8BASE-NEXT: push {r4, lr}3451; CHECK-THUMB8BASE-NEXT: .pad #83452; CHECK-THUMB8BASE-NEXT: sub sp, #83453; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i163454; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i163455; CHECK-THUMB8BASE-NEXT: ldrh r0, [r0]3456; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill3457; CHECK-THUMB8BASE-NEXT: b .LBB16_13458; CHECK-THUMB8BASE-NEXT: .LBB16_1: @ %atomicrmw.start3459; CHECK-THUMB8BASE-NEXT: @ =>This Loop Header: Depth=13460; CHECK-THUMB8BASE-NEXT: @ Child Loop BB16_2 Depth 23461; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #4] @ 4-byte Reload3462; CHECK-THUMB8BASE-NEXT: movs r0, #13463; CHECK-THUMB8BASE-NEXT: mov r4, r13464; CHECK-THUMB8BASE-NEXT: orrs r4, r03465; CHECK-THUMB8BASE-NEXT: movw r3, :lower16:atomic_i163466; CHECK-THUMB8BASE-NEXT: movt r3, :upper16:atomic_i163467; CHECK-THUMB8BASE-NEXT: uxth r1, r13468; CHECK-THUMB8BASE-NEXT: .LBB16_2: @ %atomicrmw.start3469; CHECK-THUMB8BASE-NEXT: @ Parent Loop BB16_1 Depth=13470; CHECK-THUMB8BASE-NEXT: @ => This Inner Loop Header: Depth=23471; CHECK-THUMB8BASE-NEXT: ldrexh r0, [r3]3472; CHECK-THUMB8BASE-NEXT: cmp r0, r13473; CHECK-THUMB8BASE-NEXT: bne .LBB16_43474; CHECK-THUMB8BASE-NEXT: @ %bb.3: @ %atomicrmw.start3475; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB16_2 Depth=23476; CHECK-THUMB8BASE-NEXT: strexh r2, r4, [r3]3477; CHECK-THUMB8BASE-NEXT: cmp r2, #03478; CHECK-THUMB8BASE-NEXT: bne .LBB16_23479; CHECK-THUMB8BASE-NEXT: .LBB16_4: @ %atomicrmw.start3480; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB16_1 Depth=13481; CHECK-THUMB8BASE-NEXT: str r0, [sp] @ 4-byte Spill3482; CHECK-THUMB8BASE-NEXT: uxth r1, r13483; CHECK-THUMB8BASE-NEXT: subs r1, r0, r13484; CHECK-THUMB8BASE-NEXT: rsbs r2, r1, #03485; CHECK-THUMB8BASE-NEXT: adcs r1, r23486; CHECK-THUMB8BASE-NEXT: cmp r1, #13487; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill3488; CHECK-THUMB8BASE-NEXT: bne .LBB16_13489; CHECK-THUMB8BASE-NEXT: b .LBB16_53490; CHECK-THUMB8BASE-NEXT: .LBB16_5: @ %atomicrmw.end3491; CHECK-THUMB8BASE-NEXT: ldr r0, [sp] @ 4-byte Reload3492; CHECK-THUMB8BASE-NEXT: add sp, #83493; CHECK-THUMB8BASE-NEXT: pop {r4, pc}3494entry:3495 %0 = atomicrmw or ptr @atomic_i16, i16 1 monotonic3496 ret i16 %03497}3498define i16 @test_xor_i16() {3499; CHECK-ARM8-LABEL: test_xor_i16:3500; CHECK-ARM8: @ %bb.0: @ %entry3501; CHECK-ARM8-NEXT: .pad #83502; CHECK-ARM8-NEXT: sub sp, sp, #83503; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i163504; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i163505; CHECK-ARM8-NEXT: ldrh r0, [r0]3506; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill3507; CHECK-ARM8-NEXT: b .LBB17_13508; CHECK-ARM8-NEXT: .LBB17_1: @ %atomicrmw.start3509; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=13510; CHECK-ARM8-NEXT: @ Child Loop BB17_2 Depth 23511; CHECK-ARM8-NEXT: ldr r1, [sp, #4] @ 4-byte Reload3512; CHECK-ARM8-NEXT: eor r12, r1, #13513; CHECK-ARM8-NEXT: movw r3, :lower16:atomic_i163514; CHECK-ARM8-NEXT: movt r3, :upper16:atomic_i163515; CHECK-ARM8-NEXT: uxth r1, r13516; CHECK-ARM8-NEXT: .LBB17_2: @ %atomicrmw.start3517; CHECK-ARM8-NEXT: @ Parent Loop BB17_1 Depth=13518; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=23519; CHECK-ARM8-NEXT: ldrexh r0, [r3]3520; CHECK-ARM8-NEXT: cmp r0, r13521; CHECK-ARM8-NEXT: bne .LBB17_43522; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start3523; CHECK-ARM8-NEXT: @ in Loop: Header=BB17_2 Depth=23524; CHECK-ARM8-NEXT: strexh r2, r12, [r3]3525; CHECK-ARM8-NEXT: cmp r2, #03526; CHECK-ARM8-NEXT: bne .LBB17_23527; CHECK-ARM8-NEXT: .LBB17_4: @ %atomicrmw.start3528; CHECK-ARM8-NEXT: @ in Loop: Header=BB17_1 Depth=13529; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill3530; CHECK-ARM8-NEXT: uxth r1, r13531; CHECK-ARM8-NEXT: sub r1, r0, r13532; CHECK-ARM8-NEXT: clz r1, r13533; CHECK-ARM8-NEXT: lsr r1, r1, #53534; CHECK-ARM8-NEXT: cmp r1, #13535; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill3536; CHECK-ARM8-NEXT: bne .LBB17_13537; CHECK-ARM8-NEXT: b .LBB17_53538; CHECK-ARM8-NEXT: .LBB17_5: @ %atomicrmw.end3539; CHECK-ARM8-NEXT: ldr r0, [sp] @ 4-byte Reload3540; CHECK-ARM8-NEXT: add sp, sp, #83541; CHECK-ARM8-NEXT: bx lr3542;3543; CHECK-ARM6-LABEL: test_xor_i16:3544; CHECK-ARM6: @ %bb.0: @ %entry3545; CHECK-ARM6-NEXT: .pad #83546; CHECK-ARM6-NEXT: sub sp, sp, #83547; CHECK-ARM6-NEXT: ldr r0, .LCPI17_03548; CHECK-ARM6-NEXT: ldrh r0, [r0]3549; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill3550; CHECK-ARM6-NEXT: b .LBB17_13551; CHECK-ARM6-NEXT: .LBB17_1: @ %atomicrmw.start3552; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=13553; CHECK-ARM6-NEXT: @ Child Loop BB17_2 Depth 23554; CHECK-ARM6-NEXT: ldr r1, [sp, #4] @ 4-byte Reload3555; CHECK-ARM6-NEXT: eor r12, r1, #13556; CHECK-ARM6-NEXT: ldr r3, .LCPI17_03557; CHECK-ARM6-NEXT: uxth r1, r13558; CHECK-ARM6-NEXT: .LBB17_2: @ %atomicrmw.start3559; CHECK-ARM6-NEXT: @ Parent Loop BB17_1 Depth=13560; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=23561; CHECK-ARM6-NEXT: ldrexh r0, [r3]3562; CHECK-ARM6-NEXT: cmp r0, r13563; CHECK-ARM6-NEXT: bne .LBB17_43564; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start3565; CHECK-ARM6-NEXT: @ in Loop: Header=BB17_2 Depth=23566; CHECK-ARM6-NEXT: strexh r2, r12, [r3]3567; CHECK-ARM6-NEXT: cmp r2, #03568; CHECK-ARM6-NEXT: bne .LBB17_23569; CHECK-ARM6-NEXT: .LBB17_4: @ %atomicrmw.start3570; CHECK-ARM6-NEXT: @ in Loop: Header=BB17_1 Depth=13571; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill3572; CHECK-ARM6-NEXT: uxth r1, r13573; CHECK-ARM6-NEXT: sub r1, r0, r13574; CHECK-ARM6-NEXT: clz r1, r13575; CHECK-ARM6-NEXT: lsr r1, r1, #53576; CHECK-ARM6-NEXT: cmp r1, #13577; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill3578; CHECK-ARM6-NEXT: bne .LBB17_13579; CHECK-ARM6-NEXT: b .LBB17_53580; CHECK-ARM6-NEXT: .LBB17_5: @ %atomicrmw.end3581; CHECK-ARM6-NEXT: ldr r0, [sp] @ 4-byte Reload3582; CHECK-ARM6-NEXT: add sp, sp, #83583; CHECK-ARM6-NEXT: bx lr3584; CHECK-ARM6-NEXT: .p2align 23585; CHECK-ARM6-NEXT: @ %bb.6:3586; CHECK-ARM6-NEXT: .LCPI17_0:3587; CHECK-ARM6-NEXT: .long atomic_i163588;3589; CHECK-THUMB7-LABEL: test_xor_i16:3590; CHECK-THUMB7: @ %bb.0: @ %entry3591; CHECK-THUMB7-NEXT: .pad #83592; CHECK-THUMB7-NEXT: sub sp, #83593; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i163594; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i163595; CHECK-THUMB7-NEXT: ldrh r0, [r0]3596; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill3597; CHECK-THUMB7-NEXT: b .LBB17_13598; CHECK-THUMB7-NEXT: .LBB17_1: @ %atomicrmw.start3599; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=13600; CHECK-THUMB7-NEXT: @ Child Loop BB17_2 Depth 23601; CHECK-THUMB7-NEXT: ldr r1, [sp, #4] @ 4-byte Reload3602; CHECK-THUMB7-NEXT: eor r12, r1, #13603; CHECK-THUMB7-NEXT: movw r3, :lower16:atomic_i163604; CHECK-THUMB7-NEXT: movt r3, :upper16:atomic_i163605; CHECK-THUMB7-NEXT: uxth r1, r13606; CHECK-THUMB7-NEXT: .LBB17_2: @ %atomicrmw.start3607; CHECK-THUMB7-NEXT: @ Parent Loop BB17_1 Depth=13608; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=23609; CHECK-THUMB7-NEXT: ldrexh r0, [r3]3610; CHECK-THUMB7-NEXT: cmp r0, r13611; CHECK-THUMB7-NEXT: bne .LBB17_43612; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start3613; CHECK-THUMB7-NEXT: @ in Loop: Header=BB17_2 Depth=23614; CHECK-THUMB7-NEXT: strexh r2, r12, [r3]3615; CHECK-THUMB7-NEXT: cmp r2, #03616; CHECK-THUMB7-NEXT: bne .LBB17_23617; CHECK-THUMB7-NEXT: .LBB17_4: @ %atomicrmw.start3618; CHECK-THUMB7-NEXT: @ in Loop: Header=BB17_1 Depth=13619; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill3620; CHECK-THUMB7-NEXT: uxth r1, r13621; CHECK-THUMB7-NEXT: subs r1, r0, r13622; CHECK-THUMB7-NEXT: clz r1, r13623; CHECK-THUMB7-NEXT: lsrs r1, r1, #53624; CHECK-THUMB7-NEXT: cmp r1, #13625; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill3626; CHECK-THUMB7-NEXT: bne .LBB17_13627; CHECK-THUMB7-NEXT: b .LBB17_53628; CHECK-THUMB7-NEXT: .LBB17_5: @ %atomicrmw.end3629; CHECK-THUMB7-NEXT: ldr r0, [sp] @ 4-byte Reload3630; CHECK-THUMB7-NEXT: add sp, #83631; CHECK-THUMB7-NEXT: bx lr3632;3633; CHECK-THUMB6-LABEL: test_xor_i16:3634; CHECK-THUMB6: @ %bb.0: @ %entry3635; CHECK-THUMB6-NEXT: .save {r7, lr}3636; CHECK-THUMB6-NEXT: push {r7, lr}3637; CHECK-THUMB6-NEXT: ldr r0, .LCPI17_03638; CHECK-THUMB6-NEXT: movs r1, #13639; CHECK-THUMB6-NEXT: bl __sync_fetch_and_xor_23640; CHECK-THUMB6-NEXT: pop {r7, pc}3641; CHECK-THUMB6-NEXT: .p2align 23642; CHECK-THUMB6-NEXT: @ %bb.1:3643; CHECK-THUMB6-NEXT: .LCPI17_0:3644; CHECK-THUMB6-NEXT: .long atomic_i163645;3646; CHECK-THUMB8BASE-LABEL: test_xor_i16:3647; CHECK-THUMB8BASE: @ %bb.0: @ %entry3648; CHECK-THUMB8BASE-NEXT: .save {r4, lr}3649; CHECK-THUMB8BASE-NEXT: push {r4, lr}3650; CHECK-THUMB8BASE-NEXT: .pad #83651; CHECK-THUMB8BASE-NEXT: sub sp, #83652; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i163653; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i163654; CHECK-THUMB8BASE-NEXT: ldrh r0, [r0]3655; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill3656; CHECK-THUMB8BASE-NEXT: b .LBB17_13657; CHECK-THUMB8BASE-NEXT: .LBB17_1: @ %atomicrmw.start3658; CHECK-THUMB8BASE-NEXT: @ =>This Loop Header: Depth=13659; CHECK-THUMB8BASE-NEXT: @ Child Loop BB17_2 Depth 23660; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #4] @ 4-byte Reload3661; CHECK-THUMB8BASE-NEXT: movs r0, #13662; CHECK-THUMB8BASE-NEXT: mov r4, r13663; CHECK-THUMB8BASE-NEXT: eors r4, r03664; CHECK-THUMB8BASE-NEXT: movw r3, :lower16:atomic_i163665; CHECK-THUMB8BASE-NEXT: movt r3, :upper16:atomic_i163666; CHECK-THUMB8BASE-NEXT: uxth r1, r13667; CHECK-THUMB8BASE-NEXT: .LBB17_2: @ %atomicrmw.start3668; CHECK-THUMB8BASE-NEXT: @ Parent Loop BB17_1 Depth=13669; CHECK-THUMB8BASE-NEXT: @ => This Inner Loop Header: Depth=23670; CHECK-THUMB8BASE-NEXT: ldrexh r0, [r3]3671; CHECK-THUMB8BASE-NEXT: cmp r0, r13672; CHECK-THUMB8BASE-NEXT: bne .LBB17_43673; CHECK-THUMB8BASE-NEXT: @ %bb.3: @ %atomicrmw.start3674; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB17_2 Depth=23675; CHECK-THUMB8BASE-NEXT: strexh r2, r4, [r3]3676; CHECK-THUMB8BASE-NEXT: cmp r2, #03677; CHECK-THUMB8BASE-NEXT: bne .LBB17_23678; CHECK-THUMB8BASE-NEXT: .LBB17_4: @ %atomicrmw.start3679; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB17_1 Depth=13680; CHECK-THUMB8BASE-NEXT: str r0, [sp] @ 4-byte Spill3681; CHECK-THUMB8BASE-NEXT: uxth r1, r13682; CHECK-THUMB8BASE-NEXT: subs r1, r0, r13683; CHECK-THUMB8BASE-NEXT: rsbs r2, r1, #03684; CHECK-THUMB8BASE-NEXT: adcs r1, r23685; CHECK-THUMB8BASE-NEXT: cmp r1, #13686; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill3687; CHECK-THUMB8BASE-NEXT: bne .LBB17_13688; CHECK-THUMB8BASE-NEXT: b .LBB17_53689; CHECK-THUMB8BASE-NEXT: .LBB17_5: @ %atomicrmw.end3690; CHECK-THUMB8BASE-NEXT: ldr r0, [sp] @ 4-byte Reload3691; CHECK-THUMB8BASE-NEXT: add sp, #83692; CHECK-THUMB8BASE-NEXT: pop {r4, pc}3693entry:3694 %0 = atomicrmw xor ptr @atomic_i16, i16 1 monotonic3695 ret i16 %03696}3697define i16 @test_max_i16() {3698; CHECK-ARM8-LABEL: test_max_i16:3699; CHECK-ARM8: @ %bb.0: @ %entry3700; CHECK-ARM8-NEXT: .pad #83701; CHECK-ARM8-NEXT: sub sp, sp, #83702; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i163703; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i163704; CHECK-ARM8-NEXT: ldrh r0, [r0]3705; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill3706; CHECK-ARM8-NEXT: b .LBB18_13707; CHECK-ARM8-NEXT: .LBB18_1: @ %atomicrmw.start3708; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=13709; CHECK-ARM8-NEXT: @ Child Loop BB18_2 Depth 23710; CHECK-ARM8-NEXT: ldr r1, [sp, #4] @ 4-byte Reload3711; CHECK-ARM8-NEXT: sxth r0, r13712; CHECK-ARM8-NEXT: cmp r0, #13713; CHECK-ARM8-NEXT: mov r12, #13714; CHECK-ARM8-NEXT: movgt r12, r13715; CHECK-ARM8-NEXT: movw r3, :lower16:atomic_i163716; CHECK-ARM8-NEXT: movt r3, :upper16:atomic_i163717; CHECK-ARM8-NEXT: uxth r1, r13718; CHECK-ARM8-NEXT: .LBB18_2: @ %atomicrmw.start3719; CHECK-ARM8-NEXT: @ Parent Loop BB18_1 Depth=13720; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=23721; CHECK-ARM8-NEXT: ldrexh r0, [r3]3722; CHECK-ARM8-NEXT: cmp r0, r13723; CHECK-ARM8-NEXT: bne .LBB18_43724; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start3725; CHECK-ARM8-NEXT: @ in Loop: Header=BB18_2 Depth=23726; CHECK-ARM8-NEXT: strexh r2, r12, [r3]3727; CHECK-ARM8-NEXT: cmp r2, #03728; CHECK-ARM8-NEXT: bne .LBB18_23729; CHECK-ARM8-NEXT: .LBB18_4: @ %atomicrmw.start3730; CHECK-ARM8-NEXT: @ in Loop: Header=BB18_1 Depth=13731; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill3732; CHECK-ARM8-NEXT: uxth r1, r13733; CHECK-ARM8-NEXT: sub r1, r0, r13734; CHECK-ARM8-NEXT: clz r1, r13735; CHECK-ARM8-NEXT: lsr r1, r1, #53736; CHECK-ARM8-NEXT: cmp r1, #13737; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill3738; CHECK-ARM8-NEXT: bne .LBB18_13739; CHECK-ARM8-NEXT: b .LBB18_53740; CHECK-ARM8-NEXT: .LBB18_5: @ %atomicrmw.end3741; CHECK-ARM8-NEXT: ldr r0, [sp] @ 4-byte Reload3742; CHECK-ARM8-NEXT: add sp, sp, #83743; CHECK-ARM8-NEXT: bx lr3744;3745; CHECK-ARM6-LABEL: test_max_i16:3746; CHECK-ARM6: @ %bb.0: @ %entry3747; CHECK-ARM6-NEXT: .pad #83748; CHECK-ARM6-NEXT: sub sp, sp, #83749; CHECK-ARM6-NEXT: ldr r0, .LCPI18_03750; CHECK-ARM6-NEXT: ldrh r0, [r0]3751; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill3752; CHECK-ARM6-NEXT: b .LBB18_13753; CHECK-ARM6-NEXT: .LBB18_1: @ %atomicrmw.start3754; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=13755; CHECK-ARM6-NEXT: @ Child Loop BB18_2 Depth 23756; CHECK-ARM6-NEXT: ldr r1, [sp, #4] @ 4-byte Reload3757; CHECK-ARM6-NEXT: sxth r0, r13758; CHECK-ARM6-NEXT: cmp r0, #13759; CHECK-ARM6-NEXT: mov r12, #13760; CHECK-ARM6-NEXT: movgt r12, r13761; CHECK-ARM6-NEXT: ldr r3, .LCPI18_03762; CHECK-ARM6-NEXT: uxth r1, r13763; CHECK-ARM6-NEXT: .LBB18_2: @ %atomicrmw.start3764; CHECK-ARM6-NEXT: @ Parent Loop BB18_1 Depth=13765; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=23766; CHECK-ARM6-NEXT: ldrexh r0, [r3]3767; CHECK-ARM6-NEXT: cmp r0, r13768; CHECK-ARM6-NEXT: bne .LBB18_43769; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start3770; CHECK-ARM6-NEXT: @ in Loop: Header=BB18_2 Depth=23771; CHECK-ARM6-NEXT: strexh r2, r12, [r3]3772; CHECK-ARM6-NEXT: cmp r2, #03773; CHECK-ARM6-NEXT: bne .LBB18_23774; CHECK-ARM6-NEXT: .LBB18_4: @ %atomicrmw.start3775; CHECK-ARM6-NEXT: @ in Loop: Header=BB18_1 Depth=13776; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill3777; CHECK-ARM6-NEXT: uxth r1, r13778; CHECK-ARM6-NEXT: sub r1, r0, r13779; CHECK-ARM6-NEXT: clz r1, r13780; CHECK-ARM6-NEXT: lsr r1, r1, #53781; CHECK-ARM6-NEXT: cmp r1, #13782; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill3783; CHECK-ARM6-NEXT: bne .LBB18_13784; CHECK-ARM6-NEXT: b .LBB18_53785; CHECK-ARM6-NEXT: .LBB18_5: @ %atomicrmw.end3786; CHECK-ARM6-NEXT: ldr r0, [sp] @ 4-byte Reload3787; CHECK-ARM6-NEXT: add sp, sp, #83788; CHECK-ARM6-NEXT: bx lr3789; CHECK-ARM6-NEXT: .p2align 23790; CHECK-ARM6-NEXT: @ %bb.6:3791; CHECK-ARM6-NEXT: .LCPI18_0:3792; CHECK-ARM6-NEXT: .long atomic_i163793;3794; CHECK-THUMB7-LABEL: test_max_i16:3795; CHECK-THUMB7: @ %bb.0: @ %entry3796; CHECK-THUMB7-NEXT: .pad #83797; CHECK-THUMB7-NEXT: sub sp, #83798; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i163799; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i163800; CHECK-THUMB7-NEXT: ldrh r0, [r0]3801; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill3802; CHECK-THUMB7-NEXT: b .LBB18_13803; CHECK-THUMB7-NEXT: .LBB18_1: @ %atomicrmw.start3804; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=13805; CHECK-THUMB7-NEXT: @ Child Loop BB18_2 Depth 23806; CHECK-THUMB7-NEXT: ldr r1, [sp, #4] @ 4-byte Reload3807; CHECK-THUMB7-NEXT: sxth r0, r13808; CHECK-THUMB7-NEXT: cmp r0, #13809; CHECK-THUMB7-NEXT: mov.w r12, #13810; CHECK-THUMB7-NEXT: it gt3811; CHECK-THUMB7-NEXT: movgt r12, r13812; CHECK-THUMB7-NEXT: movw r3, :lower16:atomic_i163813; CHECK-THUMB7-NEXT: movt r3, :upper16:atomic_i163814; CHECK-THUMB7-NEXT: uxth r1, r13815; CHECK-THUMB7-NEXT: .LBB18_2: @ %atomicrmw.start3816; CHECK-THUMB7-NEXT: @ Parent Loop BB18_1 Depth=13817; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=23818; CHECK-THUMB7-NEXT: ldrexh r0, [r3]3819; CHECK-THUMB7-NEXT: cmp r0, r13820; CHECK-THUMB7-NEXT: bne .LBB18_43821; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start3822; CHECK-THUMB7-NEXT: @ in Loop: Header=BB18_2 Depth=23823; CHECK-THUMB7-NEXT: strexh r2, r12, [r3]3824; CHECK-THUMB7-NEXT: cmp r2, #03825; CHECK-THUMB7-NEXT: bne .LBB18_23826; CHECK-THUMB7-NEXT: .LBB18_4: @ %atomicrmw.start3827; CHECK-THUMB7-NEXT: @ in Loop: Header=BB18_1 Depth=13828; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill3829; CHECK-THUMB7-NEXT: uxth r1, r13830; CHECK-THUMB7-NEXT: subs r1, r0, r13831; CHECK-THUMB7-NEXT: clz r1, r13832; CHECK-THUMB7-NEXT: lsrs r1, r1, #53833; CHECK-THUMB7-NEXT: cmp r1, #13834; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill3835; CHECK-THUMB7-NEXT: bne .LBB18_13836; CHECK-THUMB7-NEXT: b .LBB18_53837; CHECK-THUMB7-NEXT: .LBB18_5: @ %atomicrmw.end3838; CHECK-THUMB7-NEXT: ldr r0, [sp] @ 4-byte Reload3839; CHECK-THUMB7-NEXT: add sp, #83840; CHECK-THUMB7-NEXT: bx lr3841;3842; CHECK-THUMB6-LABEL: test_max_i16:3843; CHECK-THUMB6: @ %bb.0: @ %entry3844; CHECK-THUMB6-NEXT: .save {r7, lr}3845; CHECK-THUMB6-NEXT: push {r7, lr}3846; CHECK-THUMB6-NEXT: ldr r0, .LCPI18_03847; CHECK-THUMB6-NEXT: movs r1, #13848; CHECK-THUMB6-NEXT: bl __sync_fetch_and_max_23849; CHECK-THUMB6-NEXT: pop {r7, pc}3850; CHECK-THUMB6-NEXT: .p2align 23851; CHECK-THUMB6-NEXT: @ %bb.1:3852; CHECK-THUMB6-NEXT: .LCPI18_0:3853; CHECK-THUMB6-NEXT: .long atomic_i163854;3855; CHECK-THUMB8BASE-LABEL: test_max_i16:3856; CHECK-THUMB8BASE: @ %bb.0: @ %entry3857; CHECK-THUMB8BASE-NEXT: .save {r4, lr}3858; CHECK-THUMB8BASE-NEXT: push {r4, lr}3859; CHECK-THUMB8BASE-NEXT: .pad #203860; CHECK-THUMB8BASE-NEXT: sub sp, #203861; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i163862; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i163863; CHECK-THUMB8BASE-NEXT: ldrh r0, [r0]3864; CHECK-THUMB8BASE-NEXT: str r0, [sp, #16] @ 4-byte Spill3865; CHECK-THUMB8BASE-NEXT: b .LBB18_13866; CHECK-THUMB8BASE-NEXT: .LBB18_1: @ %atomicrmw.start3867; CHECK-THUMB8BASE-NEXT: @ =>This Loop Header: Depth=13868; CHECK-THUMB8BASE-NEXT: @ Child Loop BB18_4 Depth 23869; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #16] @ 4-byte Reload3870; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill3871; CHECK-THUMB8BASE-NEXT: sxth r1, r03872; CHECK-THUMB8BASE-NEXT: movs r2, #13873; CHECK-THUMB8BASE-NEXT: str r2, [sp, #8] @ 4-byte Spill3874; CHECK-THUMB8BASE-NEXT: cmp r1, #13875; CHECK-THUMB8BASE-NEXT: str r0, [sp, #12] @ 4-byte Spill3876; CHECK-THUMB8BASE-NEXT: bgt .LBB18_33877; CHECK-THUMB8BASE-NEXT: @ %bb.2: @ %atomicrmw.start3878; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB18_1 Depth=13879; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #8] @ 4-byte Reload3880; CHECK-THUMB8BASE-NEXT: str r0, [sp, #12] @ 4-byte Spill3881; CHECK-THUMB8BASE-NEXT: .LBB18_3: @ %atomicrmw.start3882; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB18_1 Depth=13883; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #4] @ 4-byte Reload3884; CHECK-THUMB8BASE-NEXT: ldr r4, [sp, #12] @ 4-byte Reload3885; CHECK-THUMB8BASE-NEXT: movw r3, :lower16:atomic_i163886; CHECK-THUMB8BASE-NEXT: movt r3, :upper16:atomic_i163887; CHECK-THUMB8BASE-NEXT: uxth r1, r13888; CHECK-THUMB8BASE-NEXT: .LBB18_4: @ %atomicrmw.start3889; CHECK-THUMB8BASE-NEXT: @ Parent Loop BB18_1 Depth=13890; CHECK-THUMB8BASE-NEXT: @ => This Inner Loop Header: Depth=23891; CHECK-THUMB8BASE-NEXT: ldrexh r0, [r3]3892; CHECK-THUMB8BASE-NEXT: cmp r0, r13893; CHECK-THUMB8BASE-NEXT: bne .LBB18_63894; CHECK-THUMB8BASE-NEXT: @ %bb.5: @ %atomicrmw.start3895; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB18_4 Depth=23896; CHECK-THUMB8BASE-NEXT: strexh r2, r4, [r3]3897; CHECK-THUMB8BASE-NEXT: cmp r2, #03898; CHECK-THUMB8BASE-NEXT: bne .LBB18_43899; CHECK-THUMB8BASE-NEXT: .LBB18_6: @ %atomicrmw.start3900; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB18_1 Depth=13901; CHECK-THUMB8BASE-NEXT: str r0, [sp] @ 4-byte Spill3902; CHECK-THUMB8BASE-NEXT: uxth r1, r13903; CHECK-THUMB8BASE-NEXT: subs r1, r0, r13904; CHECK-THUMB8BASE-NEXT: rsbs r2, r1, #03905; CHECK-THUMB8BASE-NEXT: adcs r1, r23906; CHECK-THUMB8BASE-NEXT: cmp r1, #13907; CHECK-THUMB8BASE-NEXT: str r0, [sp, #16] @ 4-byte Spill3908; CHECK-THUMB8BASE-NEXT: bne .LBB18_13909; CHECK-THUMB8BASE-NEXT: b .LBB18_73910; CHECK-THUMB8BASE-NEXT: .LBB18_7: @ %atomicrmw.end3911; CHECK-THUMB8BASE-NEXT: ldr r0, [sp] @ 4-byte Reload3912; CHECK-THUMB8BASE-NEXT: add sp, #203913; CHECK-THUMB8BASE-NEXT: pop {r4, pc}3914entry:3915 %0 = atomicrmw max ptr @atomic_i16, i16 1 monotonic3916 ret i16 %03917}3918define i16 @test_min_i16() {3919; CHECK-ARM8-LABEL: test_min_i16:3920; CHECK-ARM8: @ %bb.0: @ %entry3921; CHECK-ARM8-NEXT: .pad #83922; CHECK-ARM8-NEXT: sub sp, sp, #83923; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i163924; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i163925; CHECK-ARM8-NEXT: ldrh r0, [r0]3926; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill3927; CHECK-ARM8-NEXT: b .LBB19_13928; CHECK-ARM8-NEXT: .LBB19_1: @ %atomicrmw.start3929; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=13930; CHECK-ARM8-NEXT: @ Child Loop BB19_2 Depth 23931; CHECK-ARM8-NEXT: ldr r1, [sp, #4] @ 4-byte Reload3932; CHECK-ARM8-NEXT: sxth r0, r13933; CHECK-ARM8-NEXT: cmp r0, #23934; CHECK-ARM8-NEXT: mov r12, #13935; CHECK-ARM8-NEXT: movlt r12, r13936; CHECK-ARM8-NEXT: movw r3, :lower16:atomic_i163937; CHECK-ARM8-NEXT: movt r3, :upper16:atomic_i163938; CHECK-ARM8-NEXT: uxth r1, r13939; CHECK-ARM8-NEXT: .LBB19_2: @ %atomicrmw.start3940; CHECK-ARM8-NEXT: @ Parent Loop BB19_1 Depth=13941; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=23942; CHECK-ARM8-NEXT: ldrexh r0, [r3]3943; CHECK-ARM8-NEXT: cmp r0, r13944; CHECK-ARM8-NEXT: bne .LBB19_43945; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start3946; CHECK-ARM8-NEXT: @ in Loop: Header=BB19_2 Depth=23947; CHECK-ARM8-NEXT: strexh r2, r12, [r3]3948; CHECK-ARM8-NEXT: cmp r2, #03949; CHECK-ARM8-NEXT: bne .LBB19_23950; CHECK-ARM8-NEXT: .LBB19_4: @ %atomicrmw.start3951; CHECK-ARM8-NEXT: @ in Loop: Header=BB19_1 Depth=13952; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill3953; CHECK-ARM8-NEXT: uxth r1, r13954; CHECK-ARM8-NEXT: sub r1, r0, r13955; CHECK-ARM8-NEXT: clz r1, r13956; CHECK-ARM8-NEXT: lsr r1, r1, #53957; CHECK-ARM8-NEXT: cmp r1, #13958; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill3959; CHECK-ARM8-NEXT: bne .LBB19_13960; CHECK-ARM8-NEXT: b .LBB19_53961; CHECK-ARM8-NEXT: .LBB19_5: @ %atomicrmw.end3962; CHECK-ARM8-NEXT: ldr r0, [sp] @ 4-byte Reload3963; CHECK-ARM8-NEXT: add sp, sp, #83964; CHECK-ARM8-NEXT: bx lr3965;3966; CHECK-ARM6-LABEL: test_min_i16:3967; CHECK-ARM6: @ %bb.0: @ %entry3968; CHECK-ARM6-NEXT: .pad #83969; CHECK-ARM6-NEXT: sub sp, sp, #83970; CHECK-ARM6-NEXT: ldr r0, .LCPI19_03971; CHECK-ARM6-NEXT: ldrh r0, [r0]3972; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill3973; CHECK-ARM6-NEXT: b .LBB19_13974; CHECK-ARM6-NEXT: .LBB19_1: @ %atomicrmw.start3975; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=13976; CHECK-ARM6-NEXT: @ Child Loop BB19_2 Depth 23977; CHECK-ARM6-NEXT: ldr r1, [sp, #4] @ 4-byte Reload3978; CHECK-ARM6-NEXT: sxth r0, r13979; CHECK-ARM6-NEXT: cmp r0, #23980; CHECK-ARM6-NEXT: mov r12, #13981; CHECK-ARM6-NEXT: movlt r12, r13982; CHECK-ARM6-NEXT: ldr r3, .LCPI19_03983; CHECK-ARM6-NEXT: uxth r1, r13984; CHECK-ARM6-NEXT: .LBB19_2: @ %atomicrmw.start3985; CHECK-ARM6-NEXT: @ Parent Loop BB19_1 Depth=13986; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=23987; CHECK-ARM6-NEXT: ldrexh r0, [r3]3988; CHECK-ARM6-NEXT: cmp r0, r13989; CHECK-ARM6-NEXT: bne .LBB19_43990; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start3991; CHECK-ARM6-NEXT: @ in Loop: Header=BB19_2 Depth=23992; CHECK-ARM6-NEXT: strexh r2, r12, [r3]3993; CHECK-ARM6-NEXT: cmp r2, #03994; CHECK-ARM6-NEXT: bne .LBB19_23995; CHECK-ARM6-NEXT: .LBB19_4: @ %atomicrmw.start3996; CHECK-ARM6-NEXT: @ in Loop: Header=BB19_1 Depth=13997; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill3998; CHECK-ARM6-NEXT: uxth r1, r13999; CHECK-ARM6-NEXT: sub r1, r0, r14000; CHECK-ARM6-NEXT: clz r1, r14001; CHECK-ARM6-NEXT: lsr r1, r1, #54002; CHECK-ARM6-NEXT: cmp r1, #14003; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill4004; CHECK-ARM6-NEXT: bne .LBB19_14005; CHECK-ARM6-NEXT: b .LBB19_54006; CHECK-ARM6-NEXT: .LBB19_5: @ %atomicrmw.end4007; CHECK-ARM6-NEXT: ldr r0, [sp] @ 4-byte Reload4008; CHECK-ARM6-NEXT: add sp, sp, #84009; CHECK-ARM6-NEXT: bx lr4010; CHECK-ARM6-NEXT: .p2align 24011; CHECK-ARM6-NEXT: @ %bb.6:4012; CHECK-ARM6-NEXT: .LCPI19_0:4013; CHECK-ARM6-NEXT: .long atomic_i164014;4015; CHECK-THUMB7-LABEL: test_min_i16:4016; CHECK-THUMB7: @ %bb.0: @ %entry4017; CHECK-THUMB7-NEXT: .pad #84018; CHECK-THUMB7-NEXT: sub sp, #84019; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i164020; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i164021; CHECK-THUMB7-NEXT: ldrh r0, [r0]4022; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill4023; CHECK-THUMB7-NEXT: b .LBB19_14024; CHECK-THUMB7-NEXT: .LBB19_1: @ %atomicrmw.start4025; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=14026; CHECK-THUMB7-NEXT: @ Child Loop BB19_2 Depth 24027; CHECK-THUMB7-NEXT: ldr r1, [sp, #4] @ 4-byte Reload4028; CHECK-THUMB7-NEXT: sxth r0, r14029; CHECK-THUMB7-NEXT: cmp r0, #24030; CHECK-THUMB7-NEXT: mov.w r12, #14031; CHECK-THUMB7-NEXT: it lt4032; CHECK-THUMB7-NEXT: movlt r12, r14033; CHECK-THUMB7-NEXT: movw r3, :lower16:atomic_i164034; CHECK-THUMB7-NEXT: movt r3, :upper16:atomic_i164035; CHECK-THUMB7-NEXT: uxth r1, r14036; CHECK-THUMB7-NEXT: .LBB19_2: @ %atomicrmw.start4037; CHECK-THUMB7-NEXT: @ Parent Loop BB19_1 Depth=14038; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=24039; CHECK-THUMB7-NEXT: ldrexh r0, [r3]4040; CHECK-THUMB7-NEXT: cmp r0, r14041; CHECK-THUMB7-NEXT: bne .LBB19_44042; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start4043; CHECK-THUMB7-NEXT: @ in Loop: Header=BB19_2 Depth=24044; CHECK-THUMB7-NEXT: strexh r2, r12, [r3]4045; CHECK-THUMB7-NEXT: cmp r2, #04046; CHECK-THUMB7-NEXT: bne .LBB19_24047; CHECK-THUMB7-NEXT: .LBB19_4: @ %atomicrmw.start4048; CHECK-THUMB7-NEXT: @ in Loop: Header=BB19_1 Depth=14049; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill4050; CHECK-THUMB7-NEXT: uxth r1, r14051; CHECK-THUMB7-NEXT: subs r1, r0, r14052; CHECK-THUMB7-NEXT: clz r1, r14053; CHECK-THUMB7-NEXT: lsrs r1, r1, #54054; CHECK-THUMB7-NEXT: cmp r1, #14055; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill4056; CHECK-THUMB7-NEXT: bne .LBB19_14057; CHECK-THUMB7-NEXT: b .LBB19_54058; CHECK-THUMB7-NEXT: .LBB19_5: @ %atomicrmw.end4059; CHECK-THUMB7-NEXT: ldr r0, [sp] @ 4-byte Reload4060; CHECK-THUMB7-NEXT: add sp, #84061; CHECK-THUMB7-NEXT: bx lr4062;4063; CHECK-THUMB6-LABEL: test_min_i16:4064; CHECK-THUMB6: @ %bb.0: @ %entry4065; CHECK-THUMB6-NEXT: .save {r7, lr}4066; CHECK-THUMB6-NEXT: push {r7, lr}4067; CHECK-THUMB6-NEXT: ldr r0, .LCPI19_04068; CHECK-THUMB6-NEXT: movs r1, #14069; CHECK-THUMB6-NEXT: bl __sync_fetch_and_min_24070; CHECK-THUMB6-NEXT: pop {r7, pc}4071; CHECK-THUMB6-NEXT: .p2align 24072; CHECK-THUMB6-NEXT: @ %bb.1:4073; CHECK-THUMB6-NEXT: .LCPI19_0:4074; CHECK-THUMB6-NEXT: .long atomic_i164075;4076; CHECK-THUMB8BASE-LABEL: test_min_i16:4077; CHECK-THUMB8BASE: @ %bb.0: @ %entry4078; CHECK-THUMB8BASE-NEXT: .save {r4, lr}4079; CHECK-THUMB8BASE-NEXT: push {r4, lr}4080; CHECK-THUMB8BASE-NEXT: .pad #204081; CHECK-THUMB8BASE-NEXT: sub sp, #204082; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i164083; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i164084; CHECK-THUMB8BASE-NEXT: ldrh r0, [r0]4085; CHECK-THUMB8BASE-NEXT: str r0, [sp, #16] @ 4-byte Spill4086; CHECK-THUMB8BASE-NEXT: b .LBB19_14087; CHECK-THUMB8BASE-NEXT: .LBB19_1: @ %atomicrmw.start4088; CHECK-THUMB8BASE-NEXT: @ =>This Loop Header: Depth=14089; CHECK-THUMB8BASE-NEXT: @ Child Loop BB19_4 Depth 24090; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #16] @ 4-byte Reload4091; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill4092; CHECK-THUMB8BASE-NEXT: sxth r1, r04093; CHECK-THUMB8BASE-NEXT: movs r2, #14094; CHECK-THUMB8BASE-NEXT: str r2, [sp, #8] @ 4-byte Spill4095; CHECK-THUMB8BASE-NEXT: cmp r1, #24096; CHECK-THUMB8BASE-NEXT: str r0, [sp, #12] @ 4-byte Spill4097; CHECK-THUMB8BASE-NEXT: blt .LBB19_34098; CHECK-THUMB8BASE-NEXT: @ %bb.2: @ %atomicrmw.start4099; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB19_1 Depth=14100; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #8] @ 4-byte Reload4101; CHECK-THUMB8BASE-NEXT: str r0, [sp, #12] @ 4-byte Spill4102; CHECK-THUMB8BASE-NEXT: .LBB19_3: @ %atomicrmw.start4103; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB19_1 Depth=14104; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #4] @ 4-byte Reload4105; CHECK-THUMB8BASE-NEXT: ldr r4, [sp, #12] @ 4-byte Reload4106; CHECK-THUMB8BASE-NEXT: movw r3, :lower16:atomic_i164107; CHECK-THUMB8BASE-NEXT: movt r3, :upper16:atomic_i164108; CHECK-THUMB8BASE-NEXT: uxth r1, r14109; CHECK-THUMB8BASE-NEXT: .LBB19_4: @ %atomicrmw.start4110; CHECK-THUMB8BASE-NEXT: @ Parent Loop BB19_1 Depth=14111; CHECK-THUMB8BASE-NEXT: @ => This Inner Loop Header: Depth=24112; CHECK-THUMB8BASE-NEXT: ldrexh r0, [r3]4113; CHECK-THUMB8BASE-NEXT: cmp r0, r14114; CHECK-THUMB8BASE-NEXT: bne .LBB19_64115; CHECK-THUMB8BASE-NEXT: @ %bb.5: @ %atomicrmw.start4116; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB19_4 Depth=24117; CHECK-THUMB8BASE-NEXT: strexh r2, r4, [r3]4118; CHECK-THUMB8BASE-NEXT: cmp r2, #04119; CHECK-THUMB8BASE-NEXT: bne .LBB19_44120; CHECK-THUMB8BASE-NEXT: .LBB19_6: @ %atomicrmw.start4121; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB19_1 Depth=14122; CHECK-THUMB8BASE-NEXT: str r0, [sp] @ 4-byte Spill4123; CHECK-THUMB8BASE-NEXT: uxth r1, r14124; CHECK-THUMB8BASE-NEXT: subs r1, r0, r14125; CHECK-THUMB8BASE-NEXT: rsbs r2, r1, #04126; CHECK-THUMB8BASE-NEXT: adcs r1, r24127; CHECK-THUMB8BASE-NEXT: cmp r1, #14128; CHECK-THUMB8BASE-NEXT: str r0, [sp, #16] @ 4-byte Spill4129; CHECK-THUMB8BASE-NEXT: bne .LBB19_14130; CHECK-THUMB8BASE-NEXT: b .LBB19_74131; CHECK-THUMB8BASE-NEXT: .LBB19_7: @ %atomicrmw.end4132; CHECK-THUMB8BASE-NEXT: ldr r0, [sp] @ 4-byte Reload4133; CHECK-THUMB8BASE-NEXT: add sp, #204134; CHECK-THUMB8BASE-NEXT: pop {r4, pc}4135entry:4136 %0 = atomicrmw min ptr @atomic_i16, i16 1 monotonic4137 ret i16 %04138}4139define i16 @test_umax_i16() {4140; CHECK-ARM8-LABEL: test_umax_i16:4141; CHECK-ARM8: @ %bb.0: @ %entry4142; CHECK-ARM8-NEXT: .save {r11, lr}4143; CHECK-ARM8-NEXT: push {r11, lr}4144; CHECK-ARM8-NEXT: .pad #84145; CHECK-ARM8-NEXT: sub sp, sp, #84146; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i164147; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i164148; CHECK-ARM8-NEXT: ldrh r0, [r0]4149; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill4150; CHECK-ARM8-NEXT: b .LBB20_14151; CHECK-ARM8-NEXT: .LBB20_1: @ %atomicrmw.start4152; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=14153; CHECK-ARM8-NEXT: @ Child Loop BB20_2 Depth 24154; CHECK-ARM8-NEXT: ldr r12, [sp, #4] @ 4-byte Reload4155; CHECK-ARM8-NEXT: uxth r1, r124156; CHECK-ARM8-NEXT: cmp r1, #14157; CHECK-ARM8-NEXT: mov lr, #14158; CHECK-ARM8-NEXT: movhi lr, r124159; CHECK-ARM8-NEXT: movw r3, :lower16:atomic_i164160; CHECK-ARM8-NEXT: movt r3, :upper16:atomic_i164161; CHECK-ARM8-NEXT: uxth r12, r124162; CHECK-ARM8-NEXT: .LBB20_2: @ %atomicrmw.start4163; CHECK-ARM8-NEXT: @ Parent Loop BB20_1 Depth=14164; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=24165; CHECK-ARM8-NEXT: ldrexh r0, [r3]4166; CHECK-ARM8-NEXT: cmp r0, r124167; CHECK-ARM8-NEXT: bne .LBB20_44168; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start4169; CHECK-ARM8-NEXT: @ in Loop: Header=BB20_2 Depth=24170; CHECK-ARM8-NEXT: strexh r2, lr, [r3]4171; CHECK-ARM8-NEXT: cmp r2, #04172; CHECK-ARM8-NEXT: bne .LBB20_24173; CHECK-ARM8-NEXT: .LBB20_4: @ %atomicrmw.start4174; CHECK-ARM8-NEXT: @ in Loop: Header=BB20_1 Depth=14175; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill4176; CHECK-ARM8-NEXT: sub r1, r0, r14177; CHECK-ARM8-NEXT: clz r1, r14178; CHECK-ARM8-NEXT: lsr r1, r1, #54179; CHECK-ARM8-NEXT: cmp r1, #14180; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill4181; CHECK-ARM8-NEXT: bne .LBB20_14182; CHECK-ARM8-NEXT: b .LBB20_54183; CHECK-ARM8-NEXT: .LBB20_5: @ %atomicrmw.end4184; CHECK-ARM8-NEXT: ldr r0, [sp] @ 4-byte Reload4185; CHECK-ARM8-NEXT: add sp, sp, #84186; CHECK-ARM8-NEXT: pop {r11, pc}4187;4188; CHECK-ARM6-LABEL: test_umax_i16:4189; CHECK-ARM6: @ %bb.0: @ %entry4190; CHECK-ARM6-NEXT: .save {r11, lr}4191; CHECK-ARM6-NEXT: push {r11, lr}4192; CHECK-ARM6-NEXT: .pad #84193; CHECK-ARM6-NEXT: sub sp, sp, #84194; CHECK-ARM6-NEXT: ldr r0, .LCPI20_04195; CHECK-ARM6-NEXT: ldrh r0, [r0]4196; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill4197; CHECK-ARM6-NEXT: b .LBB20_14198; CHECK-ARM6-NEXT: .LBB20_1: @ %atomicrmw.start4199; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=14200; CHECK-ARM6-NEXT: @ Child Loop BB20_2 Depth 24201; CHECK-ARM6-NEXT: ldr r12, [sp, #4] @ 4-byte Reload4202; CHECK-ARM6-NEXT: uxth r1, r124203; CHECK-ARM6-NEXT: cmp r1, #14204; CHECK-ARM6-NEXT: mov lr, #14205; CHECK-ARM6-NEXT: movhi lr, r124206; CHECK-ARM6-NEXT: ldr r3, .LCPI20_04207; CHECK-ARM6-NEXT: uxth r12, r124208; CHECK-ARM6-NEXT: .LBB20_2: @ %atomicrmw.start4209; CHECK-ARM6-NEXT: @ Parent Loop BB20_1 Depth=14210; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=24211; CHECK-ARM6-NEXT: ldrexh r0, [r3]4212; CHECK-ARM6-NEXT: cmp r0, r124213; CHECK-ARM6-NEXT: bne .LBB20_44214; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start4215; CHECK-ARM6-NEXT: @ in Loop: Header=BB20_2 Depth=24216; CHECK-ARM6-NEXT: strexh r2, lr, [r3]4217; CHECK-ARM6-NEXT: cmp r2, #04218; CHECK-ARM6-NEXT: bne .LBB20_24219; CHECK-ARM6-NEXT: .LBB20_4: @ %atomicrmw.start4220; CHECK-ARM6-NEXT: @ in Loop: Header=BB20_1 Depth=14221; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill4222; CHECK-ARM6-NEXT: sub r1, r0, r14223; CHECK-ARM6-NEXT: clz r1, r14224; CHECK-ARM6-NEXT: lsr r1, r1, #54225; CHECK-ARM6-NEXT: cmp r1, #14226; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill4227; CHECK-ARM6-NEXT: bne .LBB20_14228; CHECK-ARM6-NEXT: b .LBB20_54229; CHECK-ARM6-NEXT: .LBB20_5: @ %atomicrmw.end4230; CHECK-ARM6-NEXT: ldr r0, [sp] @ 4-byte Reload4231; CHECK-ARM6-NEXT: add sp, sp, #84232; CHECK-ARM6-NEXT: pop {r11, pc}4233; CHECK-ARM6-NEXT: .p2align 24234; CHECK-ARM6-NEXT: @ %bb.6:4235; CHECK-ARM6-NEXT: .LCPI20_0:4236; CHECK-ARM6-NEXT: .long atomic_i164237;4238; CHECK-THUMB7-LABEL: test_umax_i16:4239; CHECK-THUMB7: @ %bb.0: @ %entry4240; CHECK-THUMB7-NEXT: .save {r4, lr}4241; CHECK-THUMB7-NEXT: push {r4, lr}4242; CHECK-THUMB7-NEXT: .pad #84243; CHECK-THUMB7-NEXT: sub sp, #84244; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i164245; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i164246; CHECK-THUMB7-NEXT: ldrh r0, [r0]4247; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill4248; CHECK-THUMB7-NEXT: b .LBB20_14249; CHECK-THUMB7-NEXT: .LBB20_1: @ %atomicrmw.start4250; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=14251; CHECK-THUMB7-NEXT: @ Child Loop BB20_2 Depth 24252; CHECK-THUMB7-NEXT: ldr r4, [sp, #4] @ 4-byte Reload4253; CHECK-THUMB7-NEXT: uxth r1, r44254; CHECK-THUMB7-NEXT: cmp r1, #14255; CHECK-THUMB7-NEXT: mov.w r12, #14256; CHECK-THUMB7-NEXT: it hi4257; CHECK-THUMB7-NEXT: movhi r12, r44258; CHECK-THUMB7-NEXT: movw r3, :lower16:atomic_i164259; CHECK-THUMB7-NEXT: movt r3, :upper16:atomic_i164260; CHECK-THUMB7-NEXT: uxth r4, r44261; CHECK-THUMB7-NEXT: .LBB20_2: @ %atomicrmw.start4262; CHECK-THUMB7-NEXT: @ Parent Loop BB20_1 Depth=14263; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=24264; CHECK-THUMB7-NEXT: ldrexh r0, [r3]4265; CHECK-THUMB7-NEXT: cmp r0, r44266; CHECK-THUMB7-NEXT: bne .LBB20_44267; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start4268; CHECK-THUMB7-NEXT: @ in Loop: Header=BB20_2 Depth=24269; CHECK-THUMB7-NEXT: strexh r2, r12, [r3]4270; CHECK-THUMB7-NEXT: cmp r2, #04271; CHECK-THUMB7-NEXT: bne .LBB20_24272; CHECK-THUMB7-NEXT: .LBB20_4: @ %atomicrmw.start4273; CHECK-THUMB7-NEXT: @ in Loop: Header=BB20_1 Depth=14274; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill4275; CHECK-THUMB7-NEXT: subs r1, r0, r14276; CHECK-THUMB7-NEXT: clz r1, r14277; CHECK-THUMB7-NEXT: lsrs r1, r1, #54278; CHECK-THUMB7-NEXT: cmp r1, #14279; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill4280; CHECK-THUMB7-NEXT: bne .LBB20_14281; CHECK-THUMB7-NEXT: b .LBB20_54282; CHECK-THUMB7-NEXT: .LBB20_5: @ %atomicrmw.end4283; CHECK-THUMB7-NEXT: ldr r0, [sp] @ 4-byte Reload4284; CHECK-THUMB7-NEXT: add sp, #84285; CHECK-THUMB7-NEXT: pop {r4, pc}4286;4287; CHECK-THUMB6-LABEL: test_umax_i16:4288; CHECK-THUMB6: @ %bb.0: @ %entry4289; CHECK-THUMB6-NEXT: .save {r7, lr}4290; CHECK-THUMB6-NEXT: push {r7, lr}4291; CHECK-THUMB6-NEXT: ldr r0, .LCPI20_04292; CHECK-THUMB6-NEXT: movs r1, #14293; CHECK-THUMB6-NEXT: bl __sync_fetch_and_umax_24294; CHECK-THUMB6-NEXT: pop {r7, pc}4295; CHECK-THUMB6-NEXT: .p2align 24296; CHECK-THUMB6-NEXT: @ %bb.1:4297; CHECK-THUMB6-NEXT: .LCPI20_0:4298; CHECK-THUMB6-NEXT: .long atomic_i164299;4300; CHECK-THUMB8BASE-LABEL: test_umax_i16:4301; CHECK-THUMB8BASE: @ %bb.0: @ %entry4302; CHECK-THUMB8BASE-NEXT: .save {r4, r5, r7, lr}4303; CHECK-THUMB8BASE-NEXT: push {r4, r5, r7, lr}4304; CHECK-THUMB8BASE-NEXT: .pad #244305; CHECK-THUMB8BASE-NEXT: sub sp, #244306; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i164307; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i164308; CHECK-THUMB8BASE-NEXT: ldrh r0, [r0]4309; CHECK-THUMB8BASE-NEXT: str r0, [sp, #20] @ 4-byte Spill4310; CHECK-THUMB8BASE-NEXT: b .LBB20_14311; CHECK-THUMB8BASE-NEXT: .LBB20_1: @ %atomicrmw.start4312; CHECK-THUMB8BASE-NEXT: @ =>This Loop Header: Depth=14313; CHECK-THUMB8BASE-NEXT: @ Child Loop BB20_4 Depth 24314; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #20] @ 4-byte Reload4315; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill4316; CHECK-THUMB8BASE-NEXT: uxth r1, r04317; CHECK-THUMB8BASE-NEXT: str r1, [sp, #8] @ 4-byte Spill4318; CHECK-THUMB8BASE-NEXT: movs r2, #14319; CHECK-THUMB8BASE-NEXT: str r2, [sp, #12] @ 4-byte Spill4320; CHECK-THUMB8BASE-NEXT: cmp r1, #14321; CHECK-THUMB8BASE-NEXT: str r0, [sp, #16] @ 4-byte Spill4322; CHECK-THUMB8BASE-NEXT: bhi .LBB20_34323; CHECK-THUMB8BASE-NEXT: @ %bb.2: @ %atomicrmw.start4324; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB20_1 Depth=14325; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #12] @ 4-byte Reload4326; CHECK-THUMB8BASE-NEXT: str r0, [sp, #16] @ 4-byte Spill4327; CHECK-THUMB8BASE-NEXT: .LBB20_3: @ %atomicrmw.start4328; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB20_1 Depth=14329; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #8] @ 4-byte Reload4330; CHECK-THUMB8BASE-NEXT: ldr r4, [sp, #4] @ 4-byte Reload4331; CHECK-THUMB8BASE-NEXT: ldr r5, [sp, #16] @ 4-byte Reload4332; CHECK-THUMB8BASE-NEXT: movw r3, :lower16:atomic_i164333; CHECK-THUMB8BASE-NEXT: movt r3, :upper16:atomic_i164334; CHECK-THUMB8BASE-NEXT: uxth r4, r44335; CHECK-THUMB8BASE-NEXT: .LBB20_4: @ %atomicrmw.start4336; CHECK-THUMB8BASE-NEXT: @ Parent Loop BB20_1 Depth=14337; CHECK-THUMB8BASE-NEXT: @ => This Inner Loop Header: Depth=24338; CHECK-THUMB8BASE-NEXT: ldrexh r0, [r3]4339; CHECK-THUMB8BASE-NEXT: cmp r0, r44340; CHECK-THUMB8BASE-NEXT: bne .LBB20_64341; CHECK-THUMB8BASE-NEXT: @ %bb.5: @ %atomicrmw.start4342; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB20_4 Depth=24343; CHECK-THUMB8BASE-NEXT: strexh r2, r5, [r3]4344; CHECK-THUMB8BASE-NEXT: cmp r2, #04345; CHECK-THUMB8BASE-NEXT: bne .LBB20_44346; CHECK-THUMB8BASE-NEXT: .LBB20_6: @ %atomicrmw.start4347; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB20_1 Depth=14348; CHECK-THUMB8BASE-NEXT: str r0, [sp] @ 4-byte Spill4349; CHECK-THUMB8BASE-NEXT: subs r1, r0, r14350; CHECK-THUMB8BASE-NEXT: rsbs r2, r1, #04351; CHECK-THUMB8BASE-NEXT: adcs r1, r24352; CHECK-THUMB8BASE-NEXT: cmp r1, #14353; CHECK-THUMB8BASE-NEXT: str r0, [sp, #20] @ 4-byte Spill4354; CHECK-THUMB8BASE-NEXT: bne .LBB20_14355; CHECK-THUMB8BASE-NEXT: b .LBB20_74356; CHECK-THUMB8BASE-NEXT: .LBB20_7: @ %atomicrmw.end4357; CHECK-THUMB8BASE-NEXT: ldr r0, [sp] @ 4-byte Reload4358; CHECK-THUMB8BASE-NEXT: add sp, #244359; CHECK-THUMB8BASE-NEXT: pop {r4, r5, r7, pc}4360entry:4361 %0 = atomicrmw umax ptr @atomic_i16, i16 1 monotonic4362 ret i16 %04363}4364define i16 @test_umin_i16() {4365; CHECK-ARM8-LABEL: test_umin_i16:4366; CHECK-ARM8: @ %bb.0: @ %entry4367; CHECK-ARM8-NEXT: .save {r11, lr}4368; CHECK-ARM8-NEXT: push {r11, lr}4369; CHECK-ARM8-NEXT: .pad #84370; CHECK-ARM8-NEXT: sub sp, sp, #84371; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i164372; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i164373; CHECK-ARM8-NEXT: ldrh r0, [r0]4374; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill4375; CHECK-ARM8-NEXT: b .LBB21_14376; CHECK-ARM8-NEXT: .LBB21_1: @ %atomicrmw.start4377; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=14378; CHECK-ARM8-NEXT: @ Child Loop BB21_2 Depth 24379; CHECK-ARM8-NEXT: ldr r12, [sp, #4] @ 4-byte Reload4380; CHECK-ARM8-NEXT: uxth r1, r124381; CHECK-ARM8-NEXT: cmp r1, #24382; CHECK-ARM8-NEXT: mov lr, #14383; CHECK-ARM8-NEXT: movlo lr, r124384; CHECK-ARM8-NEXT: movw r3, :lower16:atomic_i164385; CHECK-ARM8-NEXT: movt r3, :upper16:atomic_i164386; CHECK-ARM8-NEXT: uxth r12, r124387; CHECK-ARM8-NEXT: .LBB21_2: @ %atomicrmw.start4388; CHECK-ARM8-NEXT: @ Parent Loop BB21_1 Depth=14389; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=24390; CHECK-ARM8-NEXT: ldrexh r0, [r3]4391; CHECK-ARM8-NEXT: cmp r0, r124392; CHECK-ARM8-NEXT: bne .LBB21_44393; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start4394; CHECK-ARM8-NEXT: @ in Loop: Header=BB21_2 Depth=24395; CHECK-ARM8-NEXT: strexh r2, lr, [r3]4396; CHECK-ARM8-NEXT: cmp r2, #04397; CHECK-ARM8-NEXT: bne .LBB21_24398; CHECK-ARM8-NEXT: .LBB21_4: @ %atomicrmw.start4399; CHECK-ARM8-NEXT: @ in Loop: Header=BB21_1 Depth=14400; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill4401; CHECK-ARM8-NEXT: sub r1, r0, r14402; CHECK-ARM8-NEXT: clz r1, r14403; CHECK-ARM8-NEXT: lsr r1, r1, #54404; CHECK-ARM8-NEXT: cmp r1, #14405; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill4406; CHECK-ARM8-NEXT: bne .LBB21_14407; CHECK-ARM8-NEXT: b .LBB21_54408; CHECK-ARM8-NEXT: .LBB21_5: @ %atomicrmw.end4409; CHECK-ARM8-NEXT: ldr r0, [sp] @ 4-byte Reload4410; CHECK-ARM8-NEXT: add sp, sp, #84411; CHECK-ARM8-NEXT: pop {r11, pc}4412;4413; CHECK-ARM6-LABEL: test_umin_i16:4414; CHECK-ARM6: @ %bb.0: @ %entry4415; CHECK-ARM6-NEXT: .save {r11, lr}4416; CHECK-ARM6-NEXT: push {r11, lr}4417; CHECK-ARM6-NEXT: .pad #84418; CHECK-ARM6-NEXT: sub sp, sp, #84419; CHECK-ARM6-NEXT: ldr r0, .LCPI21_04420; CHECK-ARM6-NEXT: ldrh r0, [r0]4421; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill4422; CHECK-ARM6-NEXT: b .LBB21_14423; CHECK-ARM6-NEXT: .LBB21_1: @ %atomicrmw.start4424; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=14425; CHECK-ARM6-NEXT: @ Child Loop BB21_2 Depth 24426; CHECK-ARM6-NEXT: ldr r12, [sp, #4] @ 4-byte Reload4427; CHECK-ARM6-NEXT: uxth r1, r124428; CHECK-ARM6-NEXT: cmp r1, #24429; CHECK-ARM6-NEXT: mov lr, #14430; CHECK-ARM6-NEXT: movlo lr, r124431; CHECK-ARM6-NEXT: ldr r3, .LCPI21_04432; CHECK-ARM6-NEXT: uxth r12, r124433; CHECK-ARM6-NEXT: .LBB21_2: @ %atomicrmw.start4434; CHECK-ARM6-NEXT: @ Parent Loop BB21_1 Depth=14435; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=24436; CHECK-ARM6-NEXT: ldrexh r0, [r3]4437; CHECK-ARM6-NEXT: cmp r0, r124438; CHECK-ARM6-NEXT: bne .LBB21_44439; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start4440; CHECK-ARM6-NEXT: @ in Loop: Header=BB21_2 Depth=24441; CHECK-ARM6-NEXT: strexh r2, lr, [r3]4442; CHECK-ARM6-NEXT: cmp r2, #04443; CHECK-ARM6-NEXT: bne .LBB21_24444; CHECK-ARM6-NEXT: .LBB21_4: @ %atomicrmw.start4445; CHECK-ARM6-NEXT: @ in Loop: Header=BB21_1 Depth=14446; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill4447; CHECK-ARM6-NEXT: sub r1, r0, r14448; CHECK-ARM6-NEXT: clz r1, r14449; CHECK-ARM6-NEXT: lsr r1, r1, #54450; CHECK-ARM6-NEXT: cmp r1, #14451; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill4452; CHECK-ARM6-NEXT: bne .LBB21_14453; CHECK-ARM6-NEXT: b .LBB21_54454; CHECK-ARM6-NEXT: .LBB21_5: @ %atomicrmw.end4455; CHECK-ARM6-NEXT: ldr r0, [sp] @ 4-byte Reload4456; CHECK-ARM6-NEXT: add sp, sp, #84457; CHECK-ARM6-NEXT: pop {r11, pc}4458; CHECK-ARM6-NEXT: .p2align 24459; CHECK-ARM6-NEXT: @ %bb.6:4460; CHECK-ARM6-NEXT: .LCPI21_0:4461; CHECK-ARM6-NEXT: .long atomic_i164462;4463; CHECK-THUMB7-LABEL: test_umin_i16:4464; CHECK-THUMB7: @ %bb.0: @ %entry4465; CHECK-THUMB7-NEXT: .save {r4, lr}4466; CHECK-THUMB7-NEXT: push {r4, lr}4467; CHECK-THUMB7-NEXT: .pad #84468; CHECK-THUMB7-NEXT: sub sp, #84469; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i164470; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i164471; CHECK-THUMB7-NEXT: ldrh r0, [r0]4472; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill4473; CHECK-THUMB7-NEXT: b .LBB21_14474; CHECK-THUMB7-NEXT: .LBB21_1: @ %atomicrmw.start4475; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=14476; CHECK-THUMB7-NEXT: @ Child Loop BB21_2 Depth 24477; CHECK-THUMB7-NEXT: ldr r4, [sp, #4] @ 4-byte Reload4478; CHECK-THUMB7-NEXT: uxth r1, r44479; CHECK-THUMB7-NEXT: cmp r1, #24480; CHECK-THUMB7-NEXT: mov.w r12, #14481; CHECK-THUMB7-NEXT: it lo4482; CHECK-THUMB7-NEXT: movlo r12, r44483; CHECK-THUMB7-NEXT: movw r3, :lower16:atomic_i164484; CHECK-THUMB7-NEXT: movt r3, :upper16:atomic_i164485; CHECK-THUMB7-NEXT: uxth r4, r44486; CHECK-THUMB7-NEXT: .LBB21_2: @ %atomicrmw.start4487; CHECK-THUMB7-NEXT: @ Parent Loop BB21_1 Depth=14488; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=24489; CHECK-THUMB7-NEXT: ldrexh r0, [r3]4490; CHECK-THUMB7-NEXT: cmp r0, r44491; CHECK-THUMB7-NEXT: bne .LBB21_44492; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start4493; CHECK-THUMB7-NEXT: @ in Loop: Header=BB21_2 Depth=24494; CHECK-THUMB7-NEXT: strexh r2, r12, [r3]4495; CHECK-THUMB7-NEXT: cmp r2, #04496; CHECK-THUMB7-NEXT: bne .LBB21_24497; CHECK-THUMB7-NEXT: .LBB21_4: @ %atomicrmw.start4498; CHECK-THUMB7-NEXT: @ in Loop: Header=BB21_1 Depth=14499; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill4500; CHECK-THUMB7-NEXT: subs r1, r0, r14501; CHECK-THUMB7-NEXT: clz r1, r14502; CHECK-THUMB7-NEXT: lsrs r1, r1, #54503; CHECK-THUMB7-NEXT: cmp r1, #14504; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill4505; CHECK-THUMB7-NEXT: bne .LBB21_14506; CHECK-THUMB7-NEXT: b .LBB21_54507; CHECK-THUMB7-NEXT: .LBB21_5: @ %atomicrmw.end4508; CHECK-THUMB7-NEXT: ldr r0, [sp] @ 4-byte Reload4509; CHECK-THUMB7-NEXT: add sp, #84510; CHECK-THUMB7-NEXT: pop {r4, pc}4511;4512; CHECK-THUMB6-LABEL: test_umin_i16:4513; CHECK-THUMB6: @ %bb.0: @ %entry4514; CHECK-THUMB6-NEXT: .save {r7, lr}4515; CHECK-THUMB6-NEXT: push {r7, lr}4516; CHECK-THUMB6-NEXT: ldr r0, .LCPI21_04517; CHECK-THUMB6-NEXT: movs r1, #14518; CHECK-THUMB6-NEXT: bl __sync_fetch_and_umin_24519; CHECK-THUMB6-NEXT: pop {r7, pc}4520; CHECK-THUMB6-NEXT: .p2align 24521; CHECK-THUMB6-NEXT: @ %bb.1:4522; CHECK-THUMB6-NEXT: .LCPI21_0:4523; CHECK-THUMB6-NEXT: .long atomic_i164524;4525; CHECK-THUMB8BASE-LABEL: test_umin_i16:4526; CHECK-THUMB8BASE: @ %bb.0: @ %entry4527; CHECK-THUMB8BASE-NEXT: .save {r4, r5, r7, lr}4528; CHECK-THUMB8BASE-NEXT: push {r4, r5, r7, lr}4529; CHECK-THUMB8BASE-NEXT: .pad #244530; CHECK-THUMB8BASE-NEXT: sub sp, #244531; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i164532; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i164533; CHECK-THUMB8BASE-NEXT: ldrh r0, [r0]4534; CHECK-THUMB8BASE-NEXT: str r0, [sp, #20] @ 4-byte Spill4535; CHECK-THUMB8BASE-NEXT: b .LBB21_14536; CHECK-THUMB8BASE-NEXT: .LBB21_1: @ %atomicrmw.start4537; CHECK-THUMB8BASE-NEXT: @ =>This Loop Header: Depth=14538; CHECK-THUMB8BASE-NEXT: @ Child Loop BB21_4 Depth 24539; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #20] @ 4-byte Reload4540; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill4541; CHECK-THUMB8BASE-NEXT: uxth r1, r04542; CHECK-THUMB8BASE-NEXT: str r1, [sp, #8] @ 4-byte Spill4543; CHECK-THUMB8BASE-NEXT: movs r2, #14544; CHECK-THUMB8BASE-NEXT: str r2, [sp, #12] @ 4-byte Spill4545; CHECK-THUMB8BASE-NEXT: cmp r1, #24546; CHECK-THUMB8BASE-NEXT: str r0, [sp, #16] @ 4-byte Spill4547; CHECK-THUMB8BASE-NEXT: blo .LBB21_34548; CHECK-THUMB8BASE-NEXT: @ %bb.2: @ %atomicrmw.start4549; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB21_1 Depth=14550; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #12] @ 4-byte Reload4551; CHECK-THUMB8BASE-NEXT: str r0, [sp, #16] @ 4-byte Spill4552; CHECK-THUMB8BASE-NEXT: .LBB21_3: @ %atomicrmw.start4553; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB21_1 Depth=14554; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #8] @ 4-byte Reload4555; CHECK-THUMB8BASE-NEXT: ldr r4, [sp, #4] @ 4-byte Reload4556; CHECK-THUMB8BASE-NEXT: ldr r5, [sp, #16] @ 4-byte Reload4557; CHECK-THUMB8BASE-NEXT: movw r3, :lower16:atomic_i164558; CHECK-THUMB8BASE-NEXT: movt r3, :upper16:atomic_i164559; CHECK-THUMB8BASE-NEXT: uxth r4, r44560; CHECK-THUMB8BASE-NEXT: .LBB21_4: @ %atomicrmw.start4561; CHECK-THUMB8BASE-NEXT: @ Parent Loop BB21_1 Depth=14562; CHECK-THUMB8BASE-NEXT: @ => This Inner Loop Header: Depth=24563; CHECK-THUMB8BASE-NEXT: ldrexh r0, [r3]4564; CHECK-THUMB8BASE-NEXT: cmp r0, r44565; CHECK-THUMB8BASE-NEXT: bne .LBB21_64566; CHECK-THUMB8BASE-NEXT: @ %bb.5: @ %atomicrmw.start4567; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB21_4 Depth=24568; CHECK-THUMB8BASE-NEXT: strexh r2, r5, [r3]4569; CHECK-THUMB8BASE-NEXT: cmp r2, #04570; CHECK-THUMB8BASE-NEXT: bne .LBB21_44571; CHECK-THUMB8BASE-NEXT: .LBB21_6: @ %atomicrmw.start4572; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB21_1 Depth=14573; CHECK-THUMB8BASE-NEXT: str r0, [sp] @ 4-byte Spill4574; CHECK-THUMB8BASE-NEXT: subs r1, r0, r14575; CHECK-THUMB8BASE-NEXT: rsbs r2, r1, #04576; CHECK-THUMB8BASE-NEXT: adcs r1, r24577; CHECK-THUMB8BASE-NEXT: cmp r1, #14578; CHECK-THUMB8BASE-NEXT: str r0, [sp, #20] @ 4-byte Spill4579; CHECK-THUMB8BASE-NEXT: bne .LBB21_14580; CHECK-THUMB8BASE-NEXT: b .LBB21_74581; CHECK-THUMB8BASE-NEXT: .LBB21_7: @ %atomicrmw.end4582; CHECK-THUMB8BASE-NEXT: ldr r0, [sp] @ 4-byte Reload4583; CHECK-THUMB8BASE-NEXT: add sp, #244584; CHECK-THUMB8BASE-NEXT: pop {r4, r5, r7, pc}4585entry:4586 %0 = atomicrmw umin ptr @atomic_i16, i16 1 monotonic4587 ret i16 %04588}4589 4590 4591define i32 @test_xchg_i32() {4592; CHECK-ARM8-LABEL: test_xchg_i32:4593; CHECK-ARM8: @ %bb.0: @ %entry4594; CHECK-ARM8-NEXT: .pad #84595; CHECK-ARM8-NEXT: sub sp, sp, #84596; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i324597; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i324598; CHECK-ARM8-NEXT: ldr r0, [r0]4599; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill4600; CHECK-ARM8-NEXT: b .LBB22_14601; CHECK-ARM8-NEXT: .LBB22_1: @ %atomicrmw.start4602; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=14603; CHECK-ARM8-NEXT: @ Child Loop BB22_2 Depth 24604; CHECK-ARM8-NEXT: ldr r1, [sp, #4] @ 4-byte Reload4605; CHECK-ARM8-NEXT: movw r3, :lower16:atomic_i324606; CHECK-ARM8-NEXT: movt r3, :upper16:atomic_i324607; CHECK-ARM8-NEXT: mov r12, #14608; CHECK-ARM8-NEXT: .LBB22_2: @ %atomicrmw.start4609; CHECK-ARM8-NEXT: @ Parent Loop BB22_1 Depth=14610; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=24611; CHECK-ARM8-NEXT: ldrex r0, [r3]4612; CHECK-ARM8-NEXT: cmp r0, r14613; CHECK-ARM8-NEXT: bne .LBB22_44614; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start4615; CHECK-ARM8-NEXT: @ in Loop: Header=BB22_2 Depth=24616; CHECK-ARM8-NEXT: strex r2, r12, [r3]4617; CHECK-ARM8-NEXT: cmp r2, #04618; CHECK-ARM8-NEXT: bne .LBB22_24619; CHECK-ARM8-NEXT: .LBB22_4: @ %atomicrmw.start4620; CHECK-ARM8-NEXT: @ in Loop: Header=BB22_1 Depth=14621; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill4622; CHECK-ARM8-NEXT: sub r1, r0, r14623; CHECK-ARM8-NEXT: clz r1, r14624; CHECK-ARM8-NEXT: lsr r1, r1, #54625; CHECK-ARM8-NEXT: cmp r1, #14626; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill4627; CHECK-ARM8-NEXT: bne .LBB22_14628; CHECK-ARM8-NEXT: b .LBB22_54629; CHECK-ARM8-NEXT: .LBB22_5: @ %atomicrmw.end4630; CHECK-ARM8-NEXT: ldr r0, [sp] @ 4-byte Reload4631; CHECK-ARM8-NEXT: add sp, sp, #84632; CHECK-ARM8-NEXT: bx lr4633;4634; CHECK-ARM6-LABEL: test_xchg_i32:4635; CHECK-ARM6: @ %bb.0: @ %entry4636; CHECK-ARM6-NEXT: .pad #84637; CHECK-ARM6-NEXT: sub sp, sp, #84638; CHECK-ARM6-NEXT: ldr r0, .LCPI22_04639; CHECK-ARM6-NEXT: ldr r0, [r0]4640; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill4641; CHECK-ARM6-NEXT: b .LBB22_14642; CHECK-ARM6-NEXT: .LBB22_1: @ %atomicrmw.start4643; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=14644; CHECK-ARM6-NEXT: @ Child Loop BB22_2 Depth 24645; CHECK-ARM6-NEXT: ldr r1, [sp, #4] @ 4-byte Reload4646; CHECK-ARM6-NEXT: ldr r3, .LCPI22_04647; CHECK-ARM6-NEXT: mov r12, #14648; CHECK-ARM6-NEXT: .LBB22_2: @ %atomicrmw.start4649; CHECK-ARM6-NEXT: @ Parent Loop BB22_1 Depth=14650; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=24651; CHECK-ARM6-NEXT: ldrex r0, [r3]4652; CHECK-ARM6-NEXT: cmp r0, r14653; CHECK-ARM6-NEXT: bne .LBB22_44654; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start4655; CHECK-ARM6-NEXT: @ in Loop: Header=BB22_2 Depth=24656; CHECK-ARM6-NEXT: strex r2, r12, [r3]4657; CHECK-ARM6-NEXT: cmp r2, #04658; CHECK-ARM6-NEXT: bne .LBB22_24659; CHECK-ARM6-NEXT: .LBB22_4: @ %atomicrmw.start4660; CHECK-ARM6-NEXT: @ in Loop: Header=BB22_1 Depth=14661; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill4662; CHECK-ARM6-NEXT: sub r1, r0, r14663; CHECK-ARM6-NEXT: clz r1, r14664; CHECK-ARM6-NEXT: lsr r1, r1, #54665; CHECK-ARM6-NEXT: cmp r1, #14666; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill4667; CHECK-ARM6-NEXT: bne .LBB22_14668; CHECK-ARM6-NEXT: b .LBB22_54669; CHECK-ARM6-NEXT: .LBB22_5: @ %atomicrmw.end4670; CHECK-ARM6-NEXT: ldr r0, [sp] @ 4-byte Reload4671; CHECK-ARM6-NEXT: add sp, sp, #84672; CHECK-ARM6-NEXT: bx lr4673; CHECK-ARM6-NEXT: .p2align 24674; CHECK-ARM6-NEXT: @ %bb.6:4675; CHECK-ARM6-NEXT: .LCPI22_0:4676; CHECK-ARM6-NEXT: .long atomic_i324677;4678; CHECK-THUMB7-LABEL: test_xchg_i32:4679; CHECK-THUMB7: @ %bb.0: @ %entry4680; CHECK-THUMB7-NEXT: .pad #84681; CHECK-THUMB7-NEXT: sub sp, #84682; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i324683; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i324684; CHECK-THUMB7-NEXT: ldr r0, [r0]4685; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill4686; CHECK-THUMB7-NEXT: b .LBB22_14687; CHECK-THUMB7-NEXT: .LBB22_1: @ %atomicrmw.start4688; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=14689; CHECK-THUMB7-NEXT: @ Child Loop BB22_2 Depth 24690; CHECK-THUMB7-NEXT: ldr r1, [sp, #4] @ 4-byte Reload4691; CHECK-THUMB7-NEXT: movw r3, :lower16:atomic_i324692; CHECK-THUMB7-NEXT: movt r3, :upper16:atomic_i324693; CHECK-THUMB7-NEXT: mov.w r12, #14694; CHECK-THUMB7-NEXT: .LBB22_2: @ %atomicrmw.start4695; CHECK-THUMB7-NEXT: @ Parent Loop BB22_1 Depth=14696; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=24697; CHECK-THUMB7-NEXT: ldrex r0, [r3]4698; CHECK-THUMB7-NEXT: cmp r0, r14699; CHECK-THUMB7-NEXT: bne .LBB22_44700; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start4701; CHECK-THUMB7-NEXT: @ in Loop: Header=BB22_2 Depth=24702; CHECK-THUMB7-NEXT: strex r2, r12, [r3]4703; CHECK-THUMB7-NEXT: cmp r2, #04704; CHECK-THUMB7-NEXT: bne .LBB22_24705; CHECK-THUMB7-NEXT: .LBB22_4: @ %atomicrmw.start4706; CHECK-THUMB7-NEXT: @ in Loop: Header=BB22_1 Depth=14707; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill4708; CHECK-THUMB7-NEXT: subs r1, r0, r14709; CHECK-THUMB7-NEXT: clz r1, r14710; CHECK-THUMB7-NEXT: lsrs r1, r1, #54711; CHECK-THUMB7-NEXT: cmp r1, #14712; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill4713; CHECK-THUMB7-NEXT: bne .LBB22_14714; CHECK-THUMB7-NEXT: b .LBB22_54715; CHECK-THUMB7-NEXT: .LBB22_5: @ %atomicrmw.end4716; CHECK-THUMB7-NEXT: ldr r0, [sp] @ 4-byte Reload4717; CHECK-THUMB7-NEXT: add sp, #84718; CHECK-THUMB7-NEXT: bx lr4719;4720; CHECK-THUMB6-LABEL: test_xchg_i32:4721; CHECK-THUMB6: @ %bb.0: @ %entry4722; CHECK-THUMB6-NEXT: .save {r7, lr}4723; CHECK-THUMB6-NEXT: push {r7, lr}4724; CHECK-THUMB6-NEXT: ldr r0, .LCPI22_04725; CHECK-THUMB6-NEXT: movs r1, #14726; CHECK-THUMB6-NEXT: bl __sync_lock_test_and_set_44727; CHECK-THUMB6-NEXT: pop {r7, pc}4728; CHECK-THUMB6-NEXT: .p2align 24729; CHECK-THUMB6-NEXT: @ %bb.1:4730; CHECK-THUMB6-NEXT: .LCPI22_0:4731; CHECK-THUMB6-NEXT: .long atomic_i324732;4733; CHECK-THUMB8BASE-LABEL: test_xchg_i32:4734; CHECK-THUMB8BASE: @ %bb.0: @ %entry4735; CHECK-THUMB8BASE-NEXT: .save {r4, lr}4736; CHECK-THUMB8BASE-NEXT: push {r4, lr}4737; CHECK-THUMB8BASE-NEXT: .pad #84738; CHECK-THUMB8BASE-NEXT: sub sp, #84739; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i324740; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i324741; CHECK-THUMB8BASE-NEXT: ldr r0, [r0]4742; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill4743; CHECK-THUMB8BASE-NEXT: b .LBB22_14744; CHECK-THUMB8BASE-NEXT: .LBB22_1: @ %atomicrmw.start4745; CHECK-THUMB8BASE-NEXT: @ =>This Loop Header: Depth=14746; CHECK-THUMB8BASE-NEXT: @ Child Loop BB22_2 Depth 24747; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #4] @ 4-byte Reload4748; CHECK-THUMB8BASE-NEXT: movw r3, :lower16:atomic_i324749; CHECK-THUMB8BASE-NEXT: movt r3, :upper16:atomic_i324750; CHECK-THUMB8BASE-NEXT: movs r4, #14751; CHECK-THUMB8BASE-NEXT: .LBB22_2: @ %atomicrmw.start4752; CHECK-THUMB8BASE-NEXT: @ Parent Loop BB22_1 Depth=14753; CHECK-THUMB8BASE-NEXT: @ => This Inner Loop Header: Depth=24754; CHECK-THUMB8BASE-NEXT: ldrex r0, [r3]4755; CHECK-THUMB8BASE-NEXT: cmp r0, r14756; CHECK-THUMB8BASE-NEXT: bne .LBB22_44757; CHECK-THUMB8BASE-NEXT: @ %bb.3: @ %atomicrmw.start4758; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB22_2 Depth=24759; CHECK-THUMB8BASE-NEXT: strex r2, r4, [r3]4760; CHECK-THUMB8BASE-NEXT: cmp r2, #04761; CHECK-THUMB8BASE-NEXT: bne .LBB22_24762; CHECK-THUMB8BASE-NEXT: .LBB22_4: @ %atomicrmw.start4763; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB22_1 Depth=14764; CHECK-THUMB8BASE-NEXT: str r0, [sp] @ 4-byte Spill4765; CHECK-THUMB8BASE-NEXT: subs r1, r0, r14766; CHECK-THUMB8BASE-NEXT: rsbs r2, r1, #04767; CHECK-THUMB8BASE-NEXT: adcs r1, r24768; CHECK-THUMB8BASE-NEXT: cmp r1, #14769; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill4770; CHECK-THUMB8BASE-NEXT: bne .LBB22_14771; CHECK-THUMB8BASE-NEXT: b .LBB22_54772; CHECK-THUMB8BASE-NEXT: .LBB22_5: @ %atomicrmw.end4773; CHECK-THUMB8BASE-NEXT: ldr r0, [sp] @ 4-byte Reload4774; CHECK-THUMB8BASE-NEXT: add sp, #84775; CHECK-THUMB8BASE-NEXT: pop {r4, pc}4776entry:4777 %0 = atomicrmw xchg ptr @atomic_i32, i32 1 monotonic4778 ret i32 %04779}4780define i32 @test_add_i32() {4781; CHECK-ARM8-LABEL: test_add_i32:4782; CHECK-ARM8: @ %bb.0: @ %entry4783; CHECK-ARM8-NEXT: .pad #84784; CHECK-ARM8-NEXT: sub sp, sp, #84785; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i324786; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i324787; CHECK-ARM8-NEXT: ldr r0, [r0]4788; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill4789; CHECK-ARM8-NEXT: b .LBB23_14790; CHECK-ARM8-NEXT: .LBB23_1: @ %atomicrmw.start4791; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=14792; CHECK-ARM8-NEXT: @ Child Loop BB23_2 Depth 24793; CHECK-ARM8-NEXT: ldr r1, [sp, #4] @ 4-byte Reload4794; CHECK-ARM8-NEXT: add r12, r1, #14795; CHECK-ARM8-NEXT: movw r3, :lower16:atomic_i324796; CHECK-ARM8-NEXT: movt r3, :upper16:atomic_i324797; CHECK-ARM8-NEXT: .LBB23_2: @ %atomicrmw.start4798; CHECK-ARM8-NEXT: @ Parent Loop BB23_1 Depth=14799; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=24800; CHECK-ARM8-NEXT: ldrex r0, [r3]4801; CHECK-ARM8-NEXT: cmp r0, r14802; CHECK-ARM8-NEXT: bne .LBB23_44803; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start4804; CHECK-ARM8-NEXT: @ in Loop: Header=BB23_2 Depth=24805; CHECK-ARM8-NEXT: strex r2, r12, [r3]4806; CHECK-ARM8-NEXT: cmp r2, #04807; CHECK-ARM8-NEXT: bne .LBB23_24808; CHECK-ARM8-NEXT: .LBB23_4: @ %atomicrmw.start4809; CHECK-ARM8-NEXT: @ in Loop: Header=BB23_1 Depth=14810; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill4811; CHECK-ARM8-NEXT: sub r1, r0, r14812; CHECK-ARM8-NEXT: clz r1, r14813; CHECK-ARM8-NEXT: lsr r1, r1, #54814; CHECK-ARM8-NEXT: cmp r1, #14815; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill4816; CHECK-ARM8-NEXT: bne .LBB23_14817; CHECK-ARM8-NEXT: b .LBB23_54818; CHECK-ARM8-NEXT: .LBB23_5: @ %atomicrmw.end4819; CHECK-ARM8-NEXT: ldr r0, [sp] @ 4-byte Reload4820; CHECK-ARM8-NEXT: add sp, sp, #84821; CHECK-ARM8-NEXT: bx lr4822;4823; CHECK-ARM6-LABEL: test_add_i32:4824; CHECK-ARM6: @ %bb.0: @ %entry4825; CHECK-ARM6-NEXT: .pad #84826; CHECK-ARM6-NEXT: sub sp, sp, #84827; CHECK-ARM6-NEXT: ldr r0, .LCPI23_04828; CHECK-ARM6-NEXT: ldr r0, [r0]4829; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill4830; CHECK-ARM6-NEXT: b .LBB23_14831; CHECK-ARM6-NEXT: .LBB23_1: @ %atomicrmw.start4832; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=14833; CHECK-ARM6-NEXT: @ Child Loop BB23_2 Depth 24834; CHECK-ARM6-NEXT: ldr r1, [sp, #4] @ 4-byte Reload4835; CHECK-ARM6-NEXT: add r12, r1, #14836; CHECK-ARM6-NEXT: ldr r3, .LCPI23_04837; CHECK-ARM6-NEXT: .LBB23_2: @ %atomicrmw.start4838; CHECK-ARM6-NEXT: @ Parent Loop BB23_1 Depth=14839; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=24840; CHECK-ARM6-NEXT: ldrex r0, [r3]4841; CHECK-ARM6-NEXT: cmp r0, r14842; CHECK-ARM6-NEXT: bne .LBB23_44843; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start4844; CHECK-ARM6-NEXT: @ in Loop: Header=BB23_2 Depth=24845; CHECK-ARM6-NEXT: strex r2, r12, [r3]4846; CHECK-ARM6-NEXT: cmp r2, #04847; CHECK-ARM6-NEXT: bne .LBB23_24848; CHECK-ARM6-NEXT: .LBB23_4: @ %atomicrmw.start4849; CHECK-ARM6-NEXT: @ in Loop: Header=BB23_1 Depth=14850; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill4851; CHECK-ARM6-NEXT: sub r1, r0, r14852; CHECK-ARM6-NEXT: clz r1, r14853; CHECK-ARM6-NEXT: lsr r1, r1, #54854; CHECK-ARM6-NEXT: cmp r1, #14855; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill4856; CHECK-ARM6-NEXT: bne .LBB23_14857; CHECK-ARM6-NEXT: b .LBB23_54858; CHECK-ARM6-NEXT: .LBB23_5: @ %atomicrmw.end4859; CHECK-ARM6-NEXT: ldr r0, [sp] @ 4-byte Reload4860; CHECK-ARM6-NEXT: add sp, sp, #84861; CHECK-ARM6-NEXT: bx lr4862; CHECK-ARM6-NEXT: .p2align 24863; CHECK-ARM6-NEXT: @ %bb.6:4864; CHECK-ARM6-NEXT: .LCPI23_0:4865; CHECK-ARM6-NEXT: .long atomic_i324866;4867; CHECK-THUMB7-LABEL: test_add_i32:4868; CHECK-THUMB7: @ %bb.0: @ %entry4869; CHECK-THUMB7-NEXT: .pad #84870; CHECK-THUMB7-NEXT: sub sp, #84871; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i324872; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i324873; CHECK-THUMB7-NEXT: ldr r0, [r0]4874; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill4875; CHECK-THUMB7-NEXT: b .LBB23_14876; CHECK-THUMB7-NEXT: .LBB23_1: @ %atomicrmw.start4877; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=14878; CHECK-THUMB7-NEXT: @ Child Loop BB23_2 Depth 24879; CHECK-THUMB7-NEXT: ldr r1, [sp, #4] @ 4-byte Reload4880; CHECK-THUMB7-NEXT: add.w r12, r1, #14881; CHECK-THUMB7-NEXT: movw r3, :lower16:atomic_i324882; CHECK-THUMB7-NEXT: movt r3, :upper16:atomic_i324883; CHECK-THUMB7-NEXT: .LBB23_2: @ %atomicrmw.start4884; CHECK-THUMB7-NEXT: @ Parent Loop BB23_1 Depth=14885; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=24886; CHECK-THUMB7-NEXT: ldrex r0, [r3]4887; CHECK-THUMB7-NEXT: cmp r0, r14888; CHECK-THUMB7-NEXT: bne .LBB23_44889; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start4890; CHECK-THUMB7-NEXT: @ in Loop: Header=BB23_2 Depth=24891; CHECK-THUMB7-NEXT: strex r2, r12, [r3]4892; CHECK-THUMB7-NEXT: cmp r2, #04893; CHECK-THUMB7-NEXT: bne .LBB23_24894; CHECK-THUMB7-NEXT: .LBB23_4: @ %atomicrmw.start4895; CHECK-THUMB7-NEXT: @ in Loop: Header=BB23_1 Depth=14896; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill4897; CHECK-THUMB7-NEXT: subs r1, r0, r14898; CHECK-THUMB7-NEXT: clz r1, r14899; CHECK-THUMB7-NEXT: lsrs r1, r1, #54900; CHECK-THUMB7-NEXT: cmp r1, #14901; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill4902; CHECK-THUMB7-NEXT: bne .LBB23_14903; CHECK-THUMB7-NEXT: b .LBB23_54904; CHECK-THUMB7-NEXT: .LBB23_5: @ %atomicrmw.end4905; CHECK-THUMB7-NEXT: ldr r0, [sp] @ 4-byte Reload4906; CHECK-THUMB7-NEXT: add sp, #84907; CHECK-THUMB7-NEXT: bx lr4908;4909; CHECK-THUMB6-LABEL: test_add_i32:4910; CHECK-THUMB6: @ %bb.0: @ %entry4911; CHECK-THUMB6-NEXT: .save {r7, lr}4912; CHECK-THUMB6-NEXT: push {r7, lr}4913; CHECK-THUMB6-NEXT: ldr r0, .LCPI23_04914; CHECK-THUMB6-NEXT: movs r1, #14915; CHECK-THUMB6-NEXT: bl __sync_fetch_and_add_44916; CHECK-THUMB6-NEXT: pop {r7, pc}4917; CHECK-THUMB6-NEXT: .p2align 24918; CHECK-THUMB6-NEXT: @ %bb.1:4919; CHECK-THUMB6-NEXT: .LCPI23_0:4920; CHECK-THUMB6-NEXT: .long atomic_i324921;4922; CHECK-THUMB8BASE-LABEL: test_add_i32:4923; CHECK-THUMB8BASE: @ %bb.0: @ %entry4924; CHECK-THUMB8BASE-NEXT: .save {r4, lr}4925; CHECK-THUMB8BASE-NEXT: push {r4, lr}4926; CHECK-THUMB8BASE-NEXT: .pad #84927; CHECK-THUMB8BASE-NEXT: sub sp, #84928; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i324929; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i324930; CHECK-THUMB8BASE-NEXT: ldr r0, [r0]4931; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill4932; CHECK-THUMB8BASE-NEXT: b .LBB23_14933; CHECK-THUMB8BASE-NEXT: .LBB23_1: @ %atomicrmw.start4934; CHECK-THUMB8BASE-NEXT: @ =>This Loop Header: Depth=14935; CHECK-THUMB8BASE-NEXT: @ Child Loop BB23_2 Depth 24936; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #4] @ 4-byte Reload4937; CHECK-THUMB8BASE-NEXT: adds r4, r1, #14938; CHECK-THUMB8BASE-NEXT: movw r3, :lower16:atomic_i324939; CHECK-THUMB8BASE-NEXT: movt r3, :upper16:atomic_i324940; CHECK-THUMB8BASE-NEXT: .LBB23_2: @ %atomicrmw.start4941; CHECK-THUMB8BASE-NEXT: @ Parent Loop BB23_1 Depth=14942; CHECK-THUMB8BASE-NEXT: @ => This Inner Loop Header: Depth=24943; CHECK-THUMB8BASE-NEXT: ldrex r0, [r3]4944; CHECK-THUMB8BASE-NEXT: cmp r0, r14945; CHECK-THUMB8BASE-NEXT: bne .LBB23_44946; CHECK-THUMB8BASE-NEXT: @ %bb.3: @ %atomicrmw.start4947; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB23_2 Depth=24948; CHECK-THUMB8BASE-NEXT: strex r2, r4, [r3]4949; CHECK-THUMB8BASE-NEXT: cmp r2, #04950; CHECK-THUMB8BASE-NEXT: bne .LBB23_24951; CHECK-THUMB8BASE-NEXT: .LBB23_4: @ %atomicrmw.start4952; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB23_1 Depth=14953; CHECK-THUMB8BASE-NEXT: str r0, [sp] @ 4-byte Spill4954; CHECK-THUMB8BASE-NEXT: subs r1, r0, r14955; CHECK-THUMB8BASE-NEXT: rsbs r2, r1, #04956; CHECK-THUMB8BASE-NEXT: adcs r1, r24957; CHECK-THUMB8BASE-NEXT: cmp r1, #14958; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill4959; CHECK-THUMB8BASE-NEXT: bne .LBB23_14960; CHECK-THUMB8BASE-NEXT: b .LBB23_54961; CHECK-THUMB8BASE-NEXT: .LBB23_5: @ %atomicrmw.end4962; CHECK-THUMB8BASE-NEXT: ldr r0, [sp] @ 4-byte Reload4963; CHECK-THUMB8BASE-NEXT: add sp, #84964; CHECK-THUMB8BASE-NEXT: pop {r4, pc}4965entry:4966 %0 = atomicrmw add ptr @atomic_i32, i32 1 monotonic4967 ret i32 %04968}4969define i32 @test_sub_i32() {4970; CHECK-ARM8-LABEL: test_sub_i32:4971; CHECK-ARM8: @ %bb.0: @ %entry4972; CHECK-ARM8-NEXT: .pad #84973; CHECK-ARM8-NEXT: sub sp, sp, #84974; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i324975; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i324976; CHECK-ARM8-NEXT: ldr r0, [r0]4977; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill4978; CHECK-ARM8-NEXT: b .LBB24_14979; CHECK-ARM8-NEXT: .LBB24_1: @ %atomicrmw.start4980; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=14981; CHECK-ARM8-NEXT: @ Child Loop BB24_2 Depth 24982; CHECK-ARM8-NEXT: ldr r1, [sp, #4] @ 4-byte Reload4983; CHECK-ARM8-NEXT: sub r12, r1, #14984; CHECK-ARM8-NEXT: movw r3, :lower16:atomic_i324985; CHECK-ARM8-NEXT: movt r3, :upper16:atomic_i324986; CHECK-ARM8-NEXT: .LBB24_2: @ %atomicrmw.start4987; CHECK-ARM8-NEXT: @ Parent Loop BB24_1 Depth=14988; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=24989; CHECK-ARM8-NEXT: ldrex r0, [r3]4990; CHECK-ARM8-NEXT: cmp r0, r14991; CHECK-ARM8-NEXT: bne .LBB24_44992; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start4993; CHECK-ARM8-NEXT: @ in Loop: Header=BB24_2 Depth=24994; CHECK-ARM8-NEXT: strex r2, r12, [r3]4995; CHECK-ARM8-NEXT: cmp r2, #04996; CHECK-ARM8-NEXT: bne .LBB24_24997; CHECK-ARM8-NEXT: .LBB24_4: @ %atomicrmw.start4998; CHECK-ARM8-NEXT: @ in Loop: Header=BB24_1 Depth=14999; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill5000; CHECK-ARM8-NEXT: sub r1, r0, r15001; CHECK-ARM8-NEXT: clz r1, r15002; CHECK-ARM8-NEXT: lsr r1, r1, #55003; CHECK-ARM8-NEXT: cmp r1, #15004; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill5005; CHECK-ARM8-NEXT: bne .LBB24_15006; CHECK-ARM8-NEXT: b .LBB24_55007; CHECK-ARM8-NEXT: .LBB24_5: @ %atomicrmw.end5008; CHECK-ARM8-NEXT: ldr r0, [sp] @ 4-byte Reload5009; CHECK-ARM8-NEXT: add sp, sp, #85010; CHECK-ARM8-NEXT: bx lr5011;5012; CHECK-ARM6-LABEL: test_sub_i32:5013; CHECK-ARM6: @ %bb.0: @ %entry5014; CHECK-ARM6-NEXT: .pad #85015; CHECK-ARM6-NEXT: sub sp, sp, #85016; CHECK-ARM6-NEXT: ldr r0, .LCPI24_05017; CHECK-ARM6-NEXT: ldr r0, [r0]5018; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill5019; CHECK-ARM6-NEXT: b .LBB24_15020; CHECK-ARM6-NEXT: .LBB24_1: @ %atomicrmw.start5021; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=15022; CHECK-ARM6-NEXT: @ Child Loop BB24_2 Depth 25023; CHECK-ARM6-NEXT: ldr r1, [sp, #4] @ 4-byte Reload5024; CHECK-ARM6-NEXT: sub r12, r1, #15025; CHECK-ARM6-NEXT: ldr r3, .LCPI24_05026; CHECK-ARM6-NEXT: .LBB24_2: @ %atomicrmw.start5027; CHECK-ARM6-NEXT: @ Parent Loop BB24_1 Depth=15028; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=25029; CHECK-ARM6-NEXT: ldrex r0, [r3]5030; CHECK-ARM6-NEXT: cmp r0, r15031; CHECK-ARM6-NEXT: bne .LBB24_45032; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start5033; CHECK-ARM6-NEXT: @ in Loop: Header=BB24_2 Depth=25034; CHECK-ARM6-NEXT: strex r2, r12, [r3]5035; CHECK-ARM6-NEXT: cmp r2, #05036; CHECK-ARM6-NEXT: bne .LBB24_25037; CHECK-ARM6-NEXT: .LBB24_4: @ %atomicrmw.start5038; CHECK-ARM6-NEXT: @ in Loop: Header=BB24_1 Depth=15039; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill5040; CHECK-ARM6-NEXT: sub r1, r0, r15041; CHECK-ARM6-NEXT: clz r1, r15042; CHECK-ARM6-NEXT: lsr r1, r1, #55043; CHECK-ARM6-NEXT: cmp r1, #15044; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill5045; CHECK-ARM6-NEXT: bne .LBB24_15046; CHECK-ARM6-NEXT: b .LBB24_55047; CHECK-ARM6-NEXT: .LBB24_5: @ %atomicrmw.end5048; CHECK-ARM6-NEXT: ldr r0, [sp] @ 4-byte Reload5049; CHECK-ARM6-NEXT: add sp, sp, #85050; CHECK-ARM6-NEXT: bx lr5051; CHECK-ARM6-NEXT: .p2align 25052; CHECK-ARM6-NEXT: @ %bb.6:5053; CHECK-ARM6-NEXT: .LCPI24_0:5054; CHECK-ARM6-NEXT: .long atomic_i325055;5056; CHECK-THUMB7-LABEL: test_sub_i32:5057; CHECK-THUMB7: @ %bb.0: @ %entry5058; CHECK-THUMB7-NEXT: .pad #85059; CHECK-THUMB7-NEXT: sub sp, #85060; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i325061; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i325062; CHECK-THUMB7-NEXT: ldr r0, [r0]5063; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill5064; CHECK-THUMB7-NEXT: b .LBB24_15065; CHECK-THUMB7-NEXT: .LBB24_1: @ %atomicrmw.start5066; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=15067; CHECK-THUMB7-NEXT: @ Child Loop BB24_2 Depth 25068; CHECK-THUMB7-NEXT: ldr r1, [sp, #4] @ 4-byte Reload5069; CHECK-THUMB7-NEXT: sub.w r12, r1, #15070; CHECK-THUMB7-NEXT: movw r3, :lower16:atomic_i325071; CHECK-THUMB7-NEXT: movt r3, :upper16:atomic_i325072; CHECK-THUMB7-NEXT: .LBB24_2: @ %atomicrmw.start5073; CHECK-THUMB7-NEXT: @ Parent Loop BB24_1 Depth=15074; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=25075; CHECK-THUMB7-NEXT: ldrex r0, [r3]5076; CHECK-THUMB7-NEXT: cmp r0, r15077; CHECK-THUMB7-NEXT: bne .LBB24_45078; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start5079; CHECK-THUMB7-NEXT: @ in Loop: Header=BB24_2 Depth=25080; CHECK-THUMB7-NEXT: strex r2, r12, [r3]5081; CHECK-THUMB7-NEXT: cmp r2, #05082; CHECK-THUMB7-NEXT: bne .LBB24_25083; CHECK-THUMB7-NEXT: .LBB24_4: @ %atomicrmw.start5084; CHECK-THUMB7-NEXT: @ in Loop: Header=BB24_1 Depth=15085; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill5086; CHECK-THUMB7-NEXT: subs r1, r0, r15087; CHECK-THUMB7-NEXT: clz r1, r15088; CHECK-THUMB7-NEXT: lsrs r1, r1, #55089; CHECK-THUMB7-NEXT: cmp r1, #15090; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill5091; CHECK-THUMB7-NEXT: bne .LBB24_15092; CHECK-THUMB7-NEXT: b .LBB24_55093; CHECK-THUMB7-NEXT: .LBB24_5: @ %atomicrmw.end5094; CHECK-THUMB7-NEXT: ldr r0, [sp] @ 4-byte Reload5095; CHECK-THUMB7-NEXT: add sp, #85096; CHECK-THUMB7-NEXT: bx lr5097;5098; CHECK-THUMB6-LABEL: test_sub_i32:5099; CHECK-THUMB6: @ %bb.0: @ %entry5100; CHECK-THUMB6-NEXT: .save {r7, lr}5101; CHECK-THUMB6-NEXT: push {r7, lr}5102; CHECK-THUMB6-NEXT: ldr r0, .LCPI24_05103; CHECK-THUMB6-NEXT: movs r1, #15104; CHECK-THUMB6-NEXT: bl __sync_fetch_and_sub_45105; CHECK-THUMB6-NEXT: pop {r7, pc}5106; CHECK-THUMB6-NEXT: .p2align 25107; CHECK-THUMB6-NEXT: @ %bb.1:5108; CHECK-THUMB6-NEXT: .LCPI24_0:5109; CHECK-THUMB6-NEXT: .long atomic_i325110;5111; CHECK-THUMB8BASE-LABEL: test_sub_i32:5112; CHECK-THUMB8BASE: @ %bb.0: @ %entry5113; CHECK-THUMB8BASE-NEXT: .save {r4, lr}5114; CHECK-THUMB8BASE-NEXT: push {r4, lr}5115; CHECK-THUMB8BASE-NEXT: .pad #85116; CHECK-THUMB8BASE-NEXT: sub sp, #85117; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i325118; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i325119; CHECK-THUMB8BASE-NEXT: ldr r0, [r0]5120; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill5121; CHECK-THUMB8BASE-NEXT: b .LBB24_15122; CHECK-THUMB8BASE-NEXT: .LBB24_1: @ %atomicrmw.start5123; CHECK-THUMB8BASE-NEXT: @ =>This Loop Header: Depth=15124; CHECK-THUMB8BASE-NEXT: @ Child Loop BB24_2 Depth 25125; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #4] @ 4-byte Reload5126; CHECK-THUMB8BASE-NEXT: subs r4, r1, #15127; CHECK-THUMB8BASE-NEXT: movw r3, :lower16:atomic_i325128; CHECK-THUMB8BASE-NEXT: movt r3, :upper16:atomic_i325129; CHECK-THUMB8BASE-NEXT: .LBB24_2: @ %atomicrmw.start5130; CHECK-THUMB8BASE-NEXT: @ Parent Loop BB24_1 Depth=15131; CHECK-THUMB8BASE-NEXT: @ => This Inner Loop Header: Depth=25132; CHECK-THUMB8BASE-NEXT: ldrex r0, [r3]5133; CHECK-THUMB8BASE-NEXT: cmp r0, r15134; CHECK-THUMB8BASE-NEXT: bne .LBB24_45135; CHECK-THUMB8BASE-NEXT: @ %bb.3: @ %atomicrmw.start5136; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB24_2 Depth=25137; CHECK-THUMB8BASE-NEXT: strex r2, r4, [r3]5138; CHECK-THUMB8BASE-NEXT: cmp r2, #05139; CHECK-THUMB8BASE-NEXT: bne .LBB24_25140; CHECK-THUMB8BASE-NEXT: .LBB24_4: @ %atomicrmw.start5141; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB24_1 Depth=15142; CHECK-THUMB8BASE-NEXT: str r0, [sp] @ 4-byte Spill5143; CHECK-THUMB8BASE-NEXT: subs r1, r0, r15144; CHECK-THUMB8BASE-NEXT: rsbs r2, r1, #05145; CHECK-THUMB8BASE-NEXT: adcs r1, r25146; CHECK-THUMB8BASE-NEXT: cmp r1, #15147; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill5148; CHECK-THUMB8BASE-NEXT: bne .LBB24_15149; CHECK-THUMB8BASE-NEXT: b .LBB24_55150; CHECK-THUMB8BASE-NEXT: .LBB24_5: @ %atomicrmw.end5151; CHECK-THUMB8BASE-NEXT: ldr r0, [sp] @ 4-byte Reload5152; CHECK-THUMB8BASE-NEXT: add sp, #85153; CHECK-THUMB8BASE-NEXT: pop {r4, pc}5154entry:5155 %0 = atomicrmw sub ptr @atomic_i32, i32 1 monotonic5156 ret i32 %05157}5158define i32 @test_and_i32() {5159; CHECK-ARM8-LABEL: test_and_i32:5160; CHECK-ARM8: @ %bb.0: @ %entry5161; CHECK-ARM8-NEXT: .pad #85162; CHECK-ARM8-NEXT: sub sp, sp, #85163; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i325164; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i325165; CHECK-ARM8-NEXT: ldr r0, [r0]5166; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill5167; CHECK-ARM8-NEXT: b .LBB25_15168; CHECK-ARM8-NEXT: .LBB25_1: @ %atomicrmw.start5169; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=15170; CHECK-ARM8-NEXT: @ Child Loop BB25_2 Depth 25171; CHECK-ARM8-NEXT: ldr r1, [sp, #4] @ 4-byte Reload5172; CHECK-ARM8-NEXT: and r12, r1, #15173; CHECK-ARM8-NEXT: movw r3, :lower16:atomic_i325174; CHECK-ARM8-NEXT: movt r3, :upper16:atomic_i325175; CHECK-ARM8-NEXT: .LBB25_2: @ %atomicrmw.start5176; CHECK-ARM8-NEXT: @ Parent Loop BB25_1 Depth=15177; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=25178; CHECK-ARM8-NEXT: ldrex r0, [r3]5179; CHECK-ARM8-NEXT: cmp r0, r15180; CHECK-ARM8-NEXT: bne .LBB25_45181; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start5182; CHECK-ARM8-NEXT: @ in Loop: Header=BB25_2 Depth=25183; CHECK-ARM8-NEXT: strex r2, r12, [r3]5184; CHECK-ARM8-NEXT: cmp r2, #05185; CHECK-ARM8-NEXT: bne .LBB25_25186; CHECK-ARM8-NEXT: .LBB25_4: @ %atomicrmw.start5187; CHECK-ARM8-NEXT: @ in Loop: Header=BB25_1 Depth=15188; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill5189; CHECK-ARM8-NEXT: sub r1, r0, r15190; CHECK-ARM8-NEXT: clz r1, r15191; CHECK-ARM8-NEXT: lsr r1, r1, #55192; CHECK-ARM8-NEXT: cmp r1, #15193; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill5194; CHECK-ARM8-NEXT: bne .LBB25_15195; CHECK-ARM8-NEXT: b .LBB25_55196; CHECK-ARM8-NEXT: .LBB25_5: @ %atomicrmw.end5197; CHECK-ARM8-NEXT: ldr r0, [sp] @ 4-byte Reload5198; CHECK-ARM8-NEXT: add sp, sp, #85199; CHECK-ARM8-NEXT: bx lr5200;5201; CHECK-ARM6-LABEL: test_and_i32:5202; CHECK-ARM6: @ %bb.0: @ %entry5203; CHECK-ARM6-NEXT: .pad #85204; CHECK-ARM6-NEXT: sub sp, sp, #85205; CHECK-ARM6-NEXT: ldr r0, .LCPI25_05206; CHECK-ARM6-NEXT: ldr r0, [r0]5207; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill5208; CHECK-ARM6-NEXT: b .LBB25_15209; CHECK-ARM6-NEXT: .LBB25_1: @ %atomicrmw.start5210; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=15211; CHECK-ARM6-NEXT: @ Child Loop BB25_2 Depth 25212; CHECK-ARM6-NEXT: ldr r1, [sp, #4] @ 4-byte Reload5213; CHECK-ARM6-NEXT: and r12, r1, #15214; CHECK-ARM6-NEXT: ldr r3, .LCPI25_05215; CHECK-ARM6-NEXT: .LBB25_2: @ %atomicrmw.start5216; CHECK-ARM6-NEXT: @ Parent Loop BB25_1 Depth=15217; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=25218; CHECK-ARM6-NEXT: ldrex r0, [r3]5219; CHECK-ARM6-NEXT: cmp r0, r15220; CHECK-ARM6-NEXT: bne .LBB25_45221; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start5222; CHECK-ARM6-NEXT: @ in Loop: Header=BB25_2 Depth=25223; CHECK-ARM6-NEXT: strex r2, r12, [r3]5224; CHECK-ARM6-NEXT: cmp r2, #05225; CHECK-ARM6-NEXT: bne .LBB25_25226; CHECK-ARM6-NEXT: .LBB25_4: @ %atomicrmw.start5227; CHECK-ARM6-NEXT: @ in Loop: Header=BB25_1 Depth=15228; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill5229; CHECK-ARM6-NEXT: sub r1, r0, r15230; CHECK-ARM6-NEXT: clz r1, r15231; CHECK-ARM6-NEXT: lsr r1, r1, #55232; CHECK-ARM6-NEXT: cmp r1, #15233; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill5234; CHECK-ARM6-NEXT: bne .LBB25_15235; CHECK-ARM6-NEXT: b .LBB25_55236; CHECK-ARM6-NEXT: .LBB25_5: @ %atomicrmw.end5237; CHECK-ARM6-NEXT: ldr r0, [sp] @ 4-byte Reload5238; CHECK-ARM6-NEXT: add sp, sp, #85239; CHECK-ARM6-NEXT: bx lr5240; CHECK-ARM6-NEXT: .p2align 25241; CHECK-ARM6-NEXT: @ %bb.6:5242; CHECK-ARM6-NEXT: .LCPI25_0:5243; CHECK-ARM6-NEXT: .long atomic_i325244;5245; CHECK-THUMB7-LABEL: test_and_i32:5246; CHECK-THUMB7: @ %bb.0: @ %entry5247; CHECK-THUMB7-NEXT: .pad #85248; CHECK-THUMB7-NEXT: sub sp, #85249; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i325250; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i325251; CHECK-THUMB7-NEXT: ldr r0, [r0]5252; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill5253; CHECK-THUMB7-NEXT: b .LBB25_15254; CHECK-THUMB7-NEXT: .LBB25_1: @ %atomicrmw.start5255; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=15256; CHECK-THUMB7-NEXT: @ Child Loop BB25_2 Depth 25257; CHECK-THUMB7-NEXT: ldr r1, [sp, #4] @ 4-byte Reload5258; CHECK-THUMB7-NEXT: and r12, r1, #15259; CHECK-THUMB7-NEXT: movw r3, :lower16:atomic_i325260; CHECK-THUMB7-NEXT: movt r3, :upper16:atomic_i325261; CHECK-THUMB7-NEXT: .LBB25_2: @ %atomicrmw.start5262; CHECK-THUMB7-NEXT: @ Parent Loop BB25_1 Depth=15263; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=25264; CHECK-THUMB7-NEXT: ldrex r0, [r3]5265; CHECK-THUMB7-NEXT: cmp r0, r15266; CHECK-THUMB7-NEXT: bne .LBB25_45267; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start5268; CHECK-THUMB7-NEXT: @ in Loop: Header=BB25_2 Depth=25269; CHECK-THUMB7-NEXT: strex r2, r12, [r3]5270; CHECK-THUMB7-NEXT: cmp r2, #05271; CHECK-THUMB7-NEXT: bne .LBB25_25272; CHECK-THUMB7-NEXT: .LBB25_4: @ %atomicrmw.start5273; CHECK-THUMB7-NEXT: @ in Loop: Header=BB25_1 Depth=15274; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill5275; CHECK-THUMB7-NEXT: subs r1, r0, r15276; CHECK-THUMB7-NEXT: clz r1, r15277; CHECK-THUMB7-NEXT: lsrs r1, r1, #55278; CHECK-THUMB7-NEXT: cmp r1, #15279; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill5280; CHECK-THUMB7-NEXT: bne .LBB25_15281; CHECK-THUMB7-NEXT: b .LBB25_55282; CHECK-THUMB7-NEXT: .LBB25_5: @ %atomicrmw.end5283; CHECK-THUMB7-NEXT: ldr r0, [sp] @ 4-byte Reload5284; CHECK-THUMB7-NEXT: add sp, #85285; CHECK-THUMB7-NEXT: bx lr5286;5287; CHECK-THUMB6-LABEL: test_and_i32:5288; CHECK-THUMB6: @ %bb.0: @ %entry5289; CHECK-THUMB6-NEXT: .save {r7, lr}5290; CHECK-THUMB6-NEXT: push {r7, lr}5291; CHECK-THUMB6-NEXT: ldr r0, .LCPI25_05292; CHECK-THUMB6-NEXT: movs r1, #15293; CHECK-THUMB6-NEXT: bl __sync_fetch_and_and_45294; CHECK-THUMB6-NEXT: pop {r7, pc}5295; CHECK-THUMB6-NEXT: .p2align 25296; CHECK-THUMB6-NEXT: @ %bb.1:5297; CHECK-THUMB6-NEXT: .LCPI25_0:5298; CHECK-THUMB6-NEXT: .long atomic_i325299;5300; CHECK-THUMB8BASE-LABEL: test_and_i32:5301; CHECK-THUMB8BASE: @ %bb.0: @ %entry5302; CHECK-THUMB8BASE-NEXT: .save {r4, lr}5303; CHECK-THUMB8BASE-NEXT: push {r4, lr}5304; CHECK-THUMB8BASE-NEXT: .pad #85305; CHECK-THUMB8BASE-NEXT: sub sp, #85306; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i325307; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i325308; CHECK-THUMB8BASE-NEXT: ldr r0, [r0]5309; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill5310; CHECK-THUMB8BASE-NEXT: b .LBB25_15311; CHECK-THUMB8BASE-NEXT: .LBB25_1: @ %atomicrmw.start5312; CHECK-THUMB8BASE-NEXT: @ =>This Loop Header: Depth=15313; CHECK-THUMB8BASE-NEXT: @ Child Loop BB25_2 Depth 25314; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #4] @ 4-byte Reload5315; CHECK-THUMB8BASE-NEXT: movs r0, #15316; CHECK-THUMB8BASE-NEXT: mov r4, r15317; CHECK-THUMB8BASE-NEXT: ands r4, r05318; CHECK-THUMB8BASE-NEXT: movw r3, :lower16:atomic_i325319; CHECK-THUMB8BASE-NEXT: movt r3, :upper16:atomic_i325320; CHECK-THUMB8BASE-NEXT: .LBB25_2: @ %atomicrmw.start5321; CHECK-THUMB8BASE-NEXT: @ Parent Loop BB25_1 Depth=15322; CHECK-THUMB8BASE-NEXT: @ => This Inner Loop Header: Depth=25323; CHECK-THUMB8BASE-NEXT: ldrex r0, [r3]5324; CHECK-THUMB8BASE-NEXT: cmp r0, r15325; CHECK-THUMB8BASE-NEXT: bne .LBB25_45326; CHECK-THUMB8BASE-NEXT: @ %bb.3: @ %atomicrmw.start5327; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB25_2 Depth=25328; CHECK-THUMB8BASE-NEXT: strex r2, r4, [r3]5329; CHECK-THUMB8BASE-NEXT: cmp r2, #05330; CHECK-THUMB8BASE-NEXT: bne .LBB25_25331; CHECK-THUMB8BASE-NEXT: .LBB25_4: @ %atomicrmw.start5332; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB25_1 Depth=15333; CHECK-THUMB8BASE-NEXT: str r0, [sp] @ 4-byte Spill5334; CHECK-THUMB8BASE-NEXT: subs r1, r0, r15335; CHECK-THUMB8BASE-NEXT: rsbs r2, r1, #05336; CHECK-THUMB8BASE-NEXT: adcs r1, r25337; CHECK-THUMB8BASE-NEXT: cmp r1, #15338; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill5339; CHECK-THUMB8BASE-NEXT: bne .LBB25_15340; CHECK-THUMB8BASE-NEXT: b .LBB25_55341; CHECK-THUMB8BASE-NEXT: .LBB25_5: @ %atomicrmw.end5342; CHECK-THUMB8BASE-NEXT: ldr r0, [sp] @ 4-byte Reload5343; CHECK-THUMB8BASE-NEXT: add sp, #85344; CHECK-THUMB8BASE-NEXT: pop {r4, pc}5345entry:5346 %0 = atomicrmw and ptr @atomic_i32, i32 1 monotonic5347 ret i32 %05348}5349define i32 @test_nand_i32() {5350; CHECK-ARM8-LABEL: test_nand_i32:5351; CHECK-ARM8: @ %bb.0: @ %entry5352; CHECK-ARM8-NEXT: .pad #85353; CHECK-ARM8-NEXT: sub sp, sp, #85354; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i325355; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i325356; CHECK-ARM8-NEXT: ldr r0, [r0]5357; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill5358; CHECK-ARM8-NEXT: b .LBB26_15359; CHECK-ARM8-NEXT: .LBB26_1: @ %atomicrmw.start5360; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=15361; CHECK-ARM8-NEXT: @ Child Loop BB26_2 Depth 25362; CHECK-ARM8-NEXT: ldr r1, [sp, #4] @ 4-byte Reload5363; CHECK-ARM8-NEXT: mvn r0, r15364; CHECK-ARM8-NEXT: mvn r2, #15365; CHECK-ARM8-NEXT: orr r12, r0, r25366; CHECK-ARM8-NEXT: movw r3, :lower16:atomic_i325367; CHECK-ARM8-NEXT: movt r3, :upper16:atomic_i325368; CHECK-ARM8-NEXT: .LBB26_2: @ %atomicrmw.start5369; CHECK-ARM8-NEXT: @ Parent Loop BB26_1 Depth=15370; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=25371; CHECK-ARM8-NEXT: ldrex r0, [r3]5372; CHECK-ARM8-NEXT: cmp r0, r15373; CHECK-ARM8-NEXT: bne .LBB26_45374; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start5375; CHECK-ARM8-NEXT: @ in Loop: Header=BB26_2 Depth=25376; CHECK-ARM8-NEXT: strex r2, r12, [r3]5377; CHECK-ARM8-NEXT: cmp r2, #05378; CHECK-ARM8-NEXT: bne .LBB26_25379; CHECK-ARM8-NEXT: .LBB26_4: @ %atomicrmw.start5380; CHECK-ARM8-NEXT: @ in Loop: Header=BB26_1 Depth=15381; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill5382; CHECK-ARM8-NEXT: sub r1, r0, r15383; CHECK-ARM8-NEXT: clz r1, r15384; CHECK-ARM8-NEXT: lsr r1, r1, #55385; CHECK-ARM8-NEXT: cmp r1, #15386; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill5387; CHECK-ARM8-NEXT: bne .LBB26_15388; CHECK-ARM8-NEXT: b .LBB26_55389; CHECK-ARM8-NEXT: .LBB26_5: @ %atomicrmw.end5390; CHECK-ARM8-NEXT: ldr r0, [sp] @ 4-byte Reload5391; CHECK-ARM8-NEXT: add sp, sp, #85392; CHECK-ARM8-NEXT: bx lr5393;5394; CHECK-ARM6-LABEL: test_nand_i32:5395; CHECK-ARM6: @ %bb.0: @ %entry5396; CHECK-ARM6-NEXT: .pad #85397; CHECK-ARM6-NEXT: sub sp, sp, #85398; CHECK-ARM6-NEXT: ldr r0, .LCPI26_05399; CHECK-ARM6-NEXT: ldr r0, [r0]5400; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill5401; CHECK-ARM6-NEXT: b .LBB26_15402; CHECK-ARM6-NEXT: .LBB26_1: @ %atomicrmw.start5403; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=15404; CHECK-ARM6-NEXT: @ Child Loop BB26_2 Depth 25405; CHECK-ARM6-NEXT: ldr r1, [sp, #4] @ 4-byte Reload5406; CHECK-ARM6-NEXT: mvn r0, r15407; CHECK-ARM6-NEXT: mvn r2, #15408; CHECK-ARM6-NEXT: orr r12, r0, r25409; CHECK-ARM6-NEXT: ldr r3, .LCPI26_05410; CHECK-ARM6-NEXT: .LBB26_2: @ %atomicrmw.start5411; CHECK-ARM6-NEXT: @ Parent Loop BB26_1 Depth=15412; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=25413; CHECK-ARM6-NEXT: ldrex r0, [r3]5414; CHECK-ARM6-NEXT: cmp r0, r15415; CHECK-ARM6-NEXT: bne .LBB26_45416; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start5417; CHECK-ARM6-NEXT: @ in Loop: Header=BB26_2 Depth=25418; CHECK-ARM6-NEXT: strex r2, r12, [r3]5419; CHECK-ARM6-NEXT: cmp r2, #05420; CHECK-ARM6-NEXT: bne .LBB26_25421; CHECK-ARM6-NEXT: .LBB26_4: @ %atomicrmw.start5422; CHECK-ARM6-NEXT: @ in Loop: Header=BB26_1 Depth=15423; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill5424; CHECK-ARM6-NEXT: sub r1, r0, r15425; CHECK-ARM6-NEXT: clz r1, r15426; CHECK-ARM6-NEXT: lsr r1, r1, #55427; CHECK-ARM6-NEXT: cmp r1, #15428; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill5429; CHECK-ARM6-NEXT: bne .LBB26_15430; CHECK-ARM6-NEXT: b .LBB26_55431; CHECK-ARM6-NEXT: .LBB26_5: @ %atomicrmw.end5432; CHECK-ARM6-NEXT: ldr r0, [sp] @ 4-byte Reload5433; CHECK-ARM6-NEXT: add sp, sp, #85434; CHECK-ARM6-NEXT: bx lr5435; CHECK-ARM6-NEXT: .p2align 25436; CHECK-ARM6-NEXT: @ %bb.6:5437; CHECK-ARM6-NEXT: .LCPI26_0:5438; CHECK-ARM6-NEXT: .long atomic_i325439;5440; CHECK-THUMB7-LABEL: test_nand_i32:5441; CHECK-THUMB7: @ %bb.0: @ %entry5442; CHECK-THUMB7-NEXT: .pad #85443; CHECK-THUMB7-NEXT: sub sp, #85444; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i325445; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i325446; CHECK-THUMB7-NEXT: ldr r0, [r0]5447; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill5448; CHECK-THUMB7-NEXT: b .LBB26_15449; CHECK-THUMB7-NEXT: .LBB26_1: @ %atomicrmw.start5450; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=15451; CHECK-THUMB7-NEXT: @ Child Loop BB26_2 Depth 25452; CHECK-THUMB7-NEXT: ldr r1, [sp, #4] @ 4-byte Reload5453; CHECK-THUMB7-NEXT: mvn r0, #15454; CHECK-THUMB7-NEXT: orn r12, r0, r15455; CHECK-THUMB7-NEXT: movw r3, :lower16:atomic_i325456; CHECK-THUMB7-NEXT: movt r3, :upper16:atomic_i325457; CHECK-THUMB7-NEXT: .LBB26_2: @ %atomicrmw.start5458; CHECK-THUMB7-NEXT: @ Parent Loop BB26_1 Depth=15459; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=25460; CHECK-THUMB7-NEXT: ldrex r0, [r3]5461; CHECK-THUMB7-NEXT: cmp r0, r15462; CHECK-THUMB7-NEXT: bne .LBB26_45463; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start5464; CHECK-THUMB7-NEXT: @ in Loop: Header=BB26_2 Depth=25465; CHECK-THUMB7-NEXT: strex r2, r12, [r3]5466; CHECK-THUMB7-NEXT: cmp r2, #05467; CHECK-THUMB7-NEXT: bne .LBB26_25468; CHECK-THUMB7-NEXT: .LBB26_4: @ %atomicrmw.start5469; CHECK-THUMB7-NEXT: @ in Loop: Header=BB26_1 Depth=15470; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill5471; CHECK-THUMB7-NEXT: subs r1, r0, r15472; CHECK-THUMB7-NEXT: clz r1, r15473; CHECK-THUMB7-NEXT: lsrs r1, r1, #55474; CHECK-THUMB7-NEXT: cmp r1, #15475; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill5476; CHECK-THUMB7-NEXT: bne .LBB26_15477; CHECK-THUMB7-NEXT: b .LBB26_55478; CHECK-THUMB7-NEXT: .LBB26_5: @ %atomicrmw.end5479; CHECK-THUMB7-NEXT: ldr r0, [sp] @ 4-byte Reload5480; CHECK-THUMB7-NEXT: add sp, #85481; CHECK-THUMB7-NEXT: bx lr5482;5483; CHECK-THUMB6-LABEL: test_nand_i32:5484; CHECK-THUMB6: @ %bb.0: @ %entry5485; CHECK-THUMB6-NEXT: .save {r7, lr}5486; CHECK-THUMB6-NEXT: push {r7, lr}5487; CHECK-THUMB6-NEXT: ldr r0, .LCPI26_05488; CHECK-THUMB6-NEXT: movs r1, #15489; CHECK-THUMB6-NEXT: bl __sync_fetch_and_nand_45490; CHECK-THUMB6-NEXT: pop {r7, pc}5491; CHECK-THUMB6-NEXT: .p2align 25492; CHECK-THUMB6-NEXT: @ %bb.1:5493; CHECK-THUMB6-NEXT: .LCPI26_0:5494; CHECK-THUMB6-NEXT: .long atomic_i325495;5496; CHECK-THUMB8BASE-LABEL: test_nand_i32:5497; CHECK-THUMB8BASE: @ %bb.0: @ %entry5498; CHECK-THUMB8BASE-NEXT: .save {r4, lr}5499; CHECK-THUMB8BASE-NEXT: push {r4, lr}5500; CHECK-THUMB8BASE-NEXT: .pad #85501; CHECK-THUMB8BASE-NEXT: sub sp, #85502; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i325503; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i325504; CHECK-THUMB8BASE-NEXT: ldr r0, [r0]5505; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill5506; CHECK-THUMB8BASE-NEXT: b .LBB26_15507; CHECK-THUMB8BASE-NEXT: .LBB26_1: @ %atomicrmw.start5508; CHECK-THUMB8BASE-NEXT: @ =>This Loop Header: Depth=15509; CHECK-THUMB8BASE-NEXT: @ Child Loop BB26_2 Depth 25510; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #4] @ 4-byte Reload5511; CHECK-THUMB8BASE-NEXT: mvns r4, r15512; CHECK-THUMB8BASE-NEXT: movs r0, #15513; CHECK-THUMB8BASE-NEXT: mvns r0, r05514; CHECK-THUMB8BASE-NEXT: orrs r4, r05515; CHECK-THUMB8BASE-NEXT: movw r3, :lower16:atomic_i325516; CHECK-THUMB8BASE-NEXT: movt r3, :upper16:atomic_i325517; CHECK-THUMB8BASE-NEXT: .LBB26_2: @ %atomicrmw.start5518; CHECK-THUMB8BASE-NEXT: @ Parent Loop BB26_1 Depth=15519; CHECK-THUMB8BASE-NEXT: @ => This Inner Loop Header: Depth=25520; CHECK-THUMB8BASE-NEXT: ldrex r0, [r3]5521; CHECK-THUMB8BASE-NEXT: cmp r0, r15522; CHECK-THUMB8BASE-NEXT: bne .LBB26_45523; CHECK-THUMB8BASE-NEXT: @ %bb.3: @ %atomicrmw.start5524; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB26_2 Depth=25525; CHECK-THUMB8BASE-NEXT: strex r2, r4, [r3]5526; CHECK-THUMB8BASE-NEXT: cmp r2, #05527; CHECK-THUMB8BASE-NEXT: bne .LBB26_25528; CHECK-THUMB8BASE-NEXT: .LBB26_4: @ %atomicrmw.start5529; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB26_1 Depth=15530; CHECK-THUMB8BASE-NEXT: str r0, [sp] @ 4-byte Spill5531; CHECK-THUMB8BASE-NEXT: subs r1, r0, r15532; CHECK-THUMB8BASE-NEXT: rsbs r2, r1, #05533; CHECK-THUMB8BASE-NEXT: adcs r1, r25534; CHECK-THUMB8BASE-NEXT: cmp r1, #15535; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill5536; CHECK-THUMB8BASE-NEXT: bne .LBB26_15537; CHECK-THUMB8BASE-NEXT: b .LBB26_55538; CHECK-THUMB8BASE-NEXT: .LBB26_5: @ %atomicrmw.end5539; CHECK-THUMB8BASE-NEXT: ldr r0, [sp] @ 4-byte Reload5540; CHECK-THUMB8BASE-NEXT: add sp, #85541; CHECK-THUMB8BASE-NEXT: pop {r4, pc}5542entry:5543 %0 = atomicrmw nand ptr @atomic_i32, i32 1 monotonic5544 ret i32 %05545}5546define i32 @test_or_i32() {5547; CHECK-ARM8-LABEL: test_or_i32:5548; CHECK-ARM8: @ %bb.0: @ %entry5549; CHECK-ARM8-NEXT: .pad #85550; CHECK-ARM8-NEXT: sub sp, sp, #85551; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i325552; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i325553; CHECK-ARM8-NEXT: ldr r0, [r0]5554; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill5555; CHECK-ARM8-NEXT: b .LBB27_15556; CHECK-ARM8-NEXT: .LBB27_1: @ %atomicrmw.start5557; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=15558; CHECK-ARM8-NEXT: @ Child Loop BB27_2 Depth 25559; CHECK-ARM8-NEXT: ldr r1, [sp, #4] @ 4-byte Reload5560; CHECK-ARM8-NEXT: orr r12, r1, #15561; CHECK-ARM8-NEXT: movw r3, :lower16:atomic_i325562; CHECK-ARM8-NEXT: movt r3, :upper16:atomic_i325563; CHECK-ARM8-NEXT: .LBB27_2: @ %atomicrmw.start5564; CHECK-ARM8-NEXT: @ Parent Loop BB27_1 Depth=15565; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=25566; CHECK-ARM8-NEXT: ldrex r0, [r3]5567; CHECK-ARM8-NEXT: cmp r0, r15568; CHECK-ARM8-NEXT: bne .LBB27_45569; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start5570; CHECK-ARM8-NEXT: @ in Loop: Header=BB27_2 Depth=25571; CHECK-ARM8-NEXT: strex r2, r12, [r3]5572; CHECK-ARM8-NEXT: cmp r2, #05573; CHECK-ARM8-NEXT: bne .LBB27_25574; CHECK-ARM8-NEXT: .LBB27_4: @ %atomicrmw.start5575; CHECK-ARM8-NEXT: @ in Loop: Header=BB27_1 Depth=15576; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill5577; CHECK-ARM8-NEXT: sub r1, r0, r15578; CHECK-ARM8-NEXT: clz r1, r15579; CHECK-ARM8-NEXT: lsr r1, r1, #55580; CHECK-ARM8-NEXT: cmp r1, #15581; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill5582; CHECK-ARM8-NEXT: bne .LBB27_15583; CHECK-ARM8-NEXT: b .LBB27_55584; CHECK-ARM8-NEXT: .LBB27_5: @ %atomicrmw.end5585; CHECK-ARM8-NEXT: ldr r0, [sp] @ 4-byte Reload5586; CHECK-ARM8-NEXT: add sp, sp, #85587; CHECK-ARM8-NEXT: bx lr5588;5589; CHECK-ARM6-LABEL: test_or_i32:5590; CHECK-ARM6: @ %bb.0: @ %entry5591; CHECK-ARM6-NEXT: .pad #85592; CHECK-ARM6-NEXT: sub sp, sp, #85593; CHECK-ARM6-NEXT: ldr r0, .LCPI27_05594; CHECK-ARM6-NEXT: ldr r0, [r0]5595; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill5596; CHECK-ARM6-NEXT: b .LBB27_15597; CHECK-ARM6-NEXT: .LBB27_1: @ %atomicrmw.start5598; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=15599; CHECK-ARM6-NEXT: @ Child Loop BB27_2 Depth 25600; CHECK-ARM6-NEXT: ldr r1, [sp, #4] @ 4-byte Reload5601; CHECK-ARM6-NEXT: orr r12, r1, #15602; CHECK-ARM6-NEXT: ldr r3, .LCPI27_05603; CHECK-ARM6-NEXT: .LBB27_2: @ %atomicrmw.start5604; CHECK-ARM6-NEXT: @ Parent Loop BB27_1 Depth=15605; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=25606; CHECK-ARM6-NEXT: ldrex r0, [r3]5607; CHECK-ARM6-NEXT: cmp r0, r15608; CHECK-ARM6-NEXT: bne .LBB27_45609; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start5610; CHECK-ARM6-NEXT: @ in Loop: Header=BB27_2 Depth=25611; CHECK-ARM6-NEXT: strex r2, r12, [r3]5612; CHECK-ARM6-NEXT: cmp r2, #05613; CHECK-ARM6-NEXT: bne .LBB27_25614; CHECK-ARM6-NEXT: .LBB27_4: @ %atomicrmw.start5615; CHECK-ARM6-NEXT: @ in Loop: Header=BB27_1 Depth=15616; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill5617; CHECK-ARM6-NEXT: sub r1, r0, r15618; CHECK-ARM6-NEXT: clz r1, r15619; CHECK-ARM6-NEXT: lsr r1, r1, #55620; CHECK-ARM6-NEXT: cmp r1, #15621; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill5622; CHECK-ARM6-NEXT: bne .LBB27_15623; CHECK-ARM6-NEXT: b .LBB27_55624; CHECK-ARM6-NEXT: .LBB27_5: @ %atomicrmw.end5625; CHECK-ARM6-NEXT: ldr r0, [sp] @ 4-byte Reload5626; CHECK-ARM6-NEXT: add sp, sp, #85627; CHECK-ARM6-NEXT: bx lr5628; CHECK-ARM6-NEXT: .p2align 25629; CHECK-ARM6-NEXT: @ %bb.6:5630; CHECK-ARM6-NEXT: .LCPI27_0:5631; CHECK-ARM6-NEXT: .long atomic_i325632;5633; CHECK-THUMB7-LABEL: test_or_i32:5634; CHECK-THUMB7: @ %bb.0: @ %entry5635; CHECK-THUMB7-NEXT: .pad #85636; CHECK-THUMB7-NEXT: sub sp, #85637; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i325638; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i325639; CHECK-THUMB7-NEXT: ldr r0, [r0]5640; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill5641; CHECK-THUMB7-NEXT: b .LBB27_15642; CHECK-THUMB7-NEXT: .LBB27_1: @ %atomicrmw.start5643; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=15644; CHECK-THUMB7-NEXT: @ Child Loop BB27_2 Depth 25645; CHECK-THUMB7-NEXT: ldr r1, [sp, #4] @ 4-byte Reload5646; CHECK-THUMB7-NEXT: orr r12, r1, #15647; CHECK-THUMB7-NEXT: movw r3, :lower16:atomic_i325648; CHECK-THUMB7-NEXT: movt r3, :upper16:atomic_i325649; CHECK-THUMB7-NEXT: .LBB27_2: @ %atomicrmw.start5650; CHECK-THUMB7-NEXT: @ Parent Loop BB27_1 Depth=15651; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=25652; CHECK-THUMB7-NEXT: ldrex r0, [r3]5653; CHECK-THUMB7-NEXT: cmp r0, r15654; CHECK-THUMB7-NEXT: bne .LBB27_45655; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start5656; CHECK-THUMB7-NEXT: @ in Loop: Header=BB27_2 Depth=25657; CHECK-THUMB7-NEXT: strex r2, r12, [r3]5658; CHECK-THUMB7-NEXT: cmp r2, #05659; CHECK-THUMB7-NEXT: bne .LBB27_25660; CHECK-THUMB7-NEXT: .LBB27_4: @ %atomicrmw.start5661; CHECK-THUMB7-NEXT: @ in Loop: Header=BB27_1 Depth=15662; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill5663; CHECK-THUMB7-NEXT: subs r1, r0, r15664; CHECK-THUMB7-NEXT: clz r1, r15665; CHECK-THUMB7-NEXT: lsrs r1, r1, #55666; CHECK-THUMB7-NEXT: cmp r1, #15667; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill5668; CHECK-THUMB7-NEXT: bne .LBB27_15669; CHECK-THUMB7-NEXT: b .LBB27_55670; CHECK-THUMB7-NEXT: .LBB27_5: @ %atomicrmw.end5671; CHECK-THUMB7-NEXT: ldr r0, [sp] @ 4-byte Reload5672; CHECK-THUMB7-NEXT: add sp, #85673; CHECK-THUMB7-NEXT: bx lr5674;5675; CHECK-THUMB6-LABEL: test_or_i32:5676; CHECK-THUMB6: @ %bb.0: @ %entry5677; CHECK-THUMB6-NEXT: .save {r7, lr}5678; CHECK-THUMB6-NEXT: push {r7, lr}5679; CHECK-THUMB6-NEXT: ldr r0, .LCPI27_05680; CHECK-THUMB6-NEXT: movs r1, #15681; CHECK-THUMB6-NEXT: bl __sync_fetch_and_or_45682; CHECK-THUMB6-NEXT: pop {r7, pc}5683; CHECK-THUMB6-NEXT: .p2align 25684; CHECK-THUMB6-NEXT: @ %bb.1:5685; CHECK-THUMB6-NEXT: .LCPI27_0:5686; CHECK-THUMB6-NEXT: .long atomic_i325687;5688; CHECK-THUMB8BASE-LABEL: test_or_i32:5689; CHECK-THUMB8BASE: @ %bb.0: @ %entry5690; CHECK-THUMB8BASE-NEXT: .save {r4, lr}5691; CHECK-THUMB8BASE-NEXT: push {r4, lr}5692; CHECK-THUMB8BASE-NEXT: .pad #85693; CHECK-THUMB8BASE-NEXT: sub sp, #85694; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i325695; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i325696; CHECK-THUMB8BASE-NEXT: ldr r0, [r0]5697; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill5698; CHECK-THUMB8BASE-NEXT: b .LBB27_15699; CHECK-THUMB8BASE-NEXT: .LBB27_1: @ %atomicrmw.start5700; CHECK-THUMB8BASE-NEXT: @ =>This Loop Header: Depth=15701; CHECK-THUMB8BASE-NEXT: @ Child Loop BB27_2 Depth 25702; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #4] @ 4-byte Reload5703; CHECK-THUMB8BASE-NEXT: movs r0, #15704; CHECK-THUMB8BASE-NEXT: mov r4, r15705; CHECK-THUMB8BASE-NEXT: orrs r4, r05706; CHECK-THUMB8BASE-NEXT: movw r3, :lower16:atomic_i325707; CHECK-THUMB8BASE-NEXT: movt r3, :upper16:atomic_i325708; CHECK-THUMB8BASE-NEXT: .LBB27_2: @ %atomicrmw.start5709; CHECK-THUMB8BASE-NEXT: @ Parent Loop BB27_1 Depth=15710; CHECK-THUMB8BASE-NEXT: @ => This Inner Loop Header: Depth=25711; CHECK-THUMB8BASE-NEXT: ldrex r0, [r3]5712; CHECK-THUMB8BASE-NEXT: cmp r0, r15713; CHECK-THUMB8BASE-NEXT: bne .LBB27_45714; CHECK-THUMB8BASE-NEXT: @ %bb.3: @ %atomicrmw.start5715; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB27_2 Depth=25716; CHECK-THUMB8BASE-NEXT: strex r2, r4, [r3]5717; CHECK-THUMB8BASE-NEXT: cmp r2, #05718; CHECK-THUMB8BASE-NEXT: bne .LBB27_25719; CHECK-THUMB8BASE-NEXT: .LBB27_4: @ %atomicrmw.start5720; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB27_1 Depth=15721; CHECK-THUMB8BASE-NEXT: str r0, [sp] @ 4-byte Spill5722; CHECK-THUMB8BASE-NEXT: subs r1, r0, r15723; CHECK-THUMB8BASE-NEXT: rsbs r2, r1, #05724; CHECK-THUMB8BASE-NEXT: adcs r1, r25725; CHECK-THUMB8BASE-NEXT: cmp r1, #15726; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill5727; CHECK-THUMB8BASE-NEXT: bne .LBB27_15728; CHECK-THUMB8BASE-NEXT: b .LBB27_55729; CHECK-THUMB8BASE-NEXT: .LBB27_5: @ %atomicrmw.end5730; CHECK-THUMB8BASE-NEXT: ldr r0, [sp] @ 4-byte Reload5731; CHECK-THUMB8BASE-NEXT: add sp, #85732; CHECK-THUMB8BASE-NEXT: pop {r4, pc}5733entry:5734 %0 = atomicrmw or ptr @atomic_i32, i32 1 monotonic5735 ret i32 %05736}5737define i32 @test_xor_i32() {5738; CHECK-ARM8-LABEL: test_xor_i32:5739; CHECK-ARM8: @ %bb.0: @ %entry5740; CHECK-ARM8-NEXT: .pad #85741; CHECK-ARM8-NEXT: sub sp, sp, #85742; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i325743; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i325744; CHECK-ARM8-NEXT: ldr r0, [r0]5745; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill5746; CHECK-ARM8-NEXT: b .LBB28_15747; CHECK-ARM8-NEXT: .LBB28_1: @ %atomicrmw.start5748; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=15749; CHECK-ARM8-NEXT: @ Child Loop BB28_2 Depth 25750; CHECK-ARM8-NEXT: ldr r1, [sp, #4] @ 4-byte Reload5751; CHECK-ARM8-NEXT: eor r12, r1, #15752; CHECK-ARM8-NEXT: movw r3, :lower16:atomic_i325753; CHECK-ARM8-NEXT: movt r3, :upper16:atomic_i325754; CHECK-ARM8-NEXT: .LBB28_2: @ %atomicrmw.start5755; CHECK-ARM8-NEXT: @ Parent Loop BB28_1 Depth=15756; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=25757; CHECK-ARM8-NEXT: ldrex r0, [r3]5758; CHECK-ARM8-NEXT: cmp r0, r15759; CHECK-ARM8-NEXT: bne .LBB28_45760; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start5761; CHECK-ARM8-NEXT: @ in Loop: Header=BB28_2 Depth=25762; CHECK-ARM8-NEXT: strex r2, r12, [r3]5763; CHECK-ARM8-NEXT: cmp r2, #05764; CHECK-ARM8-NEXT: bne .LBB28_25765; CHECK-ARM8-NEXT: .LBB28_4: @ %atomicrmw.start5766; CHECK-ARM8-NEXT: @ in Loop: Header=BB28_1 Depth=15767; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill5768; CHECK-ARM8-NEXT: sub r1, r0, r15769; CHECK-ARM8-NEXT: clz r1, r15770; CHECK-ARM8-NEXT: lsr r1, r1, #55771; CHECK-ARM8-NEXT: cmp r1, #15772; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill5773; CHECK-ARM8-NEXT: bne .LBB28_15774; CHECK-ARM8-NEXT: b .LBB28_55775; CHECK-ARM8-NEXT: .LBB28_5: @ %atomicrmw.end5776; CHECK-ARM8-NEXT: ldr r0, [sp] @ 4-byte Reload5777; CHECK-ARM8-NEXT: add sp, sp, #85778; CHECK-ARM8-NEXT: bx lr5779;5780; CHECK-ARM6-LABEL: test_xor_i32:5781; CHECK-ARM6: @ %bb.0: @ %entry5782; CHECK-ARM6-NEXT: .pad #85783; CHECK-ARM6-NEXT: sub sp, sp, #85784; CHECK-ARM6-NEXT: ldr r0, .LCPI28_05785; CHECK-ARM6-NEXT: ldr r0, [r0]5786; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill5787; CHECK-ARM6-NEXT: b .LBB28_15788; CHECK-ARM6-NEXT: .LBB28_1: @ %atomicrmw.start5789; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=15790; CHECK-ARM6-NEXT: @ Child Loop BB28_2 Depth 25791; CHECK-ARM6-NEXT: ldr r1, [sp, #4] @ 4-byte Reload5792; CHECK-ARM6-NEXT: eor r12, r1, #15793; CHECK-ARM6-NEXT: ldr r3, .LCPI28_05794; CHECK-ARM6-NEXT: .LBB28_2: @ %atomicrmw.start5795; CHECK-ARM6-NEXT: @ Parent Loop BB28_1 Depth=15796; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=25797; CHECK-ARM6-NEXT: ldrex r0, [r3]5798; CHECK-ARM6-NEXT: cmp r0, r15799; CHECK-ARM6-NEXT: bne .LBB28_45800; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start5801; CHECK-ARM6-NEXT: @ in Loop: Header=BB28_2 Depth=25802; CHECK-ARM6-NEXT: strex r2, r12, [r3]5803; CHECK-ARM6-NEXT: cmp r2, #05804; CHECK-ARM6-NEXT: bne .LBB28_25805; CHECK-ARM6-NEXT: .LBB28_4: @ %atomicrmw.start5806; CHECK-ARM6-NEXT: @ in Loop: Header=BB28_1 Depth=15807; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill5808; CHECK-ARM6-NEXT: sub r1, r0, r15809; CHECK-ARM6-NEXT: clz r1, r15810; CHECK-ARM6-NEXT: lsr r1, r1, #55811; CHECK-ARM6-NEXT: cmp r1, #15812; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill5813; CHECK-ARM6-NEXT: bne .LBB28_15814; CHECK-ARM6-NEXT: b .LBB28_55815; CHECK-ARM6-NEXT: .LBB28_5: @ %atomicrmw.end5816; CHECK-ARM6-NEXT: ldr r0, [sp] @ 4-byte Reload5817; CHECK-ARM6-NEXT: add sp, sp, #85818; CHECK-ARM6-NEXT: bx lr5819; CHECK-ARM6-NEXT: .p2align 25820; CHECK-ARM6-NEXT: @ %bb.6:5821; CHECK-ARM6-NEXT: .LCPI28_0:5822; CHECK-ARM6-NEXT: .long atomic_i325823;5824; CHECK-THUMB7-LABEL: test_xor_i32:5825; CHECK-THUMB7: @ %bb.0: @ %entry5826; CHECK-THUMB7-NEXT: .pad #85827; CHECK-THUMB7-NEXT: sub sp, #85828; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i325829; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i325830; CHECK-THUMB7-NEXT: ldr r0, [r0]5831; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill5832; CHECK-THUMB7-NEXT: b .LBB28_15833; CHECK-THUMB7-NEXT: .LBB28_1: @ %atomicrmw.start5834; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=15835; CHECK-THUMB7-NEXT: @ Child Loop BB28_2 Depth 25836; CHECK-THUMB7-NEXT: ldr r1, [sp, #4] @ 4-byte Reload5837; CHECK-THUMB7-NEXT: eor r12, r1, #15838; CHECK-THUMB7-NEXT: movw r3, :lower16:atomic_i325839; CHECK-THUMB7-NEXT: movt r3, :upper16:atomic_i325840; CHECK-THUMB7-NEXT: .LBB28_2: @ %atomicrmw.start5841; CHECK-THUMB7-NEXT: @ Parent Loop BB28_1 Depth=15842; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=25843; CHECK-THUMB7-NEXT: ldrex r0, [r3]5844; CHECK-THUMB7-NEXT: cmp r0, r15845; CHECK-THUMB7-NEXT: bne .LBB28_45846; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start5847; CHECK-THUMB7-NEXT: @ in Loop: Header=BB28_2 Depth=25848; CHECK-THUMB7-NEXT: strex r2, r12, [r3]5849; CHECK-THUMB7-NEXT: cmp r2, #05850; CHECK-THUMB7-NEXT: bne .LBB28_25851; CHECK-THUMB7-NEXT: .LBB28_4: @ %atomicrmw.start5852; CHECK-THUMB7-NEXT: @ in Loop: Header=BB28_1 Depth=15853; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill5854; CHECK-THUMB7-NEXT: subs r1, r0, r15855; CHECK-THUMB7-NEXT: clz r1, r15856; CHECK-THUMB7-NEXT: lsrs r1, r1, #55857; CHECK-THUMB7-NEXT: cmp r1, #15858; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill5859; CHECK-THUMB7-NEXT: bne .LBB28_15860; CHECK-THUMB7-NEXT: b .LBB28_55861; CHECK-THUMB7-NEXT: .LBB28_5: @ %atomicrmw.end5862; CHECK-THUMB7-NEXT: ldr r0, [sp] @ 4-byte Reload5863; CHECK-THUMB7-NEXT: add sp, #85864; CHECK-THUMB7-NEXT: bx lr5865;5866; CHECK-THUMB6-LABEL: test_xor_i32:5867; CHECK-THUMB6: @ %bb.0: @ %entry5868; CHECK-THUMB6-NEXT: .save {r7, lr}5869; CHECK-THUMB6-NEXT: push {r7, lr}5870; CHECK-THUMB6-NEXT: ldr r0, .LCPI28_05871; CHECK-THUMB6-NEXT: movs r1, #15872; CHECK-THUMB6-NEXT: bl __sync_fetch_and_xor_45873; CHECK-THUMB6-NEXT: pop {r7, pc}5874; CHECK-THUMB6-NEXT: .p2align 25875; CHECK-THUMB6-NEXT: @ %bb.1:5876; CHECK-THUMB6-NEXT: .LCPI28_0:5877; CHECK-THUMB6-NEXT: .long atomic_i325878;5879; CHECK-THUMB8BASE-LABEL: test_xor_i32:5880; CHECK-THUMB8BASE: @ %bb.0: @ %entry5881; CHECK-THUMB8BASE-NEXT: .save {r4, lr}5882; CHECK-THUMB8BASE-NEXT: push {r4, lr}5883; CHECK-THUMB8BASE-NEXT: .pad #85884; CHECK-THUMB8BASE-NEXT: sub sp, #85885; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i325886; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i325887; CHECK-THUMB8BASE-NEXT: ldr r0, [r0]5888; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill5889; CHECK-THUMB8BASE-NEXT: b .LBB28_15890; CHECK-THUMB8BASE-NEXT: .LBB28_1: @ %atomicrmw.start5891; CHECK-THUMB8BASE-NEXT: @ =>This Loop Header: Depth=15892; CHECK-THUMB8BASE-NEXT: @ Child Loop BB28_2 Depth 25893; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #4] @ 4-byte Reload5894; CHECK-THUMB8BASE-NEXT: movs r0, #15895; CHECK-THUMB8BASE-NEXT: mov r4, r15896; CHECK-THUMB8BASE-NEXT: eors r4, r05897; CHECK-THUMB8BASE-NEXT: movw r3, :lower16:atomic_i325898; CHECK-THUMB8BASE-NEXT: movt r3, :upper16:atomic_i325899; CHECK-THUMB8BASE-NEXT: .LBB28_2: @ %atomicrmw.start5900; CHECK-THUMB8BASE-NEXT: @ Parent Loop BB28_1 Depth=15901; CHECK-THUMB8BASE-NEXT: @ => This Inner Loop Header: Depth=25902; CHECK-THUMB8BASE-NEXT: ldrex r0, [r3]5903; CHECK-THUMB8BASE-NEXT: cmp r0, r15904; CHECK-THUMB8BASE-NEXT: bne .LBB28_45905; CHECK-THUMB8BASE-NEXT: @ %bb.3: @ %atomicrmw.start5906; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB28_2 Depth=25907; CHECK-THUMB8BASE-NEXT: strex r2, r4, [r3]5908; CHECK-THUMB8BASE-NEXT: cmp r2, #05909; CHECK-THUMB8BASE-NEXT: bne .LBB28_25910; CHECK-THUMB8BASE-NEXT: .LBB28_4: @ %atomicrmw.start5911; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB28_1 Depth=15912; CHECK-THUMB8BASE-NEXT: str r0, [sp] @ 4-byte Spill5913; CHECK-THUMB8BASE-NEXT: subs r1, r0, r15914; CHECK-THUMB8BASE-NEXT: rsbs r2, r1, #05915; CHECK-THUMB8BASE-NEXT: adcs r1, r25916; CHECK-THUMB8BASE-NEXT: cmp r1, #15917; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill5918; CHECK-THUMB8BASE-NEXT: bne .LBB28_15919; CHECK-THUMB8BASE-NEXT: b .LBB28_55920; CHECK-THUMB8BASE-NEXT: .LBB28_5: @ %atomicrmw.end5921; CHECK-THUMB8BASE-NEXT: ldr r0, [sp] @ 4-byte Reload5922; CHECK-THUMB8BASE-NEXT: add sp, #85923; CHECK-THUMB8BASE-NEXT: pop {r4, pc}5924entry:5925 %0 = atomicrmw xor ptr @atomic_i32, i32 1 monotonic5926 ret i32 %05927}5928define i32 @test_max_i32() {5929; CHECK-ARM8-LABEL: test_max_i32:5930; CHECK-ARM8: @ %bb.0: @ %entry5931; CHECK-ARM8-NEXT: .pad #85932; CHECK-ARM8-NEXT: sub sp, sp, #85933; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i325934; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i325935; CHECK-ARM8-NEXT: ldr r0, [r0]5936; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill5937; CHECK-ARM8-NEXT: b .LBB29_15938; CHECK-ARM8-NEXT: .LBB29_1: @ %atomicrmw.start5939; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=15940; CHECK-ARM8-NEXT: @ Child Loop BB29_2 Depth 25941; CHECK-ARM8-NEXT: ldr r1, [sp, #4] @ 4-byte Reload5942; CHECK-ARM8-NEXT: cmp r1, #15943; CHECK-ARM8-NEXT: mov r12, #15944; CHECK-ARM8-NEXT: movgt r12, r15945; CHECK-ARM8-NEXT: movw r3, :lower16:atomic_i325946; CHECK-ARM8-NEXT: movt r3, :upper16:atomic_i325947; CHECK-ARM8-NEXT: .LBB29_2: @ %atomicrmw.start5948; CHECK-ARM8-NEXT: @ Parent Loop BB29_1 Depth=15949; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=25950; CHECK-ARM8-NEXT: ldrex r0, [r3]5951; CHECK-ARM8-NEXT: cmp r0, r15952; CHECK-ARM8-NEXT: bne .LBB29_45953; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start5954; CHECK-ARM8-NEXT: @ in Loop: Header=BB29_2 Depth=25955; CHECK-ARM8-NEXT: strex r2, r12, [r3]5956; CHECK-ARM8-NEXT: cmp r2, #05957; CHECK-ARM8-NEXT: bne .LBB29_25958; CHECK-ARM8-NEXT: .LBB29_4: @ %atomicrmw.start5959; CHECK-ARM8-NEXT: @ in Loop: Header=BB29_1 Depth=15960; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill5961; CHECK-ARM8-NEXT: sub r1, r0, r15962; CHECK-ARM8-NEXT: clz r1, r15963; CHECK-ARM8-NEXT: lsr r1, r1, #55964; CHECK-ARM8-NEXT: cmp r1, #15965; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill5966; CHECK-ARM8-NEXT: bne .LBB29_15967; CHECK-ARM8-NEXT: b .LBB29_55968; CHECK-ARM8-NEXT: .LBB29_5: @ %atomicrmw.end5969; CHECK-ARM8-NEXT: ldr r0, [sp] @ 4-byte Reload5970; CHECK-ARM8-NEXT: add sp, sp, #85971; CHECK-ARM8-NEXT: bx lr5972;5973; CHECK-ARM6-LABEL: test_max_i32:5974; CHECK-ARM6: @ %bb.0: @ %entry5975; CHECK-ARM6-NEXT: .pad #85976; CHECK-ARM6-NEXT: sub sp, sp, #85977; CHECK-ARM6-NEXT: ldr r0, .LCPI29_05978; CHECK-ARM6-NEXT: ldr r0, [r0]5979; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill5980; CHECK-ARM6-NEXT: b .LBB29_15981; CHECK-ARM6-NEXT: .LBB29_1: @ %atomicrmw.start5982; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=15983; CHECK-ARM6-NEXT: @ Child Loop BB29_2 Depth 25984; CHECK-ARM6-NEXT: ldr r1, [sp, #4] @ 4-byte Reload5985; CHECK-ARM6-NEXT: cmp r1, #15986; CHECK-ARM6-NEXT: mov r12, #15987; CHECK-ARM6-NEXT: movgt r12, r15988; CHECK-ARM6-NEXT: ldr r3, .LCPI29_05989; CHECK-ARM6-NEXT: .LBB29_2: @ %atomicrmw.start5990; CHECK-ARM6-NEXT: @ Parent Loop BB29_1 Depth=15991; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=25992; CHECK-ARM6-NEXT: ldrex r0, [r3]5993; CHECK-ARM6-NEXT: cmp r0, r15994; CHECK-ARM6-NEXT: bne .LBB29_45995; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start5996; CHECK-ARM6-NEXT: @ in Loop: Header=BB29_2 Depth=25997; CHECK-ARM6-NEXT: strex r2, r12, [r3]5998; CHECK-ARM6-NEXT: cmp r2, #05999; CHECK-ARM6-NEXT: bne .LBB29_26000; CHECK-ARM6-NEXT: .LBB29_4: @ %atomicrmw.start6001; CHECK-ARM6-NEXT: @ in Loop: Header=BB29_1 Depth=16002; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill6003; CHECK-ARM6-NEXT: sub r1, r0, r16004; CHECK-ARM6-NEXT: clz r1, r16005; CHECK-ARM6-NEXT: lsr r1, r1, #56006; CHECK-ARM6-NEXT: cmp r1, #16007; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill6008; CHECK-ARM6-NEXT: bne .LBB29_16009; CHECK-ARM6-NEXT: b .LBB29_56010; CHECK-ARM6-NEXT: .LBB29_5: @ %atomicrmw.end6011; CHECK-ARM6-NEXT: ldr r0, [sp] @ 4-byte Reload6012; CHECK-ARM6-NEXT: add sp, sp, #86013; CHECK-ARM6-NEXT: bx lr6014; CHECK-ARM6-NEXT: .p2align 26015; CHECK-ARM6-NEXT: @ %bb.6:6016; CHECK-ARM6-NEXT: .LCPI29_0:6017; CHECK-ARM6-NEXT: .long atomic_i326018;6019; CHECK-THUMB7-LABEL: test_max_i32:6020; CHECK-THUMB7: @ %bb.0: @ %entry6021; CHECK-THUMB7-NEXT: .pad #86022; CHECK-THUMB7-NEXT: sub sp, #86023; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i326024; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i326025; CHECK-THUMB7-NEXT: ldr r0, [r0]6026; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill6027; CHECK-THUMB7-NEXT: b .LBB29_16028; CHECK-THUMB7-NEXT: .LBB29_1: @ %atomicrmw.start6029; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=16030; CHECK-THUMB7-NEXT: @ Child Loop BB29_2 Depth 26031; CHECK-THUMB7-NEXT: ldr r1, [sp, #4] @ 4-byte Reload6032; CHECK-THUMB7-NEXT: cmp r1, #16033; CHECK-THUMB7-NEXT: mov.w r12, #16034; CHECK-THUMB7-NEXT: it gt6035; CHECK-THUMB7-NEXT: movgt r12, r16036; CHECK-THUMB7-NEXT: movw r3, :lower16:atomic_i326037; CHECK-THUMB7-NEXT: movt r3, :upper16:atomic_i326038; CHECK-THUMB7-NEXT: .LBB29_2: @ %atomicrmw.start6039; CHECK-THUMB7-NEXT: @ Parent Loop BB29_1 Depth=16040; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=26041; CHECK-THUMB7-NEXT: ldrex r0, [r3]6042; CHECK-THUMB7-NEXT: cmp r0, r16043; CHECK-THUMB7-NEXT: bne .LBB29_46044; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start6045; CHECK-THUMB7-NEXT: @ in Loop: Header=BB29_2 Depth=26046; CHECK-THUMB7-NEXT: strex r2, r12, [r3]6047; CHECK-THUMB7-NEXT: cmp r2, #06048; CHECK-THUMB7-NEXT: bne .LBB29_26049; CHECK-THUMB7-NEXT: .LBB29_4: @ %atomicrmw.start6050; CHECK-THUMB7-NEXT: @ in Loop: Header=BB29_1 Depth=16051; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill6052; CHECK-THUMB7-NEXT: subs r1, r0, r16053; CHECK-THUMB7-NEXT: clz r1, r16054; CHECK-THUMB7-NEXT: lsrs r1, r1, #56055; CHECK-THUMB7-NEXT: cmp r1, #16056; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill6057; CHECK-THUMB7-NEXT: bne .LBB29_16058; CHECK-THUMB7-NEXT: b .LBB29_56059; CHECK-THUMB7-NEXT: .LBB29_5: @ %atomicrmw.end6060; CHECK-THUMB7-NEXT: ldr r0, [sp] @ 4-byte Reload6061; CHECK-THUMB7-NEXT: add sp, #86062; CHECK-THUMB7-NEXT: bx lr6063;6064; CHECK-THUMB6-LABEL: test_max_i32:6065; CHECK-THUMB6: @ %bb.0: @ %entry6066; CHECK-THUMB6-NEXT: .save {r7, lr}6067; CHECK-THUMB6-NEXT: push {r7, lr}6068; CHECK-THUMB6-NEXT: ldr r0, .LCPI29_06069; CHECK-THUMB6-NEXT: movs r1, #16070; CHECK-THUMB6-NEXT: bl __sync_fetch_and_max_46071; CHECK-THUMB6-NEXT: pop {r7, pc}6072; CHECK-THUMB6-NEXT: .p2align 26073; CHECK-THUMB6-NEXT: @ %bb.1:6074; CHECK-THUMB6-NEXT: .LCPI29_0:6075; CHECK-THUMB6-NEXT: .long atomic_i326076;6077; CHECK-THUMB8BASE-LABEL: test_max_i32:6078; CHECK-THUMB8BASE: @ %bb.0: @ %entry6079; CHECK-THUMB8BASE-NEXT: .save {r4, lr}6080; CHECK-THUMB8BASE-NEXT: push {r4, lr}6081; CHECK-THUMB8BASE-NEXT: .pad #206082; CHECK-THUMB8BASE-NEXT: sub sp, #206083; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i326084; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i326085; CHECK-THUMB8BASE-NEXT: ldr r0, [r0]6086; CHECK-THUMB8BASE-NEXT: str r0, [sp, #16] @ 4-byte Spill6087; CHECK-THUMB8BASE-NEXT: b .LBB29_16088; CHECK-THUMB8BASE-NEXT: .LBB29_1: @ %atomicrmw.start6089; CHECK-THUMB8BASE-NEXT: @ =>This Loop Header: Depth=16090; CHECK-THUMB8BASE-NEXT: @ Child Loop BB29_4 Depth 26091; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #16] @ 4-byte Reload6092; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill6093; CHECK-THUMB8BASE-NEXT: movs r1, #16094; CHECK-THUMB8BASE-NEXT: str r1, [sp, #8] @ 4-byte Spill6095; CHECK-THUMB8BASE-NEXT: cmp r0, #16096; CHECK-THUMB8BASE-NEXT: str r0, [sp, #12] @ 4-byte Spill6097; CHECK-THUMB8BASE-NEXT: bgt .LBB29_36098; CHECK-THUMB8BASE-NEXT: @ %bb.2: @ %atomicrmw.start6099; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB29_1 Depth=16100; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #8] @ 4-byte Reload6101; CHECK-THUMB8BASE-NEXT: str r0, [sp, #12] @ 4-byte Spill6102; CHECK-THUMB8BASE-NEXT: .LBB29_3: @ %atomicrmw.start6103; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB29_1 Depth=16104; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #4] @ 4-byte Reload6105; CHECK-THUMB8BASE-NEXT: ldr r4, [sp, #12] @ 4-byte Reload6106; CHECK-THUMB8BASE-NEXT: movw r3, :lower16:atomic_i326107; CHECK-THUMB8BASE-NEXT: movt r3, :upper16:atomic_i326108; CHECK-THUMB8BASE-NEXT: .LBB29_4: @ %atomicrmw.start6109; CHECK-THUMB8BASE-NEXT: @ Parent Loop BB29_1 Depth=16110; CHECK-THUMB8BASE-NEXT: @ => This Inner Loop Header: Depth=26111; CHECK-THUMB8BASE-NEXT: ldrex r0, [r3]6112; CHECK-THUMB8BASE-NEXT: cmp r0, r16113; CHECK-THUMB8BASE-NEXT: bne .LBB29_66114; CHECK-THUMB8BASE-NEXT: @ %bb.5: @ %atomicrmw.start6115; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB29_4 Depth=26116; CHECK-THUMB8BASE-NEXT: strex r2, r4, [r3]6117; CHECK-THUMB8BASE-NEXT: cmp r2, #06118; CHECK-THUMB8BASE-NEXT: bne .LBB29_46119; CHECK-THUMB8BASE-NEXT: .LBB29_6: @ %atomicrmw.start6120; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB29_1 Depth=16121; CHECK-THUMB8BASE-NEXT: str r0, [sp] @ 4-byte Spill6122; CHECK-THUMB8BASE-NEXT: subs r1, r0, r16123; CHECK-THUMB8BASE-NEXT: rsbs r2, r1, #06124; CHECK-THUMB8BASE-NEXT: adcs r1, r26125; CHECK-THUMB8BASE-NEXT: cmp r1, #16126; CHECK-THUMB8BASE-NEXT: str r0, [sp, #16] @ 4-byte Spill6127; CHECK-THUMB8BASE-NEXT: bne .LBB29_16128; CHECK-THUMB8BASE-NEXT: b .LBB29_76129; CHECK-THUMB8BASE-NEXT: .LBB29_7: @ %atomicrmw.end6130; CHECK-THUMB8BASE-NEXT: ldr r0, [sp] @ 4-byte Reload6131; CHECK-THUMB8BASE-NEXT: add sp, #206132; CHECK-THUMB8BASE-NEXT: pop {r4, pc}6133entry:6134 %0 = atomicrmw max ptr @atomic_i32, i32 1 monotonic6135 ret i32 %06136}6137define i32 @test_min_i32() {6138; CHECK-ARM8-LABEL: test_min_i32:6139; CHECK-ARM8: @ %bb.0: @ %entry6140; CHECK-ARM8-NEXT: .pad #86141; CHECK-ARM8-NEXT: sub sp, sp, #86142; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i326143; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i326144; CHECK-ARM8-NEXT: ldr r0, [r0]6145; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill6146; CHECK-ARM8-NEXT: b .LBB30_16147; CHECK-ARM8-NEXT: .LBB30_1: @ %atomicrmw.start6148; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=16149; CHECK-ARM8-NEXT: @ Child Loop BB30_2 Depth 26150; CHECK-ARM8-NEXT: ldr r1, [sp, #4] @ 4-byte Reload6151; CHECK-ARM8-NEXT: cmp r1, #26152; CHECK-ARM8-NEXT: mov r12, #16153; CHECK-ARM8-NEXT: movlt r12, r16154; CHECK-ARM8-NEXT: movw r3, :lower16:atomic_i326155; CHECK-ARM8-NEXT: movt r3, :upper16:atomic_i326156; CHECK-ARM8-NEXT: .LBB30_2: @ %atomicrmw.start6157; CHECK-ARM8-NEXT: @ Parent Loop BB30_1 Depth=16158; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=26159; CHECK-ARM8-NEXT: ldrex r0, [r3]6160; CHECK-ARM8-NEXT: cmp r0, r16161; CHECK-ARM8-NEXT: bne .LBB30_46162; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start6163; CHECK-ARM8-NEXT: @ in Loop: Header=BB30_2 Depth=26164; CHECK-ARM8-NEXT: strex r2, r12, [r3]6165; CHECK-ARM8-NEXT: cmp r2, #06166; CHECK-ARM8-NEXT: bne .LBB30_26167; CHECK-ARM8-NEXT: .LBB30_4: @ %atomicrmw.start6168; CHECK-ARM8-NEXT: @ in Loop: Header=BB30_1 Depth=16169; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill6170; CHECK-ARM8-NEXT: sub r1, r0, r16171; CHECK-ARM8-NEXT: clz r1, r16172; CHECK-ARM8-NEXT: lsr r1, r1, #56173; CHECK-ARM8-NEXT: cmp r1, #16174; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill6175; CHECK-ARM8-NEXT: bne .LBB30_16176; CHECK-ARM8-NEXT: b .LBB30_56177; CHECK-ARM8-NEXT: .LBB30_5: @ %atomicrmw.end6178; CHECK-ARM8-NEXT: ldr r0, [sp] @ 4-byte Reload6179; CHECK-ARM8-NEXT: add sp, sp, #86180; CHECK-ARM8-NEXT: bx lr6181;6182; CHECK-ARM6-LABEL: test_min_i32:6183; CHECK-ARM6: @ %bb.0: @ %entry6184; CHECK-ARM6-NEXT: .pad #86185; CHECK-ARM6-NEXT: sub sp, sp, #86186; CHECK-ARM6-NEXT: ldr r0, .LCPI30_06187; CHECK-ARM6-NEXT: ldr r0, [r0]6188; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill6189; CHECK-ARM6-NEXT: b .LBB30_16190; CHECK-ARM6-NEXT: .LBB30_1: @ %atomicrmw.start6191; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=16192; CHECK-ARM6-NEXT: @ Child Loop BB30_2 Depth 26193; CHECK-ARM6-NEXT: ldr r1, [sp, #4] @ 4-byte Reload6194; CHECK-ARM6-NEXT: cmp r1, #26195; CHECK-ARM6-NEXT: mov r12, #16196; CHECK-ARM6-NEXT: movlt r12, r16197; CHECK-ARM6-NEXT: ldr r3, .LCPI30_06198; CHECK-ARM6-NEXT: .LBB30_2: @ %atomicrmw.start6199; CHECK-ARM6-NEXT: @ Parent Loop BB30_1 Depth=16200; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=26201; CHECK-ARM6-NEXT: ldrex r0, [r3]6202; CHECK-ARM6-NEXT: cmp r0, r16203; CHECK-ARM6-NEXT: bne .LBB30_46204; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start6205; CHECK-ARM6-NEXT: @ in Loop: Header=BB30_2 Depth=26206; CHECK-ARM6-NEXT: strex r2, r12, [r3]6207; CHECK-ARM6-NEXT: cmp r2, #06208; CHECK-ARM6-NEXT: bne .LBB30_26209; CHECK-ARM6-NEXT: .LBB30_4: @ %atomicrmw.start6210; CHECK-ARM6-NEXT: @ in Loop: Header=BB30_1 Depth=16211; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill6212; CHECK-ARM6-NEXT: sub r1, r0, r16213; CHECK-ARM6-NEXT: clz r1, r16214; CHECK-ARM6-NEXT: lsr r1, r1, #56215; CHECK-ARM6-NEXT: cmp r1, #16216; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill6217; CHECK-ARM6-NEXT: bne .LBB30_16218; CHECK-ARM6-NEXT: b .LBB30_56219; CHECK-ARM6-NEXT: .LBB30_5: @ %atomicrmw.end6220; CHECK-ARM6-NEXT: ldr r0, [sp] @ 4-byte Reload6221; CHECK-ARM6-NEXT: add sp, sp, #86222; CHECK-ARM6-NEXT: bx lr6223; CHECK-ARM6-NEXT: .p2align 26224; CHECK-ARM6-NEXT: @ %bb.6:6225; CHECK-ARM6-NEXT: .LCPI30_0:6226; CHECK-ARM6-NEXT: .long atomic_i326227;6228; CHECK-THUMB7-LABEL: test_min_i32:6229; CHECK-THUMB7: @ %bb.0: @ %entry6230; CHECK-THUMB7-NEXT: .pad #86231; CHECK-THUMB7-NEXT: sub sp, #86232; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i326233; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i326234; CHECK-THUMB7-NEXT: ldr r0, [r0]6235; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill6236; CHECK-THUMB7-NEXT: b .LBB30_16237; CHECK-THUMB7-NEXT: .LBB30_1: @ %atomicrmw.start6238; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=16239; CHECK-THUMB7-NEXT: @ Child Loop BB30_2 Depth 26240; CHECK-THUMB7-NEXT: ldr r1, [sp, #4] @ 4-byte Reload6241; CHECK-THUMB7-NEXT: cmp r1, #26242; CHECK-THUMB7-NEXT: mov.w r12, #16243; CHECK-THUMB7-NEXT: it lt6244; CHECK-THUMB7-NEXT: movlt r12, r16245; CHECK-THUMB7-NEXT: movw r3, :lower16:atomic_i326246; CHECK-THUMB7-NEXT: movt r3, :upper16:atomic_i326247; CHECK-THUMB7-NEXT: .LBB30_2: @ %atomicrmw.start6248; CHECK-THUMB7-NEXT: @ Parent Loop BB30_1 Depth=16249; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=26250; CHECK-THUMB7-NEXT: ldrex r0, [r3]6251; CHECK-THUMB7-NEXT: cmp r0, r16252; CHECK-THUMB7-NEXT: bne .LBB30_46253; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start6254; CHECK-THUMB7-NEXT: @ in Loop: Header=BB30_2 Depth=26255; CHECK-THUMB7-NEXT: strex r2, r12, [r3]6256; CHECK-THUMB7-NEXT: cmp r2, #06257; CHECK-THUMB7-NEXT: bne .LBB30_26258; CHECK-THUMB7-NEXT: .LBB30_4: @ %atomicrmw.start6259; CHECK-THUMB7-NEXT: @ in Loop: Header=BB30_1 Depth=16260; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill6261; CHECK-THUMB7-NEXT: subs r1, r0, r16262; CHECK-THUMB7-NEXT: clz r1, r16263; CHECK-THUMB7-NEXT: lsrs r1, r1, #56264; CHECK-THUMB7-NEXT: cmp r1, #16265; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill6266; CHECK-THUMB7-NEXT: bne .LBB30_16267; CHECK-THUMB7-NEXT: b .LBB30_56268; CHECK-THUMB7-NEXT: .LBB30_5: @ %atomicrmw.end6269; CHECK-THUMB7-NEXT: ldr r0, [sp] @ 4-byte Reload6270; CHECK-THUMB7-NEXT: add sp, #86271; CHECK-THUMB7-NEXT: bx lr6272;6273; CHECK-THUMB6-LABEL: test_min_i32:6274; CHECK-THUMB6: @ %bb.0: @ %entry6275; CHECK-THUMB6-NEXT: .save {r7, lr}6276; CHECK-THUMB6-NEXT: push {r7, lr}6277; CHECK-THUMB6-NEXT: ldr r0, .LCPI30_06278; CHECK-THUMB6-NEXT: movs r1, #16279; CHECK-THUMB6-NEXT: bl __sync_fetch_and_min_46280; CHECK-THUMB6-NEXT: pop {r7, pc}6281; CHECK-THUMB6-NEXT: .p2align 26282; CHECK-THUMB6-NEXT: @ %bb.1:6283; CHECK-THUMB6-NEXT: .LCPI30_0:6284; CHECK-THUMB6-NEXT: .long atomic_i326285;6286; CHECK-THUMB8BASE-LABEL: test_min_i32:6287; CHECK-THUMB8BASE: @ %bb.0: @ %entry6288; CHECK-THUMB8BASE-NEXT: .save {r4, lr}6289; CHECK-THUMB8BASE-NEXT: push {r4, lr}6290; CHECK-THUMB8BASE-NEXT: .pad #206291; CHECK-THUMB8BASE-NEXT: sub sp, #206292; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i326293; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i326294; CHECK-THUMB8BASE-NEXT: ldr r0, [r0]6295; CHECK-THUMB8BASE-NEXT: str r0, [sp, #16] @ 4-byte Spill6296; CHECK-THUMB8BASE-NEXT: b .LBB30_16297; CHECK-THUMB8BASE-NEXT: .LBB30_1: @ %atomicrmw.start6298; CHECK-THUMB8BASE-NEXT: @ =>This Loop Header: Depth=16299; CHECK-THUMB8BASE-NEXT: @ Child Loop BB30_4 Depth 26300; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #16] @ 4-byte Reload6301; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill6302; CHECK-THUMB8BASE-NEXT: movs r1, #16303; CHECK-THUMB8BASE-NEXT: str r1, [sp, #8] @ 4-byte Spill6304; CHECK-THUMB8BASE-NEXT: cmp r0, #26305; CHECK-THUMB8BASE-NEXT: str r0, [sp, #12] @ 4-byte Spill6306; CHECK-THUMB8BASE-NEXT: blt .LBB30_36307; CHECK-THUMB8BASE-NEXT: @ %bb.2: @ %atomicrmw.start6308; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB30_1 Depth=16309; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #8] @ 4-byte Reload6310; CHECK-THUMB8BASE-NEXT: str r0, [sp, #12] @ 4-byte Spill6311; CHECK-THUMB8BASE-NEXT: .LBB30_3: @ %atomicrmw.start6312; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB30_1 Depth=16313; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #4] @ 4-byte Reload6314; CHECK-THUMB8BASE-NEXT: ldr r4, [sp, #12] @ 4-byte Reload6315; CHECK-THUMB8BASE-NEXT: movw r3, :lower16:atomic_i326316; CHECK-THUMB8BASE-NEXT: movt r3, :upper16:atomic_i326317; CHECK-THUMB8BASE-NEXT: .LBB30_4: @ %atomicrmw.start6318; CHECK-THUMB8BASE-NEXT: @ Parent Loop BB30_1 Depth=16319; CHECK-THUMB8BASE-NEXT: @ => This Inner Loop Header: Depth=26320; CHECK-THUMB8BASE-NEXT: ldrex r0, [r3]6321; CHECK-THUMB8BASE-NEXT: cmp r0, r16322; CHECK-THUMB8BASE-NEXT: bne .LBB30_66323; CHECK-THUMB8BASE-NEXT: @ %bb.5: @ %atomicrmw.start6324; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB30_4 Depth=26325; CHECK-THUMB8BASE-NEXT: strex r2, r4, [r3]6326; CHECK-THUMB8BASE-NEXT: cmp r2, #06327; CHECK-THUMB8BASE-NEXT: bne .LBB30_46328; CHECK-THUMB8BASE-NEXT: .LBB30_6: @ %atomicrmw.start6329; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB30_1 Depth=16330; CHECK-THUMB8BASE-NEXT: str r0, [sp] @ 4-byte Spill6331; CHECK-THUMB8BASE-NEXT: subs r1, r0, r16332; CHECK-THUMB8BASE-NEXT: rsbs r2, r1, #06333; CHECK-THUMB8BASE-NEXT: adcs r1, r26334; CHECK-THUMB8BASE-NEXT: cmp r1, #16335; CHECK-THUMB8BASE-NEXT: str r0, [sp, #16] @ 4-byte Spill6336; CHECK-THUMB8BASE-NEXT: bne .LBB30_16337; CHECK-THUMB8BASE-NEXT: b .LBB30_76338; CHECK-THUMB8BASE-NEXT: .LBB30_7: @ %atomicrmw.end6339; CHECK-THUMB8BASE-NEXT: ldr r0, [sp] @ 4-byte Reload6340; CHECK-THUMB8BASE-NEXT: add sp, #206341; CHECK-THUMB8BASE-NEXT: pop {r4, pc}6342entry:6343 %0 = atomicrmw min ptr @atomic_i32, i32 1 monotonic6344 ret i32 %06345}6346define i32 @test_umax_i32() {6347; CHECK-ARM8-LABEL: test_umax_i32:6348; CHECK-ARM8: @ %bb.0: @ %entry6349; CHECK-ARM8-NEXT: .pad #86350; CHECK-ARM8-NEXT: sub sp, sp, #86351; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i326352; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i326353; CHECK-ARM8-NEXT: ldr r0, [r0]6354; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill6355; CHECK-ARM8-NEXT: b .LBB31_16356; CHECK-ARM8-NEXT: .LBB31_1: @ %atomicrmw.start6357; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=16358; CHECK-ARM8-NEXT: @ Child Loop BB31_2 Depth 26359; CHECK-ARM8-NEXT: ldr r1, [sp, #4] @ 4-byte Reload6360; CHECK-ARM8-NEXT: cmp r1, #16361; CHECK-ARM8-NEXT: mov r12, #16362; CHECK-ARM8-NEXT: movhi r12, r16363; CHECK-ARM8-NEXT: movw r3, :lower16:atomic_i326364; CHECK-ARM8-NEXT: movt r3, :upper16:atomic_i326365; CHECK-ARM8-NEXT: .LBB31_2: @ %atomicrmw.start6366; CHECK-ARM8-NEXT: @ Parent Loop BB31_1 Depth=16367; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=26368; CHECK-ARM8-NEXT: ldrex r0, [r3]6369; CHECK-ARM8-NEXT: cmp r0, r16370; CHECK-ARM8-NEXT: bne .LBB31_46371; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start6372; CHECK-ARM8-NEXT: @ in Loop: Header=BB31_2 Depth=26373; CHECK-ARM8-NEXT: strex r2, r12, [r3]6374; CHECK-ARM8-NEXT: cmp r2, #06375; CHECK-ARM8-NEXT: bne .LBB31_26376; CHECK-ARM8-NEXT: .LBB31_4: @ %atomicrmw.start6377; CHECK-ARM8-NEXT: @ in Loop: Header=BB31_1 Depth=16378; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill6379; CHECK-ARM8-NEXT: sub r1, r0, r16380; CHECK-ARM8-NEXT: clz r1, r16381; CHECK-ARM8-NEXT: lsr r1, r1, #56382; CHECK-ARM8-NEXT: cmp r1, #16383; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill6384; CHECK-ARM8-NEXT: bne .LBB31_16385; CHECK-ARM8-NEXT: b .LBB31_56386; CHECK-ARM8-NEXT: .LBB31_5: @ %atomicrmw.end6387; CHECK-ARM8-NEXT: ldr r0, [sp] @ 4-byte Reload6388; CHECK-ARM8-NEXT: add sp, sp, #86389; CHECK-ARM8-NEXT: bx lr6390;6391; CHECK-ARM6-LABEL: test_umax_i32:6392; CHECK-ARM6: @ %bb.0: @ %entry6393; CHECK-ARM6-NEXT: .pad #86394; CHECK-ARM6-NEXT: sub sp, sp, #86395; CHECK-ARM6-NEXT: ldr r0, .LCPI31_06396; CHECK-ARM6-NEXT: ldr r0, [r0]6397; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill6398; CHECK-ARM6-NEXT: b .LBB31_16399; CHECK-ARM6-NEXT: .LBB31_1: @ %atomicrmw.start6400; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=16401; CHECK-ARM6-NEXT: @ Child Loop BB31_2 Depth 26402; CHECK-ARM6-NEXT: ldr r1, [sp, #4] @ 4-byte Reload6403; CHECK-ARM6-NEXT: cmp r1, #16404; CHECK-ARM6-NEXT: mov r12, #16405; CHECK-ARM6-NEXT: movhi r12, r16406; CHECK-ARM6-NEXT: ldr r3, .LCPI31_06407; CHECK-ARM6-NEXT: .LBB31_2: @ %atomicrmw.start6408; CHECK-ARM6-NEXT: @ Parent Loop BB31_1 Depth=16409; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=26410; CHECK-ARM6-NEXT: ldrex r0, [r3]6411; CHECK-ARM6-NEXT: cmp r0, r16412; CHECK-ARM6-NEXT: bne .LBB31_46413; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start6414; CHECK-ARM6-NEXT: @ in Loop: Header=BB31_2 Depth=26415; CHECK-ARM6-NEXT: strex r2, r12, [r3]6416; CHECK-ARM6-NEXT: cmp r2, #06417; CHECK-ARM6-NEXT: bne .LBB31_26418; CHECK-ARM6-NEXT: .LBB31_4: @ %atomicrmw.start6419; CHECK-ARM6-NEXT: @ in Loop: Header=BB31_1 Depth=16420; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill6421; CHECK-ARM6-NEXT: sub r1, r0, r16422; CHECK-ARM6-NEXT: clz r1, r16423; CHECK-ARM6-NEXT: lsr r1, r1, #56424; CHECK-ARM6-NEXT: cmp r1, #16425; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill6426; CHECK-ARM6-NEXT: bne .LBB31_16427; CHECK-ARM6-NEXT: b .LBB31_56428; CHECK-ARM6-NEXT: .LBB31_5: @ %atomicrmw.end6429; CHECK-ARM6-NEXT: ldr r0, [sp] @ 4-byte Reload6430; CHECK-ARM6-NEXT: add sp, sp, #86431; CHECK-ARM6-NEXT: bx lr6432; CHECK-ARM6-NEXT: .p2align 26433; CHECK-ARM6-NEXT: @ %bb.6:6434; CHECK-ARM6-NEXT: .LCPI31_0:6435; CHECK-ARM6-NEXT: .long atomic_i326436;6437; CHECK-THUMB7-LABEL: test_umax_i32:6438; CHECK-THUMB7: @ %bb.0: @ %entry6439; CHECK-THUMB7-NEXT: .pad #86440; CHECK-THUMB7-NEXT: sub sp, #86441; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i326442; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i326443; CHECK-THUMB7-NEXT: ldr r0, [r0]6444; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill6445; CHECK-THUMB7-NEXT: b .LBB31_16446; CHECK-THUMB7-NEXT: .LBB31_1: @ %atomicrmw.start6447; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=16448; CHECK-THUMB7-NEXT: @ Child Loop BB31_2 Depth 26449; CHECK-THUMB7-NEXT: ldr r1, [sp, #4] @ 4-byte Reload6450; CHECK-THUMB7-NEXT: cmp r1, #16451; CHECK-THUMB7-NEXT: mov.w r12, #16452; CHECK-THUMB7-NEXT: it hi6453; CHECK-THUMB7-NEXT: movhi r12, r16454; CHECK-THUMB7-NEXT: movw r3, :lower16:atomic_i326455; CHECK-THUMB7-NEXT: movt r3, :upper16:atomic_i326456; CHECK-THUMB7-NEXT: .LBB31_2: @ %atomicrmw.start6457; CHECK-THUMB7-NEXT: @ Parent Loop BB31_1 Depth=16458; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=26459; CHECK-THUMB7-NEXT: ldrex r0, [r3]6460; CHECK-THUMB7-NEXT: cmp r0, r16461; CHECK-THUMB7-NEXT: bne .LBB31_46462; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start6463; CHECK-THUMB7-NEXT: @ in Loop: Header=BB31_2 Depth=26464; CHECK-THUMB7-NEXT: strex r2, r12, [r3]6465; CHECK-THUMB7-NEXT: cmp r2, #06466; CHECK-THUMB7-NEXT: bne .LBB31_26467; CHECK-THUMB7-NEXT: .LBB31_4: @ %atomicrmw.start6468; CHECK-THUMB7-NEXT: @ in Loop: Header=BB31_1 Depth=16469; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill6470; CHECK-THUMB7-NEXT: subs r1, r0, r16471; CHECK-THUMB7-NEXT: clz r1, r16472; CHECK-THUMB7-NEXT: lsrs r1, r1, #56473; CHECK-THUMB7-NEXT: cmp r1, #16474; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill6475; CHECK-THUMB7-NEXT: bne .LBB31_16476; CHECK-THUMB7-NEXT: b .LBB31_56477; CHECK-THUMB7-NEXT: .LBB31_5: @ %atomicrmw.end6478; CHECK-THUMB7-NEXT: ldr r0, [sp] @ 4-byte Reload6479; CHECK-THUMB7-NEXT: add sp, #86480; CHECK-THUMB7-NEXT: bx lr6481;6482; CHECK-THUMB6-LABEL: test_umax_i32:6483; CHECK-THUMB6: @ %bb.0: @ %entry6484; CHECK-THUMB6-NEXT: .save {r7, lr}6485; CHECK-THUMB6-NEXT: push {r7, lr}6486; CHECK-THUMB6-NEXT: ldr r0, .LCPI31_06487; CHECK-THUMB6-NEXT: movs r1, #16488; CHECK-THUMB6-NEXT: bl __sync_fetch_and_umax_46489; CHECK-THUMB6-NEXT: pop {r7, pc}6490; CHECK-THUMB6-NEXT: .p2align 26491; CHECK-THUMB6-NEXT: @ %bb.1:6492; CHECK-THUMB6-NEXT: .LCPI31_0:6493; CHECK-THUMB6-NEXT: .long atomic_i326494;6495; CHECK-THUMB8BASE-LABEL: test_umax_i32:6496; CHECK-THUMB8BASE: @ %bb.0: @ %entry6497; CHECK-THUMB8BASE-NEXT: .save {r4, lr}6498; CHECK-THUMB8BASE-NEXT: push {r4, lr}6499; CHECK-THUMB8BASE-NEXT: .pad #206500; CHECK-THUMB8BASE-NEXT: sub sp, #206501; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i326502; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i326503; CHECK-THUMB8BASE-NEXT: ldr r0, [r0]6504; CHECK-THUMB8BASE-NEXT: str r0, [sp, #16] @ 4-byte Spill6505; CHECK-THUMB8BASE-NEXT: b .LBB31_16506; CHECK-THUMB8BASE-NEXT: .LBB31_1: @ %atomicrmw.start6507; CHECK-THUMB8BASE-NEXT: @ =>This Loop Header: Depth=16508; CHECK-THUMB8BASE-NEXT: @ Child Loop BB31_4 Depth 26509; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #16] @ 4-byte Reload6510; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill6511; CHECK-THUMB8BASE-NEXT: movs r1, #16512; CHECK-THUMB8BASE-NEXT: str r1, [sp, #8] @ 4-byte Spill6513; CHECK-THUMB8BASE-NEXT: cmp r0, #16514; CHECK-THUMB8BASE-NEXT: str r0, [sp, #12] @ 4-byte Spill6515; CHECK-THUMB8BASE-NEXT: bhi .LBB31_36516; CHECK-THUMB8BASE-NEXT: @ %bb.2: @ %atomicrmw.start6517; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB31_1 Depth=16518; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #8] @ 4-byte Reload6519; CHECK-THUMB8BASE-NEXT: str r0, [sp, #12] @ 4-byte Spill6520; CHECK-THUMB8BASE-NEXT: .LBB31_3: @ %atomicrmw.start6521; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB31_1 Depth=16522; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #4] @ 4-byte Reload6523; CHECK-THUMB8BASE-NEXT: ldr r4, [sp, #12] @ 4-byte Reload6524; CHECK-THUMB8BASE-NEXT: movw r3, :lower16:atomic_i326525; CHECK-THUMB8BASE-NEXT: movt r3, :upper16:atomic_i326526; CHECK-THUMB8BASE-NEXT: .LBB31_4: @ %atomicrmw.start6527; CHECK-THUMB8BASE-NEXT: @ Parent Loop BB31_1 Depth=16528; CHECK-THUMB8BASE-NEXT: @ => This Inner Loop Header: Depth=26529; CHECK-THUMB8BASE-NEXT: ldrex r0, [r3]6530; CHECK-THUMB8BASE-NEXT: cmp r0, r16531; CHECK-THUMB8BASE-NEXT: bne .LBB31_66532; CHECK-THUMB8BASE-NEXT: @ %bb.5: @ %atomicrmw.start6533; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB31_4 Depth=26534; CHECK-THUMB8BASE-NEXT: strex r2, r4, [r3]6535; CHECK-THUMB8BASE-NEXT: cmp r2, #06536; CHECK-THUMB8BASE-NEXT: bne .LBB31_46537; CHECK-THUMB8BASE-NEXT: .LBB31_6: @ %atomicrmw.start6538; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB31_1 Depth=16539; CHECK-THUMB8BASE-NEXT: str r0, [sp] @ 4-byte Spill6540; CHECK-THUMB8BASE-NEXT: subs r1, r0, r16541; CHECK-THUMB8BASE-NEXT: rsbs r2, r1, #06542; CHECK-THUMB8BASE-NEXT: adcs r1, r26543; CHECK-THUMB8BASE-NEXT: cmp r1, #16544; CHECK-THUMB8BASE-NEXT: str r0, [sp, #16] @ 4-byte Spill6545; CHECK-THUMB8BASE-NEXT: bne .LBB31_16546; CHECK-THUMB8BASE-NEXT: b .LBB31_76547; CHECK-THUMB8BASE-NEXT: .LBB31_7: @ %atomicrmw.end6548; CHECK-THUMB8BASE-NEXT: ldr r0, [sp] @ 4-byte Reload6549; CHECK-THUMB8BASE-NEXT: add sp, #206550; CHECK-THUMB8BASE-NEXT: pop {r4, pc}6551entry:6552 %0 = atomicrmw umax ptr @atomic_i32, i32 1 monotonic6553 ret i32 %06554}6555define i32 @test_umin_i32() {6556; CHECK-ARM8-LABEL: test_umin_i32:6557; CHECK-ARM8: @ %bb.0: @ %entry6558; CHECK-ARM8-NEXT: .pad #86559; CHECK-ARM8-NEXT: sub sp, sp, #86560; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i326561; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i326562; CHECK-ARM8-NEXT: ldr r0, [r0]6563; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill6564; CHECK-ARM8-NEXT: b .LBB32_16565; CHECK-ARM8-NEXT: .LBB32_1: @ %atomicrmw.start6566; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=16567; CHECK-ARM8-NEXT: @ Child Loop BB32_2 Depth 26568; CHECK-ARM8-NEXT: ldr r1, [sp, #4] @ 4-byte Reload6569; CHECK-ARM8-NEXT: cmp r1, #26570; CHECK-ARM8-NEXT: mov r12, #16571; CHECK-ARM8-NEXT: movlo r12, r16572; CHECK-ARM8-NEXT: movw r3, :lower16:atomic_i326573; CHECK-ARM8-NEXT: movt r3, :upper16:atomic_i326574; CHECK-ARM8-NEXT: .LBB32_2: @ %atomicrmw.start6575; CHECK-ARM8-NEXT: @ Parent Loop BB32_1 Depth=16576; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=26577; CHECK-ARM8-NEXT: ldrex r0, [r3]6578; CHECK-ARM8-NEXT: cmp r0, r16579; CHECK-ARM8-NEXT: bne .LBB32_46580; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start6581; CHECK-ARM8-NEXT: @ in Loop: Header=BB32_2 Depth=26582; CHECK-ARM8-NEXT: strex r2, r12, [r3]6583; CHECK-ARM8-NEXT: cmp r2, #06584; CHECK-ARM8-NEXT: bne .LBB32_26585; CHECK-ARM8-NEXT: .LBB32_4: @ %atomicrmw.start6586; CHECK-ARM8-NEXT: @ in Loop: Header=BB32_1 Depth=16587; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill6588; CHECK-ARM8-NEXT: sub r1, r0, r16589; CHECK-ARM8-NEXT: clz r1, r16590; CHECK-ARM8-NEXT: lsr r1, r1, #56591; CHECK-ARM8-NEXT: cmp r1, #16592; CHECK-ARM8-NEXT: str r0, [sp, #4] @ 4-byte Spill6593; CHECK-ARM8-NEXT: bne .LBB32_16594; CHECK-ARM8-NEXT: b .LBB32_56595; CHECK-ARM8-NEXT: .LBB32_5: @ %atomicrmw.end6596; CHECK-ARM8-NEXT: ldr r0, [sp] @ 4-byte Reload6597; CHECK-ARM8-NEXT: add sp, sp, #86598; CHECK-ARM8-NEXT: bx lr6599;6600; CHECK-ARM6-LABEL: test_umin_i32:6601; CHECK-ARM6: @ %bb.0: @ %entry6602; CHECK-ARM6-NEXT: .pad #86603; CHECK-ARM6-NEXT: sub sp, sp, #86604; CHECK-ARM6-NEXT: ldr r0, .LCPI32_06605; CHECK-ARM6-NEXT: ldr r0, [r0]6606; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill6607; CHECK-ARM6-NEXT: b .LBB32_16608; CHECK-ARM6-NEXT: .LBB32_1: @ %atomicrmw.start6609; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=16610; CHECK-ARM6-NEXT: @ Child Loop BB32_2 Depth 26611; CHECK-ARM6-NEXT: ldr r1, [sp, #4] @ 4-byte Reload6612; CHECK-ARM6-NEXT: cmp r1, #26613; CHECK-ARM6-NEXT: mov r12, #16614; CHECK-ARM6-NEXT: movlo r12, r16615; CHECK-ARM6-NEXT: ldr r3, .LCPI32_06616; CHECK-ARM6-NEXT: .LBB32_2: @ %atomicrmw.start6617; CHECK-ARM6-NEXT: @ Parent Loop BB32_1 Depth=16618; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=26619; CHECK-ARM6-NEXT: ldrex r0, [r3]6620; CHECK-ARM6-NEXT: cmp r0, r16621; CHECK-ARM6-NEXT: bne .LBB32_46622; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start6623; CHECK-ARM6-NEXT: @ in Loop: Header=BB32_2 Depth=26624; CHECK-ARM6-NEXT: strex r2, r12, [r3]6625; CHECK-ARM6-NEXT: cmp r2, #06626; CHECK-ARM6-NEXT: bne .LBB32_26627; CHECK-ARM6-NEXT: .LBB32_4: @ %atomicrmw.start6628; CHECK-ARM6-NEXT: @ in Loop: Header=BB32_1 Depth=16629; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill6630; CHECK-ARM6-NEXT: sub r1, r0, r16631; CHECK-ARM6-NEXT: clz r1, r16632; CHECK-ARM6-NEXT: lsr r1, r1, #56633; CHECK-ARM6-NEXT: cmp r1, #16634; CHECK-ARM6-NEXT: str r0, [sp, #4] @ 4-byte Spill6635; CHECK-ARM6-NEXT: bne .LBB32_16636; CHECK-ARM6-NEXT: b .LBB32_56637; CHECK-ARM6-NEXT: .LBB32_5: @ %atomicrmw.end6638; CHECK-ARM6-NEXT: ldr r0, [sp] @ 4-byte Reload6639; CHECK-ARM6-NEXT: add sp, sp, #86640; CHECK-ARM6-NEXT: bx lr6641; CHECK-ARM6-NEXT: .p2align 26642; CHECK-ARM6-NEXT: @ %bb.6:6643; CHECK-ARM6-NEXT: .LCPI32_0:6644; CHECK-ARM6-NEXT: .long atomic_i326645;6646; CHECK-THUMB7-LABEL: test_umin_i32:6647; CHECK-THUMB7: @ %bb.0: @ %entry6648; CHECK-THUMB7-NEXT: .pad #86649; CHECK-THUMB7-NEXT: sub sp, #86650; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i326651; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i326652; CHECK-THUMB7-NEXT: ldr r0, [r0]6653; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill6654; CHECK-THUMB7-NEXT: b .LBB32_16655; CHECK-THUMB7-NEXT: .LBB32_1: @ %atomicrmw.start6656; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=16657; CHECK-THUMB7-NEXT: @ Child Loop BB32_2 Depth 26658; CHECK-THUMB7-NEXT: ldr r1, [sp, #4] @ 4-byte Reload6659; CHECK-THUMB7-NEXT: cmp r1, #26660; CHECK-THUMB7-NEXT: mov.w r12, #16661; CHECK-THUMB7-NEXT: it lo6662; CHECK-THUMB7-NEXT: movlo r12, r16663; CHECK-THUMB7-NEXT: movw r3, :lower16:atomic_i326664; CHECK-THUMB7-NEXT: movt r3, :upper16:atomic_i326665; CHECK-THUMB7-NEXT: .LBB32_2: @ %atomicrmw.start6666; CHECK-THUMB7-NEXT: @ Parent Loop BB32_1 Depth=16667; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=26668; CHECK-THUMB7-NEXT: ldrex r0, [r3]6669; CHECK-THUMB7-NEXT: cmp r0, r16670; CHECK-THUMB7-NEXT: bne .LBB32_46671; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start6672; CHECK-THUMB7-NEXT: @ in Loop: Header=BB32_2 Depth=26673; CHECK-THUMB7-NEXT: strex r2, r12, [r3]6674; CHECK-THUMB7-NEXT: cmp r2, #06675; CHECK-THUMB7-NEXT: bne .LBB32_26676; CHECK-THUMB7-NEXT: .LBB32_4: @ %atomicrmw.start6677; CHECK-THUMB7-NEXT: @ in Loop: Header=BB32_1 Depth=16678; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill6679; CHECK-THUMB7-NEXT: subs r1, r0, r16680; CHECK-THUMB7-NEXT: clz r1, r16681; CHECK-THUMB7-NEXT: lsrs r1, r1, #56682; CHECK-THUMB7-NEXT: cmp r1, #16683; CHECK-THUMB7-NEXT: str r0, [sp, #4] @ 4-byte Spill6684; CHECK-THUMB7-NEXT: bne .LBB32_16685; CHECK-THUMB7-NEXT: b .LBB32_56686; CHECK-THUMB7-NEXT: .LBB32_5: @ %atomicrmw.end6687; CHECK-THUMB7-NEXT: ldr r0, [sp] @ 4-byte Reload6688; CHECK-THUMB7-NEXT: add sp, #86689; CHECK-THUMB7-NEXT: bx lr6690;6691; CHECK-THUMB6-LABEL: test_umin_i32:6692; CHECK-THUMB6: @ %bb.0: @ %entry6693; CHECK-THUMB6-NEXT: .save {r7, lr}6694; CHECK-THUMB6-NEXT: push {r7, lr}6695; CHECK-THUMB6-NEXT: ldr r0, .LCPI32_06696; CHECK-THUMB6-NEXT: movs r1, #16697; CHECK-THUMB6-NEXT: bl __sync_fetch_and_umin_46698; CHECK-THUMB6-NEXT: pop {r7, pc}6699; CHECK-THUMB6-NEXT: .p2align 26700; CHECK-THUMB6-NEXT: @ %bb.1:6701; CHECK-THUMB6-NEXT: .LCPI32_0:6702; CHECK-THUMB6-NEXT: .long atomic_i326703;6704; CHECK-THUMB8BASE-LABEL: test_umin_i32:6705; CHECK-THUMB8BASE: @ %bb.0: @ %entry6706; CHECK-THUMB8BASE-NEXT: .save {r4, lr}6707; CHECK-THUMB8BASE-NEXT: push {r4, lr}6708; CHECK-THUMB8BASE-NEXT: .pad #206709; CHECK-THUMB8BASE-NEXT: sub sp, #206710; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i326711; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i326712; CHECK-THUMB8BASE-NEXT: ldr r0, [r0]6713; CHECK-THUMB8BASE-NEXT: str r0, [sp, #16] @ 4-byte Spill6714; CHECK-THUMB8BASE-NEXT: b .LBB32_16715; CHECK-THUMB8BASE-NEXT: .LBB32_1: @ %atomicrmw.start6716; CHECK-THUMB8BASE-NEXT: @ =>This Loop Header: Depth=16717; CHECK-THUMB8BASE-NEXT: @ Child Loop BB32_4 Depth 26718; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #16] @ 4-byte Reload6719; CHECK-THUMB8BASE-NEXT: str r0, [sp, #4] @ 4-byte Spill6720; CHECK-THUMB8BASE-NEXT: movs r1, #16721; CHECK-THUMB8BASE-NEXT: str r1, [sp, #8] @ 4-byte Spill6722; CHECK-THUMB8BASE-NEXT: cmp r0, #26723; CHECK-THUMB8BASE-NEXT: str r0, [sp, #12] @ 4-byte Spill6724; CHECK-THUMB8BASE-NEXT: blo .LBB32_36725; CHECK-THUMB8BASE-NEXT: @ %bb.2: @ %atomicrmw.start6726; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB32_1 Depth=16727; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #8] @ 4-byte Reload6728; CHECK-THUMB8BASE-NEXT: str r0, [sp, #12] @ 4-byte Spill6729; CHECK-THUMB8BASE-NEXT: .LBB32_3: @ %atomicrmw.start6730; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB32_1 Depth=16731; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #4] @ 4-byte Reload6732; CHECK-THUMB8BASE-NEXT: ldr r4, [sp, #12] @ 4-byte Reload6733; CHECK-THUMB8BASE-NEXT: movw r3, :lower16:atomic_i326734; CHECK-THUMB8BASE-NEXT: movt r3, :upper16:atomic_i326735; CHECK-THUMB8BASE-NEXT: .LBB32_4: @ %atomicrmw.start6736; CHECK-THUMB8BASE-NEXT: @ Parent Loop BB32_1 Depth=16737; CHECK-THUMB8BASE-NEXT: @ => This Inner Loop Header: Depth=26738; CHECK-THUMB8BASE-NEXT: ldrex r0, [r3]6739; CHECK-THUMB8BASE-NEXT: cmp r0, r16740; CHECK-THUMB8BASE-NEXT: bne .LBB32_66741; CHECK-THUMB8BASE-NEXT: @ %bb.5: @ %atomicrmw.start6742; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB32_4 Depth=26743; CHECK-THUMB8BASE-NEXT: strex r2, r4, [r3]6744; CHECK-THUMB8BASE-NEXT: cmp r2, #06745; CHECK-THUMB8BASE-NEXT: bne .LBB32_46746; CHECK-THUMB8BASE-NEXT: .LBB32_6: @ %atomicrmw.start6747; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB32_1 Depth=16748; CHECK-THUMB8BASE-NEXT: str r0, [sp] @ 4-byte Spill6749; CHECK-THUMB8BASE-NEXT: subs r1, r0, r16750; CHECK-THUMB8BASE-NEXT: rsbs r2, r1, #06751; CHECK-THUMB8BASE-NEXT: adcs r1, r26752; CHECK-THUMB8BASE-NEXT: cmp r1, #16753; CHECK-THUMB8BASE-NEXT: str r0, [sp, #16] @ 4-byte Spill6754; CHECK-THUMB8BASE-NEXT: bne .LBB32_16755; CHECK-THUMB8BASE-NEXT: b .LBB32_76756; CHECK-THUMB8BASE-NEXT: .LBB32_7: @ %atomicrmw.end6757; CHECK-THUMB8BASE-NEXT: ldr r0, [sp] @ 4-byte Reload6758; CHECK-THUMB8BASE-NEXT: add sp, #206759; CHECK-THUMB8BASE-NEXT: pop {r4, pc}6760entry:6761 %0 = atomicrmw umin ptr @atomic_i32, i32 1 monotonic6762 ret i32 %06763}6764 6765define i64 @test_xchg_i64() {6766; CHECK-ARM8-LABEL: test_xchg_i64:6767; CHECK-ARM8: @ %bb.0: @ %entry6768; 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 #166771; CHECK-ARM8-NEXT: sub sp, sp, #166772; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i646773; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i646774; CHECK-ARM8-NEXT: ldr r1, [r0]6775; CHECK-ARM8-NEXT: ldr r0, [r0, #4]6776; CHECK-ARM8-NEXT: str r1, [sp, #8] @ 4-byte Spill6777; CHECK-ARM8-NEXT: str r0, [sp, #12] @ 4-byte Spill6778; CHECK-ARM8-NEXT: b .LBB33_16779; CHECK-ARM8-NEXT: .LBB33_1: @ %atomicrmw.start6780; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=16781; CHECK-ARM8-NEXT: @ Child Loop BB33_2 Depth 26782; CHECK-ARM8-NEXT: ldr r1, [sp, #12] @ 4-byte Reload6783; CHECK-ARM8-NEXT: ldr r2, [sp, #8] @ 4-byte Reload6784; CHECK-ARM8-NEXT: movw r6, :lower16:atomic_i646785; CHECK-ARM8-NEXT: movt r6, :upper16:atomic_i646786; CHECK-ARM8-NEXT: @ implicit-def: $r06787; CHECK-ARM8-NEXT: @ implicit-def: $r36788; CHECK-ARM8-NEXT: @ kill: def $r6 killed $r6 def $r6_r76789; CHECK-ARM8-NEXT: mov r7, r06790; CHECK-ARM8-NEXT: mov r8, r26791; CHECK-ARM8-NEXT: mov r9, r16792; CHECK-ARM8-NEXT: mov r0, #06793; CHECK-ARM8-NEXT: mov r10, #16794; CHECK-ARM8-NEXT: @ kill: def $r10 killed $r10 def $r10_r116795; CHECK-ARM8-NEXT: mov r11, r06796; CHECK-ARM8-NEXT: .LBB33_2: @ %atomicrmw.start6797; CHECK-ARM8-NEXT: @ Parent Loop BB33_1 Depth=16798; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=26799; CHECK-ARM8-NEXT: ldrexd r4, r5, [r6]6800; CHECK-ARM8-NEXT: cmp r4, r86801; CHECK-ARM8-NEXT: cmpeq r5, r96802; CHECK-ARM8-NEXT: bne .LBB33_46803; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start6804; CHECK-ARM8-NEXT: @ in Loop: Header=BB33_2 Depth=26805; CHECK-ARM8-NEXT: strexd r7, r10, r11, [r6]6806; CHECK-ARM8-NEXT: cmp r7, #06807; CHECK-ARM8-NEXT: bne .LBB33_26808; CHECK-ARM8-NEXT: .LBB33_4: @ %atomicrmw.start6809; CHECK-ARM8-NEXT: @ in Loop: Header=BB33_1 Depth=16810; CHECK-ARM8-NEXT: mov r0, r56811; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill6812; CHECK-ARM8-NEXT: eor r3, r0, r16813; CHECK-ARM8-NEXT: mov r1, r46814; CHECK-ARM8-NEXT: str r1, [sp, #4] @ 4-byte Spill6815; CHECK-ARM8-NEXT: eor r2, r1, r26816; CHECK-ARM8-NEXT: orr r2, r2, r36817; CHECK-ARM8-NEXT: cmp r2, #06818; CHECK-ARM8-NEXT: str r1, [sp, #8] @ 4-byte Spill6819; CHECK-ARM8-NEXT: str r0, [sp, #12] @ 4-byte Spill6820; CHECK-ARM8-NEXT: bne .LBB33_16821; CHECK-ARM8-NEXT: b .LBB33_56822; CHECK-ARM8-NEXT: .LBB33_5: @ %atomicrmw.end6823; CHECK-ARM8-NEXT: ldr r1, [sp] @ 4-byte Reload6824; CHECK-ARM8-NEXT: ldr r0, [sp, #4] @ 4-byte Reload6825; CHECK-ARM8-NEXT: add sp, sp, #166826; 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: @ %entry6830; 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 #166833; CHECK-ARM6-NEXT: sub sp, sp, #166834; CHECK-ARM6-NEXT: ldr r0, .LCPI33_06835; CHECK-ARM6-NEXT: ldr r1, [r0]6836; CHECK-ARM6-NEXT: ldr r0, [r0, #4]6837; CHECK-ARM6-NEXT: str r1, [sp, #8] @ 4-byte Spill6838; CHECK-ARM6-NEXT: str r0, [sp, #12] @ 4-byte Spill6839; CHECK-ARM6-NEXT: b .LBB33_16840; CHECK-ARM6-NEXT: .LBB33_1: @ %atomicrmw.start6841; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=16842; CHECK-ARM6-NEXT: @ Child Loop BB33_2 Depth 26843; CHECK-ARM6-NEXT: ldr r1, [sp, #12] @ 4-byte Reload6844; CHECK-ARM6-NEXT: ldr r2, [sp, #8] @ 4-byte Reload6845; CHECK-ARM6-NEXT: ldr r6, .LCPI33_06846; CHECK-ARM6-NEXT: @ implicit-def: $r06847; CHECK-ARM6-NEXT: @ implicit-def: $r36848; CHECK-ARM6-NEXT: @ kill: def $r6 killed $r6 def $r6_r76849; CHECK-ARM6-NEXT: mov r7, r06850; CHECK-ARM6-NEXT: mov r8, r26851; CHECK-ARM6-NEXT: mov r9, r16852; CHECK-ARM6-NEXT: mov r0, #06853; CHECK-ARM6-NEXT: mov r10, #16854; CHECK-ARM6-NEXT: @ kill: def $r10 killed $r10 def $r10_r116855; CHECK-ARM6-NEXT: mov r11, r06856; CHECK-ARM6-NEXT: .LBB33_2: @ %atomicrmw.start6857; CHECK-ARM6-NEXT: @ Parent Loop BB33_1 Depth=16858; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=26859; CHECK-ARM6-NEXT: ldrexd r4, r5, [r6]6860; CHECK-ARM6-NEXT: cmp r4, r86861; CHECK-ARM6-NEXT: cmpeq r5, r96862; CHECK-ARM6-NEXT: bne .LBB33_46863; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start6864; CHECK-ARM6-NEXT: @ in Loop: Header=BB33_2 Depth=26865; CHECK-ARM6-NEXT: strexd r7, r10, r11, [r6]6866; CHECK-ARM6-NEXT: cmp r7, #06867; CHECK-ARM6-NEXT: bne .LBB33_26868; CHECK-ARM6-NEXT: .LBB33_4: @ %atomicrmw.start6869; CHECK-ARM6-NEXT: @ in Loop: Header=BB33_1 Depth=16870; CHECK-ARM6-NEXT: mov r0, r56871; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill6872; CHECK-ARM6-NEXT: eor r3, r0, r16873; CHECK-ARM6-NEXT: mov r1, r46874; CHECK-ARM6-NEXT: str r1, [sp, #4] @ 4-byte Spill6875; CHECK-ARM6-NEXT: eor r2, r1, r26876; CHECK-ARM6-NEXT: orr r2, r2, r36877; CHECK-ARM6-NEXT: cmp r2, #06878; CHECK-ARM6-NEXT: str r1, [sp, #8] @ 4-byte Spill6879; CHECK-ARM6-NEXT: str r0, [sp, #12] @ 4-byte Spill6880; CHECK-ARM6-NEXT: bne .LBB33_16881; CHECK-ARM6-NEXT: b .LBB33_56882; CHECK-ARM6-NEXT: .LBB33_5: @ %atomicrmw.end6883; CHECK-ARM6-NEXT: ldr r1, [sp] @ 4-byte Reload6884; CHECK-ARM6-NEXT: ldr r0, [sp, #4] @ 4-byte Reload6885; CHECK-ARM6-NEXT: add sp, sp, #166886; CHECK-ARM6-NEXT: pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}6887; CHECK-ARM6-NEXT: .p2align 26888; CHECK-ARM6-NEXT: @ %bb.6:6889; CHECK-ARM6-NEXT: .LCPI33_0:6890; CHECK-ARM6-NEXT: .long atomic_i646891;6892; CHECK-THUMB7-LABEL: test_xchg_i64:6893; CHECK-THUMB7: @ %bb.0: @ %entry6894; 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 #166897; CHECK-THUMB7-NEXT: sub sp, #166898; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i646899; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i646900; CHECK-THUMB7-NEXT: ldr r1, [r0]6901; CHECK-THUMB7-NEXT: ldr r0, [r0, #4]6902; CHECK-THUMB7-NEXT: str r1, [sp, #8] @ 4-byte Spill6903; CHECK-THUMB7-NEXT: str r0, [sp, #12] @ 4-byte Spill6904; CHECK-THUMB7-NEXT: b .LBB33_16905; CHECK-THUMB7-NEXT: .LBB33_1: @ %atomicrmw.start6906; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=16907; CHECK-THUMB7-NEXT: @ Child Loop BB33_2 Depth 26908; CHECK-THUMB7-NEXT: ldr r1, [sp, #12] @ 4-byte Reload6909; CHECK-THUMB7-NEXT: ldr r2, [sp, #8] @ 4-byte Reload6910; CHECK-THUMB7-NEXT: movw r6, :lower16:atomic_i646911; CHECK-THUMB7-NEXT: movt r6, :upper16:atomic_i646912; CHECK-THUMB7-NEXT: @ implicit-def: $r06913; CHECK-THUMB7-NEXT: @ implicit-def: $r36914; CHECK-THUMB7-NEXT: @ kill: def $r6 killed $r6 def $r6_r76915; CHECK-THUMB7-NEXT: mov r7, r06916; CHECK-THUMB7-NEXT: mov r8, r26917; CHECK-THUMB7-NEXT: mov r9, r16918; CHECK-THUMB7-NEXT: movs r0, #06919; CHECK-THUMB7-NEXT: mov.w r10, #16920; CHECK-THUMB7-NEXT: @ kill: def $r10 killed $r10 def $r10_r116921; CHECK-THUMB7-NEXT: mov r11, r06922; CHECK-THUMB7-NEXT: .LBB33_2: @ %atomicrmw.start6923; CHECK-THUMB7-NEXT: @ Parent Loop BB33_1 Depth=16924; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=26925; CHECK-THUMB7-NEXT: ldrexd r4, r5, [r6]6926; CHECK-THUMB7-NEXT: cmp r4, r86927; CHECK-THUMB7-NEXT: it eq6928; CHECK-THUMB7-NEXT: cmpeq r5, r96929; CHECK-THUMB7-NEXT: bne .LBB33_46930; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start6931; CHECK-THUMB7-NEXT: @ in Loop: Header=BB33_2 Depth=26932; CHECK-THUMB7-NEXT: strexd r7, r10, r11, [r6]6933; CHECK-THUMB7-NEXT: cmp r7, #06934; CHECK-THUMB7-NEXT: bne .LBB33_26935; CHECK-THUMB7-NEXT: .LBB33_4: @ %atomicrmw.start6936; CHECK-THUMB7-NEXT: @ in Loop: Header=BB33_1 Depth=16937; CHECK-THUMB7-NEXT: mov r0, r56938; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill6939; CHECK-THUMB7-NEXT: eor.w r3, r0, r16940; CHECK-THUMB7-NEXT: mov r1, r46941; CHECK-THUMB7-NEXT: str r1, [sp, #4] @ 4-byte Spill6942; CHECK-THUMB7-NEXT: eors r2, r16943; CHECK-THUMB7-NEXT: orrs r2, r36944; CHECK-THUMB7-NEXT: cmp r2, #06945; CHECK-THUMB7-NEXT: str r1, [sp, #8] @ 4-byte Spill6946; CHECK-THUMB7-NEXT: str r0, [sp, #12] @ 4-byte Spill6947; CHECK-THUMB7-NEXT: bne .LBB33_16948; CHECK-THUMB7-NEXT: b .LBB33_56949; CHECK-THUMB7-NEXT: .LBB33_5: @ %atomicrmw.end6950; CHECK-THUMB7-NEXT: ldr r1, [sp] @ 4-byte Reload6951; CHECK-THUMB7-NEXT: ldr r0, [sp, #4] @ 4-byte Reload6952; CHECK-THUMB7-NEXT: add sp, #166953; 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: @ %entry6957; CHECK-THUMB6-NEXT: .save {r7, lr}6958; CHECK-THUMB6-NEXT: push {r7, lr}6959; CHECK-THUMB6-NEXT: ldr r0, .LCPI33_06960; CHECK-THUMB6-NEXT: movs r2, #16961; CHECK-THUMB6-NEXT: movs r3, #06962; CHECK-THUMB6-NEXT: bl __sync_lock_test_and_set_86963; CHECK-THUMB6-NEXT: pop {r7, pc}6964; CHECK-THUMB6-NEXT: .p2align 26965; CHECK-THUMB6-NEXT: @ %bb.1:6966; CHECK-THUMB6-NEXT: .LCPI33_0:6967; CHECK-THUMB6-NEXT: .long atomic_i646968;6969; CHECK-THUMB8BASE-LABEL: test_xchg_i64:6970; CHECK-THUMB8BASE: @ %bb.0: @ %entry6971; CHECK-THUMB8BASE-NEXT: .save {r7, lr}6972; CHECK-THUMB8BASE-NEXT: push {r7, lr}6973; CHECK-THUMB8BASE-NEXT: .pad #86974; CHECK-THUMB8BASE-NEXT: sub sp, #86975; CHECK-THUMB8BASE-NEXT: movs r3, #06976; CHECK-THUMB8BASE-NEXT: str r3, [sp]6977; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i646978; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i646979; CHECK-THUMB8BASE-NEXT: movs r2, #16980; CHECK-THUMB8BASE-NEXT: bl __atomic_exchange_86981; CHECK-THUMB8BASE-NEXT: add sp, #86982; CHECK-THUMB8BASE-NEXT: pop {r7, pc}6983entry:6984 %0 = atomicrmw xchg ptr @atomic_i64, i64 1 monotonic6985 ret i64 %06986}6987define i64 @test_add_i64() {6988; CHECK-ARM8-LABEL: test_add_i64:6989; CHECK-ARM8: @ %bb.0: @ %entry6990; 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 #166993; CHECK-ARM8-NEXT: sub sp, sp, #166994; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i646995; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i646996; CHECK-ARM8-NEXT: ldr r1, [r0]6997; CHECK-ARM8-NEXT: ldr r0, [r0, #4]6998; CHECK-ARM8-NEXT: str r1, [sp, #8] @ 4-byte Spill6999; CHECK-ARM8-NEXT: str r0, [sp, #12] @ 4-byte Spill7000; CHECK-ARM8-NEXT: b .LBB34_17001; CHECK-ARM8-NEXT: .LBB34_1: @ %atomicrmw.start7002; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=17003; CHECK-ARM8-NEXT: @ Child Loop BB34_2 Depth 27004; CHECK-ARM8-NEXT: ldr r1, [sp, #12] @ 4-byte Reload7005; CHECK-ARM8-NEXT: ldr r2, [sp, #8] @ 4-byte Reload7006; CHECK-ARM8-NEXT: mov r8, r27007; CHECK-ARM8-NEXT: mov r9, r17008; CHECK-ARM8-NEXT: adds r10, r2, #17009; CHECK-ARM8-NEXT: adc r0, r1, #07010; CHECK-ARM8-NEXT: @ kill: def $r10 killed $r10 def $r10_r117011; CHECK-ARM8-NEXT: mov r11, r07012; CHECK-ARM8-NEXT: movw r6, :lower16:atomic_i647013; CHECK-ARM8-NEXT: movt r6, :upper16:atomic_i647014; CHECK-ARM8-NEXT: @ implicit-def: $r07015; CHECK-ARM8-NEXT: @ implicit-def: $r37016; CHECK-ARM8-NEXT: @ kill: def $r6 killed $r6 def $r6_r77017; CHECK-ARM8-NEXT: mov r7, r07018; CHECK-ARM8-NEXT: .LBB34_2: @ %atomicrmw.start7019; CHECK-ARM8-NEXT: @ Parent Loop BB34_1 Depth=17020; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=27021; CHECK-ARM8-NEXT: ldrexd r4, r5, [r6]7022; CHECK-ARM8-NEXT: cmp r4, r87023; CHECK-ARM8-NEXT: cmpeq r5, r97024; CHECK-ARM8-NEXT: bne .LBB34_47025; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start7026; CHECK-ARM8-NEXT: @ in Loop: Header=BB34_2 Depth=27027; CHECK-ARM8-NEXT: strexd r7, r10, r11, [r6]7028; CHECK-ARM8-NEXT: cmp r7, #07029; CHECK-ARM8-NEXT: bne .LBB34_27030; CHECK-ARM8-NEXT: .LBB34_4: @ %atomicrmw.start7031; CHECK-ARM8-NEXT: @ in Loop: Header=BB34_1 Depth=17032; CHECK-ARM8-NEXT: mov r0, r57033; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill7034; CHECK-ARM8-NEXT: eor r3, r0, r17035; CHECK-ARM8-NEXT: mov r1, r47036; CHECK-ARM8-NEXT: str r1, [sp, #4] @ 4-byte Spill7037; CHECK-ARM8-NEXT: eor r2, r1, r27038; CHECK-ARM8-NEXT: orr r2, r2, r37039; CHECK-ARM8-NEXT: cmp r2, #07040; CHECK-ARM8-NEXT: str r1, [sp, #8] @ 4-byte Spill7041; CHECK-ARM8-NEXT: str r0, [sp, #12] @ 4-byte Spill7042; CHECK-ARM8-NEXT: bne .LBB34_17043; CHECK-ARM8-NEXT: b .LBB34_57044; CHECK-ARM8-NEXT: .LBB34_5: @ %atomicrmw.end7045; CHECK-ARM8-NEXT: ldr r1, [sp] @ 4-byte Reload7046; CHECK-ARM8-NEXT: ldr r0, [sp, #4] @ 4-byte Reload7047; CHECK-ARM8-NEXT: add sp, sp, #167048; 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: @ %entry7052; 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 #167055; CHECK-ARM6-NEXT: sub sp, sp, #167056; CHECK-ARM6-NEXT: ldr r0, .LCPI34_07057; CHECK-ARM6-NEXT: ldr r1, [r0]7058; CHECK-ARM6-NEXT: ldr r0, [r0, #4]7059; CHECK-ARM6-NEXT: str r1, [sp, #8] @ 4-byte Spill7060; CHECK-ARM6-NEXT: str r0, [sp, #12] @ 4-byte Spill7061; CHECK-ARM6-NEXT: b .LBB34_17062; CHECK-ARM6-NEXT: .LBB34_1: @ %atomicrmw.start7063; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=17064; CHECK-ARM6-NEXT: @ Child Loop BB34_2 Depth 27065; CHECK-ARM6-NEXT: ldr r1, [sp, #12] @ 4-byte Reload7066; CHECK-ARM6-NEXT: ldr r2, [sp, #8] @ 4-byte Reload7067; CHECK-ARM6-NEXT: mov r8, r27068; CHECK-ARM6-NEXT: mov r9, r17069; CHECK-ARM6-NEXT: adds r10, r2, #17070; CHECK-ARM6-NEXT: adc r0, r1, #07071; CHECK-ARM6-NEXT: @ kill: def $r10 killed $r10 def $r10_r117072; CHECK-ARM6-NEXT: mov r11, r07073; CHECK-ARM6-NEXT: ldr r6, .LCPI34_07074; CHECK-ARM6-NEXT: @ implicit-def: $r07075; CHECK-ARM6-NEXT: @ implicit-def: $r37076; CHECK-ARM6-NEXT: @ kill: def $r6 killed $r6 def $r6_r77077; CHECK-ARM6-NEXT: mov r7, r07078; CHECK-ARM6-NEXT: .LBB34_2: @ %atomicrmw.start7079; CHECK-ARM6-NEXT: @ Parent Loop BB34_1 Depth=17080; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=27081; CHECK-ARM6-NEXT: ldrexd r4, r5, [r6]7082; CHECK-ARM6-NEXT: cmp r4, r87083; CHECK-ARM6-NEXT: cmpeq r5, r97084; CHECK-ARM6-NEXT: bne .LBB34_47085; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start7086; CHECK-ARM6-NEXT: @ in Loop: Header=BB34_2 Depth=27087; CHECK-ARM6-NEXT: strexd r7, r10, r11, [r6]7088; CHECK-ARM6-NEXT: cmp r7, #07089; CHECK-ARM6-NEXT: bne .LBB34_27090; CHECK-ARM6-NEXT: .LBB34_4: @ %atomicrmw.start7091; CHECK-ARM6-NEXT: @ in Loop: Header=BB34_1 Depth=17092; CHECK-ARM6-NEXT: mov r0, r57093; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill7094; CHECK-ARM6-NEXT: eor r3, r0, r17095; CHECK-ARM6-NEXT: mov r1, r47096; CHECK-ARM6-NEXT: str r1, [sp, #4] @ 4-byte Spill7097; CHECK-ARM6-NEXT: eor r2, r1, r27098; CHECK-ARM6-NEXT: orr r2, r2, r37099; CHECK-ARM6-NEXT: cmp r2, #07100; CHECK-ARM6-NEXT: str r1, [sp, #8] @ 4-byte Spill7101; CHECK-ARM6-NEXT: str r0, [sp, #12] @ 4-byte Spill7102; CHECK-ARM6-NEXT: bne .LBB34_17103; CHECK-ARM6-NEXT: b .LBB34_57104; CHECK-ARM6-NEXT: .LBB34_5: @ %atomicrmw.end7105; CHECK-ARM6-NEXT: ldr r1, [sp] @ 4-byte Reload7106; CHECK-ARM6-NEXT: ldr r0, [sp, #4] @ 4-byte Reload7107; CHECK-ARM6-NEXT: add sp, sp, #167108; CHECK-ARM6-NEXT: pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}7109; CHECK-ARM6-NEXT: .p2align 27110; CHECK-ARM6-NEXT: @ %bb.6:7111; CHECK-ARM6-NEXT: .LCPI34_0:7112; CHECK-ARM6-NEXT: .long atomic_i647113;7114; CHECK-THUMB7-LABEL: test_add_i64:7115; CHECK-THUMB7: @ %bb.0: @ %entry7116; 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 #167119; CHECK-THUMB7-NEXT: sub sp, #167120; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i647121; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i647122; CHECK-THUMB7-NEXT: ldr r1, [r0]7123; CHECK-THUMB7-NEXT: ldr r0, [r0, #4]7124; CHECK-THUMB7-NEXT: str r1, [sp, #8] @ 4-byte Spill7125; CHECK-THUMB7-NEXT: str r0, [sp, #12] @ 4-byte Spill7126; CHECK-THUMB7-NEXT: b .LBB34_17127; CHECK-THUMB7-NEXT: .LBB34_1: @ %atomicrmw.start7128; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=17129; CHECK-THUMB7-NEXT: @ Child Loop BB34_2 Depth 27130; CHECK-THUMB7-NEXT: ldr r1, [sp, #12] @ 4-byte Reload7131; CHECK-THUMB7-NEXT: ldr r2, [sp, #8] @ 4-byte Reload7132; CHECK-THUMB7-NEXT: mov r8, r27133; CHECK-THUMB7-NEXT: mov r9, r17134; CHECK-THUMB7-NEXT: adds.w r10, r2, #17135; CHECK-THUMB7-NEXT: adc r0, r1, #07136; CHECK-THUMB7-NEXT: @ kill: def $r10 killed $r10 def $r10_r117137; CHECK-THUMB7-NEXT: mov r11, r07138; CHECK-THUMB7-NEXT: movw r6, :lower16:atomic_i647139; CHECK-THUMB7-NEXT: movt r6, :upper16:atomic_i647140; CHECK-THUMB7-NEXT: @ implicit-def: $r07141; CHECK-THUMB7-NEXT: @ implicit-def: $r37142; CHECK-THUMB7-NEXT: @ kill: def $r6 killed $r6 def $r6_r77143; CHECK-THUMB7-NEXT: mov r7, r07144; CHECK-THUMB7-NEXT: .LBB34_2: @ %atomicrmw.start7145; CHECK-THUMB7-NEXT: @ Parent Loop BB34_1 Depth=17146; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=27147; CHECK-THUMB7-NEXT: ldrexd r4, r5, [r6]7148; CHECK-THUMB7-NEXT: cmp r4, r87149; CHECK-THUMB7-NEXT: it eq7150; CHECK-THUMB7-NEXT: cmpeq r5, r97151; CHECK-THUMB7-NEXT: bne .LBB34_47152; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start7153; CHECK-THUMB7-NEXT: @ in Loop: Header=BB34_2 Depth=27154; CHECK-THUMB7-NEXT: strexd r7, r10, r11, [r6]7155; CHECK-THUMB7-NEXT: cmp r7, #07156; CHECK-THUMB7-NEXT: bne .LBB34_27157; CHECK-THUMB7-NEXT: .LBB34_4: @ %atomicrmw.start7158; CHECK-THUMB7-NEXT: @ in Loop: Header=BB34_1 Depth=17159; CHECK-THUMB7-NEXT: mov r0, r57160; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill7161; CHECK-THUMB7-NEXT: eor.w r3, r0, r17162; CHECK-THUMB7-NEXT: mov r1, r47163; CHECK-THUMB7-NEXT: str r1, [sp, #4] @ 4-byte Spill7164; CHECK-THUMB7-NEXT: eors r2, r17165; CHECK-THUMB7-NEXT: orrs r2, r37166; CHECK-THUMB7-NEXT: cmp r2, #07167; CHECK-THUMB7-NEXT: str r1, [sp, #8] @ 4-byte Spill7168; CHECK-THUMB7-NEXT: str r0, [sp, #12] @ 4-byte Spill7169; CHECK-THUMB7-NEXT: bne .LBB34_17170; CHECK-THUMB7-NEXT: b .LBB34_57171; CHECK-THUMB7-NEXT: .LBB34_5: @ %atomicrmw.end7172; CHECK-THUMB7-NEXT: ldr r1, [sp] @ 4-byte Reload7173; CHECK-THUMB7-NEXT: ldr r0, [sp, #4] @ 4-byte Reload7174; CHECK-THUMB7-NEXT: add sp, #167175; 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: @ %entry7179; CHECK-THUMB6-NEXT: .save {r7, lr}7180; CHECK-THUMB6-NEXT: push {r7, lr}7181; CHECK-THUMB6-NEXT: ldr r0, .LCPI34_07182; CHECK-THUMB6-NEXT: movs r2, #17183; CHECK-THUMB6-NEXT: movs r3, #07184; CHECK-THUMB6-NEXT: bl __sync_fetch_and_add_87185; CHECK-THUMB6-NEXT: pop {r7, pc}7186; CHECK-THUMB6-NEXT: .p2align 27187; CHECK-THUMB6-NEXT: @ %bb.1:7188; CHECK-THUMB6-NEXT: .LCPI34_0:7189; CHECK-THUMB6-NEXT: .long atomic_i647190;7191; CHECK-THUMB8BASE-LABEL: test_add_i64:7192; CHECK-THUMB8BASE: @ %bb.0: @ %entry7193; CHECK-THUMB8BASE-NEXT: .save {r7, lr}7194; CHECK-THUMB8BASE-NEXT: push {r7, lr}7195; CHECK-THUMB8BASE-NEXT: .pad #87196; CHECK-THUMB8BASE-NEXT: sub sp, #87197; CHECK-THUMB8BASE-NEXT: movs r3, #07198; CHECK-THUMB8BASE-NEXT: str r3, [sp]7199; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i647200; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i647201; CHECK-THUMB8BASE-NEXT: movs r2, #17202; CHECK-THUMB8BASE-NEXT: bl __atomic_fetch_add_87203; CHECK-THUMB8BASE-NEXT: add sp, #87204; CHECK-THUMB8BASE-NEXT: pop {r7, pc}7205entry:7206 %0 = atomicrmw add ptr @atomic_i64, i64 1 monotonic7207 ret i64 %07208}7209define i64 @test_sub_i64() {7210; CHECK-ARM8-LABEL: test_sub_i64:7211; CHECK-ARM8: @ %bb.0: @ %entry7212; 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 #167215; CHECK-ARM8-NEXT: sub sp, sp, #167216; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i647217; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i647218; CHECK-ARM8-NEXT: ldr r1, [r0]7219; CHECK-ARM8-NEXT: ldr r0, [r0, #4]7220; CHECK-ARM8-NEXT: str r1, [sp, #8] @ 4-byte Spill7221; CHECK-ARM8-NEXT: str r0, [sp, #12] @ 4-byte Spill7222; CHECK-ARM8-NEXT: b .LBB35_17223; CHECK-ARM8-NEXT: .LBB35_1: @ %atomicrmw.start7224; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=17225; CHECK-ARM8-NEXT: @ Child Loop BB35_2 Depth 27226; CHECK-ARM8-NEXT: ldr r1, [sp, #12] @ 4-byte Reload7227; CHECK-ARM8-NEXT: ldr r2, [sp, #8] @ 4-byte Reload7228; CHECK-ARM8-NEXT: mov r8, r27229; CHECK-ARM8-NEXT: mov r9, r17230; CHECK-ARM8-NEXT: subs r10, r2, #17231; CHECK-ARM8-NEXT: sbc r0, r1, #07232; CHECK-ARM8-NEXT: @ kill: def $r10 killed $r10 def $r10_r117233; CHECK-ARM8-NEXT: mov r11, r07234; CHECK-ARM8-NEXT: movw r6, :lower16:atomic_i647235; CHECK-ARM8-NEXT: movt r6, :upper16:atomic_i647236; CHECK-ARM8-NEXT: @ implicit-def: $r07237; CHECK-ARM8-NEXT: @ implicit-def: $r37238; CHECK-ARM8-NEXT: @ kill: def $r6 killed $r6 def $r6_r77239; CHECK-ARM8-NEXT: mov r7, r07240; CHECK-ARM8-NEXT: .LBB35_2: @ %atomicrmw.start7241; CHECK-ARM8-NEXT: @ Parent Loop BB35_1 Depth=17242; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=27243; CHECK-ARM8-NEXT: ldrexd r4, r5, [r6]7244; CHECK-ARM8-NEXT: cmp r4, r87245; CHECK-ARM8-NEXT: cmpeq r5, r97246; CHECK-ARM8-NEXT: bne .LBB35_47247; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start7248; CHECK-ARM8-NEXT: @ in Loop: Header=BB35_2 Depth=27249; CHECK-ARM8-NEXT: strexd r7, r10, r11, [r6]7250; CHECK-ARM8-NEXT: cmp r7, #07251; CHECK-ARM8-NEXT: bne .LBB35_27252; CHECK-ARM8-NEXT: .LBB35_4: @ %atomicrmw.start7253; CHECK-ARM8-NEXT: @ in Loop: Header=BB35_1 Depth=17254; CHECK-ARM8-NEXT: mov r0, r57255; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill7256; CHECK-ARM8-NEXT: eor r3, r0, r17257; CHECK-ARM8-NEXT: mov r1, r47258; CHECK-ARM8-NEXT: str r1, [sp, #4] @ 4-byte Spill7259; CHECK-ARM8-NEXT: eor r2, r1, r27260; CHECK-ARM8-NEXT: orr r2, r2, r37261; CHECK-ARM8-NEXT: cmp r2, #07262; CHECK-ARM8-NEXT: str r1, [sp, #8] @ 4-byte Spill7263; CHECK-ARM8-NEXT: str r0, [sp, #12] @ 4-byte Spill7264; CHECK-ARM8-NEXT: bne .LBB35_17265; CHECK-ARM8-NEXT: b .LBB35_57266; CHECK-ARM8-NEXT: .LBB35_5: @ %atomicrmw.end7267; CHECK-ARM8-NEXT: ldr r1, [sp] @ 4-byte Reload7268; CHECK-ARM8-NEXT: ldr r0, [sp, #4] @ 4-byte Reload7269; CHECK-ARM8-NEXT: add sp, sp, #167270; 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: @ %entry7274; 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 #167277; CHECK-ARM6-NEXT: sub sp, sp, #167278; CHECK-ARM6-NEXT: ldr r0, .LCPI35_07279; CHECK-ARM6-NEXT: ldr r1, [r0]7280; CHECK-ARM6-NEXT: ldr r0, [r0, #4]7281; CHECK-ARM6-NEXT: str r1, [sp, #8] @ 4-byte Spill7282; CHECK-ARM6-NEXT: str r0, [sp, #12] @ 4-byte Spill7283; CHECK-ARM6-NEXT: b .LBB35_17284; CHECK-ARM6-NEXT: .LBB35_1: @ %atomicrmw.start7285; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=17286; CHECK-ARM6-NEXT: @ Child Loop BB35_2 Depth 27287; CHECK-ARM6-NEXT: ldr r1, [sp, #12] @ 4-byte Reload7288; CHECK-ARM6-NEXT: ldr r2, [sp, #8] @ 4-byte Reload7289; CHECK-ARM6-NEXT: mov r8, r27290; CHECK-ARM6-NEXT: mov r9, r17291; CHECK-ARM6-NEXT: subs r10, r2, #17292; CHECK-ARM6-NEXT: sbc r0, r1, #07293; CHECK-ARM6-NEXT: @ kill: def $r10 killed $r10 def $r10_r117294; CHECK-ARM6-NEXT: mov r11, r07295; CHECK-ARM6-NEXT: ldr r6, .LCPI35_07296; CHECK-ARM6-NEXT: @ implicit-def: $r07297; CHECK-ARM6-NEXT: @ implicit-def: $r37298; CHECK-ARM6-NEXT: @ kill: def $r6 killed $r6 def $r6_r77299; CHECK-ARM6-NEXT: mov r7, r07300; CHECK-ARM6-NEXT: .LBB35_2: @ %atomicrmw.start7301; CHECK-ARM6-NEXT: @ Parent Loop BB35_1 Depth=17302; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=27303; CHECK-ARM6-NEXT: ldrexd r4, r5, [r6]7304; CHECK-ARM6-NEXT: cmp r4, r87305; CHECK-ARM6-NEXT: cmpeq r5, r97306; CHECK-ARM6-NEXT: bne .LBB35_47307; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start7308; CHECK-ARM6-NEXT: @ in Loop: Header=BB35_2 Depth=27309; CHECK-ARM6-NEXT: strexd r7, r10, r11, [r6]7310; CHECK-ARM6-NEXT: cmp r7, #07311; CHECK-ARM6-NEXT: bne .LBB35_27312; CHECK-ARM6-NEXT: .LBB35_4: @ %atomicrmw.start7313; CHECK-ARM6-NEXT: @ in Loop: Header=BB35_1 Depth=17314; CHECK-ARM6-NEXT: mov r0, r57315; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill7316; CHECK-ARM6-NEXT: eor r3, r0, r17317; CHECK-ARM6-NEXT: mov r1, r47318; CHECK-ARM6-NEXT: str r1, [sp, #4] @ 4-byte Spill7319; CHECK-ARM6-NEXT: eor r2, r1, r27320; CHECK-ARM6-NEXT: orr r2, r2, r37321; CHECK-ARM6-NEXT: cmp r2, #07322; CHECK-ARM6-NEXT: str r1, [sp, #8] @ 4-byte Spill7323; CHECK-ARM6-NEXT: str r0, [sp, #12] @ 4-byte Spill7324; CHECK-ARM6-NEXT: bne .LBB35_17325; CHECK-ARM6-NEXT: b .LBB35_57326; CHECK-ARM6-NEXT: .LBB35_5: @ %atomicrmw.end7327; CHECK-ARM6-NEXT: ldr r1, [sp] @ 4-byte Reload7328; CHECK-ARM6-NEXT: ldr r0, [sp, #4] @ 4-byte Reload7329; CHECK-ARM6-NEXT: add sp, sp, #167330; CHECK-ARM6-NEXT: pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}7331; CHECK-ARM6-NEXT: .p2align 27332; CHECK-ARM6-NEXT: @ %bb.6:7333; CHECK-ARM6-NEXT: .LCPI35_0:7334; CHECK-ARM6-NEXT: .long atomic_i647335;7336; CHECK-THUMB7-LABEL: test_sub_i64:7337; CHECK-THUMB7: @ %bb.0: @ %entry7338; 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 #167341; CHECK-THUMB7-NEXT: sub sp, #167342; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i647343; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i647344; CHECK-THUMB7-NEXT: ldr r1, [r0]7345; CHECK-THUMB7-NEXT: ldr r0, [r0, #4]7346; CHECK-THUMB7-NEXT: str r1, [sp, #8] @ 4-byte Spill7347; CHECK-THUMB7-NEXT: str r0, [sp, #12] @ 4-byte Spill7348; CHECK-THUMB7-NEXT: b .LBB35_17349; CHECK-THUMB7-NEXT: .LBB35_1: @ %atomicrmw.start7350; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=17351; CHECK-THUMB7-NEXT: @ Child Loop BB35_2 Depth 27352; CHECK-THUMB7-NEXT: ldr r1, [sp, #12] @ 4-byte Reload7353; CHECK-THUMB7-NEXT: ldr r2, [sp, #8] @ 4-byte Reload7354; CHECK-THUMB7-NEXT: mov r8, r27355; CHECK-THUMB7-NEXT: mov r9, r17356; CHECK-THUMB7-NEXT: subs.w r10, r2, #17357; CHECK-THUMB7-NEXT: sbc r0, r1, #07358; CHECK-THUMB7-NEXT: @ kill: def $r10 killed $r10 def $r10_r117359; CHECK-THUMB7-NEXT: mov r11, r07360; CHECK-THUMB7-NEXT: movw r6, :lower16:atomic_i647361; CHECK-THUMB7-NEXT: movt r6, :upper16:atomic_i647362; CHECK-THUMB7-NEXT: @ implicit-def: $r07363; CHECK-THUMB7-NEXT: @ implicit-def: $r37364; CHECK-THUMB7-NEXT: @ kill: def $r6 killed $r6 def $r6_r77365; CHECK-THUMB7-NEXT: mov r7, r07366; CHECK-THUMB7-NEXT: .LBB35_2: @ %atomicrmw.start7367; CHECK-THUMB7-NEXT: @ Parent Loop BB35_1 Depth=17368; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=27369; CHECK-THUMB7-NEXT: ldrexd r4, r5, [r6]7370; CHECK-THUMB7-NEXT: cmp r4, r87371; CHECK-THUMB7-NEXT: it eq7372; CHECK-THUMB7-NEXT: cmpeq r5, r97373; CHECK-THUMB7-NEXT: bne .LBB35_47374; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start7375; CHECK-THUMB7-NEXT: @ in Loop: Header=BB35_2 Depth=27376; CHECK-THUMB7-NEXT: strexd r7, r10, r11, [r6]7377; CHECK-THUMB7-NEXT: cmp r7, #07378; CHECK-THUMB7-NEXT: bne .LBB35_27379; CHECK-THUMB7-NEXT: .LBB35_4: @ %atomicrmw.start7380; CHECK-THUMB7-NEXT: @ in Loop: Header=BB35_1 Depth=17381; CHECK-THUMB7-NEXT: mov r0, r57382; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill7383; CHECK-THUMB7-NEXT: eor.w r3, r0, r17384; CHECK-THUMB7-NEXT: mov r1, r47385; CHECK-THUMB7-NEXT: str r1, [sp, #4] @ 4-byte Spill7386; CHECK-THUMB7-NEXT: eors r2, r17387; CHECK-THUMB7-NEXT: orrs r2, r37388; CHECK-THUMB7-NEXT: cmp r2, #07389; CHECK-THUMB7-NEXT: str r1, [sp, #8] @ 4-byte Spill7390; CHECK-THUMB7-NEXT: str r0, [sp, #12] @ 4-byte Spill7391; CHECK-THUMB7-NEXT: bne .LBB35_17392; CHECK-THUMB7-NEXT: b .LBB35_57393; CHECK-THUMB7-NEXT: .LBB35_5: @ %atomicrmw.end7394; CHECK-THUMB7-NEXT: ldr r1, [sp] @ 4-byte Reload7395; CHECK-THUMB7-NEXT: ldr r0, [sp, #4] @ 4-byte Reload7396; CHECK-THUMB7-NEXT: add sp, #167397; 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: @ %entry7401; CHECK-THUMB6-NEXT: .save {r7, lr}7402; CHECK-THUMB6-NEXT: push {r7, lr}7403; CHECK-THUMB6-NEXT: ldr r0, .LCPI35_07404; CHECK-THUMB6-NEXT: movs r2, #17405; CHECK-THUMB6-NEXT: movs r3, #07406; CHECK-THUMB6-NEXT: bl __sync_fetch_and_sub_87407; CHECK-THUMB6-NEXT: pop {r7, pc}7408; CHECK-THUMB6-NEXT: .p2align 27409; CHECK-THUMB6-NEXT: @ %bb.1:7410; CHECK-THUMB6-NEXT: .LCPI35_0:7411; CHECK-THUMB6-NEXT: .long atomic_i647412;7413; CHECK-THUMB8BASE-LABEL: test_sub_i64:7414; CHECK-THUMB8BASE: @ %bb.0: @ %entry7415; CHECK-THUMB8BASE-NEXT: .save {r7, lr}7416; CHECK-THUMB8BASE-NEXT: push {r7, lr}7417; CHECK-THUMB8BASE-NEXT: .pad #87418; CHECK-THUMB8BASE-NEXT: sub sp, #87419; CHECK-THUMB8BASE-NEXT: movs r3, #07420; CHECK-THUMB8BASE-NEXT: str r3, [sp]7421; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i647422; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i647423; CHECK-THUMB8BASE-NEXT: movs r2, #17424; CHECK-THUMB8BASE-NEXT: bl __atomic_fetch_sub_87425; CHECK-THUMB8BASE-NEXT: add sp, #87426; CHECK-THUMB8BASE-NEXT: pop {r7, pc}7427entry:7428 %0 = atomicrmw sub ptr @atomic_i64, i64 1 monotonic7429 ret i64 %07430}7431define i64 @test_and_i64() {7432; CHECK-ARM8-LABEL: test_and_i64:7433; CHECK-ARM8: @ %bb.0: @ %entry7434; 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 #167437; CHECK-ARM8-NEXT: sub sp, sp, #167438; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i647439; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i647440; CHECK-ARM8-NEXT: ldr r1, [r0]7441; CHECK-ARM8-NEXT: ldr r0, [r0, #4]7442; CHECK-ARM8-NEXT: str r1, [sp, #8] @ 4-byte Spill7443; CHECK-ARM8-NEXT: str r0, [sp, #12] @ 4-byte Spill7444; CHECK-ARM8-NEXT: b .LBB36_17445; CHECK-ARM8-NEXT: .LBB36_1: @ %atomicrmw.start7446; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=17447; CHECK-ARM8-NEXT: @ Child Loop BB36_2 Depth 27448; CHECK-ARM8-NEXT: ldr r1, [sp, #12] @ 4-byte Reload7449; CHECK-ARM8-NEXT: ldr r2, [sp, #8] @ 4-byte Reload7450; CHECK-ARM8-NEXT: and r10, r2, #17451; CHECK-ARM8-NEXT: mov r0, #07452; CHECK-ARM8-NEXT: @ kill: def $r10 killed $r10 def $r10_r117453; CHECK-ARM8-NEXT: mov r11, r07454; CHECK-ARM8-NEXT: mov r8, r27455; CHECK-ARM8-NEXT: mov r9, r17456; CHECK-ARM8-NEXT: movw r6, :lower16:atomic_i647457; CHECK-ARM8-NEXT: movt r6, :upper16:atomic_i647458; CHECK-ARM8-NEXT: @ implicit-def: $r07459; CHECK-ARM8-NEXT: @ implicit-def: $r37460; CHECK-ARM8-NEXT: @ kill: def $r6 killed $r6 def $r6_r77461; CHECK-ARM8-NEXT: mov r7, r07462; CHECK-ARM8-NEXT: .LBB36_2: @ %atomicrmw.start7463; CHECK-ARM8-NEXT: @ Parent Loop BB36_1 Depth=17464; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=27465; CHECK-ARM8-NEXT: ldrexd r4, r5, [r6]7466; CHECK-ARM8-NEXT: cmp r4, r87467; CHECK-ARM8-NEXT: cmpeq r5, r97468; CHECK-ARM8-NEXT: bne .LBB36_47469; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start7470; CHECK-ARM8-NEXT: @ in Loop: Header=BB36_2 Depth=27471; CHECK-ARM8-NEXT: strexd r7, r10, r11, [r6]7472; CHECK-ARM8-NEXT: cmp r7, #07473; CHECK-ARM8-NEXT: bne .LBB36_27474; CHECK-ARM8-NEXT: .LBB36_4: @ %atomicrmw.start7475; CHECK-ARM8-NEXT: @ in Loop: Header=BB36_1 Depth=17476; CHECK-ARM8-NEXT: mov r0, r57477; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill7478; CHECK-ARM8-NEXT: eor r3, r0, r17479; CHECK-ARM8-NEXT: mov r1, r47480; CHECK-ARM8-NEXT: str r1, [sp, #4] @ 4-byte Spill7481; CHECK-ARM8-NEXT: eor r2, r1, r27482; CHECK-ARM8-NEXT: orr r2, r2, r37483; CHECK-ARM8-NEXT: cmp r2, #07484; CHECK-ARM8-NEXT: str r1, [sp, #8] @ 4-byte Spill7485; CHECK-ARM8-NEXT: str r0, [sp, #12] @ 4-byte Spill7486; CHECK-ARM8-NEXT: bne .LBB36_17487; CHECK-ARM8-NEXT: b .LBB36_57488; CHECK-ARM8-NEXT: .LBB36_5: @ %atomicrmw.end7489; CHECK-ARM8-NEXT: ldr r1, [sp] @ 4-byte Reload7490; CHECK-ARM8-NEXT: ldr r0, [sp, #4] @ 4-byte Reload7491; CHECK-ARM8-NEXT: add sp, sp, #167492; 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: @ %entry7496; 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 #167499; CHECK-ARM6-NEXT: sub sp, sp, #167500; CHECK-ARM6-NEXT: ldr r0, .LCPI36_07501; CHECK-ARM6-NEXT: ldr r1, [r0]7502; CHECK-ARM6-NEXT: ldr r0, [r0, #4]7503; CHECK-ARM6-NEXT: str r1, [sp, #8] @ 4-byte Spill7504; CHECK-ARM6-NEXT: str r0, [sp, #12] @ 4-byte Spill7505; CHECK-ARM6-NEXT: b .LBB36_17506; CHECK-ARM6-NEXT: .LBB36_1: @ %atomicrmw.start7507; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=17508; CHECK-ARM6-NEXT: @ Child Loop BB36_2 Depth 27509; CHECK-ARM6-NEXT: ldr r1, [sp, #12] @ 4-byte Reload7510; CHECK-ARM6-NEXT: ldr r2, [sp, #8] @ 4-byte Reload7511; CHECK-ARM6-NEXT: and r10, r2, #17512; CHECK-ARM6-NEXT: mov r0, #07513; CHECK-ARM6-NEXT: @ kill: def $r10 killed $r10 def $r10_r117514; CHECK-ARM6-NEXT: mov r11, r07515; CHECK-ARM6-NEXT: mov r8, r27516; CHECK-ARM6-NEXT: mov r9, r17517; CHECK-ARM6-NEXT: ldr r6, .LCPI36_07518; CHECK-ARM6-NEXT: @ implicit-def: $r07519; CHECK-ARM6-NEXT: @ implicit-def: $r37520; CHECK-ARM6-NEXT: @ kill: def $r6 killed $r6 def $r6_r77521; CHECK-ARM6-NEXT: mov r7, r07522; CHECK-ARM6-NEXT: .LBB36_2: @ %atomicrmw.start7523; CHECK-ARM6-NEXT: @ Parent Loop BB36_1 Depth=17524; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=27525; CHECK-ARM6-NEXT: ldrexd r4, r5, [r6]7526; CHECK-ARM6-NEXT: cmp r4, r87527; CHECK-ARM6-NEXT: cmpeq r5, r97528; CHECK-ARM6-NEXT: bne .LBB36_47529; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start7530; CHECK-ARM6-NEXT: @ in Loop: Header=BB36_2 Depth=27531; CHECK-ARM6-NEXT: strexd r7, r10, r11, [r6]7532; CHECK-ARM6-NEXT: cmp r7, #07533; CHECK-ARM6-NEXT: bne .LBB36_27534; CHECK-ARM6-NEXT: .LBB36_4: @ %atomicrmw.start7535; CHECK-ARM6-NEXT: @ in Loop: Header=BB36_1 Depth=17536; CHECK-ARM6-NEXT: mov r0, r57537; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill7538; CHECK-ARM6-NEXT: eor r3, r0, r17539; CHECK-ARM6-NEXT: mov r1, r47540; CHECK-ARM6-NEXT: str r1, [sp, #4] @ 4-byte Spill7541; CHECK-ARM6-NEXT: eor r2, r1, r27542; CHECK-ARM6-NEXT: orr r2, r2, r37543; CHECK-ARM6-NEXT: cmp r2, #07544; CHECK-ARM6-NEXT: str r1, [sp, #8] @ 4-byte Spill7545; CHECK-ARM6-NEXT: str r0, [sp, #12] @ 4-byte Spill7546; CHECK-ARM6-NEXT: bne .LBB36_17547; CHECK-ARM6-NEXT: b .LBB36_57548; CHECK-ARM6-NEXT: .LBB36_5: @ %atomicrmw.end7549; CHECK-ARM6-NEXT: ldr r1, [sp] @ 4-byte Reload7550; CHECK-ARM6-NEXT: ldr r0, [sp, #4] @ 4-byte Reload7551; CHECK-ARM6-NEXT: add sp, sp, #167552; CHECK-ARM6-NEXT: pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}7553; CHECK-ARM6-NEXT: .p2align 27554; CHECK-ARM6-NEXT: @ %bb.6:7555; CHECK-ARM6-NEXT: .LCPI36_0:7556; CHECK-ARM6-NEXT: .long atomic_i647557;7558; CHECK-THUMB7-LABEL: test_and_i64:7559; CHECK-THUMB7: @ %bb.0: @ %entry7560; 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 #167563; CHECK-THUMB7-NEXT: sub sp, #167564; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i647565; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i647566; CHECK-THUMB7-NEXT: ldr r1, [r0]7567; CHECK-THUMB7-NEXT: ldr r0, [r0, #4]7568; CHECK-THUMB7-NEXT: str r1, [sp, #8] @ 4-byte Spill7569; CHECK-THUMB7-NEXT: str r0, [sp, #12] @ 4-byte Spill7570; CHECK-THUMB7-NEXT: b .LBB36_17571; CHECK-THUMB7-NEXT: .LBB36_1: @ %atomicrmw.start7572; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=17573; CHECK-THUMB7-NEXT: @ Child Loop BB36_2 Depth 27574; CHECK-THUMB7-NEXT: ldr r1, [sp, #12] @ 4-byte Reload7575; CHECK-THUMB7-NEXT: ldr r2, [sp, #8] @ 4-byte Reload7576; CHECK-THUMB7-NEXT: and r10, r2, #17577; CHECK-THUMB7-NEXT: movs r0, #07578; CHECK-THUMB7-NEXT: @ kill: def $r10 killed $r10 def $r10_r117579; CHECK-THUMB7-NEXT: mov r11, r07580; CHECK-THUMB7-NEXT: mov r8, r27581; CHECK-THUMB7-NEXT: mov r9, r17582; CHECK-THUMB7-NEXT: movw r6, :lower16:atomic_i647583; CHECK-THUMB7-NEXT: movt r6, :upper16:atomic_i647584; CHECK-THUMB7-NEXT: @ implicit-def: $r07585; CHECK-THUMB7-NEXT: @ implicit-def: $r37586; CHECK-THUMB7-NEXT: @ kill: def $r6 killed $r6 def $r6_r77587; CHECK-THUMB7-NEXT: mov r7, r07588; CHECK-THUMB7-NEXT: .LBB36_2: @ %atomicrmw.start7589; CHECK-THUMB7-NEXT: @ Parent Loop BB36_1 Depth=17590; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=27591; CHECK-THUMB7-NEXT: ldrexd r4, r5, [r6]7592; CHECK-THUMB7-NEXT: cmp r4, r87593; CHECK-THUMB7-NEXT: it eq7594; CHECK-THUMB7-NEXT: cmpeq r5, r97595; CHECK-THUMB7-NEXT: bne .LBB36_47596; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start7597; CHECK-THUMB7-NEXT: @ in Loop: Header=BB36_2 Depth=27598; CHECK-THUMB7-NEXT: strexd r7, r10, r11, [r6]7599; CHECK-THUMB7-NEXT: cmp r7, #07600; CHECK-THUMB7-NEXT: bne .LBB36_27601; CHECK-THUMB7-NEXT: .LBB36_4: @ %atomicrmw.start7602; CHECK-THUMB7-NEXT: @ in Loop: Header=BB36_1 Depth=17603; CHECK-THUMB7-NEXT: mov r0, r57604; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill7605; CHECK-THUMB7-NEXT: eor.w r3, r0, r17606; CHECK-THUMB7-NEXT: mov r1, r47607; CHECK-THUMB7-NEXT: str r1, [sp, #4] @ 4-byte Spill7608; CHECK-THUMB7-NEXT: eors r2, r17609; CHECK-THUMB7-NEXT: orrs r2, r37610; CHECK-THUMB7-NEXT: cmp r2, #07611; CHECK-THUMB7-NEXT: str r1, [sp, #8] @ 4-byte Spill7612; CHECK-THUMB7-NEXT: str r0, [sp, #12] @ 4-byte Spill7613; CHECK-THUMB7-NEXT: bne .LBB36_17614; CHECK-THUMB7-NEXT: b .LBB36_57615; CHECK-THUMB7-NEXT: .LBB36_5: @ %atomicrmw.end7616; CHECK-THUMB7-NEXT: ldr r1, [sp] @ 4-byte Reload7617; CHECK-THUMB7-NEXT: ldr r0, [sp, #4] @ 4-byte Reload7618; CHECK-THUMB7-NEXT: add sp, #167619; 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: @ %entry7623; CHECK-THUMB6-NEXT: .save {r7, lr}7624; CHECK-THUMB6-NEXT: push {r7, lr}7625; CHECK-THUMB6-NEXT: ldr r0, .LCPI36_07626; CHECK-THUMB6-NEXT: movs r2, #17627; CHECK-THUMB6-NEXT: movs r3, #07628; CHECK-THUMB6-NEXT: bl __sync_fetch_and_and_87629; CHECK-THUMB6-NEXT: pop {r7, pc}7630; CHECK-THUMB6-NEXT: .p2align 27631; CHECK-THUMB6-NEXT: @ %bb.1:7632; CHECK-THUMB6-NEXT: .LCPI36_0:7633; CHECK-THUMB6-NEXT: .long atomic_i647634;7635; CHECK-THUMB8BASE-LABEL: test_and_i64:7636; CHECK-THUMB8BASE: @ %bb.0: @ %entry7637; CHECK-THUMB8BASE-NEXT: .save {r7, lr}7638; CHECK-THUMB8BASE-NEXT: push {r7, lr}7639; CHECK-THUMB8BASE-NEXT: .pad #87640; CHECK-THUMB8BASE-NEXT: sub sp, #87641; CHECK-THUMB8BASE-NEXT: movs r3, #07642; CHECK-THUMB8BASE-NEXT: str r3, [sp]7643; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i647644; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i647645; CHECK-THUMB8BASE-NEXT: movs r2, #17646; CHECK-THUMB8BASE-NEXT: bl __atomic_fetch_and_87647; CHECK-THUMB8BASE-NEXT: add sp, #87648; CHECK-THUMB8BASE-NEXT: pop {r7, pc}7649entry:7650 %0 = atomicrmw and ptr @atomic_i64, i64 1 monotonic7651 ret i64 %07652}7653define i64 @test_nand_i64() {7654; CHECK-ARM8-LABEL: test_nand_i64:7655; CHECK-ARM8: @ %bb.0: @ %entry7656; 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 #167659; CHECK-ARM8-NEXT: sub sp, sp, #167660; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i647661; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i647662; CHECK-ARM8-NEXT: ldr r1, [r0]7663; CHECK-ARM8-NEXT: ldr r0, [r0, #4]7664; CHECK-ARM8-NEXT: str r1, [sp, #8] @ 4-byte Spill7665; CHECK-ARM8-NEXT: str r0, [sp, #12] @ 4-byte Spill7666; CHECK-ARM8-NEXT: b .LBB37_17667; CHECK-ARM8-NEXT: .LBB37_1: @ %atomicrmw.start7668; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=17669; CHECK-ARM8-NEXT: @ Child Loop BB37_2 Depth 27670; CHECK-ARM8-NEXT: ldr r1, [sp, #12] @ 4-byte Reload7671; CHECK-ARM8-NEXT: ldr r2, [sp, #8] @ 4-byte Reload7672; CHECK-ARM8-NEXT: mov r8, r27673; CHECK-ARM8-NEXT: mov r9, r17674; CHECK-ARM8-NEXT: mvn r0, r27675; CHECK-ARM8-NEXT: mvn r3, #17676; CHECK-ARM8-NEXT: orr r10, r0, r37677; CHECK-ARM8-NEXT: mvn r0, #07678; CHECK-ARM8-NEXT: @ kill: def $r10 killed $r10 def $r10_r117679; CHECK-ARM8-NEXT: mov r11, r07680; CHECK-ARM8-NEXT: movw r6, :lower16:atomic_i647681; CHECK-ARM8-NEXT: movt r6, :upper16:atomic_i647682; CHECK-ARM8-NEXT: @ implicit-def: $r07683; CHECK-ARM8-NEXT: @ implicit-def: $r37684; CHECK-ARM8-NEXT: @ kill: def $r6 killed $r6 def $r6_r77685; CHECK-ARM8-NEXT: mov r7, r07686; CHECK-ARM8-NEXT: .LBB37_2: @ %atomicrmw.start7687; CHECK-ARM8-NEXT: @ Parent Loop BB37_1 Depth=17688; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=27689; CHECK-ARM8-NEXT: ldrexd r4, r5, [r6]7690; CHECK-ARM8-NEXT: cmp r4, r87691; CHECK-ARM8-NEXT: cmpeq r5, r97692; CHECK-ARM8-NEXT: bne .LBB37_47693; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start7694; CHECK-ARM8-NEXT: @ in Loop: Header=BB37_2 Depth=27695; CHECK-ARM8-NEXT: strexd r7, r10, r11, [r6]7696; CHECK-ARM8-NEXT: cmp r7, #07697; CHECK-ARM8-NEXT: bne .LBB37_27698; CHECK-ARM8-NEXT: .LBB37_4: @ %atomicrmw.start7699; CHECK-ARM8-NEXT: @ in Loop: Header=BB37_1 Depth=17700; CHECK-ARM8-NEXT: mov r0, r57701; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill7702; CHECK-ARM8-NEXT: eor r3, r0, r17703; CHECK-ARM8-NEXT: mov r1, r47704; CHECK-ARM8-NEXT: str r1, [sp, #4] @ 4-byte Spill7705; CHECK-ARM8-NEXT: eor r2, r1, r27706; CHECK-ARM8-NEXT: orr r2, r2, r37707; CHECK-ARM8-NEXT: cmp r2, #07708; CHECK-ARM8-NEXT: str r1, [sp, #8] @ 4-byte Spill7709; CHECK-ARM8-NEXT: str r0, [sp, #12] @ 4-byte Spill7710; CHECK-ARM8-NEXT: bne .LBB37_17711; CHECK-ARM8-NEXT: b .LBB37_57712; CHECK-ARM8-NEXT: .LBB37_5: @ %atomicrmw.end7713; CHECK-ARM8-NEXT: ldr r1, [sp] @ 4-byte Reload7714; CHECK-ARM8-NEXT: ldr r0, [sp, #4] @ 4-byte Reload7715; CHECK-ARM8-NEXT: add sp, sp, #167716; 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: @ %entry7720; 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 #167723; CHECK-ARM6-NEXT: sub sp, sp, #167724; CHECK-ARM6-NEXT: ldr r0, .LCPI37_07725; CHECK-ARM6-NEXT: ldr r1, [r0]7726; CHECK-ARM6-NEXT: ldr r0, [r0, #4]7727; CHECK-ARM6-NEXT: str r1, [sp, #8] @ 4-byte Spill7728; CHECK-ARM6-NEXT: str r0, [sp, #12] @ 4-byte Spill7729; CHECK-ARM6-NEXT: b .LBB37_17730; CHECK-ARM6-NEXT: .LBB37_1: @ %atomicrmw.start7731; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=17732; CHECK-ARM6-NEXT: @ Child Loop BB37_2 Depth 27733; CHECK-ARM6-NEXT: ldr r1, [sp, #12] @ 4-byte Reload7734; CHECK-ARM6-NEXT: ldr r2, [sp, #8] @ 4-byte Reload7735; CHECK-ARM6-NEXT: mov r8, r27736; CHECK-ARM6-NEXT: mov r9, r17737; CHECK-ARM6-NEXT: mvn r0, r27738; CHECK-ARM6-NEXT: mvn r3, #17739; CHECK-ARM6-NEXT: orr r10, r0, r37740; CHECK-ARM6-NEXT: mvn r0, #07741; CHECK-ARM6-NEXT: @ kill: def $r10 killed $r10 def $r10_r117742; CHECK-ARM6-NEXT: mov r11, r07743; CHECK-ARM6-NEXT: ldr r6, .LCPI37_07744; CHECK-ARM6-NEXT: @ implicit-def: $r07745; CHECK-ARM6-NEXT: @ implicit-def: $r37746; CHECK-ARM6-NEXT: @ kill: def $r6 killed $r6 def $r6_r77747; CHECK-ARM6-NEXT: mov r7, r07748; CHECK-ARM6-NEXT: .LBB37_2: @ %atomicrmw.start7749; CHECK-ARM6-NEXT: @ Parent Loop BB37_1 Depth=17750; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=27751; CHECK-ARM6-NEXT: ldrexd r4, r5, [r6]7752; CHECK-ARM6-NEXT: cmp r4, r87753; CHECK-ARM6-NEXT: cmpeq r5, r97754; CHECK-ARM6-NEXT: bne .LBB37_47755; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start7756; CHECK-ARM6-NEXT: @ in Loop: Header=BB37_2 Depth=27757; CHECK-ARM6-NEXT: strexd r7, r10, r11, [r6]7758; CHECK-ARM6-NEXT: cmp r7, #07759; CHECK-ARM6-NEXT: bne .LBB37_27760; CHECK-ARM6-NEXT: .LBB37_4: @ %atomicrmw.start7761; CHECK-ARM6-NEXT: @ in Loop: Header=BB37_1 Depth=17762; CHECK-ARM6-NEXT: mov r0, r57763; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill7764; CHECK-ARM6-NEXT: eor r3, r0, r17765; CHECK-ARM6-NEXT: mov r1, r47766; CHECK-ARM6-NEXT: str r1, [sp, #4] @ 4-byte Spill7767; CHECK-ARM6-NEXT: eor r2, r1, r27768; CHECK-ARM6-NEXT: orr r2, r2, r37769; CHECK-ARM6-NEXT: cmp r2, #07770; CHECK-ARM6-NEXT: str r1, [sp, #8] @ 4-byte Spill7771; CHECK-ARM6-NEXT: str r0, [sp, #12] @ 4-byte Spill7772; CHECK-ARM6-NEXT: bne .LBB37_17773; CHECK-ARM6-NEXT: b .LBB37_57774; CHECK-ARM6-NEXT: .LBB37_5: @ %atomicrmw.end7775; CHECK-ARM6-NEXT: ldr r1, [sp] @ 4-byte Reload7776; CHECK-ARM6-NEXT: ldr r0, [sp, #4] @ 4-byte Reload7777; CHECK-ARM6-NEXT: add sp, sp, #167778; CHECK-ARM6-NEXT: pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}7779; CHECK-ARM6-NEXT: .p2align 27780; CHECK-ARM6-NEXT: @ %bb.6:7781; CHECK-ARM6-NEXT: .LCPI37_0:7782; CHECK-ARM6-NEXT: .long atomic_i647783;7784; CHECK-THUMB7-LABEL: test_nand_i64:7785; CHECK-THUMB7: @ %bb.0: @ %entry7786; 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 #167789; CHECK-THUMB7-NEXT: sub sp, #167790; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i647791; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i647792; CHECK-THUMB7-NEXT: ldr r1, [r0]7793; CHECK-THUMB7-NEXT: ldr r0, [r0, #4]7794; CHECK-THUMB7-NEXT: str r1, [sp, #8] @ 4-byte Spill7795; CHECK-THUMB7-NEXT: str r0, [sp, #12] @ 4-byte Spill7796; CHECK-THUMB7-NEXT: b .LBB37_17797; CHECK-THUMB7-NEXT: .LBB37_1: @ %atomicrmw.start7798; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=17799; CHECK-THUMB7-NEXT: @ Child Loop BB37_2 Depth 27800; CHECK-THUMB7-NEXT: ldr r1, [sp, #12] @ 4-byte Reload7801; CHECK-THUMB7-NEXT: ldr r2, [sp, #8] @ 4-byte Reload7802; CHECK-THUMB7-NEXT: mov r8, r27803; CHECK-THUMB7-NEXT: mov r9, r17804; CHECK-THUMB7-NEXT: mvn r0, #17805; CHECK-THUMB7-NEXT: orn r10, r0, r27806; CHECK-THUMB7-NEXT: mov.w r0, #-17807; CHECK-THUMB7-NEXT: @ kill: def $r10 killed $r10 def $r10_r117808; CHECK-THUMB7-NEXT: mov r11, r07809; CHECK-THUMB7-NEXT: movw r6, :lower16:atomic_i647810; CHECK-THUMB7-NEXT: movt r6, :upper16:atomic_i647811; CHECK-THUMB7-NEXT: @ implicit-def: $r07812; CHECK-THUMB7-NEXT: @ implicit-def: $r37813; CHECK-THUMB7-NEXT: @ kill: def $r6 killed $r6 def $r6_r77814; CHECK-THUMB7-NEXT: mov r7, r07815; CHECK-THUMB7-NEXT: .LBB37_2: @ %atomicrmw.start7816; CHECK-THUMB7-NEXT: @ Parent Loop BB37_1 Depth=17817; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=27818; CHECK-THUMB7-NEXT: ldrexd r4, r5, [r6]7819; CHECK-THUMB7-NEXT: cmp r4, r87820; CHECK-THUMB7-NEXT: it eq7821; CHECK-THUMB7-NEXT: cmpeq r5, r97822; CHECK-THUMB7-NEXT: bne .LBB37_47823; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start7824; CHECK-THUMB7-NEXT: @ in Loop: Header=BB37_2 Depth=27825; CHECK-THUMB7-NEXT: strexd r7, r10, r11, [r6]7826; CHECK-THUMB7-NEXT: cmp r7, #07827; CHECK-THUMB7-NEXT: bne .LBB37_27828; CHECK-THUMB7-NEXT: .LBB37_4: @ %atomicrmw.start7829; CHECK-THUMB7-NEXT: @ in Loop: Header=BB37_1 Depth=17830; CHECK-THUMB7-NEXT: mov r0, r57831; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill7832; CHECK-THUMB7-NEXT: eor.w r3, r0, r17833; CHECK-THUMB7-NEXT: mov r1, r47834; CHECK-THUMB7-NEXT: str r1, [sp, #4] @ 4-byte Spill7835; CHECK-THUMB7-NEXT: eors r2, r17836; CHECK-THUMB7-NEXT: orrs r2, r37837; CHECK-THUMB7-NEXT: cmp r2, #07838; CHECK-THUMB7-NEXT: str r1, [sp, #8] @ 4-byte Spill7839; CHECK-THUMB7-NEXT: str r0, [sp, #12] @ 4-byte Spill7840; CHECK-THUMB7-NEXT: bne .LBB37_17841; CHECK-THUMB7-NEXT: b .LBB37_57842; CHECK-THUMB7-NEXT: .LBB37_5: @ %atomicrmw.end7843; CHECK-THUMB7-NEXT: ldr r1, [sp] @ 4-byte Reload7844; CHECK-THUMB7-NEXT: ldr r0, [sp, #4] @ 4-byte Reload7845; CHECK-THUMB7-NEXT: add sp, #167846; 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: @ %entry7850; CHECK-THUMB6-NEXT: .save {r7, lr}7851; CHECK-THUMB6-NEXT: push {r7, lr}7852; CHECK-THUMB6-NEXT: ldr r0, .LCPI37_07853; CHECK-THUMB6-NEXT: movs r2, #17854; CHECK-THUMB6-NEXT: movs r3, #07855; CHECK-THUMB6-NEXT: bl __sync_fetch_and_nand_87856; CHECK-THUMB6-NEXT: pop {r7, pc}7857; CHECK-THUMB6-NEXT: .p2align 27858; CHECK-THUMB6-NEXT: @ %bb.1:7859; CHECK-THUMB6-NEXT: .LCPI37_0:7860; CHECK-THUMB6-NEXT: .long atomic_i647861;7862; CHECK-THUMB8BASE-LABEL: test_nand_i64:7863; CHECK-THUMB8BASE: @ %bb.0: @ %entry7864; CHECK-THUMB8BASE-NEXT: .save {r7, lr}7865; CHECK-THUMB8BASE-NEXT: push {r7, lr}7866; CHECK-THUMB8BASE-NEXT: .pad #87867; CHECK-THUMB8BASE-NEXT: sub sp, #87868; CHECK-THUMB8BASE-NEXT: movs r3, #07869; CHECK-THUMB8BASE-NEXT: str r3, [sp]7870; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i647871; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i647872; CHECK-THUMB8BASE-NEXT: movs r2, #17873; CHECK-THUMB8BASE-NEXT: bl __atomic_fetch_nand_87874; CHECK-THUMB8BASE-NEXT: add sp, #87875; CHECK-THUMB8BASE-NEXT: pop {r7, pc}7876entry:7877 %0 = atomicrmw nand ptr @atomic_i64, i64 1 monotonic7878 ret i64 %07879}7880define i64 @test_or_i64() {7881; CHECK-ARM8-LABEL: test_or_i64:7882; CHECK-ARM8: @ %bb.0: @ %entry7883; 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 #167886; CHECK-ARM8-NEXT: sub sp, sp, #167887; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i647888; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i647889; CHECK-ARM8-NEXT: ldr r1, [r0]7890; CHECK-ARM8-NEXT: ldr r0, [r0, #4]7891; CHECK-ARM8-NEXT: str r1, [sp, #8] @ 4-byte Spill7892; CHECK-ARM8-NEXT: str r0, [sp, #12] @ 4-byte Spill7893; CHECK-ARM8-NEXT: b .LBB38_17894; CHECK-ARM8-NEXT: .LBB38_1: @ %atomicrmw.start7895; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=17896; CHECK-ARM8-NEXT: @ Child Loop BB38_2 Depth 27897; CHECK-ARM8-NEXT: ldr r1, [sp, #12] @ 4-byte Reload7898; CHECK-ARM8-NEXT: ldr r2, [sp, #8] @ 4-byte Reload7899; CHECK-ARM8-NEXT: orr r10, r2, #17900; CHECK-ARM8-NEXT: @ kill: def $r10 killed $r10 def $r10_r117901; CHECK-ARM8-NEXT: mov r11, r17902; CHECK-ARM8-NEXT: mov r8, r27903; CHECK-ARM8-NEXT: mov r9, r17904; CHECK-ARM8-NEXT: movw r6, :lower16:atomic_i647905; CHECK-ARM8-NEXT: movt r6, :upper16:atomic_i647906; CHECK-ARM8-NEXT: @ implicit-def: $r07907; CHECK-ARM8-NEXT: @ implicit-def: $r37908; CHECK-ARM8-NEXT: @ kill: def $r6 killed $r6 def $r6_r77909; CHECK-ARM8-NEXT: mov r7, r07910; CHECK-ARM8-NEXT: .LBB38_2: @ %atomicrmw.start7911; CHECK-ARM8-NEXT: @ Parent Loop BB38_1 Depth=17912; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=27913; CHECK-ARM8-NEXT: ldrexd r4, r5, [r6]7914; CHECK-ARM8-NEXT: cmp r4, r87915; CHECK-ARM8-NEXT: cmpeq r5, r97916; CHECK-ARM8-NEXT: bne .LBB38_47917; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start7918; CHECK-ARM8-NEXT: @ in Loop: Header=BB38_2 Depth=27919; CHECK-ARM8-NEXT: strexd r7, r10, r11, [r6]7920; CHECK-ARM8-NEXT: cmp r7, #07921; CHECK-ARM8-NEXT: bne .LBB38_27922; CHECK-ARM8-NEXT: .LBB38_4: @ %atomicrmw.start7923; CHECK-ARM8-NEXT: @ in Loop: Header=BB38_1 Depth=17924; CHECK-ARM8-NEXT: mov r0, r57925; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill7926; CHECK-ARM8-NEXT: eor r3, r0, r17927; CHECK-ARM8-NEXT: mov r1, r47928; CHECK-ARM8-NEXT: str r1, [sp, #4] @ 4-byte Spill7929; CHECK-ARM8-NEXT: eor r2, r1, r27930; CHECK-ARM8-NEXT: orr r2, r2, r37931; CHECK-ARM8-NEXT: cmp r2, #07932; CHECK-ARM8-NEXT: str r1, [sp, #8] @ 4-byte Spill7933; CHECK-ARM8-NEXT: str r0, [sp, #12] @ 4-byte Spill7934; CHECK-ARM8-NEXT: bne .LBB38_17935; CHECK-ARM8-NEXT: b .LBB38_57936; CHECK-ARM8-NEXT: .LBB38_5: @ %atomicrmw.end7937; CHECK-ARM8-NEXT: ldr r1, [sp] @ 4-byte Reload7938; CHECK-ARM8-NEXT: ldr r0, [sp, #4] @ 4-byte Reload7939; CHECK-ARM8-NEXT: add sp, sp, #167940; 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: @ %entry7944; 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 #167947; CHECK-ARM6-NEXT: sub sp, sp, #167948; CHECK-ARM6-NEXT: ldr r0, .LCPI38_07949; CHECK-ARM6-NEXT: ldr r1, [r0]7950; CHECK-ARM6-NEXT: ldr r0, [r0, #4]7951; CHECK-ARM6-NEXT: str r1, [sp, #8] @ 4-byte Spill7952; CHECK-ARM6-NEXT: str r0, [sp, #12] @ 4-byte Spill7953; CHECK-ARM6-NEXT: b .LBB38_17954; CHECK-ARM6-NEXT: .LBB38_1: @ %atomicrmw.start7955; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=17956; CHECK-ARM6-NEXT: @ Child Loop BB38_2 Depth 27957; CHECK-ARM6-NEXT: ldr r1, [sp, #12] @ 4-byte Reload7958; CHECK-ARM6-NEXT: ldr r2, [sp, #8] @ 4-byte Reload7959; CHECK-ARM6-NEXT: orr r10, r2, #17960; CHECK-ARM6-NEXT: @ kill: def $r10 killed $r10 def $r10_r117961; CHECK-ARM6-NEXT: mov r11, r17962; CHECK-ARM6-NEXT: mov r8, r27963; CHECK-ARM6-NEXT: mov r9, r17964; CHECK-ARM6-NEXT: ldr r6, .LCPI38_07965; CHECK-ARM6-NEXT: @ implicit-def: $r07966; CHECK-ARM6-NEXT: @ implicit-def: $r37967; CHECK-ARM6-NEXT: @ kill: def $r6 killed $r6 def $r6_r77968; CHECK-ARM6-NEXT: mov r7, r07969; CHECK-ARM6-NEXT: .LBB38_2: @ %atomicrmw.start7970; CHECK-ARM6-NEXT: @ Parent Loop BB38_1 Depth=17971; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=27972; CHECK-ARM6-NEXT: ldrexd r4, r5, [r6]7973; CHECK-ARM6-NEXT: cmp r4, r87974; CHECK-ARM6-NEXT: cmpeq r5, r97975; CHECK-ARM6-NEXT: bne .LBB38_47976; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start7977; CHECK-ARM6-NEXT: @ in Loop: Header=BB38_2 Depth=27978; CHECK-ARM6-NEXT: strexd r7, r10, r11, [r6]7979; CHECK-ARM6-NEXT: cmp r7, #07980; CHECK-ARM6-NEXT: bne .LBB38_27981; CHECK-ARM6-NEXT: .LBB38_4: @ %atomicrmw.start7982; CHECK-ARM6-NEXT: @ in Loop: Header=BB38_1 Depth=17983; CHECK-ARM6-NEXT: mov r0, r57984; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill7985; CHECK-ARM6-NEXT: eor r3, r0, r17986; CHECK-ARM6-NEXT: mov r1, r47987; CHECK-ARM6-NEXT: str r1, [sp, #4] @ 4-byte Spill7988; CHECK-ARM6-NEXT: eor r2, r1, r27989; CHECK-ARM6-NEXT: orr r2, r2, r37990; CHECK-ARM6-NEXT: cmp r2, #07991; CHECK-ARM6-NEXT: str r1, [sp, #8] @ 4-byte Spill7992; CHECK-ARM6-NEXT: str r0, [sp, #12] @ 4-byte Spill7993; CHECK-ARM6-NEXT: bne .LBB38_17994; CHECK-ARM6-NEXT: b .LBB38_57995; CHECK-ARM6-NEXT: .LBB38_5: @ %atomicrmw.end7996; CHECK-ARM6-NEXT: ldr r1, [sp] @ 4-byte Reload7997; CHECK-ARM6-NEXT: ldr r0, [sp, #4] @ 4-byte Reload7998; CHECK-ARM6-NEXT: add sp, sp, #167999; CHECK-ARM6-NEXT: pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}8000; CHECK-ARM6-NEXT: .p2align 28001; CHECK-ARM6-NEXT: @ %bb.6:8002; CHECK-ARM6-NEXT: .LCPI38_0:8003; CHECK-ARM6-NEXT: .long atomic_i648004;8005; CHECK-THUMB7-LABEL: test_or_i64:8006; CHECK-THUMB7: @ %bb.0: @ %entry8007; 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 #168010; CHECK-THUMB7-NEXT: sub sp, #168011; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i648012; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i648013; CHECK-THUMB7-NEXT: ldr r1, [r0]8014; CHECK-THUMB7-NEXT: ldr r0, [r0, #4]8015; CHECK-THUMB7-NEXT: str r1, [sp, #8] @ 4-byte Spill8016; CHECK-THUMB7-NEXT: str r0, [sp, #12] @ 4-byte Spill8017; CHECK-THUMB7-NEXT: b .LBB38_18018; CHECK-THUMB7-NEXT: .LBB38_1: @ %atomicrmw.start8019; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=18020; CHECK-THUMB7-NEXT: @ Child Loop BB38_2 Depth 28021; CHECK-THUMB7-NEXT: ldr r1, [sp, #12] @ 4-byte Reload8022; CHECK-THUMB7-NEXT: ldr r2, [sp, #8] @ 4-byte Reload8023; CHECK-THUMB7-NEXT: orr r10, r2, #18024; CHECK-THUMB7-NEXT: @ kill: def $r10 killed $r10 def $r10_r118025; CHECK-THUMB7-NEXT: mov r11, r18026; CHECK-THUMB7-NEXT: mov r8, r28027; CHECK-THUMB7-NEXT: mov r9, r18028; CHECK-THUMB7-NEXT: movw r6, :lower16:atomic_i648029; CHECK-THUMB7-NEXT: movt r6, :upper16:atomic_i648030; CHECK-THUMB7-NEXT: @ implicit-def: $r08031; CHECK-THUMB7-NEXT: @ implicit-def: $r38032; CHECK-THUMB7-NEXT: @ kill: def $r6 killed $r6 def $r6_r78033; CHECK-THUMB7-NEXT: mov r7, r08034; CHECK-THUMB7-NEXT: .LBB38_2: @ %atomicrmw.start8035; CHECK-THUMB7-NEXT: @ Parent Loop BB38_1 Depth=18036; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=28037; CHECK-THUMB7-NEXT: ldrexd r4, r5, [r6]8038; CHECK-THUMB7-NEXT: cmp r4, r88039; CHECK-THUMB7-NEXT: it eq8040; CHECK-THUMB7-NEXT: cmpeq r5, r98041; CHECK-THUMB7-NEXT: bne .LBB38_48042; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start8043; CHECK-THUMB7-NEXT: @ in Loop: Header=BB38_2 Depth=28044; CHECK-THUMB7-NEXT: strexd r7, r10, r11, [r6]8045; CHECK-THUMB7-NEXT: cmp r7, #08046; CHECK-THUMB7-NEXT: bne .LBB38_28047; CHECK-THUMB7-NEXT: .LBB38_4: @ %atomicrmw.start8048; CHECK-THUMB7-NEXT: @ in Loop: Header=BB38_1 Depth=18049; CHECK-THUMB7-NEXT: mov r0, r58050; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill8051; CHECK-THUMB7-NEXT: eor.w r3, r0, r18052; CHECK-THUMB7-NEXT: mov r1, r48053; CHECK-THUMB7-NEXT: str r1, [sp, #4] @ 4-byte Spill8054; CHECK-THUMB7-NEXT: eors r2, r18055; CHECK-THUMB7-NEXT: orrs r2, r38056; CHECK-THUMB7-NEXT: cmp r2, #08057; CHECK-THUMB7-NEXT: str r1, [sp, #8] @ 4-byte Spill8058; CHECK-THUMB7-NEXT: str r0, [sp, #12] @ 4-byte Spill8059; CHECK-THUMB7-NEXT: bne .LBB38_18060; CHECK-THUMB7-NEXT: b .LBB38_58061; CHECK-THUMB7-NEXT: .LBB38_5: @ %atomicrmw.end8062; CHECK-THUMB7-NEXT: ldr r1, [sp] @ 4-byte Reload8063; CHECK-THUMB7-NEXT: ldr r0, [sp, #4] @ 4-byte Reload8064; CHECK-THUMB7-NEXT: add sp, #168065; 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: @ %entry8069; CHECK-THUMB6-NEXT: .save {r7, lr}8070; CHECK-THUMB6-NEXT: push {r7, lr}8071; CHECK-THUMB6-NEXT: ldr r0, .LCPI38_08072; CHECK-THUMB6-NEXT: movs r2, #18073; CHECK-THUMB6-NEXT: movs r3, #08074; CHECK-THUMB6-NEXT: bl __sync_fetch_and_or_88075; CHECK-THUMB6-NEXT: pop {r7, pc}8076; CHECK-THUMB6-NEXT: .p2align 28077; CHECK-THUMB6-NEXT: @ %bb.1:8078; CHECK-THUMB6-NEXT: .LCPI38_0:8079; CHECK-THUMB6-NEXT: .long atomic_i648080;8081; CHECK-THUMB8BASE-LABEL: test_or_i64:8082; CHECK-THUMB8BASE: @ %bb.0: @ %entry8083; CHECK-THUMB8BASE-NEXT: .save {r7, lr}8084; CHECK-THUMB8BASE-NEXT: push {r7, lr}8085; CHECK-THUMB8BASE-NEXT: .pad #88086; CHECK-THUMB8BASE-NEXT: sub sp, #88087; CHECK-THUMB8BASE-NEXT: movs r3, #08088; CHECK-THUMB8BASE-NEXT: str r3, [sp]8089; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i648090; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i648091; CHECK-THUMB8BASE-NEXT: movs r2, #18092; CHECK-THUMB8BASE-NEXT: bl __atomic_fetch_or_88093; CHECK-THUMB8BASE-NEXT: add sp, #88094; CHECK-THUMB8BASE-NEXT: pop {r7, pc}8095entry:8096 %0 = atomicrmw or ptr @atomic_i64, i64 1 monotonic8097 ret i64 %08098}8099define i64 @test_xor_i64() {8100; CHECK-ARM8-LABEL: test_xor_i64:8101; CHECK-ARM8: @ %bb.0: @ %entry8102; 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 #168105; CHECK-ARM8-NEXT: sub sp, sp, #168106; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i648107; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i648108; CHECK-ARM8-NEXT: ldr r1, [r0]8109; CHECK-ARM8-NEXT: ldr r0, [r0, #4]8110; CHECK-ARM8-NEXT: str r1, [sp, #8] @ 4-byte Spill8111; CHECK-ARM8-NEXT: str r0, [sp, #12] @ 4-byte Spill8112; CHECK-ARM8-NEXT: b .LBB39_18113; CHECK-ARM8-NEXT: .LBB39_1: @ %atomicrmw.start8114; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=18115; CHECK-ARM8-NEXT: @ Child Loop BB39_2 Depth 28116; CHECK-ARM8-NEXT: ldr r1, [sp, #12] @ 4-byte Reload8117; CHECK-ARM8-NEXT: ldr r2, [sp, #8] @ 4-byte Reload8118; CHECK-ARM8-NEXT: eor r10, r2, #18119; CHECK-ARM8-NEXT: @ kill: def $r10 killed $r10 def $r10_r118120; CHECK-ARM8-NEXT: mov r11, r18121; CHECK-ARM8-NEXT: mov r8, r28122; CHECK-ARM8-NEXT: mov r9, r18123; CHECK-ARM8-NEXT: movw r6, :lower16:atomic_i648124; CHECK-ARM8-NEXT: movt r6, :upper16:atomic_i648125; CHECK-ARM8-NEXT: @ implicit-def: $r08126; CHECK-ARM8-NEXT: @ implicit-def: $r38127; CHECK-ARM8-NEXT: @ kill: def $r6 killed $r6 def $r6_r78128; CHECK-ARM8-NEXT: mov r7, r08129; CHECK-ARM8-NEXT: .LBB39_2: @ %atomicrmw.start8130; CHECK-ARM8-NEXT: @ Parent Loop BB39_1 Depth=18131; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=28132; CHECK-ARM8-NEXT: ldrexd r4, r5, [r6]8133; CHECK-ARM8-NEXT: cmp r4, r88134; CHECK-ARM8-NEXT: cmpeq r5, r98135; CHECK-ARM8-NEXT: bne .LBB39_48136; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start8137; CHECK-ARM8-NEXT: @ in Loop: Header=BB39_2 Depth=28138; CHECK-ARM8-NEXT: strexd r7, r10, r11, [r6]8139; CHECK-ARM8-NEXT: cmp r7, #08140; CHECK-ARM8-NEXT: bne .LBB39_28141; CHECK-ARM8-NEXT: .LBB39_4: @ %atomicrmw.start8142; CHECK-ARM8-NEXT: @ in Loop: Header=BB39_1 Depth=18143; CHECK-ARM8-NEXT: mov r0, r58144; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill8145; CHECK-ARM8-NEXT: eor r3, r0, r18146; CHECK-ARM8-NEXT: mov r1, r48147; CHECK-ARM8-NEXT: str r1, [sp, #4] @ 4-byte Spill8148; CHECK-ARM8-NEXT: eor r2, r1, r28149; CHECK-ARM8-NEXT: orr r2, r2, r38150; CHECK-ARM8-NEXT: cmp r2, #08151; CHECK-ARM8-NEXT: str r1, [sp, #8] @ 4-byte Spill8152; CHECK-ARM8-NEXT: str r0, [sp, #12] @ 4-byte Spill8153; CHECK-ARM8-NEXT: bne .LBB39_18154; CHECK-ARM8-NEXT: b .LBB39_58155; CHECK-ARM8-NEXT: .LBB39_5: @ %atomicrmw.end8156; CHECK-ARM8-NEXT: ldr r1, [sp] @ 4-byte Reload8157; CHECK-ARM8-NEXT: ldr r0, [sp, #4] @ 4-byte Reload8158; CHECK-ARM8-NEXT: add sp, sp, #168159; 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: @ %entry8163; 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 #168166; CHECK-ARM6-NEXT: sub sp, sp, #168167; CHECK-ARM6-NEXT: ldr r0, .LCPI39_08168; CHECK-ARM6-NEXT: ldr r1, [r0]8169; CHECK-ARM6-NEXT: ldr r0, [r0, #4]8170; CHECK-ARM6-NEXT: str r1, [sp, #8] @ 4-byte Spill8171; CHECK-ARM6-NEXT: str r0, [sp, #12] @ 4-byte Spill8172; CHECK-ARM6-NEXT: b .LBB39_18173; CHECK-ARM6-NEXT: .LBB39_1: @ %atomicrmw.start8174; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=18175; CHECK-ARM6-NEXT: @ Child Loop BB39_2 Depth 28176; CHECK-ARM6-NEXT: ldr r1, [sp, #12] @ 4-byte Reload8177; CHECK-ARM6-NEXT: ldr r2, [sp, #8] @ 4-byte Reload8178; CHECK-ARM6-NEXT: eor r10, r2, #18179; CHECK-ARM6-NEXT: @ kill: def $r10 killed $r10 def $r10_r118180; CHECK-ARM6-NEXT: mov r11, r18181; CHECK-ARM6-NEXT: mov r8, r28182; CHECK-ARM6-NEXT: mov r9, r18183; CHECK-ARM6-NEXT: ldr r6, .LCPI39_08184; CHECK-ARM6-NEXT: @ implicit-def: $r08185; CHECK-ARM6-NEXT: @ implicit-def: $r38186; CHECK-ARM6-NEXT: @ kill: def $r6 killed $r6 def $r6_r78187; CHECK-ARM6-NEXT: mov r7, r08188; CHECK-ARM6-NEXT: .LBB39_2: @ %atomicrmw.start8189; CHECK-ARM6-NEXT: @ Parent Loop BB39_1 Depth=18190; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=28191; CHECK-ARM6-NEXT: ldrexd r4, r5, [r6]8192; CHECK-ARM6-NEXT: cmp r4, r88193; CHECK-ARM6-NEXT: cmpeq r5, r98194; CHECK-ARM6-NEXT: bne .LBB39_48195; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start8196; CHECK-ARM6-NEXT: @ in Loop: Header=BB39_2 Depth=28197; CHECK-ARM6-NEXT: strexd r7, r10, r11, [r6]8198; CHECK-ARM6-NEXT: cmp r7, #08199; CHECK-ARM6-NEXT: bne .LBB39_28200; CHECK-ARM6-NEXT: .LBB39_4: @ %atomicrmw.start8201; CHECK-ARM6-NEXT: @ in Loop: Header=BB39_1 Depth=18202; CHECK-ARM6-NEXT: mov r0, r58203; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill8204; CHECK-ARM6-NEXT: eor r3, r0, r18205; CHECK-ARM6-NEXT: mov r1, r48206; CHECK-ARM6-NEXT: str r1, [sp, #4] @ 4-byte Spill8207; CHECK-ARM6-NEXT: eor r2, r1, r28208; CHECK-ARM6-NEXT: orr r2, r2, r38209; CHECK-ARM6-NEXT: cmp r2, #08210; CHECK-ARM6-NEXT: str r1, [sp, #8] @ 4-byte Spill8211; CHECK-ARM6-NEXT: str r0, [sp, #12] @ 4-byte Spill8212; CHECK-ARM6-NEXT: bne .LBB39_18213; CHECK-ARM6-NEXT: b .LBB39_58214; CHECK-ARM6-NEXT: .LBB39_5: @ %atomicrmw.end8215; CHECK-ARM6-NEXT: ldr r1, [sp] @ 4-byte Reload8216; CHECK-ARM6-NEXT: ldr r0, [sp, #4] @ 4-byte Reload8217; CHECK-ARM6-NEXT: add sp, sp, #168218; CHECK-ARM6-NEXT: pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}8219; CHECK-ARM6-NEXT: .p2align 28220; CHECK-ARM6-NEXT: @ %bb.6:8221; CHECK-ARM6-NEXT: .LCPI39_0:8222; CHECK-ARM6-NEXT: .long atomic_i648223;8224; CHECK-THUMB7-LABEL: test_xor_i64:8225; CHECK-THUMB7: @ %bb.0: @ %entry8226; 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 #168229; CHECK-THUMB7-NEXT: sub sp, #168230; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i648231; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i648232; CHECK-THUMB7-NEXT: ldr r1, [r0]8233; CHECK-THUMB7-NEXT: ldr r0, [r0, #4]8234; CHECK-THUMB7-NEXT: str r1, [sp, #8] @ 4-byte Spill8235; CHECK-THUMB7-NEXT: str r0, [sp, #12] @ 4-byte Spill8236; CHECK-THUMB7-NEXT: b .LBB39_18237; CHECK-THUMB7-NEXT: .LBB39_1: @ %atomicrmw.start8238; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=18239; CHECK-THUMB7-NEXT: @ Child Loop BB39_2 Depth 28240; CHECK-THUMB7-NEXT: ldr r1, [sp, #12] @ 4-byte Reload8241; CHECK-THUMB7-NEXT: ldr r2, [sp, #8] @ 4-byte Reload8242; CHECK-THUMB7-NEXT: eor r10, r2, #18243; CHECK-THUMB7-NEXT: @ kill: def $r10 killed $r10 def $r10_r118244; CHECK-THUMB7-NEXT: mov r11, r18245; CHECK-THUMB7-NEXT: mov r8, r28246; CHECK-THUMB7-NEXT: mov r9, r18247; CHECK-THUMB7-NEXT: movw r6, :lower16:atomic_i648248; CHECK-THUMB7-NEXT: movt r6, :upper16:atomic_i648249; CHECK-THUMB7-NEXT: @ implicit-def: $r08250; CHECK-THUMB7-NEXT: @ implicit-def: $r38251; CHECK-THUMB7-NEXT: @ kill: def $r6 killed $r6 def $r6_r78252; CHECK-THUMB7-NEXT: mov r7, r08253; CHECK-THUMB7-NEXT: .LBB39_2: @ %atomicrmw.start8254; CHECK-THUMB7-NEXT: @ Parent Loop BB39_1 Depth=18255; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=28256; CHECK-THUMB7-NEXT: ldrexd r4, r5, [r6]8257; CHECK-THUMB7-NEXT: cmp r4, r88258; CHECK-THUMB7-NEXT: it eq8259; CHECK-THUMB7-NEXT: cmpeq r5, r98260; CHECK-THUMB7-NEXT: bne .LBB39_48261; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start8262; CHECK-THUMB7-NEXT: @ in Loop: Header=BB39_2 Depth=28263; CHECK-THUMB7-NEXT: strexd r7, r10, r11, [r6]8264; CHECK-THUMB7-NEXT: cmp r7, #08265; CHECK-THUMB7-NEXT: bne .LBB39_28266; CHECK-THUMB7-NEXT: .LBB39_4: @ %atomicrmw.start8267; CHECK-THUMB7-NEXT: @ in Loop: Header=BB39_1 Depth=18268; CHECK-THUMB7-NEXT: mov r0, r58269; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill8270; CHECK-THUMB7-NEXT: eor.w r3, r0, r18271; CHECK-THUMB7-NEXT: mov r1, r48272; CHECK-THUMB7-NEXT: str r1, [sp, #4] @ 4-byte Spill8273; CHECK-THUMB7-NEXT: eors r2, r18274; CHECK-THUMB7-NEXT: orrs r2, r38275; CHECK-THUMB7-NEXT: cmp r2, #08276; CHECK-THUMB7-NEXT: str r1, [sp, #8] @ 4-byte Spill8277; CHECK-THUMB7-NEXT: str r0, [sp, #12] @ 4-byte Spill8278; CHECK-THUMB7-NEXT: bne .LBB39_18279; CHECK-THUMB7-NEXT: b .LBB39_58280; CHECK-THUMB7-NEXT: .LBB39_5: @ %atomicrmw.end8281; CHECK-THUMB7-NEXT: ldr r1, [sp] @ 4-byte Reload8282; CHECK-THUMB7-NEXT: ldr r0, [sp, #4] @ 4-byte Reload8283; CHECK-THUMB7-NEXT: add sp, #168284; 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: @ %entry8288; CHECK-THUMB6-NEXT: .save {r7, lr}8289; CHECK-THUMB6-NEXT: push {r7, lr}8290; CHECK-THUMB6-NEXT: ldr r0, .LCPI39_08291; CHECK-THUMB6-NEXT: movs r2, #18292; CHECK-THUMB6-NEXT: movs r3, #08293; CHECK-THUMB6-NEXT: bl __sync_fetch_and_xor_88294; CHECK-THUMB6-NEXT: pop {r7, pc}8295; CHECK-THUMB6-NEXT: .p2align 28296; CHECK-THUMB6-NEXT: @ %bb.1:8297; CHECK-THUMB6-NEXT: .LCPI39_0:8298; CHECK-THUMB6-NEXT: .long atomic_i648299;8300; CHECK-THUMB8BASE-LABEL: test_xor_i64:8301; CHECK-THUMB8BASE: @ %bb.0: @ %entry8302; CHECK-THUMB8BASE-NEXT: .save {r7, lr}8303; CHECK-THUMB8BASE-NEXT: push {r7, lr}8304; CHECK-THUMB8BASE-NEXT: .pad #88305; CHECK-THUMB8BASE-NEXT: sub sp, #88306; CHECK-THUMB8BASE-NEXT: movs r3, #08307; CHECK-THUMB8BASE-NEXT: str r3, [sp]8308; CHECK-THUMB8BASE-NEXT: movw r0, :lower16:atomic_i648309; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i648310; CHECK-THUMB8BASE-NEXT: movs r2, #18311; CHECK-THUMB8BASE-NEXT: bl __atomic_fetch_xor_88312; CHECK-THUMB8BASE-NEXT: add sp, #88313; CHECK-THUMB8BASE-NEXT: pop {r7, pc}8314entry:8315 %0 = atomicrmw xor ptr @atomic_i64, i64 1 monotonic8316 ret i64 %08317}8318 8319define i64 @test_max_i64() {8320; CHECK-ARM8-LABEL: test_max_i64:8321; CHECK-ARM8: @ %bb.0: @ %entry8322; 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 #168325; CHECK-ARM8-NEXT: sub sp, sp, #168326; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i648327; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i648328; CHECK-ARM8-NEXT: ldr r1, [r0]8329; CHECK-ARM8-NEXT: ldr r0, [r0, #4]8330; CHECK-ARM8-NEXT: str r1, [sp, #8] @ 4-byte Spill8331; CHECK-ARM8-NEXT: str r0, [sp, #12] @ 4-byte Spill8332; CHECK-ARM8-NEXT: b .LBB40_18333; CHECK-ARM8-NEXT: .LBB40_1: @ %atomicrmw.start8334; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=18335; CHECK-ARM8-NEXT: @ Child Loop BB40_2 Depth 28336; CHECK-ARM8-NEXT: ldr r1, [sp, #12] @ 4-byte Reload8337; CHECK-ARM8-NEXT: ldr r2, [sp, #8] @ 4-byte Reload8338; CHECK-ARM8-NEXT: mov r8, r28339; CHECK-ARM8-NEXT: mov r9, r18340; CHECK-ARM8-NEXT: rsbs r0, r2, #18341; CHECK-ARM8-NEXT: rscs r0, r1, #08342; CHECK-ARM8-NEXT: mov r0, #08343; CHECK-ARM8-NEXT: movwlt r0, #18344; CHECK-ARM8-NEXT: mov r10, #18345; CHECK-ARM8-NEXT: movlt r10, r28346; CHECK-ARM8-NEXT: cmp r0, #08347; CHECK-ARM8-NEXT: movne r0, r18348; CHECK-ARM8-NEXT: @ kill: def $r10 killed $r10 def $r10_r118349; CHECK-ARM8-NEXT: mov r11, r08350; CHECK-ARM8-NEXT: movw r6, :lower16:atomic_i648351; CHECK-ARM8-NEXT: movt r6, :upper16:atomic_i648352; CHECK-ARM8-NEXT: @ implicit-def: $r08353; CHECK-ARM8-NEXT: @ implicit-def: $r38354; CHECK-ARM8-NEXT: @ kill: def $r6 killed $r6 def $r6_r78355; CHECK-ARM8-NEXT: mov r7, r08356; CHECK-ARM8-NEXT: .LBB40_2: @ %atomicrmw.start8357; CHECK-ARM8-NEXT: @ Parent Loop BB40_1 Depth=18358; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=28359; CHECK-ARM8-NEXT: ldrexd r4, r5, [r6]8360; CHECK-ARM8-NEXT: cmp r4, r88361; CHECK-ARM8-NEXT: cmpeq r5, r98362; CHECK-ARM8-NEXT: bne .LBB40_48363; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start8364; CHECK-ARM8-NEXT: @ in Loop: Header=BB40_2 Depth=28365; CHECK-ARM8-NEXT: strexd r7, r10, r11, [r6]8366; CHECK-ARM8-NEXT: cmp r7, #08367; CHECK-ARM8-NEXT: bne .LBB40_28368; CHECK-ARM8-NEXT: .LBB40_4: @ %atomicrmw.start8369; CHECK-ARM8-NEXT: @ in Loop: Header=BB40_1 Depth=18370; CHECK-ARM8-NEXT: mov r0, r58371; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill8372; CHECK-ARM8-NEXT: eor r3, r0, r18373; CHECK-ARM8-NEXT: mov r1, r48374; CHECK-ARM8-NEXT: str r1, [sp, #4] @ 4-byte Spill8375; CHECK-ARM8-NEXT: eor r2, r1, r28376; CHECK-ARM8-NEXT: orr r2, r2, r38377; CHECK-ARM8-NEXT: cmp r2, #08378; CHECK-ARM8-NEXT: str r1, [sp, #8] @ 4-byte Spill8379; CHECK-ARM8-NEXT: str r0, [sp, #12] @ 4-byte Spill8380; CHECK-ARM8-NEXT: bne .LBB40_18381; CHECK-ARM8-NEXT: b .LBB40_58382; CHECK-ARM8-NEXT: .LBB40_5: @ %atomicrmw.end8383; CHECK-ARM8-NEXT: ldr r1, [sp] @ 4-byte Reload8384; CHECK-ARM8-NEXT: ldr r0, [sp, #4] @ 4-byte Reload8385; CHECK-ARM8-NEXT: add sp, sp, #168386; 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: @ %entry8390; 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 #168393; CHECK-ARM6-NEXT: sub sp, sp, #168394; CHECK-ARM6-NEXT: ldr r0, .LCPI40_08395; CHECK-ARM6-NEXT: ldr r1, [r0]8396; CHECK-ARM6-NEXT: ldr r0, [r0, #4]8397; CHECK-ARM6-NEXT: str r1, [sp, #8] @ 4-byte Spill8398; CHECK-ARM6-NEXT: str r0, [sp, #12] @ 4-byte Spill8399; CHECK-ARM6-NEXT: b .LBB40_18400; CHECK-ARM6-NEXT: .LBB40_1: @ %atomicrmw.start8401; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=18402; CHECK-ARM6-NEXT: @ Child Loop BB40_2 Depth 28403; CHECK-ARM6-NEXT: ldr r1, [sp, #12] @ 4-byte Reload8404; CHECK-ARM6-NEXT: ldr r2, [sp, #8] @ 4-byte Reload8405; CHECK-ARM6-NEXT: mov r8, r28406; CHECK-ARM6-NEXT: mov r9, r18407; CHECK-ARM6-NEXT: rsbs r0, r2, #18408; CHECK-ARM6-NEXT: rscs r0, r1, #08409; CHECK-ARM6-NEXT: mov r0, #08410; CHECK-ARM6-NEXT: movlt r0, #18411; CHECK-ARM6-NEXT: mov r10, #18412; CHECK-ARM6-NEXT: movlt r10, r28413; CHECK-ARM6-NEXT: cmp r0, #08414; CHECK-ARM6-NEXT: movne r0, r18415; CHECK-ARM6-NEXT: @ kill: def $r10 killed $r10 def $r10_r118416; CHECK-ARM6-NEXT: mov r11, r08417; CHECK-ARM6-NEXT: ldr r6, .LCPI40_08418; CHECK-ARM6-NEXT: @ implicit-def: $r08419; CHECK-ARM6-NEXT: @ implicit-def: $r38420; CHECK-ARM6-NEXT: @ kill: def $r6 killed $r6 def $r6_r78421; CHECK-ARM6-NEXT: mov r7, r08422; CHECK-ARM6-NEXT: .LBB40_2: @ %atomicrmw.start8423; CHECK-ARM6-NEXT: @ Parent Loop BB40_1 Depth=18424; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=28425; CHECK-ARM6-NEXT: ldrexd r4, r5, [r6]8426; CHECK-ARM6-NEXT: cmp r4, r88427; CHECK-ARM6-NEXT: cmpeq r5, r98428; CHECK-ARM6-NEXT: bne .LBB40_48429; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start8430; CHECK-ARM6-NEXT: @ in Loop: Header=BB40_2 Depth=28431; CHECK-ARM6-NEXT: strexd r7, r10, r11, [r6]8432; CHECK-ARM6-NEXT: cmp r7, #08433; CHECK-ARM6-NEXT: bne .LBB40_28434; CHECK-ARM6-NEXT: .LBB40_4: @ %atomicrmw.start8435; CHECK-ARM6-NEXT: @ in Loop: Header=BB40_1 Depth=18436; CHECK-ARM6-NEXT: mov r0, r58437; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill8438; CHECK-ARM6-NEXT: eor r3, r0, r18439; CHECK-ARM6-NEXT: mov r1, r48440; CHECK-ARM6-NEXT: str r1, [sp, #4] @ 4-byte Spill8441; CHECK-ARM6-NEXT: eor r2, r1, r28442; CHECK-ARM6-NEXT: orr r2, r2, r38443; CHECK-ARM6-NEXT: cmp r2, #08444; CHECK-ARM6-NEXT: str r1, [sp, #8] @ 4-byte Spill8445; CHECK-ARM6-NEXT: str r0, [sp, #12] @ 4-byte Spill8446; CHECK-ARM6-NEXT: bne .LBB40_18447; CHECK-ARM6-NEXT: b .LBB40_58448; CHECK-ARM6-NEXT: .LBB40_5: @ %atomicrmw.end8449; CHECK-ARM6-NEXT: ldr r1, [sp] @ 4-byte Reload8450; CHECK-ARM6-NEXT: ldr r0, [sp, #4] @ 4-byte Reload8451; CHECK-ARM6-NEXT: add sp, sp, #168452; CHECK-ARM6-NEXT: pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}8453; CHECK-ARM6-NEXT: .p2align 28454; CHECK-ARM6-NEXT: @ %bb.6:8455; CHECK-ARM6-NEXT: .LCPI40_0:8456; CHECK-ARM6-NEXT: .long atomic_i648457;8458; CHECK-THUMB7-LABEL: test_max_i64:8459; CHECK-THUMB7: @ %bb.0: @ %entry8460; 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 #168463; CHECK-THUMB7-NEXT: sub sp, #168464; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i648465; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i648466; CHECK-THUMB7-NEXT: ldr r1, [r0]8467; CHECK-THUMB7-NEXT: ldr r0, [r0, #4]8468; CHECK-THUMB7-NEXT: str r1, [sp, #8] @ 4-byte Spill8469; CHECK-THUMB7-NEXT: str r0, [sp, #12] @ 4-byte Spill8470; CHECK-THUMB7-NEXT: b .LBB40_18471; CHECK-THUMB7-NEXT: .LBB40_1: @ %atomicrmw.start8472; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=18473; CHECK-THUMB7-NEXT: @ Child Loop BB40_2 Depth 28474; CHECK-THUMB7-NEXT: ldr r1, [sp, #12] @ 4-byte Reload8475; CHECK-THUMB7-NEXT: ldr r2, [sp, #8] @ 4-byte Reload8476; CHECK-THUMB7-NEXT: rsbs.w r0, r2, #18477; CHECK-THUMB7-NEXT: mov.w r0, #08478; CHECK-THUMB7-NEXT: sbcs.w r3, r0, r18479; CHECK-THUMB7-NEXT: it lt8480; CHECK-THUMB7-NEXT: movlt r0, #18481; CHECK-THUMB7-NEXT: mov r8, r28482; CHECK-THUMB7-NEXT: mov r9, r18483; CHECK-THUMB7-NEXT: mov.w r10, #18484; CHECK-THUMB7-NEXT: it lt8485; CHECK-THUMB7-NEXT: movlt r10, r28486; CHECK-THUMB7-NEXT: cmp r0, #08487; CHECK-THUMB7-NEXT: it ne8488; CHECK-THUMB7-NEXT: movne r0, r18489; CHECK-THUMB7-NEXT: @ kill: def $r10 killed $r10 def $r10_r118490; CHECK-THUMB7-NEXT: mov r11, r08491; CHECK-THUMB7-NEXT: movw r6, :lower16:atomic_i648492; CHECK-THUMB7-NEXT: movt r6, :upper16:atomic_i648493; CHECK-THUMB7-NEXT: @ implicit-def: $r08494; CHECK-THUMB7-NEXT: @ implicit-def: $r38495; CHECK-THUMB7-NEXT: @ kill: def $r6 killed $r6 def $r6_r78496; CHECK-THUMB7-NEXT: mov r7, r08497; CHECK-THUMB7-NEXT: .LBB40_2: @ %atomicrmw.start8498; CHECK-THUMB7-NEXT: @ Parent Loop BB40_1 Depth=18499; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=28500; CHECK-THUMB7-NEXT: ldrexd r4, r5, [r6]8501; CHECK-THUMB7-NEXT: cmp r4, r88502; CHECK-THUMB7-NEXT: it eq8503; CHECK-THUMB7-NEXT: cmpeq r5, r98504; CHECK-THUMB7-NEXT: bne .LBB40_48505; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start8506; CHECK-THUMB7-NEXT: @ in Loop: Header=BB40_2 Depth=28507; CHECK-THUMB7-NEXT: strexd r7, r10, r11, [r6]8508; CHECK-THUMB7-NEXT: cmp r7, #08509; CHECK-THUMB7-NEXT: bne .LBB40_28510; CHECK-THUMB7-NEXT: .LBB40_4: @ %atomicrmw.start8511; CHECK-THUMB7-NEXT: @ in Loop: Header=BB40_1 Depth=18512; CHECK-THUMB7-NEXT: mov r0, r58513; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill8514; CHECK-THUMB7-NEXT: eor.w r3, r0, r18515; CHECK-THUMB7-NEXT: mov r1, r48516; CHECK-THUMB7-NEXT: str r1, [sp, #4] @ 4-byte Spill8517; CHECK-THUMB7-NEXT: eors r2, r18518; CHECK-THUMB7-NEXT: orrs r2, r38519; CHECK-THUMB7-NEXT: cmp r2, #08520; CHECK-THUMB7-NEXT: str r1, [sp, #8] @ 4-byte Spill8521; CHECK-THUMB7-NEXT: str r0, [sp, #12] @ 4-byte Spill8522; CHECK-THUMB7-NEXT: bne .LBB40_18523; CHECK-THUMB7-NEXT: b .LBB40_58524; CHECK-THUMB7-NEXT: .LBB40_5: @ %atomicrmw.end8525; CHECK-THUMB7-NEXT: ldr r1, [sp] @ 4-byte Reload8526; CHECK-THUMB7-NEXT: ldr r0, [sp, #4] @ 4-byte Reload8527; CHECK-THUMB7-NEXT: add sp, #168528; 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: @ %entry8532; CHECK-THUMB6-NEXT: .save {r7, lr}8533; CHECK-THUMB6-NEXT: push {r7, lr}8534; CHECK-THUMB6-NEXT: ldr r0, .LCPI40_08535; CHECK-THUMB6-NEXT: movs r2, #18536; CHECK-THUMB6-NEXT: movs r3, #08537; CHECK-THUMB6-NEXT: bl __sync_fetch_and_max_88538; CHECK-THUMB6-NEXT: pop {r7, pc}8539; CHECK-THUMB6-NEXT: .p2align 28540; CHECK-THUMB6-NEXT: @ %bb.1:8541; CHECK-THUMB6-NEXT: .LCPI40_0:8542; CHECK-THUMB6-NEXT: .long atomic_i648543;8544; CHECK-THUMB8BASE-LABEL: test_max_i64:8545; CHECK-THUMB8BASE: @ %bb.0: @ %entry8546; CHECK-THUMB8BASE-NEXT: .save {r4, lr}8547; CHECK-THUMB8BASE-NEXT: push {r4, lr}8548; CHECK-THUMB8BASE-NEXT: .pad #728549; CHECK-THUMB8BASE-NEXT: sub sp, #728550; CHECK-THUMB8BASE-NEXT: movw r1, :lower16:atomic_i648551; CHECK-THUMB8BASE-NEXT: movt r1, :upper16:atomic_i648552; CHECK-THUMB8BASE-NEXT: ldr r0, [r1, #4]8553; CHECK-THUMB8BASE-NEXT: ldr r1, [r1]8554; CHECK-THUMB8BASE-NEXT: str r1, [sp, #56] @ 4-byte Spill8555; CHECK-THUMB8BASE-NEXT: str r0, [sp, #60] @ 4-byte Spill8556; CHECK-THUMB8BASE-NEXT: b .LBB40_18557; CHECK-THUMB8BASE-NEXT: .LBB40_1: @ %atomicrmw.start8558; CHECK-THUMB8BASE-NEXT: @ =>This Inner Loop Header: Depth=18559; CHECK-THUMB8BASE-NEXT: ldr r3, [sp, #56] @ 4-byte Reload8560; CHECK-THUMB8BASE-NEXT: ldr r2, [sp, #60] @ 4-byte Reload8561; CHECK-THUMB8BASE-NEXT: str r2, [sp, #36] @ 4-byte Spill8562; CHECK-THUMB8BASE-NEXT: str r3, [sp, #40] @ 4-byte Spill8563; CHECK-THUMB8BASE-NEXT: movs r1, #08564; CHECK-THUMB8BASE-NEXT: str r1, [sp, #44] @ 4-byte Spill8565; CHECK-THUMB8BASE-NEXT: movs r0, #18566; CHECK-THUMB8BASE-NEXT: str r0, [sp, #48] @ 4-byte Spill8567; CHECK-THUMB8BASE-NEXT: subs r3, r0, r38568; CHECK-THUMB8BASE-NEXT: sbcs r1, r28569; CHECK-THUMB8BASE-NEXT: str r0, [sp, #52] @ 4-byte Spill8570; CHECK-THUMB8BASE-NEXT: blt .LBB40_38571; CHECK-THUMB8BASE-NEXT: @ %bb.2: @ %atomicrmw.start8572; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB40_1 Depth=18573; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #44] @ 4-byte Reload8574; CHECK-THUMB8BASE-NEXT: str r0, [sp, #52] @ 4-byte Spill8575; CHECK-THUMB8BASE-NEXT: .LBB40_3: @ %atomicrmw.start8576; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB40_1 Depth=18577; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #40] @ 4-byte Reload8578; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #52] @ 4-byte Reload8579; CHECK-THUMB8BASE-NEXT: str r1, [sp, #28] @ 4-byte Spill8580; CHECK-THUMB8BASE-NEXT: str r0, [sp, #32] @ 4-byte Spill8581; CHECK-THUMB8BASE-NEXT: blt .LBB40_58582; CHECK-THUMB8BASE-NEXT: @ %bb.4: @ %atomicrmw.start8583; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB40_1 Depth=18584; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #48] @ 4-byte Reload8585; CHECK-THUMB8BASE-NEXT: str r0, [sp, #32] @ 4-byte Spill8586; CHECK-THUMB8BASE-NEXT: .LBB40_5: @ %atomicrmw.start8587; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB40_1 Depth=18588; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #36] @ 4-byte Reload8589; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #28] @ 4-byte Reload8590; CHECK-THUMB8BASE-NEXT: ldr r2, [sp, #32] @ 4-byte Reload8591; CHECK-THUMB8BASE-NEXT: str r2, [sp, #20] @ 4-byte Spill8592; CHECK-THUMB8BASE-NEXT: str r0, [sp, #24] @ 4-byte Spill8593; CHECK-THUMB8BASE-NEXT: cbnz r1, .LBB40_78594; CHECK-THUMB8BASE-NEXT: @ %bb.6: @ %atomicrmw.start8595; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB40_1 Depth=18596; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #28] @ 4-byte Reload8597; CHECK-THUMB8BASE-NEXT: str r0, [sp, #24] @ 4-byte Spill8598; CHECK-THUMB8BASE-NEXT: .LBB40_7: @ %atomicrmw.start8599; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB40_1 Depth=18600; CHECK-THUMB8BASE-NEXT: ldr r2, [sp, #20] @ 4-byte Reload8601; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #44] @ 4-byte Reload8602; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #36] @ 4-byte Reload8603; CHECK-THUMB8BASE-NEXT: ldr r4, [sp, #40] @ 4-byte Reload8604; CHECK-THUMB8BASE-NEXT: ldr r3, [sp, #24] @ 4-byte Reload8605; 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_i648610; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i648611; CHECK-THUMB8BASE-NEXT: add r1, sp, #648612; CHECK-THUMB8BASE-NEXT: bl __atomic_compare_exchange_88613; CHECK-THUMB8BASE-NEXT: mov r2, r08614; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #68]8615; CHECK-THUMB8BASE-NEXT: str r0, [sp, #12] @ 4-byte Spill8616; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #64]8617; CHECK-THUMB8BASE-NEXT: str r1, [sp, #16] @ 4-byte Spill8618; CHECK-THUMB8BASE-NEXT: cmp r2, #08619; CHECK-THUMB8BASE-NEXT: str r1, [sp, #56] @ 4-byte Spill8620; CHECK-THUMB8BASE-NEXT: str r0, [sp, #60] @ 4-byte Spill8621; CHECK-THUMB8BASE-NEXT: beq .LBB40_18622; CHECK-THUMB8BASE-NEXT: b .LBB40_88623; CHECK-THUMB8BASE-NEXT: .LBB40_8: @ %atomicrmw.end8624; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #12] @ 4-byte Reload8625; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #16] @ 4-byte Reload8626; CHECK-THUMB8BASE-NEXT: add sp, #728627; CHECK-THUMB8BASE-NEXT: pop {r4, pc}8628entry:8629 %0 = atomicrmw max ptr @atomic_i64, i64 1 monotonic8630 ret i64 %08631}8632define i64 @test_min_i64() {8633; CHECK-ARM8-LABEL: test_min_i64:8634; CHECK-ARM8: @ %bb.0: @ %entry8635; 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 #168638; CHECK-ARM8-NEXT: sub sp, sp, #168639; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i648640; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i648641; CHECK-ARM8-NEXT: ldr r1, [r0]8642; CHECK-ARM8-NEXT: ldr r0, [r0, #4]8643; CHECK-ARM8-NEXT: str r1, [sp, #8] @ 4-byte Spill8644; CHECK-ARM8-NEXT: str r0, [sp, #12] @ 4-byte Spill8645; CHECK-ARM8-NEXT: b .LBB41_18646; CHECK-ARM8-NEXT: .LBB41_1: @ %atomicrmw.start8647; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=18648; CHECK-ARM8-NEXT: @ Child Loop BB41_2 Depth 28649; CHECK-ARM8-NEXT: ldr r1, [sp, #12] @ 4-byte Reload8650; CHECK-ARM8-NEXT: ldr r2, [sp, #8] @ 4-byte Reload8651; CHECK-ARM8-NEXT: mov r8, r28652; CHECK-ARM8-NEXT: mov r9, r18653; CHECK-ARM8-NEXT: subs r0, r2, #28654; CHECK-ARM8-NEXT: sbcs r0, r1, #08655; CHECK-ARM8-NEXT: mov r0, #08656; CHECK-ARM8-NEXT: movwlt r0, #18657; CHECK-ARM8-NEXT: mov r10, #18658; CHECK-ARM8-NEXT: movlt r10, r28659; CHECK-ARM8-NEXT: cmp r0, #08660; CHECK-ARM8-NEXT: movne r0, r18661; CHECK-ARM8-NEXT: @ kill: def $r10 killed $r10 def $r10_r118662; CHECK-ARM8-NEXT: mov r11, r08663; CHECK-ARM8-NEXT: movw r6, :lower16:atomic_i648664; CHECK-ARM8-NEXT: movt r6, :upper16:atomic_i648665; CHECK-ARM8-NEXT: @ implicit-def: $r08666; CHECK-ARM8-NEXT: @ implicit-def: $r38667; CHECK-ARM8-NEXT: @ kill: def $r6 killed $r6 def $r6_r78668; CHECK-ARM8-NEXT: mov r7, r08669; CHECK-ARM8-NEXT: .LBB41_2: @ %atomicrmw.start8670; CHECK-ARM8-NEXT: @ Parent Loop BB41_1 Depth=18671; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=28672; CHECK-ARM8-NEXT: ldrexd r4, r5, [r6]8673; CHECK-ARM8-NEXT: cmp r4, r88674; CHECK-ARM8-NEXT: cmpeq r5, r98675; CHECK-ARM8-NEXT: bne .LBB41_48676; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start8677; CHECK-ARM8-NEXT: @ in Loop: Header=BB41_2 Depth=28678; CHECK-ARM8-NEXT: strexd r7, r10, r11, [r6]8679; CHECK-ARM8-NEXT: cmp r7, #08680; CHECK-ARM8-NEXT: bne .LBB41_28681; CHECK-ARM8-NEXT: .LBB41_4: @ %atomicrmw.start8682; CHECK-ARM8-NEXT: @ in Loop: Header=BB41_1 Depth=18683; CHECK-ARM8-NEXT: mov r0, r58684; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill8685; CHECK-ARM8-NEXT: eor r3, r0, r18686; CHECK-ARM8-NEXT: mov r1, r48687; CHECK-ARM8-NEXT: str r1, [sp, #4] @ 4-byte Spill8688; CHECK-ARM8-NEXT: eor r2, r1, r28689; CHECK-ARM8-NEXT: orr r2, r2, r38690; CHECK-ARM8-NEXT: cmp r2, #08691; CHECK-ARM8-NEXT: str r1, [sp, #8] @ 4-byte Spill8692; CHECK-ARM8-NEXT: str r0, [sp, #12] @ 4-byte Spill8693; CHECK-ARM8-NEXT: bne .LBB41_18694; CHECK-ARM8-NEXT: b .LBB41_58695; CHECK-ARM8-NEXT: .LBB41_5: @ %atomicrmw.end8696; CHECK-ARM8-NEXT: ldr r1, [sp] @ 4-byte Reload8697; CHECK-ARM8-NEXT: ldr r0, [sp, #4] @ 4-byte Reload8698; CHECK-ARM8-NEXT: add sp, sp, #168699; 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: @ %entry8703; 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 #168706; CHECK-ARM6-NEXT: sub sp, sp, #168707; CHECK-ARM6-NEXT: ldr r0, .LCPI41_08708; CHECK-ARM6-NEXT: ldr r1, [r0]8709; CHECK-ARM6-NEXT: ldr r0, [r0, #4]8710; CHECK-ARM6-NEXT: str r1, [sp, #8] @ 4-byte Spill8711; CHECK-ARM6-NEXT: str r0, [sp, #12] @ 4-byte Spill8712; CHECK-ARM6-NEXT: b .LBB41_18713; CHECK-ARM6-NEXT: .LBB41_1: @ %atomicrmw.start8714; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=18715; CHECK-ARM6-NEXT: @ Child Loop BB41_2 Depth 28716; CHECK-ARM6-NEXT: ldr r1, [sp, #12] @ 4-byte Reload8717; CHECK-ARM6-NEXT: ldr r2, [sp, #8] @ 4-byte Reload8718; CHECK-ARM6-NEXT: mov r8, r28719; CHECK-ARM6-NEXT: mov r9, r18720; CHECK-ARM6-NEXT: subs r0, r2, #28721; CHECK-ARM6-NEXT: sbcs r0, r1, #08722; CHECK-ARM6-NEXT: mov r0, #08723; CHECK-ARM6-NEXT: movlt r0, #18724; CHECK-ARM6-NEXT: mov r10, #18725; CHECK-ARM6-NEXT: movlt r10, r28726; CHECK-ARM6-NEXT: cmp r0, #08727; CHECK-ARM6-NEXT: movne r0, r18728; CHECK-ARM6-NEXT: @ kill: def $r10 killed $r10 def $r10_r118729; CHECK-ARM6-NEXT: mov r11, r08730; CHECK-ARM6-NEXT: ldr r6, .LCPI41_08731; CHECK-ARM6-NEXT: @ implicit-def: $r08732; CHECK-ARM6-NEXT: @ implicit-def: $r38733; CHECK-ARM6-NEXT: @ kill: def $r6 killed $r6 def $r6_r78734; CHECK-ARM6-NEXT: mov r7, r08735; CHECK-ARM6-NEXT: .LBB41_2: @ %atomicrmw.start8736; CHECK-ARM6-NEXT: @ Parent Loop BB41_1 Depth=18737; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=28738; CHECK-ARM6-NEXT: ldrexd r4, r5, [r6]8739; CHECK-ARM6-NEXT: cmp r4, r88740; CHECK-ARM6-NEXT: cmpeq r5, r98741; CHECK-ARM6-NEXT: bne .LBB41_48742; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start8743; CHECK-ARM6-NEXT: @ in Loop: Header=BB41_2 Depth=28744; CHECK-ARM6-NEXT: strexd r7, r10, r11, [r6]8745; CHECK-ARM6-NEXT: cmp r7, #08746; CHECK-ARM6-NEXT: bne .LBB41_28747; CHECK-ARM6-NEXT: .LBB41_4: @ %atomicrmw.start8748; CHECK-ARM6-NEXT: @ in Loop: Header=BB41_1 Depth=18749; CHECK-ARM6-NEXT: mov r0, r58750; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill8751; CHECK-ARM6-NEXT: eor r3, r0, r18752; CHECK-ARM6-NEXT: mov r1, r48753; CHECK-ARM6-NEXT: str r1, [sp, #4] @ 4-byte Spill8754; CHECK-ARM6-NEXT: eor r2, r1, r28755; CHECK-ARM6-NEXT: orr r2, r2, r38756; CHECK-ARM6-NEXT: cmp r2, #08757; CHECK-ARM6-NEXT: str r1, [sp, #8] @ 4-byte Spill8758; CHECK-ARM6-NEXT: str r0, [sp, #12] @ 4-byte Spill8759; CHECK-ARM6-NEXT: bne .LBB41_18760; CHECK-ARM6-NEXT: b .LBB41_58761; CHECK-ARM6-NEXT: .LBB41_5: @ %atomicrmw.end8762; CHECK-ARM6-NEXT: ldr r1, [sp] @ 4-byte Reload8763; CHECK-ARM6-NEXT: ldr r0, [sp, #4] @ 4-byte Reload8764; CHECK-ARM6-NEXT: add sp, sp, #168765; CHECK-ARM6-NEXT: pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}8766; CHECK-ARM6-NEXT: .p2align 28767; CHECK-ARM6-NEXT: @ %bb.6:8768; CHECK-ARM6-NEXT: .LCPI41_0:8769; CHECK-ARM6-NEXT: .long atomic_i648770;8771; CHECK-THUMB7-LABEL: test_min_i64:8772; CHECK-THUMB7: @ %bb.0: @ %entry8773; 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 #168776; CHECK-THUMB7-NEXT: sub sp, #168777; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i648778; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i648779; CHECK-THUMB7-NEXT: ldr r1, [r0]8780; CHECK-THUMB7-NEXT: ldr r0, [r0, #4]8781; CHECK-THUMB7-NEXT: str r1, [sp, #8] @ 4-byte Spill8782; CHECK-THUMB7-NEXT: str r0, [sp, #12] @ 4-byte Spill8783; CHECK-THUMB7-NEXT: b .LBB41_18784; CHECK-THUMB7-NEXT: .LBB41_1: @ %atomicrmw.start8785; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=18786; CHECK-THUMB7-NEXT: @ Child Loop BB41_2 Depth 28787; CHECK-THUMB7-NEXT: ldr r1, [sp, #12] @ 4-byte Reload8788; CHECK-THUMB7-NEXT: ldr r2, [sp, #8] @ 4-byte Reload8789; CHECK-THUMB7-NEXT: mov r8, r28790; CHECK-THUMB7-NEXT: mov r9, r18791; CHECK-THUMB7-NEXT: subs r0, r2, #28792; CHECK-THUMB7-NEXT: sbcs r0, r1, #08793; CHECK-THUMB7-NEXT: mov.w r0, #08794; CHECK-THUMB7-NEXT: it lt8795; CHECK-THUMB7-NEXT: movlt r0, #18796; CHECK-THUMB7-NEXT: mov.w r10, #18797; CHECK-THUMB7-NEXT: it lt8798; CHECK-THUMB7-NEXT: movlt r10, r28799; CHECK-THUMB7-NEXT: cmp r0, #08800; CHECK-THUMB7-NEXT: it ne8801; CHECK-THUMB7-NEXT: movne r0, r18802; CHECK-THUMB7-NEXT: @ kill: def $r10 killed $r10 def $r10_r118803; CHECK-THUMB7-NEXT: mov r11, r08804; CHECK-THUMB7-NEXT: movw r6, :lower16:atomic_i648805; CHECK-THUMB7-NEXT: movt r6, :upper16:atomic_i648806; CHECK-THUMB7-NEXT: @ implicit-def: $r08807; CHECK-THUMB7-NEXT: @ implicit-def: $r38808; CHECK-THUMB7-NEXT: @ kill: def $r6 killed $r6 def $r6_r78809; CHECK-THUMB7-NEXT: mov r7, r08810; CHECK-THUMB7-NEXT: .LBB41_2: @ %atomicrmw.start8811; CHECK-THUMB7-NEXT: @ Parent Loop BB41_1 Depth=18812; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=28813; CHECK-THUMB7-NEXT: ldrexd r4, r5, [r6]8814; CHECK-THUMB7-NEXT: cmp r4, r88815; CHECK-THUMB7-NEXT: it eq8816; CHECK-THUMB7-NEXT: cmpeq r5, r98817; CHECK-THUMB7-NEXT: bne .LBB41_48818; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start8819; CHECK-THUMB7-NEXT: @ in Loop: Header=BB41_2 Depth=28820; CHECK-THUMB7-NEXT: strexd r7, r10, r11, [r6]8821; CHECK-THUMB7-NEXT: cmp r7, #08822; CHECK-THUMB7-NEXT: bne .LBB41_28823; CHECK-THUMB7-NEXT: .LBB41_4: @ %atomicrmw.start8824; CHECK-THUMB7-NEXT: @ in Loop: Header=BB41_1 Depth=18825; CHECK-THUMB7-NEXT: mov r0, r58826; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill8827; CHECK-THUMB7-NEXT: eor.w r3, r0, r18828; CHECK-THUMB7-NEXT: mov r1, r48829; CHECK-THUMB7-NEXT: str r1, [sp, #4] @ 4-byte Spill8830; CHECK-THUMB7-NEXT: eors r2, r18831; CHECK-THUMB7-NEXT: orrs r2, r38832; CHECK-THUMB7-NEXT: cmp r2, #08833; CHECK-THUMB7-NEXT: str r1, [sp, #8] @ 4-byte Spill8834; CHECK-THUMB7-NEXT: str r0, [sp, #12] @ 4-byte Spill8835; CHECK-THUMB7-NEXT: bne .LBB41_18836; CHECK-THUMB7-NEXT: b .LBB41_58837; CHECK-THUMB7-NEXT: .LBB41_5: @ %atomicrmw.end8838; CHECK-THUMB7-NEXT: ldr r1, [sp] @ 4-byte Reload8839; CHECK-THUMB7-NEXT: ldr r0, [sp, #4] @ 4-byte Reload8840; CHECK-THUMB7-NEXT: add sp, #168841; 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: @ %entry8845; CHECK-THUMB6-NEXT: .save {r7, lr}8846; CHECK-THUMB6-NEXT: push {r7, lr}8847; CHECK-THUMB6-NEXT: ldr r0, .LCPI41_08848; CHECK-THUMB6-NEXT: movs r2, #18849; CHECK-THUMB6-NEXT: movs r3, #08850; CHECK-THUMB6-NEXT: bl __sync_fetch_and_min_88851; CHECK-THUMB6-NEXT: pop {r7, pc}8852; CHECK-THUMB6-NEXT: .p2align 28853; CHECK-THUMB6-NEXT: @ %bb.1:8854; CHECK-THUMB6-NEXT: .LCPI41_0:8855; CHECK-THUMB6-NEXT: .long atomic_i648856;8857; CHECK-THUMB8BASE-LABEL: test_min_i64:8858; CHECK-THUMB8BASE: @ %bb.0: @ %entry8859; CHECK-THUMB8BASE-NEXT: .save {r4, lr}8860; CHECK-THUMB8BASE-NEXT: push {r4, lr}8861; CHECK-THUMB8BASE-NEXT: .pad #728862; CHECK-THUMB8BASE-NEXT: sub sp, #728863; CHECK-THUMB8BASE-NEXT: movw r1, :lower16:atomic_i648864; CHECK-THUMB8BASE-NEXT: movt r1, :upper16:atomic_i648865; CHECK-THUMB8BASE-NEXT: ldr r0, [r1, #4]8866; CHECK-THUMB8BASE-NEXT: ldr r1, [r1]8867; CHECK-THUMB8BASE-NEXT: str r1, [sp, #56] @ 4-byte Spill8868; CHECK-THUMB8BASE-NEXT: str r0, [sp, #60] @ 4-byte Spill8869; CHECK-THUMB8BASE-NEXT: b .LBB41_18870; CHECK-THUMB8BASE-NEXT: .LBB41_1: @ %atomicrmw.start8871; CHECK-THUMB8BASE-NEXT: @ =>This Inner Loop Header: Depth=18872; CHECK-THUMB8BASE-NEXT: ldr r3, [sp, #56] @ 4-byte Reload8873; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #60] @ 4-byte Reload8874; CHECK-THUMB8BASE-NEXT: str r1, [sp, #36] @ 4-byte Spill8875; CHECK-THUMB8BASE-NEXT: str r3, [sp, #40] @ 4-byte Spill8876; CHECK-THUMB8BASE-NEXT: movs r0, #18877; CHECK-THUMB8BASE-NEXT: str r0, [sp, #44] @ 4-byte Spill8878; CHECK-THUMB8BASE-NEXT: movs r2, #08879; CHECK-THUMB8BASE-NEXT: str r2, [sp, #48] @ 4-byte Spill8880; CHECK-THUMB8BASE-NEXT: subs r3, r3, #28881; CHECK-THUMB8BASE-NEXT: sbcs r1, r28882; CHECK-THUMB8BASE-NEXT: str r0, [sp, #52] @ 4-byte Spill8883; CHECK-THUMB8BASE-NEXT: blt .LBB41_38884; CHECK-THUMB8BASE-NEXT: @ %bb.2: @ %atomicrmw.start8885; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB41_1 Depth=18886; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #48] @ 4-byte Reload8887; CHECK-THUMB8BASE-NEXT: str r0, [sp, #52] @ 4-byte Spill8888; CHECK-THUMB8BASE-NEXT: .LBB41_3: @ %atomicrmw.start8889; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB41_1 Depth=18890; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #40] @ 4-byte Reload8891; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #52] @ 4-byte Reload8892; CHECK-THUMB8BASE-NEXT: str r1, [sp, #28] @ 4-byte Spill8893; CHECK-THUMB8BASE-NEXT: str r0, [sp, #32] @ 4-byte Spill8894; CHECK-THUMB8BASE-NEXT: blt .LBB41_58895; CHECK-THUMB8BASE-NEXT: @ %bb.4: @ %atomicrmw.start8896; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB41_1 Depth=18897; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #44] @ 4-byte Reload8898; CHECK-THUMB8BASE-NEXT: str r0, [sp, #32] @ 4-byte Spill8899; CHECK-THUMB8BASE-NEXT: .LBB41_5: @ %atomicrmw.start8900; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB41_1 Depth=18901; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #36] @ 4-byte Reload8902; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #28] @ 4-byte Reload8903; CHECK-THUMB8BASE-NEXT: ldr r2, [sp, #32] @ 4-byte Reload8904; CHECK-THUMB8BASE-NEXT: str r2, [sp, #20] @ 4-byte Spill8905; CHECK-THUMB8BASE-NEXT: str r0, [sp, #24] @ 4-byte Spill8906; CHECK-THUMB8BASE-NEXT: cbnz r1, .LBB41_78907; CHECK-THUMB8BASE-NEXT: @ %bb.6: @ %atomicrmw.start8908; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB41_1 Depth=18909; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #28] @ 4-byte Reload8910; CHECK-THUMB8BASE-NEXT: str r0, [sp, #24] @ 4-byte Spill8911; CHECK-THUMB8BASE-NEXT: .LBB41_7: @ %atomicrmw.start8912; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB41_1 Depth=18913; CHECK-THUMB8BASE-NEXT: ldr r2, [sp, #20] @ 4-byte Reload8914; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #48] @ 4-byte Reload8915; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #36] @ 4-byte Reload8916; CHECK-THUMB8BASE-NEXT: ldr r4, [sp, #40] @ 4-byte Reload8917; CHECK-THUMB8BASE-NEXT: ldr r3, [sp, #24] @ 4-byte Reload8918; 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_i648923; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i648924; CHECK-THUMB8BASE-NEXT: add r1, sp, #648925; CHECK-THUMB8BASE-NEXT: bl __atomic_compare_exchange_88926; CHECK-THUMB8BASE-NEXT: mov r2, r08927; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #68]8928; CHECK-THUMB8BASE-NEXT: str r0, [sp, #12] @ 4-byte Spill8929; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #64]8930; CHECK-THUMB8BASE-NEXT: str r1, [sp, #16] @ 4-byte Spill8931; CHECK-THUMB8BASE-NEXT: cmp r2, #08932; CHECK-THUMB8BASE-NEXT: str r1, [sp, #56] @ 4-byte Spill8933; CHECK-THUMB8BASE-NEXT: str r0, [sp, #60] @ 4-byte Spill8934; CHECK-THUMB8BASE-NEXT: beq .LBB41_18935; CHECK-THUMB8BASE-NEXT: b .LBB41_88936; CHECK-THUMB8BASE-NEXT: .LBB41_8: @ %atomicrmw.end8937; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #12] @ 4-byte Reload8938; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #16] @ 4-byte Reload8939; CHECK-THUMB8BASE-NEXT: add sp, #728940; CHECK-THUMB8BASE-NEXT: pop {r4, pc}8941entry:8942 %0 = atomicrmw min ptr @atomic_i64, i64 1 monotonic8943 ret i64 %08944}8945define i64 @test_umax_i64() {8946; CHECK-ARM8-LABEL: test_umax_i64:8947; CHECK-ARM8: @ %bb.0: @ %entry8948; 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 #168951; CHECK-ARM8-NEXT: sub sp, sp, #168952; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i648953; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i648954; CHECK-ARM8-NEXT: ldr r1, [r0]8955; CHECK-ARM8-NEXT: ldr r0, [r0, #4]8956; CHECK-ARM8-NEXT: str r1, [sp, #8] @ 4-byte Spill8957; CHECK-ARM8-NEXT: str r0, [sp, #12] @ 4-byte Spill8958; CHECK-ARM8-NEXT: b .LBB42_18959; CHECK-ARM8-NEXT: .LBB42_1: @ %atomicrmw.start8960; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=18961; CHECK-ARM8-NEXT: @ Child Loop BB42_2 Depth 28962; CHECK-ARM8-NEXT: ldr r1, [sp, #12] @ 4-byte Reload8963; CHECK-ARM8-NEXT: ldr r2, [sp, #8] @ 4-byte Reload8964; CHECK-ARM8-NEXT: mov r8, r28965; CHECK-ARM8-NEXT: mov r9, r18966; CHECK-ARM8-NEXT: rsbs r0, r2, #18967; CHECK-ARM8-NEXT: rscs r0, r1, #08968; CHECK-ARM8-NEXT: mov r0, #08969; CHECK-ARM8-NEXT: movwlo r0, #18970; CHECK-ARM8-NEXT: mov r10, #18971; CHECK-ARM8-NEXT: movlo r10, r28972; CHECK-ARM8-NEXT: cmp r0, #08973; CHECK-ARM8-NEXT: movne r0, r18974; CHECK-ARM8-NEXT: @ kill: def $r10 killed $r10 def $r10_r118975; CHECK-ARM8-NEXT: mov r11, r08976; CHECK-ARM8-NEXT: movw r6, :lower16:atomic_i648977; CHECK-ARM8-NEXT: movt r6, :upper16:atomic_i648978; CHECK-ARM8-NEXT: @ implicit-def: $r08979; CHECK-ARM8-NEXT: @ implicit-def: $r38980; CHECK-ARM8-NEXT: @ kill: def $r6 killed $r6 def $r6_r78981; CHECK-ARM8-NEXT: mov r7, r08982; CHECK-ARM8-NEXT: .LBB42_2: @ %atomicrmw.start8983; CHECK-ARM8-NEXT: @ Parent Loop BB42_1 Depth=18984; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=28985; CHECK-ARM8-NEXT: ldrexd r4, r5, [r6]8986; CHECK-ARM8-NEXT: cmp r4, r88987; CHECK-ARM8-NEXT: cmpeq r5, r98988; CHECK-ARM8-NEXT: bne .LBB42_48989; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start8990; CHECK-ARM8-NEXT: @ in Loop: Header=BB42_2 Depth=28991; CHECK-ARM8-NEXT: strexd r7, r10, r11, [r6]8992; CHECK-ARM8-NEXT: cmp r7, #08993; CHECK-ARM8-NEXT: bne .LBB42_28994; CHECK-ARM8-NEXT: .LBB42_4: @ %atomicrmw.start8995; CHECK-ARM8-NEXT: @ in Loop: Header=BB42_1 Depth=18996; CHECK-ARM8-NEXT: mov r0, r58997; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill8998; CHECK-ARM8-NEXT: eor r3, r0, r18999; CHECK-ARM8-NEXT: mov r1, r49000; CHECK-ARM8-NEXT: str r1, [sp, #4] @ 4-byte Spill9001; CHECK-ARM8-NEXT: eor r2, r1, r29002; CHECK-ARM8-NEXT: orr r2, r2, r39003; CHECK-ARM8-NEXT: cmp r2, #09004; CHECK-ARM8-NEXT: str r1, [sp, #8] @ 4-byte Spill9005; CHECK-ARM8-NEXT: str r0, [sp, #12] @ 4-byte Spill9006; CHECK-ARM8-NEXT: bne .LBB42_19007; CHECK-ARM8-NEXT: b .LBB42_59008; CHECK-ARM8-NEXT: .LBB42_5: @ %atomicrmw.end9009; CHECK-ARM8-NEXT: ldr r1, [sp] @ 4-byte Reload9010; CHECK-ARM8-NEXT: ldr r0, [sp, #4] @ 4-byte Reload9011; CHECK-ARM8-NEXT: add sp, sp, #169012; 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: @ %entry9016; 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 #169019; CHECK-ARM6-NEXT: sub sp, sp, #169020; CHECK-ARM6-NEXT: ldr r0, .LCPI42_09021; CHECK-ARM6-NEXT: ldr r1, [r0]9022; CHECK-ARM6-NEXT: ldr r0, [r0, #4]9023; CHECK-ARM6-NEXT: str r1, [sp, #8] @ 4-byte Spill9024; CHECK-ARM6-NEXT: str r0, [sp, #12] @ 4-byte Spill9025; CHECK-ARM6-NEXT: b .LBB42_19026; CHECK-ARM6-NEXT: .LBB42_1: @ %atomicrmw.start9027; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=19028; CHECK-ARM6-NEXT: @ Child Loop BB42_2 Depth 29029; CHECK-ARM6-NEXT: ldr r1, [sp, #12] @ 4-byte Reload9030; CHECK-ARM6-NEXT: ldr r2, [sp, #8] @ 4-byte Reload9031; CHECK-ARM6-NEXT: mov r8, r29032; CHECK-ARM6-NEXT: mov r9, r19033; CHECK-ARM6-NEXT: rsbs r0, r2, #19034; CHECK-ARM6-NEXT: rscs r0, r1, #09035; CHECK-ARM6-NEXT: mov r0, #09036; CHECK-ARM6-NEXT: movlo r0, #19037; CHECK-ARM6-NEXT: mov r10, #19038; CHECK-ARM6-NEXT: movlo r10, r29039; CHECK-ARM6-NEXT: cmp r0, #09040; CHECK-ARM6-NEXT: movne r0, r19041; CHECK-ARM6-NEXT: @ kill: def $r10 killed $r10 def $r10_r119042; CHECK-ARM6-NEXT: mov r11, r09043; CHECK-ARM6-NEXT: ldr r6, .LCPI42_09044; CHECK-ARM6-NEXT: @ implicit-def: $r09045; CHECK-ARM6-NEXT: @ implicit-def: $r39046; CHECK-ARM6-NEXT: @ kill: def $r6 killed $r6 def $r6_r79047; CHECK-ARM6-NEXT: mov r7, r09048; CHECK-ARM6-NEXT: .LBB42_2: @ %atomicrmw.start9049; CHECK-ARM6-NEXT: @ Parent Loop BB42_1 Depth=19050; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=29051; CHECK-ARM6-NEXT: ldrexd r4, r5, [r6]9052; CHECK-ARM6-NEXT: cmp r4, r89053; CHECK-ARM6-NEXT: cmpeq r5, r99054; CHECK-ARM6-NEXT: bne .LBB42_49055; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start9056; CHECK-ARM6-NEXT: @ in Loop: Header=BB42_2 Depth=29057; CHECK-ARM6-NEXT: strexd r7, r10, r11, [r6]9058; CHECK-ARM6-NEXT: cmp r7, #09059; CHECK-ARM6-NEXT: bne .LBB42_29060; CHECK-ARM6-NEXT: .LBB42_4: @ %atomicrmw.start9061; CHECK-ARM6-NEXT: @ in Loop: Header=BB42_1 Depth=19062; CHECK-ARM6-NEXT: mov r0, r59063; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill9064; CHECK-ARM6-NEXT: eor r3, r0, r19065; CHECK-ARM6-NEXT: mov r1, r49066; CHECK-ARM6-NEXT: str r1, [sp, #4] @ 4-byte Spill9067; CHECK-ARM6-NEXT: eor r2, r1, r29068; CHECK-ARM6-NEXT: orr r2, r2, r39069; CHECK-ARM6-NEXT: cmp r2, #09070; CHECK-ARM6-NEXT: str r1, [sp, #8] @ 4-byte Spill9071; CHECK-ARM6-NEXT: str r0, [sp, #12] @ 4-byte Spill9072; CHECK-ARM6-NEXT: bne .LBB42_19073; CHECK-ARM6-NEXT: b .LBB42_59074; CHECK-ARM6-NEXT: .LBB42_5: @ %atomicrmw.end9075; CHECK-ARM6-NEXT: ldr r1, [sp] @ 4-byte Reload9076; CHECK-ARM6-NEXT: ldr r0, [sp, #4] @ 4-byte Reload9077; CHECK-ARM6-NEXT: add sp, sp, #169078; CHECK-ARM6-NEXT: pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}9079; CHECK-ARM6-NEXT: .p2align 29080; CHECK-ARM6-NEXT: @ %bb.6:9081; CHECK-ARM6-NEXT: .LCPI42_0:9082; CHECK-ARM6-NEXT: .long atomic_i649083;9084; CHECK-THUMB7-LABEL: test_umax_i64:9085; CHECK-THUMB7: @ %bb.0: @ %entry9086; 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 #169089; CHECK-THUMB7-NEXT: sub sp, #169090; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i649091; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i649092; CHECK-THUMB7-NEXT: ldr r1, [r0]9093; CHECK-THUMB7-NEXT: ldr r0, [r0, #4]9094; CHECK-THUMB7-NEXT: str r1, [sp, #8] @ 4-byte Spill9095; CHECK-THUMB7-NEXT: str r0, [sp, #12] @ 4-byte Spill9096; CHECK-THUMB7-NEXT: b .LBB42_19097; CHECK-THUMB7-NEXT: .LBB42_1: @ %atomicrmw.start9098; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=19099; CHECK-THUMB7-NEXT: @ Child Loop BB42_2 Depth 29100; CHECK-THUMB7-NEXT: ldr r1, [sp, #12] @ 4-byte Reload9101; CHECK-THUMB7-NEXT: ldr r2, [sp, #8] @ 4-byte Reload9102; CHECK-THUMB7-NEXT: rsbs.w r0, r2, #19103; CHECK-THUMB7-NEXT: mov.w r0, #09104; CHECK-THUMB7-NEXT: sbcs.w r3, r0, r19105; CHECK-THUMB7-NEXT: it lo9106; CHECK-THUMB7-NEXT: movlo r0, #19107; CHECK-THUMB7-NEXT: mov r8, r29108; CHECK-THUMB7-NEXT: mov r9, r19109; CHECK-THUMB7-NEXT: mov.w r10, #19110; CHECK-THUMB7-NEXT: it lo9111; CHECK-THUMB7-NEXT: movlo r10, r29112; CHECK-THUMB7-NEXT: cmp r0, #09113; CHECK-THUMB7-NEXT: it ne9114; CHECK-THUMB7-NEXT: movne r0, r19115; CHECK-THUMB7-NEXT: @ kill: def $r10 killed $r10 def $r10_r119116; CHECK-THUMB7-NEXT: mov r11, r09117; CHECK-THUMB7-NEXT: movw r6, :lower16:atomic_i649118; CHECK-THUMB7-NEXT: movt r6, :upper16:atomic_i649119; CHECK-THUMB7-NEXT: @ implicit-def: $r09120; CHECK-THUMB7-NEXT: @ implicit-def: $r39121; CHECK-THUMB7-NEXT: @ kill: def $r6 killed $r6 def $r6_r79122; CHECK-THUMB7-NEXT: mov r7, r09123; CHECK-THUMB7-NEXT: .LBB42_2: @ %atomicrmw.start9124; CHECK-THUMB7-NEXT: @ Parent Loop BB42_1 Depth=19125; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=29126; CHECK-THUMB7-NEXT: ldrexd r4, r5, [r6]9127; CHECK-THUMB7-NEXT: cmp r4, r89128; CHECK-THUMB7-NEXT: it eq9129; CHECK-THUMB7-NEXT: cmpeq r5, r99130; CHECK-THUMB7-NEXT: bne .LBB42_49131; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start9132; CHECK-THUMB7-NEXT: @ in Loop: Header=BB42_2 Depth=29133; CHECK-THUMB7-NEXT: strexd r7, r10, r11, [r6]9134; CHECK-THUMB7-NEXT: cmp r7, #09135; CHECK-THUMB7-NEXT: bne .LBB42_29136; CHECK-THUMB7-NEXT: .LBB42_4: @ %atomicrmw.start9137; CHECK-THUMB7-NEXT: @ in Loop: Header=BB42_1 Depth=19138; CHECK-THUMB7-NEXT: mov r0, r59139; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill9140; CHECK-THUMB7-NEXT: eor.w r3, r0, r19141; CHECK-THUMB7-NEXT: mov r1, r49142; CHECK-THUMB7-NEXT: str r1, [sp, #4] @ 4-byte Spill9143; CHECK-THUMB7-NEXT: eors r2, r19144; CHECK-THUMB7-NEXT: orrs r2, r39145; CHECK-THUMB7-NEXT: cmp r2, #09146; CHECK-THUMB7-NEXT: str r1, [sp, #8] @ 4-byte Spill9147; CHECK-THUMB7-NEXT: str r0, [sp, #12] @ 4-byte Spill9148; CHECK-THUMB7-NEXT: bne .LBB42_19149; CHECK-THUMB7-NEXT: b .LBB42_59150; CHECK-THUMB7-NEXT: .LBB42_5: @ %atomicrmw.end9151; CHECK-THUMB7-NEXT: ldr r1, [sp] @ 4-byte Reload9152; CHECK-THUMB7-NEXT: ldr r0, [sp, #4] @ 4-byte Reload9153; CHECK-THUMB7-NEXT: add sp, #169154; 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: @ %entry9158; CHECK-THUMB6-NEXT: .save {r7, lr}9159; CHECK-THUMB6-NEXT: push {r7, lr}9160; CHECK-THUMB6-NEXT: ldr r0, .LCPI42_09161; CHECK-THUMB6-NEXT: movs r2, #19162; CHECK-THUMB6-NEXT: movs r3, #09163; CHECK-THUMB6-NEXT: bl __sync_fetch_and_umax_89164; CHECK-THUMB6-NEXT: pop {r7, pc}9165; CHECK-THUMB6-NEXT: .p2align 29166; CHECK-THUMB6-NEXT: @ %bb.1:9167; CHECK-THUMB6-NEXT: .LCPI42_0:9168; CHECK-THUMB6-NEXT: .long atomic_i649169;9170; CHECK-THUMB8BASE-LABEL: test_umax_i64:9171; CHECK-THUMB8BASE: @ %bb.0: @ %entry9172; CHECK-THUMB8BASE-NEXT: .save {r4, lr}9173; CHECK-THUMB8BASE-NEXT: push {r4, lr}9174; CHECK-THUMB8BASE-NEXT: .pad #729175; CHECK-THUMB8BASE-NEXT: sub sp, #729176; CHECK-THUMB8BASE-NEXT: movw r1, :lower16:atomic_i649177; CHECK-THUMB8BASE-NEXT: movt r1, :upper16:atomic_i649178; CHECK-THUMB8BASE-NEXT: ldr r0, [r1, #4]9179; CHECK-THUMB8BASE-NEXT: ldr r1, [r1]9180; CHECK-THUMB8BASE-NEXT: str r1, [sp, #56] @ 4-byte Spill9181; CHECK-THUMB8BASE-NEXT: str r0, [sp, #60] @ 4-byte Spill9182; CHECK-THUMB8BASE-NEXT: b .LBB42_19183; CHECK-THUMB8BASE-NEXT: .LBB42_1: @ %atomicrmw.start9184; CHECK-THUMB8BASE-NEXT: @ =>This Inner Loop Header: Depth=19185; CHECK-THUMB8BASE-NEXT: ldr r3, [sp, #56] @ 4-byte Reload9186; CHECK-THUMB8BASE-NEXT: ldr r2, [sp, #60] @ 4-byte Reload9187; CHECK-THUMB8BASE-NEXT: str r2, [sp, #36] @ 4-byte Spill9188; CHECK-THUMB8BASE-NEXT: str r3, [sp, #40] @ 4-byte Spill9189; CHECK-THUMB8BASE-NEXT: movs r1, #09190; CHECK-THUMB8BASE-NEXT: str r1, [sp, #44] @ 4-byte Spill9191; CHECK-THUMB8BASE-NEXT: movs r0, #19192; CHECK-THUMB8BASE-NEXT: str r0, [sp, #48] @ 4-byte Spill9193; CHECK-THUMB8BASE-NEXT: subs r3, r0, r39194; CHECK-THUMB8BASE-NEXT: sbcs r1, r29195; CHECK-THUMB8BASE-NEXT: str r0, [sp, #52] @ 4-byte Spill9196; CHECK-THUMB8BASE-NEXT: blo .LBB42_39197; CHECK-THUMB8BASE-NEXT: @ %bb.2: @ %atomicrmw.start9198; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB42_1 Depth=19199; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #44] @ 4-byte Reload9200; CHECK-THUMB8BASE-NEXT: str r0, [sp, #52] @ 4-byte Spill9201; CHECK-THUMB8BASE-NEXT: .LBB42_3: @ %atomicrmw.start9202; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB42_1 Depth=19203; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #40] @ 4-byte Reload9204; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #52] @ 4-byte Reload9205; CHECK-THUMB8BASE-NEXT: str r1, [sp, #28] @ 4-byte Spill9206; CHECK-THUMB8BASE-NEXT: str r0, [sp, #32] @ 4-byte Spill9207; CHECK-THUMB8BASE-NEXT: blo .LBB42_59208; CHECK-THUMB8BASE-NEXT: @ %bb.4: @ %atomicrmw.start9209; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB42_1 Depth=19210; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #48] @ 4-byte Reload9211; CHECK-THUMB8BASE-NEXT: str r0, [sp, #32] @ 4-byte Spill9212; CHECK-THUMB8BASE-NEXT: .LBB42_5: @ %atomicrmw.start9213; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB42_1 Depth=19214; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #36] @ 4-byte Reload9215; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #28] @ 4-byte Reload9216; CHECK-THUMB8BASE-NEXT: ldr r2, [sp, #32] @ 4-byte Reload9217; CHECK-THUMB8BASE-NEXT: str r2, [sp, #20] @ 4-byte Spill9218; CHECK-THUMB8BASE-NEXT: str r0, [sp, #24] @ 4-byte Spill9219; CHECK-THUMB8BASE-NEXT: cbnz r1, .LBB42_79220; CHECK-THUMB8BASE-NEXT: @ %bb.6: @ %atomicrmw.start9221; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB42_1 Depth=19222; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #28] @ 4-byte Reload9223; CHECK-THUMB8BASE-NEXT: str r0, [sp, #24] @ 4-byte Spill9224; CHECK-THUMB8BASE-NEXT: .LBB42_7: @ %atomicrmw.start9225; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB42_1 Depth=19226; CHECK-THUMB8BASE-NEXT: ldr r2, [sp, #20] @ 4-byte Reload9227; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #44] @ 4-byte Reload9228; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #36] @ 4-byte Reload9229; CHECK-THUMB8BASE-NEXT: ldr r4, [sp, #40] @ 4-byte Reload9230; CHECK-THUMB8BASE-NEXT: ldr r3, [sp, #24] @ 4-byte Reload9231; 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_i649236; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i649237; CHECK-THUMB8BASE-NEXT: add r1, sp, #649238; CHECK-THUMB8BASE-NEXT: bl __atomic_compare_exchange_89239; CHECK-THUMB8BASE-NEXT: mov r2, r09240; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #68]9241; CHECK-THUMB8BASE-NEXT: str r0, [sp, #12] @ 4-byte Spill9242; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #64]9243; CHECK-THUMB8BASE-NEXT: str r1, [sp, #16] @ 4-byte Spill9244; CHECK-THUMB8BASE-NEXT: cmp r2, #09245; CHECK-THUMB8BASE-NEXT: str r1, [sp, #56] @ 4-byte Spill9246; CHECK-THUMB8BASE-NEXT: str r0, [sp, #60] @ 4-byte Spill9247; CHECK-THUMB8BASE-NEXT: beq .LBB42_19248; CHECK-THUMB8BASE-NEXT: b .LBB42_89249; CHECK-THUMB8BASE-NEXT: .LBB42_8: @ %atomicrmw.end9250; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #12] @ 4-byte Reload9251; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #16] @ 4-byte Reload9252; CHECK-THUMB8BASE-NEXT: add sp, #729253; CHECK-THUMB8BASE-NEXT: pop {r4, pc}9254entry:9255 %0 = atomicrmw umax ptr @atomic_i64, i64 1 monotonic9256 ret i64 %09257}9258define i64 @test_umin_i64() {9259; CHECK-ARM8-LABEL: test_umin_i64:9260; CHECK-ARM8: @ %bb.0: @ %entry9261; 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 #169264; CHECK-ARM8-NEXT: sub sp, sp, #169265; CHECK-ARM8-NEXT: movw r0, :lower16:atomic_i649266; CHECK-ARM8-NEXT: movt r0, :upper16:atomic_i649267; CHECK-ARM8-NEXT: ldr r1, [r0]9268; CHECK-ARM8-NEXT: ldr r0, [r0, #4]9269; CHECK-ARM8-NEXT: str r1, [sp, #8] @ 4-byte Spill9270; CHECK-ARM8-NEXT: str r0, [sp, #12] @ 4-byte Spill9271; CHECK-ARM8-NEXT: b .LBB43_19272; CHECK-ARM8-NEXT: .LBB43_1: @ %atomicrmw.start9273; CHECK-ARM8-NEXT: @ =>This Loop Header: Depth=19274; CHECK-ARM8-NEXT: @ Child Loop BB43_2 Depth 29275; CHECK-ARM8-NEXT: ldr r1, [sp, #12] @ 4-byte Reload9276; CHECK-ARM8-NEXT: ldr r2, [sp, #8] @ 4-byte Reload9277; CHECK-ARM8-NEXT: mov r8, r29278; CHECK-ARM8-NEXT: mov r9, r19279; CHECK-ARM8-NEXT: subs r0, r2, #29280; CHECK-ARM8-NEXT: sbcs r0, r1, #09281; CHECK-ARM8-NEXT: mov r0, #09282; CHECK-ARM8-NEXT: movwlo r0, #19283; CHECK-ARM8-NEXT: mov r10, #19284; CHECK-ARM8-NEXT: movlo r10, r29285; CHECK-ARM8-NEXT: cmp r0, #09286; CHECK-ARM8-NEXT: movne r0, r19287; CHECK-ARM8-NEXT: @ kill: def $r10 killed $r10 def $r10_r119288; CHECK-ARM8-NEXT: mov r11, r09289; CHECK-ARM8-NEXT: movw r6, :lower16:atomic_i649290; CHECK-ARM8-NEXT: movt r6, :upper16:atomic_i649291; CHECK-ARM8-NEXT: @ implicit-def: $r09292; CHECK-ARM8-NEXT: @ implicit-def: $r39293; CHECK-ARM8-NEXT: @ kill: def $r6 killed $r6 def $r6_r79294; CHECK-ARM8-NEXT: mov r7, r09295; CHECK-ARM8-NEXT: .LBB43_2: @ %atomicrmw.start9296; CHECK-ARM8-NEXT: @ Parent Loop BB43_1 Depth=19297; CHECK-ARM8-NEXT: @ => This Inner Loop Header: Depth=29298; CHECK-ARM8-NEXT: ldrexd r4, r5, [r6]9299; CHECK-ARM8-NEXT: cmp r4, r89300; CHECK-ARM8-NEXT: cmpeq r5, r99301; CHECK-ARM8-NEXT: bne .LBB43_49302; CHECK-ARM8-NEXT: @ %bb.3: @ %atomicrmw.start9303; CHECK-ARM8-NEXT: @ in Loop: Header=BB43_2 Depth=29304; CHECK-ARM8-NEXT: strexd r7, r10, r11, [r6]9305; CHECK-ARM8-NEXT: cmp r7, #09306; CHECK-ARM8-NEXT: bne .LBB43_29307; CHECK-ARM8-NEXT: .LBB43_4: @ %atomicrmw.start9308; CHECK-ARM8-NEXT: @ in Loop: Header=BB43_1 Depth=19309; CHECK-ARM8-NEXT: mov r0, r59310; CHECK-ARM8-NEXT: str r0, [sp] @ 4-byte Spill9311; CHECK-ARM8-NEXT: eor r3, r0, r19312; CHECK-ARM8-NEXT: mov r1, r49313; CHECK-ARM8-NEXT: str r1, [sp, #4] @ 4-byte Spill9314; CHECK-ARM8-NEXT: eor r2, r1, r29315; CHECK-ARM8-NEXT: orr r2, r2, r39316; CHECK-ARM8-NEXT: cmp r2, #09317; CHECK-ARM8-NEXT: str r1, [sp, #8] @ 4-byte Spill9318; CHECK-ARM8-NEXT: str r0, [sp, #12] @ 4-byte Spill9319; CHECK-ARM8-NEXT: bne .LBB43_19320; CHECK-ARM8-NEXT: b .LBB43_59321; CHECK-ARM8-NEXT: .LBB43_5: @ %atomicrmw.end9322; CHECK-ARM8-NEXT: ldr r1, [sp] @ 4-byte Reload9323; CHECK-ARM8-NEXT: ldr r0, [sp, #4] @ 4-byte Reload9324; CHECK-ARM8-NEXT: add sp, sp, #169325; 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: @ %entry9329; 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 #169332; CHECK-ARM6-NEXT: sub sp, sp, #169333; CHECK-ARM6-NEXT: ldr r0, .LCPI43_09334; CHECK-ARM6-NEXT: ldr r1, [r0]9335; CHECK-ARM6-NEXT: ldr r0, [r0, #4]9336; CHECK-ARM6-NEXT: str r1, [sp, #8] @ 4-byte Spill9337; CHECK-ARM6-NEXT: str r0, [sp, #12] @ 4-byte Spill9338; CHECK-ARM6-NEXT: b .LBB43_19339; CHECK-ARM6-NEXT: .LBB43_1: @ %atomicrmw.start9340; CHECK-ARM6-NEXT: @ =>This Loop Header: Depth=19341; CHECK-ARM6-NEXT: @ Child Loop BB43_2 Depth 29342; CHECK-ARM6-NEXT: ldr r1, [sp, #12] @ 4-byte Reload9343; CHECK-ARM6-NEXT: ldr r2, [sp, #8] @ 4-byte Reload9344; CHECK-ARM6-NEXT: mov r8, r29345; CHECK-ARM6-NEXT: mov r9, r19346; CHECK-ARM6-NEXT: subs r0, r2, #29347; CHECK-ARM6-NEXT: sbcs r0, r1, #09348; CHECK-ARM6-NEXT: mov r0, #09349; CHECK-ARM6-NEXT: movlo r0, #19350; CHECK-ARM6-NEXT: mov r10, #19351; CHECK-ARM6-NEXT: movlo r10, r29352; CHECK-ARM6-NEXT: cmp r0, #09353; CHECK-ARM6-NEXT: movne r0, r19354; CHECK-ARM6-NEXT: @ kill: def $r10 killed $r10 def $r10_r119355; CHECK-ARM6-NEXT: mov r11, r09356; CHECK-ARM6-NEXT: ldr r6, .LCPI43_09357; CHECK-ARM6-NEXT: @ implicit-def: $r09358; CHECK-ARM6-NEXT: @ implicit-def: $r39359; CHECK-ARM6-NEXT: @ kill: def $r6 killed $r6 def $r6_r79360; CHECK-ARM6-NEXT: mov r7, r09361; CHECK-ARM6-NEXT: .LBB43_2: @ %atomicrmw.start9362; CHECK-ARM6-NEXT: @ Parent Loop BB43_1 Depth=19363; CHECK-ARM6-NEXT: @ => This Inner Loop Header: Depth=29364; CHECK-ARM6-NEXT: ldrexd r4, r5, [r6]9365; CHECK-ARM6-NEXT: cmp r4, r89366; CHECK-ARM6-NEXT: cmpeq r5, r99367; CHECK-ARM6-NEXT: bne .LBB43_49368; CHECK-ARM6-NEXT: @ %bb.3: @ %atomicrmw.start9369; CHECK-ARM6-NEXT: @ in Loop: Header=BB43_2 Depth=29370; CHECK-ARM6-NEXT: strexd r7, r10, r11, [r6]9371; CHECK-ARM6-NEXT: cmp r7, #09372; CHECK-ARM6-NEXT: bne .LBB43_29373; CHECK-ARM6-NEXT: .LBB43_4: @ %atomicrmw.start9374; CHECK-ARM6-NEXT: @ in Loop: Header=BB43_1 Depth=19375; CHECK-ARM6-NEXT: mov r0, r59376; CHECK-ARM6-NEXT: str r0, [sp] @ 4-byte Spill9377; CHECK-ARM6-NEXT: eor r3, r0, r19378; CHECK-ARM6-NEXT: mov r1, r49379; CHECK-ARM6-NEXT: str r1, [sp, #4] @ 4-byte Spill9380; CHECK-ARM6-NEXT: eor r2, r1, r29381; CHECK-ARM6-NEXT: orr r2, r2, r39382; CHECK-ARM6-NEXT: cmp r2, #09383; CHECK-ARM6-NEXT: str r1, [sp, #8] @ 4-byte Spill9384; CHECK-ARM6-NEXT: str r0, [sp, #12] @ 4-byte Spill9385; CHECK-ARM6-NEXT: bne .LBB43_19386; CHECK-ARM6-NEXT: b .LBB43_59387; CHECK-ARM6-NEXT: .LBB43_5: @ %atomicrmw.end9388; CHECK-ARM6-NEXT: ldr r1, [sp] @ 4-byte Reload9389; CHECK-ARM6-NEXT: ldr r0, [sp, #4] @ 4-byte Reload9390; CHECK-ARM6-NEXT: add sp, sp, #169391; CHECK-ARM6-NEXT: pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}9392; CHECK-ARM6-NEXT: .p2align 29393; CHECK-ARM6-NEXT: @ %bb.6:9394; CHECK-ARM6-NEXT: .LCPI43_0:9395; CHECK-ARM6-NEXT: .long atomic_i649396;9397; CHECK-THUMB7-LABEL: test_umin_i64:9398; CHECK-THUMB7: @ %bb.0: @ %entry9399; 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 #169402; CHECK-THUMB7-NEXT: sub sp, #169403; CHECK-THUMB7-NEXT: movw r0, :lower16:atomic_i649404; CHECK-THUMB7-NEXT: movt r0, :upper16:atomic_i649405; CHECK-THUMB7-NEXT: ldr r1, [r0]9406; CHECK-THUMB7-NEXT: ldr r0, [r0, #4]9407; CHECK-THUMB7-NEXT: str r1, [sp, #8] @ 4-byte Spill9408; CHECK-THUMB7-NEXT: str r0, [sp, #12] @ 4-byte Spill9409; CHECK-THUMB7-NEXT: b .LBB43_19410; CHECK-THUMB7-NEXT: .LBB43_1: @ %atomicrmw.start9411; CHECK-THUMB7-NEXT: @ =>This Loop Header: Depth=19412; CHECK-THUMB7-NEXT: @ Child Loop BB43_2 Depth 29413; CHECK-THUMB7-NEXT: ldr r1, [sp, #12] @ 4-byte Reload9414; CHECK-THUMB7-NEXT: ldr r2, [sp, #8] @ 4-byte Reload9415; CHECK-THUMB7-NEXT: mov r8, r29416; CHECK-THUMB7-NEXT: mov r9, r19417; CHECK-THUMB7-NEXT: subs r0, r2, #29418; CHECK-THUMB7-NEXT: sbcs r0, r1, #09419; CHECK-THUMB7-NEXT: mov.w r0, #09420; CHECK-THUMB7-NEXT: it lo9421; CHECK-THUMB7-NEXT: movlo r0, #19422; CHECK-THUMB7-NEXT: mov.w r10, #19423; CHECK-THUMB7-NEXT: it lo9424; CHECK-THUMB7-NEXT: movlo r10, r29425; CHECK-THUMB7-NEXT: cmp r0, #09426; CHECK-THUMB7-NEXT: it ne9427; CHECK-THUMB7-NEXT: movne r0, r19428; CHECK-THUMB7-NEXT: @ kill: def $r10 killed $r10 def $r10_r119429; CHECK-THUMB7-NEXT: mov r11, r09430; CHECK-THUMB7-NEXT: movw r6, :lower16:atomic_i649431; CHECK-THUMB7-NEXT: movt r6, :upper16:atomic_i649432; CHECK-THUMB7-NEXT: @ implicit-def: $r09433; CHECK-THUMB7-NEXT: @ implicit-def: $r39434; CHECK-THUMB7-NEXT: @ kill: def $r6 killed $r6 def $r6_r79435; CHECK-THUMB7-NEXT: mov r7, r09436; CHECK-THUMB7-NEXT: .LBB43_2: @ %atomicrmw.start9437; CHECK-THUMB7-NEXT: @ Parent Loop BB43_1 Depth=19438; CHECK-THUMB7-NEXT: @ => This Inner Loop Header: Depth=29439; CHECK-THUMB7-NEXT: ldrexd r4, r5, [r6]9440; CHECK-THUMB7-NEXT: cmp r4, r89441; CHECK-THUMB7-NEXT: it eq9442; CHECK-THUMB7-NEXT: cmpeq r5, r99443; CHECK-THUMB7-NEXT: bne .LBB43_49444; CHECK-THUMB7-NEXT: @ %bb.3: @ %atomicrmw.start9445; CHECK-THUMB7-NEXT: @ in Loop: Header=BB43_2 Depth=29446; CHECK-THUMB7-NEXT: strexd r7, r10, r11, [r6]9447; CHECK-THUMB7-NEXT: cmp r7, #09448; CHECK-THUMB7-NEXT: bne .LBB43_29449; CHECK-THUMB7-NEXT: .LBB43_4: @ %atomicrmw.start9450; CHECK-THUMB7-NEXT: @ in Loop: Header=BB43_1 Depth=19451; CHECK-THUMB7-NEXT: mov r0, r59452; CHECK-THUMB7-NEXT: str r0, [sp] @ 4-byte Spill9453; CHECK-THUMB7-NEXT: eor.w r3, r0, r19454; CHECK-THUMB7-NEXT: mov r1, r49455; CHECK-THUMB7-NEXT: str r1, [sp, #4] @ 4-byte Spill9456; CHECK-THUMB7-NEXT: eors r2, r19457; CHECK-THUMB7-NEXT: orrs r2, r39458; CHECK-THUMB7-NEXT: cmp r2, #09459; CHECK-THUMB7-NEXT: str r1, [sp, #8] @ 4-byte Spill9460; CHECK-THUMB7-NEXT: str r0, [sp, #12] @ 4-byte Spill9461; CHECK-THUMB7-NEXT: bne .LBB43_19462; CHECK-THUMB7-NEXT: b .LBB43_59463; CHECK-THUMB7-NEXT: .LBB43_5: @ %atomicrmw.end9464; CHECK-THUMB7-NEXT: ldr r1, [sp] @ 4-byte Reload9465; CHECK-THUMB7-NEXT: ldr r0, [sp, #4] @ 4-byte Reload9466; CHECK-THUMB7-NEXT: add sp, #169467; 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: @ %entry9471; CHECK-THUMB6-NEXT: .save {r7, lr}9472; CHECK-THUMB6-NEXT: push {r7, lr}9473; CHECK-THUMB6-NEXT: ldr r0, .LCPI43_09474; CHECK-THUMB6-NEXT: movs r2, #19475; CHECK-THUMB6-NEXT: movs r3, #09476; CHECK-THUMB6-NEXT: bl __sync_fetch_and_umin_89477; CHECK-THUMB6-NEXT: pop {r7, pc}9478; CHECK-THUMB6-NEXT: .p2align 29479; CHECK-THUMB6-NEXT: @ %bb.1:9480; CHECK-THUMB6-NEXT: .LCPI43_0:9481; CHECK-THUMB6-NEXT: .long atomic_i649482;9483; CHECK-THUMB8BASE-LABEL: test_umin_i64:9484; CHECK-THUMB8BASE: @ %bb.0: @ %entry9485; CHECK-THUMB8BASE-NEXT: .save {r4, lr}9486; CHECK-THUMB8BASE-NEXT: push {r4, lr}9487; CHECK-THUMB8BASE-NEXT: .pad #729488; CHECK-THUMB8BASE-NEXT: sub sp, #729489; CHECK-THUMB8BASE-NEXT: movw r1, :lower16:atomic_i649490; CHECK-THUMB8BASE-NEXT: movt r1, :upper16:atomic_i649491; CHECK-THUMB8BASE-NEXT: ldr r0, [r1, #4]9492; CHECK-THUMB8BASE-NEXT: ldr r1, [r1]9493; CHECK-THUMB8BASE-NEXT: str r1, [sp, #56] @ 4-byte Spill9494; CHECK-THUMB8BASE-NEXT: str r0, [sp, #60] @ 4-byte Spill9495; CHECK-THUMB8BASE-NEXT: b .LBB43_19496; CHECK-THUMB8BASE-NEXT: .LBB43_1: @ %atomicrmw.start9497; CHECK-THUMB8BASE-NEXT: @ =>This Inner Loop Header: Depth=19498; CHECK-THUMB8BASE-NEXT: ldr r3, [sp, #56] @ 4-byte Reload9499; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #60] @ 4-byte Reload9500; CHECK-THUMB8BASE-NEXT: str r1, [sp, #36] @ 4-byte Spill9501; CHECK-THUMB8BASE-NEXT: str r3, [sp, #40] @ 4-byte Spill9502; CHECK-THUMB8BASE-NEXT: movs r0, #19503; CHECK-THUMB8BASE-NEXT: str r0, [sp, #44] @ 4-byte Spill9504; CHECK-THUMB8BASE-NEXT: movs r2, #09505; CHECK-THUMB8BASE-NEXT: str r2, [sp, #48] @ 4-byte Spill9506; CHECK-THUMB8BASE-NEXT: subs r3, r3, #29507; CHECK-THUMB8BASE-NEXT: sbcs r1, r29508; CHECK-THUMB8BASE-NEXT: str r0, [sp, #52] @ 4-byte Spill9509; CHECK-THUMB8BASE-NEXT: blo .LBB43_39510; CHECK-THUMB8BASE-NEXT: @ %bb.2: @ %atomicrmw.start9511; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB43_1 Depth=19512; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #48] @ 4-byte Reload9513; CHECK-THUMB8BASE-NEXT: str r0, [sp, #52] @ 4-byte Spill9514; CHECK-THUMB8BASE-NEXT: .LBB43_3: @ %atomicrmw.start9515; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB43_1 Depth=19516; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #40] @ 4-byte Reload9517; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #52] @ 4-byte Reload9518; CHECK-THUMB8BASE-NEXT: str r1, [sp, #28] @ 4-byte Spill9519; CHECK-THUMB8BASE-NEXT: str r0, [sp, #32] @ 4-byte Spill9520; CHECK-THUMB8BASE-NEXT: blo .LBB43_59521; CHECK-THUMB8BASE-NEXT: @ %bb.4: @ %atomicrmw.start9522; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB43_1 Depth=19523; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #44] @ 4-byte Reload9524; CHECK-THUMB8BASE-NEXT: str r0, [sp, #32] @ 4-byte Spill9525; CHECK-THUMB8BASE-NEXT: .LBB43_5: @ %atomicrmw.start9526; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB43_1 Depth=19527; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #36] @ 4-byte Reload9528; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #28] @ 4-byte Reload9529; CHECK-THUMB8BASE-NEXT: ldr r2, [sp, #32] @ 4-byte Reload9530; CHECK-THUMB8BASE-NEXT: str r2, [sp, #20] @ 4-byte Spill9531; CHECK-THUMB8BASE-NEXT: str r0, [sp, #24] @ 4-byte Spill9532; CHECK-THUMB8BASE-NEXT: cbnz r1, .LBB43_79533; CHECK-THUMB8BASE-NEXT: @ %bb.6: @ %atomicrmw.start9534; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB43_1 Depth=19535; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #28] @ 4-byte Reload9536; CHECK-THUMB8BASE-NEXT: str r0, [sp, #24] @ 4-byte Spill9537; CHECK-THUMB8BASE-NEXT: .LBB43_7: @ %atomicrmw.start9538; CHECK-THUMB8BASE-NEXT: @ in Loop: Header=BB43_1 Depth=19539; CHECK-THUMB8BASE-NEXT: ldr r2, [sp, #20] @ 4-byte Reload9540; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #48] @ 4-byte Reload9541; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #36] @ 4-byte Reload9542; CHECK-THUMB8BASE-NEXT: ldr r4, [sp, #40] @ 4-byte Reload9543; CHECK-THUMB8BASE-NEXT: ldr r3, [sp, #24] @ 4-byte Reload9544; 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_i649549; CHECK-THUMB8BASE-NEXT: movt r0, :upper16:atomic_i649550; CHECK-THUMB8BASE-NEXT: add r1, sp, #649551; CHECK-THUMB8BASE-NEXT: bl __atomic_compare_exchange_89552; CHECK-THUMB8BASE-NEXT: mov r2, r09553; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #68]9554; CHECK-THUMB8BASE-NEXT: str r0, [sp, #12] @ 4-byte Spill9555; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #64]9556; CHECK-THUMB8BASE-NEXT: str r1, [sp, #16] @ 4-byte Spill9557; CHECK-THUMB8BASE-NEXT: cmp r2, #09558; CHECK-THUMB8BASE-NEXT: str r1, [sp, #56] @ 4-byte Spill9559; CHECK-THUMB8BASE-NEXT: str r0, [sp, #60] @ 4-byte Spill9560; CHECK-THUMB8BASE-NEXT: beq .LBB43_19561; CHECK-THUMB8BASE-NEXT: b .LBB43_89562; CHECK-THUMB8BASE-NEXT: .LBB43_8: @ %atomicrmw.end9563; CHECK-THUMB8BASE-NEXT: ldr r1, [sp, #12] @ 4-byte Reload9564; CHECK-THUMB8BASE-NEXT: ldr r0, [sp, #16] @ 4-byte Reload9565; CHECK-THUMB8BASE-NEXT: add sp, #729566; CHECK-THUMB8BASE-NEXT: pop {r4, pc}9567entry:9568 %0 = atomicrmw umin ptr @atomic_i64, i64 1 monotonic9569 ret i64 %09570}9571