brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.4 KiB · db71eae Raw
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