891 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve < %s | FileCheck %s3 4;; Splats of legal integer vector types5 6define <vscale x 16 x i8> @sve_splat_16xi8(i8 %val) {7; CHECK-LABEL: sve_splat_16xi8:8; CHECK: // %bb.0:9; CHECK-NEXT: mov z0.b, w010; CHECK-NEXT: ret11 %ins = insertelement <vscale x 16 x i8> poison, i8 %val, i32 012 %splat = shufflevector <vscale x 16 x i8> %ins, <vscale x 16 x i8> poison, <vscale x 16 x i32> zeroinitializer13 ret <vscale x 16 x i8> %splat14}15 16define <vscale x 8 x i16> @sve_splat_8xi16(i16 %val) {17; CHECK-LABEL: sve_splat_8xi16:18; CHECK: // %bb.0:19; CHECK-NEXT: mov z0.h, w020; CHECK-NEXT: ret21 %ins = insertelement <vscale x 8 x i16> poison, i16 %val, i32 022 %splat = shufflevector <vscale x 8 x i16> %ins, <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer23 ret <vscale x 8 x i16> %splat24}25 26define <vscale x 4 x i32> @sve_splat_4xi32(i32 %val) {27; CHECK-LABEL: sve_splat_4xi32:28; CHECK: // %bb.0:29; CHECK-NEXT: mov z0.s, w030; CHECK-NEXT: ret31 %ins = insertelement <vscale x 4 x i32> poison, i32 %val, i32 032 %splat = shufflevector <vscale x 4 x i32> %ins, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer33 ret <vscale x 4 x i32> %splat34}35 36define <vscale x 2 x i64> @sve_splat_2xi64(i64 %val) {37; CHECK-LABEL: sve_splat_2xi64:38; CHECK: // %bb.0:39; CHECK-NEXT: mov z0.d, x040; CHECK-NEXT: ret41 %ins = insertelement <vscale x 2 x i64> poison, i64 %val, i32 042 %splat = shufflevector <vscale x 2 x i64> %ins, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer43 ret <vscale x 2 x i64> %splat44}45 46define <vscale x 16 x i8> @sve_splat_16xi8_imm() {47; CHECK-LABEL: sve_splat_16xi8_imm:48; CHECK: // %bb.0:49; CHECK-NEXT: mov z0.b, #1 // =0x150; CHECK-NEXT: ret51 ret <vscale x 16 x i8> splat(i8 1)52}53 54define <vscale x 8 x i16> @sve_splat_8xi16_dup_imm() {55; CHECK-LABEL: sve_splat_8xi16_dup_imm:56; CHECK: // %bb.0:57; CHECK-NEXT: mov z0.h, #1 // =0x158; CHECK-NEXT: ret59 ret <vscale x 8 x i16> splat(i16 1)60}61 62define <vscale x 8 x i16> @sve_splat_8xi16_dupm_imm() {63; CHECK-LABEL: sve_splat_8xi16_dupm_imm:64; CHECK: // %bb.0:65; CHECK-NEXT: mov z0.h, #16256 // =0x3f8066; CHECK-NEXT: ret67 ret <vscale x 8 x i16> splat(i16 16256)68}69 70define <vscale x 4 x i32> @sve_splat_4xi32_dup_imm() {71; CHECK-LABEL: sve_splat_4xi32_dup_imm:72; CHECK: // %bb.0:73; CHECK-NEXT: mov z0.s, #1 // =0x174; CHECK-NEXT: ret75 ret <vscale x 4 x i32> splat(i32 1)76}77 78define <vscale x 4 x i32> @sve_splat_4xi32_dupm_imm() {79; CHECK-LABEL: sve_splat_4xi32_dupm_imm:80; CHECK: // %bb.0:81; CHECK-NEXT: mov z0.s, #0xff000082; CHECK-NEXT: ret83 ret <vscale x 4 x i32> splat(i32 16711680)84}85 86define <vscale x 2 x i64> @sve_splat_2xi64_dup_imm() {87; CHECK-LABEL: sve_splat_2xi64_dup_imm:88; CHECK: // %bb.0:89; CHECK-NEXT: mov z0.d, #1 // =0x190; CHECK-NEXT: ret91 ret <vscale x 2 x i64> splat(i64 1)92}93 94define <vscale x 2 x i64> @sve_splat_2xi64_dupm_imm() {95; CHECK-LABEL: sve_splat_2xi64_dupm_imm:96; CHECK: // %bb.0:97; CHECK-NEXT: mov z0.d, #0xffff0000000098; CHECK-NEXT: ret99 ret <vscale x 2 x i64> splat(i64 281470681743360)100}101 102;; Promote splats of smaller illegal integer vector types103 104define <vscale x 2 x i8> @sve_splat_2xi8(i8 %val) {105; CHECK-LABEL: sve_splat_2xi8:106; CHECK: // %bb.0:107; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0108; CHECK-NEXT: mov z0.d, x0109; CHECK-NEXT: ret110 %ins = insertelement <vscale x 2 x i8> poison, i8 %val, i32 0111 %splat = shufflevector <vscale x 2 x i8> %ins, <vscale x 2 x i8> poison, <vscale x 2 x i32> zeroinitializer112 ret <vscale x 2 x i8> %splat113}114 115define <vscale x 4 x i8> @sve_splat_4xi8(i8 %val) {116; CHECK-LABEL: sve_splat_4xi8:117; CHECK: // %bb.0:118; CHECK-NEXT: mov z0.s, w0119; CHECK-NEXT: ret120 %ins = insertelement <vscale x 4 x i8> poison, i8 %val, i32 0121 %splat = shufflevector <vscale x 4 x i8> %ins, <vscale x 4 x i8> poison, <vscale x 4 x i32> zeroinitializer122 ret <vscale x 4 x i8> %splat123}124 125define <vscale x 8 x i8> @sve_splat_8xi8(i8 %val) {126; CHECK-LABEL: sve_splat_8xi8:127; CHECK: // %bb.0:128; CHECK-NEXT: mov z0.h, w0129; CHECK-NEXT: ret130 %ins = insertelement <vscale x 8 x i8> poison, i8 %val, i32 0131 %splat = shufflevector <vscale x 8 x i8> %ins, <vscale x 8 x i8> poison, <vscale x 8 x i32> zeroinitializer132 ret <vscale x 8 x i8> %splat133}134 135define <vscale x 8 x i8> @sve_splat_8xi8_imm() {136; CHECK-LABEL: sve_splat_8xi8_imm:137; CHECK: // %bb.0:138; CHECK-NEXT: mov z0.h, #255 // =0xff139; CHECK-NEXT: ret140 ret <vscale x 8 x i8> splat(i8 -1)141}142 143define <vscale x 2 x i16> @sve_splat_2xi16(i16 %val) {144; CHECK-LABEL: sve_splat_2xi16:145; CHECK: // %bb.0:146; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0147; CHECK-NEXT: mov z0.d, x0148; CHECK-NEXT: ret149 %ins = insertelement <vscale x 2 x i16> poison, i16 %val, i32 0150 %splat = shufflevector <vscale x 2 x i16> %ins, <vscale x 2 x i16> poison, <vscale x 2 x i32> zeroinitializer151 ret <vscale x 2 x i16> %splat152}153 154define <vscale x 4 x i16> @sve_splat_4xi16(i16 %val) {155; CHECK-LABEL: sve_splat_4xi16:156; CHECK: // %bb.0:157; CHECK-NEXT: mov z0.s, w0158; CHECK-NEXT: ret159 %ins = insertelement <vscale x 4 x i16> poison, i16 %val, i32 0160 %splat = shufflevector <vscale x 4 x i16> %ins, <vscale x 4 x i16> poison, <vscale x 4 x i32> zeroinitializer161 ret <vscale x 4 x i16> %splat162}163 164define <vscale x 4 x i16> @sve_splat_4xi16_imm() {165; CHECK-LABEL: sve_splat_4xi16_imm:166; CHECK: // %bb.0:167; CHECK-NEXT: mov z0.s, #65535 // =0xffff168; CHECK-NEXT: ret169 ret <vscale x 4 x i16> splat(i16 -1)170}171 172define <vscale x 2 x i32> @sve_splat_2xi32(i32 %val) {173; CHECK-LABEL: sve_splat_2xi32:174; CHECK: // %bb.0:175; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0176; CHECK-NEXT: mov z0.d, x0177; CHECK-NEXT: ret178 %ins = insertelement <vscale x 2 x i32> poison, i32 %val, i32 0179 %splat = shufflevector <vscale x 2 x i32> %ins, <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer180 ret <vscale x 2 x i32> %splat181}182 183define <vscale x 2 x i32> @sve_splat_2xi32_imm() {184; CHECK-LABEL: sve_splat_2xi32_imm:185; CHECK: // %bb.0:186; CHECK-NEXT: mov z0.d, #0xffffffff187; CHECK-NEXT: ret188 ret <vscale x 2 x i32> splat(i32 -1)189}190 191;; Widen/split splats of wide vector types.192 193define <vscale x 1 x i32> @sve_splat_1xi32(i32 %val) {194; CHECK-LABEL: sve_splat_1xi32:195; CHECK: // %bb.0: // %entry196; CHECK-NEXT: mov z0.s, w0197; CHECK-NEXT: ret198entry:199 %ins = insertelement <vscale x 1 x i32> poison, i32 %val, i32 0200 %splat = shufflevector <vscale x 1 x i32> %ins, <vscale x 1 x i32> poison, <vscale x 1 x i32> zeroinitializer201 ret <vscale x 1 x i32> %splat202}203 204define <vscale x 12 x i32> @sve_splat_12xi32(i32 %val) {205; CHECK-LABEL: sve_splat_12xi32:206; CHECK: // %bb.0:207; CHECK-NEXT: mov z0.s, w0208; CHECK-NEXT: mov z1.d, z0.d209; CHECK-NEXT: mov z2.d, z0.d210; CHECK-NEXT: ret211 %ins = insertelement <vscale x 12 x i32> poison, i32 %val, i32 0212 %splat = shufflevector <vscale x 12 x i32> %ins, <vscale x 12 x i32> poison, <vscale x 12 x i32> zeroinitializer213 ret <vscale x 12 x i32> %splat214}215 216define <vscale x 2 x i1> @sve_splat_2xi1(i1 %val) {217; CHECK-LABEL: sve_splat_2xi1:218; CHECK: // %bb.0:219; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0220; CHECK-NEXT: sbfx x8, x0, #0, #1221; CHECK-NEXT: whilelo p0.d, xzr, x8222; CHECK-NEXT: ret223 %ins = insertelement <vscale x 2 x i1> poison, i1 %val, i32 0224 %splat = shufflevector <vscale x 2 x i1> %ins, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer225 ret <vscale x 2 x i1> %splat226}227 228define <vscale x 4 x i1> @sve_splat_4xi1(i1 %val) {229; CHECK-LABEL: sve_splat_4xi1:230; CHECK: // %bb.0:231; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0232; CHECK-NEXT: sbfx x8, x0, #0, #1233; CHECK-NEXT: whilelo p0.s, xzr, x8234; CHECK-NEXT: ret235 %ins = insertelement <vscale x 4 x i1> poison, i1 %val, i32 0236 %splat = shufflevector <vscale x 4 x i1> %ins, <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer237 ret <vscale x 4 x i1> %splat238}239 240define <vscale x 8 x i1> @sve_splat_8xi1(i1 %val) {241; CHECK-LABEL: sve_splat_8xi1:242; CHECK: // %bb.0:243; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0244; CHECK-NEXT: sbfx x8, x0, #0, #1245; CHECK-NEXT: whilelo p0.h, xzr, x8246; CHECK-NEXT: ret247 %ins = insertelement <vscale x 8 x i1> poison, i1 %val, i32 0248 %splat = shufflevector <vscale x 8 x i1> %ins, <vscale x 8 x i1> poison, <vscale x 8 x i32> zeroinitializer249 ret <vscale x 8 x i1> %splat250}251 252define <vscale x 16 x i1> @sve_splat_16xi1(i1 %val) {253; CHECK-LABEL: sve_splat_16xi1:254; CHECK: // %bb.0:255; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0256; CHECK-NEXT: sbfx x8, x0, #0, #1257; CHECK-NEXT: whilelo p0.b, xzr, x8258; CHECK-NEXT: ret259 %ins = insertelement <vscale x 16 x i1> poison, i1 %val, i32 0260 %splat = shufflevector <vscale x 16 x i1> %ins, <vscale x 16 x i1> poison, <vscale x 16 x i32> zeroinitializer261 ret <vscale x 16 x i1> %splat262}263 264;; Splats of legal floating point vector types265 266define <vscale x 8 x bfloat> @splat_nxv8bf16(bfloat %val) #0 {267; CHECK-LABEL: splat_nxv8bf16:268; CHECK: // %bb.0:269; CHECK-NEXT: // kill: def $h0 killed $h0 def $z0270; CHECK-NEXT: mov z0.h, h0271; CHECK-NEXT: ret272 %1 = insertelement <vscale x 8 x bfloat> poison, bfloat %val, i32 0273 %2 = shufflevector <vscale x 8 x bfloat> %1, <vscale x 8 x bfloat> poison, <vscale x 8 x i32> zeroinitializer274 ret <vscale x 8 x bfloat> %2275}276 277define <vscale x 4 x bfloat> @splat_nxv4bf16(bfloat %val) #0 {278; CHECK-LABEL: splat_nxv4bf16:279; CHECK: // %bb.0:280; CHECK-NEXT: // kill: def $h0 killed $h0 def $z0281; CHECK-NEXT: mov z0.h, h0282; CHECK-NEXT: ret283 %1 = insertelement <vscale x 4 x bfloat> poison, bfloat %val, i32 0284 %2 = shufflevector <vscale x 4 x bfloat> %1, <vscale x 4 x bfloat> poison, <vscale x 4 x i32> zeroinitializer285 ret <vscale x 4 x bfloat> %2286}287 288define <vscale x 2 x bfloat> @splat_nxv2bf16(bfloat %val) #0 {289; CHECK-LABEL: splat_nxv2bf16:290; CHECK: // %bb.0:291; CHECK-NEXT: // kill: def $h0 killed $h0 def $z0292; CHECK-NEXT: mov z0.h, h0293; CHECK-NEXT: ret294 %1 = insertelement <vscale x 2 x bfloat> poison, bfloat %val, i32 0295 %2 = shufflevector <vscale x 2 x bfloat> %1, <vscale x 2 x bfloat> poison, <vscale x 2 x i32> zeroinitializer296 ret <vscale x 2 x bfloat> %2297}298 299define <vscale x 8 x half> @splat_nxv8f16(half %val) {300; CHECK-LABEL: splat_nxv8f16:301; CHECK: // %bb.0:302; CHECK-NEXT: // kill: def $h0 killed $h0 def $z0303; CHECK-NEXT: mov z0.h, h0304; CHECK-NEXT: ret305 %1 = insertelement <vscale x 8 x half> poison, half %val, i32 0306 %2 = shufflevector <vscale x 8 x half> %1, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer307 ret <vscale x 8 x half> %2308}309 310define <vscale x 4 x half> @splat_nxv4f16(half %val) {311; CHECK-LABEL: splat_nxv4f16:312; CHECK: // %bb.0:313; CHECK-NEXT: // kill: def $h0 killed $h0 def $z0314; CHECK-NEXT: mov z0.h, h0315; CHECK-NEXT: ret316 %1 = insertelement <vscale x 4 x half> poison, half %val, i32 0317 %2 = shufflevector <vscale x 4 x half> %1, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer318 ret <vscale x 4 x half> %2319}320 321define <vscale x 2 x half> @splat_nxv2f16(half %val) {322; CHECK-LABEL: splat_nxv2f16:323; CHECK: // %bb.0:324; CHECK-NEXT: // kill: def $h0 killed $h0 def $z0325; CHECK-NEXT: mov z0.h, h0326; CHECK-NEXT: ret327 %1 = insertelement <vscale x 2 x half> poison, half %val, i32 0328 %2 = shufflevector <vscale x 2 x half> %1, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer329 ret <vscale x 2 x half> %2330}331 332define <vscale x 4 x float> @splat_nxv4f32(float %val) {333; CHECK-LABEL: splat_nxv4f32:334; CHECK: // %bb.0:335; CHECK-NEXT: // kill: def $s0 killed $s0 def $z0336; CHECK-NEXT: mov z0.s, s0337; CHECK-NEXT: ret338 %1 = insertelement <vscale x 4 x float> poison, float %val, i32 0339 %2 = shufflevector <vscale x 4 x float> %1, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer340 ret <vscale x 4 x float> %2341}342 343define <vscale x 2 x float> @splat_nxv2f32(float %val) {344; CHECK-LABEL: splat_nxv2f32:345; CHECK: // %bb.0:346; CHECK-NEXT: // kill: def $s0 killed $s0 def $z0347; CHECK-NEXT: mov z0.s, s0348; CHECK-NEXT: ret349 %1 = insertelement <vscale x 2 x float> poison, float %val, i32 0350 %2 = shufflevector <vscale x 2 x float> %1, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer351 ret <vscale x 2 x float> %2352}353 354define <vscale x 2 x double> @splat_nxv2f64(double %val) {355; CHECK-LABEL: splat_nxv2f64:356; CHECK: // %bb.0:357; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0358; CHECK-NEXT: mov z0.d, d0359; CHECK-NEXT: ret360 %1 = insertelement <vscale x 2 x double> poison, double %val, i32 0361 %2 = shufflevector <vscale x 2 x double> %1, <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer362 ret <vscale x 2 x double> %2363}364 365define <vscale x 8 x bfloat> @splat_nxv8bf16_zero() #0 {366; CHECK-LABEL: splat_nxv8bf16_zero:367; CHECK: // %bb.0:368; CHECK-NEXT: movi v0.2d, #0000000000000000369; CHECK-NEXT: ret370 ret <vscale x 8 x bfloat> zeroinitializer371}372 373define <vscale x 4 x bfloat> @splat_nxv4bf16_zero() #0 {374; CHECK-LABEL: splat_nxv4bf16_zero:375; CHECK: // %bb.0:376; CHECK-NEXT: movi v0.2d, #0000000000000000377; CHECK-NEXT: ret378 ret <vscale x 4 x bfloat> zeroinitializer379}380 381define <vscale x 2 x bfloat> @splat_nxv2bf16_zero() #0 {382; CHECK-LABEL: splat_nxv2bf16_zero:383; CHECK: // %bb.0:384; CHECK-NEXT: movi v0.2d, #0000000000000000385; CHECK-NEXT: ret386 ret <vscale x 2 x bfloat> zeroinitializer387}388 389define <vscale x 8 x half> @splat_nxv8f16_zero() {390; CHECK-LABEL: splat_nxv8f16_zero:391; CHECK: // %bb.0:392; CHECK-NEXT: movi v0.2d, #0000000000000000393; CHECK-NEXT: ret394 ret <vscale x 8 x half> zeroinitializer395}396 397define <vscale x 4 x half> @splat_nxv4f16_zero() {398; CHECK-LABEL: splat_nxv4f16_zero:399; CHECK: // %bb.0:400; CHECK-NEXT: movi v0.2d, #0000000000000000401; CHECK-NEXT: ret402 ret <vscale x 4 x half> zeroinitializer403}404 405define <vscale x 2 x half> @splat_nxv2f16_zero() {406; CHECK-LABEL: splat_nxv2f16_zero:407; CHECK: // %bb.0:408; CHECK-NEXT: movi v0.2d, #0000000000000000409; CHECK-NEXT: ret410 ret <vscale x 2 x half> zeroinitializer411}412 413define <vscale x 4 x float> @splat_nxv4f32_zero() {414; CHECK-LABEL: splat_nxv4f32_zero:415; CHECK: // %bb.0:416; CHECK-NEXT: movi v0.2d, #0000000000000000417; CHECK-NEXT: ret418 ret <vscale x 4 x float> zeroinitializer419}420 421define <vscale x 2 x float> @splat_nxv2f32_zero() {422; CHECK-LABEL: splat_nxv2f32_zero:423; CHECK: // %bb.0:424; CHECK-NEXT: movi v0.2d, #0000000000000000425; CHECK-NEXT: ret426 ret <vscale x 2 x float> zeroinitializer427}428 429define <vscale x 2 x double> @splat_nxv2f64_zero() {430; CHECK-LABEL: splat_nxv2f64_zero:431; CHECK: // %bb.0:432; CHECK-NEXT: movi v0.2d, #0000000000000000433; CHECK-NEXT: ret434 ret <vscale x 2 x double> zeroinitializer435}436 437define <vscale x 8 x half> @splat_nxv8f16_imm() {438; CHECK-LABEL: splat_nxv8f16_imm:439; CHECK: // %bb.0:440; CHECK-NEXT: fmov z0.h, #1.00000000441; CHECK-NEXT: ret442 ret <vscale x 8 x half> splat(half 1.0)443}444 445define <vscale x 4 x half> @splat_nxv4f16_imm() {446; CHECK-LABEL: splat_nxv4f16_imm:447; CHECK: // %bb.0:448; CHECK-NEXT: fmov z0.h, #1.00000000449; CHECK-NEXT: ret450 ret <vscale x 4 x half> splat(half 1.0)451}452 453define <vscale x 2 x half> @splat_nxv2f16_imm() {454; CHECK-LABEL: splat_nxv2f16_imm:455; CHECK: // %bb.0:456; CHECK-NEXT: fmov z0.h, #1.00000000457; CHECK-NEXT: ret458 ret <vscale x 2 x half> splat(half 1.0)459}460 461define <vscale x 4 x float> @splat_nxv4f32_imm() {462; CHECK-LABEL: splat_nxv4f32_imm:463; CHECK: // %bb.0:464; CHECK-NEXT: fmov z0.s, #1.00000000465; CHECK-NEXT: ret466 ret <vscale x 4 x float> splat(float 1.0)467}468 469define <vscale x 2 x float> @splat_nxv2f32_imm() {470; CHECK-LABEL: splat_nxv2f32_imm:471; CHECK: // %bb.0:472; CHECK-NEXT: fmov z0.s, #1.00000000473; CHECK-NEXT: ret474 ret <vscale x 2 x float> splat(float 1.0)475}476 477define <vscale x 2 x double> @splat_nxv2f64_imm() {478; CHECK-LABEL: splat_nxv2f64_imm:479; CHECK: // %bb.0:480; CHECK-NEXT: fmov z0.d, #1.00000000481; CHECK-NEXT: ret482 ret <vscale x 2 x double> splat(double 1.0)483}484 485; NOTE: f16(1.875) == bf16(1.0)486define <vscale x 8 x bfloat> @splat_nxv8bf16_imm() {487; CHECK-LABEL: splat_nxv8bf16_imm:488; CHECK: // %bb.0:489; CHECK-NEXT: fmov z0.h, #1.87500000490; CHECK-NEXT: ret491 ret <vscale x 8 x bfloat> splat(bfloat 1.0)492}493 494; NOTE: f16(-1.875) == bf16(-1.0)495define <vscale x 4 x bfloat> @splat_nxv4bf16_imm() {496; CHECK-LABEL: splat_nxv4bf16_imm:497; CHECK: // %bb.0:498; CHECK-NEXT: fmov z0.h, #-1.87500000499; CHECK-NEXT: ret500 ret <vscale x 4 x bfloat> splat(bfloat -1.0)501}502 503; NOTE: f16(1.875) == bf16(1.0)504define <vscale x 2 x bfloat> @splat_nxv2bf16_imm() {505; CHECK-LABEL: splat_nxv2bf16_imm:506; CHECK: // %bb.0:507; CHECK-NEXT: fmov z0.h, #1.87500000508; CHECK-NEXT: ret509 ret <vscale x 2 x bfloat> splat(bfloat 1.0)510}511 512define <vscale x 2 x half> @splat_nzero_nxv2f16() {513; CHECK-LABEL: splat_nzero_nxv2f16:514; CHECK: // %bb.0:515; CHECK-NEXT: dupm z0.h, #0x8000516; CHECK-NEXT: ret517 ret <vscale x 2 x half> splat (half -0.0)518}519 520define <vscale x 4 x half> @splat_nzero_nxv4f16() {521; CHECK-LABEL: splat_nzero_nxv4f16:522; CHECK: // %bb.0:523; CHECK-NEXT: dupm z0.h, #0x8000524; CHECK-NEXT: ret525 ret <vscale x 4 x half> splat (half -0.0)526}527 528define <vscale x 8 x half> @splat_nzero_nxv8f16() {529; CHECK-LABEL: splat_nzero_nxv8f16:530; CHECK: // %bb.0:531; CHECK-NEXT: dupm z0.h, #0x8000532; CHECK-NEXT: ret533 ret <vscale x 8 x half> splat (half -0.0)534}535 536define <vscale x 2 x float> @splat_nzero_nxv2f32() {537; CHECK-LABEL: splat_nzero_nxv2f32:538; CHECK: // %bb.0:539; CHECK-NEXT: mov z0.s, #0x80000000540; CHECK-NEXT: ret541 ret <vscale x 2 x float> splat (float -0.0)542}543 544define <vscale x 4 x float> @splat_nzero_nxv4f32() {545; CHECK-LABEL: splat_nzero_nxv4f32:546; CHECK: // %bb.0:547; CHECK-NEXT: mov z0.s, #0x80000000548; CHECK-NEXT: ret549 ret <vscale x 4 x float> splat (float -0.0)550}551 552define <vscale x 2 x double> @splat_nzero_nxv2f64() {553; CHECK-LABEL: splat_nzero_nxv2f64:554; CHECK: // %bb.0:555; CHECK-NEXT: mov z0.d, #0x8000000000000000556; CHECK-NEXT: ret557 ret <vscale x 2 x double> splat (double -0.0)558}559 560define <vscale x 2 x bfloat> @splat_nzero_nxv2bf16() {561; CHECK-LABEL: splat_nzero_nxv2bf16:562; CHECK: // %bb.0:563; CHECK-NEXT: dupm z0.h, #0x8000564; CHECK-NEXT: ret565 ret <vscale x 2 x bfloat> splat (bfloat -0.0)566}567 568define <vscale x 4 x bfloat> @splat_nzero_nxv4bf16() {569; CHECK-LABEL: splat_nzero_nxv4bf16:570; CHECK: // %bb.0:571; CHECK-NEXT: dupm z0.h, #0x8000572; CHECK-NEXT: ret573 ret <vscale x 4 x bfloat> splat (bfloat -0.0)574}575 576define <vscale x 8 x bfloat> @splat_nzero_nxv8bf16() {577; CHECK-LABEL: splat_nzero_nxv8bf16:578; CHECK: // %bb.0:579; CHECK-NEXT: dupm z0.h, #0x8000580; CHECK-NEXT: ret581 ret <vscale x 8 x bfloat> splat (bfloat -0.0)582}583 584define <vscale x 2 x half> @splat_pinf_nxv2f16() {585; CHECK-LABEL: splat_pinf_nxv2f16:586; CHECK: // %bb.0:587; CHECK-NEXT: dupm z0.h, #0x7c00588; CHECK-NEXT: ret589 ret <vscale x 2 x half> splat (half 0x7FF0000000000000)590}591 592define <vscale x 4 x half> @splat_pinf_nxv4f16() {593; CHECK-LABEL: splat_pinf_nxv4f16:594; CHECK: // %bb.0:595; CHECK-NEXT: dupm z0.h, #0x7c00596; CHECK-NEXT: ret597 ret <vscale x 4 x half> splat (half 0x7FF0000000000000)598}599 600define <vscale x 8 x half> @splat_pinf_nxv8f16() {601; CHECK-LABEL: splat_pinf_nxv8f16:602; CHECK: // %bb.0:603; CHECK-NEXT: dupm z0.h, #0x7c00604; CHECK-NEXT: ret605 ret <vscale x 8 x half> splat (half 0x7FF0000000000000)606}607 608define <vscale x 2 x float> @splat_pinf_nxv2f32() {609; CHECK-LABEL: splat_pinf_nxv2f32:610; CHECK: // %bb.0:611; CHECK-NEXT: mov z0.s, #0x7f800000612; CHECK-NEXT: ret613 ret <vscale x 2 x float> splat (float 0x7FF0000000000000)614}615 616define <vscale x 4 x float> @splat_pinf_nxv4f32() {617; CHECK-LABEL: splat_pinf_nxv4f32:618; CHECK: // %bb.0:619; CHECK-NEXT: mov z0.s, #0x7f800000620; CHECK-NEXT: ret621 ret <vscale x 4 x float> splat (float 0x7FF0000000000000)622}623 624define <vscale x 2 x double> @splat_pinf_nxv2f64() {625; CHECK-LABEL: splat_pinf_nxv2f64:626; CHECK: // %bb.0:627; CHECK-NEXT: mov z0.d, #0x7ff0000000000000628; CHECK-NEXT: ret629 ret <vscale x 2 x double> splat (double 0x7FF0000000000000)630}631 632define <vscale x 2 x bfloat> @splat_pinf_nxv2bf16() {633; CHECK-LABEL: splat_pinf_nxv2bf16:634; CHECK: // %bb.0:635; CHECK-NEXT: mov z0.h, #32640 // =0x7f80636; CHECK-NEXT: ret637 ret <vscale x 2 x bfloat> splat (bfloat 0x7FF0000000000000)638}639 640define <vscale x 4 x bfloat> @splat_pinf_nxv4bf16() {641; CHECK-LABEL: splat_pinf_nxv4bf16:642; CHECK: // %bb.0:643; CHECK-NEXT: mov z0.h, #32640 // =0x7f80644; CHECK-NEXT: ret645 ret <vscale x 4 x bfloat> splat (bfloat 0x7FF0000000000000)646}647 648define <vscale x 8 x bfloat> @splat_pinf_nxv8bf16() {649; CHECK-LABEL: splat_pinf_nxv8bf16:650; CHECK: // %bb.0:651; CHECK-NEXT: mov z0.h, #32640 // =0x7f80652; CHECK-NEXT: ret653 ret <vscale x 8 x bfloat> splat (bfloat 0x7FF0000000000000)654}655 656define <vscale x 2 x half> @splat_ninf_nxv2f16() {657; CHECK-LABEL: splat_ninf_nxv2f16:658; CHECK: // %bb.0:659; CHECK-NEXT: dupm z0.h, #0xfc00660; CHECK-NEXT: ret661 ret <vscale x 2 x half> splat (half 0xFFF0000000000000)662}663 664define <vscale x 4 x half> @splat_ninf_nxv4f16() {665; CHECK-LABEL: splat_ninf_nxv4f16:666; CHECK: // %bb.0:667; CHECK-NEXT: dupm z0.h, #0xfc00668; CHECK-NEXT: ret669 ret <vscale x 4 x half> splat (half 0xFFF0000000000000)670}671 672define <vscale x 8 x half> @splat_ninf_nxv8f16() {673; CHECK-LABEL: splat_ninf_nxv8f16:674; CHECK: // %bb.0:675; CHECK-NEXT: dupm z0.h, #0xfc00676; CHECK-NEXT: ret677 ret <vscale x 8 x half> splat (half 0xFFF0000000000000)678}679 680define <vscale x 2 x float> @splat_ninf_nxv2f32() {681; CHECK-LABEL: splat_ninf_nxv2f32:682; CHECK: // %bb.0:683; CHECK-NEXT: mov z0.s, #0xff800000684; CHECK-NEXT: ret685 ret <vscale x 2 x float> splat (float 0xFFF0000000000000)686}687 688define <vscale x 4 x float> @splat_ninf_nxv4f32() {689; CHECK-LABEL: splat_ninf_nxv4f32:690; CHECK: // %bb.0:691; CHECK-NEXT: mov z0.s, #0xff800000692; CHECK-NEXT: ret693 ret <vscale x 4 x float> splat (float 0xFFF0000000000000)694}695 696define <vscale x 2 x double> @splat_ninf_nxv2f64() {697; CHECK-LABEL: splat_ninf_nxv2f64:698; CHECK: // %bb.0:699; CHECK-NEXT: mov z0.d, #0xfff0000000000000700; CHECK-NEXT: ret701 ret <vscale x 2 x double> splat (double 0xFFF0000000000000)702}703 704define <vscale x 2 x bfloat> @splat_ninf_nxv2bf16() {705; CHECK-LABEL: splat_ninf_nxv2bf16:706; CHECK: // %bb.0:707; CHECK-NEXT: dupm z0.h, #0xff80708; CHECK-NEXT: ret709 ret <vscale x 2 x bfloat> splat (bfloat 0xFFF0000000000000)710}711 712define <vscale x 4 x bfloat> @splat_ninf_nxv4bf16() {713; CHECK-LABEL: splat_ninf_nxv4bf16:714; CHECK: // %bb.0:715; CHECK-NEXT: dupm z0.h, #0xff80716; CHECK-NEXT: ret717 ret <vscale x 4 x bfloat> splat (bfloat 0xFFF0000000000000)718}719 720define <vscale x 8 x bfloat> @splat_ninf_nxv8bf16() {721; CHECK-LABEL: splat_ninf_nxv8bf16:722; CHECK: // %bb.0:723; CHECK-NEXT: dupm z0.h, #0xff80724; CHECK-NEXT: ret725 ret <vscale x 8 x bfloat> splat (bfloat 0xFFF0000000000000)726}727 728define <vscale x 2 x half> @splat_nan_nxv2f16() {729; CHECK-LABEL: splat_nan_nxv2f16:730; CHECK: // %bb.0:731; CHECK-NEXT: dupm z0.h, #0x7e00732; CHECK-NEXT: ret733 ret <vscale x 2 x half> splat (half 0x7FF8000000000000)734}735 736define <vscale x 4 x half> @splat_nan_nxv4f16() {737; CHECK-LABEL: splat_nan_nxv4f16:738; CHECK: // %bb.0:739; CHECK-NEXT: dupm z0.h, #0x7e00740; CHECK-NEXT: ret741 ret <vscale x 4 x half> splat (half 0x7FF8000000000000)742}743 744define <vscale x 8 x half> @splat_nan_nxv8f16() {745; CHECK-LABEL: splat_nan_nxv8f16:746; CHECK: // %bb.0:747; CHECK-NEXT: dupm z0.h, #0x7e00748; CHECK-NEXT: ret749 ret <vscale x 8 x half> splat (half 0x7FF8000000000000)750}751 752define <vscale x 2 x float> @splat_nan_nxv2f32() {753; CHECK-LABEL: splat_nan_nxv2f32:754; CHECK: // %bb.0:755; CHECK-NEXT: mov z0.s, #0x7fc00000756; CHECK-NEXT: ret757 ret <vscale x 2 x float> splat (float 0x7FF8000000000000)758}759 760define <vscale x 4 x float> @splat_nan_nxv4f32() {761; CHECK-LABEL: splat_nan_nxv4f32:762; CHECK: // %bb.0:763; CHECK-NEXT: mov z0.s, #0x7fc00000764; CHECK-NEXT: ret765 ret <vscale x 4 x float> splat (float 0x7FF8000000000000)766}767 768define <vscale x 2 x double> @splat_nan_nxv2f64() {769; CHECK-LABEL: splat_nan_nxv2f64:770; CHECK: // %bb.0:771; CHECK-NEXT: mov z0.d, #0x7ff8000000000000772; CHECK-NEXT: ret773 ret <vscale x 2 x double> splat (double 0x7FF8000000000000)774}775 776define <vscale x 2 x bfloat> @splat_nan_nxv2bf16() {777; CHECK-LABEL: splat_nan_nxv2bf16:778; CHECK: // %bb.0:779; CHECK-NEXT: mov z0.h, #32704 // =0x7fc0780; CHECK-NEXT: ret781 ret <vscale x 2 x bfloat> splat (bfloat 0x7FF8000000000000)782}783 784define <vscale x 4 x bfloat> @splat_nan_nxv4bf16() {785; CHECK-LABEL: splat_nan_nxv4bf16:786; CHECK: // %bb.0:787; CHECK-NEXT: mov z0.h, #32704 // =0x7fc0788; CHECK-NEXT: ret789 ret <vscale x 4 x bfloat> splat (bfloat 0x7FF8000000000000)790}791 792define <vscale x 8 x bfloat> @splat_nan_nxv8bf16() {793; CHECK-LABEL: splat_nan_nxv8bf16:794; CHECK: // %bb.0:795; CHECK-NEXT: mov z0.h, #32704 // =0x7fc0796; CHECK-NEXT: ret797 ret <vscale x 8 x bfloat> splat (bfloat 0x7FF8000000000000)798}799 800define <vscale x 4 x i32> @splat_nxv4i32_fold(<vscale x 4 x i32> %x) {801; CHECK-LABEL: splat_nxv4i32_fold:802; CHECK: // %bb.0:803; CHECK-NEXT: movi v0.2d, #0000000000000000804; CHECK-NEXT: ret805 %r = sub <vscale x 4 x i32> %x, %x806 ret <vscale x 4 x i32> %r807}808 809 810define <vscale x 4 x float> @splat_nxv4f32_fold(<vscale x 4 x float> %x) {811; CHECK-LABEL: splat_nxv4f32_fold:812; CHECK: // %bb.0:813; CHECK-NEXT: movi v0.2d, #0000000000000000814; CHECK-NEXT: ret815 %r = fsub nnan <vscale x 4 x float> %x, %x816 ret <vscale x 4 x float> %r817}818 819define <vscale x 2 x float> @splat_nxv2f32_fmov_fold() {820; CHECK-LABEL: splat_nxv2f32_fmov_fold:821; CHECK: // %bb.0:822; CHECK-NEXT: mov w8, #1109917696 // =0x42280000823; CHECK-NEXT: mov z0.s, w8824; CHECK-NEXT: ret825 ret <vscale x 2 x float> splat(float 4.200000e+01)826}827 828define <vscale x 4 x float> @splat_nxv4f32_fmov_fold() {829; CHECK-LABEL: splat_nxv4f32_fmov_fold:830; CHECK: // %bb.0:831; CHECK-NEXT: mov w8, #1109917696 // =0x42280000832; CHECK-NEXT: mov z0.s, w8833; CHECK-NEXT: ret834 ret <vscale x 4 x float> splat(float 4.200000e+01)835}836 837define <vscale x 2 x double> @splat_nxv2f64_fmov_fold() {838; CHECK-LABEL: splat_nxv2f64_fmov_fold:839; CHECK: // %bb.0:840; CHECK-NEXT: mov x8, #4631107791820423168 // =0x4045000000000000841; CHECK-NEXT: mov z0.d, x8842; CHECK-NEXT: ret843 ret <vscale x 2 x double> splat(double 4.200000e+01)844}845 846; Splat of float constants not representable as a single immediate.847 848define <vscale x 2 x float> @splat_nxv2f32_imm_out_of_range() {849; CHECK-LABEL: splat_nxv2f32_imm_out_of_range:850; CHECK: // %bb.0:851; CHECK-NEXT: mov w8, #7864 // =0x1eb8852; CHECK-NEXT: movk w8, #16469, lsl #16853; CHECK-NEXT: mov z0.s, w8854; CHECK-NEXT: ret855 ret <vscale x 2 x float> splat(float 3.3299999237060546875)856}857 858define <vscale x 4 x float> @splat_nxv4f32_imm_out_of_range() {859; CHECK-LABEL: splat_nxv4f32_imm_out_of_range:860; CHECK: // %bb.0:861; CHECK-NEXT: mov w8, #7864 // =0x1eb8862; CHECK-NEXT: movk w8, #16469, lsl #16863; CHECK-NEXT: mov z0.s, w8864; CHECK-NEXT: ret865 ret <vscale x 4 x float> splat(float 3.3299999237060546875)866}867 868define <vscale x 2 x double> @splat_nxv2f64_imm_out_of_range() {869; CHECK-LABEL: splat_nxv2f64_imm_out_of_range:870; CHECK: // %bb.0:871; CHECK-NEXT: ptrue p0.d872; CHECK-NEXT: adrp x8, .LCPI96_0873; CHECK-NEXT: add x8, x8, :lo12:.LCPI96_0874; CHECK-NEXT: ld1rd { z0.d }, p0/z, [x8]875; CHECK-NEXT: ret876 ret <vscale x 2 x double> splat(double 3.33)877}878 879; Splat for predicates880; This guards optimizations that rely on splats of 1 being generated as a ptrue881 882define <vscale x 2 x i1> @sve_splat_i1_allactive() {883; CHECK-LABEL: sve_splat_i1_allactive:884; CHECK: // %bb.0:885; CHECK-NEXT: ptrue p0.d886; CHECK-NEXT: ret887 ret <vscale x 2 x i1> splat(i1 true)888}889 890attributes #0 = { "target-features"="+sve" }891