1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple riscv32 -mattr=+m,+d,+zvfh,+v,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s 3; RUN: llc -mtriple riscv64 -mattr=+m,+d,+zvfh,+v,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s 4 5define <vscale x 8 x i32> @insert_nxv8i32_nxv4i32_0(<vscale x 8 x i32> %vec, <vscale x 4 x i32> %subvec) { 6; CHECK-LABEL: insert_nxv8i32_nxv4i32_0: 7; CHECK: # %bb.0: 8; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma 9; CHECK-NEXT: vmv2r.v v8, v12 10; CHECK-NEXT: ret 11 %v = call <vscale x 8 x i32> @llvm.vector.insert.nxv4i32.nxv8i32(<vscale x 8 x i32> %vec, <vscale x 4 x i32> %subvec, i64 0) 12 ret <vscale x 8 x i32> %v 13} 14 15define <vscale x 8 x i32> @insert_nxv8i32_nxv4i32_4(<vscale x 8 x i32> %vec, <vscale x 4 x i32> %subvec) { 16; CHECK-LABEL: insert_nxv8i32_nxv4i32_4: 17; CHECK: # %bb.0: 18; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma 19; CHECK-NEXT: vmv2r.v v10, v12 20; CHECK-NEXT: ret 21 %v = call <vscale x 8 x i32> @llvm.vector.insert.nxv4i32.nxv8i32(<vscale x 8 x i32> %vec, <vscale x 4 x i32> %subvec, i64 4) 22 ret <vscale x 8 x i32> %v 23} 24 25define <vscale x 8 x i32> @insert_nxv8i32_nxv2i32_0(<vscale x 8 x i32> %vec, <vscale x 2 x i32> %subvec) { 26; CHECK-LABEL: insert_nxv8i32_nxv2i32_0: 27; CHECK: # %bb.0: 28; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma 29; CHECK-NEXT: vmv1r.v v8, v12 30; CHECK-NEXT: ret 31 %v = call <vscale x 8 x i32> @llvm.vector.insert.nxv2i32.nxv8i32(<vscale x 8 x i32> %vec, <vscale x 2 x i32> %subvec, i64 0) 32 ret <vscale x 8 x i32> %v 33} 34 35define <vscale x 8 x i32> @insert_nxv8i32_nxv2i32_2(<vscale x 8 x i32> %vec, <vscale x 2 x i32> %subvec) { 36; CHECK-LABEL: insert_nxv8i32_nxv2i32_2: 37; CHECK: # %bb.0: 38; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma 39; CHECK-NEXT: vmv1r.v v9, v12 40; CHECK-NEXT: ret 41 %v = call <vscale x 8 x i32> @llvm.vector.insert.nxv2i32.nxv8i32(<vscale x 8 x i32> %vec, <vscale x 2 x i32> %subvec, i64 2) 42 ret <vscale x 8 x i32> %v 43} 44 45define <vscale x 8 x i32> @insert_nxv8i32_nxv2i32_4(<vscale x 8 x i32> %vec, <vscale x 2 x i32> %subvec) { 46; CHECK-LABEL: insert_nxv8i32_nxv2i32_4: 47; CHECK: # %bb.0: 48; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma 49; CHECK-NEXT: vmv1r.v v10, v12 50; CHECK-NEXT: ret 51 %v = call <vscale x 8 x i32> @llvm.vector.insert.nxv2i32.nxv8i32(<vscale x 8 x i32> %vec, <vscale x 2 x i32> %subvec, i64 4) 52 ret <vscale x 8 x i32> %v 53} 54 55define <vscale x 8 x i32> @insert_nxv8i32_nxv2i32_6(<vscale x 8 x i32> %vec, <vscale x 2 x i32> %subvec) { 56; CHECK-LABEL: insert_nxv8i32_nxv2i32_6: 57; CHECK: # %bb.0: 58; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma 59; CHECK-NEXT: vmv1r.v v11, v12 60; CHECK-NEXT: ret 61 %v = call <vscale x 8 x i32> @llvm.vector.insert.nxv2i32.nxv8i32(<vscale x 8 x i32> %vec, <vscale x 2 x i32> %subvec, i64 6) 62 ret <vscale x 8 x i32> %v 63} 64 65define <vscale x 4 x i8> @insert_nxv1i8_nxv4i8_0(<vscale x 4 x i8> %vec, <vscale x 1 x i8> %subvec) { 66; CHECK-LABEL: insert_nxv1i8_nxv4i8_0: 67; CHECK: # %bb.0: 68; CHECK-NEXT: csrr a0, vlenb 69; CHECK-NEXT: srli a0, a0, 3 70; CHECK-NEXT: vsetvli zero, a0, e8, mf2, tu, ma 71; CHECK-NEXT: vmv.v.v v8, v9 72; CHECK-NEXT: ret 73 %v = call <vscale x 4 x i8> @llvm.vector.insert.nxv1i8.nxv4i8(<vscale x 4 x i8> %vec, <vscale x 1 x i8> %subvec, i64 0) 74 ret <vscale x 4 x i8> %v 75} 76 77define <vscale x 4 x i8> @insert_nxv1i8_nxv4i8_3(<vscale x 4 x i8> %vec, <vscale x 1 x i8> %subvec) { 78; CHECK-LABEL: insert_nxv1i8_nxv4i8_3: 79; CHECK: # %bb.0: 80; CHECK-NEXT: csrr a0, vlenb 81; CHECK-NEXT: srli a0, a0, 3 82; CHECK-NEXT: slli a1, a0, 1 83; CHECK-NEXT: add a1, a1, a0 84; CHECK-NEXT: add a0, a1, a0 85; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 86; CHECK-NEXT: vslideup.vx v8, v9, a1 87; CHECK-NEXT: ret 88 %v = call <vscale x 4 x i8> @llvm.vector.insert.nxv1i8.nxv4i8(<vscale x 4 x i8> %vec, <vscale x 1 x i8> %subvec, i64 3) 89 ret <vscale x 4 x i8> %v 90} 91 92define <vscale x 16 x i32> @insert_nxv16i32_nxv8i32_0(<vscale x 16 x i32> %vec, <vscale x 8 x i32> %subvec) { 93; CHECK-LABEL: insert_nxv16i32_nxv8i32_0: 94; CHECK: # %bb.0: 95; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma 96; CHECK-NEXT: vmv4r.v v8, v16 97; CHECK-NEXT: ret 98 %v = call <vscale x 16 x i32> @llvm.vector.insert.nxv8i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 8 x i32> %subvec, i64 0) 99 ret <vscale x 16 x i32> %v 100} 101 102define <vscale x 16 x i32> @insert_nxv16i32_nxv8i32_8(<vscale x 16 x i32> %vec, <vscale x 8 x i32> %subvec) { 103; CHECK-LABEL: insert_nxv16i32_nxv8i32_8: 104; CHECK: # %bb.0: 105; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma 106; CHECK-NEXT: vmv4r.v v12, v16 107; CHECK-NEXT: ret 108 %v = call <vscale x 16 x i32> @llvm.vector.insert.nxv8i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 8 x i32> %subvec, i64 8) 109 ret <vscale x 16 x i32> %v 110} 111 112define <vscale x 16 x i32> @insert_nxv16i32_nxv4i32_0(<vscale x 16 x i32> %vec, <vscale x 4 x i32> %subvec) { 113; CHECK-LABEL: insert_nxv16i32_nxv4i32_0: 114; CHECK: # %bb.0: 115; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma 116; CHECK-NEXT: vmv2r.v v8, v16 117; CHECK-NEXT: ret 118 %v = call <vscale x 16 x i32> @llvm.vector.insert.nxv4i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 4 x i32> %subvec, i64 0) 119 ret <vscale x 16 x i32> %v 120} 121 122define <vscale x 16 x i32> @insert_nxv16i32_nxv4i32_4(<vscale x 16 x i32> %vec, <vscale x 4 x i32> %subvec) { 123; CHECK-LABEL: insert_nxv16i32_nxv4i32_4: 124; CHECK: # %bb.0: 125; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma 126; CHECK-NEXT: vmv2r.v v10, v16 127; CHECK-NEXT: ret 128 %v = call <vscale x 16 x i32> @llvm.vector.insert.nxv4i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 4 x i32> %subvec, i64 4) 129 ret <vscale x 16 x i32> %v 130} 131 132define <vscale x 16 x i32> @insert_nxv16i32_nxv4i32_8(<vscale x 16 x i32> %vec, <vscale x 4 x i32> %subvec) { 133; CHECK-LABEL: insert_nxv16i32_nxv4i32_8: 134; CHECK: # %bb.0: 135; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma 136; CHECK-NEXT: vmv2r.v v12, v16 137; CHECK-NEXT: ret 138 %v = call <vscale x 16 x i32> @llvm.vector.insert.nxv4i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 4 x i32> %subvec, i64 8) 139 ret <vscale x 16 x i32> %v 140} 141 142define <vscale x 16 x i32> @insert_nxv16i32_nxv4i32_12(<vscale x 16 x i32> %vec, <vscale x 4 x i32> %subvec) { 143; CHECK-LABEL: insert_nxv16i32_nxv4i32_12: 144; CHECK: # %bb.0: 145; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma 146; CHECK-NEXT: vmv2r.v v14, v16 147; CHECK-NEXT: ret 148 %v = call <vscale x 16 x i32> @llvm.vector.insert.nxv4i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 4 x i32> %subvec, i64 12) 149 ret <vscale x 16 x i32> %v 150} 151 152define <vscale x 16 x i32> @insert_nxv16i32_nxv2i32_0(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec) { 153; CHECK-LABEL: insert_nxv16i32_nxv2i32_0: 154; CHECK: # %bb.0: 155; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma 156; CHECK-NEXT: vmv1r.v v8, v16 157; CHECK-NEXT: ret 158 %v = call <vscale x 16 x i32> @llvm.vector.insert.nxv2i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec, i64 0) 159 ret <vscale x 16 x i32> %v 160} 161 162define <vscale x 16 x i32> @insert_nxv16i32_nxv2i32_2(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec) { 163; CHECK-LABEL: insert_nxv16i32_nxv2i32_2: 164; CHECK: # %bb.0: 165; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma 166; CHECK-NEXT: vmv1r.v v9, v16 167; CHECK-NEXT: ret 168 %v = call <vscale x 16 x i32> @llvm.vector.insert.nxv2i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec, i64 2) 169 ret <vscale x 16 x i32> %v 170} 171 172define <vscale x 16 x i32> @insert_nxv16i32_nxv2i32_4(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec) { 173; CHECK-LABEL: insert_nxv16i32_nxv2i32_4: 174; CHECK: # %bb.0: 175; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma 176; CHECK-NEXT: vmv1r.v v10, v16 177; CHECK-NEXT: ret 178 %v = call <vscale x 16 x i32> @llvm.vector.insert.nxv2i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec, i64 4) 179 ret <vscale x 16 x i32> %v 180} 181 182define <vscale x 16 x i32> @insert_nxv16i32_nxv2i32_6(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec) { 183; CHECK-LABEL: insert_nxv16i32_nxv2i32_6: 184; CHECK: # %bb.0: 185; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma 186; CHECK-NEXT: vmv1r.v v11, v16 187; CHECK-NEXT: ret 188 %v = call <vscale x 16 x i32> @llvm.vector.insert.nxv2i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec, i64 6) 189 ret <vscale x 16 x i32> %v 190} 191 192define <vscale x 16 x i32> @insert_nxv16i32_nxv2i32_8(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec) { 193; CHECK-LABEL: insert_nxv16i32_nxv2i32_8: 194; CHECK: # %bb.0: 195; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma 196; CHECK-NEXT: vmv1r.v v12, v16 197; CHECK-NEXT: ret 198 %v = call <vscale x 16 x i32> @llvm.vector.insert.nxv2i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec, i64 8) 199 ret <vscale x 16 x i32> %v 200} 201 202define <vscale x 16 x i32> @insert_nxv16i32_nxv2i32_10(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec) { 203; CHECK-LABEL: insert_nxv16i32_nxv2i32_10: 204; CHECK: # %bb.0: 205; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma 206; CHECK-NEXT: vmv1r.v v13, v16 207; CHECK-NEXT: ret 208 %v = call <vscale x 16 x i32> @llvm.vector.insert.nxv2i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec, i64 10) 209 ret <vscale x 16 x i32> %v 210} 211 212define <vscale x 16 x i32> @insert_nxv16i32_nxv2i32_12(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec) { 213; CHECK-LABEL: insert_nxv16i32_nxv2i32_12: 214; CHECK: # %bb.0: 215; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma 216; CHECK-NEXT: vmv1r.v v14, v16 217; CHECK-NEXT: ret 218 %v = call <vscale x 16 x i32> @llvm.vector.insert.nxv2i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec, i64 12) 219 ret <vscale x 16 x i32> %v 220} 221 222define <vscale x 16 x i32> @insert_nxv16i32_nxv2i32_14(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec) { 223; CHECK-LABEL: insert_nxv16i32_nxv2i32_14: 224; CHECK: # %bb.0: 225; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma 226; CHECK-NEXT: vmv1r.v v15, v16 227; CHECK-NEXT: ret 228 %v = call <vscale x 16 x i32> @llvm.vector.insert.nxv2i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 2 x i32> %subvec, i64 14) 229 ret <vscale x 16 x i32> %v 230} 231 232define <vscale x 16 x i32> @insert_nxv16i32_nxv1i32_0(<vscale x 16 x i32> %vec, <vscale x 1 x i32> %subvec) { 233; CHECK-LABEL: insert_nxv16i32_nxv1i32_0: 234; CHECK: # %bb.0: 235; CHECK-NEXT: csrr a0, vlenb 236; CHECK-NEXT: srli a0, a0, 3 237; CHECK-NEXT: vsetvli zero, a0, e32, m1, tu, ma 238; CHECK-NEXT: vmv.v.v v8, v16 239; CHECK-NEXT: ret 240 %v = call <vscale x 16 x i32> @llvm.vector.insert.nxv1i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 1 x i32> %subvec, i64 0) 241 ret <vscale x 16 x i32> %v 242} 243 244define <vscale x 16 x i32> @insert_nxv16i32_nxv1i32_1(<vscale x 16 x i32> %vec, <vscale x 1 x i32> %subvec) { 245; CHECK-LABEL: insert_nxv16i32_nxv1i32_1: 246; CHECK: # %bb.0: 247; CHECK-NEXT: csrr a0, vlenb 248; CHECK-NEXT: srli a0, a0, 3 249; CHECK-NEXT: add a1, a0, a0 250; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, ma 251; CHECK-NEXT: vslideup.vx v8, v16, a0 252; CHECK-NEXT: ret 253 %v = call <vscale x 16 x i32> @llvm.vector.insert.nxv1i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 1 x i32> %subvec, i64 1) 254 ret <vscale x 16 x i32> %v 255} 256 257define <vscale x 16 x i32> @insert_nxv16i32_nxv1i32_6(<vscale x 16 x i32> %vec, <vscale x 1 x i32> %subvec) { 258; CHECK-LABEL: insert_nxv16i32_nxv1i32_6: 259; CHECK: # %bb.0: 260; CHECK-NEXT: csrr a0, vlenb 261; CHECK-NEXT: srli a0, a0, 3 262; CHECK-NEXT: vsetvli zero, a0, e32, m1, tu, ma 263; CHECK-NEXT: vmv.v.v v11, v16 264; CHECK-NEXT: ret 265 %v = call <vscale x 16 x i32> @llvm.vector.insert.nxv1i32.nxv16i32(<vscale x 16 x i32> %vec, <vscale x 1 x i32> %subvec, i64 6) 266 ret <vscale x 16 x i32> %v 267} 268 269define <vscale x 16 x i8> @insert_nxv16i8_nxv1i8_0(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec) { 270; CHECK-LABEL: insert_nxv16i8_nxv1i8_0: 271; CHECK: # %bb.0: 272; CHECK-NEXT: csrr a0, vlenb 273; CHECK-NEXT: srli a0, a0, 3 274; CHECK-NEXT: vsetvli zero, a0, e8, m1, tu, ma 275; CHECK-NEXT: vmv.v.v v8, v10 276; CHECK-NEXT: ret 277 %v = call <vscale x 16 x i8> @llvm.vector.insert.nxv1i8.nxv16i8(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec, i64 0) 278 ret <vscale x 16 x i8> %v 279} 280 281define <vscale x 16 x i8> @insert_nxv16i8_nxv1i8_1(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec) { 282; CHECK-LABEL: insert_nxv16i8_nxv1i8_1: 283; CHECK: # %bb.0: 284; CHECK-NEXT: csrr a0, vlenb 285; CHECK-NEXT: srli a0, a0, 3 286; CHECK-NEXT: add a1, a0, a0 287; CHECK-NEXT: vsetvli zero, a1, e8, m1, tu, ma 288; CHECK-NEXT: vslideup.vx v8, v10, a0 289; CHECK-NEXT: ret 290 %v = call <vscale x 16 x i8> @llvm.vector.insert.nxv1i8.nxv16i8(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec, i64 1) 291 ret <vscale x 16 x i8> %v 292} 293 294define <vscale x 16 x i8> @insert_nxv16i8_nxv1i8_2(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec) { 295; CHECK-LABEL: insert_nxv16i8_nxv1i8_2: 296; CHECK: # %bb.0: 297; CHECK-NEXT: csrr a0, vlenb 298; CHECK-NEXT: srli a1, a0, 3 299; CHECK-NEXT: srli a0, a0, 2 300; CHECK-NEXT: add a1, a0, a1 301; CHECK-NEXT: vsetvli zero, a1, e8, m1, tu, ma 302; CHECK-NEXT: vslideup.vx v8, v10, a0 303; CHECK-NEXT: ret 304 %v = call <vscale x 16 x i8> @llvm.vector.insert.nxv1i8.nxv16i8(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec, i64 2) 305 ret <vscale x 16 x i8> %v 306} 307 308define <vscale x 16 x i8> @insert_nxv16i8_nxv1i8_3(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec) { 309; CHECK-LABEL: insert_nxv16i8_nxv1i8_3: 310; CHECK: # %bb.0: 311; CHECK-NEXT: csrr a0, vlenb 312; CHECK-NEXT: srli a0, a0, 3 313; CHECK-NEXT: slli a1, a0, 1 314; CHECK-NEXT: add a1, a1, a0 315; CHECK-NEXT: add a0, a1, a0 316; CHECK-NEXT: vsetvli zero, a0, e8, m1, tu, ma 317; CHECK-NEXT: vslideup.vx v8, v10, a1 318; CHECK-NEXT: ret 319 %v = call <vscale x 16 x i8> @llvm.vector.insert.nxv1i8.nxv16i8(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec, i64 3) 320 ret <vscale x 16 x i8> %v 321} 322 323define <vscale x 16 x i8> @insert_nxv16i8_nxv1i8_7(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec) { 324; CHECK-LABEL: insert_nxv16i8_nxv1i8_7: 325; CHECK: # %bb.0: 326; CHECK-NEXT: csrr a0, vlenb 327; CHECK-NEXT: srli a1, a0, 3 328; CHECK-NEXT: sub a0, a0, a1 329; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma 330; CHECK-NEXT: vslideup.vx v8, v10, a0 331; CHECK-NEXT: ret 332 %v = call <vscale x 16 x i8> @llvm.vector.insert.nxv1i8.nxv16i8(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec, i64 7) 333 ret <vscale x 16 x i8> %v 334} 335 336define <vscale x 16 x i8> @insert_nxv16i8_nxv1i8_15(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec) { 337; CHECK-LABEL: insert_nxv16i8_nxv1i8_15: 338; CHECK: # %bb.0: 339; CHECK-NEXT: csrr a0, vlenb 340; CHECK-NEXT: srli a1, a0, 3 341; CHECK-NEXT: sub a0, a0, a1 342; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma 343; CHECK-NEXT: vslideup.vx v9, v10, a0 344; CHECK-NEXT: ret 345 %v = call <vscale x 16 x i8> @llvm.vector.insert.nxv1i8.nxv16i8(<vscale x 16 x i8> %vec, <vscale x 1 x i8> %subvec, i64 15) 346 ret <vscale x 16 x i8> %v 347} 348 349define <vscale x 32 x half> @insert_nxv32f16_nxv2f16_0(<vscale x 32 x half> %vec, <vscale x 2 x half> %subvec) { 350; CHECK-LABEL: insert_nxv32f16_nxv2f16_0: 351; CHECK: # %bb.0: 352; CHECK-NEXT: csrr a0, vlenb 353; CHECK-NEXT: srli a0, a0, 2 354; CHECK-NEXT: vsetvli zero, a0, e16, m1, tu, ma 355; CHECK-NEXT: vmv.v.v v8, v16 356; CHECK-NEXT: ret 357 %v = call <vscale x 32 x half> @llvm.vector.insert.nxv2f16.nxv32f16(<vscale x 32 x half> %vec, <vscale x 2 x half> %subvec, i64 0) 358 ret <vscale x 32 x half> %v 359} 360 361define <vscale x 32 x half> @insert_nxv32f16_nxv2f16_2(<vscale x 32 x half> %vec, <vscale x 2 x half> %subvec) { 362; CHECK-LABEL: insert_nxv32f16_nxv2f16_2: 363; CHECK: # %bb.0: 364; CHECK-NEXT: csrr a0, vlenb 365; CHECK-NEXT: srli a0, a0, 2 366; CHECK-NEXT: add a1, a0, a0 367; CHECK-NEXT: vsetvli zero, a1, e16, m1, ta, ma 368; CHECK-NEXT: vslideup.vx v8, v16, a0 369; CHECK-NEXT: ret 370 %v = call <vscale x 32 x half> @llvm.vector.insert.nxv2f16.nxv32f16(<vscale x 32 x half> %vec, <vscale x 2 x half> %subvec, i64 2) 371 ret <vscale x 32 x half> %v 372} 373 374define <vscale x 32 x half> @insert_nxv32f16_nxv2f16_26(<vscale x 32 x half> %vec, <vscale x 2 x half> %subvec) { 375; CHECK-LABEL: insert_nxv32f16_nxv2f16_26: 376; CHECK: # %bb.0: 377; CHECK-NEXT: csrr a0, vlenb 378; CHECK-NEXT: srli a0, a0, 2 379; CHECK-NEXT: add a1, a0, a0 380; CHECK-NEXT: vsetvli zero, a1, e16, m1, ta, ma 381; CHECK-NEXT: vslideup.vx v14, v16, a0 382; CHECK-NEXT: ret 383 %v = call <vscale x 32 x half> @llvm.vector.insert.nxv2f16.nxv32f16(<vscale x 32 x half> %vec, <vscale x 2 x half> %subvec, i64 26) 384 ret <vscale x 32 x half> %v 385} 386 387define <vscale x 32 x half> @insert_nxv32f16_undef_nxv1f16_0(<vscale x 1 x half> %subvec) { 388; CHECK-LABEL: insert_nxv32f16_undef_nxv1f16_0: 389; CHECK: # %bb.0: 390; CHECK-NEXT: ret 391 %v = call <vscale x 32 x half> @llvm.vector.insert.nxv1f16.nxv32f16(<vscale x 32 x half> undef, <vscale x 1 x half> %subvec, i64 0) 392 ret <vscale x 32 x half> %v 393} 394 395define <vscale x 32 x half> @insert_nxv32f16_undef_nxv1f16_26(<vscale x 1 x half> %subvec) { 396; CHECK-LABEL: insert_nxv32f16_undef_nxv1f16_26: 397; CHECK: # %bb.0: 398; CHECK-NEXT: csrr a0, vlenb 399; CHECK-NEXT: srli a1, a0, 3 400; CHECK-NEXT: srli a0, a0, 2 401; CHECK-NEXT: add a1, a0, a1 402; CHECK-NEXT: vsetvli zero, a1, e16, m1, ta, ma 403; CHECK-NEXT: vslideup.vx v14, v8, a0 404; CHECK-NEXT: ret 405 %v = call <vscale x 32 x half> @llvm.vector.insert.nxv1f16.nxv32f16(<vscale x 32 x half> undef, <vscale x 1 x half> %subvec, i64 26) 406 ret <vscale x 32 x half> %v 407} 408 409define <vscale x 32 x i1> @insert_nxv32i1_nxv8i1_0(<vscale x 32 x i1> %v, <vscale x 8 x i1> %sv) { 410; CHECK-LABEL: insert_nxv32i1_nxv8i1_0: 411; CHECK: # %bb.0: 412; CHECK-NEXT: csrr a0, vlenb 413; CHECK-NEXT: srli a0, a0, 3 414; CHECK-NEXT: vsetvli zero, a0, e8, mf2, tu, ma 415; CHECK-NEXT: vmv.v.v v0, v8 416; CHECK-NEXT: ret 417 %vec = call <vscale x 32 x i1> @llvm.vector.insert.nxv8i1.nxv32i1(<vscale x 32 x i1> %v, <vscale x 8 x i1> %sv, i64 0) 418 ret <vscale x 32 x i1> %vec 419} 420 421define <vscale x 32 x i1> @insert_nxv32i1_nxv8i1_8(<vscale x 32 x i1> %v, <vscale x 8 x i1> %sv) { 422; CHECK-LABEL: insert_nxv32i1_nxv8i1_8: 423; CHECK: # %bb.0: 424; CHECK-NEXT: csrr a0, vlenb 425; CHECK-NEXT: srli a0, a0, 3 426; CHECK-NEXT: add a1, a0, a0 427; CHECK-NEXT: vsetvli zero, a1, e8, mf2, tu, ma 428; CHECK-NEXT: vslideup.vx v0, v8, a0 429; CHECK-NEXT: ret 430 %vec = call <vscale x 32 x i1> @llvm.vector.insert.nxv8i1.nxv32i1(<vscale x 32 x i1> %v, <vscale x 8 x i1> %sv, i64 8) 431 ret <vscale x 32 x i1> %vec 432} 433 434define <vscale x 4 x i1> @insert_nxv4i1_nxv1i1_0(<vscale x 4 x i1> %v, <vscale x 1 x i1> %sv) { 435; CHECK-LABEL: insert_nxv4i1_nxv1i1_0: 436; CHECK: # %bb.0: 437; CHECK-NEXT: vsetvli a0, zero, e8, mf2, ta, ma 438; CHECK-NEXT: vmv.v.i v9, 0 439; CHECK-NEXT: vmerge.vim v9, v9, 1, v0 440; CHECK-NEXT: vsetvli a0, zero, e8, mf8, ta, ma 441; CHECK-NEXT: vmv.v.i v10, 0 442; CHECK-NEXT: csrr a0, vlenb 443; CHECK-NEXT: vmv1r.v v0, v8 444; CHECK-NEXT: vmerge.vim v8, v10, 1, v0 445; CHECK-NEXT: srli a0, a0, 3 446; CHECK-NEXT: vsetvli zero, a0, e8, mf2, tu, ma 447; CHECK-NEXT: vmv.v.v v9, v8 448; CHECK-NEXT: vsetvli a0, zero, e8, mf2, ta, ma 449; CHECK-NEXT: vmsne.vi v0, v9, 0 450; CHECK-NEXT: ret 451 %vec = call <vscale x 4 x i1> @llvm.vector.insert.nxv1i1.nxv4i1(<vscale x 4 x i1> %v, <vscale x 1 x i1> %sv, i64 0) 452 ret <vscale x 4 x i1> %vec 453} 454 455define <vscale x 4 x i1> @insert_nxv4i1_nxv1i1_2(<vscale x 4 x i1> %v, <vscale x 1 x i1> %sv) { 456; CHECK-LABEL: insert_nxv4i1_nxv1i1_2: 457; CHECK: # %bb.0: 458; CHECK-NEXT: vsetvli a0, zero, e8, mf2, ta, ma 459; CHECK-NEXT: vmv.v.i v9, 0 460; CHECK-NEXT: csrr a0, vlenb 461; CHECK-NEXT: vmerge.vim v9, v9, 1, v0 462; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, ma 463; CHECK-NEXT: vmv.v.i v10, 0 464; CHECK-NEXT: srli a1, a0, 3 465; CHECK-NEXT: srli a0, a0, 2 466; CHECK-NEXT: add a1, a0, a1 467; CHECK-NEXT: vmv1r.v v0, v8 468; CHECK-NEXT: vmerge.vim v8, v10, 1, v0 469; CHECK-NEXT: vsetvli zero, a1, e8, mf2, tu, ma 470; CHECK-NEXT: vslideup.vx v9, v8, a0 471; CHECK-NEXT: vsetvli a0, zero, e8, mf2, ta, ma 472; CHECK-NEXT: vmsne.vi v0, v9, 0 473; CHECK-NEXT: ret 474 %vec = call <vscale x 4 x i1> @llvm.vector.insert.nxv1i1.nxv4i1(<vscale x 4 x i1> %v, <vscale x 1 x i1> %sv, i64 2) 475 ret <vscale x 4 x i1> %vec 476} 477 478declare <vscale x 16 x i64> @llvm.vector.insert.nxv8i64.nxv16i64(<vscale x 16 x i64>, <vscale x 8 x i64>, i64) 479 480define void @insert_nxv8i64_nxv16i64(<vscale x 8 x i64> %sv0, <vscale x 8 x i64> %sv1, ptr %out) { 481; CHECK-LABEL: insert_nxv8i64_nxv16i64: 482; CHECK: # %bb.0: 483; CHECK-NEXT: vs8r.v v8, (a0) 484; CHECK-NEXT: csrr a1, vlenb 485; CHECK-NEXT: slli a1, a1, 3 486; CHECK-NEXT: add a0, a0, a1 487; CHECK-NEXT: vs8r.v v16, (a0) 488; CHECK-NEXT: ret 489 %v0 = call <vscale x 16 x i64> @llvm.vector.insert.nxv8i64.nxv16i64(<vscale x 16 x i64> undef, <vscale x 8 x i64> %sv0, i64 0) 490 %v = call <vscale x 16 x i64> @llvm.vector.insert.nxv8i64.nxv16i64(<vscale x 16 x i64> %v0, <vscale x 8 x i64> %sv1, i64 8) 491 store <vscale x 16 x i64> %v, ptr %out 492 ret void 493} 494 495define void @insert_nxv8i64_nxv16i64_lo(<vscale x 8 x i64> %sv0, ptr %out) { 496; CHECK-LABEL: insert_nxv8i64_nxv16i64_lo: 497; CHECK: # %bb.0: 498; CHECK-NEXT: vs8r.v v8, (a0) 499; CHECK-NEXT: ret 500 %v = call <vscale x 16 x i64> @llvm.vector.insert.nxv8i64.nxv16i64(<vscale x 16 x i64> undef, <vscale x 8 x i64> %sv0, i64 0) 501 store <vscale x 16 x i64> %v, ptr %out 502 ret void 503} 504 505define void @insert_nxv8i64_nxv16i64_hi(<vscale x 8 x i64> %sv0, ptr %out) { 506; CHECK-LABEL: insert_nxv8i64_nxv16i64_hi: 507; CHECK: # %bb.0: 508; CHECK-NEXT: csrr a1, vlenb 509; CHECK-NEXT: slli a1, a1, 3 510; CHECK-NEXT: add a0, a0, a1 511; CHECK-NEXT: vs8r.v v8, (a0) 512; CHECK-NEXT: ret 513 %v = call <vscale x 16 x i64> @llvm.vector.insert.nxv8i64.nxv16i64(<vscale x 16 x i64> undef, <vscale x 8 x i64> %sv0, i64 8) 514 store <vscale x 16 x i64> %v, ptr %out 515 ret void 516} 517 518; We should be able to widen the <3 x i64> subvector to a <4 x i64> here because 519; we know that the minimum vscale is 2 520define <vscale x 2 x i64> @insert_nxv2i64_nxv3i64(<3 x i64> %sv) #0 { 521; CHECK-LABEL: insert_nxv2i64_nxv3i64: 522; CHECK: # %bb.0: 523; CHECK-NEXT: ret 524 %vec = call <vscale x 2 x i64> @llvm.vector.insert.nxv2i64.v3i64(<vscale x 2 x i64> undef, <3 x i64> %sv, i64 0) 525 ret <vscale x 2 x i64> %vec 526} 527 528; This shows a case where we were miscompiling because the index of the 529; outer expects a scalable inner and the inner most subvector is fixed length. 530; The code generated happens to be correct if VLEN=128, but is wrong if 531; VLEN=256. 532define <vscale x 8 x i32> @insert_insert_combine(<2 x i32> %subvec) { 533; CHECK-LABEL: insert_insert_combine: 534; CHECK: # %bb.0: 535; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma 536; CHECK-NEXT: vmv1r.v v10, v8 537; CHECK-NEXT: ret 538 %inner = call <vscale x 4 x i32> @llvm.vector.insert.nxv4i32.v2i32(<vscale x 4 x i32> undef, <2 x i32> %subvec, i64 0) 539 %outer = call <vscale x 8 x i32> @llvm.vector.insert.nxv4i32.nxv8i32(<vscale x 8 x i32> undef, <vscale x 4 x i32> %inner, i64 4) 540 ret <vscale x 8 x i32> %outer 541} 542 543; We can combine these two (even with non-zero index on the outer) because 544; the vector must be an even multiple. 545define <vscale x 8 x i32> @insert_insert_combine2(<vscale x 2 x i32> %subvec) { 546; CHECK-LABEL: insert_insert_combine2: 547; CHECK: # %bb.0: 548; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma 549; CHECK-NEXT: vmv1r.v v10, v8 550; CHECK-NEXT: ret 551 %inner = call <vscale x 4 x i32> @llvm.vector.insert.nxv2i32.nxv4i32(<vscale x 4 x i32> undef, <vscale x 2 x i32> %subvec, i64 0) 552 %outer = call <vscale x 8 x i32> @llvm.vector.insert.nxv4i32.nxv8i32(<vscale x 8 x i32> undef, <vscale x 4 x i32> %inner, i64 4) 553 ret <vscale x 8 x i32> %outer 554} 555 556define <vscale x 32 x bfloat> @insert_nxv32bf16_nxv2bf16_0(<vscale x 32 x bfloat> %vec, <vscale x 2 x bfloat> %subvec) { 557; CHECK-LABEL: insert_nxv32bf16_nxv2bf16_0: 558; CHECK: # %bb.0: 559; CHECK-NEXT: csrr a0, vlenb 560; CHECK-NEXT: srli a0, a0, 2 561; CHECK-NEXT: vsetvli zero, a0, e16, m1, tu, ma 562; CHECK-NEXT: vmv.v.v v8, v16 563; CHECK-NEXT: ret 564 %v = call <vscale x 32 x bfloat> @llvm.vector.insert.nxv2bf16.nxv32bf16(<vscale x 32 x bfloat> %vec, <vscale x 2 x bfloat> %subvec, i64 0) 565 ret <vscale x 32 x bfloat> %v 566} 567 568define <vscale x 32 x bfloat> @insert_nxv32bf16_nxv2bf16_2(<vscale x 32 x bfloat> %vec, <vscale x 2 x bfloat> %subvec) { 569; CHECK-LABEL: insert_nxv32bf16_nxv2bf16_2: 570; CHECK: # %bb.0: 571; CHECK-NEXT: csrr a0, vlenb 572; CHECK-NEXT: srli a0, a0, 2 573; CHECK-NEXT: add a1, a0, a0 574; CHECK-NEXT: vsetvli zero, a1, e16, m1, ta, ma 575; CHECK-NEXT: vslideup.vx v8, v16, a0 576; CHECK-NEXT: ret 577 %v = call <vscale x 32 x bfloat> @llvm.vector.insert.nxv2bf16.nxv32bf16(<vscale x 32 x bfloat> %vec, <vscale x 2 x bfloat> %subvec, i64 2) 578 ret <vscale x 32 x bfloat> %v 579} 580 581define <vscale x 32 x bfloat> @insert_nxv32bf16_nxv2bf16_26(<vscale x 32 x bfloat> %vec, <vscale x 2 x bfloat> %subvec) { 582; CHECK-LABEL: insert_nxv32bf16_nxv2bf16_26: 583; CHECK: # %bb.0: 584; CHECK-NEXT: csrr a0, vlenb 585; CHECK-NEXT: srli a0, a0, 2 586; CHECK-NEXT: add a1, a0, a0 587; CHECK-NEXT: vsetvli zero, a1, e16, m1, ta, ma 588; CHECK-NEXT: vslideup.vx v14, v16, a0 589; CHECK-NEXT: ret 590 %v = call <vscale x 32 x bfloat> @llvm.vector.insert.nxv2bf16.nxv32bf16(<vscale x 32 x bfloat> %vec, <vscale x 2 x bfloat> %subvec, i64 26) 591 ret <vscale x 32 x bfloat> %v 592} 593 594define <vscale x 32 x bfloat> @insert_nxv32bf16_undef_nxv1bf16_0(<vscale x 1 x bfloat> %subvec) { 595; CHECK-LABEL: insert_nxv32bf16_undef_nxv1bf16_0: 596; CHECK: # %bb.0: 597; CHECK-NEXT: ret 598 %v = call <vscale x 32 x bfloat> @llvm.vector.insert.nxv1bf16.nxv32bf16(<vscale x 32 x bfloat> undef, <vscale x 1 x bfloat> %subvec, i64 0) 599 ret <vscale x 32 x bfloat> %v 600} 601 602define <vscale x 32 x bfloat> @insert_nxv32bf16_undef_nxv1bf16_26(<vscale x 1 x bfloat> %subvec) { 603; CHECK-LABEL: insert_nxv32bf16_undef_nxv1bf16_26: 604; CHECK: # %bb.0: 605; CHECK-NEXT: csrr a0, vlenb 606; CHECK-NEXT: srli a1, a0, 3 607; CHECK-NEXT: srli a0, a0, 2 608; CHECK-NEXT: add a1, a0, a1 609; CHECK-NEXT: vsetvli zero, a1, e16, m1, ta, ma 610; CHECK-NEXT: vslideup.vx v14, v8, a0 611; CHECK-NEXT: ret 612 %v = call <vscale x 32 x bfloat> @llvm.vector.insert.nxv1bf16.nxv32bf16(<vscale x 32 x bfloat> undef, <vscale x 1 x bfloat> %subvec, i64 26) 613 ret <vscale x 32 x bfloat> %v 614} 615 616attributes #0 = { vscale_range(2,1024) } 617 618declare <vscale x 4 x i1> @llvm.vector.insert.nxv1i1.nxv4i1(<vscale x 4 x i1>, <vscale x 1 x i1>, i64) 619declare <vscale x 32 x i1> @llvm.vector.insert.nxv8i1.nxv32i1(<vscale x 32 x i1>, <vscale x 8 x i1>, i64) 620 621declare <vscale x 16 x i8> @llvm.vector.insert.nxv1i8.nxv16i8(<vscale x 16 x i8>, <vscale x 1 x i8>, i64) 622 623declare <vscale x 32 x half> @llvm.vector.insert.nxv1f16.nxv32f16(<vscale x 32 x half>, <vscale x 1 x half>, i64) 624declare <vscale x 32 x half> @llvm.vector.insert.nxv2f16.nxv32f16(<vscale x 32 x half>, <vscale x 2 x half>, i64) 625 626declare <vscale x 4 x i8> @llvm.vector.insert.nxv1i8.nxv4i8(<vscale x 4 x i8>, <vscale x 1 x i8>, i64 %idx) 627 628declare <vscale x 4 x i32> @llvm.vector.insert.nxv2i32.nxv4i32(<vscale x 4 x i32>, <vscale x 2 x i32>, i64) 629declare <vscale x 4 x i32> @llvm.vector.insert.nxv4i32.v2i32(<vscale x 4 x i32>, <2 x i32>, i64) 630 631declare <vscale x 8 x i32> @llvm.vector.insert.nxv2i32.nxv8i32(<vscale x 8 x i32>, <vscale x 2 x i32>, i64 %idx) 632declare <vscale x 8 x i32> @llvm.vector.insert.nxv4i32.nxv8i32(<vscale x 8 x i32>, <vscale x 4 x i32>, i64 %idx) 633 634declare <vscale x 16 x i32> @llvm.vector.insert.nxv1i32.nxv16i32(<vscale x 16 x i32>, <vscale x 1 x i32>, i64 %idx) 635declare <vscale x 16 x i32> @llvm.vector.insert.nxv2i32.nxv16i32(<vscale x 16 x i32>, <vscale x 2 x i32>, i64 %idx) 636declare <vscale x 16 x i32> @llvm.vector.insert.nxv4i32.nxv16i32(<vscale x 16 x i32>, <vscale x 4 x i32>, i64 %idx) 637declare <vscale x 16 x i32> @llvm.vector.insert.nxv8i32.nxv16i32(<vscale x 16 x i32>, <vscale x 8 x i32>, i64 %idx) 638 639declare <vscale x 2 x i64> @llvm.vector.insert.nxv2i64.v3i64(<vscale x 2 x i64>, <3 x i64>, i64 %idx) 640