brintos

brintos / llvm-project-archived public Read only

0
0
Text · 14.7 KiB · c80b18d Raw
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