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