brintos

brintos / llvm-project-archived public Read only

0
0
Text · 23.5 KiB · 335a1f8 Raw
711 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 -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE4; RUN: llc -force-streaming-compatible -use-constant-int-for-fixed-length-splat -use-constant-fp-for-fixed-length-splat < %s | FileCheck %s --check-prefix=NONEON-NOSVE5 6target triple = "aarch64-unknown-linux-gnu"7 8;9; DUP (integer)10;11 12define <4 x i8> @splat_v4i8(i8 %a) {13; CHECK-LABEL: splat_v4i8:14; CHECK:       // %bb.0:15; CHECK-NEXT:    mov z0.h, w016; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z017; CHECK-NEXT:    ret18;19; NONEON-NOSVE-LABEL: splat_v4i8:20; NONEON-NOSVE:       // %bb.0:21; NONEON-NOSVE-NEXT:    sub sp, sp, #1622; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 1623; NONEON-NOSVE-NEXT:    strh w0, [sp, #14]24; NONEON-NOSVE-NEXT:    strh w0, [sp, #12]25; NONEON-NOSVE-NEXT:    strh w0, [sp, #10]26; NONEON-NOSVE-NEXT:    strh w0, [sp, #8]27; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]28; NONEON-NOSVE-NEXT:    add sp, sp, #1629; NONEON-NOSVE-NEXT:    ret30  %insert = insertelement <4 x i8> poison, i8 %a, i64 031  %splat = shufflevector <4 x i8> %insert, <4 x i8> poison, <4 x i32> zeroinitializer32  ret <4 x i8> %splat33}34 35define <8 x i8> @splat_v8i8(i8 %a) {36; CHECK-LABEL: splat_v8i8:37; CHECK:       // %bb.0:38; CHECK-NEXT:    mov z0.b, w039; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z040; CHECK-NEXT:    ret41;42; NONEON-NOSVE-LABEL: splat_v8i8:43; NONEON-NOSVE:       // %bb.0:44; NONEON-NOSVE-NEXT:    sub sp, sp, #1645; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 1646; NONEON-NOSVE-NEXT:    strb w0, [sp, #15]47; NONEON-NOSVE-NEXT:    strb w0, [sp, #14]48; NONEON-NOSVE-NEXT:    strb w0, [sp, #13]49; NONEON-NOSVE-NEXT:    strb w0, [sp, #12]50; NONEON-NOSVE-NEXT:    strb w0, [sp, #11]51; NONEON-NOSVE-NEXT:    strb w0, [sp, #10]52; NONEON-NOSVE-NEXT:    strb w0, [sp, #9]53; NONEON-NOSVE-NEXT:    strb w0, [sp, #8]54; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]55; NONEON-NOSVE-NEXT:    add sp, sp, #1656; NONEON-NOSVE-NEXT:    ret57  %insert = insertelement <8 x i8> poison, i8 %a, i64 058  %splat = shufflevector <8 x i8> %insert, <8 x i8> poison, <8 x i32> zeroinitializer59  ret <8 x i8> %splat60}61 62define <16 x i8> @splat_v16i8(i8 %a) {63; CHECK-LABEL: splat_v16i8:64; CHECK:       // %bb.0:65; CHECK-NEXT:    mov z0.b, w066; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z067; CHECK-NEXT:    ret68;69; NONEON-NOSVE-LABEL: splat_v16i8:70; NONEON-NOSVE:       // %bb.0:71; NONEON-NOSVE-NEXT:    sub sp, sp, #1672; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 1673; NONEON-NOSVE-NEXT:    strb w0, [sp, #15]74; NONEON-NOSVE-NEXT:    strb w0, [sp, #14]75; NONEON-NOSVE-NEXT:    strb w0, [sp, #13]76; NONEON-NOSVE-NEXT:    strb w0, [sp, #12]77; NONEON-NOSVE-NEXT:    strb w0, [sp, #11]78; NONEON-NOSVE-NEXT:    strb w0, [sp, #10]79; NONEON-NOSVE-NEXT:    strb w0, [sp, #9]80; NONEON-NOSVE-NEXT:    strb w0, [sp, #8]81; NONEON-NOSVE-NEXT:    strb w0, [sp, #7]82; NONEON-NOSVE-NEXT:    strb w0, [sp, #6]83; NONEON-NOSVE-NEXT:    strb w0, [sp, #5]84; NONEON-NOSVE-NEXT:    strb w0, [sp, #4]85; NONEON-NOSVE-NEXT:    strb w0, [sp, #3]86; NONEON-NOSVE-NEXT:    strb w0, [sp, #2]87; NONEON-NOSVE-NEXT:    strb w0, [sp, #1]88; NONEON-NOSVE-NEXT:    strb w0, [sp]89; NONEON-NOSVE-NEXT:    ldr q0, [sp], #1690; NONEON-NOSVE-NEXT:    ret91  %insert = insertelement <16 x i8> poison, i8 %a, i64 092  %splat = shufflevector <16 x i8> %insert, <16 x i8> poison, <16 x i32> zeroinitializer93  ret <16 x i8> %splat94}95 96define void @splat_v32i8(i8 %a, ptr %b) {97; CHECK-LABEL: splat_v32i8:98; CHECK:       // %bb.0:99; CHECK-NEXT:    mov z0.b, w0100; CHECK-NEXT:    stp q0, q0, [x1]101; CHECK-NEXT:    ret102;103; NONEON-NOSVE-LABEL: splat_v32i8:104; NONEON-NOSVE:       // %bb.0:105; NONEON-NOSVE-NEXT:    sub sp, sp, #16106; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16107; NONEON-NOSVE-NEXT:    strb w0, [sp, #15]108; NONEON-NOSVE-NEXT:    strb w0, [sp, #14]109; NONEON-NOSVE-NEXT:    strb w0, [sp, #13]110; NONEON-NOSVE-NEXT:    strb w0, [sp, #12]111; NONEON-NOSVE-NEXT:    strb w0, [sp, #11]112; NONEON-NOSVE-NEXT:    strb w0, [sp, #10]113; NONEON-NOSVE-NEXT:    strb w0, [sp, #9]114; NONEON-NOSVE-NEXT:    strb w0, [sp, #8]115; NONEON-NOSVE-NEXT:    strb w0, [sp, #7]116; NONEON-NOSVE-NEXT:    strb w0, [sp, #6]117; NONEON-NOSVE-NEXT:    strb w0, [sp, #5]118; NONEON-NOSVE-NEXT:    strb w0, [sp, #4]119; NONEON-NOSVE-NEXT:    strb w0, [sp, #3]120; NONEON-NOSVE-NEXT:    strb w0, [sp, #2]121; NONEON-NOSVE-NEXT:    strb w0, [sp, #1]122; NONEON-NOSVE-NEXT:    strb w0, [sp]123; NONEON-NOSVE-NEXT:    ldr q0, [sp]124; NONEON-NOSVE-NEXT:    stp q0, q0, [x1]125; NONEON-NOSVE-NEXT:    add sp, sp, #16126; NONEON-NOSVE-NEXT:    ret127  %insert = insertelement <32 x i8> poison, i8 %a, i64 0128  %splat = shufflevector <32 x i8> %insert, <32 x i8> poison, <32 x i32> zeroinitializer129  store <32 x i8> %splat, ptr %b130  ret void131}132 133define <2 x i16> @splat_v2i16(i16 %a) {134; CHECK-LABEL: splat_v2i16:135; CHECK:       // %bb.0:136; CHECK-NEXT:    mov z0.s, w0137; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0138; CHECK-NEXT:    ret139;140; NONEON-NOSVE-LABEL: splat_v2i16:141; NONEON-NOSVE:       // %bb.0:142; NONEON-NOSVE-NEXT:    sub sp, sp, #16143; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16144; NONEON-NOSVE-NEXT:    stp w0, w0, [sp, #8]145; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]146; NONEON-NOSVE-NEXT:    add sp, sp, #16147; NONEON-NOSVE-NEXT:    ret148  %insert = insertelement <2 x i16> poison, i16 %a, i64 0149  %splat = shufflevector <2 x i16> %insert, <2 x i16> poison, <2 x i32> zeroinitializer150  ret <2 x i16> %splat151}152 153define <4 x i16> @splat_v4i16(i16 %a) {154; CHECK-LABEL: splat_v4i16:155; CHECK:       // %bb.0:156; CHECK-NEXT:    mov z0.h, w0157; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0158; CHECK-NEXT:    ret159;160; NONEON-NOSVE-LABEL: splat_v4i16:161; NONEON-NOSVE:       // %bb.0:162; NONEON-NOSVE-NEXT:    sub sp, sp, #16163; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16164; NONEON-NOSVE-NEXT:    strh w0, [sp, #14]165; NONEON-NOSVE-NEXT:    strh w0, [sp, #12]166; NONEON-NOSVE-NEXT:    strh w0, [sp, #10]167; NONEON-NOSVE-NEXT:    strh w0, [sp, #8]168; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]169; NONEON-NOSVE-NEXT:    add sp, sp, #16170; NONEON-NOSVE-NEXT:    ret171  %insert = insertelement <4 x i16> poison, i16 %a, i64 0172  %splat = shufflevector <4 x i16> %insert, <4 x i16> poison, <4 x i32> zeroinitializer173  ret <4 x i16> %splat174}175 176define <8 x i16> @splat_v8i16(i16 %a) {177; CHECK-LABEL: splat_v8i16:178; CHECK:       // %bb.0:179; CHECK-NEXT:    mov z0.h, w0180; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0181; CHECK-NEXT:    ret182;183; NONEON-NOSVE-LABEL: splat_v8i16:184; NONEON-NOSVE:       // %bb.0:185; NONEON-NOSVE-NEXT:    sub sp, sp, #16186; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16187; NONEON-NOSVE-NEXT:    strh w0, [sp, #14]188; NONEON-NOSVE-NEXT:    strh w0, [sp, #12]189; NONEON-NOSVE-NEXT:    strh w0, [sp, #10]190; NONEON-NOSVE-NEXT:    strh w0, [sp, #8]191; NONEON-NOSVE-NEXT:    strh w0, [sp, #6]192; NONEON-NOSVE-NEXT:    strh w0, [sp, #4]193; NONEON-NOSVE-NEXT:    strh w0, [sp, #2]194; NONEON-NOSVE-NEXT:    strh w0, [sp]195; NONEON-NOSVE-NEXT:    ldr q0, [sp], #16196; NONEON-NOSVE-NEXT:    ret197  %insert = insertelement <8 x i16> poison, i16 %a, i64 0198  %splat = shufflevector <8 x i16> %insert, <8 x i16> poison, <8 x i32> zeroinitializer199  ret <8 x i16> %splat200}201 202define void @splat_v16i16(i16 %a, ptr %b) {203; CHECK-LABEL: splat_v16i16:204; CHECK:       // %bb.0:205; CHECK-NEXT:    mov z0.h, w0206; CHECK-NEXT:    stp q0, q0, [x1]207; CHECK-NEXT:    ret208;209; NONEON-NOSVE-LABEL: splat_v16i16:210; NONEON-NOSVE:       // %bb.0:211; NONEON-NOSVE-NEXT:    sub sp, sp, #16212; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16213; NONEON-NOSVE-NEXT:    strh w0, [sp, #14]214; NONEON-NOSVE-NEXT:    strh w0, [sp, #12]215; NONEON-NOSVE-NEXT:    strh w0, [sp, #10]216; NONEON-NOSVE-NEXT:    strh w0, [sp, #8]217; NONEON-NOSVE-NEXT:    strh w0, [sp, #6]218; NONEON-NOSVE-NEXT:    strh w0, [sp, #4]219; NONEON-NOSVE-NEXT:    strh w0, [sp, #2]220; NONEON-NOSVE-NEXT:    strh w0, [sp]221; NONEON-NOSVE-NEXT:    ldr q0, [sp]222; NONEON-NOSVE-NEXT:    stp q0, q0, [x1]223; NONEON-NOSVE-NEXT:    add sp, sp, #16224; NONEON-NOSVE-NEXT:    ret225  %insert = insertelement <16 x i16> poison, i16 %a, i64 0226  %splat = shufflevector <16 x i16> %insert, <16 x i16> poison, <16 x i32> zeroinitializer227  store <16 x i16> %splat, ptr %b228  ret void229}230 231define <2 x i32> @splat_v2i32(i32 %a) {232; CHECK-LABEL: splat_v2i32:233; CHECK:       // %bb.0:234; CHECK-NEXT:    mov z0.s, w0235; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0236; CHECK-NEXT:    ret237;238; NONEON-NOSVE-LABEL: splat_v2i32:239; NONEON-NOSVE:       // %bb.0:240; NONEON-NOSVE-NEXT:    sub sp, sp, #16241; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16242; NONEON-NOSVE-NEXT:    stp w0, w0, [sp, #8]243; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]244; NONEON-NOSVE-NEXT:    add sp, sp, #16245; NONEON-NOSVE-NEXT:    ret246  %insert = insertelement <2 x i32> poison, i32 %a, i64 0247  %splat = shufflevector <2 x i32> %insert, <2 x i32> poison, <2 x i32> zeroinitializer248  ret <2 x i32> %splat249}250 251define <4 x i32> @splat_v4i32(i32 %a) {252; CHECK-LABEL: splat_v4i32:253; CHECK:       // %bb.0:254; CHECK-NEXT:    mov z0.s, w0255; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0256; CHECK-NEXT:    ret257;258; NONEON-NOSVE-LABEL: splat_v4i32:259; NONEON-NOSVE:       // %bb.0:260; NONEON-NOSVE-NEXT:    sub sp, sp, #16261; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16262; NONEON-NOSVE-NEXT:    stp w0, w0, [sp, #8]263; NONEON-NOSVE-NEXT:    stp w0, w0, [sp]264; NONEON-NOSVE-NEXT:    ldr q0, [sp], #16265; NONEON-NOSVE-NEXT:    ret266  %insert = insertelement <4 x i32> poison, i32 %a, i64 0267  %splat = shufflevector <4 x i32> %insert, <4 x i32> poison, <4 x i32> zeroinitializer268  ret <4 x i32> %splat269}270 271define void @splat_v8i32(i32 %a, ptr %b) {272; CHECK-LABEL: splat_v8i32:273; CHECK:       // %bb.0:274; CHECK-NEXT:    mov z0.s, w0275; CHECK-NEXT:    stp q0, q0, [x1]276; CHECK-NEXT:    ret277;278; NONEON-NOSVE-LABEL: splat_v8i32:279; NONEON-NOSVE:       // %bb.0:280; NONEON-NOSVE-NEXT:    sub sp, sp, #16281; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16282; NONEON-NOSVE-NEXT:    stp w0, w0, [sp, #8]283; NONEON-NOSVE-NEXT:    stp w0, w0, [sp]284; NONEON-NOSVE-NEXT:    ldr q0, [sp]285; NONEON-NOSVE-NEXT:    stp q0, q0, [x1]286; NONEON-NOSVE-NEXT:    add sp, sp, #16287; NONEON-NOSVE-NEXT:    ret288  %insert = insertelement <8 x i32> poison, i32 %a, i64 0289  %splat = shufflevector <8 x i32> %insert, <8 x i32> poison, <8 x i32> zeroinitializer290  store <8 x i32> %splat, ptr %b291  ret void292}293 294define <1 x i64> @splat_v1i64(i64 %a) {295; CHECK-LABEL: splat_v1i64:296; CHECK:       // %bb.0:297; CHECK-NEXT:    mov z0.d, x0298; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0299; CHECK-NEXT:    ret300;301; NONEON-NOSVE-LABEL: splat_v1i64:302; NONEON-NOSVE:       // %bb.0:303; NONEON-NOSVE-NEXT:    sub sp, sp, #16304; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16305; NONEON-NOSVE-NEXT:    str x0, [sp, #8]306; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]307; NONEON-NOSVE-NEXT:    add sp, sp, #16308; NONEON-NOSVE-NEXT:    ret309  %insert = insertelement <1 x i64> poison, i64 %a, i64 0310  %splat = shufflevector <1 x i64> %insert, <1 x i64> poison, <1 x i32> zeroinitializer311  ret <1 x i64> %splat312}313 314define <2 x i64> @splat_v2i64(i64 %a) {315; CHECK-LABEL: splat_v2i64:316; CHECK:       // %bb.0:317; CHECK-NEXT:    mov z0.d, x0318; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0319; CHECK-NEXT:    ret320;321; NONEON-NOSVE-LABEL: splat_v2i64:322; NONEON-NOSVE:       // %bb.0:323; NONEON-NOSVE-NEXT:    stp x0, x0, [sp, #-16]!324; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16325; NONEON-NOSVE-NEXT:    ldr q0, [sp], #16326; NONEON-NOSVE-NEXT:    ret327  %insert = insertelement <2 x i64> poison, i64 %a, i64 0328  %splat = shufflevector <2 x i64> %insert, <2 x i64> poison, <2 x i32> zeroinitializer329  ret <2 x i64> %splat330}331 332define void @splat_v4i64(i64 %a, ptr %b) {333; CHECK-LABEL: splat_v4i64:334; CHECK:       // %bb.0:335; CHECK-NEXT:    mov z0.d, x0336; CHECK-NEXT:    stp q0, q0, [x1]337; CHECK-NEXT:    ret338;339; NONEON-NOSVE-LABEL: splat_v4i64:340; NONEON-NOSVE:       // %bb.0:341; NONEON-NOSVE-NEXT:    stp x0, x0, [sp, #-16]!342; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16343; NONEON-NOSVE-NEXT:    ldr q0, [sp]344; NONEON-NOSVE-NEXT:    stp q0, q0, [x1]345; NONEON-NOSVE-NEXT:    add sp, sp, #16346; NONEON-NOSVE-NEXT:    ret347  %insert = insertelement <4 x i64> poison, i64 %a, i64 0348  %splat = shufflevector <4 x i64> %insert, <4 x i64> poison, <4 x i32> zeroinitializer349  store <4 x i64> %splat, ptr %b350  ret void351}352 353;354; DUP (floating-point)355;356 357define <2 x half> @splat_v2f16(half %a) {358; CHECK-LABEL: splat_v2f16:359; CHECK:       // %bb.0:360; CHECK-NEXT:    // kill: def $h0 killed $h0 def $z0361; CHECK-NEXT:    mov z0.h, h0362; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0363; CHECK-NEXT:    ret364;365; NONEON-NOSVE-LABEL: splat_v2f16:366; NONEON-NOSVE:       // %bb.0:367; NONEON-NOSVE-NEXT:    sub sp, sp, #16368; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16369; NONEON-NOSVE-NEXT:    str h0, [sp, #10]370; NONEON-NOSVE-NEXT:    str h0, [sp, #8]371; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]372; NONEON-NOSVE-NEXT:    add sp, sp, #16373; NONEON-NOSVE-NEXT:    ret374  %insert = insertelement <2 x half> poison, half %a, i64 0375  %splat = shufflevector <2 x half> %insert, <2 x half> poison, <2 x i32> zeroinitializer376  ret <2 x half> %splat377}378 379define <4 x half> @splat_v4f16(half %a) {380; CHECK-LABEL: splat_v4f16:381; CHECK:       // %bb.0:382; CHECK-NEXT:    // kill: def $h0 killed $h0 def $z0383; CHECK-NEXT:    mov z0.h, h0384; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0385; CHECK-NEXT:    ret386;387; NONEON-NOSVE-LABEL: splat_v4f16:388; NONEON-NOSVE:       // %bb.0:389; NONEON-NOSVE-NEXT:    sub sp, sp, #16390; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16391; NONEON-NOSVE-NEXT:    str h0, [sp, #14]392; NONEON-NOSVE-NEXT:    str h0, [sp, #12]393; NONEON-NOSVE-NEXT:    str h0, [sp, #10]394; NONEON-NOSVE-NEXT:    str h0, [sp, #8]395; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]396; NONEON-NOSVE-NEXT:    add sp, sp, #16397; NONEON-NOSVE-NEXT:    ret398  %insert = insertelement <4 x half> poison, half %a, i64 0399  %splat = shufflevector <4 x half> %insert, <4 x half> poison, <4 x i32> zeroinitializer400  ret <4 x half> %splat401}402 403define <8 x half> @splat_v8f16(half %a) {404; CHECK-LABEL: splat_v8f16:405; CHECK:       // %bb.0:406; CHECK-NEXT:    // kill: def $h0 killed $h0 def $z0407; CHECK-NEXT:    mov z0.h, h0408; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0409; CHECK-NEXT:    ret410;411; NONEON-NOSVE-LABEL: splat_v8f16:412; NONEON-NOSVE:       // %bb.0:413; NONEON-NOSVE-NEXT:    sub sp, sp, #16414; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16415; NONEON-NOSVE-NEXT:    str h0, [sp, #14]416; NONEON-NOSVE-NEXT:    str h0, [sp, #12]417; NONEON-NOSVE-NEXT:    str h0, [sp, #10]418; NONEON-NOSVE-NEXT:    str h0, [sp, #8]419; NONEON-NOSVE-NEXT:    str h0, [sp, #6]420; NONEON-NOSVE-NEXT:    str h0, [sp, #4]421; NONEON-NOSVE-NEXT:    str h0, [sp, #2]422; NONEON-NOSVE-NEXT:    str h0, [sp]423; NONEON-NOSVE-NEXT:    ldr q0, [sp], #16424; NONEON-NOSVE-NEXT:    ret425  %insert = insertelement <8 x half> poison, half %a, i64 0426  %splat = shufflevector <8 x half> %insert, <8 x half> poison, <8 x i32> zeroinitializer427  ret <8 x half> %splat428}429 430define void @splat_v16f16(half %a, ptr %b) {431; CHECK-LABEL: splat_v16f16:432; CHECK:       // %bb.0:433; CHECK-NEXT:    // kill: def $h0 killed $h0 def $z0434; CHECK-NEXT:    mov z0.h, h0435; CHECK-NEXT:    stp q0, q0, [x0]436; CHECK-NEXT:    ret437;438; NONEON-NOSVE-LABEL: splat_v16f16:439; NONEON-NOSVE:       // %bb.0:440; NONEON-NOSVE-NEXT:    sub sp, sp, #16441; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16442; NONEON-NOSVE-NEXT:    str h0, [sp, #14]443; NONEON-NOSVE-NEXT:    str h0, [sp, #12]444; NONEON-NOSVE-NEXT:    str h0, [sp, #10]445; NONEON-NOSVE-NEXT:    str h0, [sp, #8]446; NONEON-NOSVE-NEXT:    str h0, [sp, #6]447; NONEON-NOSVE-NEXT:    str h0, [sp, #4]448; NONEON-NOSVE-NEXT:    str h0, [sp, #2]449; NONEON-NOSVE-NEXT:    str h0, [sp]450; NONEON-NOSVE-NEXT:    ldr q0, [sp]451; NONEON-NOSVE-NEXT:    stp q0, q0, [x0]452; NONEON-NOSVE-NEXT:    add sp, sp, #16453; NONEON-NOSVE-NEXT:    ret454  %insert = insertelement <16 x half> poison, half %a, i64 0455  %splat = shufflevector <16 x half> %insert, <16 x half> poison, <16 x i32> zeroinitializer456  store <16 x half> %splat, ptr %b457  ret void458}459 460define <2 x float> @splat_v2f32(float %a, <2 x float> %op2) {461; CHECK-LABEL: splat_v2f32:462; CHECK:       // %bb.0:463; CHECK-NEXT:    // kill: def $s0 killed $s0 def $z0464; CHECK-NEXT:    mov z0.s, s0465; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0466; CHECK-NEXT:    ret467;468; NONEON-NOSVE-LABEL: splat_v2f32:469; NONEON-NOSVE:       // %bb.0:470; NONEON-NOSVE-NEXT:    sub sp, sp, #16471; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16472; NONEON-NOSVE-NEXT:    stp s0, s0, [sp, #8]473; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]474; NONEON-NOSVE-NEXT:    add sp, sp, #16475; NONEON-NOSVE-NEXT:    ret476  %insert = insertelement <2 x float> poison, float %a, i64 0477  %splat = shufflevector <2 x float> %insert, <2 x float> poison, <2 x i32> zeroinitializer478  ret <2 x float> %splat479}480 481define <4 x float> @splat_v4f32(float %a, <4 x float> %op2) {482; CHECK-LABEL: splat_v4f32:483; CHECK:       // %bb.0:484; CHECK-NEXT:    // kill: def $s0 killed $s0 def $z0485; CHECK-NEXT:    mov z0.s, s0486; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0487; CHECK-NEXT:    ret488;489; NONEON-NOSVE-LABEL: splat_v4f32:490; NONEON-NOSVE:       // %bb.0:491; NONEON-NOSVE-NEXT:    sub sp, sp, #16492; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16493; NONEON-NOSVE-NEXT:    stp s0, s0, [sp, #8]494; NONEON-NOSVE-NEXT:    stp s0, s0, [sp]495; NONEON-NOSVE-NEXT:    ldr q0, [sp], #16496; NONEON-NOSVE-NEXT:    ret497  %insert = insertelement <4 x float> poison, float %a, i64 0498  %splat = shufflevector <4 x float> %insert, <4 x float> poison, <4 x i32> zeroinitializer499  ret <4 x float> %splat500}501 502define void @splat_v8f32(float %a, ptr %b) {503; CHECK-LABEL: splat_v8f32:504; CHECK:       // %bb.0:505; CHECK-NEXT:    // kill: def $s0 killed $s0 def $z0506; CHECK-NEXT:    mov z0.s, s0507; CHECK-NEXT:    stp q0, q0, [x0]508; CHECK-NEXT:    ret509;510; NONEON-NOSVE-LABEL: splat_v8f32:511; NONEON-NOSVE:       // %bb.0:512; NONEON-NOSVE-NEXT:    sub sp, sp, #16513; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16514; NONEON-NOSVE-NEXT:    stp s0, s0, [sp, #8]515; NONEON-NOSVE-NEXT:    stp s0, s0, [sp]516; NONEON-NOSVE-NEXT:    ldr q0, [sp]517; NONEON-NOSVE-NEXT:    stp q0, q0, [x0]518; NONEON-NOSVE-NEXT:    add sp, sp, #16519; NONEON-NOSVE-NEXT:    ret520  %insert = insertelement <8 x float> poison, float %a, i64 0521  %splat = shufflevector <8 x float> %insert, <8 x float> poison, <8 x i32> zeroinitializer522  store <8 x float> %splat, ptr %b523  ret void524}525 526define <1 x double> @splat_v1f64(double %a, <1 x double> %op2) {527; CHECK-LABEL: splat_v1f64:528; CHECK:       // %bb.0:529; CHECK-NEXT:    ret530;531; NONEON-NOSVE-LABEL: splat_v1f64:532; NONEON-NOSVE:       // %bb.0:533; NONEON-NOSVE-NEXT:    sub sp, sp, #16534; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16535; NONEON-NOSVE-NEXT:    str d0, [sp, #8]536; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]537; NONEON-NOSVE-NEXT:    add sp, sp, #16538; NONEON-NOSVE-NEXT:    ret539  %insert = insertelement <1 x double> poison, double %a, i64 0540  %splat = shufflevector <1 x double> %insert, <1 x double> poison, <1 x i32> zeroinitializer541  ret <1 x double> %splat542}543 544define <2 x double> @splat_v2f64(double %a, <2 x double> %op2) {545; CHECK-LABEL: splat_v2f64:546; CHECK:       // %bb.0:547; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0548; CHECK-NEXT:    mov z0.d, d0549; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0550; CHECK-NEXT:    ret551;552; NONEON-NOSVE-LABEL: splat_v2f64:553; NONEON-NOSVE:       // %bb.0:554; NONEON-NOSVE-NEXT:    stp d0, d0, [sp, #-16]!555; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16556; NONEON-NOSVE-NEXT:    ldr q0, [sp], #16557; NONEON-NOSVE-NEXT:    ret558  %insert = insertelement <2 x double> poison, double %a, i64 0559  %splat = shufflevector <2 x double> %insert, <2 x double> poison, <2 x i32> zeroinitializer560  ret <2 x double> %splat561}562 563define void @splat_v4f64(double %a, ptr %b) {564; CHECK-LABEL: splat_v4f64:565; CHECK:       // %bb.0:566; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0567; CHECK-NEXT:    mov z0.d, d0568; CHECK-NEXT:    stp q0, q0, [x0]569; CHECK-NEXT:    ret570;571; NONEON-NOSVE-LABEL: splat_v4f64:572; NONEON-NOSVE:       // %bb.0:573; NONEON-NOSVE-NEXT:    stp d0, d0, [sp, #-16]!574; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16575; NONEON-NOSVE-NEXT:    ldr q0, [sp]576; NONEON-NOSVE-NEXT:    stp q0, q0, [x0]577; NONEON-NOSVE-NEXT:    add sp, sp, #16578; NONEON-NOSVE-NEXT:    ret579  %insert = insertelement <4 x double> poison, double %a, i64 0580  %splat = shufflevector <4 x double> %insert, <4 x double> poison, <4 x i32> zeroinitializer581  store <4 x double> %splat, ptr %b582  ret void583}584 585;586; DUP (integer immediate)587;588 589define void @splat_imm_v32i8(ptr %a) {590; CHECK-LABEL: splat_imm_v32i8:591; CHECK:       // %bb.0:592; CHECK-NEXT:    mov z0.b, #1 // =0x1593; CHECK-NEXT:    stp q0, q0, [x0]594; CHECK-NEXT:    ret595;596; NONEON-NOSVE-LABEL: splat_imm_v32i8:597; NONEON-NOSVE:       // %bb.0:598; NONEON-NOSVE-NEXT:    adrp x8, .LCPI24_0599; NONEON-NOSVE-NEXT:    ldr q0, [x8, :lo12:.LCPI24_0]600; NONEON-NOSVE-NEXT:    stp q0, q0, [x0]601; NONEON-NOSVE-NEXT:    ret602  store <32 x i8> splat (i8 1), ptr %a603  ret void604}605 606define void @splat_imm_v16i16(ptr %a) {607; CHECK-LABEL: splat_imm_v16i16:608; CHECK:       // %bb.0:609; CHECK-NEXT:    mov z0.h, #2 // =0x2610; CHECK-NEXT:    stp q0, q0, [x0]611; CHECK-NEXT:    ret612;613; NONEON-NOSVE-LABEL: splat_imm_v16i16:614; NONEON-NOSVE:       // %bb.0:615; NONEON-NOSVE-NEXT:    adrp x8, .LCPI25_0616; NONEON-NOSVE-NEXT:    ldr q0, [x8, :lo12:.LCPI25_0]617; NONEON-NOSVE-NEXT:    stp q0, q0, [x0]618; NONEON-NOSVE-NEXT:    ret619  store <16 x i16> splat (i16 2), ptr %a620  ret void621}622 623define void @splat_imm_v8i32(ptr %a) {624; CHECK-LABEL: splat_imm_v8i32:625; CHECK:       // %bb.0:626; CHECK-NEXT:    mov z0.s, #3 // =0x3627; CHECK-NEXT:    stp q0, q0, [x0]628; CHECK-NEXT:    ret629;630; NONEON-NOSVE-LABEL: splat_imm_v8i32:631; NONEON-NOSVE:       // %bb.0:632; NONEON-NOSVE-NEXT:    adrp x8, .LCPI26_0633; NONEON-NOSVE-NEXT:    ldr q0, [x8, :lo12:.LCPI26_0]634; NONEON-NOSVE-NEXT:    stp q0, q0, [x0]635; NONEON-NOSVE-NEXT:    ret636  store <8 x i32> splat (i32 3), ptr %a637  ret void638}639 640define void @splat_imm_v4i64(ptr %a) {641; CHECK-LABEL: splat_imm_v4i64:642; CHECK:       // %bb.0:643; CHECK-NEXT:    mov z0.d, #4 // =0x4644; CHECK-NEXT:    stp q0, q0, [x0]645; CHECK-NEXT:    ret646;647; NONEON-NOSVE-LABEL: splat_imm_v4i64:648; NONEON-NOSVE:       // %bb.0:649; NONEON-NOSVE-NEXT:    adrp x8, .LCPI27_0650; NONEON-NOSVE-NEXT:    ldr q0, [x8, :lo12:.LCPI27_0]651; NONEON-NOSVE-NEXT:    stp q0, q0, [x0]652; NONEON-NOSVE-NEXT:    ret653  store <4 x i64> splat (i64 4), ptr %a654  ret void655}656 657;658; DUP (floating-point immediate)659;660 661define void @splat_imm_v16f16(ptr %a) {662; CHECK-LABEL: splat_imm_v16f16:663; CHECK:       // %bb.0:664; CHECK-NEXT:    fmov z0.h, #5.00000000665; CHECK-NEXT:    stp q0, q0, [x0]666; CHECK-NEXT:    ret667;668; NONEON-NOSVE-LABEL: splat_imm_v16f16:669; NONEON-NOSVE:       // %bb.0:670; NONEON-NOSVE-NEXT:    adrp x8, .LCPI28_0671; NONEON-NOSVE-NEXT:    ldr q0, [x8, :lo12:.LCPI28_0]672; NONEON-NOSVE-NEXT:    stp q0, q0, [x0]673; NONEON-NOSVE-NEXT:    ret674  store <16 x half> splat (half 5.0), ptr %a675  ret void676}677 678define void @splat_imm_v8f32(ptr %a) {679; CHECK-LABEL: splat_imm_v8f32:680; CHECK:       // %bb.0:681; CHECK-NEXT:    fmov z0.s, #6.00000000682; CHECK-NEXT:    stp q0, q0, [x0]683; CHECK-NEXT:    ret684;685; NONEON-NOSVE-LABEL: splat_imm_v8f32:686; NONEON-NOSVE:       // %bb.0:687; NONEON-NOSVE-NEXT:    adrp x8, .LCPI29_0688; NONEON-NOSVE-NEXT:    ldr q0, [x8, :lo12:.LCPI29_0]689; NONEON-NOSVE-NEXT:    stp q0, q0, [x0]690; NONEON-NOSVE-NEXT:    ret691  store <8 x float> splat (float 6.0), ptr %a692  ret void693}694 695define void @splat_imm_v4f64(ptr %a) {696; CHECK-LABEL: splat_imm_v4f64:697; CHECK:       // %bb.0:698; CHECK-NEXT:    fmov z0.d, #7.00000000699; CHECK-NEXT:    stp q0, q0, [x0]700; CHECK-NEXT:    ret701;702; NONEON-NOSVE-LABEL: splat_imm_v4f64:703; NONEON-NOSVE:       // %bb.0:704; NONEON-NOSVE-NEXT:    adrp x8, .LCPI30_0705; NONEON-NOSVE-NEXT:    ldr q0, [x8, :lo12:.LCPI30_0]706; NONEON-NOSVE-NEXT:    stp q0, q0, [x0]707; NONEON-NOSVE-NEXT:    ret708  store <4 x double> splat (double 7.0), ptr %a709  ret void710}711