362 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=thumbv6m-none-eabi < %s | FileCheck %s --check-prefixes=CHECK,NO-ATOMIC323; RUN: llc -mtriple=thumbv6m-none-eabi -mattr=+atomics-32 < %s | FileCheck %s --check-prefixes=CHECK,ATOMIC324 5define i8 @load8(ptr %p) {6; NO-ATOMIC32-LABEL: load8:7; NO-ATOMIC32: @ %bb.0:8; NO-ATOMIC32-NEXT: .save {r7, lr}9; NO-ATOMIC32-NEXT: push {r7, lr}10; NO-ATOMIC32-NEXT: movs r1, #511; NO-ATOMIC32-NEXT: bl __atomic_load_112; NO-ATOMIC32-NEXT: pop {r7, pc}13;14; ATOMIC32-LABEL: load8:15; ATOMIC32: @ %bb.0:16; ATOMIC32-NEXT: ldrb r0, [r0]17; ATOMIC32-NEXT: dmb sy18; ATOMIC32-NEXT: bx lr19 %v = load atomic i8, ptr %p seq_cst, align 120 ret i8 %v21}22 23define void @store8(ptr %p) {24; NO-ATOMIC32-LABEL: store8:25; NO-ATOMIC32: @ %bb.0:26; NO-ATOMIC32-NEXT: .save {r7, lr}27; NO-ATOMIC32-NEXT: push {r7, lr}28; NO-ATOMIC32-NEXT: movs r1, #029; NO-ATOMIC32-NEXT: movs r2, #530; NO-ATOMIC32-NEXT: bl __atomic_store_131; NO-ATOMIC32-NEXT: pop {r7, pc}32;33; ATOMIC32-LABEL: store8:34; ATOMIC32: @ %bb.0:35; ATOMIC32-NEXT: dmb sy36; ATOMIC32-NEXT: movs r1, #037; ATOMIC32-NEXT: strb r1, [r0]38; ATOMIC32-NEXT: dmb sy39; ATOMIC32-NEXT: bx lr40 store atomic i8 0, ptr %p seq_cst, align 141 ret void42}43 44define i8 @rmw8(ptr %p) {45; NO-ATOMIC32-LABEL: rmw8:46; NO-ATOMIC32: @ %bb.0:47; NO-ATOMIC32-NEXT: .save {r7, lr}48; NO-ATOMIC32-NEXT: push {r7, lr}49; NO-ATOMIC32-NEXT: movs r1, #150; NO-ATOMIC32-NEXT: movs r2, #551; NO-ATOMIC32-NEXT: bl __atomic_fetch_add_152; NO-ATOMIC32-NEXT: pop {r7, pc}53;54; ATOMIC32-LABEL: rmw8:55; ATOMIC32: @ %bb.0:56; ATOMIC32-NEXT: .save {r7, lr}57; ATOMIC32-NEXT: push {r7, lr}58; ATOMIC32-NEXT: dmb sy59; ATOMIC32-NEXT: movs r1, #160; ATOMIC32-NEXT: bl __sync_fetch_and_add_161; ATOMIC32-NEXT: dmb sy62; ATOMIC32-NEXT: pop {r7, pc}63 %v = atomicrmw add ptr %p, i8 1 seq_cst, align 164 ret i8 %v65}66 67define i8 @cmpxchg8(ptr %p) {68; NO-ATOMIC32-LABEL: cmpxchg8:69; NO-ATOMIC32: @ %bb.0:70; NO-ATOMIC32-NEXT: .save {r7, lr}71; NO-ATOMIC32-NEXT: push {r7, lr}72; NO-ATOMIC32-NEXT: .pad #873; NO-ATOMIC32-NEXT: sub sp, #874; NO-ATOMIC32-NEXT: add r1, sp, #475; NO-ATOMIC32-NEXT: movs r2, #076; NO-ATOMIC32-NEXT: strb r2, [r1]77; NO-ATOMIC32-NEXT: movs r3, #578; NO-ATOMIC32-NEXT: str r3, [sp]79; NO-ATOMIC32-NEXT: movs r2, #180; NO-ATOMIC32-NEXT: bl __atomic_compare_exchange_181; NO-ATOMIC32-NEXT: ldr r0, [sp, #4]82; NO-ATOMIC32-NEXT: add sp, #883; NO-ATOMIC32-NEXT: pop {r7, pc}84;85; ATOMIC32-LABEL: cmpxchg8:86; ATOMIC32: @ %bb.0:87; ATOMIC32-NEXT: .save {r7, lr}88; ATOMIC32-NEXT: push {r7, lr}89; ATOMIC32-NEXT: dmb sy90; ATOMIC32-NEXT: movs r1, #091; ATOMIC32-NEXT: movs r2, #192; ATOMIC32-NEXT: bl __sync_val_compare_and_swap_193; ATOMIC32-NEXT: dmb sy94; ATOMIC32-NEXT: pop {r7, pc}95 %res = cmpxchg ptr %p, i8 0, i8 1 seq_cst seq_cst96 %res.0 = extractvalue { i8, i1 } %res, 097 ret i8 %res.098}99 100define i16 @load16(ptr %p) {101; NO-ATOMIC32-LABEL: load16:102; NO-ATOMIC32: @ %bb.0:103; NO-ATOMIC32-NEXT: .save {r7, lr}104; NO-ATOMIC32-NEXT: push {r7, lr}105; NO-ATOMIC32-NEXT: movs r1, #5106; NO-ATOMIC32-NEXT: bl __atomic_load_2107; NO-ATOMIC32-NEXT: pop {r7, pc}108;109; ATOMIC32-LABEL: load16:110; ATOMIC32: @ %bb.0:111; ATOMIC32-NEXT: ldrh r0, [r0]112; ATOMIC32-NEXT: dmb sy113; ATOMIC32-NEXT: bx lr114 %v = load atomic i16, ptr %p seq_cst, align 2115 ret i16 %v116}117 118define void @store16(ptr %p) {119; NO-ATOMIC32-LABEL: store16:120; NO-ATOMIC32: @ %bb.0:121; NO-ATOMIC32-NEXT: .save {r7, lr}122; NO-ATOMIC32-NEXT: push {r7, lr}123; NO-ATOMIC32-NEXT: movs r1, #0124; NO-ATOMIC32-NEXT: movs r2, #5125; NO-ATOMIC32-NEXT: bl __atomic_store_2126; NO-ATOMIC32-NEXT: pop {r7, pc}127;128; ATOMIC32-LABEL: store16:129; ATOMIC32: @ %bb.0:130; ATOMIC32-NEXT: dmb sy131; ATOMIC32-NEXT: movs r1, #0132; ATOMIC32-NEXT: strh r1, [r0]133; ATOMIC32-NEXT: dmb sy134; ATOMIC32-NEXT: bx lr135 store atomic i16 0, ptr %p seq_cst, align 2136 ret void137}138 139define i16 @rmw16(ptr %p) {140; NO-ATOMIC32-LABEL: rmw16:141; NO-ATOMIC32: @ %bb.0:142; NO-ATOMIC32-NEXT: .save {r7, lr}143; NO-ATOMIC32-NEXT: push {r7, lr}144; NO-ATOMIC32-NEXT: movs r1, #1145; NO-ATOMIC32-NEXT: movs r2, #5146; NO-ATOMIC32-NEXT: bl __atomic_fetch_add_2147; NO-ATOMIC32-NEXT: pop {r7, pc}148;149; ATOMIC32-LABEL: rmw16:150; ATOMIC32: @ %bb.0:151; ATOMIC32-NEXT: .save {r7, lr}152; ATOMIC32-NEXT: push {r7, lr}153; ATOMIC32-NEXT: dmb sy154; ATOMIC32-NEXT: movs r1, #1155; ATOMIC32-NEXT: bl __sync_fetch_and_add_2156; ATOMIC32-NEXT: dmb sy157; ATOMIC32-NEXT: pop {r7, pc}158 %v = atomicrmw add ptr %p, i16 1 seq_cst, align 2159 ret i16 %v160}161 162define i16 @cmpxchg16(ptr %p) {163; NO-ATOMIC32-LABEL: cmpxchg16:164; NO-ATOMIC32: @ %bb.0:165; NO-ATOMIC32-NEXT: .save {r7, lr}166; NO-ATOMIC32-NEXT: push {r7, lr}167; NO-ATOMIC32-NEXT: .pad #8168; NO-ATOMIC32-NEXT: sub sp, #8169; NO-ATOMIC32-NEXT: add r1, sp, #4170; NO-ATOMIC32-NEXT: movs r2, #0171; NO-ATOMIC32-NEXT: strh r2, [r1]172; NO-ATOMIC32-NEXT: movs r3, #5173; NO-ATOMIC32-NEXT: str r3, [sp]174; NO-ATOMIC32-NEXT: movs r2, #1175; NO-ATOMIC32-NEXT: bl __atomic_compare_exchange_2176; NO-ATOMIC32-NEXT: ldr r0, [sp, #4]177; NO-ATOMIC32-NEXT: add sp, #8178; NO-ATOMIC32-NEXT: pop {r7, pc}179;180; ATOMIC32-LABEL: cmpxchg16:181; ATOMIC32: @ %bb.0:182; ATOMIC32-NEXT: .save {r7, lr}183; ATOMIC32-NEXT: push {r7, lr}184; ATOMIC32-NEXT: dmb sy185; ATOMIC32-NEXT: movs r1, #0186; ATOMIC32-NEXT: movs r2, #1187; ATOMIC32-NEXT: bl __sync_val_compare_and_swap_2188; ATOMIC32-NEXT: dmb sy189; ATOMIC32-NEXT: pop {r7, pc}190 %res = cmpxchg ptr %p, i16 0, i16 1 seq_cst seq_cst191 %res.0 = extractvalue { i16, i1 } %res, 0192 ret i16 %res.0193}194 195define i32 @load32(ptr %p) {196; NO-ATOMIC32-LABEL: load32:197; NO-ATOMIC32: @ %bb.0:198; NO-ATOMIC32-NEXT: .save {r7, lr}199; NO-ATOMIC32-NEXT: push {r7, lr}200; NO-ATOMIC32-NEXT: movs r1, #5201; NO-ATOMIC32-NEXT: bl __atomic_load_4202; NO-ATOMIC32-NEXT: pop {r7, pc}203;204; ATOMIC32-LABEL: load32:205; ATOMIC32: @ %bb.0:206; ATOMIC32-NEXT: ldr r0, [r0]207; ATOMIC32-NEXT: dmb sy208; ATOMIC32-NEXT: bx lr209 %v = load atomic i32, ptr %p seq_cst, align 4210 ret i32 %v211}212 213define void @store32(ptr %p) {214; NO-ATOMIC32-LABEL: store32:215; NO-ATOMIC32: @ %bb.0:216; NO-ATOMIC32-NEXT: .save {r7, lr}217; NO-ATOMIC32-NEXT: push {r7, lr}218; NO-ATOMIC32-NEXT: movs r1, #0219; NO-ATOMIC32-NEXT: movs r2, #5220; NO-ATOMIC32-NEXT: bl __atomic_store_4221; NO-ATOMIC32-NEXT: pop {r7, pc}222;223; ATOMIC32-LABEL: store32:224; ATOMIC32: @ %bb.0:225; ATOMIC32-NEXT: dmb sy226; ATOMIC32-NEXT: movs r1, #0227; ATOMIC32-NEXT: str r1, [r0]228; ATOMIC32-NEXT: dmb sy229; ATOMIC32-NEXT: bx lr230 store atomic i32 0, ptr %p seq_cst, align 4231 ret void232}233 234define i32 @rmw32(ptr %p) {235; NO-ATOMIC32-LABEL: rmw32:236; NO-ATOMIC32: @ %bb.0:237; NO-ATOMIC32-NEXT: .save {r7, lr}238; NO-ATOMIC32-NEXT: push {r7, lr}239; NO-ATOMIC32-NEXT: movs r1, #1240; NO-ATOMIC32-NEXT: movs r2, #5241; NO-ATOMIC32-NEXT: bl __atomic_fetch_add_4242; NO-ATOMIC32-NEXT: pop {r7, pc}243;244; ATOMIC32-LABEL: rmw32:245; ATOMIC32: @ %bb.0:246; ATOMIC32-NEXT: .save {r7, lr}247; ATOMIC32-NEXT: push {r7, lr}248; ATOMIC32-NEXT: dmb sy249; ATOMIC32-NEXT: movs r1, #1250; ATOMIC32-NEXT: bl __sync_fetch_and_add_4251; ATOMIC32-NEXT: dmb sy252; ATOMIC32-NEXT: pop {r7, pc}253 %v = atomicrmw add ptr %p, i32 1 seq_cst, align 4254 ret i32 %v255}256 257define i32 @cmpxchg32(ptr %p) {258; NO-ATOMIC32-LABEL: cmpxchg32:259; NO-ATOMIC32: @ %bb.0:260; NO-ATOMIC32-NEXT: .save {r7, lr}261; NO-ATOMIC32-NEXT: push {r7, lr}262; NO-ATOMIC32-NEXT: .pad #8263; NO-ATOMIC32-NEXT: sub sp, #8264; NO-ATOMIC32-NEXT: movs r1, #0265; NO-ATOMIC32-NEXT: str r1, [sp, #4]266; NO-ATOMIC32-NEXT: movs r3, #5267; NO-ATOMIC32-NEXT: str r3, [sp]268; NO-ATOMIC32-NEXT: add r1, sp, #4269; NO-ATOMIC32-NEXT: movs r2, #1270; NO-ATOMIC32-NEXT: bl __atomic_compare_exchange_4271; NO-ATOMIC32-NEXT: ldr r0, [sp, #4]272; NO-ATOMIC32-NEXT: add sp, #8273; NO-ATOMIC32-NEXT: pop {r7, pc}274;275; ATOMIC32-LABEL: cmpxchg32:276; ATOMIC32: @ %bb.0:277; ATOMIC32-NEXT: .save {r7, lr}278; ATOMIC32-NEXT: push {r7, lr}279; ATOMIC32-NEXT: dmb sy280; ATOMIC32-NEXT: movs r1, #0281; ATOMIC32-NEXT: movs r2, #1282; ATOMIC32-NEXT: bl __sync_val_compare_and_swap_4283; ATOMIC32-NEXT: dmb sy284; ATOMIC32-NEXT: pop {r7, pc}285 %res = cmpxchg ptr %p, i32 0, i32 1 seq_cst seq_cst286 %res.0 = extractvalue { i32, i1 } %res, 0287 ret i32 %res.0288}289 290define i64 @load64(ptr %p) {291; CHECK-LABEL: load64:292; CHECK: @ %bb.0:293; CHECK-NEXT: .save {r7, lr}294; CHECK-NEXT: push {r7, lr}295; CHECK-NEXT: movs r1, #5296; CHECK-NEXT: bl __atomic_load_8297; CHECK-NEXT: pop {r7, pc}298 %v = load atomic i64, ptr %p seq_cst, align 8299 ret i64 %v300}301 302define void @store64(ptr %p) {303; CHECK-LABEL: store64:304; CHECK: @ %bb.0:305; CHECK-NEXT: .save {r7, lr}306; CHECK-NEXT: push {r7, lr}307; CHECK-NEXT: .pad #8308; CHECK-NEXT: sub sp, #8309; CHECK-NEXT: movs r1, #5310; CHECK-NEXT: str r1, [sp]311; CHECK-NEXT: movs r2, #0312; CHECK-NEXT: mov r3, r2313; CHECK-NEXT: bl __atomic_store_8314; CHECK-NEXT: add sp, #8315; CHECK-NEXT: pop {r7, pc}316 store atomic i64 0, ptr %p seq_cst, align 8317 ret void318}319 320define i64 @rmw64(ptr %p) {321; CHECK-LABEL: rmw64:322; CHECK: @ %bb.0:323; CHECK-NEXT: .save {r7, lr}324; CHECK-NEXT: push {r7, lr}325; CHECK-NEXT: .pad #8326; CHECK-NEXT: sub sp, #8327; CHECK-NEXT: movs r1, #5328; CHECK-NEXT: str r1, [sp]329; CHECK-NEXT: movs r2, #1330; CHECK-NEXT: movs r3, #0331; CHECK-NEXT: bl __atomic_fetch_add_8332; CHECK-NEXT: add sp, #8333; CHECK-NEXT: pop {r7, pc}334 %v = atomicrmw add ptr %p, i64 1 seq_cst, align 8335 ret i64 %v336}337 338define i64 @cmpxchg64(ptr %p) {339; CHECK-LABEL: cmpxchg64:340; CHECK: @ %bb.0:341; CHECK-NEXT: .save {r7, lr}342; CHECK-NEXT: push {r7, lr}343; CHECK-NEXT: .pad #16344; CHECK-NEXT: sub sp, #16345; CHECK-NEXT: movs r3, #0346; CHECK-NEXT: str r3, [sp, #12]347; CHECK-NEXT: str r3, [sp, #8]348; CHECK-NEXT: movs r1, #5349; CHECK-NEXT: str r1, [sp]350; CHECK-NEXT: str r1, [sp, #4]351; CHECK-NEXT: add r1, sp, #8352; CHECK-NEXT: movs r2, #1353; CHECK-NEXT: bl __atomic_compare_exchange_8354; CHECK-NEXT: ldr r1, [sp, #12]355; CHECK-NEXT: ldr r0, [sp, #8]356; CHECK-NEXT: add sp, #16357; CHECK-NEXT: pop {r7, pc}358 %res = cmpxchg ptr %p, i64 0, i64 1 seq_cst seq_cst359 %res.0 = extractvalue { i64, i1 } %res, 0360 ret i64 %res.0361}362