brintos

brintos / llvm-project-archived public Read only

0
0
Text · 20.3 KiB · 36b1b2c Raw
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