1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4 2; RUN: llc -mtriple=riscv32 -mattr=+m,+v -verify-machineinstrs < %s | FileCheck %s 3; RUN: llc -mtriple=riscv64 -mattr=+m,+v -verify-machineinstrs < %s | FileCheck %s 4 5define <1 x i8> @vector_compress_v1i8(<1 x i8> %v, <1 x i1> %mask) { 6; CHECK-LABEL: vector_compress_v1i8: 7; CHECK: # %bb.0: 8; CHECK-NEXT: vsetivli zero, 1, e8, mf8, ta, ma 9; CHECK-NEXT: vcompress.vm v9, v8, v0 10; CHECK-NEXT: vmv1r.v v8, v9 11; CHECK-NEXT: ret 12 %ret = call <1 x i8> @llvm.experimental.vector.compress.v1i8(<1 x i8> %v, <1 x i1> %mask, <1 x i8> undef) 13 ret <1 x i8> %ret 14} 15 16define <1 x i8> @vector_compress_v1i8_passthru(<1 x i8> %passthru, <1 x i8> %v, <1 x i1> %mask) { 17; CHECK-LABEL: vector_compress_v1i8_passthru: 18; CHECK: # %bb.0: 19; CHECK-NEXT: vsetivli zero, 1, e8, mf8, tu, ma 20; CHECK-NEXT: vcompress.vm v8, v9, v0 21; CHECK-NEXT: ret 22 %ret = call <1 x i8> @llvm.experimental.vector.compress.v1i8(<1 x i8> %v, <1 x i1> %mask, <1 x i8> %passthru) 23 ret <1 x i8> %ret 24} 25 26define <2 x i8> @vector_compress_v2i8(<2 x i8> %v, <2 x i1> %mask) { 27; CHECK-LABEL: vector_compress_v2i8: 28; CHECK: # %bb.0: 29; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma 30; CHECK-NEXT: vcompress.vm v9, v8, v0 31; CHECK-NEXT: vmv1r.v v8, v9 32; CHECK-NEXT: ret 33 %ret = call <2 x i8> @llvm.experimental.vector.compress.v2i8(<2 x i8> %v, <2 x i1> %mask, <2 x i8> undef) 34 ret <2 x i8> %ret 35} 36 37define <2 x i8> @vector_compress_v2i8_passthru(<2 x i8> %passthru, <2 x i8> %v, <2 x i1> %mask) { 38; CHECK-LABEL: vector_compress_v2i8_passthru: 39; CHECK: # %bb.0: 40; CHECK-NEXT: vsetivli zero, 2, e8, mf8, tu, ma 41; CHECK-NEXT: vcompress.vm v8, v9, v0 42; CHECK-NEXT: ret 43 %ret = call <2 x i8> @llvm.experimental.vector.compress.v2i8(<2 x i8> %v, <2 x i1> %mask, <2 x i8> %passthru) 44 ret <2 x i8> %ret 45} 46 47define <4 x i8> @vector_compress_v4i8(<4 x i8> %v, <4 x i1> %mask) { 48; CHECK-LABEL: vector_compress_v4i8: 49; CHECK: # %bb.0: 50; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, ma 51; CHECK-NEXT: vcompress.vm v9, v8, v0 52; CHECK-NEXT: vmv1r.v v8, v9 53; CHECK-NEXT: ret 54 %ret = call <4 x i8> @llvm.experimental.vector.compress.v4i8(<4 x i8> %v, <4 x i1> %mask, <4 x i8> undef) 55 ret <4 x i8> %ret 56} 57 58define <4 x i8> @vector_compress_v4i8_passthru(<4 x i8> %passthru, <4 x i8> %v, <4 x i1> %mask) { 59; CHECK-LABEL: vector_compress_v4i8_passthru: 60; CHECK: # %bb.0: 61; CHECK-NEXT: vsetivli zero, 4, e8, mf4, tu, ma 62; CHECK-NEXT: vcompress.vm v8, v9, v0 63; CHECK-NEXT: ret 64 %ret = call <4 x i8> @llvm.experimental.vector.compress.v4i8(<4 x i8> %v, <4 x i1> %mask, <4 x i8> %passthru) 65 ret <4 x i8> %ret 66} 67 68define <8 x i8> @vector_compress_v8i8(<8 x i8> %v, <8 x i1> %mask) { 69; CHECK-LABEL: vector_compress_v8i8: 70; CHECK: # %bb.0: 71; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 72; CHECK-NEXT: vcompress.vm v9, v8, v0 73; CHECK-NEXT: vmv1r.v v8, v9 74; CHECK-NEXT: ret 75 %ret = call <8 x i8> @llvm.experimental.vector.compress.v8i8(<8 x i8> %v, <8 x i1> %mask, <8 x i8> undef) 76 ret <8 x i8> %ret 77} 78 79define <8 x i8> @vector_compress_v8i8_passthru(<8 x i8> %passthru, <8 x i8> %v, <8 x i1> %mask) { 80; CHECK-LABEL: vector_compress_v8i8_passthru: 81; CHECK: # %bb.0: 82; CHECK-NEXT: vsetivli zero, 8, e8, mf2, tu, ma 83; CHECK-NEXT: vcompress.vm v8, v9, v0 84; CHECK-NEXT: ret 85 %ret = call <8 x i8> @llvm.experimental.vector.compress.v8i8(<8 x i8> %v, <8 x i1> %mask, <8 x i8> %passthru) 86 ret <8 x i8> %ret 87} 88 89define <1 x i16> @vector_compress_v1i16(<1 x i16> %v, <1 x i1> %mask) { 90; CHECK-LABEL: vector_compress_v1i16: 91; CHECK: # %bb.0: 92; CHECK-NEXT: vsetivli zero, 1, e16, mf4, ta, ma 93; CHECK-NEXT: vcompress.vm v9, v8, v0 94; CHECK-NEXT: vmv1r.v v8, v9 95; CHECK-NEXT: ret 96 %ret = call <1 x i16> @llvm.experimental.vector.compress.v1i16(<1 x i16> %v, <1 x i1> %mask, <1 x i16> undef) 97 ret <1 x i16> %ret 98} 99 100define <1 x i16> @vector_compress_v1i16_passthru(<1 x i16> %passthru, <1 x i16> %v, <1 x i1> %mask) { 101; CHECK-LABEL: vector_compress_v1i16_passthru: 102; CHECK: # %bb.0: 103; CHECK-NEXT: vsetivli zero, 1, e16, mf4, tu, ma 104; CHECK-NEXT: vcompress.vm v8, v9, v0 105; CHECK-NEXT: ret 106 %ret = call <1 x i16> @llvm.experimental.vector.compress.v1i16(<1 x i16> %v, <1 x i1> %mask, <1 x i16> %passthru) 107 ret <1 x i16> %ret 108} 109 110define <2 x i16> @vector_compress_v2i16(<2 x i16> %v, <2 x i1> %mask) { 111; CHECK-LABEL: vector_compress_v2i16: 112; CHECK: # %bb.0: 113; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma 114; CHECK-NEXT: vcompress.vm v9, v8, v0 115; CHECK-NEXT: vmv1r.v v8, v9 116; CHECK-NEXT: ret 117 %ret = call <2 x i16> @llvm.experimental.vector.compress.v2i16(<2 x i16> %v, <2 x i1> %mask, <2 x i16> undef) 118 ret <2 x i16> %ret 119} 120 121define <2 x i16> @vector_compress_v2i16_passthru(<2 x i16> %passthru, <2 x i16> %v, <2 x i1> %mask) { 122; CHECK-LABEL: vector_compress_v2i16_passthru: 123; CHECK: # %bb.0: 124; CHECK-NEXT: vsetivli zero, 2, e16, mf4, tu, ma 125; CHECK-NEXT: vcompress.vm v8, v9, v0 126; CHECK-NEXT: ret 127 %ret = call <2 x i16> @llvm.experimental.vector.compress.v2i16(<2 x i16> %v, <2 x i1> %mask, <2 x i16> %passthru) 128 ret <2 x i16> %ret 129} 130 131define <4 x i16> @vector_compress_v4i16(<4 x i16> %v, <4 x i1> %mask) { 132; CHECK-LABEL: vector_compress_v4i16: 133; CHECK: # %bb.0: 134; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 135; CHECK-NEXT: vcompress.vm v9, v8, v0 136; CHECK-NEXT: vmv1r.v v8, v9 137; CHECK-NEXT: ret 138 %ret = call <4 x i16> @llvm.experimental.vector.compress.v4i16(<4 x i16> %v, <4 x i1> %mask, <4 x i16> undef) 139 ret <4 x i16> %ret 140} 141 142define <4 x i16> @vector_compress_v4i16_passthru(<4 x i16> %passthru, <4 x i16> %v, <4 x i1> %mask) { 143; CHECK-LABEL: vector_compress_v4i16_passthru: 144; CHECK: # %bb.0: 145; CHECK-NEXT: vsetivli zero, 4, e16, mf2, tu, ma 146; CHECK-NEXT: vcompress.vm v8, v9, v0 147; CHECK-NEXT: ret 148 %ret = call <4 x i16> @llvm.experimental.vector.compress.v4i16(<4 x i16> %v, <4 x i1> %mask, <4 x i16> %passthru) 149 ret <4 x i16> %ret 150} 151 152define <8 x i16> @vector_compress_v8i16(<8 x i16> %v, <8 x i1> %mask) { 153; CHECK-LABEL: vector_compress_v8i16: 154; CHECK: # %bb.0: 155; CHECK-NEXT: vsetivli zero, 8, e16, m1, ta, ma 156; CHECK-NEXT: vcompress.vm v9, v8, v0 157; CHECK-NEXT: vmv.v.v v8, v9 158; CHECK-NEXT: ret 159 %ret = call <8 x i16> @llvm.experimental.vector.compress.v8i16(<8 x i16> %v, <8 x i1> %mask, <8 x i16> undef) 160 ret <8 x i16> %ret 161} 162 163define <8 x i16> @vector_compress_v8i16_passthru(<8 x i16> %passthru, <8 x i16> %v, <8 x i1> %mask) { 164; CHECK-LABEL: vector_compress_v8i16_passthru: 165; CHECK: # %bb.0: 166; CHECK-NEXT: vsetivli zero, 8, e16, m1, tu, ma 167; CHECK-NEXT: vcompress.vm v8, v9, v0 168; CHECK-NEXT: ret 169 %ret = call <8 x i16> @llvm.experimental.vector.compress.v8i16(<8 x i16> %v, <8 x i1> %mask, <8 x i16> %passthru) 170 ret <8 x i16> %ret 171} 172 173define <1 x i32> @vector_compress_v1i32(<1 x i32> %v, <1 x i1> %mask) { 174; CHECK-LABEL: vector_compress_v1i32: 175; CHECK: # %bb.0: 176; CHECK-NEXT: vsetivli zero, 1, e32, mf2, ta, ma 177; CHECK-NEXT: vcompress.vm v9, v8, v0 178; CHECK-NEXT: vmv1r.v v8, v9 179; CHECK-NEXT: ret 180 %ret = call <1 x i32> @llvm.experimental.vector.compress.v1i32(<1 x i32> %v, <1 x i1> %mask, <1 x i32> undef) 181 ret <1 x i32> %ret 182} 183 184define <1 x i32> @vector_compress_v1i32_passthru(<1 x i32> %passthru, <1 x i32> %v, <1 x i1> %mask) { 185; CHECK-LABEL: vector_compress_v1i32_passthru: 186; CHECK: # %bb.0: 187; CHECK-NEXT: vsetivli zero, 1, e32, mf2, tu, ma 188; CHECK-NEXT: vcompress.vm v8, v9, v0 189; CHECK-NEXT: ret 190 %ret = call <1 x i32> @llvm.experimental.vector.compress.v1i32(<1 x i32> %v, <1 x i1> %mask, <1 x i32> %passthru) 191 ret <1 x i32> %ret 192} 193 194define <2 x i32> @vector_compress_v2i32(<2 x i32> %v, <2 x i1> %mask) { 195; CHECK-LABEL: vector_compress_v2i32: 196; CHECK: # %bb.0: 197; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 198; CHECK-NEXT: vcompress.vm v9, v8, v0 199; CHECK-NEXT: vmv1r.v v8, v9 200; CHECK-NEXT: ret 201 %ret = call <2 x i32> @llvm.experimental.vector.compress.v2i32(<2 x i32> %v, <2 x i1> %mask, <2 x i32> undef) 202 ret <2 x i32> %ret 203} 204 205define <2 x i32> @vector_compress_v2i32_passthru(<2 x i32> %passthru, <2 x i32> %v, <2 x i1> %mask) { 206; CHECK-LABEL: vector_compress_v2i32_passthru: 207; CHECK: # %bb.0: 208; CHECK-NEXT: vsetivli zero, 2, e32, mf2, tu, ma 209; CHECK-NEXT: vcompress.vm v8, v9, v0 210; CHECK-NEXT: ret 211 %ret = call <2 x i32> @llvm.experimental.vector.compress.v2i32(<2 x i32> %v, <2 x i1> %mask, <2 x i32> %passthru) 212 ret <2 x i32> %ret 213} 214 215define <4 x i32> @vector_compress_v4i32(<4 x i32> %v, <4 x i1> %mask) { 216; CHECK-LABEL: vector_compress_v4i32: 217; CHECK: # %bb.0: 218; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma 219; CHECK-NEXT: vcompress.vm v9, v8, v0 220; CHECK-NEXT: vmv.v.v v8, v9 221; CHECK-NEXT: ret 222 %ret = call <4 x i32> @llvm.experimental.vector.compress.v4i32(<4 x i32> %v, <4 x i1> %mask, <4 x i32> undef) 223 ret <4 x i32> %ret 224} 225 226define <4 x i32> @vector_compress_v4i32_passthru(<4 x i32> %passthru, <4 x i32> %v, <4 x i1> %mask) { 227; CHECK-LABEL: vector_compress_v4i32_passthru: 228; CHECK: # %bb.0: 229; CHECK-NEXT: vsetivli zero, 4, e32, m1, tu, ma 230; CHECK-NEXT: vcompress.vm v8, v9, v0 231; CHECK-NEXT: ret 232 %ret = call <4 x i32> @llvm.experimental.vector.compress.v4i32(<4 x i32> %v, <4 x i1> %mask, <4 x i32> %passthru) 233 ret <4 x i32> %ret 234} 235 236define <8 x i32> @vector_compress_v8i32(<8 x i32> %v, <8 x i1> %mask) { 237; CHECK-LABEL: vector_compress_v8i32: 238; CHECK: # %bb.0: 239; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma 240; CHECK-NEXT: vcompress.vm v10, v8, v0 241; CHECK-NEXT: vmv.v.v v8, v10 242; CHECK-NEXT: ret 243 %ret = call <8 x i32> @llvm.experimental.vector.compress.v8i32(<8 x i32> %v, <8 x i1> %mask, <8 x i32> undef) 244 ret <8 x i32> %ret 245} 246 247define <8 x i32> @vector_compress_v8i32_passthru(<8 x i32> %passthru, <8 x i32> %v, <8 x i1> %mask) { 248; CHECK-LABEL: vector_compress_v8i32_passthru: 249; CHECK: # %bb.0: 250; CHECK-NEXT: vsetivli zero, 8, e32, m2, tu, ma 251; CHECK-NEXT: vcompress.vm v8, v10, v0 252; CHECK-NEXT: ret 253 %ret = call <8 x i32> @llvm.experimental.vector.compress.v8i32(<8 x i32> %v, <8 x i1> %mask, <8 x i32> %passthru) 254 ret <8 x i32> %ret 255} 256 257define <1 x i64> @vector_compress_v1i64(<1 x i64> %v, <1 x i1> %mask) { 258; CHECK-LABEL: vector_compress_v1i64: 259; CHECK: # %bb.0: 260; CHECK-NEXT: vsetivli zero, 1, e64, m1, ta, ma 261; CHECK-NEXT: vcompress.vm v9, v8, v0 262; CHECK-NEXT: vmv.v.v v8, v9 263; CHECK-NEXT: ret 264 %ret = call <1 x i64> @llvm.experimental.vector.compress.v1i64(<1 x i64> %v, <1 x i1> %mask, <1 x i64> undef) 265 ret <1 x i64> %ret 266} 267 268define <1 x i64> @vector_compress_v1i64_passthru(<1 x i64> %passthru, <1 x i64> %v, <1 x i1> %mask) { 269; CHECK-LABEL: vector_compress_v1i64_passthru: 270; CHECK: # %bb.0: 271; CHECK-NEXT: vsetivli zero, 1, e64, m1, tu, ma 272; CHECK-NEXT: vcompress.vm v8, v9, v0 273; CHECK-NEXT: ret 274 %ret = call <1 x i64> @llvm.experimental.vector.compress.v1i64(<1 x i64> %v, <1 x i1> %mask, <1 x i64> %passthru) 275 ret <1 x i64> %ret 276} 277 278define <2 x i64> @vector_compress_v2i64(<2 x i64> %v, <2 x i1> %mask) { 279; CHECK-LABEL: vector_compress_v2i64: 280; CHECK: # %bb.0: 281; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma 282; CHECK-NEXT: vcompress.vm v9, v8, v0 283; CHECK-NEXT: vmv.v.v v8, v9 284; CHECK-NEXT: ret 285 %ret = call <2 x i64> @llvm.experimental.vector.compress.v2i64(<2 x i64> %v, <2 x i1> %mask, <2 x i64> undef) 286 ret <2 x i64> %ret 287} 288 289define <2 x i64> @vector_compress_v2i64_passthru(<2 x i64> %passthru, <2 x i64> %v, <2 x i1> %mask) { 290; CHECK-LABEL: vector_compress_v2i64_passthru: 291; CHECK: # %bb.0: 292; CHECK-NEXT: vsetivli zero, 2, e64, m1, tu, ma 293; CHECK-NEXT: vcompress.vm v8, v9, v0 294; CHECK-NEXT: ret 295 %ret = call <2 x i64> @llvm.experimental.vector.compress.v2i64(<2 x i64> %v, <2 x i1> %mask, <2 x i64> %passthru) 296 ret <2 x i64> %ret 297} 298 299define <4 x i64> @vector_compress_v4i64(<4 x i64> %v, <4 x i1> %mask) { 300; CHECK-LABEL: vector_compress_v4i64: 301; CHECK: # %bb.0: 302; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, ma 303; CHECK-NEXT: vcompress.vm v10, v8, v0 304; CHECK-NEXT: vmv.v.v v8, v10 305; CHECK-NEXT: ret 306 %ret = call <4 x i64> @llvm.experimental.vector.compress.v4i64(<4 x i64> %v, <4 x i1> %mask, <4 x i64> undef) 307 ret <4 x i64> %ret 308} 309 310define <4 x i64> @vector_compress_v4i64_passthru(<4 x i64> %passthru, <4 x i64> %v, <4 x i1> %mask) { 311; CHECK-LABEL: vector_compress_v4i64_passthru: 312; CHECK: # %bb.0: 313; CHECK-NEXT: vsetivli zero, 4, e64, m2, tu, ma 314; CHECK-NEXT: vcompress.vm v8, v10, v0 315; CHECK-NEXT: ret 316 %ret = call <4 x i64> @llvm.experimental.vector.compress.v4i64(<4 x i64> %v, <4 x i1> %mask, <4 x i64> %passthru) 317 ret <4 x i64> %ret 318} 319 320define <8 x i64> @vector_compress_v8i64(<8 x i64> %v, <8 x i1> %mask) { 321; CHECK-LABEL: vector_compress_v8i64: 322; CHECK: # %bb.0: 323; CHECK-NEXT: vsetivli zero, 8, e64, m4, ta, ma 324; CHECK-NEXT: vcompress.vm v12, v8, v0 325; CHECK-NEXT: vmv.v.v v8, v12 326; CHECK-NEXT: ret 327 %ret = call <8 x i64> @llvm.experimental.vector.compress.v8i64(<8 x i64> %v, <8 x i1> %mask, <8 x i64> undef) 328 ret <8 x i64> %ret 329} 330 331define <8 x i64> @vector_compress_v8i64_passthru(<8 x i64> %passthru, <8 x i64> %v, <8 x i1> %mask) { 332; CHECK-LABEL: vector_compress_v8i64_passthru: 333; CHECK: # %bb.0: 334; CHECK-NEXT: vsetivli zero, 8, e64, m4, tu, ma 335; CHECK-NEXT: vcompress.vm v8, v12, v0 336; CHECK-NEXT: ret 337 %ret = call <8 x i64> @llvm.experimental.vector.compress.v8i64(<8 x i64> %v, <8 x i1> %mask, <8 x i64> %passthru) 338 ret <8 x i64> %ret 339} 340