644 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=aarch64-- | FileCheck %s3 4define <2 x i64> @extract0_i32_zext_insert0_i64_undef(<4 x i32> %x) {5; CHECK-LABEL: extract0_i32_zext_insert0_i64_undef:6; CHECK: // %bb.0:7; CHECK-NEXT: mov v0.s[1], wzr8; CHECK-NEXT: ret9 %e = extractelement <4 x i32> %x, i32 010 %z = zext i32 %e to i6411 %r = insertelement <2 x i64> undef, i64 %z, i32 012 ret <2 x i64> %r13}14 15define <2 x i64> @extract0_i32_zext_insert0_i64_zero(<4 x i32> %x) {16; CHECK-LABEL: extract0_i32_zext_insert0_i64_zero:17; CHECK: // %bb.0:18; CHECK-NEXT: movi v1.2d, #000000000000000019; CHECK-NEXT: mov v1.s[0], v0.s[0]20; CHECK-NEXT: mov v0.16b, v1.16b21; CHECK-NEXT: ret22 %e = extractelement <4 x i32> %x, i32 023 %z = zext i32 %e to i6424 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 025 ret <2 x i64> %r26}27 28define <2 x i64> @extract1_i32_zext_insert0_i64_undef(<4 x i32> %x) {29; CHECK-LABEL: extract1_i32_zext_insert0_i64_undef:30; CHECK: // %bb.0:31; CHECK-NEXT: mov w8, v0.s[1]32; CHECK-NEXT: fmov d0, x833; CHECK-NEXT: ret34 %e = extractelement <4 x i32> %x, i32 135 %z = zext i32 %e to i6436 %r = insertelement <2 x i64> undef, i64 %z, i32 037 ret <2 x i64> %r38}39 40define <2 x i64> @extract1_i32_zext_insert0_i64_zero(<4 x i32> %x) {41; CHECK-LABEL: extract1_i32_zext_insert0_i64_zero:42; CHECK: // %bb.0:43; CHECK-NEXT: movi v1.2d, #000000000000000044; CHECK-NEXT: mov v1.s[0], v0.s[1]45; CHECK-NEXT: mov v0.16b, v1.16b46; CHECK-NEXT: ret47 %e = extractelement <4 x i32> %x, i32 148 %z = zext i32 %e to i6449 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 050 ret <2 x i64> %r51}52 53define <2 x i64> @extract2_i32_zext_insert0_i64_undef(<4 x i32> %x) {54; CHECK-LABEL: extract2_i32_zext_insert0_i64_undef:55; CHECK: // %bb.0:56; CHECK-NEXT: mov w8, v0.s[2]57; CHECK-NEXT: fmov d0, x858; CHECK-NEXT: ret59 %e = extractelement <4 x i32> %x, i32 260 %z = zext i32 %e to i6461 %r = insertelement <2 x i64> undef, i64 %z, i32 062 ret <2 x i64> %r63}64 65define <2 x i64> @extract2_i32_zext_insert0_i64_zero(<4 x i32> %x) {66; CHECK-LABEL: extract2_i32_zext_insert0_i64_zero:67; CHECK: // %bb.0:68; CHECK-NEXT: movi v1.2d, #000000000000000069; CHECK-NEXT: mov v1.s[0], v0.s[2]70; CHECK-NEXT: mov v0.16b, v1.16b71; CHECK-NEXT: ret72 %e = extractelement <4 x i32> %x, i32 273 %z = zext i32 %e to i6474 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 075 ret <2 x i64> %r76}77 78define <2 x i64> @extract3_i32_zext_insert0_i64_undef(<4 x i32> %x) {79; CHECK-LABEL: extract3_i32_zext_insert0_i64_undef:80; CHECK: // %bb.0:81; CHECK-NEXT: movi v1.2d, #000000000000000082; CHECK-NEXT: ext v0.16b, v0.16b, v1.16b, #1283; CHECK-NEXT: ret84 %e = extractelement <4 x i32> %x, i32 385 %z = zext i32 %e to i6486 %r = insertelement <2 x i64> undef, i64 %z, i32 087 ret <2 x i64> %r88}89 90define <2 x i64> @extract3_i32_zext_insert0_i64_zero(<4 x i32> %x) {91; CHECK-LABEL: extract3_i32_zext_insert0_i64_zero:92; CHECK: // %bb.0:93; CHECK-NEXT: movi v1.2d, #000000000000000094; CHECK-NEXT: mov v1.s[0], v0.s[3]95; CHECK-NEXT: mov v0.16b, v1.16b96; CHECK-NEXT: ret97 %e = extractelement <4 x i32> %x, i32 398 %z = zext i32 %e to i6499 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 0100 ret <2 x i64> %r101}102 103define <2 x i64> @extract0_i32_zext_insert1_i64_undef(<4 x i32> %x) {104; CHECK-LABEL: extract0_i32_zext_insert1_i64_undef:105; CHECK: // %bb.0:106; CHECK-NEXT: fmov w8, s0107; CHECK-NEXT: dup v0.2d, x8108; CHECK-NEXT: ret109 %e = extractelement <4 x i32> %x, i32 0110 %z = zext i32 %e to i64111 %r = insertelement <2 x i64> undef, i64 %z, i32 1112 ret <2 x i64> %r113}114 115define <2 x i64> @extract0_i32_zext_insert1_i64_zero(<4 x i32> %x) {116; CHECK-LABEL: extract0_i32_zext_insert1_i64_zero:117; CHECK: // %bb.0:118; CHECK-NEXT: movi v1.2d, #0000000000000000119; CHECK-NEXT: fmov w8, s0120; CHECK-NEXT: mov v1.d[1], x8121; CHECK-NEXT: mov v0.16b, v1.16b122; CHECK-NEXT: ret123 %e = extractelement <4 x i32> %x, i32 0124 %z = zext i32 %e to i64125 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1126 ret <2 x i64> %r127}128 129define <2 x i64> @extract1_i32_zext_insert1_i64_undef(<4 x i32> %x) {130; CHECK-LABEL: extract1_i32_zext_insert1_i64_undef:131; CHECK: // %bb.0:132; CHECK-NEXT: mov w8, v0.s[1]133; CHECK-NEXT: dup v0.2d, x8134; CHECK-NEXT: ret135 %e = extractelement <4 x i32> %x, i32 1136 %z = zext i32 %e to i64137 %r = insertelement <2 x i64> undef, i64 %z, i32 1138 ret <2 x i64> %r139}140 141define <2 x i64> @extract1_i32_zext_insert1_i64_zero(<4 x i32> %x) {142; CHECK-LABEL: extract1_i32_zext_insert1_i64_zero:143; CHECK: // %bb.0:144; CHECK-NEXT: movi v1.2d, #0000000000000000145; CHECK-NEXT: mov w8, v0.s[1]146; CHECK-NEXT: mov v1.d[1], x8147; CHECK-NEXT: mov v0.16b, v1.16b148; CHECK-NEXT: ret149 %e = extractelement <4 x i32> %x, i32 1150 %z = zext i32 %e to i64151 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1152 ret <2 x i64> %r153}154 155define <2 x i64> @extract2_i32_zext_insert1_i64_undef(<4 x i32> %x) {156; CHECK-LABEL: extract2_i32_zext_insert1_i64_undef:157; CHECK: // %bb.0:158; CHECK-NEXT: mov v0.s[3], wzr159; CHECK-NEXT: ret160 %e = extractelement <4 x i32> %x, i32 2161 %z = zext i32 %e to i64162 %r = insertelement <2 x i64> undef, i64 %z, i32 1163 ret <2 x i64> %r164}165 166define <2 x i64> @extract2_i32_zext_insert1_i64_zero(<4 x i32> %x) {167; CHECK-LABEL: extract2_i32_zext_insert1_i64_zero:168; CHECK: // %bb.0:169; CHECK-NEXT: movi v1.2d, #0000000000000000170; CHECK-NEXT: mov w8, v0.s[2]171; CHECK-NEXT: mov v1.d[1], x8172; CHECK-NEXT: mov v0.16b, v1.16b173; CHECK-NEXT: ret174 %e = extractelement <4 x i32> %x, i32 2175 %z = zext i32 %e to i64176 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1177 ret <2 x i64> %r178}179 180define <2 x i64> @extract3_i32_zext_insert1_i64_undef(<4 x i32> %x) {181; CHECK-LABEL: extract3_i32_zext_insert1_i64_undef:182; CHECK: // %bb.0:183; CHECK-NEXT: movi v1.2d, #0000000000000000184; CHECK-NEXT: ext v0.16b, v0.16b, v1.16b, #4185; CHECK-NEXT: ret186 %e = extractelement <4 x i32> %x, i32 3187 %z = zext i32 %e to i64188 %r = insertelement <2 x i64> undef, i64 %z, i32 1189 ret <2 x i64> %r190}191 192define <2 x i64> @extract3_i32_zext_insert1_i64_zero(<4 x i32> %x) {193; CHECK-LABEL: extract3_i32_zext_insert1_i64_zero:194; CHECK: // %bb.0:195; CHECK-NEXT: movi v1.2d, #0000000000000000196; CHECK-NEXT: mov w8, v0.s[3]197; CHECK-NEXT: mov v1.d[1], x8198; CHECK-NEXT: mov v0.16b, v1.16b199; CHECK-NEXT: ret200 %e = extractelement <4 x i32> %x, i32 3201 %z = zext i32 %e to i64202 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1203 ret <2 x i64> %r204}205 206define <2 x i64> @extract0_i16_zext_insert0_i64_undef(<8 x i16> %x) {207; CHECK-LABEL: extract0_i16_zext_insert0_i64_undef:208; CHECK: // %bb.0:209; CHECK-NEXT: umov w8, v0.h[0]210; CHECK-NEXT: fmov d0, x8211; CHECK-NEXT: ret212 %e = extractelement <8 x i16> %x, i32 0213 %z = zext i16 %e to i64214 %r = insertelement <2 x i64> undef, i64 %z, i32 0215 ret <2 x i64> %r216}217 218define <2 x i64> @extract0_i16_zext_insert0_i64_zero(<8 x i16> %x) {219; CHECK-LABEL: extract0_i16_zext_insert0_i64_zero:220; CHECK: // %bb.0:221; CHECK-NEXT: movi v1.2d, #0000000000000000222; CHECK-NEXT: umov w8, v0.h[0]223; CHECK-NEXT: mov v1.s[0], w8224; CHECK-NEXT: mov v0.16b, v1.16b225; CHECK-NEXT: ret226 %e = extractelement <8 x i16> %x, i32 0227 %z = zext i16 %e to i64228 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 0229 ret <2 x i64> %r230}231 232define <2 x i64> @extract1_i16_zext_insert0_i64_undef(<8 x i16> %x) {233; CHECK-LABEL: extract1_i16_zext_insert0_i64_undef:234; CHECK: // %bb.0:235; CHECK-NEXT: umov w8, v0.h[1]236; CHECK-NEXT: fmov d0, x8237; CHECK-NEXT: ret238 %e = extractelement <8 x i16> %x, i32 1239 %z = zext i16 %e to i64240 %r = insertelement <2 x i64> undef, i64 %z, i32 0241 ret <2 x i64> %r242}243 244define <2 x i64> @extract1_i16_zext_insert0_i64_zero(<8 x i16> %x) {245; CHECK-LABEL: extract1_i16_zext_insert0_i64_zero:246; CHECK: // %bb.0:247; CHECK-NEXT: movi v1.2d, #0000000000000000248; CHECK-NEXT: umov w8, v0.h[1]249; CHECK-NEXT: mov v1.s[0], w8250; CHECK-NEXT: mov v0.16b, v1.16b251; CHECK-NEXT: ret252 %e = extractelement <8 x i16> %x, i32 1253 %z = zext i16 %e to i64254 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 0255 ret <2 x i64> %r256}257 258define <2 x i64> @extract2_i16_zext_insert0_i64_undef(<8 x i16> %x) {259; CHECK-LABEL: extract2_i16_zext_insert0_i64_undef:260; CHECK: // %bb.0:261; CHECK-NEXT: umov w8, v0.h[2]262; CHECK-NEXT: fmov d0, x8263; CHECK-NEXT: ret264 %e = extractelement <8 x i16> %x, i32 2265 %z = zext i16 %e to i64266 %r = insertelement <2 x i64> undef, i64 %z, i32 0267 ret <2 x i64> %r268}269 270define <2 x i64> @extract2_i16_zext_insert0_i64_zero(<8 x i16> %x) {271; CHECK-LABEL: extract2_i16_zext_insert0_i64_zero:272; CHECK: // %bb.0:273; CHECK-NEXT: movi v1.2d, #0000000000000000274; CHECK-NEXT: umov w8, v0.h[2]275; CHECK-NEXT: mov v1.s[0], w8276; CHECK-NEXT: mov v0.16b, v1.16b277; CHECK-NEXT: ret278 %e = extractelement <8 x i16> %x, i32 2279 %z = zext i16 %e to i64280 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 0281 ret <2 x i64> %r282}283 284define <2 x i64> @extract3_i16_zext_insert0_i64_undef(<8 x i16> %x) {285; CHECK-LABEL: extract3_i16_zext_insert0_i64_undef:286; CHECK: // %bb.0:287; CHECK-NEXT: umov w8, v0.h[3]288; CHECK-NEXT: fmov d0, x8289; CHECK-NEXT: ret290 %e = extractelement <8 x i16> %x, i32 3291 %z = zext i16 %e to i64292 %r = insertelement <2 x i64> undef, i64 %z, i32 0293 ret <2 x i64> %r294}295 296define <2 x i64> @extract3_i16_zext_insert0_i64_zero(<8 x i16> %x) {297; CHECK-LABEL: extract3_i16_zext_insert0_i64_zero:298; CHECK: // %bb.0:299; CHECK-NEXT: movi v1.2d, #0000000000000000300; CHECK-NEXT: umov w8, v0.h[3]301; CHECK-NEXT: mov v1.s[0], w8302; CHECK-NEXT: mov v0.16b, v1.16b303; CHECK-NEXT: ret304 %e = extractelement <8 x i16> %x, i32 3305 %z = zext i16 %e to i64306 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 0307 ret <2 x i64> %r308}309 310define <2 x i64> @extract0_i16_zext_insert1_i64_undef(<8 x i16> %x) {311; CHECK-LABEL: extract0_i16_zext_insert1_i64_undef:312; CHECK: // %bb.0:313; CHECK-NEXT: umov w8, v0.h[0]314; CHECK-NEXT: dup v0.2d, x8315; CHECK-NEXT: ret316 %e = extractelement <8 x i16> %x, i32 0317 %z = zext i16 %e to i64318 %r = insertelement <2 x i64> undef, i64 %z, i32 1319 ret <2 x i64> %r320}321 322define <2 x i64> @extract0_i16_zext_insert1_i64_zero(<8 x i16> %x) {323; CHECK-LABEL: extract0_i16_zext_insert1_i64_zero:324; CHECK: // %bb.0:325; CHECK-NEXT: movi v1.2d, #0000000000000000326; CHECK-NEXT: umov w8, v0.h[0]327; CHECK-NEXT: mov v1.d[1], x8328; CHECK-NEXT: mov v0.16b, v1.16b329; CHECK-NEXT: ret330 %e = extractelement <8 x i16> %x, i32 0331 %z = zext i16 %e to i64332 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1333 ret <2 x i64> %r334}335 336define <2 x i64> @extract1_i16_zext_insert1_i64_undef(<8 x i16> %x) {337; CHECK-LABEL: extract1_i16_zext_insert1_i64_undef:338; CHECK: // %bb.0:339; CHECK-NEXT: umov w8, v0.h[1]340; CHECK-NEXT: dup v0.2d, x8341; CHECK-NEXT: ret342 %e = extractelement <8 x i16> %x, i32 1343 %z = zext i16 %e to i64344 %r = insertelement <2 x i64> undef, i64 %z, i32 1345 ret <2 x i64> %r346}347 348define <2 x i64> @extract1_i16_zext_insert1_i64_zero(<8 x i16> %x) {349; CHECK-LABEL: extract1_i16_zext_insert1_i64_zero:350; CHECK: // %bb.0:351; CHECK-NEXT: movi v1.2d, #0000000000000000352; CHECK-NEXT: umov w8, v0.h[1]353; CHECK-NEXT: mov v1.d[1], x8354; CHECK-NEXT: mov v0.16b, v1.16b355; CHECK-NEXT: ret356 %e = extractelement <8 x i16> %x, i32 1357 %z = zext i16 %e to i64358 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1359 ret <2 x i64> %r360}361 362define <2 x i64> @extract2_i16_zext_insert1_i64_undef(<8 x i16> %x) {363; CHECK-LABEL: extract2_i16_zext_insert1_i64_undef:364; CHECK: // %bb.0:365; CHECK-NEXT: umov w8, v0.h[2]366; CHECK-NEXT: dup v0.2d, x8367; CHECK-NEXT: ret368 %e = extractelement <8 x i16> %x, i32 2369 %z = zext i16 %e to i64370 %r = insertelement <2 x i64> undef, i64 %z, i32 1371 ret <2 x i64> %r372}373 374define <2 x i64> @extract2_i16_zext_insert1_i64_zero(<8 x i16> %x) {375; CHECK-LABEL: extract2_i16_zext_insert1_i64_zero:376; CHECK: // %bb.0:377; CHECK-NEXT: movi v1.2d, #0000000000000000378; CHECK-NEXT: umov w8, v0.h[2]379; CHECK-NEXT: mov v1.d[1], x8380; CHECK-NEXT: mov v0.16b, v1.16b381; CHECK-NEXT: ret382 %e = extractelement <8 x i16> %x, i32 2383 %z = zext i16 %e to i64384 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1385 ret <2 x i64> %r386}387 388define <2 x i64> @extract3_i16_zext_insert1_i64_undef(<8 x i16> %x) {389; CHECK-LABEL: extract3_i16_zext_insert1_i64_undef:390; CHECK: // %bb.0:391; CHECK-NEXT: umov w8, v0.h[3]392; CHECK-NEXT: dup v0.2d, x8393; CHECK-NEXT: ret394 %e = extractelement <8 x i16> %x, i32 3395 %z = zext i16 %e to i64396 %r = insertelement <2 x i64> undef, i64 %z, i32 1397 ret <2 x i64> %r398}399 400define <2 x i64> @extract3_i16_zext_insert1_i64_zero(<8 x i16> %x) {401; CHECK-LABEL: extract3_i16_zext_insert1_i64_zero:402; CHECK: // %bb.0:403; CHECK-NEXT: movi v1.2d, #0000000000000000404; CHECK-NEXT: umov w8, v0.h[3]405; CHECK-NEXT: mov v1.d[1], x8406; CHECK-NEXT: mov v0.16b, v1.16b407; CHECK-NEXT: ret408 %e = extractelement <8 x i16> %x, i32 3409 %z = zext i16 %e to i64410 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1411 ret <2 x i64> %r412}413 414; i8415 416define <2 x i64> @extract0_i8_zext_insert0_i64_undef(<16 x i8> %x) {417; CHECK-LABEL: extract0_i8_zext_insert0_i64_undef:418; CHECK: // %bb.0:419; CHECK-NEXT: umov w8, v0.b[0]420; CHECK-NEXT: fmov d0, x8421; CHECK-NEXT: ret422 %e = extractelement <16 x i8> %x, i32 0423 %z = zext i8 %e to i64424 %r = insertelement <2 x i64> undef, i64 %z, i32 0425 ret <2 x i64> %r426}427 428define <2 x i64> @extract0_i8_zext_insert0_i64_zero(<16 x i8> %x) {429; CHECK-LABEL: extract0_i8_zext_insert0_i64_zero:430; CHECK: // %bb.0:431; CHECK-NEXT: movi v1.2d, #0000000000000000432; CHECK-NEXT: umov w8, v0.b[0]433; CHECK-NEXT: mov v1.s[0], w8434; CHECK-NEXT: mov v0.16b, v1.16b435; CHECK-NEXT: ret436 %e = extractelement <16 x i8> %x, i32 0437 %z = zext i8 %e to i64438 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 0439 ret <2 x i64> %r440}441 442define <2 x i64> @extract1_i8_zext_insert0_i64_undef(<16 x i8> %x) {443; CHECK-LABEL: extract1_i8_zext_insert0_i64_undef:444; CHECK: // %bb.0:445; CHECK-NEXT: umov w8, v0.b[1]446; CHECK-NEXT: fmov d0, x8447; CHECK-NEXT: ret448 %e = extractelement <16 x i8> %x, i32 1449 %z = zext i8 %e to i64450 %r = insertelement <2 x i64> undef, i64 %z, i32 0451 ret <2 x i64> %r452}453 454define <2 x i64> @extract1_i8_zext_insert0_i64_zero(<16 x i8> %x) {455; CHECK-LABEL: extract1_i8_zext_insert0_i64_zero:456; CHECK: // %bb.0:457; CHECK-NEXT: movi v1.2d, #0000000000000000458; CHECK-NEXT: umov w8, v0.b[1]459; CHECK-NEXT: mov v1.s[0], w8460; CHECK-NEXT: mov v0.16b, v1.16b461; CHECK-NEXT: ret462 %e = extractelement <16 x i8> %x, i32 1463 %z = zext i8 %e to i64464 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 0465 ret <2 x i64> %r466}467 468define <2 x i64> @extract2_i8_zext_insert0_i64_undef(<16 x i8> %x) {469; CHECK-LABEL: extract2_i8_zext_insert0_i64_undef:470; CHECK: // %bb.0:471; CHECK-NEXT: umov w8, v0.b[2]472; CHECK-NEXT: fmov d0, x8473; CHECK-NEXT: ret474 %e = extractelement <16 x i8> %x, i32 2475 %z = zext i8 %e to i64476 %r = insertelement <2 x i64> undef, i64 %z, i32 0477 ret <2 x i64> %r478}479 480define <2 x i64> @extract2_i8_zext_insert0_i64_zero(<16 x i8> %x) {481; CHECK-LABEL: extract2_i8_zext_insert0_i64_zero:482; CHECK: // %bb.0:483; CHECK-NEXT: movi v1.2d, #0000000000000000484; CHECK-NEXT: umov w8, v0.b[2]485; CHECK-NEXT: mov v1.s[0], w8486; CHECK-NEXT: mov v0.16b, v1.16b487; CHECK-NEXT: ret488 %e = extractelement <16 x i8> %x, i32 2489 %z = zext i8 %e to i64490 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 0491 ret <2 x i64> %r492}493 494define <2 x i64> @extract3_i8_zext_insert0_i64_undef(<16 x i8> %x) {495; CHECK-LABEL: extract3_i8_zext_insert0_i64_undef:496; CHECK: // %bb.0:497; CHECK-NEXT: umov w8, v0.b[3]498; CHECK-NEXT: fmov d0, x8499; CHECK-NEXT: ret500 %e = extractelement <16 x i8> %x, i32 3501 %z = zext i8 %e to i64502 %r = insertelement <2 x i64> undef, i64 %z, i32 0503 ret <2 x i64> %r504}505 506define <2 x i64> @extract3_i8_zext_insert0_i64_zero(<16 x i8> %x) {507; CHECK-LABEL: extract3_i8_zext_insert0_i64_zero:508; CHECK: // %bb.0:509; CHECK-NEXT: movi v1.2d, #0000000000000000510; CHECK-NEXT: umov w8, v0.b[3]511; CHECK-NEXT: mov v1.s[0], w8512; CHECK-NEXT: mov v0.16b, v1.16b513; CHECK-NEXT: ret514 %e = extractelement <16 x i8> %x, i32 3515 %z = zext i8 %e to i64516 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 0517 ret <2 x i64> %r518}519 520define <2 x i64> @extract0_i8_zext_insert1_i64_undef(<16 x i8> %x) {521; CHECK-LABEL: extract0_i8_zext_insert1_i64_undef:522; CHECK: // %bb.0:523; CHECK-NEXT: umov w8, v0.b[0]524; CHECK-NEXT: dup v0.2d, x8525; CHECK-NEXT: ret526 %e = extractelement <16 x i8> %x, i32 0527 %z = zext i8 %e to i64528 %r = insertelement <2 x i64> undef, i64 %z, i32 1529 ret <2 x i64> %r530}531 532define <2 x i64> @extract0_i8_zext_insert1_i64_zero(<16 x i8> %x) {533; CHECK-LABEL: extract0_i8_zext_insert1_i64_zero:534; CHECK: // %bb.0:535; CHECK-NEXT: movi v1.2d, #0000000000000000536; CHECK-NEXT: umov w8, v0.b[0]537; CHECK-NEXT: mov v1.d[1], x8538; CHECK-NEXT: mov v0.16b, v1.16b539; CHECK-NEXT: ret540 %e = extractelement <16 x i8> %x, i32 0541 %z = zext i8 %e to i64542 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1543 ret <2 x i64> %r544}545 546define <2 x i64> @extract1_i8_zext_insert1_i64_undef(<16 x i8> %x) {547; CHECK-LABEL: extract1_i8_zext_insert1_i64_undef:548; CHECK: // %bb.0:549; CHECK-NEXT: umov w8, v0.b[1]550; CHECK-NEXT: dup v0.2d, x8551; CHECK-NEXT: ret552 %e = extractelement <16 x i8> %x, i32 1553 %z = zext i8 %e to i64554 %r = insertelement <2 x i64> undef, i64 %z, i32 1555 ret <2 x i64> %r556}557 558define <2 x i64> @extract1_i8_zext_insert1_i64_zero(<16 x i8> %x) {559; CHECK-LABEL: extract1_i8_zext_insert1_i64_zero:560; CHECK: // %bb.0:561; CHECK-NEXT: movi v1.2d, #0000000000000000562; CHECK-NEXT: umov w8, v0.b[1]563; CHECK-NEXT: mov v1.d[1], x8564; CHECK-NEXT: mov v0.16b, v1.16b565; CHECK-NEXT: ret566 %e = extractelement <16 x i8> %x, i32 1567 %z = zext i8 %e to i64568 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1569 ret <2 x i64> %r570}571 572define <2 x i64> @extract2_i8_zext_insert1_i64_undef(<16 x i8> %x) {573; CHECK-LABEL: extract2_i8_zext_insert1_i64_undef:574; CHECK: // %bb.0:575; CHECK-NEXT: umov w8, v0.b[2]576; CHECK-NEXT: dup v0.2d, x8577; CHECK-NEXT: ret578 %e = extractelement <16 x i8> %x, i32 2579 %z = zext i8 %e to i64580 %r = insertelement <2 x i64> undef, i64 %z, i32 1581 ret <2 x i64> %r582}583 584define <2 x i64> @extract2_i8_zext_insert1_i64_zero(<16 x i8> %x) {585; CHECK-LABEL: extract2_i8_zext_insert1_i64_zero:586; CHECK: // %bb.0:587; CHECK-NEXT: movi v1.2d, #0000000000000000588; CHECK-NEXT: umov w8, v0.b[2]589; CHECK-NEXT: mov v1.d[1], x8590; CHECK-NEXT: mov v0.16b, v1.16b591; CHECK-NEXT: ret592 %e = extractelement <16 x i8> %x, i32 2593 %z = zext i8 %e to i64594 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1595 ret <2 x i64> %r596}597 598define <2 x i64> @extract3_i8_zext_insert1_i64_undef(<16 x i8> %x) {599; CHECK-LABEL: extract3_i8_zext_insert1_i64_undef:600; CHECK: // %bb.0:601; CHECK-NEXT: umov w8, v0.b[3]602; CHECK-NEXT: dup v0.2d, x8603; CHECK-NEXT: ret604 %e = extractelement <16 x i8> %x, i32 3605 %z = zext i8 %e to i64606 %r = insertelement <2 x i64> undef, i64 %z, i32 1607 ret <2 x i64> %r608}609 610define <2 x i64> @extract3_i8_zext_insert1_i64_zero(<16 x i8> %x) {611; CHECK-LABEL: extract3_i8_zext_insert1_i64_zero:612; CHECK: // %bb.0:613; CHECK-NEXT: movi v1.2d, #0000000000000000614; CHECK-NEXT: umov w8, v0.b[3]615; CHECK-NEXT: mov v1.d[1], x8616; CHECK-NEXT: mov v0.16b, v1.16b617; CHECK-NEXT: ret618 %e = extractelement <16 x i8> %x, i32 3619 %z = zext i8 %e to i64620 %r = insertelement <2 x i64> zeroinitializer, i64 %z, i32 1621 ret <2 x i64> %r622}623 624 625; This would crash because we did not expect to create626; a shuffle for a vector where the source operand is627; not the same size as the result.628; TODO: Should we handle this pattern? Ie, is moving to/from629; registers the optimal code?630 631define <4 x i32> @larger_bv_than_source(<4 x i16> %t0) {632; CHECK-LABEL: larger_bv_than_source:633; CHECK: // %bb.0:634; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0635; CHECK-NEXT: umov w8, v0.h[2]636; CHECK-NEXT: fmov s0, w8637; CHECK-NEXT: ret638 %t1 = extractelement <4 x i16> %t0, i32 2639 %vgetq_lane = zext i16 %t1 to i32640 %t2 = insertelement <4 x i32> undef, i32 %vgetq_lane, i64 0641 ret <4 x i32> %t2642}643 644