brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.6 KiB · fe7e24c Raw
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