1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 2; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32 3; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64 4; RUN: llc -mtriple=riscv32 -mattr=+v,+zvbb -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK-ZVBB,CHECK-ZVBB-RV32 5; RUN: llc -mtriple=riscv64 -mattr=+v,+zvbb -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK-ZVBB,CHECK-ZVBB-RV64 6 7; ============================================================================== 8; i32 -> i64 9; ============================================================================== 10 11define <4 x i64> @vwsll_vv_v4i64_sext(<4 x i32> %a, <4 x i32> %b) { 12; CHECK-LABEL: vwsll_vv_v4i64_sext: 13; CHECK: # %bb.0: 14; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, ma 15; CHECK-NEXT: vzext.vf2 v10, v8 16; CHECK-NEXT: vsext.vf2 v12, v9 17; CHECK-NEXT: vsll.vv v8, v10, v12 18; CHECK-NEXT: ret 19; 20; CHECK-ZVBB-LABEL: vwsll_vv_v4i64_sext: 21; CHECK-ZVBB: # %bb.0: 22; CHECK-ZVBB-NEXT: vsetivli zero, 4, e32, m1, ta, ma 23; CHECK-ZVBB-NEXT: vwsll.vv v10, v8, v9 24; CHECK-ZVBB-NEXT: vmv2r.v v8, v10 25; CHECK-ZVBB-NEXT: ret 26 %x = zext <4 x i32> %a to <4 x i64> 27 %y = sext <4 x i32> %b to <4 x i64> 28 %z = shl <4 x i64> %x, %y 29 ret <4 x i64> %z 30} 31 32define <4 x i64> @vwsll_vv_v4i64_zext(<4 x i32> %a, <4 x i32> %b) { 33; CHECK-LABEL: vwsll_vv_v4i64_zext: 34; CHECK: # %bb.0: 35; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, ma 36; CHECK-NEXT: vzext.vf2 v10, v8 37; CHECK-NEXT: vzext.vf2 v12, v9 38; CHECK-NEXT: vsll.vv v8, v10, v12 39; CHECK-NEXT: ret 40; 41; CHECK-ZVBB-LABEL: vwsll_vv_v4i64_zext: 42; CHECK-ZVBB: # %bb.0: 43; CHECK-ZVBB-NEXT: vsetivli zero, 4, e32, m1, ta, ma 44; CHECK-ZVBB-NEXT: vwsll.vv v10, v8, v9 45; CHECK-ZVBB-NEXT: vmv2r.v v8, v10 46; CHECK-ZVBB-NEXT: ret 47 %x = zext <4 x i32> %a to <4 x i64> 48 %y = zext <4 x i32> %b to <4 x i64> 49 %z = shl <4 x i64> %x, %y 50 ret <4 x i64> %z 51} 52 53define <4 x i64> @vwsll_vx_i64_v4i64(<4 x i32> %a, i64 %b) { 54; CHECK-LABEL: vwsll_vx_i64_v4i64: 55; CHECK: # %bb.0: 56; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, ma 57; CHECK-NEXT: vzext.vf2 v10, v8 58; CHECK-NEXT: vsll.vx v8, v10, a0 59; CHECK-NEXT: ret 60; 61; CHECK-ZVBB-LABEL: vwsll_vx_i64_v4i64: 62; CHECK-ZVBB: # %bb.0: 63; CHECK-ZVBB-NEXT: vsetivli zero, 4, e32, m1, ta, ma 64; CHECK-ZVBB-NEXT: vwsll.vx v10, v8, a0 65; CHECK-ZVBB-NEXT: vmv2r.v v8, v10 66; CHECK-ZVBB-NEXT: ret 67 %head = insertelement <4 x i64> poison, i64 %b, i32 0 68 %splat = shufflevector <4 x i64> %head, <4 x i64> poison, <4 x i32> zeroinitializer 69 %x = zext <4 x i32> %a to <4 x i64> 70 %z = shl <4 x i64> %x, %splat 71 ret <4 x i64> %z 72} 73 74define <4 x i64> @vwsll_vx_i32_v4i64_sext(<4 x i32> %a, i32 %b) { 75; CHECK-LABEL: vwsll_vx_i32_v4i64_sext: 76; CHECK: # %bb.0: 77; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma 78; CHECK-NEXT: vmv.v.x v9, a0 79; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma 80; CHECK-NEXT: vzext.vf2 v10, v8 81; CHECK-NEXT: vsext.vf2 v12, v9 82; CHECK-NEXT: vsll.vv v8, v10, v12 83; CHECK-NEXT: ret 84; 85; CHECK-ZVBB-LABEL: vwsll_vx_i32_v4i64_sext: 86; CHECK-ZVBB: # %bb.0: 87; CHECK-ZVBB-NEXT: vsetivli zero, 4, e32, m1, ta, ma 88; CHECK-ZVBB-NEXT: vmv.v.x v9, a0 89; CHECK-ZVBB-NEXT: vwsll.vv v10, v8, v9 90; CHECK-ZVBB-NEXT: vmv2r.v v8, v10 91; CHECK-ZVBB-NEXT: ret 92 %head = insertelement <4 x i32> poison, i32 %b, i32 0 93 %splat = shufflevector <4 x i32> %head, <4 x i32> poison, <4 x i32> zeroinitializer 94 %x = zext <4 x i32> %a to <4 x i64> 95 %y = sext <4 x i32> %splat to <4 x i64> 96 %z = shl <4 x i64> %x, %y 97 ret <4 x i64> %z 98} 99 100define <4 x i64> @vwsll_vx_i32_v4i64_zext(<4 x i32> %a, i32 %b) { 101; CHECK-LABEL: vwsll_vx_i32_v4i64_zext: 102; CHECK: # %bb.0: 103; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma 104; CHECK-NEXT: vmv.v.x v9, a0 105; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma 106; CHECK-NEXT: vzext.vf2 v10, v8 107; CHECK-NEXT: vzext.vf2 v12, v9 108; CHECK-NEXT: vsll.vv v8, v10, v12 109; CHECK-NEXT: ret 110; 111; CHECK-ZVBB-LABEL: vwsll_vx_i32_v4i64_zext: 112; CHECK-ZVBB: # %bb.0: 113; CHECK-ZVBB-NEXT: vsetivli zero, 4, e32, m1, ta, ma 114; CHECK-ZVBB-NEXT: vwsll.vx v10, v8, a0 115; CHECK-ZVBB-NEXT: vmv2r.v v8, v10 116; CHECK-ZVBB-NEXT: ret 117 %head = insertelement <4 x i32> poison, i32 %b, i32 0 118 %splat = shufflevector <4 x i32> %head, <4 x i32> poison, <4 x i32> zeroinitializer 119 %x = zext <4 x i32> %a to <4 x i64> 120 %y = zext <4 x i32> %splat to <4 x i64> 121 %z = shl <4 x i64> %x, %y 122 ret <4 x i64> %z 123} 124 125define <4 x i64> @vwsll_vx_i16_v4i64_sext(<4 x i32> %a, i16 %b) { 126; CHECK-LABEL: vwsll_vx_i16_v4i64_sext: 127; CHECK: # %bb.0: 128; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 129; CHECK-NEXT: vmv.v.x v9, a0 130; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma 131; CHECK-NEXT: vzext.vf2 v10, v8 132; CHECK-NEXT: vsext.vf4 v12, v9 133; CHECK-NEXT: vsll.vv v8, v10, v12 134; CHECK-NEXT: ret 135; 136; CHECK-ZVBB-LABEL: vwsll_vx_i16_v4i64_sext: 137; CHECK-ZVBB: # %bb.0: 138; CHECK-ZVBB-NEXT: vsetivli zero, 4, e32, m1, ta, ma 139; CHECK-ZVBB-NEXT: vwsll.vx v10, v8, a0 140; CHECK-ZVBB-NEXT: vmv2r.v v8, v10 141; CHECK-ZVBB-NEXT: ret 142 %head = insertelement <4 x i16> poison, i16 %b, i32 0 143 %splat = shufflevector <4 x i16> %head, <4 x i16> poison, <4 x i32> zeroinitializer 144 %x = zext <4 x i32> %a to <4 x i64> 145 %y = sext <4 x i16> %splat to <4 x i64> 146 %z = shl <4 x i64> %x, %y 147 ret <4 x i64> %z 148} 149 150define <4 x i64> @vwsll_vx_i16_v4i64_zext(<4 x i32> %a, i16 %b) { 151; CHECK-LABEL: vwsll_vx_i16_v4i64_zext: 152; CHECK: # %bb.0: 153; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 154; CHECK-NEXT: vmv.v.x v9, a0 155; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma 156; CHECK-NEXT: vzext.vf2 v10, v8 157; CHECK-NEXT: vzext.vf4 v12, v9 158; CHECK-NEXT: vsll.vv v8, v10, v12 159; CHECK-NEXT: ret 160; 161; CHECK-ZVBB-LABEL: vwsll_vx_i16_v4i64_zext: 162; CHECK-ZVBB: # %bb.0: 163; CHECK-ZVBB-NEXT: vsetivli zero, 4, e32, m1, ta, ma 164; CHECK-ZVBB-NEXT: vwsll.vx v10, v8, a0 165; CHECK-ZVBB-NEXT: vmv2r.v v8, v10 166; CHECK-ZVBB-NEXT: ret 167 %head = insertelement <4 x i16> poison, i16 %b, i32 0 168 %splat = shufflevector <4 x i16> %head, <4 x i16> poison, <4 x i32> zeroinitializer 169 %x = zext <4 x i32> %a to <4 x i64> 170 %y = zext <4 x i16> %splat to <4 x i64> 171 %z = shl <4 x i64> %x, %y 172 ret <4 x i64> %z 173} 174 175define <4 x i64> @vwsll_vx_i8_v4i64_sext(<4 x i32> %a, i8 %b) { 176; CHECK-LABEL: vwsll_vx_i8_v4i64_sext: 177; CHECK: # %bb.0: 178; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, ma 179; CHECK-NEXT: vmv.v.x v9, a0 180; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma 181; CHECK-NEXT: vzext.vf2 v10, v8 182; CHECK-NEXT: vsext.vf8 v12, v9 183; CHECK-NEXT: vsll.vv v8, v10, v12 184; CHECK-NEXT: ret 185; 186; CHECK-ZVBB-LABEL: vwsll_vx_i8_v4i64_sext: 187; CHECK-ZVBB: # %bb.0: 188; CHECK-ZVBB-NEXT: vsetivli zero, 4, e32, m1, ta, ma 189; CHECK-ZVBB-NEXT: vwsll.vx v10, v8, a0 190; CHECK-ZVBB-NEXT: vmv2r.v v8, v10 191; CHECK-ZVBB-NEXT: ret 192 %head = insertelement <4 x i8> poison, i8 %b, i32 0 193 %splat = shufflevector <4 x i8> %head, <4 x i8> poison, <4 x i32> zeroinitializer 194 %x = zext <4 x i32> %a to <4 x i64> 195 %y = sext <4 x i8> %splat to <4 x i64> 196 %z = shl <4 x i64> %x, %y 197 ret <4 x i64> %z 198} 199 200define <4 x i64> @vwsll_vx_i8_v4i64_zext(<4 x i32> %a, i8 %b) { 201; CHECK-LABEL: vwsll_vx_i8_v4i64_zext: 202; CHECK: # %bb.0: 203; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, ma 204; CHECK-NEXT: vmv.v.x v9, a0 205; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma 206; CHECK-NEXT: vzext.vf2 v10, v8 207; CHECK-NEXT: vzext.vf8 v12, v9 208; CHECK-NEXT: vsll.vv v8, v10, v12 209; CHECK-NEXT: ret 210; 211; CHECK-ZVBB-LABEL: vwsll_vx_i8_v4i64_zext: 212; CHECK-ZVBB: # %bb.0: 213; CHECK-ZVBB-NEXT: vsetivli zero, 4, e32, m1, ta, ma 214; CHECK-ZVBB-NEXT: vwsll.vx v10, v8, a0 215; CHECK-ZVBB-NEXT: vmv2r.v v8, v10 216; CHECK-ZVBB-NEXT: ret 217 %head = insertelement <4 x i8> poison, i8 %b, i32 0 218 %splat = shufflevector <4 x i8> %head, <4 x i8> poison, <4 x i32> zeroinitializer 219 %x = zext <4 x i32> %a to <4 x i64> 220 %y = zext <4 x i8> %splat to <4 x i64> 221 %z = shl <4 x i64> %x, %y 222 ret <4 x i64> %z 223} 224 225define <4 x i64> @vwsll_vi_v4i64(<4 x i32> %a) { 226; CHECK-LABEL: vwsll_vi_v4i64: 227; CHECK: # %bb.0: 228; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, ma 229; CHECK-NEXT: vzext.vf2 v10, v8 230; CHECK-NEXT: vsll.vi v8, v10, 2 231; CHECK-NEXT: ret 232; 233; CHECK-ZVBB-LABEL: vwsll_vi_v4i64: 234; CHECK-ZVBB: # %bb.0: 235; CHECK-ZVBB-NEXT: vsetivli zero, 4, e32, m1, ta, ma 236; CHECK-ZVBB-NEXT: vwsll.vi v10, v8, 2 237; CHECK-ZVBB-NEXT: vmv2r.v v8, v10 238; CHECK-ZVBB-NEXT: ret 239 %x = zext <4 x i32> %a to <4 x i64> 240 %z = shl <4 x i64> %x, splat (i64 2) 241 ret <4 x i64> %z 242} 243 244; ============================================================================== 245; i16 -> i32 246; ============================================================================== 247 248define <8 x i32> @vwsll_vv_v8i32_sext(<8 x i16> %a, <8 x i16> %b) { 249; CHECK-LABEL: vwsll_vv_v8i32_sext: 250; CHECK: # %bb.0: 251; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma 252; CHECK-NEXT: vzext.vf2 v10, v8 253; CHECK-NEXT: vsext.vf2 v12, v9 254; CHECK-NEXT: vsll.vv v8, v10, v12 255; CHECK-NEXT: ret 256; 257; CHECK-ZVBB-LABEL: vwsll_vv_v8i32_sext: 258; CHECK-ZVBB: # %bb.0: 259; CHECK-ZVBB-NEXT: vsetivli zero, 8, e16, m1, ta, ma 260; CHECK-ZVBB-NEXT: vwsll.vv v10, v8, v9 261; CHECK-ZVBB-NEXT: vmv2r.v v8, v10 262; CHECK-ZVBB-NEXT: ret 263 %x = zext <8 x i16> %a to <8 x i32> 264 %y = sext <8 x i16> %b to <8 x i32> 265 %z = shl <8 x i32> %x, %y 266 ret <8 x i32> %z 267} 268 269define <8 x i32> @vwsll_vv_v8i32_zext(<8 x i16> %a, <8 x i16> %b) { 270; CHECK-LABEL: vwsll_vv_v8i32_zext: 271; CHECK: # %bb.0: 272; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma 273; CHECK-NEXT: vzext.vf2 v10, v8 274; CHECK-NEXT: vzext.vf2 v12, v9 275; CHECK-NEXT: vsll.vv v8, v10, v12 276; CHECK-NEXT: ret 277; 278; CHECK-ZVBB-LABEL: vwsll_vv_v8i32_zext: 279; CHECK-ZVBB: # %bb.0: 280; CHECK-ZVBB-NEXT: vsetivli zero, 8, e16, m1, ta, ma 281; CHECK-ZVBB-NEXT: vwsll.vv v10, v8, v9 282; CHECK-ZVBB-NEXT: vmv2r.v v8, v10 283; CHECK-ZVBB-NEXT: ret 284 %x = zext <8 x i16> %a to <8 x i32> 285 %y = zext <8 x i16> %b to <8 x i32> 286 %z = shl <8 x i32> %x, %y 287 ret <8 x i32> %z 288} 289 290define <8 x i32> @vwsll_vx_i64_v8i32(<8 x i16> %a, i64 %b) { 291; CHECK-LABEL: vwsll_vx_i64_v8i32: 292; CHECK: # %bb.0: 293; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma 294; CHECK-NEXT: vzext.vf2 v10, v8 295; CHECK-NEXT: vsll.vx v8, v10, a0 296; CHECK-NEXT: ret 297; 298; CHECK-ZVBB-LABEL: vwsll_vx_i64_v8i32: 299; CHECK-ZVBB: # %bb.0: 300; CHECK-ZVBB-NEXT: vsetivli zero, 8, e16, m1, ta, ma 301; CHECK-ZVBB-NEXT: vwsll.vx v10, v8, a0 302; CHECK-ZVBB-NEXT: vmv2r.v v8, v10 303; CHECK-ZVBB-NEXT: ret 304 %head = insertelement <8 x i64> poison, i64 %b, i32 0 305 %splat = shufflevector <8 x i64> %head, <8 x i64> poison, <8 x i32> zeroinitializer 306 %x = zext <8 x i16> %a to <8 x i32> 307 %y = trunc <8 x i64> %splat to <8 x i32> 308 %z = shl <8 x i32> %x, %y 309 ret <8 x i32> %z 310} 311 312define <8 x i32> @vwsll_vx_i32_v8i32(<8 x i16> %a, i32 %b) { 313; CHECK-LABEL: vwsll_vx_i32_v8i32: 314; CHECK: # %bb.0: 315; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma 316; CHECK-NEXT: vzext.vf2 v10, v8 317; CHECK-NEXT: vsll.vx v8, v10, a0 318; CHECK-NEXT: ret 319; 320; CHECK-ZVBB-LABEL: vwsll_vx_i32_v8i32: 321; CHECK-ZVBB: # %bb.0: 322; CHECK-ZVBB-NEXT: vsetivli zero, 8, e16, m1, ta, ma 323; CHECK-ZVBB-NEXT: vwsll.vx v10, v8, a0 324; CHECK-ZVBB-NEXT: vmv2r.v v8, v10 325; CHECK-ZVBB-NEXT: ret 326 %head = insertelement <8 x i32> poison, i32 %b, i32 0 327 %splat = shufflevector <8 x i32> %head, <8 x i32> poison, <8 x i32> zeroinitializer 328 %x = zext <8 x i16> %a to <8 x i32> 329 %z = shl <8 x i32> %x, %splat 330 ret <8 x i32> %z 331} 332 333define <8 x i32> @vwsll_vx_i16_v8i32_sext(<8 x i16> %a, i16 %b) { 334; CHECK-LABEL: vwsll_vx_i16_v8i32_sext: 335; CHECK: # %bb.0: 336; CHECK-NEXT: vsetivli zero, 8, e16, m1, ta, ma 337; CHECK-NEXT: vmv.v.x v9, a0 338; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma 339; CHECK-NEXT: vzext.vf2 v10, v8 340; CHECK-NEXT: vsext.vf2 v12, v9 341; CHECK-NEXT: vsll.vv v8, v10, v12 342; CHECK-NEXT: ret 343; 344; CHECK-ZVBB-LABEL: vwsll_vx_i16_v8i32_sext: 345; CHECK-ZVBB: # %bb.0: 346; CHECK-ZVBB-NEXT: vsetivli zero, 8, e16, m1, ta, ma 347; CHECK-ZVBB-NEXT: vmv.v.x v9, a0 348; CHECK-ZVBB-NEXT: vwsll.vv v10, v8, v9 349; CHECK-ZVBB-NEXT: vmv2r.v v8, v10 350; CHECK-ZVBB-NEXT: ret 351 %head = insertelement <8 x i16> poison, i16 %b, i32 0 352 %splat = shufflevector <8 x i16> %head, <8 x i16> poison, <8 x i32> zeroinitializer 353 %x = zext <8 x i16> %a to <8 x i32> 354 %y = sext <8 x i16> %splat to <8 x i32> 355 %z = shl <8 x i32> %x, %y 356 ret <8 x i32> %z 357} 358 359define <8 x i32> @vwsll_vx_i16_v8i32_zext(<8 x i16> %a, i16 %b) { 360; CHECK-LABEL: vwsll_vx_i16_v8i32_zext: 361; CHECK: # %bb.0: 362; CHECK-NEXT: vsetivli zero, 8, e16, m1, ta, ma 363; CHECK-NEXT: vmv.v.x v9, a0 364; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma 365; CHECK-NEXT: vzext.vf2 v10, v8 366; CHECK-NEXT: vzext.vf2 v12, v9 367; CHECK-NEXT: vsll.vv v8, v10, v12 368; CHECK-NEXT: ret 369; 370; CHECK-ZVBB-LABEL: vwsll_vx_i16_v8i32_zext: 371; CHECK-ZVBB: # %bb.0: 372; CHECK-ZVBB-NEXT: vsetivli zero, 8, e16, m1, ta, ma 373; CHECK-ZVBB-NEXT: vwsll.vx v10, v8, a0 374; CHECK-ZVBB-NEXT: vmv2r.v v8, v10 375; CHECK-ZVBB-NEXT: ret 376 %head = insertelement <8 x i16> poison, i16 %b, i32 0 377 %splat = shufflevector <8 x i16> %head, <8 x i16> poison, <8 x i32> zeroinitializer 378 %x = zext <8 x i16> %a to <8 x i32> 379 %y = zext <8 x i16> %splat to <8 x i32> 380 %z = shl <8 x i32> %x, %y 381 ret <8 x i32> %z 382} 383 384define <8 x i32> @vwsll_vx_i8_v8i32_sext(<8 x i16> %a, i8 %b) { 385; CHECK-LABEL: vwsll_vx_i8_v8i32_sext: 386; CHECK: # %bb.0: 387; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 388; CHECK-NEXT: vmv.v.x v9, a0 389; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma 390; CHECK-NEXT: vzext.vf2 v10, v8 391; CHECK-NEXT: vsext.vf4 v12, v9 392; CHECK-NEXT: vsll.vv v8, v10, v12 393; CHECK-NEXT: ret 394; 395; CHECK-ZVBB-LABEL: vwsll_vx_i8_v8i32_sext: 396; CHECK-ZVBB: # %bb.0: 397; CHECK-ZVBB-NEXT: vsetivli zero, 8, e16, m1, ta, ma 398; CHECK-ZVBB-NEXT: vwsll.vx v10, v8, a0 399; CHECK-ZVBB-NEXT: vmv2r.v v8, v10 400; CHECK-ZVBB-NEXT: ret 401 %head = insertelement <8 x i8> poison, i8 %b, i32 0 402 %splat = shufflevector <8 x i8> %head, <8 x i8> poison, <8 x i32> zeroinitializer 403 %x = zext <8 x i16> %a to <8 x i32> 404 %y = sext <8 x i8> %splat to <8 x i32> 405 %z = shl <8 x i32> %x, %y 406 ret <8 x i32> %z 407} 408 409define <8 x i32> @vwsll_vx_i8_v8i32_zext(<8 x i16> %a, i8 %b) { 410; CHECK-LABEL: vwsll_vx_i8_v8i32_zext: 411; CHECK: # %bb.0: 412; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 413; CHECK-NEXT: vmv.v.x v9, a0 414; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma 415; CHECK-NEXT: vzext.vf2 v10, v8 416; CHECK-NEXT: vzext.vf4 v12, v9 417; CHECK-NEXT: vsll.vv v8, v10, v12 418; CHECK-NEXT: ret 419; 420; CHECK-ZVBB-LABEL: vwsll_vx_i8_v8i32_zext: 421; CHECK-ZVBB: # %bb.0: 422; CHECK-ZVBB-NEXT: vsetivli zero, 8, e16, m1, ta, ma 423; CHECK-ZVBB-NEXT: vwsll.vx v10, v8, a0 424; CHECK-ZVBB-NEXT: vmv2r.v v8, v10 425; CHECK-ZVBB-NEXT: ret 426 %head = insertelement <8 x i8> poison, i8 %b, i32 0 427 %splat = shufflevector <8 x i8> %head, <8 x i8> poison, <8 x i32> zeroinitializer 428 %x = zext <8 x i16> %a to <8 x i32> 429 %y = zext <8 x i8> %splat to <8 x i32> 430 %z = shl <8 x i32> %x, %y 431 ret <8 x i32> %z 432} 433 434define <8 x i32> @vwsll_vi_v8i32(<8 x i16> %a) { 435; CHECK-LABEL: vwsll_vi_v8i32: 436; CHECK: # %bb.0: 437; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma 438; CHECK-NEXT: vzext.vf2 v10, v8 439; CHECK-NEXT: vsll.vi v8, v10, 2 440; CHECK-NEXT: ret 441; 442; CHECK-ZVBB-LABEL: vwsll_vi_v8i32: 443; CHECK-ZVBB: # %bb.0: 444; CHECK-ZVBB-NEXT: vsetivli zero, 8, e16, m1, ta, ma 445; CHECK-ZVBB-NEXT: vwsll.vi v10, v8, 2 446; CHECK-ZVBB-NEXT: vmv2r.v v8, v10 447; CHECK-ZVBB-NEXT: ret 448 %x = zext <8 x i16> %a to <8 x i32> 449 %z = shl <8 x i32> %x, splat (i32 2) 450 ret <8 x i32> %z 451} 452 453; ============================================================================== 454; i8 -> i16 455; ============================================================================== 456 457define <16 x i16> @vwsll_vv_v16i16_sext(<16 x i8> %a, <16 x i8> %b) { 458; CHECK-LABEL: vwsll_vv_v16i16_sext: 459; CHECK: # %bb.0: 460; CHECK-NEXT: vsetivli zero, 16, e16, m2, ta, ma 461; CHECK-NEXT: vzext.vf2 v10, v8 462; CHECK-NEXT: vsext.vf2 v12, v9 463; CHECK-NEXT: vsll.vv v8, v10, v12 464; CHECK-NEXT: ret 465; 466; CHECK-ZVBB-LABEL: vwsll_vv_v16i16_sext: 467; CHECK-ZVBB: # %bb.0: 468; CHECK-ZVBB-NEXT: vsetivli zero, 16, e8, m1, ta, ma 469; CHECK-ZVBB-NEXT: vwsll.vv v10, v8, v9 470; CHECK-ZVBB-NEXT: vmv2r.v v8, v10 471; CHECK-ZVBB-NEXT: ret 472 %x = zext <16 x i8> %a to <16 x i16> 473 %y = sext <16 x i8> %b to <16 x i16> 474 %z = shl <16 x i16> %x, %y 475 ret <16 x i16> %z 476} 477 478define <16 x i16> @vwsll_vv_v16i16_zext(<16 x i8> %a, <16 x i8> %b) { 479; CHECK-LABEL: vwsll_vv_v16i16_zext: 480; CHECK: # %bb.0: 481; CHECK-NEXT: vsetivli zero, 16, e16, m2, ta, ma 482; CHECK-NEXT: vzext.vf2 v10, v8 483; CHECK-NEXT: vzext.vf2 v12, v9 484; CHECK-NEXT: vsll.vv v8, v10, v12 485; CHECK-NEXT: ret 486; 487; CHECK-ZVBB-LABEL: vwsll_vv_v16i16_zext: 488; CHECK-ZVBB: # %bb.0: 489; CHECK-ZVBB-NEXT: vsetivli zero, 16, e8, m1, ta, ma 490; CHECK-ZVBB-NEXT: vwsll.vv v10, v8, v9 491; CHECK-ZVBB-NEXT: vmv2r.v v8, v10 492; CHECK-ZVBB-NEXT: ret 493 %x = zext <16 x i8> %a to <16 x i16> 494 %y = zext <16 x i8> %b to <16 x i16> 495 %z = shl <16 x i16> %x, %y 496 ret <16 x i16> %z 497} 498 499define <16 x i16> @vwsll_vx_i64_v16i16(<16 x i8> %a, i64 %b) { 500; RV32-LABEL: vwsll_vx_i64_v16i16: 501; RV32: # %bb.0: 502; RV32-NEXT: vsetivli zero, 8, e64, m4, ta, ma 503; RV32-NEXT: vmv.v.x v16, a0 504; RV32-NEXT: vsetivli zero, 16, e64, m8, ta, ma 505; RV32-NEXT: vrgather.vi v24, v16, 0 506; RV32-NEXT: vsetvli zero, zero, e16, m2, ta, ma 507; RV32-NEXT: vzext.vf2 v10, v8 508; RV32-NEXT: vsetvli zero, zero, e32, m4, ta, ma 509; RV32-NEXT: vnsrl.wi v12, v24, 0 510; RV32-NEXT: vsetvli zero, zero, e16, m2, ta, ma 511; RV32-NEXT: vnsrl.wi v8, v12, 0 512; RV32-NEXT: vsll.vv v8, v10, v8 513; RV32-NEXT: ret 514; 515; RV64-LABEL: vwsll_vx_i64_v16i16: 516; RV64: # %bb.0: 517; RV64-NEXT: vsetivli zero, 16, e64, m8, ta, ma 518; RV64-NEXT: vmv.v.x v16, a0 519; RV64-NEXT: vsetvli zero, zero, e16, m2, ta, ma 520; RV64-NEXT: vzext.vf2 v10, v8 521; RV64-NEXT: vsetvli zero, zero, e32, m4, ta, ma 522; RV64-NEXT: vnsrl.wi v12, v16, 0 523; RV64-NEXT: vsetvli zero, zero, e16, m2, ta, ma 524; RV64-NEXT: vnsrl.wi v8, v12, 0 525; RV64-NEXT: vsll.vv v8, v10, v8 526; RV64-NEXT: ret 527; 528; CHECK-ZVBB-RV32-LABEL: vwsll_vx_i64_v16i16: 529; CHECK-ZVBB-RV32: # %bb.0: 530; CHECK-ZVBB-RV32-NEXT: vsetivli zero, 8, e64, m4, ta, ma 531; CHECK-ZVBB-RV32-NEXT: vmv.v.x v16, a0 532; CHECK-ZVBB-RV32-NEXT: vsetivli zero, 16, e64, m8, ta, ma 533; CHECK-ZVBB-RV32-NEXT: vrgather.vi v24, v16, 0 534; CHECK-ZVBB-RV32-NEXT: vsetvli zero, zero, e16, m2, ta, ma 535; CHECK-ZVBB-RV32-NEXT: vzext.vf2 v10, v8 536; CHECK-ZVBB-RV32-NEXT: vsetvli zero, zero, e32, m4, ta, ma 537; CHECK-ZVBB-RV32-NEXT: vnsrl.wi v12, v24, 0 538; CHECK-ZVBB-RV32-NEXT: vsetvli zero, zero, e16, m2, ta, ma 539; CHECK-ZVBB-RV32-NEXT: vnsrl.wi v8, v12, 0 540; CHECK-ZVBB-RV32-NEXT: vsll.vv v8, v10, v8 541; CHECK-ZVBB-RV32-NEXT: ret 542; 543; CHECK-ZVBB-RV64-LABEL: vwsll_vx_i64_v16i16: 544; CHECK-ZVBB-RV64: # %bb.0: 545; CHECK-ZVBB-RV64-NEXT: vsetivli zero, 16, e8, m1, ta, ma 546; CHECK-ZVBB-RV64-NEXT: vwsll.vx v10, v8, a0 547; CHECK-ZVBB-RV64-NEXT: vmv2r.v v8, v10 548; CHECK-ZVBB-RV64-NEXT: ret 549 %head = insertelement <8 x i64> poison, i64 %b, i32 0 550 %splat = shufflevector <8 x i64> %head, <8 x i64> poison, <16 x i32> zeroinitializer 551 %x = zext <16 x i8> %a to <16 x i16> 552 %y = trunc <16 x i64> %splat to <16 x i16> 553 %z = shl <16 x i16> %x, %y 554 ret <16 x i16> %z 555} 556 557define <16 x i16> @vwsll_vx_i32_v16i16(<16 x i8> %a, i32 %b) { 558; CHECK-LABEL: vwsll_vx_i32_v16i16: 559; CHECK: # %bb.0: 560; CHECK-NEXT: vsetivli zero, 16, e32, m4, ta, ma 561; CHECK-NEXT: vmv.v.x v12, a0 562; CHECK-NEXT: vsetvli zero, zero, e16, m2, ta, ma 563; CHECK-NEXT: vzext.vf2 v10, v8 564; CHECK-NEXT: vnsrl.wi v8, v12, 0 565; CHECK-NEXT: vsll.vv v8, v10, v8 566; CHECK-NEXT: ret 567; 568; CHECK-ZVBB-LABEL: vwsll_vx_i32_v16i16: 569; CHECK-ZVBB: # %bb.0: 570; CHECK-ZVBB-NEXT: vsetivli zero, 16, e8, m1, ta, ma 571; CHECK-ZVBB-NEXT: vwsll.vx v10, v8, a0 572; CHECK-ZVBB-NEXT: vmv2r.v v8, v10 573; CHECK-ZVBB-NEXT: ret 574 %head = insertelement <16 x i32> poison, i32 %b, i32 0 575 %splat = shufflevector <16 x i32> %head, <16 x i32> poison, <16 x i32> zeroinitializer 576 %x = zext <16 x i8> %a to <16 x i16> 577 %y = trunc <16 x i32> %splat to <16 x i16> 578 %z = shl <16 x i16> %x, %y 579 ret <16 x i16> %z 580} 581 582define <16 x i16> @vwsll_vx_i16_v16i16(<16 x i8> %a, i16 %b) { 583; CHECK-LABEL: vwsll_vx_i16_v16i16: 584; CHECK: # %bb.0: 585; CHECK-NEXT: vsetivli zero, 16, e16, m2, ta, ma 586; CHECK-NEXT: vzext.vf2 v10, v8 587; CHECK-NEXT: vsll.vx v8, v10, a0 588; CHECK-NEXT: ret 589; 590; CHECK-ZVBB-LABEL: vwsll_vx_i16_v16i16: 591; CHECK-ZVBB: # %bb.0: 592; CHECK-ZVBB-NEXT: vsetivli zero, 16, e8, m1, ta, ma 593; CHECK-ZVBB-NEXT: vwsll.vx v10, v8, a0 594; CHECK-ZVBB-NEXT: vmv2r.v v8, v10 595; CHECK-ZVBB-NEXT: ret 596 %head = insertelement <16 x i16> poison, i16 %b, i32 0 597 %splat = shufflevector <16 x i16> %head, <16 x i16> poison, <16 x i32> zeroinitializer 598 %x = zext <16 x i8> %a to <16 x i16> 599 %z = shl <16 x i16> %x, %splat 600 ret <16 x i16> %z 601} 602 603define <16 x i16> @vwsll_vx_i8_v16i16_sext(<16 x i8> %a, i8 %b) { 604; CHECK-LABEL: vwsll_vx_i8_v16i16_sext: 605; CHECK: # %bb.0: 606; CHECK-NEXT: vsetivli zero, 16, e8, m1, ta, ma 607; CHECK-NEXT: vmv.v.x v9, a0 608; CHECK-NEXT: vsetvli zero, zero, e16, m2, ta, ma 609; CHECK-NEXT: vzext.vf2 v10, v8 610; CHECK-NEXT: vsext.vf2 v12, v9 611; CHECK-NEXT: vsll.vv v8, v10, v12 612; CHECK-NEXT: ret 613; 614; CHECK-ZVBB-LABEL: vwsll_vx_i8_v16i16_sext: 615; CHECK-ZVBB: # %bb.0: 616; CHECK-ZVBB-NEXT: vsetivli zero, 16, e8, m1, ta, ma 617; CHECK-ZVBB-NEXT: vmv.v.x v9, a0 618; CHECK-ZVBB-NEXT: vwsll.vv v10, v8, v9 619; CHECK-ZVBB-NEXT: vmv2r.v v8, v10 620; CHECK-ZVBB-NEXT: ret 621 %head = insertelement <16 x i8> poison, i8 %b, i32 0 622 %splat = shufflevector <16 x i8> %head, <16 x i8> poison, <16 x i32> zeroinitializer 623 %x = zext <16 x i8> %a to <16 x i16> 624 %y = sext <16 x i8> %splat to <16 x i16> 625 %z = shl <16 x i16> %x, %y 626 ret <16 x i16> %z 627} 628 629define <16 x i16> @vwsll_vx_i8_v16i16_zext(<16 x i8> %a, i8 %b) { 630; CHECK-LABEL: vwsll_vx_i8_v16i16_zext: 631; CHECK: # %bb.0: 632; CHECK-NEXT: vsetivli zero, 16, e8, m1, ta, ma 633; CHECK-NEXT: vmv.v.x v9, a0 634; CHECK-NEXT: vsetvli zero, zero, e16, m2, ta, ma 635; CHECK-NEXT: vzext.vf2 v10, v8 636; CHECK-NEXT: vzext.vf2 v12, v9 637; CHECK-NEXT: vsll.vv v8, v10, v12 638; CHECK-NEXT: ret 639; 640; CHECK-ZVBB-LABEL: vwsll_vx_i8_v16i16_zext: 641; CHECK-ZVBB: # %bb.0: 642; CHECK-ZVBB-NEXT: vsetivli zero, 16, e8, m1, ta, ma 643; CHECK-ZVBB-NEXT: vwsll.vx v10, v8, a0 644; CHECK-ZVBB-NEXT: vmv2r.v v8, v10 645; CHECK-ZVBB-NEXT: ret 646 %head = insertelement <16 x i8> poison, i8 %b, i32 0 647 %splat = shufflevector <16 x i8> %head, <16 x i8> poison, <16 x i32> zeroinitializer 648 %x = zext <16 x i8> %a to <16 x i16> 649 %y = zext <16 x i8> %splat to <16 x i16> 650 %z = shl <16 x i16> %x, %y 651 ret <16 x i16> %z 652} 653 654define <16 x i16> @vwsll_vi_v16i16(<16 x i8> %a) { 655; CHECK-LABEL: vwsll_vi_v16i16: 656; CHECK: # %bb.0: 657; CHECK-NEXT: vsetivli zero, 16, e16, m2, ta, ma 658; CHECK-NEXT: vzext.vf2 v10, v8 659; CHECK-NEXT: vsll.vi v8, v10, 2 660; CHECK-NEXT: ret 661; 662; CHECK-ZVBB-LABEL: vwsll_vi_v16i16: 663; CHECK-ZVBB: # %bb.0: 664; CHECK-ZVBB-NEXT: vsetivli zero, 16, e8, m1, ta, ma 665; CHECK-ZVBB-NEXT: vwsll.vi v10, v8, 2 666; CHECK-ZVBB-NEXT: vmv2r.v v8, v10 667; CHECK-ZVBB-NEXT: ret 668 %x = zext <16 x i8> %a to <16 x i16> 669 %z = shl <16 x i16> %x, splat (i16 2) 670 ret <16 x i16> %z 671} 672 673; ============================================================================== 674; i8 -> i64 675; ============================================================================== 676 677define <4 x i64> @vwsll_vv_v4i64_v4i8_sext(<4 x i8> %a, <4 x i8> %b) { 678; CHECK-LABEL: vwsll_vv_v4i64_v4i8_sext: 679; CHECK: # %bb.0: 680; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, ma 681; CHECK-NEXT: vzext.vf8 v10, v8 682; CHECK-NEXT: vsext.vf8 v12, v9 683; CHECK-NEXT: vsll.vv v8, v10, v12 684; CHECK-NEXT: ret 685; 686; CHECK-ZVBB-LABEL: vwsll_vv_v4i64_v4i8_sext: 687; CHECK-ZVBB: # %bb.0: 688; CHECK-ZVBB-NEXT: vsetivli zero, 4, e64, m2, ta, ma 689; CHECK-ZVBB-NEXT: vzext.vf8 v10, v8 690; CHECK-ZVBB-NEXT: vsext.vf8 v12, v9 691; CHECK-ZVBB-NEXT: vsll.vv v8, v10, v12 692; CHECK-ZVBB-NEXT: ret 693 %x = zext <4 x i8> %a to <4 x i64> 694 %y = sext <4 x i8> %b to <4 x i64> 695 %z = shl <4 x i64> %x, %y 696 ret <4 x i64> %z 697} 698 699define <4 x i64> @vwsll_vv_v4i64_v4i8_zext(<4 x i8> %a, <4 x i8> %b) { 700; CHECK-LABEL: vwsll_vv_v4i64_v4i8_zext: 701; CHECK: # %bb.0: 702; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, ma 703; CHECK-NEXT: vzext.vf8 v10, v8 704; CHECK-NEXT: vzext.vf8 v12, v9 705; CHECK-NEXT: vsll.vv v8, v10, v12 706; CHECK-NEXT: ret 707; 708; CHECK-ZVBB-LABEL: vwsll_vv_v4i64_v4i8_zext: 709; CHECK-ZVBB: # %bb.0: 710; CHECK-ZVBB-NEXT: vsetivli zero, 4, e32, m1, ta, ma 711; CHECK-ZVBB-NEXT: vzext.vf4 v10, v8 712; CHECK-ZVBB-NEXT: vzext.vf4 v11, v9 713; CHECK-ZVBB-NEXT: vwsll.vv v8, v10, v11 714; CHECK-ZVBB-NEXT: ret 715 %x = zext <4 x i8> %a to <4 x i64> 716 %y = zext <4 x i8> %b to <4 x i64> 717 %z = shl <4 x i64> %x, %y 718 ret <4 x i64> %z 719} 720 721define <4 x i64> @vwsll_vx_i64_v4i64_v4i8(<4 x i8> %a, i64 %b) { 722; CHECK-LABEL: vwsll_vx_i64_v4i64_v4i8: 723; CHECK: # %bb.0: 724; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, ma 725; CHECK-NEXT: vzext.vf8 v10, v8 726; CHECK-NEXT: vsll.vx v8, v10, a0 727; CHECK-NEXT: ret 728; 729; CHECK-ZVBB-LABEL: vwsll_vx_i64_v4i64_v4i8: 730; CHECK-ZVBB: # %bb.0: 731; CHECK-ZVBB-NEXT: vsetivli zero, 4, e64, m2, ta, ma 732; CHECK-ZVBB-NEXT: vzext.vf8 v10, v8 733; CHECK-ZVBB-NEXT: vsll.vx v8, v10, a0 734; CHECK-ZVBB-NEXT: ret 735 %head = insertelement <4 x i64> poison, i64 %b, i32 0 736 %splat = shufflevector <4 x i64> %head, <4 x i64> poison, <4 x i32> zeroinitializer 737 %x = zext <4 x i8> %a to <4 x i64> 738 %z = shl <4 x i64> %x, %splat 739 ret <4 x i64> %z 740} 741 742define <4 x i64> @vwsll_vx_i32_v4i64_v4i8_sext(<4 x i8> %a, i32 %b) { 743; CHECK-LABEL: vwsll_vx_i32_v4i64_v4i8_sext: 744; CHECK: # %bb.0: 745; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma 746; CHECK-NEXT: vmv.v.x v9, a0 747; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma 748; CHECK-NEXT: vzext.vf8 v10, v8 749; CHECK-NEXT: vsext.vf2 v12, v9 750; CHECK-NEXT: vsll.vv v8, v10, v12 751; CHECK-NEXT: ret 752; 753; CHECK-ZVBB-LABEL: vwsll_vx_i32_v4i64_v4i8_sext: 754; CHECK-ZVBB: # %bb.0: 755; CHECK-ZVBB-NEXT: vsetivli zero, 4, e32, m1, ta, ma 756; CHECK-ZVBB-NEXT: vmv.v.x v9, a0 757; CHECK-ZVBB-NEXT: vsetvli zero, zero, e64, m2, ta, ma 758; CHECK-ZVBB-NEXT: vzext.vf8 v10, v8 759; CHECK-ZVBB-NEXT: vsext.vf2 v12, v9 760; CHECK-ZVBB-NEXT: vsll.vv v8, v10, v12 761; CHECK-ZVBB-NEXT: ret 762 %head = insertelement <4 x i32> poison, i32 %b, i32 0 763 %splat = shufflevector <4 x i32> %head, <4 x i32> poison, <4 x i32> zeroinitializer 764 %x = zext <4 x i8> %a to <4 x i64> 765 %y = sext <4 x i32> %splat to <4 x i64> 766 %z = shl <4 x i64> %x, %y 767 ret <4 x i64> %z 768} 769 770define <4 x i64> @vwsll_vx_i32_v4i64_v4i8_zext(<4 x i8> %a, i32 %b) { 771; CHECK-LABEL: vwsll_vx_i32_v4i64_v4i8_zext: 772; CHECK: # %bb.0: 773; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma 774; CHECK-NEXT: vmv.v.x v9, a0 775; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma 776; CHECK-NEXT: vzext.vf8 v10, v8 777; CHECK-NEXT: vzext.vf2 v12, v9 778; CHECK-NEXT: vsll.vv v8, v10, v12 779; CHECK-NEXT: ret 780; 781; CHECK-ZVBB-LABEL: vwsll_vx_i32_v4i64_v4i8_zext: 782; CHECK-ZVBB: # %bb.0: 783; CHECK-ZVBB-NEXT: vsetivli zero, 4, e32, m1, ta, ma 784; CHECK-ZVBB-NEXT: vzext.vf4 v10, v8 785; CHECK-ZVBB-NEXT: vwsll.vx v8, v10, a0 786; CHECK-ZVBB-NEXT: ret 787 %head = insertelement <4 x i32> poison, i32 %b, i32 0 788 %splat = shufflevector <4 x i32> %head, <4 x i32> poison, <4 x i32> zeroinitializer 789 %x = zext <4 x i8> %a to <4 x i64> 790 %y = zext <4 x i32> %splat to <4 x i64> 791 %z = shl <4 x i64> %x, %y 792 ret <4 x i64> %z 793} 794 795define <4 x i64> @vwsll_vx_i16_v4i64_v4i8_sext(<4 x i8> %a, i16 %b) { 796; CHECK-LABEL: vwsll_vx_i16_v4i64_v4i8_sext: 797; CHECK: # %bb.0: 798; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 799; CHECK-NEXT: vmv.v.x v9, a0 800; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma 801; CHECK-NEXT: vzext.vf8 v10, v8 802; CHECK-NEXT: vsext.vf4 v12, v9 803; CHECK-NEXT: vsll.vv v8, v10, v12 804; CHECK-NEXT: ret 805; 806; CHECK-ZVBB-LABEL: vwsll_vx_i16_v4i64_v4i8_sext: 807; CHECK-ZVBB: # %bb.0: 808; CHECK-ZVBB-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 809; CHECK-ZVBB-NEXT: vmv.v.x v9, a0 810; CHECK-ZVBB-NEXT: vsetvli zero, zero, e64, m2, ta, ma 811; CHECK-ZVBB-NEXT: vzext.vf8 v10, v8 812; CHECK-ZVBB-NEXT: vsext.vf4 v12, v9 813; CHECK-ZVBB-NEXT: vsll.vv v8, v10, v12 814; CHECK-ZVBB-NEXT: ret 815 %head = insertelement <4 x i16> poison, i16 %b, i32 0 816 %splat = shufflevector <4 x i16> %head, <4 x i16> poison, <4 x i32> zeroinitializer 817 %x = zext <4 x i8> %a to <4 x i64> 818 %y = sext <4 x i16> %splat to <4 x i64> 819 %z = shl <4 x i64> %x, %y 820 ret <4 x i64> %z 821} 822 823define <4 x i64> @vwsll_vx_i16_v4i64_v4i8_zext(<4 x i8> %a, i16 %b) { 824; CHECK-LABEL: vwsll_vx_i16_v4i64_v4i8_zext: 825; CHECK: # %bb.0: 826; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 827; CHECK-NEXT: vmv.v.x v9, a0 828; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma 829; CHECK-NEXT: vzext.vf8 v10, v8 830; CHECK-NEXT: vzext.vf4 v12, v9 831; CHECK-NEXT: vsll.vv v8, v10, v12 832; CHECK-NEXT: ret 833; 834; CHECK-ZVBB-LABEL: vwsll_vx_i16_v4i64_v4i8_zext: 835; CHECK-ZVBB: # %bb.0: 836; CHECK-ZVBB-NEXT: vsetivli zero, 4, e32, m1, ta, ma 837; CHECK-ZVBB-NEXT: vzext.vf4 v10, v8 838; CHECK-ZVBB-NEXT: vwsll.vx v8, v10, a0 839; CHECK-ZVBB-NEXT: ret 840 %head = insertelement <4 x i16> poison, i16 %b, i32 0 841 %splat = shufflevector <4 x i16> %head, <4 x i16> poison, <4 x i32> zeroinitializer 842 %x = zext <4 x i8> %a to <4 x i64> 843 %y = zext <4 x i16> %splat to <4 x i64> 844 %z = shl <4 x i64> %x, %y 845 ret <4 x i64> %z 846} 847 848define <4 x i64> @vwsll_vx_i8_v4i64_v4i8_sext(<4 x i8> %a, i8 %b) { 849; CHECK-LABEL: vwsll_vx_i8_v4i64_v4i8_sext: 850; CHECK: # %bb.0: 851; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, ma 852; CHECK-NEXT: vmv.v.x v9, a0 853; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma 854; CHECK-NEXT: vzext.vf8 v10, v8 855; CHECK-NEXT: vsext.vf8 v12, v9 856; CHECK-NEXT: vsll.vv v8, v10, v12 857; CHECK-NEXT: ret 858; 859; CHECK-ZVBB-LABEL: vwsll_vx_i8_v4i64_v4i8_sext: 860; CHECK-ZVBB: # %bb.0: 861; CHECK-ZVBB-NEXT: vsetivli zero, 4, e8, mf4, ta, ma 862; CHECK-ZVBB-NEXT: vmv.v.x v9, a0 863; CHECK-ZVBB-NEXT: vsetvli zero, zero, e64, m2, ta, ma 864; CHECK-ZVBB-NEXT: vzext.vf8 v10, v8 865; CHECK-ZVBB-NEXT: vsext.vf8 v12, v9 866; CHECK-ZVBB-NEXT: vsll.vv v8, v10, v12 867; CHECK-ZVBB-NEXT: ret 868 %head = insertelement <4 x i8> poison, i8 %b, i32 0 869 %splat = shufflevector <4 x i8> %head, <4 x i8> poison, <4 x i32> zeroinitializer 870 %x = zext <4 x i8> %a to <4 x i64> 871 %y = sext <4 x i8> %splat to <4 x i64> 872 %z = shl <4 x i64> %x, %y 873 ret <4 x i64> %z 874} 875 876define <4 x i64> @vwsll_vx_i8_v4i64_v4i8_zext(<4 x i8> %a, i8 %b) { 877; CHECK-LABEL: vwsll_vx_i8_v4i64_v4i8_zext: 878; CHECK: # %bb.0: 879; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, ma 880; CHECK-NEXT: vmv.v.x v9, a0 881; CHECK-NEXT: vsetvli zero, zero, e64, m2, ta, ma 882; CHECK-NEXT: vzext.vf8 v10, v8 883; CHECK-NEXT: vzext.vf8 v12, v9 884; CHECK-NEXT: vsll.vv v8, v10, v12 885; CHECK-NEXT: ret 886; 887; CHECK-ZVBB-LABEL: vwsll_vx_i8_v4i64_v4i8_zext: 888; CHECK-ZVBB: # %bb.0: 889; CHECK-ZVBB-NEXT: vsetivli zero, 4, e32, m1, ta, ma 890; CHECK-ZVBB-NEXT: vzext.vf4 v10, v8 891; CHECK-ZVBB-NEXT: vwsll.vx v8, v10, a0 892; CHECK-ZVBB-NEXT: ret 893 %head = insertelement <4 x i8> poison, i8 %b, i32 0 894 %splat = shufflevector <4 x i8> %head, <4 x i8> poison, <4 x i32> zeroinitializer 895 %x = zext <4 x i8> %a to <4 x i64> 896 %y = zext <4 x i8> %splat to <4 x i64> 897 %z = shl <4 x i64> %x, %y 898 ret <4 x i64> %z 899} 900 901define <4 x i64> @vwsll_vi_v4i64_v4i8(<4 x i8> %a) { 902; CHECK-LABEL: vwsll_vi_v4i64_v4i8: 903; CHECK: # %bb.0: 904; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, ma 905; CHECK-NEXT: vzext.vf8 v10, v8 906; CHECK-NEXT: vsll.vi v8, v10, 2 907; CHECK-NEXT: ret 908; 909; CHECK-ZVBB-LABEL: vwsll_vi_v4i64_v4i8: 910; CHECK-ZVBB: # %bb.0: 911; CHECK-ZVBB-NEXT: vsetivli zero, 4, e32, m1, ta, ma 912; CHECK-ZVBB-NEXT: vzext.vf4 v10, v8 913; CHECK-ZVBB-NEXT: vwsll.vi v8, v10, 2 914; CHECK-ZVBB-NEXT: ret 915 %x = zext <4 x i8> %a to <4 x i64> 916 %z = shl <4 x i64> %x, splat (i64 2) 917 ret <4 x i64> %z 918} 919