334 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=aarch64-- | FileCheck %s3 4; Check that building up a vector w/ only one non-zero lane initializes5; efficiently.6 7define <8 x i8> @v8i8z(i8 %t, i8 %s) nounwind {8; CHECK-LABEL: v8i8z:9; CHECK: // %bb.0:10; CHECK-NEXT: movi v0.2d, #000000000000000011; CHECK-NEXT: mov v0.b[7], w112; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q013; CHECK-NEXT: ret14 %v = insertelement <8 x i8> <i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 undef>, i8 %s, i32 715 ret <8 x i8> %v16}17 18define <16 x i8> @v16i8z(i8 %t, i8 %s) nounwind {19; CHECK-LABEL: v16i8z:20; CHECK: // %bb.0:21; CHECK-NEXT: movi v0.2d, #000000000000000022; CHECK-NEXT: mov v0.b[15], w123; CHECK-NEXT: ret24 %v = insertelement <16 x i8> <i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 undef>, i8 %s, i32 1525 ret <16 x i8> %v26}27 28define <4 x i16> @v4i16z(i16 %t, i16 %s) nounwind {29; CHECK-LABEL: v4i16z:30; CHECK: // %bb.0:31; CHECK-NEXT: movi v0.2d, #000000000000000032; CHECK-NEXT: mov v0.h[3], w133; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q034; CHECK-NEXT: ret35 %v = insertelement <4 x i16> <i16 0, i16 0, i16 0, i16 undef>, i16 %s, i32 336 ret <4 x i16> %v37}38 39define <8 x i16> @v8i16z(i16 %t, i16 %s) nounwind {40; CHECK-LABEL: v8i16z:41; CHECK: // %bb.0:42; CHECK-NEXT: movi v0.2d, #000000000000000043; CHECK-NEXT: mov v0.h[7], w144; CHECK-NEXT: ret45 %v = insertelement <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 undef>, i16 %s, i32 746 ret <8 x i16> %v47}48 49define <2 x i32> @v2i32z(i32 %t, i32 %s) nounwind {50; CHECK-LABEL: v2i32z:51; CHECK: // %bb.0:52; CHECK-NEXT: movi v0.2d, #000000000000000053; CHECK-NEXT: mov v0.s[1], w154; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q055; CHECK-NEXT: ret56 %v = insertelement <2 x i32> <i32 0, i32 undef>, i32 %s, i32 157 ret <2 x i32> %v58}59 60define <4 x i32> @v4i32z(i32 %t, i32 %s) nounwind {61; CHECK-LABEL: v4i32z:62; CHECK: // %bb.0:63; CHECK-NEXT: movi v0.2d, #000000000000000064; CHECK-NEXT: mov v0.s[3], w165; CHECK-NEXT: ret66 %v = insertelement <4 x i32> <i32 0, i32 0, i32 0, i32 undef>, i32 %s, i32 367 ret <4 x i32> %v68}69 70define <2 x i64> @v2i64z(i64 %t, i64 %s) nounwind {71; CHECK-LABEL: v2i64z:72; CHECK: // %bb.0:73; CHECK-NEXT: movi v0.2d, #000000000000000074; CHECK-NEXT: mov v0.d[1], x175; CHECK-NEXT: ret76 %v = insertelement <2 x i64> <i64 0, i64 undef>, i64 %s, i32 177 ret <2 x i64> %v78}79 80define <2 x float> @v2f32z(float %t, float %s) nounwind {81; CHECK-LABEL: v2f32z:82; CHECK: // %bb.0:83; CHECK-NEXT: movi d0, #000000000000000084; CHECK-NEXT: // kill: def $s1 killed $s1 def $q185; CHECK-NEXT: mov v0.s[1], v1.s[0]86; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q087; CHECK-NEXT: ret88 %v = insertelement <2 x float> <float 0.0, float undef>, float %s, i32 189 ret <2 x float> %v90}91 92define <4 x float> @v4f32z(float %t, float %s) nounwind {93; CHECK-LABEL: v4f32z:94; CHECK: // %bb.0:95; CHECK-NEXT: movi v0.2d, #000000000000000096; CHECK-NEXT: // kill: def $s1 killed $s1 def $q197; CHECK-NEXT: mov v0.s[3], v1.s[0]98; CHECK-NEXT: ret99 %v = insertelement <4 x float> <float 0.0, float 0.0, float 0.0, float undef>, float %s, i32 3100 ret <4 x float> %v101}102 103define <2 x double> @v2f64z(double %t, double %s) nounwind {104; CHECK-LABEL: v2f64z:105; CHECK: // %bb.0:106; CHECK-NEXT: movi v0.2d, #0000000000000000107; CHECK-NEXT: // kill: def $d1 killed $d1 def $q1108; CHECK-NEXT: mov v0.d[1], v1.d[0]109; CHECK-NEXT: ret110 %v = insertelement <2 x double> <double 0.0, double undef>, double %s, i32 1111 ret <2 x double> %v112}113 114; Check that building up a vector w/ only one non-ones lane initializes115; efficiently.116 117define <8 x i8> @v8i8m(i8 %t, i8 %s) nounwind {118; CHECK-LABEL: v8i8m:119; CHECK: // %bb.0:120; CHECK-NEXT: movi v0.2d, #0xffffffffffffffff121; CHECK-NEXT: mov v0.b[7], w1122; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0123; CHECK-NEXT: ret124 %v = insertelement <8 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 undef>, i8 %s, i32 7125 ret <8 x i8> %v126}127 128define <16 x i8> @v16i8m(i8 %t, i8 %s) nounwind {129; CHECK-LABEL: v16i8m:130; CHECK: // %bb.0:131; CHECK-NEXT: movi v0.2d, #0xffffffffffffffff132; CHECK-NEXT: mov v0.b[15], w1133; CHECK-NEXT: ret134 %v = insertelement <16 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 undef>, i8 %s, i32 15135 ret <16 x i8> %v136}137 138define <4 x i16> @v4i16m(i16 %t, i16 %s) nounwind {139; CHECK-LABEL: v4i16m:140; CHECK: // %bb.0:141; CHECK-NEXT: movi v0.2d, #0xffffffffffffffff142; CHECK-NEXT: mov v0.h[3], w1143; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0144; CHECK-NEXT: ret145 %v = insertelement <4 x i16> <i16 -1, i16 -1, i16 -1, i16 undef>, i16 %s, i32 3146 ret <4 x i16> %v147}148 149define <8 x i16> @v8i16m(i16 %t, i16 %s) nounwind {150; CHECK-LABEL: v8i16m:151; CHECK: // %bb.0:152; CHECK-NEXT: movi v0.2d, #0xffffffffffffffff153; CHECK-NEXT: mov v0.h[7], w1154; CHECK-NEXT: ret155 %v = insertelement <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 undef>, i16 %s, i32 7156 ret <8 x i16> %v157}158 159define <2 x i32> @v2i32m(i32 %t, i32 %s) nounwind {160; CHECK-LABEL: v2i32m:161; CHECK: // %bb.0:162; CHECK-NEXT: movi v0.2d, #0xffffffffffffffff163; CHECK-NEXT: mov v0.s[1], w1164; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0165; CHECK-NEXT: ret166 %v = insertelement <2 x i32> <i32 -1, i32 undef>, i32 %s, i32 1167 ret <2 x i32> %v168}169 170define <4 x i32> @v4i32m(i32 %t, i32 %s) nounwind {171; CHECK-LABEL: v4i32m:172; CHECK: // %bb.0:173; CHECK-NEXT: movi v0.2d, #0xffffffffffffffff174; CHECK-NEXT: mov v0.s[3], w1175; CHECK-NEXT: ret176 %v = insertelement <4 x i32> <i32 -1, i32 -1, i32 -1, i32 undef>, i32 %s, i32 3177 ret <4 x i32> %v178}179 180define <2 x i64> @v2i64m(i64 %t, i64 %s) nounwind {181; CHECK-LABEL: v2i64m:182; CHECK: // %bb.0:183; CHECK-NEXT: movi v0.2d, #0xffffffffffffffff184; CHECK-NEXT: mov v0.d[1], x1185; CHECK-NEXT: ret186 %v = insertelement <2 x i64> <i64 -1, i64 undef>, i64 %s, i32 1187 ret <2 x i64> %v188}189 190; Check that building up a vector w/ some constants initializes efficiently.191 192define void @v8i8st(ptr %p, i8 %s) nounwind {193; CHECK-LABEL: v8i8st:194; CHECK: // %bb.0:195; CHECK-NEXT: movi v0.8b, #1196; CHECK-NEXT: mov v0.b[7], w1197; CHECK-NEXT: str d0, [x0]198; CHECK-NEXT: ret199 %v = insertelement <8 x i8> <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 undef>, i8 %s, i32 7200 store <8 x i8> %v, ptr %p, align 8201 ret void202}203 204define void @v16i8st(ptr %p, i8 %s) nounwind {205; CHECK-LABEL: v16i8st:206; CHECK: // %bb.0:207; CHECK-NEXT: movi v0.16b, #128208; CHECK-NEXT: mov v0.b[15], w1209; CHECK-NEXT: str q0, [x0]210; CHECK-NEXT: ret211 %v = insertelement <16 x i8> <i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 -128, i8 undef>, i8 %s, i32 15212 store <16 x i8> %v, ptr %p, align 16213 ret void214}215 216define void @v4i16st(ptr %p, i16 %s) nounwind {217; CHECK-LABEL: v4i16st:218; CHECK: // %bb.0:219; CHECK-NEXT: movi v0.4h, #85, lsl #8220; CHECK-NEXT: mov v0.h[3], w1221; CHECK-NEXT: str d0, [x0]222; CHECK-NEXT: ret223 %v = insertelement <4 x i16> <i16 21760, i16 21760, i16 21760, i16 undef>, i16 %s, i32 3224 store <4 x i16> %v, ptr %p, align 8225 ret void226}227 228define void @v8i16st(ptr %p, i16 %s) nounwind {229; CHECK-LABEL: v8i16st:230; CHECK: // %bb.0:231; CHECK-NEXT: mvni v0.8h, #85, lsl #8232; CHECK-NEXT: mov v0.h[7], w1233; CHECK-NEXT: str q0, [x0]234; CHECK-NEXT: ret235 %v = insertelement <8 x i16> <i16 -21761, i16 -21761, i16 -21761, i16 -21761, i16 -21761, i16 -21761, i16 -21761, i16 undef>, i16 %s, i32 7236 store <8 x i16> %v, ptr %p, align 16237 ret void238}239 240define void @v2i32st(ptr %p, i32 %s) nounwind {241; CHECK-LABEL: v2i32st:242; CHECK: // %bb.0:243; CHECK-NEXT: movi v0.2s, #15, lsl #16244; CHECK-NEXT: mov v0.s[1], w1245; CHECK-NEXT: str d0, [x0]246; CHECK-NEXT: ret247 %v = insertelement <2 x i32> <i32 983040, i32 undef>, i32 %s, i32 1248 store <2 x i32> %v, ptr %p, align 8249 ret void250}251 252define void @v4i32st(ptr %p, i32 %s) nounwind {253; CHECK-LABEL: v4i32st:254; CHECK: // %bb.0:255; CHECK-NEXT: movi v0.4s, #248, msl #16256; CHECK-NEXT: mov v0.s[3], w1257; CHECK-NEXT: str q0, [x0]258; CHECK-NEXT: ret259 %v = insertelement <4 x i32> <i32 16318463, i32 16318463, i32 16318463, i32 undef>, i32 %s, i32 3260 store <4 x i32> %v, ptr %p, align 16261 ret void262}263 264define void @v2i64st(ptr %p, i64 %s) nounwind {265; CHECK-LABEL: v2i64st:266; CHECK: // %bb.0:267; CHECK-NEXT: fmov v0.2d, #-2.00000000268; CHECK-NEXT: mov v0.d[1], x1269; CHECK-NEXT: str q0, [x0]270; CHECK-NEXT: ret271 %v = insertelement <2 x i64> <i64 13835058055282163712, i64 undef>, i64 %s, i32 1272 store <2 x i64> %v, ptr %p, align 16273 ret void274}275 276define void @v2f32st(ptr %p, float %s) nounwind {277; CHECK-LABEL: v2f32st:278; CHECK: // %bb.0:279; CHECK-NEXT: movi v1.2s, #64, lsl #24280; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0281; CHECK-NEXT: mov v1.s[1], v0.s[0]282; CHECK-NEXT: str d1, [x0]283; CHECK-NEXT: ret284 %v = insertelement <2 x float> <float 2.0, float undef>, float %s, i32 1285 store <2 x float> %v, ptr %p, align 8286 ret void287}288 289define void @v4f32st(ptr %p, float %s) nounwind {290; CHECK-LABEL: v4f32st:291; CHECK: // %bb.0:292; CHECK-NEXT: movi v1.4s, #192, lsl #24293; CHECK-NEXT: // kill: def $s0 killed $s0 def $q0294; CHECK-NEXT: mov v1.s[3], v0.s[0]295; CHECK-NEXT: str q1, [x0]296; CHECK-NEXT: ret297 %v = insertelement <4 x float> <float -2.0, float -2.0, float -2.0, float undef>, float %s, i32 3298 store <4 x float> %v, ptr %p, align 16299 ret void300}301 302define void @v2f64st(ptr %p, double %s) nounwind {303; CHECK-LABEL: v2f64st:304; CHECK: // %bb.0:305; CHECK-NEXT: fmov v1.2d, #2.00000000306; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0307; CHECK-NEXT: mov v1.d[1], v0.d[0]308; CHECK-NEXT: str q1, [x0]309; CHECK-NEXT: ret310 %v = insertelement <2 x double> <double 2.0, double undef>, double %s, i32 1311 store <2 x double> %v, ptr %p, align 16312 ret void313}314 315; In this test the illegal type has a preferred alignment greater than the316; stack alignment, that gets reduced to the alignment of a broken down317; legal type.318define <32 x i8> @test_lanex_32xi8(<32 x i8> %a, i32 %x) {319; CHECK-LABEL: test_lanex_32xi8:320; CHECK: // %bb.0:321; CHECK-NEXT: stp q0, q1, [sp, #-32]!322; CHECK-NEXT: .cfi_def_cfa_offset 32323; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0324; CHECK-NEXT: and x8, x0, #0x1f325; CHECK-NEXT: mov x9, sp326; CHECK-NEXT: mov w10, #30 // =0x1e327; CHECK-NEXT: strb w10, [x9, x8]328; CHECK-NEXT: ldp q0, q1, [sp], #32329; CHECK-NEXT: ret330 %b = insertelement <32 x i8> %a, i8 30, i32 %x331 ret <32 x i8> %b332}333 334