199 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=arm-eabi -mcpu=cortex-a9 < %s | FileCheck %s3 4define i8 @atomicrmw_uinc_wrap_i8(ptr %ptr, i8 %val) {5; CHECK-LABEL: atomicrmw_uinc_wrap_i8:6; CHECK: @ %bb.0:7; CHECK-NEXT: uxtb r12, r18; CHECK-NEXT: dmb ish9; CHECK-NEXT: .LBB0_1: @ %atomicrmw.start10; CHECK-NEXT: @ =>This Inner Loop Header: Depth=111; CHECK-NEXT: ldrexb r1, [r0]12; CHECK-NEXT: cmp r1, r1213; CHECK-NEXT: add r3, r1, #114; CHECK-NEXT: movwhs r3, #015; CHECK-NEXT: strexb r2, r3, [r0]16; CHECK-NEXT: cmp r2, #017; CHECK-NEXT: bne .LBB0_118; CHECK-NEXT: @ %bb.2: @ %atomicrmw.end19; CHECK-NEXT: mov r0, r120; CHECK-NEXT: dmb ish21; CHECK-NEXT: bx lr22 %result = atomicrmw uinc_wrap ptr %ptr, i8 %val seq_cst23 ret i8 %result24}25 26define i16 @atomicrmw_uinc_wrap_i16(ptr %ptr, i16 %val) {27; CHECK-LABEL: atomicrmw_uinc_wrap_i16:28; CHECK: @ %bb.0:29; CHECK-NEXT: uxth r12, r130; CHECK-NEXT: dmb ish31; CHECK-NEXT: .LBB1_1: @ %atomicrmw.start32; CHECK-NEXT: @ =>This Inner Loop Header: Depth=133; CHECK-NEXT: ldrexh r1, [r0]34; CHECK-NEXT: cmp r1, r1235; CHECK-NEXT: add r3, r1, #136; CHECK-NEXT: movwhs r3, #037; CHECK-NEXT: strexh r2, r3, [r0]38; CHECK-NEXT: cmp r2, #039; CHECK-NEXT: bne .LBB1_140; CHECK-NEXT: @ %bb.2: @ %atomicrmw.end41; CHECK-NEXT: mov r0, r142; CHECK-NEXT: dmb ish43; CHECK-NEXT: bx lr44 %result = atomicrmw uinc_wrap ptr %ptr, i16 %val seq_cst45 ret i16 %result46}47 48define i32 @atomicrmw_uinc_wrap_i32(ptr %ptr, i32 %val) {49; CHECK-LABEL: atomicrmw_uinc_wrap_i32:50; CHECK: @ %bb.0:51; CHECK-NEXT: dmb ish52; CHECK-NEXT: .LBB2_1: @ %atomicrmw.start53; CHECK-NEXT: @ =>This Inner Loop Header: Depth=154; CHECK-NEXT: ldrex r2, [r0]55; CHECK-NEXT: cmp r2, r156; CHECK-NEXT: add r12, r2, #157; CHECK-NEXT: movwhs r12, #058; CHECK-NEXT: strex r3, r12, [r0]59; CHECK-NEXT: cmp r3, #060; CHECK-NEXT: bne .LBB2_161; CHECK-NEXT: @ %bb.2: @ %atomicrmw.end62; CHECK-NEXT: mov r0, r263; CHECK-NEXT: dmb ish64; CHECK-NEXT: bx lr65 %result = atomicrmw uinc_wrap ptr %ptr, i32 %val seq_cst66 ret i32 %result67}68 69define i64 @atomicrmw_uinc_wrap_i64(ptr %ptr, i64 %val) {70; CHECK-LABEL: atomicrmw_uinc_wrap_i64:71; CHECK: @ %bb.0:72; CHECK-NEXT: .save {r4, r6, r7, lr}73; CHECK-NEXT: push {r4, r6, r7, lr}74; CHECK-NEXT: mov r12, r075; CHECK-NEXT: dmb ish76; CHECK-NEXT: .LBB3_1: @ %atomicrmw.start77; CHECK-NEXT: @ =>This Inner Loop Header: Depth=178; CHECK-NEXT: ldrexd r0, r1, [r12]79; CHECK-NEXT: adds r6, r0, #180; CHECK-NEXT: adc r7, r1, #081; CHECK-NEXT: subs r4, r0, r282; CHECK-NEXT: sbcs r4, r1, r383; CHECK-NEXT: movwhs r7, #084; CHECK-NEXT: movwhs r6, #085; CHECK-NEXT: strexd r4, r6, r7, [r12]86; CHECK-NEXT: cmp r4, #087; CHECK-NEXT: bne .LBB3_188; CHECK-NEXT: @ %bb.2: @ %atomicrmw.end89; CHECK-NEXT: dmb ish90; CHECK-NEXT: pop {r4, r6, r7, pc}91 %result = atomicrmw uinc_wrap ptr %ptr, i64 %val seq_cst92 ret i64 %result93}94 95define i8 @atomicrmw_udec_wrap_i8(ptr %ptr, i8 %val) {96; CHECK-LABEL: atomicrmw_udec_wrap_i8:97; CHECK: @ %bb.0:98; CHECK-NEXT: dmb ish99; CHECK-NEXT: .LBB4_1: @ %atomicrmw.start100; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1101; CHECK-NEXT: ldrexb r12, [r0]102; CHECK-NEXT: uxtb r3, r1103; CHECK-NEXT: cmp r12, r3104; CHECK-NEXT: mov r3, r1105; CHECK-NEXT: subls r3, r12, #1106; CHECK-NEXT: cmp r12, #0107; CHECK-NEXT: moveq r3, r1108; CHECK-NEXT: strexb r2, r3, [r0]109; CHECK-NEXT: cmp r2, #0110; CHECK-NEXT: bne .LBB4_1111; CHECK-NEXT: @ %bb.2: @ %atomicrmw.end112; CHECK-NEXT: mov r0, r12113; CHECK-NEXT: dmb ish114; CHECK-NEXT: bx lr115 %result = atomicrmw udec_wrap ptr %ptr, i8 %val seq_cst116 ret i8 %result117}118 119define i16 @atomicrmw_udec_wrap_i16(ptr %ptr, i16 %val) {120; CHECK-LABEL: atomicrmw_udec_wrap_i16:121; CHECK: @ %bb.0:122; CHECK-NEXT: dmb ish123; CHECK-NEXT: .LBB5_1: @ %atomicrmw.start124; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1125; CHECK-NEXT: ldrexh r12, [r0]126; CHECK-NEXT: uxth r3, r1127; CHECK-NEXT: cmp r12, r3128; CHECK-NEXT: mov r3, r1129; CHECK-NEXT: subls r3, r12, #1130; CHECK-NEXT: cmp r12, #0131; CHECK-NEXT: moveq r3, r1132; CHECK-NEXT: strexh r2, r3, [r0]133; CHECK-NEXT: cmp r2, #0134; CHECK-NEXT: bne .LBB5_1135; CHECK-NEXT: @ %bb.2: @ %atomicrmw.end136; CHECK-NEXT: mov r0, r12137; CHECK-NEXT: dmb ish138; CHECK-NEXT: bx lr139 %result = atomicrmw udec_wrap ptr %ptr, i16 %val seq_cst140 ret i16 %result141}142 143define i32 @atomicrmw_udec_wrap_i32(ptr %ptr, i32 %val) {144; CHECK-LABEL: atomicrmw_udec_wrap_i32:145; CHECK: @ %bb.0:146; CHECK-NEXT: dmb ish147; CHECK-NEXT: .LBB6_1: @ %atomicrmw.start148; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1149; CHECK-NEXT: ldrex r12, [r0]150; CHECK-NEXT: mov r3, r1151; CHECK-NEXT: cmp r12, r1152; CHECK-NEXT: subls r3, r12, #1153; CHECK-NEXT: cmp r12, #0154; CHECK-NEXT: moveq r3, r1155; CHECK-NEXT: strex r2, r3, [r0]156; CHECK-NEXT: cmp r2, #0157; CHECK-NEXT: bne .LBB6_1158; CHECK-NEXT: @ %bb.2: @ %atomicrmw.end159; CHECK-NEXT: mov r0, r12160; CHECK-NEXT: dmb ish161; CHECK-NEXT: bx lr162 %result = atomicrmw udec_wrap ptr %ptr, i32 %val seq_cst163 ret i32 %result164}165 166define i64 @atomicrmw_udec_wrap_i64(ptr %ptr, i64 %val) {167; CHECK-LABEL: atomicrmw_udec_wrap_i64:168; CHECK: @ %bb.0:169; CHECK-NEXT: .save {r4, r5, r6, r7, r11, lr}170; CHECK-NEXT: push {r4, r5, r6, r7, r11, lr}171; CHECK-NEXT: dmb ish172; CHECK-NEXT: .LBB7_1: @ %atomicrmw.start173; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1174; CHECK-NEXT: ldrexd r4, r5, [r0]175; CHECK-NEXT: mov r12, #0176; CHECK-NEXT: subs r1, r2, r4177; CHECK-NEXT: sbcs r1, r3, r5178; CHECK-NEXT: orr r1, r4, r5179; CHECK-NEXT: clz r1, r1180; CHECK-NEXT: movwlo r12, #1181; CHECK-NEXT: lsr r1, r1, #5182; CHECK-NEXT: subs r6, r4, #1183; CHECK-NEXT: sbc r7, r5, #0184; CHECK-NEXT: orr r1, r1, r12185; CHECK-NEXT: cmp r1, #0186; CHECK-NEXT: movne r7, r3187; CHECK-NEXT: movne r6, r2188; CHECK-NEXT: strexd r1, r6, r7, [r0]189; CHECK-NEXT: cmp r1, #0190; CHECK-NEXT: bne .LBB7_1191; CHECK-NEXT: @ %bb.2: @ %atomicrmw.end192; CHECK-NEXT: mov r0, r4193; CHECK-NEXT: mov r1, r5194; CHECK-NEXT: dmb ish195; CHECK-NEXT: pop {r4, r5, r6, r7, r11, pc}196 %result = atomicrmw udec_wrap ptr %ptr, i64 %val seq_cst197 ret i64 %result198}199