193 lines · plain
1; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+v8.4a %s -o - -global-isel=1 -global-isel-abort=1 | FileCheck %s2; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+lse2 %s -o - -global-isel=1 -global-isel-abort=1 | 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: mov v[[Q:[0-9]+]].d[0], [[LO]]9; CHECK: mov v[[Q]].d[1], [[HI]]10; CHECK: str q[[Q]], [x0]11 %res.0 = load atomic i128, ptr %addr monotonic, align 1612 store i128 %res.0, ptr %addr13 14; CHECK: ldp [[LO:x[0-9]+]], [[HI:x[0-9]+]], [x0]15; CHECK: mov v[[Q:[0-9]+]].d[0], [[LO]]16; CHECK: mov v[[Q]].d[1], [[HI]]17; CHECK: str q[[Q]], [x0]18 %res.1 = load atomic i128, ptr %addr unordered, align 1619 store i128 %res.1, ptr %addr20 21; CHECK: ldp [[LO:x[0-9]+]], [[HI:x[0-9]+]], [x0]22; CHECK: dmb ish23; CHECK: mov v[[Q:[0-9]+]].d[0], [[LO]]24; CHECK: mov v[[Q]].d[1], [[HI]]25; CHECK: str q[[Q]], [x0]26 %res.2 = load atomic i128, ptr %addr acquire, align 1627 store i128 %res.2, ptr %addr28 29; CHECK: ldp [[LO:x[0-9]+]], [[HI:x[0-9]+]], [x0]30; CHECK: dmb ish31; CHECK: mov v[[Q:[0-9]+]].d[0], [[LO]]32; CHECK: mov v[[Q]].d[1], [[HI]]33; CHECK: str q[[Q]], [x0]34 %res.3 = load atomic i128, ptr %addr seq_cst, align 1635 store i128 %res.3, ptr %addr36 37 38; CHECK: ldp [[LO:x[0-9]+]], [[HI:x[0-9]+]], [x0, #8]39; CHECK: mov v[[Q:[0-9]+]].d[0], [[LO]]40; CHECK: mov v[[Q]].d[1], [[HI]]41; CHECK: str q[[Q]], [x0]42 %addr8.1 = getelementptr i8, ptr %addr, i32 843 %res.5 = load atomic i128, ptr %addr8.1 monotonic, align 1644 store i128 %res.5, ptr %addr45 46; CHECK: ldp [[LO:x[0-9]+]], [[HI:x[0-9]+]], [x0, #504]47; CHECK: mov v[[Q:[0-9]+]].d[0], [[LO]]48; CHECK: mov v[[Q]].d[1], [[HI]]49; CHECK: str q[[Q]], [x0]50 %addr8.2 = getelementptr i8, ptr %addr, i32 50451 %res.6 = load atomic i128, ptr %addr8.2 monotonic, align 1652 store i128 %res.6, ptr %addr53 54; CHECK: ldp [[LO:x[0-9]+]], [[HI:x[0-9]+]], [x0, #-512]55; CHECK: mov v[[Q:[0-9]+]].d[0], [[LO]]56; CHECK: mov v[[Q]].d[1], [[HI]]57; CHECK: str q[[Q]], [x0]58 %addr8.3 = getelementptr i8, ptr %addr, i32 -51259 %res.7 = load atomic i128, ptr %addr8.3 monotonic, align 1660 store i128 %res.7, ptr %addr61 62 ret void63}64 65define void @test_libcall_load(ptr %addr) {66; CHECK-LABEL: test_libcall_load:67; CHECK: bl __atomic_load68 %res.8 = load atomic i128, ptr %addr unordered, align 869 store i128 %res.8, ptr %addr70 71 ret void72}73 74define void @test_nonfolded_load1(ptr %addr) {75; CHECK-LABEL: test_nonfolded_load1:76 77; CHECK: add x[[ADDR:[0-9]+]], x0, #478; CHECK: ldp [[LO:x[0-9]+]], [[HI:x[0-9]+]], [x[[ADDR]]]79; CHECK: mov v[[Q:[0-9]+]].d[0], [[LO]]80; CHECK: mov v[[Q]].d[1], [[HI]]81; CHECK: str q[[Q]], [x0]82 %addr8.1 = getelementptr i8, ptr %addr, i32 483 %res.1 = load atomic i128, ptr %addr8.1 monotonic, align 1684 store i128 %res.1, ptr %addr85 86 ret void87}88 89define void @test_nonfolded_load2(ptr %addr) {90; CHECK-LABEL: test_nonfolded_load2:91 92; CHECK: add x[[ADDR:[0-9]+]], x0, #51293; CHECK: ldp [[LO:x[0-9]+]], [[HI:x[0-9]+]], [x[[ADDR]]]94; CHECK: mov v[[Q:[0-9]+]].d[0], [[LO]]95; CHECK: mov v[[Q]].d[1], [[HI]]96; CHECK: str q[[Q]], [x0]97 %addr8.1 = getelementptr i8, ptr %addr, i32 51298 %res.1 = load atomic i128, ptr %addr8.1 monotonic, align 1699 store i128 %res.1, ptr %addr100 101 ret void102}103 104define void @test_nonfolded_load3(ptr %addr) {105; CHECK-LABEL: test_nonfolded_load3:106 107; CHECK: sub x[[ADDR:[0-9]+]], x0, #520108; CHECK: ldp [[LO:x[0-9]+]], [[HI:x[0-9]+]], [x[[ADDR]]]109; CHECK: mov v[[Q:[0-9]+]].d[0], [[LO]]110; CHECK: mov v[[Q]].d[1], [[HI]]111; CHECK: str q[[Q]], [x0]112 %addr8.1 = getelementptr i8, ptr %addr, i32 -520113 %res.1 = load atomic i128, ptr %addr8.1 monotonic, align 16114 store i128 %res.1, ptr %addr115 116 ret void117}118 119define void @test_atomic_store(ptr %addr, i128 %val) {120; CHECK-LABEL: test_atomic_store:121 122; CHECK: stp x2, x3, [x0]123 store atomic i128 %val, ptr %addr monotonic, align 16124 125; CHECK: stp x2, x3, [x0]126 store atomic i128 %val, ptr %addr unordered, align 16127 128; CHECK: dmb ish129; CHECK: stp x2, x3, [x0]130 store atomic i128 %val, ptr %addr release, align 16131 132; CHECK: dmb ish133; CHECK: stp x2, x3, [x0]134; CHECK: dmb ish135 store atomic i128 %val, ptr %addr seq_cst, align 16136 137 138; CHECK: stp x2, x3, [x0, #8]139 %addr8.1 = getelementptr i8, ptr %addr, i32 8140 store atomic i128 %val, ptr %addr8.1 monotonic, align 16141 142; CHECK: stp x2, x3, [x0, #504]143 %addr8.2 = getelementptr i8, ptr %addr, i32 504144 store atomic i128 %val, ptr %addr8.2 monotonic, align 16145 146; CHECK: stp x2, x3, [x0, #-512]147 %addr8.3 = getelementptr i8, ptr %addr, i32 -512148 store atomic i128 %val, ptr %addr8.3 monotonic, align 16149 150 ret void151}152 153define void @test_libcall_store(ptr %addr, i128 %val) {154; CHECK-LABEL: test_libcall_store:155; CHECK: bl __atomic_store156 store atomic i128 %val, ptr %addr unordered, align 8157 158 ret void159}160 161define void @test_nonfolded_store1(ptr %addr, i128 %val) {162; CHECK-LABEL: test_nonfolded_store1:163 164; CHECK: add x[[ADDR:[0-9]+]], x0, #4165; CHECK: stp x2, x3, [x[[ADDR]]]166 %addr8.1 = getelementptr i8, ptr %addr, i32 4167 store atomic i128 %val, ptr %addr8.1 monotonic, align 16168 169 ret void170}171 172define void @test_nonfolded_store2(ptr %addr, i128 %val) {173; CHECK-LABEL: test_nonfolded_store2:174 175; CHECK: add x[[ADDR:[0-9]+]], x0, #512176; CHECK: stp x2, x3, [x[[ADDR]]]177 %addr8.1 = getelementptr i8, ptr %addr, i32 512178 store atomic i128 %val, ptr %addr8.1 monotonic, align 16179 180 ret void181}182 183define void @test_nonfolded_store3(ptr %addr, i128 %val) {184; CHECK-LABEL: test_nonfolded_store3:185 186; CHECK: sub x[[ADDR:[0-9]+]], x0, #520187; CHECK: stp x2, x3, [x[[ADDR]]]188 %addr8.1 = getelementptr i8, ptr %addr, i32 -520189 store atomic i128 %val, ptr %addr8.1 monotonic, align 16190 191 ret void192}193