390 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 32; RUN: llc < %s -O2 -mtriple=aarch64 -mcpu=ampere1 | FileCheck %s --check-prefixes=CHECK3; RUN: llc < %s -O2 -mtriple=aarch64 -mcpu=ampere1a | FileCheck %s --check-prefixes=CHECK4; RUN: llc < %s -O2 -mtriple=aarch64 | FileCheck %s --check-prefixes=CHECK-DEFAULT5; RUN: llc < %s -O2 -mtriple=aarch64 -mcpu=ampere1 -mattr=+disable-ldp | FileCheck %s --check-prefixes=CHECK-DISABLE-LDP6; RUN: llc < %s -O2 -mtriple=aarch64 -mcpu=ampere1 -mattr=+disable-stp | FileCheck %s --check-prefixes=CHECK-DISABLE-STP7; RUN: llc < %s -O2 -mtriple=aarch64 -mcpu=ampere1a -mattr=+disable-ldp | FileCheck %s --check-prefixes=CHECK-DISABLE-LDP8; RUN: llc < %s -O2 -mtriple=aarch64 -mcpu=ampere1a -mattr=+disable-stp | FileCheck %s --check-prefixes=CHECK-DISABLE-STP9 10define i32 @ldp_aligned_int32_t(ptr %0) #0 {11; CHECK-LABEL: ldp_aligned_int32_t:12; CHECK: // %bb.0:13; CHECK-NEXT: and x8, x0, #0xffffffffffffffc014; CHECK-NEXT: ldp w9, w8, [x8]15; CHECK-NEXT: add w0, w8, w916; CHECK-NEXT: ret17;18; CHECK-DEFAULT-LABEL: ldp_aligned_int32_t:19; CHECK-DEFAULT: // %bb.0:20; CHECK-DEFAULT-NEXT: and x8, x0, #0xffffffffffffffc021; CHECK-DEFAULT-NEXT: ldp w9, w8, [x8]22; CHECK-DEFAULT-NEXT: add w0, w8, w923; CHECK-DEFAULT-NEXT: ret24;25; CHECK-DISABLE-LDP-LABEL: ldp_aligned_int32_t:26; CHECK-DISABLE-LDP: // %bb.0:27; CHECK-DISABLE-LDP-NEXT: and x8, x0, #0xffffffffffffffc028; CHECK-DISABLE-LDP-NEXT: ldr w9, [x8]29; CHECK-DISABLE-LDP-NEXT: ldr w8, [x8, #4]30; CHECK-DISABLE-LDP-NEXT: add w0, w8, w931; CHECK-DISABLE-LDP-NEXT: ret32 %2 = ptrtoint ptr %0 to i6433 %3 = and i64 %2, -6434 %4 = inttoptr i64 %3 to ptr35 %5 = load i32, ptr %4, align 6436 %6 = getelementptr inbounds i32, ptr %4, i64 137 %7 = load i32, ptr %6, align 438 %8 = add nsw i32 %7, %539 ret i32 %840}41 42define i64 @ldp_aligned_int64_t(ptr %0) #0 {43; CHECK-LABEL: ldp_aligned_int64_t:44; CHECK: // %bb.0:45; CHECK-NEXT: and x8, x0, #0xffffffffffffff8046; CHECK-NEXT: ldp x9, x8, [x8]47; CHECK-NEXT: add x0, x8, x948; CHECK-NEXT: ret49;50; CHECK-DEFAULT-LABEL: ldp_aligned_int64_t:51; CHECK-DEFAULT: // %bb.0:52; CHECK-DEFAULT-NEXT: and x8, x0, #0xffffffffffffff8053; CHECK-DEFAULT-NEXT: ldp x9, x8, [x8]54; CHECK-DEFAULT-NEXT: add x0, x8, x955; CHECK-DEFAULT-NEXT: ret56;57; CHECK-DISABLE-LDP-LABEL: ldp_aligned_int64_t:58; CHECK-DISABLE-LDP: // %bb.0:59; CHECK-DISABLE-LDP-NEXT: and x8, x0, #0xffffffffffffff8060; CHECK-DISABLE-LDP-NEXT: ldr x9, [x8]61; CHECK-DISABLE-LDP-NEXT: ldr x8, [x8, #8]62; CHECK-DISABLE-LDP-NEXT: add x0, x8, x963; CHECK-DISABLE-LDP-NEXT: ret64 %2 = ptrtoint ptr %0 to i6465 %3 = and i64 %2, -12866 %4 = inttoptr i64 %3 to ptr67 %5 = load i64, ptr %4, align 12868 %6 = getelementptr inbounds i64, ptr %4, i64 169 %7 = load i64, ptr %6, align 870 %8 = add nsw i64 %7, %571 ret i64 %872}73 74define <4 x i32> @ldp_aligned_v4si(ptr %0) #0 {75; CHECK-LABEL: ldp_aligned_v4si:76; CHECK: // %bb.0:77; CHECK-NEXT: and x8, x0, #0xffffffffffffff0078; CHECK-NEXT: ldp q0, q1, [x8]79; CHECK-NEXT: add v0.4s, v1.4s, v0.4s80; CHECK-NEXT: ret81;82; CHECK-DEFAULT-LABEL: ldp_aligned_v4si:83; CHECK-DEFAULT: // %bb.0:84; CHECK-DEFAULT-NEXT: and x8, x0, #0xffffffffffffff0085; CHECK-DEFAULT-NEXT: ldp q0, q1, [x8]86; CHECK-DEFAULT-NEXT: add v0.4s, v1.4s, v0.4s87; CHECK-DEFAULT-NEXT: ret88;89; CHECK-DISABLE-LDP-LABEL: ldp_aligned_v4si:90; CHECK-DISABLE-LDP: // %bb.0:91; CHECK-DISABLE-LDP-NEXT: and x8, x0, #0xffffffffffffff0092; CHECK-DISABLE-LDP-NEXT: ldr q0, [x8]93; CHECK-DISABLE-LDP-NEXT: ldr q1, [x8, #16]94; CHECK-DISABLE-LDP-NEXT: add v0.4s, v1.4s, v0.4s95; CHECK-DISABLE-LDP-NEXT: ret96 %2 = ptrtoint ptr %0 to i6497 %3 = and i64 %2, -25698 %4 = inttoptr i64 %3 to ptr99 %5 = load <4 x i32>, ptr %4, align 256100 %6 = getelementptr inbounds <4 x i32>, ptr %4, i64 1101 %7 = load <4 x i32>, ptr %6, align 16102 %8 = add <4 x i32> %7, %5103 ret <4 x i32> %8104}105 106define i32 @ldp_unaligned_int32_t(ptr %0) #0 {107; CHECK-LABEL: ldp_unaligned_int32_t:108; CHECK: // %bb.0:109; CHECK-NEXT: and x8, x0, #0xffffffffffffffc0110; CHECK-NEXT: ldr w9, [x8, #4]111; CHECK-NEXT: ldr w8, [x8, #8]112; CHECK-NEXT: add w0, w8, w9113; CHECK-NEXT: ret114;115; CHECK-DEFAULT-LABEL: ldp_unaligned_int32_t:116; CHECK-DEFAULT: // %bb.0:117; CHECK-DEFAULT-NEXT: and x8, x0, #0xffffffffffffffc0118; CHECK-DEFAULT-NEXT: ldp w9, w8, [x8, #4]119; CHECK-DEFAULT-NEXT: add w0, w8, w9120; CHECK-DEFAULT-NEXT: ret121;122; CHECK-DISABLE-LDP-LABEL: ldp_unaligned_int32_t:123; CHECK-DISABLE-LDP: // %bb.0:124; CHECK-DISABLE-LDP-NEXT: and x8, x0, #0xffffffffffffffc0125; CHECK-DISABLE-LDP-NEXT: ldr w9, [x8, #4]126; CHECK-DISABLE-LDP-NEXT: ldr w8, [x8, #8]127; CHECK-DISABLE-LDP-NEXT: add w0, w8, w9128; CHECK-DISABLE-LDP-NEXT: ret129 %2 = ptrtoint ptr %0 to i64130 %3 = and i64 %2, -64131 %4 = inttoptr i64 %3 to ptr132 %5 = getelementptr inbounds i32, ptr %4, i64 1133 %6 = load i32, ptr %5, align 4134 %7 = getelementptr inbounds i32, ptr %4, i64 2135 %8 = load i32, ptr %7, align 8136 %9 = add nsw i32 %8, %6137 ret i32 %9138}139 140define i64 @ldp_unaligned_int64_t(ptr %0) #0 {141; CHECK-LABEL: ldp_unaligned_int64_t:142; CHECK: // %bb.0:143; CHECK-NEXT: and x8, x0, #0xffffffffffffff80144; CHECK-NEXT: ldr x9, [x8, #8]145; CHECK-NEXT: ldr x8, [x8, #16]146; CHECK-NEXT: add x0, x8, x9147; CHECK-NEXT: ret148;149; CHECK-DEFAULT-LABEL: ldp_unaligned_int64_t:150; CHECK-DEFAULT: // %bb.0:151; CHECK-DEFAULT-NEXT: and x8, x0, #0xffffffffffffff80152; CHECK-DEFAULT-NEXT: ldp x9, x8, [x8, #8]153; CHECK-DEFAULT-NEXT: add x0, x8, x9154; CHECK-DEFAULT-NEXT: ret155;156; CHECK-DISABLE-LDP-LABEL: ldp_unaligned_int64_t:157; CHECK-DISABLE-LDP: // %bb.0:158; CHECK-DISABLE-LDP-NEXT: and x8, x0, #0xffffffffffffff80159; CHECK-DISABLE-LDP-NEXT: ldr x9, [x8, #8]160; CHECK-DISABLE-LDP-NEXT: ldr x8, [x8, #16]161; CHECK-DISABLE-LDP-NEXT: add x0, x8, x9162; CHECK-DISABLE-LDP-NEXT: ret163 %2 = ptrtoint ptr %0 to i64164 %3 = and i64 %2, -128165 %4 = inttoptr i64 %3 to ptr166 %5 = getelementptr inbounds i64, ptr %4, i64 1167 %6 = load i64, ptr %5, align 8168 %7 = getelementptr inbounds i64, ptr %4, i64 2169 %8 = load i64, ptr %7, align 16170 %9 = add nsw i64 %8, %6171 ret i64 %9172}173 174define <4 x i32> @ldp_unaligned_v4si(ptr %0) #0 {175; CHECK-LABEL: ldp_unaligned_v4si:176; CHECK: // %bb.0:177; CHECK-NEXT: and x8, x0, #0xffffffffffffff00178; CHECK-NEXT: ldr q0, [x8, #16]179; CHECK-NEXT: ldr q1, [x8, #32]180; CHECK-NEXT: add v0.4s, v1.4s, v0.4s181; CHECK-NEXT: ret182;183; CHECK-DEFAULT-LABEL: ldp_unaligned_v4si:184; CHECK-DEFAULT: // %bb.0:185; CHECK-DEFAULT-NEXT: and x8, x0, #0xffffffffffffff00186; CHECK-DEFAULT-NEXT: ldp q0, q1, [x8, #16]187; CHECK-DEFAULT-NEXT: add v0.4s, v1.4s, v0.4s188; CHECK-DEFAULT-NEXT: ret189;190; CHECK-DISABLE-LDP-LABEL: ldp_unaligned_v4si:191; CHECK-DISABLE-LDP: // %bb.0:192; CHECK-DISABLE-LDP-NEXT: and x8, x0, #0xffffffffffffff00193; CHECK-DISABLE-LDP-NEXT: ldr q0, [x8, #16]194; CHECK-DISABLE-LDP-NEXT: ldr q1, [x8, #32]195; CHECK-DISABLE-LDP-NEXT: add v0.4s, v1.4s, v0.4s196; CHECK-DISABLE-LDP-NEXT: ret197 %2 = ptrtoint ptr %0 to i64198 %3 = and i64 %2, -256199 %4 = inttoptr i64 %3 to ptr200 %5 = getelementptr inbounds <4 x i32>, ptr %4, i64 1201 %6 = load <4 x i32>, ptr %5, align 16202 %7 = getelementptr inbounds <4 x i32>, ptr %4, i64 2203 %8 = load <4 x i32>, ptr %7, align 32204 %9 = add <4 x i32> %8, %6205 ret <4 x i32> %9206}207 208define ptr @stp_aligned_int32_t(ptr %0, i32 %1) #0 {209; CHECK-LABEL: stp_aligned_int32_t:210; CHECK: // %bb.0:211; CHECK-NEXT: and x0, x0, #0xffffffffffffffc0212; CHECK-NEXT: stp w1, w1, [x0]213; CHECK-NEXT: ret214;215; CHECK-DEFAULT-LABEL: stp_aligned_int32_t:216; CHECK-DEFAULT: // %bb.0:217; CHECK-DEFAULT-NEXT: and x0, x0, #0xffffffffffffffc0218; CHECK-DEFAULT-NEXT: stp w1, w1, [x0]219; CHECK-DEFAULT-NEXT: ret220;221; CHECK-DISABLE-STP-LABEL: stp_aligned_int32_t:222; CHECK-DISABLE-STP: // %bb.0:223; CHECK-DISABLE-STP-NEXT: and x0, x0, #0xffffffffffffffc0224; CHECK-DISABLE-STP-NEXT: str w1, [x0]225; CHECK-DISABLE-STP-NEXT: str w1, [x0, #4]226; CHECK-DISABLE-STP-NEXT: ret227 %3 = ptrtoint ptr %0 to i64228 %4 = and i64 %3, -64229 %5 = inttoptr i64 %4 to ptr230 store i32 %1, ptr %5, align 64231 %6 = getelementptr inbounds i32, ptr %5, i64 1232 store i32 %1, ptr %6, align 4233 ret ptr %5234}235 236define dso_local ptr @stp_aligned_int64_t(ptr %0, i64 %1) #0 {237; CHECK-LABEL: stp_aligned_int64_t:238; CHECK: // %bb.0:239; CHECK-NEXT: and x0, x0, #0xffffffffffffff80240; CHECK-NEXT: stp x1, x1, [x0]241; CHECK-NEXT: ret242;243; CHECK-DEFAULT-LABEL: stp_aligned_int64_t:244; CHECK-DEFAULT: // %bb.0:245; CHECK-DEFAULT-NEXT: and x0, x0, #0xffffffffffffff80246; CHECK-DEFAULT-NEXT: stp x1, x1, [x0]247; CHECK-DEFAULT-NEXT: ret248;249; CHECK-DISABLE-STP-LABEL: stp_aligned_int64_t:250; CHECK-DISABLE-STP: // %bb.0:251; CHECK-DISABLE-STP-NEXT: and x0, x0, #0xffffffffffffff80252; CHECK-DISABLE-STP-NEXT: str x1, [x0]253; CHECK-DISABLE-STP-NEXT: str x1, [x0, #8]254; CHECK-DISABLE-STP-NEXT: ret255 %3 = ptrtoint ptr %0 to i64256 %4 = and i64 %3, -128257 %5 = inttoptr i64 %4 to ptr258 store i64 %1, ptr %5, align 128259 %6 = getelementptr inbounds i64, ptr %5, i64 1260 store i64 %1, ptr %6, align 8261 ret ptr %5262}263 264define ptr @stp_aligned_v4si(ptr %0, <4 x i32> %1) #0 {265; CHECK-LABEL: stp_aligned_v4si:266; CHECK: // %bb.0:267; CHECK-NEXT: and x0, x0, #0xffffffffffffff00268; CHECK-NEXT: stp q0, q0, [x0]269; CHECK-NEXT: ret270;271; CHECK-DEFAULT-LABEL: stp_aligned_v4si:272; CHECK-DEFAULT: // %bb.0:273; CHECK-DEFAULT-NEXT: and x0, x0, #0xffffffffffffff00274; CHECK-DEFAULT-NEXT: stp q0, q0, [x0]275; CHECK-DEFAULT-NEXT: ret276;277; CHECK-DISABLE-STP-LABEL: stp_aligned_v4si:278; CHECK-DISABLE-STP: // %bb.0:279; CHECK-DISABLE-STP-NEXT: and x0, x0, #0xffffffffffffff00280; CHECK-DISABLE-STP-NEXT: str q0, [x0]281; CHECK-DISABLE-STP-NEXT: str q0, [x0, #16]282; CHECK-DISABLE-STP-NEXT: ret283 %3 = ptrtoint ptr %0 to i64284 %4 = and i64 %3, -256285 %5 = inttoptr i64 %4 to ptr286 store <4 x i32> %1, ptr %5, align 256287 %6 = getelementptr inbounds <4 x i32>, ptr %5, i64 1288 store <4 x i32> %1, ptr %6, align 16289 ret ptr %5290}291 292define ptr @stp_unaligned_int32_t(ptr %0, i32 %1) #0 {293; CHECK-LABEL: stp_unaligned_int32_t:294; CHECK: // %bb.0:295; CHECK-NEXT: and x8, x0, #0xffffffffffffffc0296; CHECK-NEXT: orr x0, x8, #0x4297; CHECK-NEXT: str w1, [x8, #4]298; CHECK-NEXT: str w1, [x8, #8]299; CHECK-NEXT: ret300;301; CHECK-DEFAULT-LABEL: stp_unaligned_int32_t:302; CHECK-DEFAULT: // %bb.0:303; CHECK-DEFAULT-NEXT: and x8, x0, #0xffffffffffffffc0304; CHECK-DEFAULT-NEXT: orr x0, x8, #0x4305; CHECK-DEFAULT-NEXT: stp w1, w1, [x8, #4]306; CHECK-DEFAULT-NEXT: ret307;308; CHECK-DISABLE-STP-LABEL: stp_unaligned_int32_t:309; CHECK-DISABLE-STP: // %bb.0:310; CHECK-DISABLE-STP-NEXT: and x8, x0, #0xffffffffffffffc0311; CHECK-DISABLE-STP-NEXT: orr x0, x8, #0x4312; CHECK-DISABLE-STP-NEXT: str w1, [x8, #4]313; CHECK-DISABLE-STP-NEXT: str w1, [x8, #8]314; CHECK-DISABLE-STP-NEXT: ret315 %3 = ptrtoint ptr %0 to i64316 %4 = and i64 %3, -64317 %5 = inttoptr i64 %4 to ptr318 %6 = getelementptr inbounds i32, ptr %5, i64 1319 store i32 %1, ptr %6, align 4320 %7 = getelementptr inbounds i32, ptr %5, i64 2321 store i32 %1, ptr %7, align 8322 ret ptr %6323}324 325define ptr @stp_unaligned_int64_t(ptr %0, i64 %1) #0 {326; CHECK-LABEL: stp_unaligned_int64_t:327; CHECK: // %bb.0:328; CHECK-NEXT: and x8, x0, #0xffffffffffffff80329; CHECK-NEXT: orr x0, x8, #0x8330; CHECK-NEXT: str x1, [x8, #8]331; CHECK-NEXT: str x1, [x8, #16]332; CHECK-NEXT: ret333;334; CHECK-DEFAULT-LABEL: stp_unaligned_int64_t:335; CHECK-DEFAULT: // %bb.0:336; CHECK-DEFAULT-NEXT: and x8, x0, #0xffffffffffffff80337; CHECK-DEFAULT-NEXT: orr x0, x8, #0x8338; CHECK-DEFAULT-NEXT: stp x1, x1, [x8, #8]339; CHECK-DEFAULT-NEXT: ret340;341; CHECK-DISABLE-STP-LABEL: stp_unaligned_int64_t:342; CHECK-DISABLE-STP: // %bb.0:343; CHECK-DISABLE-STP-NEXT: and x8, x0, #0xffffffffffffff80344; CHECK-DISABLE-STP-NEXT: orr x0, x8, #0x8345; CHECK-DISABLE-STP-NEXT: str x1, [x8, #8]346; CHECK-DISABLE-STP-NEXT: str x1, [x8, #16]347; CHECK-DISABLE-STP-NEXT: ret348 %3 = ptrtoint ptr %0 to i64349 %4 = and i64 %3, -128350 %5 = inttoptr i64 %4 to ptr351 %6 = getelementptr inbounds i64, ptr %5, i64 1352 store i64 %1, ptr %6, align 8353 %7 = getelementptr inbounds i64, ptr %5, i64 2354 store i64 %1, ptr %7, align 16355 ret ptr %6356}357 358define ptr @stp_unaligned_v4si(ptr %0, <4 x i32> %1) #0 {359; CHECK-LABEL: stp_unaligned_v4si:360; CHECK: // %bb.0:361; CHECK-NEXT: and x8, x0, #0xffffffffffffff00362; CHECK-NEXT: orr x0, x8, #0x10363; CHECK-NEXT: str q0, [x8, #16]364; CHECK-NEXT: str q0, [x8, #32]365; CHECK-NEXT: ret366;367; CHECK-DEFAULT-LABEL: stp_unaligned_v4si:368; CHECK-DEFAULT: // %bb.0:369; CHECK-DEFAULT-NEXT: and x8, x0, #0xffffffffffffff00370; CHECK-DEFAULT-NEXT: orr x0, x8, #0x10371; CHECK-DEFAULT-NEXT: stp q0, q0, [x8, #16]372; CHECK-DEFAULT-NEXT: ret373;374; CHECK-DISABLE-STP-LABEL: stp_unaligned_v4si:375; CHECK-DISABLE-STP: // %bb.0:376; CHECK-DISABLE-STP-NEXT: and x8, x0, #0xffffffffffffff00377; CHECK-DISABLE-STP-NEXT: orr x0, x8, #0x10378; CHECK-DISABLE-STP-NEXT: str q0, [x8, #16]379; CHECK-DISABLE-STP-NEXT: str q0, [x8, #32]380; CHECK-DISABLE-STP-NEXT: ret381 %3 = ptrtoint ptr %0 to i64382 %4 = and i64 %3, -256383 %5 = inttoptr i64 %4 to ptr384 %6 = getelementptr inbounds <4 x i32>, ptr %5, i64 1385 store <4 x i32> %1, ptr %6, align 16386 %7 = getelementptr inbounds <4 x i32>, ptr %5, i64 2387 store <4 x i32> %1, ptr %7, align 32388 ret ptr %6389}390