670 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lasx < %s | FileCheck %s3; RUN: llc --mtriple=loongarch64 --mattr=+lasx < %s | FileCheck %s4 5declare <8 x i32> @llvm.experimental.vector.insert.v8i32.v4i32(<8 x i32>, <4 x i32>, i64)6 7define <8 x i32> @insert_lo128_v8i32_1(<4 x i32> %a) {8; CHECK-LABEL: insert_lo128_v8i32_1:9; CHECK: # %bb.0: # %entry10; CHECK-NEXT: # kill: def $vr0 killed $vr0 def $xr011; CHECK-NEXT: ret12entry:13 %1 = call <8 x i32> @llvm.experimental.vector.insert.v8i32.v4i32(<8 x i32> poison, <4 x i32> %a, i64 0)14 ret <8 x i32> %115}16 17define <8 x i32> @insert_hi128_v8i32_1(<4 x i32> %a) {18; CHECK-LABEL: insert_hi128_v8i32_1:19; CHECK: # %bb.0: # %entry20; CHECK-NEXT: # kill: def $vr0 killed $vr0 def $xr021; CHECK-NEXT: xvpermi.q $xr0, $xr0, 222; CHECK-NEXT: ret23entry:24 %1 = call <8 x i32> @llvm.experimental.vector.insert.v8i32.v4i32(<8 x i32> poison, <4 x i32> %a, i64 4)25 ret <8 x i32> %126}27 28define <8 x i32> @insert_lo128_v8i32_2(<4 x i32> %a, <4 x i32> %b) {29; CHECK-LABEL: insert_lo128_v8i32_2:30; CHECK: # %bb.0: # %entry31; CHECK-NEXT: vori.b $vr0, $vr1, 032; CHECK-NEXT: ret33entry:34 %1 = call <8 x i32> @llvm.experimental.vector.insert.v8i32.v4i32(<8 x i32> poison, <4 x i32> %b, i64 0)35 ret <8 x i32> %136}37 38define <8 x i32> @insert_hi128_v8i32_2(<4 x i32> %a, <4 x i32> %b) {39; CHECK-LABEL: insert_hi128_v8i32_2:40; CHECK: # %bb.0: # %entry41; CHECK-NEXT: # kill: def $vr1 killed $vr1 def $xr142; CHECK-NEXT: xvpermi.q $xr0, $xr1, 243; CHECK-NEXT: ret44entry:45 %1 = call <8 x i32> @llvm.experimental.vector.insert.v8i32.v4i32(<8 x i32> poison, <4 x i32> %b, i64 4)46 ret <8 x i32> %147}48 49define <8 x i32> @insert_lo128_v8i32_3(<8 x i32> %a, <4 x i32> %b) {50; CHECK-LABEL: insert_lo128_v8i32_3:51; CHECK: # %bb.0: # %entry52; CHECK-NEXT: # kill: def $vr1 killed $vr1 def $xr153; CHECK-NEXT: xvpermi.q $xr0, $xr1, 4854; CHECK-NEXT: ret55entry:56 %1 = call <8 x i32> @llvm.experimental.vector.insert.v8i32.v4i32(<8 x i32> %a, <4 x i32> %b, i64 0)57 ret <8 x i32> %158}59 60define <8 x i32> @insert_hi128_v8i32_3(<8 x i32> %a, <4 x i32> %b) {61; CHECK-LABEL: insert_hi128_v8i32_3:62; CHECK: # %bb.0: # %entry63; CHECK-NEXT: # kill: def $vr1 killed $vr1 def $xr164; CHECK-NEXT: xvpermi.q $xr0, $xr1, 265; CHECK-NEXT: ret66entry:67 %1 = call <8 x i32> @llvm.experimental.vector.insert.v8i32.v4i32(<8 x i32> %a, <4 x i32> %b, i64 4)68 ret <8 x i32> %169}70 71declare <8 x float> @llvm.experimental.vector.insert.v8f32.v4f32(<8 x float>, <4 x float>, i64)72 73define <8 x float> @insert_lo128_v8f32_1(<4 x float> %a) {74; CHECK-LABEL: insert_lo128_v8f32_1:75; CHECK: # %bb.0: # %entry76; CHECK-NEXT: # kill: def $vr0 killed $vr0 def $xr077; CHECK-NEXT: ret78entry:79 %1 = call <8 x float> @llvm.experimental.vector.insert.v8f32.v4f32(<8 x float> poison, <4 x float> %a, i64 0)80 ret <8 x float> %181}82 83define <8 x float> @insert_hi128_v8f32_1(<4 x float> %a) {84; CHECK-LABEL: insert_hi128_v8f32_1:85; CHECK: # %bb.0: # %entry86; CHECK-NEXT: # kill: def $vr0 killed $vr0 def $xr087; CHECK-NEXT: xvpermi.q $xr0, $xr0, 288; CHECK-NEXT: ret89entry:90 %1 = call <8 x float> @llvm.experimental.vector.insert.v8f32.v4f32(<8 x float> poison, <4 x float> %a, i64 4)91 ret <8 x float> %192}93 94define <8 x float> @insert_lo128_v8f32_2(<4 x float> %a, <4 x float> %b) {95; CHECK-LABEL: insert_lo128_v8f32_2:96; CHECK: # %bb.0: # %entry97; CHECK-NEXT: vori.b $vr0, $vr1, 098; CHECK-NEXT: ret99entry:100 %1 = call <8 x float> @llvm.experimental.vector.insert.v8f32.v4f32(<8 x float> poison, <4 x float> %b, i64 0)101 ret <8 x float> %1102}103 104define <8 x float> @insert_hi128_v8f32_2(<4 x float> %a, <4 x float> %b) {105; CHECK-LABEL: insert_hi128_v8f32_2:106; CHECK: # %bb.0: # %entry107; CHECK-NEXT: # kill: def $vr1 killed $vr1 def $xr1108; CHECK-NEXT: xvpermi.q $xr0, $xr1, 2109; CHECK-NEXT: ret110entry:111 %1 = call <8 x float> @llvm.experimental.vector.insert.v8f32.v4f32(<8 x float> poison, <4 x float> %b, i64 4)112 ret <8 x float> %1113}114 115define <8 x float> @insert_lo128_v8f32_3(<8 x float> %a, <4 x float> %b) {116; CHECK-LABEL: insert_lo128_v8f32_3:117; CHECK: # %bb.0: # %entry118; CHECK-NEXT: # kill: def $vr1 killed $vr1 def $xr1119; CHECK-NEXT: xvpermi.q $xr0, $xr1, 48120; CHECK-NEXT: ret121entry:122 %1 = call <8 x float> @llvm.experimental.vector.insert.v8f32.v4f32(<8 x float> %a, <4 x float> %b, i64 0)123 ret <8 x float> %1124}125 126define <8 x float> @insert_hi128_v8f32_3(<8 x float> %a, <4 x float> %b) {127; CHECK-LABEL: insert_hi128_v8f32_3:128; CHECK: # %bb.0: # %entry129; CHECK-NEXT: # kill: def $vr1 killed $vr1 def $xr1130; CHECK-NEXT: xvpermi.q $xr0, $xr1, 2131; CHECK-NEXT: ret132entry:133 %1 = call <8 x float> @llvm.experimental.vector.insert.v8f32.v4f32(<8 x float> %a, <4 x float> %b, i64 4)134 ret <8 x float> %1135}136 137declare <4 x i64> @llvm.experimental.vector.insert.v4i64.v2i64(<4 x i64>, <2 x i64>, i64)138 139define <4 x i64> @insert_lo128_v4i64_1(<2 x i64> %a) {140; CHECK-LABEL: insert_lo128_v4i64_1:141; CHECK: # %bb.0: # %entry142; CHECK-NEXT: # kill: def $vr0 killed $vr0 def $xr0143; CHECK-NEXT: ret144entry:145 %1 = call <4 x i64> @llvm.experimental.vector.insert.v4i64.v2i64(<4 x i64> poison, <2 x i64> %a, i64 0)146 ret <4 x i64> %1147}148 149define <4 x i64> @insert_hi128_v4i64_1(<2 x i64> %a) {150; CHECK-LABEL: insert_hi128_v4i64_1:151; CHECK: # %bb.0: # %entry152; CHECK-NEXT: # kill: def $vr0 killed $vr0 def $xr0153; CHECK-NEXT: xvpermi.q $xr0, $xr0, 2154; CHECK-NEXT: ret155entry:156 %1 = call <4 x i64> @llvm.experimental.vector.insert.v4i64.v2i64(<4 x i64> poison, <2 x i64> %a, i64 2)157 ret <4 x i64> %1158}159 160define <4 x i64> @insert_lo128_v4i64_2(<2 x i64> %a, <2 x i64> %b) {161; CHECK-LABEL: insert_lo128_v4i64_2:162; CHECK: # %bb.0: # %entry163; CHECK-NEXT: vori.b $vr0, $vr1, 0164; CHECK-NEXT: ret165entry:166 %1 = call <4 x i64> @llvm.experimental.vector.insert.v4i64.v2i64(<4 x i64> poison, <2 x i64> %b, i64 0)167 ret <4 x i64> %1168}169 170define <4 x i64> @insert_hi128_v4i64_2(<2 x i64> %a, <2 x i64> %b) {171; CHECK-LABEL: insert_hi128_v4i64_2:172; CHECK: # %bb.0: # %entry173; CHECK-NEXT: # kill: def $vr1 killed $vr1 def $xr1174; CHECK-NEXT: xvpermi.q $xr0, $xr1, 2175; CHECK-NEXT: ret176entry:177 %1 = call <4 x i64> @llvm.experimental.vector.insert.v4i64.v2i64(<4 x i64> poison, <2 x i64> %b, i64 2)178 ret <4 x i64> %1179}180 181define <4 x i64> @insert_lo128_v4i64_3(<4 x i64> %a, <2 x i64> %b) {182; CHECK-LABEL: insert_lo128_v4i64_3:183; CHECK: # %bb.0: # %entry184; CHECK-NEXT: # kill: def $vr1 killed $vr1 def $xr1185; CHECK-NEXT: xvpermi.q $xr0, $xr1, 48186; CHECK-NEXT: ret187entry:188 %1 = call <4 x i64> @llvm.experimental.vector.insert.v4i64.v2i64(<4 x i64> %a, <2 x i64> %b, i64 0)189 ret <4 x i64> %1190}191 192define <4 x i64> @insert_hi128_v4i64_3(<4 x i64> %a, <2 x i64> %b) {193; CHECK-LABEL: insert_hi128_v4i64_3:194; CHECK: # %bb.0: # %entry195; CHECK-NEXT: # kill: def $vr1 killed $vr1 def $xr1196; CHECK-NEXT: xvpermi.q $xr0, $xr1, 2197; CHECK-NEXT: ret198entry:199 %1 = call <4 x i64> @llvm.experimental.vector.insert.v4i64.v2i64(<4 x i64> %a, <2 x i64> %b, i64 2)200 ret <4 x i64> %1201}202 203declare <4 x double> @llvm.experimental.vector.insert.v4f64.v2f64(<4 x double>, <2 x double>, i64)204 205define <4 x double> @insert_lo128_v4f64_1(<2 x double> %a) {206; CHECK-LABEL: insert_lo128_v4f64_1:207; CHECK: # %bb.0: # %entry208; CHECK-NEXT: # kill: def $vr0 killed $vr0 def $xr0209; CHECK-NEXT: ret210entry:211 %1 = call <4 x double> @llvm.experimental.vector.insert.v4f64.v2f64(<4 x double> poison, <2 x double> %a, i64 0)212 ret <4 x double> %1213}214 215define <4 x double> @insert_hi128_v4f64_1(<2 x double> %a) {216; CHECK-LABEL: insert_hi128_v4f64_1:217; CHECK: # %bb.0: # %entry218; CHECK-NEXT: # kill: def $vr0 killed $vr0 def $xr0219; CHECK-NEXT: xvpermi.q $xr0, $xr0, 2220; CHECK-NEXT: ret221entry:222 %1 = call <4 x double> @llvm.experimental.vector.insert.v4f64.v2f64(<4 x double> poison, <2 x double> %a, i64 2)223 ret <4 x double> %1224}225 226define <4 x double> @insert_lo128_v4f64_2(<2 x double> %a, <2 x double> %b) {227; CHECK-LABEL: insert_lo128_v4f64_2:228; CHECK: # %bb.0: # %entry229; CHECK-NEXT: vori.b $vr0, $vr1, 0230; CHECK-NEXT: ret231entry:232 %1 = call <4 x double> @llvm.experimental.vector.insert.v4f64.v2f64(<4 x double> poison, <2 x double> %b, i64 0)233 ret <4 x double> %1234}235 236define <4 x double> @insert_hi128_v4f64_2(<2 x double> %a, <2 x double> %b) {237; CHECK-LABEL: insert_hi128_v4f64_2:238; CHECK: # %bb.0: # %entry239; CHECK-NEXT: # kill: def $vr1 killed $vr1 def $xr1240; CHECK-NEXT: xvpermi.q $xr0, $xr1, 2241; CHECK-NEXT: ret242entry:243 %1 = call <4 x double> @llvm.experimental.vector.insert.v4f64.v2f64(<4 x double> poison, <2 x double> %b, i64 2)244 ret <4 x double> %1245}246 247define <4 x double> @insert_lo128_v4f64_3(<4 x double> %a, <2 x double> %b) {248; CHECK-LABEL: insert_lo128_v4f64_3:249; CHECK: # %bb.0: # %entry250; CHECK-NEXT: # kill: def $vr1 killed $vr1 def $xr1251; CHECK-NEXT: xvpermi.q $xr0, $xr1, 48252; CHECK-NEXT: ret253entry:254 %1 = call <4 x double> @llvm.experimental.vector.insert.v4f64.v2f64(<4 x double> %a, <2 x double> %b, i64 0)255 ret <4 x double> %1256}257 258define <4 x double> @insert_hi128_v4f64_3(<4 x double> %a, <2 x double> %b) {259; CHECK-LABEL: insert_hi128_v4f64_3:260; CHECK: # %bb.0: # %entry261; CHECK-NEXT: # kill: def $vr1 killed $vr1 def $xr1262; CHECK-NEXT: xvpermi.q $xr0, $xr1, 2263; CHECK-NEXT: ret264entry:265 %1 = call <4 x double> @llvm.experimental.vector.insert.v4f64.v2f64(<4 x double> %a, <2 x double> %b, i64 2)266 ret <4 x double> %1267}268 269declare <16 x i16> @llvm.experimental.vector.insert.v16i16.v8i16(<16 x i16>, <8 x i16>, i64)270 271define <16 x i16> @insert_lo128_v16i16_1(<8 x i16> %a) {272; CHECK-LABEL: insert_lo128_v16i16_1:273; CHECK: # %bb.0: # %entry274; CHECK-NEXT: # kill: def $vr0 killed $vr0 def $xr0275; CHECK-NEXT: ret276entry:277 %1 = call <16 x i16> @llvm.experimental.vector.insert.v16i16.v8i16(<16 x i16> poison, <8 x i16> %a, i64 0)278 ret <16 x i16> %1279}280 281define <16 x i16> @insert_hi128_v16i16_1(<8 x i16> %a) {282; CHECK-LABEL: insert_hi128_v16i16_1:283; CHECK: # %bb.0: # %entry284; CHECK-NEXT: # kill: def $vr0 killed $vr0 def $xr0285; CHECK-NEXT: xvpermi.q $xr0, $xr0, 2286; CHECK-NEXT: ret287entry:288 %1 = call <16 x i16> @llvm.experimental.vector.insert.v16i16.v8i16(<16 x i16> poison, <8 x i16> %a, i64 8)289 ret <16 x i16> %1290}291 292define <16 x i16> @insert_lo128_v16i16_2(<8 x i16> %a, <8 x i16> %b) {293; CHECK-LABEL: insert_lo128_v16i16_2:294; CHECK: # %bb.0: # %entry295; CHECK-NEXT: vori.b $vr0, $vr1, 0296; CHECK-NEXT: ret297entry:298 %1 = call <16 x i16> @llvm.experimental.vector.insert.v16i16.v8i16(<16 x i16> poison, <8 x i16> %b, i64 0)299 ret <16 x i16> %1300}301 302define <16 x i16> @insert_hi128_v16i16_2(<8 x i16> %a, <8 x i16> %b) {303; CHECK-LABEL: insert_hi128_v16i16_2:304; CHECK: # %bb.0: # %entry305; CHECK-NEXT: # kill: def $vr1 killed $vr1 def $xr1306; CHECK-NEXT: xvpermi.q $xr0, $xr1, 2307; CHECK-NEXT: ret308entry:309 %1 = call <16 x i16> @llvm.experimental.vector.insert.v16i16.v8i16(<16 x i16> poison, <8 x i16> %b, i64 8)310 ret <16 x i16> %1311}312 313define <16 x i16> @insert_lo128_v16i16_3(<16 x i16> %a, <8 x i16> %b) {314; CHECK-LABEL: insert_lo128_v16i16_3:315; CHECK: # %bb.0: # %entry316; CHECK-NEXT: # kill: def $vr1 killed $vr1 def $xr1317; CHECK-NEXT: xvpermi.q $xr0, $xr1, 48318; CHECK-NEXT: ret319entry:320 %1 = call <16 x i16> @llvm.experimental.vector.insert.v16i16.v8i16(<16 x i16> %a, <8 x i16> %b, i64 0)321 ret <16 x i16> %1322}323 324define <16 x i16> @insert_hi128_v16i16_3(<16 x i16> %a, <8 x i16> %b) {325; CHECK-LABEL: insert_hi128_v16i16_3:326; CHECK: # %bb.0: # %entry327; CHECK-NEXT: # kill: def $vr1 killed $vr1 def $xr1328; CHECK-NEXT: xvpermi.q $xr0, $xr1, 2329; CHECK-NEXT: ret330entry:331 %1 = call <16 x i16> @llvm.experimental.vector.insert.v16i16.v8i16(<16 x i16> %a, <8 x i16> %b, i64 8)332 ret <16 x i16> %1333}334 335declare <32 x i8> @llvm.experimental.vector.insert.v32i8.v16i8(<32 x i8>, <16 x i8>, i64)336 337define <32 x i8> @insert_lo128_v32i8_1(<16 x i8> %a) {338; CHECK-LABEL: insert_lo128_v32i8_1:339; CHECK: # %bb.0: # %entry340; CHECK-NEXT: # kill: def $vr0 killed $vr0 def $xr0341; CHECK-NEXT: ret342entry:343 %1 = call <32 x i8> @llvm.experimental.vector.insert.v32i8.v16i8(<32 x i8> poison, <16 x i8> %a, i64 0)344 ret <32 x i8> %1345}346 347define <32 x i8> @insert_hi128_v32i8_1(<16 x i8> %a) {348; CHECK-LABEL: insert_hi128_v32i8_1:349; CHECK: # %bb.0: # %entry350; CHECK-NEXT: # kill: def $vr0 killed $vr0 def $xr0351; CHECK-NEXT: xvpermi.q $xr0, $xr0, 2352; CHECK-NEXT: ret353entry:354 %1 = call <32 x i8> @llvm.experimental.vector.insert.v32i8.v16i8(<32 x i8> poison, <16 x i8> %a, i64 16)355 ret <32 x i8> %1356}357 358define <32 x i8> @insert_lo128_v32i8_2(<16 x i8> %a, <16 x i8> %b) {359; CHECK-LABEL: insert_lo128_v32i8_2:360; CHECK: # %bb.0: # %entry361; CHECK-NEXT: vori.b $vr0, $vr1, 0362; CHECK-NEXT: ret363entry:364 %1 = call <32 x i8> @llvm.experimental.vector.insert.v32i8.v16i8(<32 x i8> poison, <16 x i8> %b, i64 0)365 ret <32 x i8> %1366}367 368define <32 x i8> @insert_hi128_v32i8_2(<16 x i8> %a, <16 x i8> %b) {369; CHECK-LABEL: insert_hi128_v32i8_2:370; CHECK: # %bb.0: # %entry371; CHECK-NEXT: # kill: def $vr1 killed $vr1 def $xr1372; CHECK-NEXT: xvpermi.q $xr0, $xr1, 2373; CHECK-NEXT: ret374entry:375 %1 = call <32 x i8> @llvm.experimental.vector.insert.v32i8.v16i8(<32 x i8> poison, <16 x i8> %b, i64 16)376 ret <32 x i8> %1377}378 379define <32 x i8> @insert_lo128_v32i8_3(<32 x i8> %a, <16 x i8> %b) {380; CHECK-LABEL: insert_lo128_v32i8_3:381; CHECK: # %bb.0: # %entry382; CHECK-NEXT: # kill: def $vr1 killed $vr1 def $xr1383; CHECK-NEXT: xvpermi.q $xr0, $xr1, 48384; CHECK-NEXT: ret385entry:386 %1 = call <32 x i8> @llvm.experimental.vector.insert.v32i8.v16i8(<32 x i8> %a, <16 x i8> %b, i64 0)387 ret <32 x i8> %1388}389 390define <32 x i8> @insert_hi128_v32i8_3(<32 x i8> %a, <16 x i8> %b) {391; CHECK-LABEL: insert_hi128_v32i8_3:392; CHECK: # %bb.0: # %entry393; CHECK-NEXT: # kill: def $vr1 killed $vr1 def $xr1394; CHECK-NEXT: xvpermi.q $xr0, $xr1, 2395; CHECK-NEXT: ret396entry:397 %1 = call <32 x i8> @llvm.experimental.vector.insert.v32i8.v16i8(<32 x i8> %a, <16 x i8> %b, i64 16)398 ret <32 x i8> %1399}400 401define <4 x i32> @extract_lo128_v8i32_1(<8 x i32> %a) {402; CHECK-LABEL: extract_lo128_v8i32_1:403; CHECK: # %bb.0: # %entry404; CHECK-NEXT: # kill: def $vr0 killed $vr0 killed $xr0405; CHECK-NEXT: ret406entry:407 %1 = shufflevector <8 x i32> %a, <8 x i32> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>408 ret <4 x i32> %1409}410 411define <4 x i32> @extract_hi128_v8i32_1(<8 x i32> %a) {412; CHECK-LABEL: extract_hi128_v8i32_1:413; CHECK: # %bb.0: # %entry414; CHECK-NEXT: xvpermi.q $xr0, $xr0, 1415; CHECK-NEXT: # kill: def $vr0 killed $vr0 killed $xr0416; CHECK-NEXT: ret417entry:418 %1 = shufflevector <8 x i32> %a, <8 x i32> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>419 ret <4 x i32> %1420}421 422define <4 x i32> @extract_lo128_v8i32_2(<8 x i32> %a, <8 x i32> %b) {423; CHECK-LABEL: extract_lo128_v8i32_2:424; CHECK: # %bb.0: # %entry425; CHECK-NEXT: xvori.b $xr0, $xr1, 0426; CHECK-NEXT: # kill: def $vr0 killed $vr0 killed $xr0427; CHECK-NEXT: ret428entry:429 %1 = shufflevector <8 x i32> %b, <8 x i32> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>430 ret <4 x i32> %1431}432 433define <4 x i32> @extract_hi128_v8i32_2(<8 x i32> %a, <8 x i32> %b) {434; CHECK-LABEL: extract_hi128_v8i32_2:435; CHECK: # %bb.0: # %entry436; CHECK-NEXT: xvpermi.q $xr0, $xr1, 1437; CHECK-NEXT: # kill: def $vr0 killed $vr0 killed $xr0438; CHECK-NEXT: ret439entry:440 %1 = shufflevector <8 x i32> %b, <8 x i32> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>441 ret <4 x i32> %1442}443 444define <4 x float> @extract_lo128_v8f32_1(<8 x float> %a) {445; CHECK-LABEL: extract_lo128_v8f32_1:446; CHECK: # %bb.0: # %entry447; CHECK-NEXT: # kill: def $vr0 killed $vr0 killed $xr0448; CHECK-NEXT: ret449entry:450 %1 = shufflevector <8 x float> %a, <8 x float> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>451 ret <4 x float> %1452}453 454define <4 x float> @extract_hi128_v8f32_1(<8 x float> %a) {455; CHECK-LABEL: extract_hi128_v8f32_1:456; CHECK: # %bb.0: # %entry457; CHECK-NEXT: xvpermi.q $xr0, $xr0, 1458; CHECK-NEXT: # kill: def $vr0 killed $vr0 killed $xr0459; CHECK-NEXT: ret460entry:461 %1 = shufflevector <8 x float> %a, <8 x float> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>462 ret <4 x float> %1463}464 465define <4 x float> @extract_lo128_v8f32_2(<8 x float> %a, <8 x float> %b) {466; CHECK-LABEL: extract_lo128_v8f32_2:467; CHECK: # %bb.0: # %entry468; CHECK-NEXT: xvori.b $xr0, $xr1, 0469; CHECK-NEXT: # kill: def $vr0 killed $vr0 killed $xr0470; CHECK-NEXT: ret471entry:472 %1 = shufflevector <8 x float> %b, <8 x float> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>473 ret <4 x float> %1474}475 476define <4 x float> @extract_hi128_v8f32_2(<8 x float> %a, <8 x float> %b) {477; CHECK-LABEL: extract_hi128_v8f32_2:478; CHECK: # %bb.0: # %entry479; CHECK-NEXT: xvpermi.q $xr0, $xr1, 1480; CHECK-NEXT: # kill: def $vr0 killed $vr0 killed $xr0481; CHECK-NEXT: ret482entry:483 %1 = shufflevector <8 x float> %b, <8 x float> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>484 ret <4 x float> %1485}486 487define <2 x i64> @extract_lo128_v4i64_1(<4 x i64> %a) {488; CHECK-LABEL: extract_lo128_v4i64_1:489; CHECK: # %bb.0: # %entry490; CHECK-NEXT: # kill: def $vr0 killed $vr0 killed $xr0491; CHECK-NEXT: ret492entry:493 %1 = shufflevector <4 x i64> %a, <4 x i64> poison, <2 x i32> <i32 0, i32 1>494 ret <2 x i64> %1495}496 497define <2 x i64> @extract_hi128_v4i64_1(<4 x i64> %a) {498; CHECK-LABEL: extract_hi128_v4i64_1:499; CHECK: # %bb.0: # %entry500; CHECK-NEXT: xvpermi.q $xr0, $xr0, 1501; CHECK-NEXT: # kill: def $vr0 killed $vr0 killed $xr0502; CHECK-NEXT: ret503entry:504 %1 = shufflevector <4 x i64> %a, <4 x i64> poison, <2 x i32> <i32 2, i32 3>505 ret <2 x i64> %1506}507 508define <2 x i64> @extract_lo128_v4i64_2(<4 x i64> %a, <4 x i64> %b) {509; CHECK-LABEL: extract_lo128_v4i64_2:510; CHECK: # %bb.0: # %entry511; CHECK-NEXT: xvori.b $xr0, $xr1, 0512; CHECK-NEXT: # kill: def $vr0 killed $vr0 killed $xr0513; CHECK-NEXT: ret514entry:515 %1 = shufflevector <4 x i64> %b, <4 x i64> poison, <2 x i32> <i32 0, i32 1>516 ret <2 x i64> %1517}518 519define <2 x i64> @extract_hi128_v4i64_2(<4 x i64> %a, <4 x i64> %b) {520; CHECK-LABEL: extract_hi128_v4i64_2:521; CHECK: # %bb.0: # %entry522; CHECK-NEXT: xvpermi.q $xr0, $xr1, 1523; CHECK-NEXT: # kill: def $vr0 killed $vr0 killed $xr0524; CHECK-NEXT: ret525entry:526 %1 = shufflevector <4 x i64> %b, <4 x i64> poison, <2 x i32> <i32 2, i32 3>527 ret <2 x i64> %1528}529 530define <2 x double> @extract_lo128_v4f64_a(<4 x double> %a) {531; CHECK-LABEL: extract_lo128_v4f64_a:532; CHECK: # %bb.0: # %entry533; CHECK-NEXT: # kill: def $vr0 killed $vr0 killed $xr0534; CHECK-NEXT: ret535entry:536 %1 = shufflevector <4 x double> %a, <4 x double> poison, <2 x i32> <i32 0, i32 1>537 ret <2 x double> %1538}539 540define <2 x double> @extract_hi128_v4f64_1(<4 x double> %a) {541; CHECK-LABEL: extract_hi128_v4f64_1:542; CHECK: # %bb.0: # %entry543; CHECK-NEXT: xvpermi.q $xr0, $xr0, 1544; CHECK-NEXT: # kill: def $vr0 killed $vr0 killed $xr0545; CHECK-NEXT: ret546entry:547 %1 = shufflevector <4 x double> %a, <4 x double> poison, <2 x i32> <i32 2, i32 3>548 ret <2 x double> %1549}550 551define <2 x double> @extract_lo128_v4f64_2(<4 x double> %a, <4 x double> %b) {552; CHECK-LABEL: extract_lo128_v4f64_2:553; CHECK: # %bb.0: # %entry554; CHECK-NEXT: xvori.b $xr0, $xr1, 0555; CHECK-NEXT: # kill: def $vr0 killed $vr0 killed $xr0556; CHECK-NEXT: ret557entry:558 %1 = shufflevector <4 x double> %b, <4 x double> poison, <2 x i32> <i32 0, i32 1>559 ret <2 x double> %1560}561 562define <2 x double> @extract_hi128_v4f64_2(<4 x double> %a, <4 x double> %b) {563; CHECK-LABEL: extract_hi128_v4f64_2:564; CHECK: # %bb.0: # %entry565; CHECK-NEXT: xvpermi.q $xr0, $xr1, 1566; CHECK-NEXT: # kill: def $vr0 killed $vr0 killed $xr0567; CHECK-NEXT: ret568entry:569 %1 = shufflevector <4 x double> %b, <4 x double> poison, <2 x i32> <i32 2, i32 3>570 ret <2 x double> %1571}572 573define <8 x i16> @extract_lo128_v16i16_1(<16 x i16> %a) {574; CHECK-LABEL: extract_lo128_v16i16_1:575; CHECK: # %bb.0: # %entry576; CHECK-NEXT: # kill: def $vr0 killed $vr0 killed $xr0577; CHECK-NEXT: ret578entry:579 %1 = shufflevector <16 x i16> %a, <16 x i16> poison,580 <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>581 ret <8 x i16> %1582}583 584define <8 x i16> @extract_hi128_v16i16_1(<16 x i16> %a) {585; CHECK-LABEL: extract_hi128_v16i16_1:586; CHECK: # %bb.0: # %entry587; CHECK-NEXT: xvpermi.q $xr0, $xr0, 1588; CHECK-NEXT: # kill: def $vr0 killed $vr0 killed $xr0589; CHECK-NEXT: ret590entry:591 %1 = shufflevector <16 x i16> %a, <16 x i16> poison,592 <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>593 ret <8 x i16> %1594}595 596define <8 x i16> @extract_lo128_v16i16_2(<16 x i16> %a, <16 x i16> %b) {597; CHECK-LABEL: extract_lo128_v16i16_2:598; CHECK: # %bb.0: # %entry599; CHECK-NEXT: xvori.b $xr0, $xr1, 0600; CHECK-NEXT: # kill: def $vr0 killed $vr0 killed $xr0601; CHECK-NEXT: ret602entry:603 %1 = shufflevector <16 x i16> %b, <16 x i16> poison,604 <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>605 ret <8 x i16> %1606}607 608define <8 x i16> @extract_hi128_v16i16_2(<16 x i16> %a, <16 x i16> %b) {609; CHECK-LABEL: extract_hi128_v16i16_2:610; CHECK: # %bb.0: # %entry611; CHECK-NEXT: xvpermi.q $xr0, $xr1, 1612; CHECK-NEXT: # kill: def $vr0 killed $vr0 killed $xr0613; CHECK-NEXT: ret614entry:615 %1 = shufflevector <16 x i16> %b, <16 x i16> poison,616 <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>617 ret <8 x i16> %1618}619 620define <16 x i8> @extract_lo128_v32i8_1(<32 x i8> %a) {621; CHECK-LABEL: extract_lo128_v32i8_1:622; CHECK: # %bb.0: # %entry623; CHECK-NEXT: # kill: def $vr0 killed $vr0 killed $xr0624; CHECK-NEXT: ret625entry:626 %1 = shufflevector <32 x i8> %a, <32 x i8> poison,627 <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7,628 i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>629 ret <16 x i8> %1630}631 632define <16 x i8> @extract_hi128_v32i8_1(<32 x i8> %a) {633; CHECK-LABEL: extract_hi128_v32i8_1:634; CHECK: # %bb.0: # %entry635; CHECK-NEXT: xvpermi.q $xr0, $xr0, 1636; CHECK-NEXT: # kill: def $vr0 killed $vr0 killed $xr0637; CHECK-NEXT: ret638entry:639 %1 = shufflevector <32 x i8> %a, <32 x i8> poison,640 <16 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23,641 i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>642 ret <16 x i8> %1643}644 645define <16 x i8> @extract_lo128_v32i8_2(<32 x i8> %a, <32 x i8> %b) {646; CHECK-LABEL: extract_lo128_v32i8_2:647; CHECK: # %bb.0: # %entry648; CHECK-NEXT: xvori.b $xr0, $xr1, 0649; CHECK-NEXT: # kill: def $vr0 killed $vr0 killed $xr0650; CHECK-NEXT: ret651entry:652 %1 = shufflevector <32 x i8> %b, <32 x i8> poison,653 <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7,654 i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>655 ret <16 x i8> %1656}657 658define <16 x i8> @extract_hi128_v32i8_2(<32 x i8> %a, <32 x i8> %b) {659; CHECK-LABEL: extract_hi128_v32i8_2:660; CHECK: # %bb.0: # %entry661; CHECK-NEXT: xvpermi.q $xr0, $xr1, 1662; CHECK-NEXT: # kill: def $vr0 killed $vr0 killed $xr0663; CHECK-NEXT: ret664entry:665 %1 = shufflevector <32 x i8> %b, <32 x i8> poison,666 <16 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23,667 i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>668 ret <16 x i8> %1669}670