656 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=riscv32 -mattr=+v,+zvfh,+zvfbfmin,+m | FileCheck --check-prefixes=CHECK,RV32 %s3; RUN: llc < %s -mtriple=riscv64 -mattr=+v,+zvfh,+zvfbfmin,+m | FileCheck --check-prefixes=CHECK,RV64 %s4; RUN: llc < %s -mtriple=riscv32 -mattr=+v,+zvfhmin,+zvfbfmin,+m | FileCheck --check-prefixes=CHECK,RV32 %s5; RUN: llc < %s -mtriple=riscv64 -mattr=+v,+zvfhmin,+zvfbfmin,+m | FileCheck --check-prefixes=CHECK,RV64 %s6 7; Integers8 9define {<vscale x 16 x i1>, <vscale x 16 x i1>} @vector_deinterleave_load_nxv16i1_nxv32i1(ptr %p) {10; CHECK-LABEL: vector_deinterleave_load_nxv16i1_nxv32i1:11; CHECK: # %bb.0:12; CHECK-NEXT: vsetvli a1, zero, e8, m4, ta, ma13; CHECK-NEXT: vlm.v v8, (a0)14; CHECK-NEXT: csrr a0, vlenb15; CHECK-NEXT: srli a0, a0, 216; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma17; CHECK-NEXT: vslidedown.vx v0, v8, a018; CHECK-NEXT: vsetvli a0, zero, e8, m2, ta, ma19; CHECK-NEXT: vmv.v.i v12, 020; CHECK-NEXT: vmerge.vim v10, v12, 1, v021; CHECK-NEXT: vmv1r.v v0, v822; CHECK-NEXT: vmerge.vim v8, v12, 1, v023; CHECK-NEXT: vnsrl.wi v12, v8, 024; CHECK-NEXT: vnsrl.wi v14, v8, 825; CHECK-NEXT: vmsne.vi v0, v12, 026; CHECK-NEXT: vmsne.vi v8, v14, 027; CHECK-NEXT: ret28 %vec = load <vscale x 32 x i1>, ptr %p29 %deinterleaved.results = call {<vscale x 16 x i1>, <vscale x 16 x i1>} @llvm.vector.deinterleave2.nxv32i1(<vscale x 32 x i1> %vec)30 %t0 = extractvalue { <vscale x 16 x i1>, <vscale x 16 x i1> } %deinterleaved.results, 031 %t1 = extractvalue { <vscale x 16 x i1>, <vscale x 16 x i1> } %deinterleaved.results, 132 %res0 = insertvalue { <vscale x 16 x i1>, <vscale x 16 x i1> } poison, <vscale x 16 x i1> %t0, 033 %res1 = insertvalue { <vscale x 16 x i1>, <vscale x 16 x i1> } %res0, <vscale x 16 x i1> %t1, 134 ret {<vscale x 16 x i1>, <vscale x 16 x i1>} %res135}36 37define {<vscale x 16 x i8>, <vscale x 16 x i8>} @vector_deinterleave_load_nxv16i8_nxv32i8(ptr %p) {38; CHECK-LABEL: vector_deinterleave_load_nxv16i8_nxv32i8:39; CHECK: # %bb.0:40; CHECK-NEXT: vsetvli a1, zero, e8, m2, ta, ma41; CHECK-NEXT: vlseg2e8.v v8, (a0)42; CHECK-NEXT: ret43 %vec = load <vscale x 32 x i8>, ptr %p44 %deinterleaved.results = call {<vscale x 16 x i8>, <vscale x 16 x i8>} @llvm.vector.deinterleave2.nxv32i8(<vscale x 32 x i8> %vec)45 %t0 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %deinterleaved.results, 046 %t1 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %deinterleaved.results, 147 %res0 = insertvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } poison, <vscale x 16 x i8> %t0, 048 %res1 = insertvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %res0, <vscale x 16 x i8> %t1, 149 ret {<vscale x 16 x i8>, <vscale x 16 x i8>} %res150}51 52define <vscale x 16 x i8> @vector_deinterleave_load_nxv16i8_nxv32i8_oneactive(ptr %p) {53; CHECK-LABEL: vector_deinterleave_load_nxv16i8_nxv32i8_oneactive:54; CHECK: # %bb.0:55; CHECK-NEXT: vsetvli a1, zero, e8, m2, ta, ma56; CHECK-NEXT: vlseg2e8.v v8, (a0)57; CHECK-NEXT: ret58 %vec = load <vscale x 32 x i8>, ptr %p59 %deinterleaved.results = call {<vscale x 16 x i8>, <vscale x 16 x i8>} @llvm.vector.deinterleave2.nxv32i8(<vscale x 32 x i8> %vec)60 %t0 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %deinterleaved.results, 061 ret <vscale x 16 x i8> %t062}63 64define <vscale x 16 x i8> @vector_deinterleave_load_nxv16i8_nxv32i8_oneactive2(ptr %p) {65; CHECK-LABEL: vector_deinterleave_load_nxv16i8_nxv32i8_oneactive2:66; CHECK: # %bb.0:67; CHECK-NEXT: vsetvli a1, zero, e8, m2, ta, ma68; CHECK-NEXT: vlseg2e8.v v6, (a0)69; CHECK-NEXT: ret70 %vec = load <vscale x 32 x i8>, ptr %p71 %deinterleaved.results = call {<vscale x 16 x i8>, <vscale x 16 x i8>} @llvm.vector.deinterleave2.nxv32i8(<vscale x 32 x i8> %vec)72 %t1 = extractvalue { <vscale x 16 x i8>, <vscale x 16 x i8> } %deinterleaved.results, 173 ret <vscale x 16 x i8> %t174}75 76; Shouldn't be lowered to vlseg because it's unaligned77define {<vscale x 8 x i16>, <vscale x 8 x i16>} @vector_deinterleave_load_nxv8i16_nxv16i16_align1(ptr %p) {78; CHECK-LABEL: vector_deinterleave_load_nxv8i16_nxv16i16_align1:79; CHECK: # %bb.0:80; CHECK-NEXT: vl4r.v v12, (a0)81; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, ma82; CHECK-NEXT: vnsrl.wi v8, v12, 083; CHECK-NEXT: vnsrl.wi v10, v12, 1684; CHECK-NEXT: ret85 %vec = load <vscale x 16 x i16>, ptr %p, align 186 %deinterleaved.results = call {<vscale x 8 x i16>, <vscale x 8 x i16>} @llvm.vector.deinterleave2.nxv16i16(<vscale x 16 x i16> %vec)87 %t0 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } %deinterleaved.results, 088 %t1 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } %deinterleaved.results, 189 %res0 = insertvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } poison, <vscale x 8 x i16> %t0, 090 %res1 = insertvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } %res0, <vscale x 8 x i16> %t1, 191 ret {<vscale x 8 x i16>, <vscale x 8 x i16>} %res192}93 94define {<vscale x 8 x i16>, <vscale x 8 x i16>} @vector_deinterleave_load_nxv8i16_nxv16i16(ptr %p) {95; CHECK-LABEL: vector_deinterleave_load_nxv8i16_nxv16i16:96; CHECK: # %bb.0:97; CHECK-NEXT: vsetvli a1, zero, e16, m2, ta, ma98; CHECK-NEXT: vlseg2e16.v v8, (a0)99; CHECK-NEXT: ret100 %vec = load <vscale x 16 x i16>, ptr %p101 %deinterleaved.results = call {<vscale x 8 x i16>, <vscale x 8 x i16>} @llvm.vector.deinterleave2.nxv16i16(<vscale x 16 x i16> %vec)102 %t0 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } %deinterleaved.results, 0103 %t1 = extractvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } %deinterleaved.results, 1104 %res0 = insertvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } poison, <vscale x 8 x i16> %t0, 0105 %res1 = insertvalue { <vscale x 8 x i16>, <vscale x 8 x i16> } %res0, <vscale x 8 x i16> %t1, 1106 ret {<vscale x 8 x i16>, <vscale x 8 x i16>} %res1107}108 109define {<vscale x 4 x i32>, <vscale x 4 x i32>} @vector_deinterleave_load_nxv4i32_nxvv8i32(ptr %p) {110; CHECK-LABEL: vector_deinterleave_load_nxv4i32_nxvv8i32:111; CHECK: # %bb.0:112; CHECK-NEXT: vsetvli a1, zero, e32, m2, ta, ma113; CHECK-NEXT: vlseg2e32.v v8, (a0)114; CHECK-NEXT: ret115 %vec = load <vscale x 8 x i32>, ptr %p116 %deinterleaved.results = call {<vscale x 4 x i32>, <vscale x 4 x i32>} @llvm.vector.deinterleave2.nxv8i32(<vscale x 8 x i32> %vec)117 %t0 = extractvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } %deinterleaved.results, 0118 %t1 = extractvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } %deinterleaved.results, 1119 %res0 = insertvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } poison, <vscale x 4 x i32> %t0, 0120 %res1 = insertvalue { <vscale x 4 x i32>, <vscale x 4 x i32> } %res0, <vscale x 4 x i32> %t1, 1121 ret {<vscale x 4 x i32>, <vscale x 4 x i32>} %res1122}123 124define {<vscale x 2 x i64>, <vscale x 2 x i64>} @vector_deinterleave_load_nxv2i64_nxv4i64(ptr %p) {125; CHECK-LABEL: vector_deinterleave_load_nxv2i64_nxv4i64:126; CHECK: # %bb.0:127; CHECK-NEXT: vsetvli a1, zero, e64, m2, ta, ma128; CHECK-NEXT: vlseg2e64.v v8, (a0)129; CHECK-NEXT: ret130 %vec = load <vscale x 4 x i64>, ptr %p131 %deinterleaved.results = call {<vscale x 2 x i64>, <vscale x 2 x i64>} @llvm.vector.deinterleave2.nxv4i64(<vscale x 4 x i64> %vec)132 %t0 = extractvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } %deinterleaved.results, 0133 %t1 = extractvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } %deinterleaved.results, 1134 %res0 = insertvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } poison, <vscale x 2 x i64> %t0, 0135 %res1 = insertvalue { <vscale x 2 x i64>, <vscale x 2 x i64> } %res0, <vscale x 2 x i64> %t1, 1136 ret {<vscale x 2 x i64>, <vscale x 2 x i64>} %res1137}138 139define {<vscale x 4 x i64>, <vscale x 4 x i64>} @vector_deinterleave_load_nxv4i64_nxv8i64(ptr %p) {140; CHECK-LABEL: vector_deinterleave_load_nxv4i64_nxv8i64:141; CHECK: # %bb.0:142; CHECK-NEXT: vsetvli a1, zero, e64, m4, ta, ma143; CHECK-NEXT: vlseg2e64.v v8, (a0)144; CHECK-NEXT: ret145 %vec = load <vscale x 8 x i64>, ptr %p146 %deinterleaved.results = call {<vscale x 4 x i64>, <vscale x 4 x i64>} @llvm.vector.deinterleave2.nxv8i64(<vscale x 8 x i64> %vec)147 %t0 = extractvalue { <vscale x 4 x i64>, <vscale x 4 x i64> } %deinterleaved.results, 0148 %t1 = extractvalue { <vscale x 4 x i64>, <vscale x 4 x i64> } %deinterleaved.results, 1149 %res0 = insertvalue { <vscale x 4 x i64>, <vscale x 4 x i64> } poison, <vscale x 4 x i64> %t0, 0150 %res1 = insertvalue { <vscale x 4 x i64>, <vscale x 4 x i64> } %res0, <vscale x 4 x i64> %t1, 1151 ret {<vscale x 4 x i64>, <vscale x 4 x i64>} %res1152}153 154; This shouldn't be lowered to a vlseg because EMUL * NFIELDS >= 8155define {<vscale x 8 x i64>, <vscale x 8 x i64>} @vector_deinterleave_load_nxv8i64_nxv16i64(ptr %p) {156; CHECK-LABEL: vector_deinterleave_load_nxv8i64_nxv16i64:157; CHECK: # %bb.0:158; CHECK-NEXT: addi sp, sp, -16159; CHECK-NEXT: .cfi_def_cfa_offset 16160; CHECK-NEXT: csrr a1, vlenb161; CHECK-NEXT: slli a1, a1, 4162; CHECK-NEXT: sub sp, sp, a1163; CHECK-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x10, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 16 * vlenb164; CHECK-NEXT: li a1, 85165; CHECK-NEXT: vsetvli a2, zero, e8, mf8, ta, ma166; CHECK-NEXT: vmv.v.x v16, a1167; CHECK-NEXT: csrr a1, vlenb168; CHECK-NEXT: vl8re64.v v24, (a0)169; CHECK-NEXT: slli a1, a1, 3170; CHECK-NEXT: add a0, a0, a1171; CHECK-NEXT: li a1, 170172; CHECK-NEXT: vl8re64.v v0, (a0)173; CHECK-NEXT: vmv.v.x v17, a1174; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma175; CHECK-NEXT: vcompress.vm v8, v24, v16176; CHECK-NEXT: vmv1r.v v12, v16177; CHECK-NEXT: vmv1r.v v13, v17178; CHECK-NEXT: vcompress.vm v16, v24, v13179; CHECK-NEXT: vcompress.vm v24, v0, v12180; CHECK-NEXT: addi a0, sp, 16181; CHECK-NEXT: vs8r.v v24, (a0) # vscale x 64-byte Folded Spill182; CHECK-NEXT: vcompress.vm v24, v0, v13183; CHECK-NEXT: csrr a0, vlenb184; CHECK-NEXT: slli a0, a0, 3185; CHECK-NEXT: add a0, sp, a0186; CHECK-NEXT: addi a0, a0, 16187; CHECK-NEXT: vs8r.v v24, (a0) # vscale x 64-byte Folded Spill188; CHECK-NEXT: addi a0, sp, 16189; CHECK-NEXT: vl8r.v v24, (a0) # vscale x 64-byte Folded Reload190; CHECK-NEXT: vmv4r.v v12, v24191; CHECK-NEXT: csrr a0, vlenb192; CHECK-NEXT: slli a0, a0, 3193; CHECK-NEXT: add a0, sp, a0194; CHECK-NEXT: addi a0, a0, 16195; CHECK-NEXT: vl8r.v v24, (a0) # vscale x 64-byte Folded Reload196; CHECK-NEXT: vmv4r.v v20, v24197; CHECK-NEXT: csrr a0, vlenb198; CHECK-NEXT: slli a0, a0, 4199; CHECK-NEXT: add sp, sp, a0200; CHECK-NEXT: .cfi_def_cfa sp, 16201; CHECK-NEXT: addi sp, sp, 16202; CHECK-NEXT: .cfi_def_cfa_offset 0203; CHECK-NEXT: ret204 %vec = load <vscale x 16 x i64>, ptr %p205 %deinterleaved.results = call {<vscale x 8 x i64>, <vscale x 8 x i64>} @llvm.vector.deinterleave2.nxv16i64(<vscale x 16 x i64> %vec)206 %t0 = extractvalue { <vscale x 8 x i64>, <vscale x 8 x i64> } %deinterleaved.results, 0207 %t1 = extractvalue { <vscale x 8 x i64>, <vscale x 8 x i64> } %deinterleaved.results, 1208 %res0 = insertvalue { <vscale x 8 x i64>, <vscale x 8 x i64> } poison, <vscale x 8 x i64> %t0, 0209 %res1 = insertvalue { <vscale x 8 x i64>, <vscale x 8 x i64> } %res0, <vscale x 8 x i64> %t1, 1210 ret {<vscale x 8 x i64>, <vscale x 8 x i64>} %res1211}212 213; Floats214 215define {<vscale x 2 x bfloat>, <vscale x 2 x bfloat>} @vector_deinterleave_load_nxv2bf16_nxv4bf16(ptr %p) {216; CHECK-LABEL: vector_deinterleave_load_nxv2bf16_nxv4bf16:217; CHECK: # %bb.0:218; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, ma219; CHECK-NEXT: vlseg2e16.v v8, (a0)220; CHECK-NEXT: ret221 %vec = load <vscale x 4 x bfloat>, ptr %p222 %deinterleaved.results = call {<vscale x 2 x bfloat>, <vscale x 2 x bfloat>} @llvm.vector.deinterleave2.nxv4bf16(<vscale x 4 x bfloat> %vec)223 %t0 = extractvalue { <vscale x 2 x bfloat>, <vscale x 2 x bfloat> } %deinterleaved.results, 0224 %t1 = extractvalue { <vscale x 2 x bfloat>, <vscale x 2 x bfloat> } %deinterleaved.results, 1225 %res0 = insertvalue { <vscale x 2 x bfloat>, <vscale x 2 x bfloat> } poison, <vscale x 2 x bfloat> %t0, 0226 %res1 = insertvalue { <vscale x 2 x bfloat>, <vscale x 2 x bfloat> } %res0, <vscale x 2 x bfloat> %t1, 1227 ret {<vscale x 2 x bfloat>, <vscale x 2 x bfloat>} %res1228}229 230define {<vscale x 4 x bfloat>, <vscale x 4 x bfloat>} @vector_deinterleave_load_nxv4bf16_nxv8bf16(ptr %p) {231; CHECK-LABEL: vector_deinterleave_load_nxv4bf16_nxv8bf16:232; CHECK: # %bb.0:233; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, ma234; CHECK-NEXT: vlseg2e16.v v8, (a0)235; CHECK-NEXT: ret236 %vec = load <vscale x 8 x bfloat>, ptr %p237 %deinterleaved.results = call {<vscale x 4 x bfloat>, <vscale x 4 x bfloat>} @llvm.vector.deinterleave2.nxv8bf16(<vscale x 8 x bfloat> %vec)238 %t0 = extractvalue { <vscale x 4 x bfloat>, <vscale x 4 x bfloat> } %deinterleaved.results, 0239 %t1 = extractvalue { <vscale x 4 x bfloat>, <vscale x 4 x bfloat> } %deinterleaved.results, 1240 %res0 = insertvalue { <vscale x 4 x bfloat>, <vscale x 4 x bfloat> } poison, <vscale x 4 x bfloat> %t0, 0241 %res1 = insertvalue { <vscale x 4 x bfloat>, <vscale x 4 x bfloat> } %res0, <vscale x 4 x bfloat> %t1, 1242 ret {<vscale x 4 x bfloat>, <vscale x 4 x bfloat>} %res1243}244 245define {<vscale x 2 x half>, <vscale x 2 x half>} @vector_deinterleave_load_nxv2f16_nxv4f16(ptr %p) {246; CHECK-LABEL: vector_deinterleave_load_nxv2f16_nxv4f16:247; CHECK: # %bb.0:248; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, ma249; CHECK-NEXT: vlseg2e16.v v8, (a0)250; CHECK-NEXT: ret251 %vec = load <vscale x 4 x half>, ptr %p252 %deinterleaved.results = call {<vscale x 2 x half>, <vscale x 2 x half>} @llvm.vector.deinterleave2.nxv4f16(<vscale x 4 x half> %vec)253 %t0 = extractvalue { <vscale x 2 x half>, <vscale x 2 x half> } %deinterleaved.results, 0254 %t1 = extractvalue { <vscale x 2 x half>, <vscale x 2 x half> } %deinterleaved.results, 1255 %res0 = insertvalue { <vscale x 2 x half>, <vscale x 2 x half> } poison, <vscale x 2 x half> %t0, 0256 %res1 = insertvalue { <vscale x 2 x half>, <vscale x 2 x half> } %res0, <vscale x 2 x half> %t1, 1257 ret {<vscale x 2 x half>, <vscale x 2 x half>} %res1258}259 260define {<vscale x 4 x half>, <vscale x 4 x half>} @vector_deinterleave_load_nxv4f16_nxv8f16(ptr %p) {261; CHECK-LABEL: vector_deinterleave_load_nxv4f16_nxv8f16:262; CHECK: # %bb.0:263; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, ma264; CHECK-NEXT: vlseg2e16.v v8, (a0)265; CHECK-NEXT: ret266 %vec = load <vscale x 8 x half>, ptr %p267 %deinterleaved.results = call {<vscale x 4 x half>, <vscale x 4 x half>} @llvm.vector.deinterleave2.nxv8f16(<vscale x 8 x half> %vec)268 %t0 = extractvalue { <vscale x 4 x half>, <vscale x 4 x half> } %deinterleaved.results, 0269 %t1 = extractvalue { <vscale x 4 x half>, <vscale x 4 x half> } %deinterleaved.results, 1270 %res0 = insertvalue { <vscale x 4 x half>, <vscale x 4 x half> } poison, <vscale x 4 x half> %t0, 0271 %res1 = insertvalue { <vscale x 4 x half>, <vscale x 4 x half> } %res0, <vscale x 4 x half> %t1, 1272 ret {<vscale x 4 x half>, <vscale x 4 x half>} %res1273}274 275define {<vscale x 2 x float>, <vscale x 2 x float>} @vector_deinterleave_load_nxv2f32_nxv4f32(ptr %p) {276; CHECK-LABEL: vector_deinterleave_load_nxv2f32_nxv4f32:277; CHECK: # %bb.0:278; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, ma279; CHECK-NEXT: vlseg2e32.v v8, (a0)280; CHECK-NEXT: ret281 %vec = load <vscale x 4 x float>, ptr %p282 %deinterleaved.results = call {<vscale x 2 x float>, <vscale x 2 x float>} @llvm.vector.deinterleave2.nxv4f32(<vscale x 4 x float> %vec)283 %t0 = extractvalue { <vscale x 2 x float>, <vscale x 2 x float> } %deinterleaved.results, 0284 %t1 = extractvalue { <vscale x 2 x float>, <vscale x 2 x float> } %deinterleaved.results, 1285 %res0 = insertvalue { <vscale x 2 x float>, <vscale x 2 x float> } poison, <vscale x 2 x float> %t0, 0286 %res1 = insertvalue { <vscale x 2 x float>, <vscale x 2 x float> } %res0, <vscale x 2 x float> %t1, 1287 ret {<vscale x 2 x float>, <vscale x 2 x float>} %res1288}289 290define {<vscale x 8 x bfloat>, <vscale x 8 x bfloat>} @vector_deinterleave_load_nxv8bf16_nxv16bf16(ptr %p) {291; CHECK-LABEL: vector_deinterleave_load_nxv8bf16_nxv16bf16:292; CHECK: # %bb.0:293; CHECK-NEXT: vsetvli a1, zero, e16, m2, ta, ma294; CHECK-NEXT: vlseg2e16.v v8, (a0)295; CHECK-NEXT: ret296 %vec = load <vscale x 16 x bfloat>, ptr %p297 %deinterleaved.results = call {<vscale x 8 x bfloat>, <vscale x 8 x bfloat>} @llvm.vector.deinterleave2.nxv16bf16(<vscale x 16 x bfloat> %vec)298 %t0 = extractvalue { <vscale x 8 x bfloat>, <vscale x 8 x bfloat> } %deinterleaved.results, 0299 %t1 = extractvalue { <vscale x 8 x bfloat>, <vscale x 8 x bfloat> } %deinterleaved.results, 1300 %res0 = insertvalue { <vscale x 8 x bfloat>, <vscale x 8 x bfloat> } poison, <vscale x 8 x bfloat> %t0, 0301 %res1 = insertvalue { <vscale x 8 x bfloat>, <vscale x 8 x bfloat> } %res0, <vscale x 8 x bfloat> %t1, 1302 ret {<vscale x 8 x bfloat>, <vscale x 8 x bfloat>} %res1303}304 305define {<vscale x 8 x half>, <vscale x 8 x half>} @vector_deinterleave_load_nxv8f16_nxv16f16(ptr %p) {306; CHECK-LABEL: vector_deinterleave_load_nxv8f16_nxv16f16:307; CHECK: # %bb.0:308; CHECK-NEXT: vsetvli a1, zero, e16, m2, ta, ma309; CHECK-NEXT: vlseg2e16.v v8, (a0)310; CHECK-NEXT: ret311 %vec = load <vscale x 16 x half>, ptr %p312 %deinterleaved.results = call {<vscale x 8 x half>, <vscale x 8 x half>} @llvm.vector.deinterleave2.nxv16f16(<vscale x 16 x half> %vec)313 %t0 = extractvalue { <vscale x 8 x half>, <vscale x 8 x half> } %deinterleaved.results, 0314 %t1 = extractvalue { <vscale x 8 x half>, <vscale x 8 x half> } %deinterleaved.results, 1315 %res0 = insertvalue { <vscale x 8 x half>, <vscale x 8 x half> } poison, <vscale x 8 x half> %t0, 0316 %res1 = insertvalue { <vscale x 8 x half>, <vscale x 8 x half> } %res0, <vscale x 8 x half> %t1, 1317 ret {<vscale x 8 x half>, <vscale x 8 x half>} %res1318}319 320define {<vscale x 4 x float>, <vscale x 4 x float>} @vector_deinterleave_load_nxv4f32_nxv8f32(ptr %p) {321; CHECK-LABEL: vector_deinterleave_load_nxv4f32_nxv8f32:322; CHECK: # %bb.0:323; CHECK-NEXT: vsetvli a1, zero, e32, m2, ta, ma324; CHECK-NEXT: vlseg2e32.v v8, (a0)325; CHECK-NEXT: ret326 %vec = load <vscale x 8 x float>, ptr %p327 %deinterleaved.results = call {<vscale x 4 x float>, <vscale x 4 x float>} @llvm.vector.deinterleave2.nxv8f32(<vscale x 8 x float> %vec)328 %t0 = extractvalue { <vscale x 4 x float>, <vscale x 4 x float> } %deinterleaved.results, 0329 %t1 = extractvalue { <vscale x 4 x float>, <vscale x 4 x float> } %deinterleaved.results, 1330 %res0 = insertvalue { <vscale x 4 x float>, <vscale x 4 x float> } poison, <vscale x 4 x float> %t0, 0331 %res1 = insertvalue { <vscale x 4 x float>, <vscale x 4 x float> } %res0, <vscale x 4 x float> %t1, 1332 ret {<vscale x 4 x float>, <vscale x 4 x float>} %res1333}334 335define {<vscale x 2 x double>, <vscale x 2 x double>} @vector_deinterleave_load_nxv2f64_nxv4f64(ptr %p) {336; CHECK-LABEL: vector_deinterleave_load_nxv2f64_nxv4f64:337; CHECK: # %bb.0:338; CHECK-NEXT: vsetvli a1, zero, e64, m2, ta, ma339; CHECK-NEXT: vlseg2e64.v v8, (a0)340; CHECK-NEXT: ret341 %vec = load <vscale x 4 x double>, ptr %p342 %deinterleaved.results = call {<vscale x 2 x double>, <vscale x 2 x double>} @llvm.vector.deinterleave2.nxv4f64(<vscale x 4 x double> %vec)343 %t0 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %deinterleaved.results, 0344 %t1 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %deinterleaved.results, 1345 %res0 = insertvalue { <vscale x 2 x double>, <vscale x 2 x double> } poison, <vscale x 2 x double> %t0, 0346 %res1 = insertvalue { <vscale x 2 x double>, <vscale x 2 x double> } %res0, <vscale x 2 x double> %t1, 1347 ret {<vscale x 2 x double>, <vscale x 2 x double>} %res1348}349 350define {<vscale x 2 x ptr>, <vscale x 2 x ptr>} @vector_deinterleave_load_nxv2p0_nxv4p0(ptr %p) {351; RV32-LABEL: vector_deinterleave_load_nxv2p0_nxv4p0:352; RV32: # %bb.0:353; RV32-NEXT: vsetvli a1, zero, e32, m1, ta, ma354; RV32-NEXT: vlseg2e32.v v8, (a0)355; RV32-NEXT: ret356;357; RV64-LABEL: vector_deinterleave_load_nxv2p0_nxv4p0:358; RV64: # %bb.0:359; RV64-NEXT: vsetvli a1, zero, e64, m2, ta, ma360; RV64-NEXT: vlseg2e64.v v8, (a0)361; RV64-NEXT: ret362 %vec = load <vscale x 4 x ptr>, ptr %p363 %deinterleaved.results = call {<vscale x 2 x ptr>, <vscale x 2 x ptr>} @llvm.vector.deinterleave2.nxv4p0(<vscale x 4 x ptr> %vec)364 %t0 = extractvalue { <vscale x 2 x ptr>, <vscale x 2 x ptr> } %deinterleaved.results, 0365 %t1 = extractvalue { <vscale x 2 x ptr>, <vscale x 2 x ptr> } %deinterleaved.results, 1366 %res0 = insertvalue { <vscale x 2 x ptr>, <vscale x 2 x ptr> } poison, <vscale x 2 x ptr> %t0, 0367 %res1 = insertvalue { <vscale x 2 x ptr>, <vscale x 2 x ptr> } %res0, <vscale x 2 x ptr> %t1, 1368 ret {<vscale x 2 x ptr>, <vscale x 2 x ptr>} %res1369}370 371define { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } @vector_deinterleave_load_factor3(ptr %p) {372; CHECK-LABEL: vector_deinterleave_load_factor3:373; CHECK: # %bb.0:374; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma375; CHECK-NEXT: vlseg3e8.v v8, (a0)376; CHECK-NEXT: ret377 %vec = load <vscale x 24 x i8>, ptr %p378 %d0 = call {<vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>} @llvm.vector.deinterleave3(<vscale x 24 x i8> %vec)379 %t0 = extractvalue {<vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>} %d0, 0380 %t1 = extractvalue {<vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>} %d0, 1381 %t2 = extractvalue {<vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>} %d0, 2382 %res0 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } poison, <vscale x 8 x i8> %t0, 0383 %res1 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res0, <vscale x 8 x i8> %t1, 1384 %res2 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res1, <vscale x 8 x i8> %t2, 2385 ret { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res2386}387 388define { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } @vector_deinterleave_load_factor4(ptr %p) {389; CHECK-LABEL: vector_deinterleave_load_factor4:390; CHECK: # %bb.0:391; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma392; CHECK-NEXT: vlseg4e8.v v8, (a0)393; CHECK-NEXT: ret394 %vec = load <vscale x 32 x i8>, ptr %p395 %d0 = call { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } @llvm.vector.deinterleave4(<vscale x 32 x i8> %vec)396 %t0 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 0397 %t1 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 1398 %t2 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 2399 %t3 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 3400 %res0 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } poison, <vscale x 8 x i8> %t0, 0401 %res1 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res0, <vscale x 8 x i8> %t1, 1402 %res2 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res1, <vscale x 8 x i8> %t2, 2403 %res3 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res2, <vscale x 8 x i8> %t3, 3404 ret { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res3405}406 407define <vscale x 8 x i8> @vector_deinterleave_load_factor4_oneactive(ptr %p) {408; CHECK-LABEL: vector_deinterleave_load_factor4_oneactive:409; CHECK: # %bb.0:410; CHECK-NEXT: li a1, 4411; CHECK-NEXT: vsetvli a2, zero, e8, m1, ta, ma412; CHECK-NEXT: vlse8.v v8, (a0), a1413; CHECK-NEXT: ret414 %vec = load <vscale x 32 x i8>, ptr %p415 %d0 = call { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } @llvm.vector.deinterleave4(<vscale x 32 x i8> %vec)416 %t0 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 0417 ret <vscale x 8 x i8> %t0418}419 420define <vscale x 8 x i8> @vector_deinterleave_load_factor4_oneactive2(ptr %p) {421; CHECK-LABEL: vector_deinterleave_load_factor4_oneactive2:422; CHECK: # %bb.0:423; CHECK-NEXT: addi a0, a0, 3424; CHECK-NEXT: li a1, 4425; CHECK-NEXT: vsetvli a2, zero, e8, m1, ta, ma426; CHECK-NEXT: vlse8.v v8, (a0), a1427; CHECK-NEXT: ret428 %vec = load <vscale x 32 x i8>, ptr %p429 %d0 = call { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } @llvm.vector.deinterleave4(<vscale x 32 x i8> %vec)430 %t0 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 3431 ret <vscale x 8 x i8> %t0432}433 434define { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } @vector_deinterleave_load_factor4_twoactive(ptr %p) {435; CHECK-LABEL: vector_deinterleave_load_factor4_twoactive:436; CHECK: # %bb.0:437; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma438; CHECK-NEXT: vlseg4e8.v v8, (a0)439; CHECK-NEXT: ret440 %vec = load <vscale x 32 x i8>, ptr %p441 %d0 = call { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } @llvm.vector.deinterleave4(<vscale x 32 x i8> %vec)442 %t0 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 0443 %t1 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 1444 %res0 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } poison, <vscale x 8 x i8> %t0, 0445 %res1 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res0, <vscale x 8 x i8> %t1, 1446 ret { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res1447}448 449define { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } @vector_deinterleave_load_factor5(ptr %p) {450; CHECK-LABEL: vector_deinterleave_load_factor5:451; CHECK: # %bb.0:452; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma453; CHECK-NEXT: vlseg5e8.v v8, (a0)454; CHECK-NEXT: ret455 %vec = load <vscale x 40 x i8>, ptr %p456 %d0 = call {<vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>} @llvm.vector.deinterleave5(<vscale x 40 x i8> %vec)457 %t0 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 0458 %t1 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 1459 %t2 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 2460 %t3 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 3461 %t4 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 4462 %res0 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } poison, <vscale x 8 x i8> %t0, 0463 %res1 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res0, <vscale x 8 x i8> %t1, 1464 %res2 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res1, <vscale x 8 x i8> %t2, 2465 %res3 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res2, <vscale x 8 x i8> %t3, 3466 %res4 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res3, <vscale x 8 x i8> %t4, 4467 ret { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res4468}469 470define { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } @vector_deinterleave_load_factor6(ptr %p) {471; CHECK-LABEL: vector_deinterleave_load_factor6:472; CHECK: # %bb.0:473; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma474; CHECK-NEXT: vlseg6e8.v v8, (a0)475; CHECK-NEXT: ret476 %vec = load <vscale x 48 x i8>, ptr %p477 %d0 = call { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } @llvm.vector.deinterleave6(<vscale x 48 x i8> %vec)478 %t0 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 0479 %t1 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 1480 %t2 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 2481 %t3 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 3482 %t4 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 4483 %t5 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 5484 %res0 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } poison, <vscale x 8 x i8> %t0, 0485 %res1 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res0, <vscale x 8 x i8> %t1, 1486 %res2 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res1, <vscale x 8 x i8> %t2, 2487 %res3 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res2, <vscale x 8 x i8> %t3, 3488 %res4 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res3, <vscale x 8 x i8> %t4, 4489 %res5 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res4, <vscale x 8 x i8> %t5, 5490 ret { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res5491}492 493define { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } @vector_deinterleave_load_factor7(ptr %p) {494; CHECK-LABEL: vector_deinterleave_load_factor7:495; CHECK: # %bb.0:496; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma497; CHECK-NEXT: vlseg7e8.v v8, (a0)498; CHECK-NEXT: ret499 %vec = load <vscale x 56 x i8>, ptr %p500 %d0 = call {<vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>} @llvm.vector.deinterleave7(<vscale x 56 x i8> %vec)501 %t0 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 0502 %t1 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 1503 %t2 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 2504 %t3 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 3505 %t4 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 4506 %t5 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 5507 %t6 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 6508 %res0 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } poison, <vscale x 8 x i8> %t0, 0509 %res1 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res0, <vscale x 8 x i8> %t1, 1510 %res2 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res1, <vscale x 8 x i8> %t2, 2511 %res3 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res2, <vscale x 8 x i8> %t3, 3512 %res4 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res3, <vscale x 8 x i8> %t4, 4513 %res5 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res4, <vscale x 8 x i8> %t5, 5514 %res6 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res5, <vscale x 8 x i8> %t6, 6515 ret { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res6516}517 518define { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } @vector_deinterleave_load_factor8(ptr %p) {519; CHECK-LABEL: vector_deinterleave_load_factor8:520; CHECK: # %bb.0:521; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma522; CHECK-NEXT: vlseg8e8.v v8, (a0)523; CHECK-NEXT: ret524 %vec = load <vscale x 64 x i8>, ptr %p525 %d0 = call { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } @llvm.vector.deinterleave8(<vscale x 64 x i8> %vec)526 %t0 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 0527 %t1 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 1528 %t2 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 2529 %t3 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 3530 %t4 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 4531 %t5 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 5532 %t6 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 6533 %t7 = extractvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %d0, 7534 %res0 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } poison, <vscale x 8 x i8> %t0, 0535 %res1 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res0, <vscale x 8 x i8> %t1, 1536 %res2 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res1, <vscale x 8 x i8> %t2, 2537 %res3 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res2, <vscale x 8 x i8> %t3, 3538 %res4 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res3, <vscale x 8 x i8> %t4, 4539 %res5 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res4, <vscale x 8 x i8> %t5, 5540 %res6 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res5, <vscale x 8 x i8> %t6, 6541 %res7 = insertvalue { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res6, <vscale x 8 x i8> %t7, 7542 ret { <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8> } %res7543}544 545define {<vscale x 16 x i8>, <vscale x 16 x i8>} @masked_load_factor2(ptr %p) {546; CHECK-LABEL: masked_load_factor2:547; CHECK: # %bb.0:548; CHECK-NEXT: vsetvli a1, zero, e8, m2, ta, ma549; CHECK-NEXT: vlseg2e8.v v8, (a0)550; CHECK-NEXT: ret551 %vec = call <vscale x 32 x i8> @llvm.masked.load(ptr %p, i32 4, <vscale x 32 x i1> splat (i1 true), <vscale x 32 x i8> poison)552 %deinterleaved.results = call {<vscale x 16 x i8>, <vscale x 16 x i8>} @llvm.vector.deinterleave2.nxv32i8(<vscale x 32 x i8> %vec)553 ret {<vscale x 16 x i8>, <vscale x 16 x i8>} %deinterleaved.results554}555 556define {<vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>} @masked_load_factor4(ptr %p) {557; CHECK-LABEL: masked_load_factor4:558; CHECK: # %bb.0:559; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma560; CHECK-NEXT: vlseg4e8.v v8, (a0)561; CHECK-NEXT: ret562 %vec = call <vscale x 32 x i8> @llvm.masked.load(ptr %p, i32 4, <vscale x 32 x i1> splat (i1 true), <vscale x 32 x i8> poison)563 %deinterleaved.results = call {<vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>} @llvm.vector.deinterleave4.nxv32i8(<vscale x 32 x i8> %vec)564 ret {<vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>} %deinterleaved.results565}566 567define {<vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>} @masked_load_factor4_mask(ptr %p, <vscale x 8 x i1> %mask) {568; CHECK-LABEL: masked_load_factor4_mask:569; CHECK: # %bb.0:570; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma571; CHECK-NEXT: vlseg4e8.v v8, (a0), v0.t572; CHECK-NEXT: ret573 %interleaved.mask = tail call <vscale x 32 x i1> @llvm.vector.interleave4.nxv32i1(<vscale x 8 x i1> %mask, <vscale x 8 x i1> %mask, <vscale x 8 x i1> %mask, <vscale x 8 x i1> %mask)574 %vec = call <vscale x 32 x i8> @llvm.masked.load(ptr %p, i32 4, <vscale x 32 x i1> %interleaved.mask, <vscale x 32 x i8> poison)575 %deinterleaved.results = call {<vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>} @llvm.vector.deinterleave4.nxv32i8(<vscale x 32 x i8> %vec)576 ret {<vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>} %deinterleaved.results577}578 579; Negative test - some of the deinterleaved elements might come from the580; passthru not the load581define {<vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>} @masked_load_factor4_passthru(ptr %p, <vscale x 8 x i1> %mask, <vscale x 32 x i8> %passthru) {582; CHECK-LABEL: masked_load_factor4_passthru:583; CHECK: # %bb.0:584; CHECK-NEXT: addi sp, sp, -16585; CHECK-NEXT: .cfi_def_cfa_offset 16586; CHECK-NEXT: csrr a1, vlenb587; CHECK-NEXT: slli a1, a1, 3588; CHECK-NEXT: sub sp, sp, a1589; CHECK-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb590; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma591; CHECK-NEXT: vmv.v.i v12, 0592; CHECK-NEXT: addi a1, sp, 16593; CHECK-NEXT: csrr a2, vlenb594; CHECK-NEXT: vmerge.vim v12, v12, 1, v0595; CHECK-NEXT: add a3, a1, a2596; CHECK-NEXT: vmv.v.v v13, v12597; CHECK-NEXT: srli a4, a2, 2598; CHECK-NEXT: vmv.v.v v14, v12599; CHECK-NEXT: srli a5, a2, 3600; CHECK-NEXT: vmv.v.v v15, v12601; CHECK-NEXT: vsseg4e8.v v12, (a1)602; CHECK-NEXT: vl1r.v v12, (a1)603; CHECK-NEXT: add a1, a4, a5604; CHECK-NEXT: vl1r.v v13, (a3)605; CHECK-NEXT: add a3, a3, a2606; CHECK-NEXT: add a2, a3, a2607; CHECK-NEXT: vl1r.v v14, (a3)608; CHECK-NEXT: vl1r.v v15, (a2)609; CHECK-NEXT: vmsne.vi v13, v13, 0610; CHECK-NEXT: vmsne.vi v0, v12, 0611; CHECK-NEXT: vmsne.vi v12, v14, 0612; CHECK-NEXT: vmsne.vi v14, v15, 0613; CHECK-NEXT: vsetvli zero, a4, e8, mf2, tu, ma614; CHECK-NEXT: vslideup.vx v0, v13, a5615; CHECK-NEXT: vsetvli zero, a1, e8, mf2, tu, ma616; CHECK-NEXT: vslideup.vx v0, v12, a4617; CHECK-NEXT: vsetvli a2, zero, e8, mf2, ta, ma618; CHECK-NEXT: vslideup.vx v0, v14, a1619; CHECK-NEXT: vsetvli a1, zero, e8, m4, ta, mu620; CHECK-NEXT: vle8.v v8, (a0), v0.t621; CHECK-NEXT: csrr a0, vlenb622; CHECK-NEXT: slli a0, a0, 2623; CHECK-NEXT: add a0, sp, a0624; CHECK-NEXT: addi a0, a0, 16625; CHECK-NEXT: vs4r.v v8, (a0)626; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma627; CHECK-NEXT: vlseg4e8.v v8, (a0)628; CHECK-NEXT: csrr a0, vlenb629; CHECK-NEXT: slli a0, a0, 3630; CHECK-NEXT: add sp, sp, a0631; CHECK-NEXT: .cfi_def_cfa sp, 16632; CHECK-NEXT: addi sp, sp, 16633; CHECK-NEXT: .cfi_def_cfa_offset 0634; CHECK-NEXT: ret635 %interleaved.mask = tail call <vscale x 32 x i1> @llvm.vector.interleave4.nxv32i1(<vscale x 8 x i1> %mask, <vscale x 8 x i1> %mask, <vscale x 8 x i1> %mask, <vscale x 8 x i1> %mask)636 %vec = call <vscale x 32 x i8> @llvm.masked.load(ptr %p, i32 4, <vscale x 32 x i1> %interleaved.mask, <vscale x 32 x i8> %passthru)637 %deinterleaved.results = call {<vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>} @llvm.vector.deinterleave4.nxv32i8(<vscale x 32 x i8> %vec)638 ret {<vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i8>} %deinterleaved.results639}640 641define { <8 x float>, <8 x float> } @deinterleave_unrelated(<16 x float> %arg) {642; CHECK-LABEL: deinterleave_unrelated:643; CHECK: # %bb.0: # %entry644; CHECK-NEXT: vsetivli zero, 16, e32, m4, ta, ma645; CHECK-NEXT: vfabs.v v12, v8646; CHECK-NEXT: li a0, 32647; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma648; CHECK-NEXT: vnsrl.wx v10, v12, a0649; CHECK-NEXT: vnsrl.wi v8, v12, 0650; CHECK-NEXT: ret651entry:652 %abs = call <16 x float> @llvm.fabs(<16 x float> %arg)653 %res = call { <8 x float>, <8 x float> } @llvm.vector.deinterleave2.v16f32(<16 x float> %abs)654 ret { <8 x float>, <8 x float> } %res655}656