175 lines · plain
1; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+v8.4a %s -o - | FileCheck %s2; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+lse2 %s -o - | FileCheck %s3 4define void @test_atomic_load(ptr %addr) {5; CHECK-LABEL: test_atomic_load:6 7; CHECK: ldp [[LO:x[0-9]+]], [[HI:x[0-9]+]], [x0]8; CHECK: stp [[LO]], [[HI]], [x0]9 %res.0 = load atomic i128, ptr %addr monotonic, align 1610 store i128 %res.0, ptr %addr11 12; CHECK: ldp [[LO:x[0-9]+]], [[HI:x[0-9]+]], [x0]13; CHECK: stp [[LO]], [[HI]], [x0]14 %res.1 = load atomic i128, ptr %addr unordered, align 1615 store i128 %res.1, ptr %addr16 17; CHECK: ldp [[LO:x[0-9]+]], [[HI:x[0-9]+]], [x0]18; CHECK: dmb ish19; CHECK: stp [[LO]], [[HI]], [x0]20 %res.2 = load atomic i128, ptr %addr acquire, align 1621 store i128 %res.2, ptr %addr22 23; CHECK: ldp [[LO:x[0-9]+]], [[HI:x[0-9]+]], [x0]24; CHECK: dmb ish25; CHECK: stp [[LO]], [[HI]], [x0]26 %res.3 = load atomic i128, ptr %addr seq_cst, align 1627 store i128 %res.3, ptr %addr28 29 30 31; CHECK: ldp [[LO:x[0-9]+]], [[HI:x[0-9]+]], [x0, #32]32; CHECK-DAG: stp [[LO]], [[HI]], [x0]33 %addr8.1 = getelementptr i8, ptr %addr, i32 3234 %res.5 = load atomic i128, ptr %addr8.1 monotonic, align 1635 store i128 %res.5, ptr %addr36 37; CHECK: ldp [[LO:x[0-9]+]], [[HI:x[0-9]+]], [x0, #504]38; CHECK: stp [[LO]], [[HI]], [x0]39 %addr8.2 = getelementptr i8, ptr %addr, i32 50440 %res.6 = load atomic i128, ptr %addr8.2 monotonic, align 1641 store i128 %res.6, ptr %addr42 43; CHECK: ldp [[LO:x[0-9]+]], [[HI:x[0-9]+]], [x0, #-512]44; CHECK: stp [[LO]], [[HI]], [x0]45 %addr8.3 = getelementptr i8, ptr %addr, i32 -51246 %res.7 = load atomic i128, ptr %addr8.3 monotonic, align 1647 store i128 %res.7, ptr %addr48 49 ret void50}51 52define void @test_libcall_load(ptr %addr) {53; CHECK-LABEL: test_libcall_load:54; CHECK: bl __atomic_load55 %res.8 = load atomic i128, ptr %addr unordered, align 856 store i128 %res.8, ptr %addr57 58 ret void59}60 61define void @test_nonfolded_load1(ptr %addr) {62; CHECK-LABEL: test_nonfolded_load1:63 64; CHECK: add x[[ADDR:[0-9]+]], x0, #465; CHECK: ldp [[LO:x[0-9]+]], [[HI:x[0-9]+]], [x[[ADDR]]]66; CHECK: stp [[LO]], [[HI]], [x0]67 %addr8.1 = getelementptr i8, ptr %addr, i32 468 %res.1 = load atomic i128, ptr %addr8.1 monotonic, align 1669 store i128 %res.1, ptr %addr70 71 ret void72}73 74define void @test_nonfolded_load2(ptr %addr) {75; CHECK-LABEL: test_nonfolded_load2:76 77; CHECK: add x[[ADDR:[0-9]+]], x0, #51278; CHECK: ldp [[LO:x[0-9]+]], [[HI:x[0-9]+]], [x[[ADDR]]]79; CHECK: stp [[LO]], [[HI]], [x0]80 %addr8.1 = getelementptr i8, ptr %addr, i32 51281 %res.1 = load atomic i128, ptr %addr8.1 monotonic, align 1682 store i128 %res.1, ptr %addr83 84 ret void85}86 87define void @test_nonfolded_load3(ptr %addr) {88; CHECK-LABEL: test_nonfolded_load3:89 90; CHECK: sub x[[ADDR:[0-9]+]], x0, #52091; CHECK: ldp [[LO:x[0-9]+]], [[HI:x[0-9]+]], [x[[ADDR]]]92; CHECK: stp [[LO]], [[HI]], [x0]93 %addr8.1 = getelementptr i8, ptr %addr, i32 -52094 %res.1 = load atomic i128, ptr %addr8.1 monotonic, align 1695 store i128 %res.1, ptr %addr96 97 ret void98}99 100define void @test_atomic_store(ptr %addr, i128 %val) {101; CHECK-LABEL: test_atomic_store:102 103; CHECK: stp x2, x3, [x0]104 store atomic i128 %val, ptr %addr monotonic, align 16105 106; CHECK: stp x2, x3, [x0]107 store atomic i128 %val, ptr %addr unordered, align 16108 109; CHECK: dmb ish110; CHECK: stp x2, x3, [x0]111 store atomic i128 %val, ptr %addr release, align 16112 113; CHECK: dmb ish114; CHECK: stp x2, x3, [x0]115; CHECK: dmb ish116 store atomic i128 %val, ptr %addr seq_cst, align 16117 118 119 120; CHECK: stp x2, x3, [x0, #8]121 %addr8.1 = getelementptr i8, ptr %addr, i32 8122 store atomic i128 %val, ptr %addr8.1 monotonic, align 16123 124; CHECK: stp x2, x3, [x0, #504]125 %addr8.2 = getelementptr i8, ptr %addr, i32 504126 store atomic i128 %val, ptr %addr8.2 monotonic, align 16127 128; CHECK: stp x2, x3, [x0, #-512]129 %addr8.3 = getelementptr i8, ptr %addr, i32 -512130 store atomic i128 %val, ptr %addr8.3 monotonic, align 16131 132 ret void133}134 135define void @test_libcall_store(ptr %addr, i128 %val) {136; CHECK-LABEL: test_libcall_store:137; CHECK: bl __atomic_store138 store atomic i128 %val, ptr %addr unordered, align 8139 140 ret void141}142 143define void @test_nonfolded_store1(ptr %addr, i128 %val) {144; CHECK-LABEL: test_nonfolded_store1:145 146; CHECK: add x[[ADDR:[0-9]+]], x0, #4147; CHECK: stp x2, x3, [x[[ADDR]]]148 %addr8.1 = getelementptr i8, ptr %addr, i32 4149 store atomic i128 %val, ptr %addr8.1 monotonic, align 16150 151 ret void152}153 154define void @test_nonfolded_store2(ptr %addr, i128 %val) {155; CHECK-LABEL: test_nonfolded_store2:156 157; CHECK: add x[[ADDR:[0-9]+]], x0, #512158; CHECK: stp x2, x3, [x[[ADDR]]]159 %addr8.1 = getelementptr i8, ptr %addr, i32 512160 store atomic i128 %val, ptr %addr8.1 monotonic, align 16161 162 ret void163}164 165define void @test_nonfolded_store3(ptr %addr, i128 %val) {166; CHECK-LABEL: test_nonfolded_store3:167 168; CHECK: sub x[[ADDR:[0-9]+]], x0, #520169; CHECK: stp x2, x3, [x[[ADDR]]]170 %addr8.1 = getelementptr i8, ptr %addr, i32 -520171 store atomic i128 %val, ptr %addr8.1 monotonic, align 16172 173 ret void174}175