619 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple aarch64-none-linux-gnu -mattr=+sve | FileCheck %s3 4define <vscale x 16 x i8> @dup_extract_nxv16i8_nxv16i8(<vscale x 16 x i8> %data) {5; CHECK-LABEL: dup_extract_nxv16i8_nxv16i8:6; CHECK: // %bb.0:7; CHECK-NEXT: mov z0.b, z0.b[1]8; CHECK-NEXT: ret9 %1 = extractelement <vscale x 16 x i8> %data, i8 110 %.splatinsert = insertelement <vscale x 16 x i8> poison, i8 %1, i32 011 %.splat = shufflevector <vscale x 16 x i8> %.splatinsert, <vscale x 16 x i8> poison, <vscale x 16 x i32> zeroinitializer12 ret <vscale x 16 x i8> %.splat13}14 15define <vscale x 16 x i8> @dup_extract_nxv16i8_v16i8(<16 x i8> %data) {16; CHECK-LABEL: dup_extract_nxv16i8_v16i8:17; CHECK: // %bb.0:18; CHECK-NEXT: // kill: def $q0 killed $q0 def $z019; CHECK-NEXT: mov z0.b, z0.b[1]20; CHECK-NEXT: ret21 %1 = extractelement <16 x i8> %data, i8 122 %.splatinsert = insertelement <vscale x 16 x i8> poison, i8 %1, i32 023 %.splat = shufflevector <vscale x 16 x i8> %.splatinsert, <vscale x 16 x i8> poison, <vscale x 16 x i32> zeroinitializer24 ret <vscale x 16 x i8> %.splat25}26 27define <vscale x 16 x i8> @dup_extract_nxv16i8_v8i8(<8 x i8> %data) {28; CHECK-LABEL: dup_extract_nxv16i8_v8i8:29; CHECK: // %bb.0:30; CHECK-NEXT: // kill: def $d0 killed $d0 def $z031; CHECK-NEXT: mov z0.b, z0.b[1]32; CHECK-NEXT: ret33 %1 = extractelement <8 x i8> %data, i8 134 %.splatinsert = insertelement <vscale x 16 x i8> poison, i8 %1, i32 035 %.splat = shufflevector <vscale x 16 x i8> %.splatinsert, <vscale x 16 x i8> poison, <vscale x 16 x i32> zeroinitializer36 ret <vscale x 16 x i8> %.splat37}38 39define <vscale x 8 x i16> @dup_extract_nxv8i16_nxv8i16(<vscale x 8 x i16> %data) {40; CHECK-LABEL: dup_extract_nxv8i16_nxv8i16:41; CHECK: // %bb.0:42; CHECK-NEXT: mov z0.h, z0.h[1]43; CHECK-NEXT: ret44 %1 = extractelement <vscale x 8 x i16> %data, i16 145 %.splatinsert = insertelement <vscale x 8 x i16> poison, i16 %1, i32 046 %.splat = shufflevector <vscale x 8 x i16> %.splatinsert, <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer47 ret <vscale x 8 x i16> %.splat48}49 50define <vscale x 8 x i16> @dup_extract_nxv8i16_v8i16(<8 x i16> %data) {51; CHECK-LABEL: dup_extract_nxv8i16_v8i16:52; CHECK: // %bb.0:53; CHECK-NEXT: // kill: def $q0 killed $q0 def $z054; CHECK-NEXT: mov z0.h, z0.h[1]55; CHECK-NEXT: ret56 %1 = extractelement <8 x i16> %data, i16 157 %.splatinsert = insertelement <vscale x 8 x i16> poison, i16 %1, i32 058 %.splat = shufflevector <vscale x 8 x i16> %.splatinsert, <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer59 ret <vscale x 8 x i16> %.splat60}61 62define <vscale x 8 x i16> @dup_extract_nxv8i16_v4i16(<4 x i16> %data) {63; CHECK-LABEL: dup_extract_nxv8i16_v4i16:64; CHECK: // %bb.0:65; CHECK-NEXT: // kill: def $d0 killed $d0 def $z066; CHECK-NEXT: mov z0.h, z0.h[1]67; CHECK-NEXT: ret68 %1 = extractelement <4 x i16> %data, i16 169 %.splatinsert = insertelement <vscale x 8 x i16> poison, i16 %1, i32 070 %.splat = shufflevector <vscale x 8 x i16> %.splatinsert, <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer71 ret <vscale x 8 x i16> %.splat72}73 74define <vscale x 4 x i32> @dup_extract_nxv4i32_nxv4i32(<vscale x 4 x i32> %data) {75; CHECK-LABEL: dup_extract_nxv4i32_nxv4i32:76; CHECK: // %bb.0:77; CHECK-NEXT: mov z0.s, z0.s[1]78; CHECK-NEXT: ret79 %1 = extractelement <vscale x 4 x i32> %data, i32 180 %.splatinsert = insertelement <vscale x 4 x i32> poison, i32 %1, i32 081 %.splat = shufflevector <vscale x 4 x i32> %.splatinsert, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer82 ret <vscale x 4 x i32> %.splat83}84 85define <vscale x 4 x i32> @dup_extract_nxv4i32_v4i32(<4 x i32> %data) {86; CHECK-LABEL: dup_extract_nxv4i32_v4i32:87; CHECK: // %bb.0:88; CHECK-NEXT: // kill: def $q0 killed $q0 def $z089; CHECK-NEXT: mov z0.s, z0.s[1]90; CHECK-NEXT: ret91 %1 = extractelement <4 x i32> %data, i32 192 %.splatinsert = insertelement <vscale x 4 x i32> poison, i32 %1, i32 093 %.splat = shufflevector <vscale x 4 x i32> %.splatinsert, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer94 ret <vscale x 4 x i32> %.splat95}96 97define <vscale x 4 x i32> @dup_extract_nxv4i32_v2i32(<2 x i32> %data) {98; CHECK-LABEL: dup_extract_nxv4i32_v2i32:99; CHECK: // %bb.0:100; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0101; CHECK-NEXT: mov z0.s, z0.s[1]102; CHECK-NEXT: ret103 %1 = extractelement <2 x i32> %data, i32 1104 %.splatinsert = insertelement <vscale x 4 x i32> poison, i32 %1, i32 0105 %.splat = shufflevector <vscale x 4 x i32> %.splatinsert, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer106 ret <vscale x 4 x i32> %.splat107}108 109define <vscale x 2 x i64> @dup_extract_nxv2i64_nxv2i64(<vscale x 2 x i64> %data) {110; CHECK-LABEL: dup_extract_nxv2i64_nxv2i64:111; CHECK: // %bb.0:112; CHECK-NEXT: mov z0.d, z0.d[1]113; CHECK-NEXT: ret114 %1 = extractelement <vscale x 2 x i64> %data, i64 1115 %.splatinsert = insertelement <vscale x 2 x i64> poison, i64 %1, i32 0116 %.splat = shufflevector <vscale x 2 x i64> %.splatinsert, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer117 ret <vscale x 2 x i64> %.splat118}119 120define <vscale x 2 x i64> @dup_extract_nxv2i64_v2i64(<2 x i64> %data) {121; CHECK-LABEL: dup_extract_nxv2i64_v2i64:122; CHECK: // %bb.0:123; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0124; CHECK-NEXT: mov z0.d, z0.d[1]125; CHECK-NEXT: ret126 %1 = extractelement <2 x i64> %data, i64 1127 %.splatinsert = insertelement <vscale x 2 x i64> poison, i64 %1, i32 0128 %.splat = shufflevector <vscale x 2 x i64> %.splatinsert, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer129 ret <vscale x 2 x i64> %.splat130}131 132define <vscale x 2 x i64> @dup_extract_nxv2i64_v1i64(<1 x i64> %data) {133; CHECK-LABEL: dup_extract_nxv2i64_v1i64:134; CHECK: // %bb.0:135; CHECK-NEXT: mov z0.d, x8136; CHECK-NEXT: ret137 %1 = extractelement <1 x i64> %data, i64 1138 %.splatinsert = insertelement <vscale x 2 x i64> poison, i64 %1, i32 0139 %.splat = shufflevector <vscale x 2 x i64> %.splatinsert, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer140 ret <vscale x 2 x i64> %.splat141}142 143define <vscale x 8 x half> @dup_extract_nxv8f16_nxv8f16(<vscale x 8 x half> %data) {144; CHECK-LABEL: dup_extract_nxv8f16_nxv8f16:145; CHECK: // %bb.0:146; CHECK-NEXT: mov z0.h, z0.h[1]147; CHECK-NEXT: ret148 %1 = extractelement <vscale x 8 x half> %data, i16 1149 %.splatinsert = insertelement <vscale x 8 x half> poison, half %1, i32 0150 %.splat = shufflevector <vscale x 8 x half> %.splatinsert, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer151 ret <vscale x 8 x half> %.splat152}153 154define <vscale x 8 x half> @dup_extract_nxv8f16_nxv4f16(<vscale x 4 x half> %data) {155; CHECK-LABEL: dup_extract_nxv8f16_nxv4f16:156; CHECK: // %bb.0:157; CHECK-NEXT: mov z0.s, z0.s[1]158; CHECK-NEXT: mov z0.h, h0159; CHECK-NEXT: ret160 %1 = extractelement <vscale x 4 x half> %data, i16 1161 %.splatinsert = insertelement <vscale x 8 x half> poison, half %1, i32 0162 %.splat = shufflevector <vscale x 8 x half> %.splatinsert, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer163 ret <vscale x 8 x half> %.splat164}165 166define <vscale x 8 x half> @dup_extract_nxv8f16_nxv2f16(<vscale x 2 x half> %data) {167; CHECK-LABEL: dup_extract_nxv8f16_nxv2f16:168; CHECK: // %bb.0:169; CHECK-NEXT: mov z0.d, z0.d[1]170; CHECK-NEXT: mov z0.h, h0171; CHECK-NEXT: ret172 %1 = extractelement <vscale x 2 x half> %data, i16 1173 %.splatinsert = insertelement <vscale x 8 x half> poison, half %1, i32 0174 %.splat = shufflevector <vscale x 8 x half> %.splatinsert, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer175 ret <vscale x 8 x half> %.splat176}177 178define <vscale x 8 x half> @dup_extract_nxv8f16_v8f16(<8 x half> %data) {179; CHECK-LABEL: dup_extract_nxv8f16_v8f16:180; CHECK: // %bb.0:181; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0182; CHECK-NEXT: mov z0.h, z0.h[1]183; CHECK-NEXT: ret184 %1 = extractelement <8 x half> %data, i16 1185 %.splatinsert = insertelement <vscale x 8 x half> poison, half %1, i32 0186 %.splat = shufflevector <vscale x 8 x half> %.splatinsert, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer187 ret <vscale x 8 x half> %.splat188}189 190define <vscale x 8 x half> @dup_extract_nxv8f16_v4f16(<4 x half> %data) {191; CHECK-LABEL: dup_extract_nxv8f16_v4f16:192; CHECK: // %bb.0:193; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0194; CHECK-NEXT: mov z0.h, z0.h[1]195; CHECK-NEXT: ret196 %1 = extractelement <4 x half> %data, i16 1197 %.splatinsert = insertelement <vscale x 8 x half> poison, half %1, i32 0198 %.splat = shufflevector <vscale x 8 x half> %.splatinsert, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer199 ret <vscale x 8 x half> %.splat200}201 202define <vscale x 4 x half> @dup_extract_nxv4f16_nxv8f16(<vscale x 8 x half> %data) {203; CHECK-LABEL: dup_extract_nxv4f16_nxv8f16:204; CHECK: // %bb.0:205; CHECK-NEXT: mov z0.h, z0.h[1]206; CHECK-NEXT: ret207 %1 = extractelement <vscale x 8 x half> %data, i16 1208 %.splatinsert = insertelement <vscale x 4 x half> poison, half %1, i32 0209 %.splat = shufflevector <vscale x 4 x half> %.splatinsert, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer210 ret <vscale x 4 x half> %.splat211}212 213define <vscale x 4 x half> @dup_extract_nxv4f16_nxv4f16(<vscale x 4 x half> %data) {214; CHECK-LABEL: dup_extract_nxv4f16_nxv4f16:215; CHECK: // %bb.0:216; CHECK-NEXT: mov z0.s, z0.s[1]217; CHECK-NEXT: ret218 %1 = extractelement <vscale x 4 x half> %data, i16 1219 %.splatinsert = insertelement <vscale x 4 x half> poison, half %1, i32 0220 %.splat = shufflevector <vscale x 4 x half> %.splatinsert, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer221 ret <vscale x 4 x half> %.splat222}223 224define <vscale x 4 x half> @dup_extract_nxv4f16_nxv2f16(<vscale x 2 x half> %data) {225; CHECK-LABEL: dup_extract_nxv4f16_nxv2f16:226; CHECK: // %bb.0:227; CHECK-NEXT: mov z0.d, z0.d[1]228; CHECK-NEXT: mov z0.h, h0229; CHECK-NEXT: ret230 %1 = extractelement <vscale x 2 x half> %data, i16 1231 %.splatinsert = insertelement <vscale x 4 x half> poison, half %1, i32 0232 %.splat = shufflevector <vscale x 4 x half> %.splatinsert, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer233 ret <vscale x 4 x half> %.splat234}235 236define <vscale x 4 x half> @dup_extract_nxv4f16_v8f16(<8 x half> %data) {237; CHECK-LABEL: dup_extract_nxv4f16_v8f16:238; CHECK: // %bb.0:239; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0240; CHECK-NEXT: mov z0.h, z0.h[1]241; CHECK-NEXT: ret242 %1 = extractelement <8 x half> %data, i16 1243 %.splatinsert = insertelement <vscale x 4 x half> poison, half %1, i32 0244 %.splat = shufflevector <vscale x 4 x half> %.splatinsert, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer245 ret <vscale x 4 x half> %.splat246}247 248define <vscale x 4 x half> @dup_extract_nxv4f16_v4f16(<4 x half> %data) {249; CHECK-LABEL: dup_extract_nxv4f16_v4f16:250; CHECK: // %bb.0:251; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0252; CHECK-NEXT: mov z0.h, z0.h[1]253; CHECK-NEXT: ret254 %1 = extractelement <4 x half> %data, i16 1255 %.splatinsert = insertelement <vscale x 4 x half> poison, half %1, i32 0256 %.splat = shufflevector <vscale x 4 x half> %.splatinsert, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer257 ret <vscale x 4 x half> %.splat258}259 260define <vscale x 2 x half> @dup_extract_nxv2f16_nxv8f16(<vscale x 8 x half> %data) {261; CHECK-LABEL: dup_extract_nxv2f16_nxv8f16:262; CHECK: // %bb.0:263; CHECK-NEXT: mov z0.h, z0.h[1]264; CHECK-NEXT: ret265 %1 = extractelement <vscale x 8 x half> %data, i16 1266 %.splatinsert = insertelement <vscale x 2 x half> poison, half %1, i32 0267 %.splat = shufflevector <vscale x 2 x half> %.splatinsert, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer268 ret <vscale x 2 x half> %.splat269}270 271define <vscale x 2 x half> @dup_extract_nxv2f16_nxv4f16(<vscale x 4 x half> %data) {272; CHECK-LABEL: dup_extract_nxv2f16_nxv4f16:273; CHECK: // %bb.0:274; CHECK-NEXT: mov z0.s, z0.s[1]275; CHECK-NEXT: ret276 %1 = extractelement <vscale x 4 x half> %data, i16 1277 %.splatinsert = insertelement <vscale x 2 x half> poison, half %1, i32 0278 %.splat = shufflevector <vscale x 2 x half> %.splatinsert, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer279 ret <vscale x 2 x half> %.splat280}281 282define <vscale x 2 x half> @dup_extract_nxv2f16_nxv2f16(<vscale x 2 x half> %data) {283; CHECK-LABEL: dup_extract_nxv2f16_nxv2f16:284; CHECK: // %bb.0:285; CHECK-NEXT: mov z0.d, z0.d[1]286; CHECK-NEXT: ret287 %1 = extractelement <vscale x 2 x half> %data, i16 1288 %.splatinsert = insertelement <vscale x 2 x half> poison, half %1, i32 0289 %.splat = shufflevector <vscale x 2 x half> %.splatinsert, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer290 ret <vscale x 2 x half> %.splat291}292 293define <vscale x 2 x half> @dup_extract_nxv2f16_v8f16(<8 x half> %data) {294; CHECK-LABEL: dup_extract_nxv2f16_v8f16:295; CHECK: // %bb.0:296; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0297; CHECK-NEXT: mov z0.h, z0.h[1]298; CHECK-NEXT: ret299 %1 = extractelement <8 x half> %data, i16 1300 %.splatinsert = insertelement <vscale x 2 x half> poison, half %1, i32 0301 %.splat = shufflevector <vscale x 2 x half> %.splatinsert, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer302 ret <vscale x 2 x half> %.splat303}304 305define <vscale x 2 x half> @dup_extract_nxv2f16_v4f16(<4 x half> %data) {306; CHECK-LABEL: dup_extract_nxv2f16_v4f16:307; CHECK: // %bb.0:308; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0309; CHECK-NEXT: mov z0.h, z0.h[1]310; CHECK-NEXT: ret311 %1 = extractelement <4 x half> %data, i16 1312 %.splatinsert = insertelement <vscale x 2 x half> poison, half %1, i32 0313 %.splat = shufflevector <vscale x 2 x half> %.splatinsert, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer314 ret <vscale x 2 x half> %.splat315}316 317define <vscale x 4 x float> @dup_extract_nxv4f32_nxv4f32(<vscale x 4 x float> %data) {318; CHECK-LABEL: dup_extract_nxv4f32_nxv4f32:319; CHECK: // %bb.0:320; CHECK-NEXT: mov z0.s, z0.s[1]321; CHECK-NEXT: ret322 %1 = extractelement <vscale x 4 x float> %data, i32 1323 %.splatinsert = insertelement <vscale x 4 x float> poison, float %1, i32 0324 %.splat = shufflevector <vscale x 4 x float> %.splatinsert, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer325 ret <vscale x 4 x float> %.splat326}327 328define <vscale x 4 x float> @dup_extract_nxv4f32_nxv2f32(<vscale x 2 x float> %data) {329; CHECK-LABEL: dup_extract_nxv4f32_nxv2f32:330; CHECK: // %bb.0:331; CHECK-NEXT: mov z0.d, z0.d[1]332; CHECK-NEXT: mov z0.s, s0333; CHECK-NEXT: ret334 %1 = extractelement <vscale x 2 x float> %data, i32 1335 %.splatinsert = insertelement <vscale x 4 x float> poison, float %1, i32 0336 %.splat = shufflevector <vscale x 4 x float> %.splatinsert, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer337 ret <vscale x 4 x float> %.splat338}339 340define <vscale x 4 x float> @dup_extract_nxv4f32_v4f32(<4 x float> %data) {341; CHECK-LABEL: dup_extract_nxv4f32_v4f32:342; CHECK: // %bb.0:343; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0344; CHECK-NEXT: mov z0.s, z0.s[1]345; CHECK-NEXT: ret346 %1 = extractelement <4 x float> %data, i32 1347 %.splatinsert = insertelement <vscale x 4 x float> poison, float %1, i32 0348 %.splat = shufflevector <vscale x 4 x float> %.splatinsert, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer349 ret <vscale x 4 x float> %.splat350}351 352define <vscale x 4 x float> @dup_extract_nxv4f32_v2f32(<2 x float> %data) {353; CHECK-LABEL: dup_extract_nxv4f32_v2f32:354; CHECK: // %bb.0:355; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0356; CHECK-NEXT: mov z0.s, z0.s[1]357; CHECK-NEXT: ret358 %1 = extractelement <2 x float> %data, i32 1359 %.splatinsert = insertelement <vscale x 4 x float> poison, float %1, i32 0360 %.splat = shufflevector <vscale x 4 x float> %.splatinsert, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer361 ret <vscale x 4 x float> %.splat362}363 364define <vscale x 2 x float> @dup_extract_nxv2f32_nxv4f32(<vscale x 4 x float> %data) {365; CHECK-LABEL: dup_extract_nxv2f32_nxv4f32:366; CHECK: // %bb.0:367; CHECK-NEXT: mov z0.s, z0.s[1]368; CHECK-NEXT: ret369 %1 = extractelement <vscale x 4 x float> %data, i32 1370 %.splatinsert = insertelement <vscale x 2 x float> poison, float %1, i32 0371 %.splat = shufflevector <vscale x 2 x float> %.splatinsert, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer372 ret <vscale x 2 x float> %.splat373}374 375define <vscale x 2 x float> @dup_extract_nxv2f32_nxv2f32(<vscale x 2 x float> %data) {376; CHECK-LABEL: dup_extract_nxv2f32_nxv2f32:377; CHECK: // %bb.0:378; CHECK-NEXT: mov z0.d, z0.d[1]379; CHECK-NEXT: ret380 %1 = extractelement <vscale x 2 x float> %data, i32 1381 %.splatinsert = insertelement <vscale x 2 x float> poison, float %1, i32 0382 %.splat = shufflevector <vscale x 2 x float> %.splatinsert, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer383 ret <vscale x 2 x float> %.splat384}385 386define <vscale x 2 x float> @dup_extract_nxv2f32_v4f32(<4 x float> %data) {387; CHECK-LABEL: dup_extract_nxv2f32_v4f32:388; CHECK: // %bb.0:389; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0390; CHECK-NEXT: mov z0.s, z0.s[1]391; CHECK-NEXT: ret392 %1 = extractelement <4 x float> %data, i32 1393 %.splatinsert = insertelement <vscale x 2 x float> poison, float %1, i32 0394 %.splat = shufflevector <vscale x 2 x float> %.splatinsert, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer395 ret <vscale x 2 x float> %.splat396}397 398define <vscale x 2 x float> @dup_extract_nxv2f32_v2f32(<2 x float> %data) {399; CHECK-LABEL: dup_extract_nxv2f32_v2f32:400; CHECK: // %bb.0:401; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0402; CHECK-NEXT: mov z0.s, z0.s[1]403; CHECK-NEXT: ret404 %1 = extractelement <2 x float> %data, i32 1405 %.splatinsert = insertelement <vscale x 2 x float> poison, float %1, i32 0406 %.splat = shufflevector <vscale x 2 x float> %.splatinsert, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer407 ret <vscale x 2 x float> %.splat408}409 410define <vscale x 2 x double> @dup_extract_nxv2f64_nxv2f64(<vscale x 2 x double> %data) {411; CHECK-LABEL: dup_extract_nxv2f64_nxv2f64:412; CHECK: // %bb.0:413; CHECK-NEXT: mov z0.d, z0.d[1]414; CHECK-NEXT: ret415 %1 = extractelement <vscale x 2 x double> %data, i64 1416 %.splatinsert = insertelement <vscale x 2 x double> poison, double %1, i32 0417 %.splat = shufflevector <vscale x 2 x double> %.splatinsert, <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer418 ret <vscale x 2 x double> %.splat419}420 421define <vscale x 2 x double> @dup_extract_nxv2f64_v2f64(<2 x double> %data) {422; CHECK-LABEL: dup_extract_nxv2f64_v2f64:423; CHECK: // %bb.0:424; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0425; CHECK-NEXT: mov z0.d, z0.d[1]426; CHECK-NEXT: ret427 %1 = extractelement <2 x double> %data, i64 1428 %.splatinsert = insertelement <vscale x 2 x double> poison, double %1, i32 0429 %.splat = shufflevector <vscale x 2 x double> %.splatinsert, <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer430 ret <vscale x 2 x double> %.splat431}432 433define <vscale x 2 x double> @dup_extract_nxv2f64_v1f64(<1 x double> %data) {434; CHECK-LABEL: dup_extract_nxv2f64_v1f64:435; CHECK: // %bb.0:436; CHECK-NEXT: mov z0.d, d0437; CHECK-NEXT: ret438 %1 = extractelement <1 x double> %data, i64 1439 %.splatinsert = insertelement <vscale x 2 x double> poison, double %1, i32 0440 %.splat = shufflevector <vscale x 2 x double> %.splatinsert, <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer441 ret <vscale x 2 x double> %.splat442}443 444define <vscale x 8 x bfloat> @dup_extract_nxv8bf16_nxv8bf16(<vscale x 8 x bfloat> %data) {445; CHECK-LABEL: dup_extract_nxv8bf16_nxv8bf16:446; CHECK: // %bb.0:447; CHECK-NEXT: mov z0.h, z0.h[1]448; CHECK-NEXT: ret449 %1 = extractelement <vscale x 8 x bfloat> %data, i16 1450 %.splatinsert = insertelement <vscale x 8 x bfloat> poison, bfloat %1, i32 0451 %.splat = shufflevector <vscale x 8 x bfloat> %.splatinsert, <vscale x 8 x bfloat> poison, <vscale x 8 x i32> zeroinitializer452 ret <vscale x 8 x bfloat> %.splat453}454 455define <vscale x 8 x bfloat> @dup_extract_nxv8bf16_nxv4bf16(<vscale x 4 x bfloat> %data) {456; CHECK-LABEL: dup_extract_nxv8bf16_nxv4bf16:457; CHECK: // %bb.0:458; CHECK-NEXT: mov z0.s, z0.s[1]459; CHECK-NEXT: mov z0.h, h0460; CHECK-NEXT: ret461 %1 = extractelement <vscale x 4 x bfloat> %data, i16 1462 %.splatinsert = insertelement <vscale x 8 x bfloat> poison, bfloat %1, i32 0463 %.splat = shufflevector <vscale x 8 x bfloat> %.splatinsert, <vscale x 8 x bfloat> poison, <vscale x 8 x i32> zeroinitializer464 ret <vscale x 8 x bfloat> %.splat465}466 467define <vscale x 8 x bfloat> @dup_extract_nxv8bf16_nxv2bf16(<vscale x 2 x bfloat> %data) {468; CHECK-LABEL: dup_extract_nxv8bf16_nxv2bf16:469; CHECK: // %bb.0:470; CHECK-NEXT: mov z0.d, z0.d[1]471; CHECK-NEXT: mov z0.h, h0472; CHECK-NEXT: ret473 %1 = extractelement <vscale x 2 x bfloat> %data, i16 1474 %.splatinsert = insertelement <vscale x 8 x bfloat> poison, bfloat %1, i32 0475 %.splat = shufflevector <vscale x 8 x bfloat> %.splatinsert, <vscale x 8 x bfloat> poison, <vscale x 8 x i32> zeroinitializer476 ret <vscale x 8 x bfloat> %.splat477}478 479define <vscale x 8 x bfloat> @dup_extract_nxv8bf16_v8bf16(<8 x bfloat> %data) {480; CHECK-LABEL: dup_extract_nxv8bf16_v8bf16:481; CHECK: // %bb.0:482; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0483; CHECK-NEXT: mov z0.h, z0.h[1]484; CHECK-NEXT: ret485 %1 = extractelement <8 x bfloat> %data, i16 1486 %.splatinsert = insertelement <vscale x 8 x bfloat> poison, bfloat %1, i32 0487 %.splat = shufflevector <vscale x 8 x bfloat> %.splatinsert, <vscale x 8 x bfloat> poison, <vscale x 8 x i32> zeroinitializer488 ret <vscale x 8 x bfloat> %.splat489}490 491define <vscale x 8 x bfloat> @dup_extract_nxv8bf16_v4bf16(<4 x bfloat> %data) {492; CHECK-LABEL: dup_extract_nxv8bf16_v4bf16:493; CHECK: // %bb.0:494; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0495; CHECK-NEXT: mov z0.h, z0.h[1]496; CHECK-NEXT: ret497 %1 = extractelement <4 x bfloat> %data, i16 1498 %.splatinsert = insertelement <vscale x 8 x bfloat> poison, bfloat %1, i32 0499 %.splat = shufflevector <vscale x 8 x bfloat> %.splatinsert, <vscale x 8 x bfloat> poison, <vscale x 8 x i32> zeroinitializer500 ret <vscale x 8 x bfloat> %.splat501}502 503define <vscale x 4 x bfloat> @dup_extract_nxv4bf16_nxv8bf16(<vscale x 8 x bfloat> %data) {504; CHECK-LABEL: dup_extract_nxv4bf16_nxv8bf16:505; CHECK: // %bb.0:506; CHECK-NEXT: mov z0.h, z0.h[1]507; CHECK-NEXT: ret508 %1 = extractelement <vscale x 8 x bfloat> %data, i16 1509 %.splatinsert = insertelement <vscale x 4 x bfloat> poison, bfloat %1, i32 0510 %.splat = shufflevector <vscale x 4 x bfloat> %.splatinsert, <vscale x 4 x bfloat> poison, <vscale x 4 x i32> zeroinitializer511 ret <vscale x 4 x bfloat> %.splat512}513 514define <vscale x 4 x bfloat> @dup_extract_nxv4bf16_nxv4bf16(<vscale x 4 x bfloat> %data) {515; CHECK-LABEL: dup_extract_nxv4bf16_nxv4bf16:516; CHECK: // %bb.0:517; CHECK-NEXT: mov z0.s, z0.s[1]518; CHECK-NEXT: ret519 %1 = extractelement <vscale x 4 x bfloat> %data, i16 1520 %.splatinsert = insertelement <vscale x 4 x bfloat> poison, bfloat %1, i32 0521 %.splat = shufflevector <vscale x 4 x bfloat> %.splatinsert, <vscale x 4 x bfloat> poison, <vscale x 4 x i32> zeroinitializer522 ret <vscale x 4 x bfloat> %.splat523}524 525define <vscale x 4 x bfloat> @dup_extract_nxv4bf16_nxv2bf16(<vscale x 2 x bfloat> %data) {526; CHECK-LABEL: dup_extract_nxv4bf16_nxv2bf16:527; CHECK: // %bb.0:528; CHECK-NEXT: mov z0.d, z0.d[1]529; CHECK-NEXT: mov z0.h, h0530; CHECK-NEXT: ret531 %1 = extractelement <vscale x 2 x bfloat> %data, i16 1532 %.splatinsert = insertelement <vscale x 4 x bfloat> poison, bfloat %1, i32 0533 %.splat = shufflevector <vscale x 4 x bfloat> %.splatinsert, <vscale x 4 x bfloat> poison, <vscale x 4 x i32> zeroinitializer534 ret <vscale x 4 x bfloat> %.splat535}536 537define <vscale x 4 x bfloat> @dup_extract_nxv4bf16_v8bf16(<8 x bfloat> %data) {538; CHECK-LABEL: dup_extract_nxv4bf16_v8bf16:539; CHECK: // %bb.0:540; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0541; CHECK-NEXT: mov z0.h, z0.h[1]542; CHECK-NEXT: ret543 %1 = extractelement <8 x bfloat> %data, i16 1544 %.splatinsert = insertelement <vscale x 4 x bfloat> poison, bfloat %1, i32 0545 %.splat = shufflevector <vscale x 4 x bfloat> %.splatinsert, <vscale x 4 x bfloat> poison, <vscale x 4 x i32> zeroinitializer546 ret <vscale x 4 x bfloat> %.splat547}548 549define <vscale x 4 x bfloat> @dup_extract_nxv4bf16_v4bf16(<4 x bfloat> %data) {550; CHECK-LABEL: dup_extract_nxv4bf16_v4bf16:551; CHECK: // %bb.0:552; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0553; CHECK-NEXT: mov z0.h, z0.h[1]554; CHECK-NEXT: ret555 %1 = extractelement <4 x bfloat> %data, i16 1556 %.splatinsert = insertelement <vscale x 4 x bfloat> poison, bfloat %1, i32 0557 %.splat = shufflevector <vscale x 4 x bfloat> %.splatinsert, <vscale x 4 x bfloat> poison, <vscale x 4 x i32> zeroinitializer558 ret <vscale x 4 x bfloat> %.splat559}560 561define <vscale x 2 x bfloat> @dup_extract_nxv2bf16_nxv8bf16(<vscale x 8 x bfloat> %data) {562; CHECK-LABEL: dup_extract_nxv2bf16_nxv8bf16:563; CHECK: // %bb.0:564; CHECK-NEXT: mov z0.h, z0.h[1]565; CHECK-NEXT: ret566 %1 = extractelement <vscale x 8 x bfloat> %data, i16 1567 %.splatinsert = insertelement <vscale x 2 x bfloat> poison, bfloat %1, i32 0568 %.splat = shufflevector <vscale x 2 x bfloat> %.splatinsert, <vscale x 2 x bfloat> poison, <vscale x 2 x i32> zeroinitializer569 ret <vscale x 2 x bfloat> %.splat570}571 572define <vscale x 2 x bfloat> @dup_extract_nxv2bf16_nxv4bf16(<vscale x 4 x bfloat> %data) {573; CHECK-LABEL: dup_extract_nxv2bf16_nxv4bf16:574; CHECK: // %bb.0:575; CHECK-NEXT: mov z0.s, z0.s[1]576; CHECK-NEXT: ret577 %1 = extractelement <vscale x 4 x bfloat> %data, i16 1578 %.splatinsert = insertelement <vscale x 2 x bfloat> poison, bfloat %1, i32 0579 %.splat = shufflevector <vscale x 2 x bfloat> %.splatinsert, <vscale x 2 x bfloat> poison, <vscale x 2 x i32> zeroinitializer580 ret <vscale x 2 x bfloat> %.splat581}582 583define <vscale x 2 x bfloat> @dup_extract_nxv2bf16_nxv2bf16(<vscale x 2 x bfloat> %data) {584; CHECK-LABEL: dup_extract_nxv2bf16_nxv2bf16:585; CHECK: // %bb.0:586; CHECK-NEXT: mov z0.d, z0.d[1]587; CHECK-NEXT: ret588 %1 = extractelement <vscale x 2 x bfloat> %data, i16 1589 %.splatinsert = insertelement <vscale x 2 x bfloat> poison, bfloat %1, i32 0590 %.splat = shufflevector <vscale x 2 x bfloat> %.splatinsert, <vscale x 2 x bfloat> poison, <vscale x 2 x i32> zeroinitializer591 ret <vscale x 2 x bfloat> %.splat592}593 594define <vscale x 2 x bfloat> @dup_extract_nxv2bf16_v8bf16(<8 x bfloat> %data) {595; CHECK-LABEL: dup_extract_nxv2bf16_v8bf16:596; CHECK: // %bb.0:597; CHECK-NEXT: // kill: def $q0 killed $q0 def $z0598; CHECK-NEXT: mov z0.h, z0.h[1]599; CHECK-NEXT: ret600 %1 = extractelement <8 x bfloat> %data, i16 1601 %.splatinsert = insertelement <vscale x 2 x bfloat> poison, bfloat %1, i32 0602 %.splat = shufflevector <vscale x 2 x bfloat> %.splatinsert, <vscale x 2 x bfloat> poison, <vscale x 2 x i32> zeroinitializer603 ret <vscale x 2 x bfloat> %.splat604}605 606define <vscale x 2 x bfloat> @dup_extract_nxv2bf16_v4bf16(<4 x bfloat> %data) {607; CHECK-LABEL: dup_extract_nxv2bf16_v4bf16:608; CHECK: // %bb.0:609; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0610; CHECK-NEXT: mov z0.h, z0.h[1]611; CHECK-NEXT: ret612 %1 = extractelement <4 x bfloat> %data, i16 1613 %.splatinsert = insertelement <vscale x 2 x bfloat> poison, bfloat %1, i32 0614 %.splat = shufflevector <vscale x 2 x bfloat> %.splatinsert, <vscale x 2 x bfloat> poison, <vscale x 2 x i32> zeroinitializer615 ret <vscale x 2 x bfloat> %.splat616}617 618attributes #0 = { "target-features"="+sve" }619