392 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mattr=+sve -force-streaming-compatible < %s | FileCheck %s3; RUN: llc -mattr=+sme -force-streaming < %s | FileCheck %s4; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE5 6target triple = "aarch64-unknown-linux-gnu"7 8define <8 x i16> @load_zext_v8i8i16(ptr %ap) {9; CHECK-LABEL: load_zext_v8i8i16:10; CHECK: // %bb.0:11; CHECK-NEXT: ptrue p0.h, vl812; CHECK-NEXT: ld1b { z0.h }, p0/z, [x0]13; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z014; CHECK-NEXT: ret15;16; NONEON-NOSVE-LABEL: load_zext_v8i8i16:17; NONEON-NOSVE: // %bb.0:18; NONEON-NOSVE-NEXT: sub sp, sp, #3219; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 3220; NONEON-NOSVE-NEXT: ldr d0, [x0]21; NONEON-NOSVE-NEXT: str d0, [sp, #8]22; NONEON-NOSVE-NEXT: ldrb w8, [sp, #15]23; NONEON-NOSVE-NEXT: strh w8, [sp, #30]24; NONEON-NOSVE-NEXT: ldrb w8, [sp, #14]25; NONEON-NOSVE-NEXT: strh w8, [sp, #28]26; NONEON-NOSVE-NEXT: ldrb w8, [sp, #13]27; NONEON-NOSVE-NEXT: strh w8, [sp, #26]28; NONEON-NOSVE-NEXT: ldrb w8, [sp, #12]29; NONEON-NOSVE-NEXT: strh w8, [sp, #24]30; NONEON-NOSVE-NEXT: ldrb w8, [sp, #11]31; NONEON-NOSVE-NEXT: strh w8, [sp, #22]32; NONEON-NOSVE-NEXT: ldrb w8, [sp, #10]33; NONEON-NOSVE-NEXT: strh w8, [sp, #20]34; NONEON-NOSVE-NEXT: ldrb w8, [sp, #9]35; NONEON-NOSVE-NEXT: strh w8, [sp, #18]36; NONEON-NOSVE-NEXT: ldrb w8, [sp, #8]37; NONEON-NOSVE-NEXT: strh w8, [sp, #16]38; NONEON-NOSVE-NEXT: ldr q0, [sp, #16]39; NONEON-NOSVE-NEXT: add sp, sp, #3240; NONEON-NOSVE-NEXT: ret41 %a = load <8 x i8>, ptr %ap42 %val = zext <8 x i8> %a to <8 x i16>43 ret <8 x i16> %val44}45 46define <4 x i32> @load_zext_v4i16i32(ptr %ap) {47; CHECK-LABEL: load_zext_v4i16i32:48; CHECK: // %bb.0:49; CHECK-NEXT: ptrue p0.s, vl450; CHECK-NEXT: ld1h { z0.s }, p0/z, [x0]51; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z052; CHECK-NEXT: ret53;54; NONEON-NOSVE-LABEL: load_zext_v4i16i32:55; NONEON-NOSVE: // %bb.0:56; NONEON-NOSVE-NEXT: sub sp, sp, #3257; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 3258; NONEON-NOSVE-NEXT: ldr d0, [x0]59; NONEON-NOSVE-NEXT: str d0, [sp, #8]60; NONEON-NOSVE-NEXT: ldrh w9, [sp, #14]61; NONEON-NOSVE-NEXT: ldrh w8, [sp, #12]62; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #24]63; NONEON-NOSVE-NEXT: ldrh w9, [sp, #10]64; NONEON-NOSVE-NEXT: ldrh w8, [sp, #8]65; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #16]66; NONEON-NOSVE-NEXT: ldr q0, [sp, #16]67; NONEON-NOSVE-NEXT: add sp, sp, #3268; NONEON-NOSVE-NEXT: ret69 %a = load <4 x i16>, ptr %ap70 %val = zext <4 x i16> %a to <4 x i32>71 ret <4 x i32> %val72}73 74define <2 x i64> @load_zext_v2i32i64(ptr %ap) {75; CHECK-LABEL: load_zext_v2i32i64:76; CHECK: // %bb.0:77; CHECK-NEXT: ptrue p0.d, vl278; CHECK-NEXT: ld1w { z0.d }, p0/z, [x0]79; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z080; CHECK-NEXT: ret81;82; NONEON-NOSVE-LABEL: load_zext_v2i32i64:83; NONEON-NOSVE: // %bb.0:84; NONEON-NOSVE-NEXT: sub sp, sp, #3285; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 3286; NONEON-NOSVE-NEXT: ldr d0, [x0]87; NONEON-NOSVE-NEXT: str d0, [sp, #8]88; NONEON-NOSVE-NEXT: ldp w8, w9, [sp, #8]89; NONEON-NOSVE-NEXT: stp w9, wzr, [sp, #24]90; NONEON-NOSVE-NEXT: stp w8, wzr, [sp, #16]91; NONEON-NOSVE-NEXT: ldr q0, [sp, #16]92; NONEON-NOSVE-NEXT: add sp, sp, #3293; NONEON-NOSVE-NEXT: ret94 %a = load <2 x i32>, ptr %ap95 %val = zext <2 x i32> %a to <2 x i64>96 ret <2 x i64> %val97}98 99define <2 x i256> @load_zext_v2i64i256(ptr %ap) {100; CHECK-LABEL: load_zext_v2i64i256:101; CHECK: // %bb.0:102; CHECK-NEXT: ldp x8, x4, [x0]103; CHECK-NEXT: mov x1, xzr104; CHECK-NEXT: mov x2, xzr105; CHECK-NEXT: mov x3, xzr106; CHECK-NEXT: mov x5, xzr107; CHECK-NEXT: mov x6, xzr108; CHECK-NEXT: mov x7, xzr109; CHECK-NEXT: mov x0, x8110; CHECK-NEXT: ret111;112; NONEON-NOSVE-LABEL: load_zext_v2i64i256:113; NONEON-NOSVE: // %bb.0:114; NONEON-NOSVE-NEXT: ldr q0, [x0]115; NONEON-NOSVE-NEXT: str q0, [sp, #-16]!116; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16117; NONEON-NOSVE-NEXT: ldp x0, x4, [sp], #16118; NONEON-NOSVE-NEXT: mov x1, xzr119; NONEON-NOSVE-NEXT: mov x2, xzr120; NONEON-NOSVE-NEXT: mov x3, xzr121; NONEON-NOSVE-NEXT: mov x5, xzr122; NONEON-NOSVE-NEXT: mov x6, xzr123; NONEON-NOSVE-NEXT: mov x7, xzr124; NONEON-NOSVE-NEXT: ret125 %a = load <2 x i64>, ptr %ap126 %val = zext <2 x i64> %a to <2 x i256>127 ret <2 x i256> %val128}129 130define <16 x i32> @load_sext_v16i8i32(ptr %ap) {131; CHECK-LABEL: load_sext_v16i8i32:132; CHECK: // %bb.0:133; CHECK-NEXT: ptrue p0.s, vl4134; CHECK-NEXT: mov w8, #4 // =0x4135; CHECK-NEXT: mov w9, #8 // =0x8136; CHECK-NEXT: mov w10, #12 // =0xc137; CHECK-NEXT: ld1sb { z0.s }, p0/z, [x0]138; CHECK-NEXT: ld1sb { z1.s }, p0/z, [x0, x8]139; CHECK-NEXT: ld1sb { z2.s }, p0/z, [x0, x9]140; CHECK-NEXT: ld1sb { z3.s }, p0/z, [x0, x10]141; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0142; CHECK-NEXT: // kill: def $q1 killed $q1 killed $z1143; CHECK-NEXT: // kill: def $q2 killed $q2 killed $z2144; CHECK-NEXT: // kill: def $q3 killed $q3 killed $z3145; CHECK-NEXT: ret146;147; NONEON-NOSVE-LABEL: load_sext_v16i8i32:148; NONEON-NOSVE: // %bb.0:149; NONEON-NOSVE-NEXT: ldr q0, [x0]150; NONEON-NOSVE-NEXT: str q0, [sp, #-96]!151; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 96152; NONEON-NOSVE-NEXT: ldp d1, d0, [sp]153; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16]154; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #27]155; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #26]156; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #88]157; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #25]158; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #24]159; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #80]160; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #31]161; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #30]162; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #72]163; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #29]164; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #28]165; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #64]166; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #19]167; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #18]168; NONEON-NOSVE-NEXT: ldp q1, q0, [sp, #64]169; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #56]170; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #17]171; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #16]172; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #48]173; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #23]174; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #22]175; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #40]176; NONEON-NOSVE-NEXT: ldrsb w9, [sp, #21]177; NONEON-NOSVE-NEXT: ldrsb w8, [sp, #20]178; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #32]179; NONEON-NOSVE-NEXT: ldp q3, q2, [sp, #32]180; NONEON-NOSVE-NEXT: add sp, sp, #96181; NONEON-NOSVE-NEXT: ret182 %a = load <16 x i8>, ptr %ap183 %val = sext <16 x i8> %a to <16 x i32>184 ret <16 x i32> %val185}186 187define <8 x i32> @load_sext_v8i16i32(ptr %ap) {188; CHECK-LABEL: load_sext_v8i16i32:189; CHECK: // %bb.0:190; CHECK-NEXT: ptrue p0.s, vl4191; CHECK-NEXT: mov x8, #4 // =0x4192; CHECK-NEXT: ld1sh { z1.s }, p0/z, [x0, x8, lsl #1]193; CHECK-NEXT: ld1sh { z0.s }, p0/z, [x0]194; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0195; CHECK-NEXT: // kill: def $q1 killed $q1 killed $z1196; CHECK-NEXT: ret197;198; NONEON-NOSVE-LABEL: load_sext_v8i16i32:199; NONEON-NOSVE: // %bb.0:200; NONEON-NOSVE-NEXT: ldr q0, [x0]201; NONEON-NOSVE-NEXT: str q0, [sp, #-64]!202; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 64203; NONEON-NOSVE-NEXT: ldp d1, d0, [sp]204; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16]205; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #30]206; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #28]207; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #56]208; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #26]209; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #24]210; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #48]211; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #22]212; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #20]213; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #40]214; NONEON-NOSVE-NEXT: ldrsh w9, [sp, #18]215; NONEON-NOSVE-NEXT: ldrsh w8, [sp, #16]216; NONEON-NOSVE-NEXT: stp w8, w9, [sp, #32]217; NONEON-NOSVE-NEXT: ldp q1, q0, [sp, #32]218; NONEON-NOSVE-NEXT: add sp, sp, #64219; NONEON-NOSVE-NEXT: ret220 %a = load <8 x i16>, ptr %ap221 %val = sext <8 x i16> %a to <8 x i32>222 ret <8 x i32> %val223}224 225define <4 x i256> @load_sext_v4i32i256(ptr %ap) {226; CHECK-LABEL: load_sext_v4i32i256:227; CHECK: // %bb.0:228; CHECK-NEXT: ldr q0, [x0]229; CHECK-NEXT: sunpklo z1.d, z0.s230; CHECK-NEXT: ext z0.b, z0.b, z0.b, #8231; CHECK-NEXT: sunpklo z0.d, z0.s232; CHECK-NEXT: fmov x9, d1233; CHECK-NEXT: mov z1.d, z1.d[1]234; CHECK-NEXT: fmov x11, d0235; CHECK-NEXT: mov z0.d, z0.d[1]236; CHECK-NEXT: asr x10, x9, #63237; CHECK-NEXT: stp x9, x10, [x8]238; CHECK-NEXT: fmov x9, d1239; CHECK-NEXT: asr x12, x11, #63240; CHECK-NEXT: stp x10, x10, [x8, #16]241; CHECK-NEXT: stp x11, x12, [x8, #64]242; CHECK-NEXT: fmov x11, d0243; CHECK-NEXT: asr x10, x9, #63244; CHECK-NEXT: stp x12, x12, [x8, #80]245; CHECK-NEXT: stp x10, x10, [x8, #48]246; CHECK-NEXT: asr x12, x11, #63247; CHECK-NEXT: stp x9, x10, [x8, #32]248; CHECK-NEXT: stp x12, x12, [x8, #112]249; CHECK-NEXT: stp x11, x12, [x8, #96]250; CHECK-NEXT: ret251;252; NONEON-NOSVE-LABEL: load_sext_v4i32i256:253; NONEON-NOSVE: // %bb.0:254; NONEON-NOSVE-NEXT: ldr q0, [x0]255; NONEON-NOSVE-NEXT: str q0, [sp, #-32]!256; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 32257; NONEON-NOSVE-NEXT: ldp d1, d0, [sp]258; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #16]259; NONEON-NOSVE-NEXT: ldpsw x11, x9, [sp, #16]260; NONEON-NOSVE-NEXT: ldpsw x12, x13, [sp, #24]261; NONEON-NOSVE-NEXT: asr x10, x9, #63262; NONEON-NOSVE-NEXT: asr x14, x11, #63263; NONEON-NOSVE-NEXT: stp x10, x10, [x8, #112]264; NONEON-NOSVE-NEXT: stp x9, x10, [x8, #96]265; NONEON-NOSVE-NEXT: asr x9, x13, #63266; NONEON-NOSVE-NEXT: asr x10, x12, #63267; NONEON-NOSVE-NEXT: stp x14, x14, [x8, #80]268; NONEON-NOSVE-NEXT: stp x11, x14, [x8, #64]269; NONEON-NOSVE-NEXT: stp x9, x9, [x8, #48]270; NONEON-NOSVE-NEXT: stp x13, x9, [x8, #32]271; NONEON-NOSVE-NEXT: stp x10, x10, [x8, #16]272; NONEON-NOSVE-NEXT: stp x12, x10, [x8]273; NONEON-NOSVE-NEXT: add sp, sp, #32274; NONEON-NOSVE-NEXT: ret275 %a = load <4 x i32>, ptr %ap276 %val = sext <4 x i32> %a to <4 x i256>277 ret <4 x i256> %val278}279 280define <2 x i256> @load_sext_v2i64i256(ptr %ap) {281; CHECK-LABEL: load_sext_v2i64i256:282; CHECK: // %bb.0:283; CHECK-NEXT: ldp x8, x4, [x0]284; CHECK-NEXT: asr x1, x8, #63285; CHECK-NEXT: asr x5, x4, #63286; CHECK-NEXT: mov x0, x8287; CHECK-NEXT: mov x2, x1288; CHECK-NEXT: mov x3, x1289; CHECK-NEXT: mov x6, x5290; CHECK-NEXT: mov x7, x5291; CHECK-NEXT: ret292;293; NONEON-NOSVE-LABEL: load_sext_v2i64i256:294; NONEON-NOSVE: // %bb.0:295; NONEON-NOSVE-NEXT: ldr q0, [x0]296; NONEON-NOSVE-NEXT: str q0, [sp, #-16]!297; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 16298; NONEON-NOSVE-NEXT: ldp x0, x4, [sp], #16299; NONEON-NOSVE-NEXT: asr x1, x0, #63300; NONEON-NOSVE-NEXT: asr x5, x4, #63301; NONEON-NOSVE-NEXT: mov x2, x1302; NONEON-NOSVE-NEXT: mov x3, x1303; NONEON-NOSVE-NEXT: mov x6, x5304; NONEON-NOSVE-NEXT: mov x7, x5305; NONEON-NOSVE-NEXT: ret306 %a = load <2 x i64>, ptr %ap307 %val = sext <2 x i64> %a to <2 x i256>308 ret <2 x i256> %val309}310 311define <16 x i64> @load_zext_v16i16i64(ptr %ap) {312; CHECK-LABEL: load_zext_v16i16i64:313; CHECK: // %bb.0:314; CHECK-NEXT: ptrue p0.d, vl2315; CHECK-NEXT: mov x8, #2 // =0x2316; CHECK-NEXT: mov x9, #4 // =0x4317; CHECK-NEXT: mov x10, #6 // =0x6318; CHECK-NEXT: ld1h { z1.d }, p0/z, [x0, x8, lsl #1]319; CHECK-NEXT: mov x8, #8 // =0x8320; CHECK-NEXT: ld1h { z2.d }, p0/z, [x0, x9, lsl #1]321; CHECK-NEXT: ld1h { z3.d }, p0/z, [x0, x10, lsl #1]322; CHECK-NEXT: mov x9, #10 // =0xa323; CHECK-NEXT: ld1h { z4.d }, p0/z, [x0, x8, lsl #1]324; CHECK-NEXT: mov x8, #12 // =0xc325; CHECK-NEXT: mov x10, #14 // =0xe326; CHECK-NEXT: ld1h { z0.d }, p0/z, [x0]327; CHECK-NEXT: ld1h { z5.d }, p0/z, [x0, x9, lsl #1]328; CHECK-NEXT: ld1h { z6.d }, p0/z, [x0, x8, lsl #1]329; CHECK-NEXT: ld1h { z7.d }, p0/z, [x0, x10, lsl #1]330; CHECK-NEXT: // kill: def $q0 killed $q0 killed $z0331; CHECK-NEXT: // kill: def $q1 killed $q1 killed $z1332; CHECK-NEXT: // kill: def $q2 killed $q2 killed $z2333; CHECK-NEXT: // kill: def $q3 killed $q3 killed $z3334; CHECK-NEXT: // kill: def $q4 killed $q4 killed $z4335; CHECK-NEXT: // kill: def $q5 killed $q5 killed $z5336; CHECK-NEXT: // kill: def $q6 killed $q6 killed $z6337; CHECK-NEXT: // kill: def $q7 killed $q7 killed $z7338; CHECK-NEXT: ret339;340; NONEON-NOSVE-LABEL: load_zext_v16i16i64:341; NONEON-NOSVE: // %bb.0:342; NONEON-NOSVE-NEXT: sub sp, sp, #192343; NONEON-NOSVE-NEXT: .cfi_def_cfa_offset 192344; NONEON-NOSVE-NEXT: ldp q0, q1, [x0]345; NONEON-NOSVE-NEXT: stp q0, q1, [sp]346; NONEON-NOSVE-NEXT: ldp d1, d0, [sp]347; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #32]348; NONEON-NOSVE-NEXT: ldp d1, d0, [sp, #16]349; NONEON-NOSVE-NEXT: ldrh w8, [sp, #42]350; NONEON-NOSVE-NEXT: stp w8, wzr, [sp, #120]351; NONEON-NOSVE-NEXT: ldrh w8, [sp, #40]352; NONEON-NOSVE-NEXT: stp d0, d1, [sp, #48]353; NONEON-NOSVE-NEXT: stp w8, wzr, [sp, #112]354; NONEON-NOSVE-NEXT: ldrh w8, [sp, #46]355; NONEON-NOSVE-NEXT: stp w8, wzr, [sp, #104]356; NONEON-NOSVE-NEXT: ldrh w8, [sp, #44]357; NONEON-NOSVE-NEXT: stp w8, wzr, [sp, #96]358; NONEON-NOSVE-NEXT: ldrh w8, [sp, #34]359; NONEON-NOSVE-NEXT: ldp q1, q0, [sp, #96]360; NONEON-NOSVE-NEXT: stp w8, wzr, [sp, #88]361; NONEON-NOSVE-NEXT: ldrh w8, [sp, #32]362; NONEON-NOSVE-NEXT: stp w8, wzr, [sp, #80]363; NONEON-NOSVE-NEXT: ldrh w8, [sp, #38]364; NONEON-NOSVE-NEXT: stp w8, wzr, [sp, #72]365; NONEON-NOSVE-NEXT: ldrh w8, [sp, #36]366; NONEON-NOSVE-NEXT: stp w8, wzr, [sp, #64]367; NONEON-NOSVE-NEXT: ldrh w8, [sp, #58]368; NONEON-NOSVE-NEXT: ldp q3, q2, [sp, #64]369; NONEON-NOSVE-NEXT: stp w8, wzr, [sp, #184]370; NONEON-NOSVE-NEXT: ldrh w8, [sp, #56]371; NONEON-NOSVE-NEXT: stp w8, wzr, [sp, #176]372; NONEON-NOSVE-NEXT: ldrh w8, [sp, #62]373; NONEON-NOSVE-NEXT: stp w8, wzr, [sp, #168]374; NONEON-NOSVE-NEXT: ldrh w8, [sp, #60]375; NONEON-NOSVE-NEXT: stp w8, wzr, [sp, #160]376; NONEON-NOSVE-NEXT: ldrh w8, [sp, #50]377; NONEON-NOSVE-NEXT: ldp q5, q4, [sp, #160]378; NONEON-NOSVE-NEXT: stp w8, wzr, [sp, #152]379; NONEON-NOSVE-NEXT: ldrh w8, [sp, #48]380; NONEON-NOSVE-NEXT: stp w8, wzr, [sp, #144]381; NONEON-NOSVE-NEXT: ldrh w8, [sp, #54]382; NONEON-NOSVE-NEXT: stp w8, wzr, [sp, #136]383; NONEON-NOSVE-NEXT: ldrh w8, [sp, #52]384; NONEON-NOSVE-NEXT: stp w8, wzr, [sp, #128]385; NONEON-NOSVE-NEXT: ldp q7, q6, [sp, #128]386; NONEON-NOSVE-NEXT: add sp, sp, #192387; NONEON-NOSVE-NEXT: ret388 %a = load <16 x i16>, ptr %ap389 %val = zext <16 x i16> %a to <16 x i64>390 ret <16 x i64> %val391}392