442 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --filter-out "(?!^\s*stl.*\bsp\b)^\s*.*\bsp\b" --filter "^\s*(ld[^r]|st|swp|cas|bl|add|and|eor|orn|orr|sub|mvn|sxt|cmp|ccmp|csel|dmb)"2; RUN: llc %s -o - -verify-machineinstrs -mtriple=aarch64 -mattr=+v8.4a -mattr=+rcpc-immo -global-isel=true -global-isel-abort=2 -O0 | FileCheck %s --check-prefixes=CHECK,GISEL3; RUN: llc %s -o - -verify-machineinstrs -mtriple=aarch64 -mattr=+v8.4a -mattr=+rcpc-immo -global-isel=false -O1 | FileCheck %s --check-prefixes=CHECK,SDAG4 5define void @store_atomic_i8_aligned_unordered(i8 %value, ptr %ptr) {6; CHECK-LABEL: store_atomic_i8_aligned_unordered:7; CHECK: strb w0, [x1, #4]8 %gep = getelementptr inbounds i8, ptr %ptr, i32 49 store atomic i8 %value, ptr %gep unordered, align 110 ret void11}12 13define void @store_atomic_i8_aligned_monotonic(i8 %value, ptr %ptr) {14; CHECK-LABEL: store_atomic_i8_aligned_monotonic:15; CHECK: strb w0, [x1, #4]16 %gep = getelementptr inbounds i8, ptr %ptr, i32 417 store atomic i8 %value, ptr %gep monotonic, align 118 ret void19}20 21define void @store_atomic_i8_aligned_release(i8 %value, ptr %ptr) {22; CHECK-LABEL: store_atomic_i8_aligned_release:23; CHECK: stlurb w0, [x1, #4]24 %gep = getelementptr inbounds i8, ptr %ptr, i32 425 store atomic i8 %value, ptr %gep release, align 126 ret void27}28 29define void @store_atomic_i8_aligned_seq_cst(i8 %value, ptr %ptr) {30; CHECK-LABEL: store_atomic_i8_aligned_seq_cst:31; CHECK: stlurb w0, [x1, #4]32 %gep = getelementptr inbounds i8, ptr %ptr, i32 433 store atomic i8 %value, ptr %gep seq_cst, align 134 ret void35}36 37define void @store_atomic_i16_aligned_unordered(i16 %value, ptr %ptr) {38; CHECK-LABEL: store_atomic_i16_aligned_unordered:39; CHECK: strh w0, [x1, #8]40 %gep = getelementptr inbounds i16, ptr %ptr, i32 441 store atomic i16 %value, ptr %gep unordered, align 242 ret void43}44 45define void @store_atomic_i16_aligned_monotonic(i16 %value, ptr %ptr) {46; CHECK-LABEL: store_atomic_i16_aligned_monotonic:47; CHECK: strh w0, [x1, #8]48 %gep = getelementptr inbounds i16, ptr %ptr, i32 449 store atomic i16 %value, ptr %gep monotonic, align 250 ret void51}52 53define void @store_atomic_i16_aligned_release(i16 %value, ptr %ptr) {54; CHECK-LABEL: store_atomic_i16_aligned_release:55; CHECK: stlurh w0, [x1, #8]56 %gep = getelementptr inbounds i16, ptr %ptr, i32 457 store atomic i16 %value, ptr %gep release, align 258 ret void59}60 61define void @store_atomic_i16_aligned_seq_cst(i16 %value, ptr %ptr) {62; CHECK-LABEL: store_atomic_i16_aligned_seq_cst:63; CHECK: stlurh w0, [x1, #8]64 %gep = getelementptr inbounds i16, ptr %ptr, i32 465 store atomic i16 %value, ptr %gep seq_cst, align 266 ret void67}68 69define void @store_atomic_i32_aligned_unordered(i32 %value, ptr %ptr) {70; CHECK-LABEL: store_atomic_i32_aligned_unordered:71; CHECK: str w0, [x1, #16]72 %gep = getelementptr inbounds i32, ptr %ptr, i32 473 store atomic i32 %value, ptr %gep unordered, align 474 ret void75}76 77define void @store_atomic_i32_aligned_monotonic(i32 %value, ptr %ptr) {78; CHECK-LABEL: store_atomic_i32_aligned_monotonic:79; CHECK: str w0, [x1, #16]80 %gep = getelementptr inbounds i32, ptr %ptr, i32 481 store atomic i32 %value, ptr %gep monotonic, align 482 ret void83}84 85define void @store_atomic_i32_aligned_release(i32 %value, ptr %ptr) {86; CHECK-LABEL: store_atomic_i32_aligned_release:87; CHECK: stlur w0, [x1, #16]88 %gep = getelementptr inbounds i32, ptr %ptr, i32 489 store atomic i32 %value, ptr %gep release, align 490 ret void91}92 93define void @store_atomic_i32_aligned_seq_cst(i32 %value, ptr %ptr) {94; CHECK-LABEL: store_atomic_i32_aligned_seq_cst:95; CHECK: stlur w0, [x1, #16]96 %gep = getelementptr inbounds i32, ptr %ptr, i32 497 store atomic i32 %value, ptr %gep seq_cst, align 498 ret void99}100 101define void @store_atomic_i64_aligned_unordered(i64 %value, ptr %ptr) {102; CHECK-LABEL: store_atomic_i64_aligned_unordered:103; CHECK: str x0, [x1, #32]104 %gep = getelementptr inbounds i64, ptr %ptr, i32 4105 store atomic i64 %value, ptr %gep unordered, align 8106 ret void107}108 109define void @store_atomic_i64_aligned_monotonic(i64 %value, ptr %ptr) {110; CHECK-LABEL: store_atomic_i64_aligned_monotonic:111; CHECK: str x0, [x1, #32]112 %gep = getelementptr inbounds i64, ptr %ptr, i32 4113 store atomic i64 %value, ptr %gep monotonic, align 8114 ret void115}116 117define void @store_atomic_i64_aligned_release(i64 %value, ptr %ptr) {118; CHECK-LABEL: store_atomic_i64_aligned_release:119; CHECK: stlur x0, [x1, #32]120 %gep = getelementptr inbounds i64, ptr %ptr, i32 4121 store atomic i64 %value, ptr %gep release, align 8122 ret void123}124 125define void @store_atomic_i64_aligned_seq_cst(i64 %value, ptr %ptr) {126; CHECK-LABEL: store_atomic_i64_aligned_seq_cst:127; CHECK: stlur x0, [x1, #32]128 %gep = getelementptr inbounds i64, ptr %ptr, i32 4129 store atomic i64 %value, ptr %gep seq_cst, align 8130 ret void131}132 133define void @store_atomic_i128_aligned_unordered(i128 %value, ptr %ptr) {134; CHECK-LABEL: store_atomic_i128_aligned_unordered:135; CHECK: stp x0, x1, [x2, #64]136 %gep = getelementptr inbounds i128, ptr %ptr, i32 4137 store atomic i128 %value, ptr %gep unordered, align 16138 ret void139}140 141define void @store_atomic_i128_aligned_monotonic(i128 %value, ptr %ptr) {142; CHECK-LABEL: store_atomic_i128_aligned_monotonic:143; CHECK: stp x0, x1, [x2, #64]144 %gep = getelementptr inbounds i128, ptr %ptr, i32 4145 store atomic i128 %value, ptr %gep monotonic, align 16146 ret void147}148 149define void @store_atomic_i128_aligned_release(i128 %value, ptr %ptr) {150; CHECK-LABEL: store_atomic_i128_aligned_release:151; CHECK: dmb ish152; CHECK: stp x0, x1, [x2, #64]153 %gep = getelementptr inbounds i128, ptr %ptr, i32 4154 store atomic i128 %value, ptr %gep release, align 16155 ret void156}157 158define void @store_atomic_i128_aligned_seq_cst(i128 %value, ptr %ptr) {159; CHECK-LABEL: store_atomic_i128_aligned_seq_cst:160; CHECK: dmb ish161; CHECK: stp x0, x1, [x2, #64]162; CHECK: dmb ish163 %gep = getelementptr inbounds i128, ptr %ptr, i32 4164 store atomic i128 %value, ptr %gep seq_cst, align 16165 ret void166}167 168define void @store_atomic_i8_unaligned_unordered(i8 %value, ptr %ptr) {169; CHECK-LABEL: store_atomic_i8_unaligned_unordered:170; CHECK: strb w0, [x1, #4]171 %gep = getelementptr inbounds i8, ptr %ptr, i32 4172 store atomic i8 %value, ptr %gep unordered, align 1173 ret void174}175 176define void @store_atomic_i8_unaligned_monotonic(i8 %value, ptr %ptr) {177; CHECK-LABEL: store_atomic_i8_unaligned_monotonic:178; CHECK: strb w0, [x1, #4]179 %gep = getelementptr inbounds i8, ptr %ptr, i32 4180 store atomic i8 %value, ptr %gep monotonic, align 1181 ret void182}183 184define void @store_atomic_i8_unaligned_release(i8 %value, ptr %ptr) {185; CHECK-LABEL: store_atomic_i8_unaligned_release:186; CHECK: stlurb w0, [x1, #4]187 %gep = getelementptr inbounds i8, ptr %ptr, i32 4188 store atomic i8 %value, ptr %gep release, align 1189 ret void190}191 192define void @store_atomic_i8_unaligned_seq_cst(i8 %value, ptr %ptr) {193; CHECK-LABEL: store_atomic_i8_unaligned_seq_cst:194; CHECK: stlurb w0, [x1, #4]195 %gep = getelementptr inbounds i8, ptr %ptr, i32 4196 store atomic i8 %value, ptr %gep seq_cst, align 1197 ret void198}199 200define void @store_atomic_i16_unaligned_unordered(i16 %value, ptr %ptr) {201; CHECK-LABEL: store_atomic_i16_unaligned_unordered:202; CHECK: add x1, x1, #8203; CHECK: bl __atomic_store204 %gep = getelementptr inbounds i16, ptr %ptr, i32 4205 store atomic i16 %value, ptr %gep unordered, align 1206 ret void207}208 209define void @store_atomic_i16_unaligned_monotonic(i16 %value, ptr %ptr) {210; CHECK-LABEL: store_atomic_i16_unaligned_monotonic:211; CHECK: add x1, x1, #8212; CHECK: bl __atomic_store213 %gep = getelementptr inbounds i16, ptr %ptr, i32 4214 store atomic i16 %value, ptr %gep monotonic, align 1215 ret void216}217 218define void @store_atomic_i16_unaligned_release(i16 %value, ptr %ptr) {219; CHECK-LABEL: store_atomic_i16_unaligned_release:220; CHECK: add x1, x1, #8221; CHECK: bl __atomic_store222 %gep = getelementptr inbounds i16, ptr %ptr, i32 4223 store atomic i16 %value, ptr %gep release, align 1224 ret void225}226 227define void @store_atomic_i16_unaligned_seq_cst(i16 %value, ptr %ptr) {228; CHECK-LABEL: store_atomic_i16_unaligned_seq_cst:229; CHECK: add x1, x1, #8230; CHECK: bl __atomic_store231 %gep = getelementptr inbounds i16, ptr %ptr, i32 4232 store atomic i16 %value, ptr %gep seq_cst, align 1233 ret void234}235 236define void @store_atomic_i32_unaligned_unordered(i32 %value, ptr %ptr) {237; CHECK-LABEL: store_atomic_i32_unaligned_unordered:238; CHECK: add x1, x1, #16239; CHECK: bl __atomic_store240 %gep = getelementptr inbounds i32, ptr %ptr, i32 4241 store atomic i32 %value, ptr %gep unordered, align 1242 ret void243}244 245define void @store_atomic_i32_unaligned_monotonic(i32 %value, ptr %ptr) {246; CHECK-LABEL: store_atomic_i32_unaligned_monotonic:247; CHECK: add x1, x1, #16248; CHECK: bl __atomic_store249 %gep = getelementptr inbounds i32, ptr %ptr, i32 4250 store atomic i32 %value, ptr %gep monotonic, align 1251 ret void252}253 254define void @store_atomic_i32_unaligned_release(i32 %value, ptr %ptr) {255; CHECK-LABEL: store_atomic_i32_unaligned_release:256; CHECK: add x1, x1, #16257; CHECK: bl __atomic_store258 %gep = getelementptr inbounds i32, ptr %ptr, i32 4259 store atomic i32 %value, ptr %gep release, align 1260 ret void261}262 263define void @store_atomic_i32_unaligned_seq_cst(i32 %value, ptr %ptr) {264; CHECK-LABEL: store_atomic_i32_unaligned_seq_cst:265; CHECK: add x1, x1, #16266; CHECK: bl __atomic_store267 %gep = getelementptr inbounds i32, ptr %ptr, i32 4268 store atomic i32 %value, ptr %gep seq_cst, align 1269 ret void270}271 272define void @store_atomic_i64_unaligned_unordered(i64 %value, ptr %ptr) {273; CHECK-LABEL: store_atomic_i64_unaligned_unordered:274; CHECK: add x1, x1, #32275; CHECK: bl __atomic_store276 %gep = getelementptr inbounds i64, ptr %ptr, i32 4277 store atomic i64 %value, ptr %gep unordered, align 1278 ret void279}280 281define void @store_atomic_i64_unaligned_monotonic(i64 %value, ptr %ptr) {282; CHECK-LABEL: store_atomic_i64_unaligned_monotonic:283; CHECK: add x1, x1, #32284; CHECK: bl __atomic_store285 %gep = getelementptr inbounds i64, ptr %ptr, i32 4286 store atomic i64 %value, ptr %gep monotonic, align 1287 ret void288}289 290define void @store_atomic_i64_unaligned_release(i64 %value, ptr %ptr) {291; CHECK-LABEL: store_atomic_i64_unaligned_release:292; CHECK: add x1, x1, #32293; CHECK: bl __atomic_store294 %gep = getelementptr inbounds i64, ptr %ptr, i32 4295 store atomic i64 %value, ptr %gep release, align 1296 ret void297}298 299define void @store_atomic_i64_unaligned_seq_cst(i64 %value, ptr %ptr) {300; CHECK-LABEL: store_atomic_i64_unaligned_seq_cst:301; CHECK: add x1, x1, #32302; CHECK: bl __atomic_store303 %gep = getelementptr inbounds i64, ptr %ptr, i32 4304 store atomic i64 %value, ptr %gep seq_cst, align 1305 ret void306}307 308define void @store_atomic_i128_unaligned_unordered(i128 %value, ptr %ptr) {309; GISEL-LABEL: store_atomic_i128_unaligned_unordered:310; GISEL: add x1, x8, #64311; GISEL: bl __atomic_store312;313; SDAG-LABEL: store_atomic_i128_unaligned_unordered:314; SDAG: add x1, x2, #64315; SDAG: bl __atomic_store316 %gep = getelementptr inbounds i128, ptr %ptr, i32 4317 store atomic i128 %value, ptr %gep unordered, align 1318 ret void319}320 321define void @store_atomic_i128_unaligned_monotonic(i128 %value, ptr %ptr) {322; GISEL-LABEL: store_atomic_i128_unaligned_monotonic:323; GISEL: add x1, x8, #64324; GISEL: bl __atomic_store325;326; SDAG-LABEL: store_atomic_i128_unaligned_monotonic:327; SDAG: add x1, x2, #64328; SDAG: bl __atomic_store329 %gep = getelementptr inbounds i128, ptr %ptr, i32 4330 store atomic i128 %value, ptr %gep monotonic, align 1331 ret void332}333 334define void @store_atomic_i128_unaligned_release(i128 %value, ptr %ptr) {335; GISEL-LABEL: store_atomic_i128_unaligned_release:336; GISEL: add x1, x8, #64337; GISEL: bl __atomic_store338;339; SDAG-LABEL: store_atomic_i128_unaligned_release:340; SDAG: add x1, x2, #64341; SDAG: bl __atomic_store342 %gep = getelementptr inbounds i128, ptr %ptr, i32 4343 store atomic i128 %value, ptr %gep release, align 1344 ret void345}346 347define void @store_atomic_i128_unaligned_seq_cst(i128 %value, ptr %ptr) {348; GISEL-LABEL: store_atomic_i128_unaligned_seq_cst:349; GISEL: add x1, x8, #64350; GISEL: bl __atomic_store351;352; SDAG-LABEL: store_atomic_i128_unaligned_seq_cst:353; SDAG: add x1, x2, #64354; SDAG: bl __atomic_store355 %gep = getelementptr inbounds i128, ptr %ptr, i32 4356 store atomic i128 %value, ptr %gep seq_cst, align 1357 ret void358}359 360; TODO: missed opportunity to emit a stlurb w/ GISel361define void @store_atomic_i8_from_gep() {362; GISEL-LABEL: store_atomic_i8_from_gep:363; GISEL: bl init364; GISEL: add x9, x8, #1365; GISEL: stlrb w8, [x9]366;367; SDAG-LABEL: store_atomic_i8_from_gep:368; SDAG: bl init369; SDAG: stlurb wzr, [sp, #13]370 %a = alloca [3 x i8]371 call void @init(ptr %a)372 %arrayidx = getelementptr [3 x i8], ptr %a, i64 0, i64 1373 store atomic i8 0, ptr %arrayidx release, align 8374 ret void375}376 377; TODO: missed opportunity to emit a stlurh w/ GISel378define void @store_atomic_i16_from_gep() {379; GISEL-LABEL: store_atomic_i16_from_gep:380; GISEL: bl init381; GISEL: add x9, x8, #2382; GISEL: stlrh w8, [x9]383;384; SDAG-LABEL: store_atomic_i16_from_gep:385; SDAG: bl init386; SDAG: stlurh wzr, [sp, #10]387 %a = alloca [3 x i16]388 call void @init(ptr %a)389 %arrayidx = getelementptr [3 x i16], ptr %a, i64 0, i64 1390 store atomic i16 0, ptr %arrayidx release, align 8391 ret void392}393 394define void @store_atomic_i32_from_gep() {395; GISEL-LABEL: store_atomic_i32_from_gep:396; GISEL: bl init397; GISEL: stlur w8, [x9, #4]398;399; SDAG-LABEL: store_atomic_i32_from_gep:400; SDAG: bl init401; SDAG: stlur wzr, [sp, #8]402 %a = alloca [3 x i32]403 call void @init(ptr %a)404 %arrayidx = getelementptr [3 x i32], ptr %a, i64 0, i64 1405 store atomic i32 0, ptr %arrayidx release, align 8406 ret void407}408 409define void @store_atomic_i64_from_gep() {410; GISEL-LABEL: store_atomic_i64_from_gep:411; GISEL: bl init412; GISEL: stlur x8, [x9, #8]413;414; SDAG-LABEL: store_atomic_i64_from_gep:415; SDAG: bl init416; SDAG: stlur xzr, [sp, #16]417 %a = alloca [3 x i64]418 call void @init(ptr %a)419 %arrayidx = getelementptr [3 x i64], ptr %a, i64 0, i64 1420 store atomic i64 0, ptr %arrayidx release, align 8421 ret void422}423 424define void @store_atomic_i128_from_gep() {425; GISEL-LABEL: store_atomic_i128_from_gep:426; GISEL: bl init427; GISEL: dmb ish428; GISEL: stp x8, x8, [x9, #16]429;430; SDAG-LABEL: store_atomic_i128_from_gep:431; SDAG: bl init432; SDAG: dmb ish433; SDAG: stp xzr, xzr, [sp, #16]434 %a = alloca [3 x i128]435 call void @init(ptr %a)436 %arrayidx = getelementptr [3 x i128], ptr %a, i64 0, i64 1437 store atomic i128 0, ptr %arrayidx release, align 16438 ret void439}440 441declare void @init(ptr)442