1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 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 5define <8 x i8> @vnsra_v8i16_v8i8_scalar(<8 x i16> %x, i16 %y) { 6; CHECK-LABEL: vnsra_v8i16_v8i8_scalar: 7; CHECK: # %bb.0: 8; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 9; CHECK-NEXT: vnsra.wx v8, v8, a0 10; CHECK-NEXT: ret 11 %insert = insertelement <8 x i16> poison, i16 %y, i16 0 12 %splat = shufflevector <8 x i16> %insert, <8 x i16> poison, <8 x i32> zeroinitializer 13 %a = ashr <8 x i16> %x, %splat 14 %b = trunc <8 x i16> %a to <8 x i8> 15 ret <8 x i8> %b 16} 17 18define <8 x i8> @vnsra_v8i16_v8i8_scalar_sext(<8 x i16> %x, i8 %y) { 19; CHECK-LABEL: vnsra_v8i16_v8i8_scalar_sext: 20; CHECK: # %bb.0: 21; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 22; CHECK-NEXT: vnsra.wx v8, v8, a0 23; CHECK-NEXT: ret 24 %insert = insertelement <8 x i8> poison, i8 %y, i8 0 25 %splat = shufflevector <8 x i8> %insert, <8 x i8> poison, <8 x i32> zeroinitializer 26 %sext = sext <8 x i8> %splat to <8 x i16> 27 %a = ashr <8 x i16> %x, %sext 28 %b = trunc <8 x i16> %a to <8 x i8> 29 ret <8 x i8> %b 30} 31 32define <8 x i8> @vnsra_v8i16_v8i8_scalar_zext(<8 x i16> %x, i8 %y) { 33; CHECK-LABEL: vnsra_v8i16_v8i8_scalar_zext: 34; CHECK: # %bb.0: 35; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 36; CHECK-NEXT: vnsra.wx v8, v8, a0 37; CHECK-NEXT: ret 38 %insert = insertelement <8 x i8> poison, i8 %y, i8 0 39 %splat = shufflevector <8 x i8> %insert, <8 x i8> poison, <8 x i32> zeroinitializer 40 %zext = zext <8 x i8> %splat to <8 x i16> 41 %a = ashr <8 x i16> %x, %zext 42 %b = trunc <8 x i16> %a to <8 x i8> 43 ret <8 x i8> %b 44} 45 46define <4 x i16> @vnsra_v4i32_v4i16_scalar(<4 x i32> %x, i32 %y) { 47; CHECK-LABEL: vnsra_v4i32_v4i16_scalar: 48; CHECK: # %bb.0: 49; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 50; CHECK-NEXT: vnsra.wx v8, v8, a0 51; CHECK-NEXT: ret 52 %insert = insertelement <4 x i32> poison, i32 %y, i32 0 53 %splat = shufflevector <4 x i32> %insert, <4 x i32> poison, <4 x i32> zeroinitializer 54 %a = ashr <4 x i32> %x, %splat 55 %b = trunc <4 x i32> %a to <4 x i16> 56 ret <4 x i16> %b 57} 58 59define <4 x i16> @vnsra_v4i32_v4i16_scalar_sext(<4 x i32> %x, i16 %y) { 60; CHECK-LABEL: vnsra_v4i32_v4i16_scalar_sext: 61; CHECK: # %bb.0: 62; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 63; CHECK-NEXT: vnsra.wx v8, v8, a0 64; CHECK-NEXT: ret 65 %insert = insertelement <4 x i16> poison, i16 %y, i16 0 66 %splat = shufflevector <4 x i16> %insert, <4 x i16> poison, <4 x i32> zeroinitializer 67 %sext = sext <4 x i16> %splat to <4 x i32> 68 %a = ashr <4 x i32> %x, %sext 69 %b = trunc <4 x i32> %a to <4 x i16> 70 ret <4 x i16> %b 71} 72 73define <4 x i16> @vnsra_v4i32_v4i16_scalar_zext(<4 x i32> %x, i16 %y) { 74; CHECK-LABEL: vnsra_v4i32_v4i16_scalar_zext: 75; CHECK: # %bb.0: 76; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 77; CHECK-NEXT: vnsra.wx v8, v8, a0 78; CHECK-NEXT: ret 79 %insert = insertelement <4 x i16> poison, i16 %y, i16 0 80 %splat = shufflevector <4 x i16> %insert, <4 x i16> poison, <4 x i32> zeroinitializer 81 %zext = zext <4 x i16> %splat to <4 x i32> 82 %a = ashr <4 x i32> %x, %zext 83 %b = trunc <4 x i32> %a to <4 x i16> 84 ret <4 x i16> %b 85} 86 87define <2 x i32> @vnsra_v2i64_v2i32_scalar(<2 x i64> %x, i64 %y) { 88; CHECK-LABEL: vnsra_v2i64_v2i32_scalar: 89; CHECK: # %bb.0: 90; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 91; CHECK-NEXT: vnsra.wx v8, v8, a0 92; CHECK-NEXT: ret 93 %insert = insertelement <2 x i64> poison, i64 %y, i32 0 94 %splat = shufflevector <2 x i64> %insert, <2 x i64> poison, <2 x i32> zeroinitializer 95 %a = ashr <2 x i64> %x, %splat 96 %b = trunc <2 x i64> %a to <2 x i32> 97 ret <2 x i32> %b 98} 99 100define <2 x i32> @vnsra_v2i64_v2i32_scalar_sext(<2 x i64> %x, i32 %y) { 101; CHECK-LABEL: vnsra_v2i64_v2i32_scalar_sext: 102; CHECK: # %bb.0: 103; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 104; CHECK-NEXT: vnsra.wx v8, v8, a0 105; CHECK-NEXT: ret 106 %insert = insertelement <2 x i32> poison, i32 %y, i32 0 107 %splat = shufflevector <2 x i32> %insert, <2 x i32> poison, <2 x i32> zeroinitializer 108 %sext = sext <2 x i32> %splat to <2 x i64> 109 %a = ashr <2 x i64> %x, %sext 110 %b = trunc <2 x i64> %a to <2 x i32> 111 ret <2 x i32> %b 112} 113 114define <2 x i32> @vnsra_v2i64_v2i32_scalar_zext(<2 x i64> %x, i32 %y) { 115; CHECK-LABEL: vnsra_v2i64_v2i32_scalar_zext: 116; CHECK: # %bb.0: 117; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 118; CHECK-NEXT: vnsra.wx v8, v8, a0 119; CHECK-NEXT: ret 120 %insert = insertelement <2 x i32> poison, i32 %y, i32 0 121 %splat = shufflevector <2 x i32> %insert, <2 x i32> poison, <2 x i32> zeroinitializer 122 %zext = zext <2 x i32> %splat to <2 x i64> 123 %a = ashr <2 x i64> %x, %zext 124 %b = trunc <2 x i64> %a to <2 x i32> 125 ret <2 x i32> %b 126} 127 128define <8 x i8> @vnsra_v8i16_v8i8_imm(<8 x i16> %x) { 129; CHECK-LABEL: vnsra_v8i16_v8i8_imm: 130; CHECK: # %bb.0: 131; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 132; CHECK-NEXT: vnsrl.wi v8, v8, 8 133; CHECK-NEXT: ret 134 %a = ashr <8 x i16> %x, <i16 8, i16 8, i16 8, i16 8,i16 8, i16 8, i16 8, i16 8> 135 %b = trunc <8 x i16> %a to <8 x i8> 136 ret <8 x i8> %b 137} 138 139define <4 x i16> @vnsra_v4i32_v4i16_imm(<4 x i32> %x) { 140; CHECK-LABEL: vnsra_v4i32_v4i16_imm: 141; CHECK: # %bb.0: 142; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 143; CHECK-NEXT: vnsrl.wi v8, v8, 16 144; CHECK-NEXT: ret 145 %a = ashr <4 x i32> %x, <i32 16, i32 16, i32 16, i32 16> 146 %b = trunc <4 x i32> %a to <4 x i16> 147 ret <4 x i16> %b 148} 149 150define <2 x i32> @vnsra_v2i64_v2i32_imm(<2 x i64> %x) { 151; CHECK-LABEL: vnsra_v2i64_v2i32_imm: 152; CHECK: # %bb.0: 153; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 154; CHECK-NEXT: vnsrl.wi v8, v8, 31 155; CHECK-NEXT: ret 156 %a = ashr <2 x i64> %x, <i64 31, i64 31> 157 %b = trunc <2 x i64> %a to <2 x i32> 158 ret <2 x i32> %b 159} 160 161define <8 x i8> @vnsra_v8i16_v8i8_sext(<8 x i16> %x, <8 x i8> %y) { 162; CHECK-LABEL: vnsra_v8i16_v8i8_sext: 163; CHECK: # %bb.0: 164; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 165; CHECK-NEXT: vnsra.wv v8, v8, v9 166; CHECK-NEXT: ret 167 %sext = sext <8 x i8> %y to <8 x i16> 168 %a = ashr <8 x i16> %x, %sext 169 %b = trunc <8 x i16> %a to <8 x i8> 170 ret <8 x i8> %b 171} 172 173define <8 x i8> @vnsra_v8i16_v8i8_zext(<8 x i16> %x, <8 x i8> %y) { 174; CHECK-LABEL: vnsra_v8i16_v8i8_zext: 175; CHECK: # %bb.0: 176; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 177; CHECK-NEXT: vnsra.wv v8, v8, v9 178; CHECK-NEXT: ret 179 %sext = zext <8 x i8> %y to <8 x i16> 180 %a = ashr <8 x i16> %x, %sext 181 %b = trunc <8 x i16> %a to <8 x i8> 182 ret <8 x i8> %b 183} 184 185define <8 x i8> @vnsrl_v8i16_v8i8_scalar(<8 x i16> %x, i16 %y) { 186; CHECK-LABEL: vnsrl_v8i16_v8i8_scalar: 187; CHECK: # %bb.0: 188; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 189; CHECK-NEXT: vnsrl.wx v8, v8, a0 190; CHECK-NEXT: ret 191 %insert = insertelement <8 x i16> poison, i16 %y, i16 0 192 %splat = shufflevector <8 x i16> %insert, <8 x i16> poison, <8 x i32> zeroinitializer 193 %a = lshr <8 x i16> %x, %splat 194 %b = trunc <8 x i16> %a to <8 x i8> 195 ret <8 x i8> %b 196} 197 198define <8 x i8> @vnsrl_v8i16_v8i8_scalar_sext(<8 x i16> %x, i8 %y) { 199; CHECK-LABEL: vnsrl_v8i16_v8i8_scalar_sext: 200; CHECK: # %bb.0: 201; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 202; CHECK-NEXT: vnsrl.wx v8, v8, a0 203; CHECK-NEXT: ret 204 %insert = insertelement <8 x i8> poison, i8 %y, i16 0 205 %splat = shufflevector <8 x i8> %insert, <8 x i8> poison, <8 x i32> zeroinitializer 206 %sext = sext <8 x i8> %splat to <8 x i16> 207 %a = lshr <8 x i16> %x, %sext 208 %b = trunc <8 x i16> %a to <8 x i8> 209 ret <8 x i8> %b 210} 211 212define <8 x i8> @vnsrl_v8i16_v8i8_scalar_zext(<8 x i16> %x, i8 %y) { 213; CHECK-LABEL: vnsrl_v8i16_v8i8_scalar_zext: 214; CHECK: # %bb.0: 215; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 216; CHECK-NEXT: vnsrl.wx v8, v8, a0 217; CHECK-NEXT: ret 218 %insert = insertelement <8 x i8> poison, i8 %y, i16 0 219 %splat = shufflevector <8 x i8> %insert, <8 x i8> poison, <8 x i32> zeroinitializer 220 %zext = zext <8 x i8> %splat to <8 x i16> 221 %a = lshr <8 x i16> %x, %zext 222 %b = trunc <8 x i16> %a to <8 x i8> 223 ret <8 x i8> %b 224} 225 226define <4 x i16> @vnsrl_v4i32_v4i16_scalar(<4 x i32> %x, i32 %y) { 227; CHECK-LABEL: vnsrl_v4i32_v4i16_scalar: 228; CHECK: # %bb.0: 229; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 230; CHECK-NEXT: vnsrl.wx v8, v8, a0 231; CHECK-NEXT: ret 232 %insert = insertelement <4 x i32> poison, i32 %y, i32 0 233 %splat = shufflevector <4 x i32> %insert, <4 x i32> poison, <4 x i32> zeroinitializer 234 %a = lshr <4 x i32> %x, %splat 235 %b = trunc <4 x i32> %a to <4 x i16> 236 ret <4 x i16> %b 237} 238 239define <4 x i16> @vnsrl_v4i32_v4i16_scalar_sext(<4 x i32> %x, i16 %y) { 240; CHECK-LABEL: vnsrl_v4i32_v4i16_scalar_sext: 241; CHECK: # %bb.0: 242; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 243; CHECK-NEXT: vnsrl.wx v8, v8, a0 244; CHECK-NEXT: ret 245 %insert = insertelement <4 x i16> poison, i16 %y, i16 0 246 %splat = shufflevector <4 x i16> %insert, <4 x i16> poison, <4 x i32> zeroinitializer 247 %sext = sext <4 x i16> %splat to <4 x i32> 248 %a = lshr <4 x i32> %x, %sext 249 %b = trunc <4 x i32> %a to <4 x i16> 250 ret <4 x i16> %b 251} 252 253define <4 x i16> @vnsrl_v4i32_v4i16_scalar_zext(<4 x i32> %x, i16 %y) { 254; CHECK-LABEL: vnsrl_v4i32_v4i16_scalar_zext: 255; CHECK: # %bb.0: 256; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 257; CHECK-NEXT: vnsrl.wx v8, v8, a0 258; CHECK-NEXT: ret 259 %insert = insertelement <4 x i16> poison, i16 %y, i16 0 260 %splat = shufflevector <4 x i16> %insert, <4 x i16> poison, <4 x i32> zeroinitializer 261 %zext = zext <4 x i16> %splat to <4 x i32> 262 %a = lshr <4 x i32> %x, %zext 263 %b = trunc <4 x i32> %a to <4 x i16> 264 ret <4 x i16> %b 265} 266 267define <2 x i32> @vnsrl_v2i64_v2i32_scalar(<2 x i64> %x, i64 %y) { 268; CHECK-LABEL: vnsrl_v2i64_v2i32_scalar: 269; CHECK: # %bb.0: 270; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 271; CHECK-NEXT: vnsrl.wx v8, v8, a0 272; CHECK-NEXT: ret 273 %insert = insertelement <2 x i64> poison, i64 %y, i32 0 274 %splat = shufflevector <2 x i64> %insert, <2 x i64> poison, <2 x i32> zeroinitializer 275 %a = lshr <2 x i64> %x, %splat 276 %b = trunc <2 x i64> %a to <2 x i32> 277 ret <2 x i32> %b 278} 279 280define <2 x i32> @vnsrl_v2i64_v2i32_scalar_sext(<2 x i64> %x, i32 %y) { 281; CHECK-LABEL: vnsrl_v2i64_v2i32_scalar_sext: 282; CHECK: # %bb.0: 283; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 284; CHECK-NEXT: vnsrl.wx v8, v8, a0 285; CHECK-NEXT: ret 286 %insert = insertelement <2 x i32> poison, i32 %y, i32 0 287 %splat = shufflevector <2 x i32> %insert, <2 x i32> poison, <2 x i32> zeroinitializer 288 %sext = sext <2 x i32> %splat to <2 x i64> 289 %a = lshr <2 x i64> %x, %sext 290 %b = trunc <2 x i64> %a to <2 x i32> 291 ret <2 x i32> %b 292} 293 294define <2 x i32> @vnsrl_v2i64_v2i32_scalar_zext(<2 x i64> %x, i32 %y) { 295; CHECK-LABEL: vnsrl_v2i64_v2i32_scalar_zext: 296; CHECK: # %bb.0: 297; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 298; CHECK-NEXT: vnsrl.wx v8, v8, a0 299; CHECK-NEXT: ret 300 %insert = insertelement <2 x i32> poison, i32 %y, i32 0 301 %splat = shufflevector <2 x i32> %insert, <2 x i32> poison, <2 x i32> zeroinitializer 302 %zext = zext <2 x i32> %splat to <2 x i64> 303 %a = lshr <2 x i64> %x, %zext 304 %b = trunc <2 x i64> %a to <2 x i32> 305 ret <2 x i32> %b 306} 307 308define <8 x i8> @vnsrl_v8i16_v8i8_imm(<8 x i16> %x) { 309; CHECK-LABEL: vnsrl_v8i16_v8i8_imm: 310; CHECK: # %bb.0: 311; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma 312; CHECK-NEXT: vnsrl.wi v8, v8, 8 313; CHECK-NEXT: ret 314 %a = lshr <8 x i16> %x, <i16 8, i16 8, i16 8, i16 8,i16 8, i16 8, i16 8, i16 8> 315 %b = trunc <8 x i16> %a to <8 x i8> 316 ret <8 x i8> %b 317} 318 319define <4 x i16> @vnsrl_v4i32_v4i16_imm(<4 x i32> %x) { 320; CHECK-LABEL: vnsrl_v4i32_v4i16_imm: 321; CHECK: # %bb.0: 322; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 323; CHECK-NEXT: vnsrl.wi v8, v8, 16 324; CHECK-NEXT: ret 325 %a = lshr <4 x i32> %x, <i32 16, i32 16, i32 16, i32 16> 326 %b = trunc <4 x i32> %a to <4 x i16> 327 ret <4 x i16> %b 328} 329 330define <2 x i32> @vnsrl_v2i64_v2i32_imm(<2 x i64> %x) { 331; CHECK-LABEL: vnsrl_v2i64_v2i32_imm: 332; CHECK: # %bb.0: 333; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 334; CHECK-NEXT: vnsrl.wi v8, v8, 31 335; CHECK-NEXT: ret 336 %a = lshr <2 x i64> %x, <i64 31, i64 31> 337 %b = trunc <2 x i64> %a to <2 x i32> 338 ret <2 x i32> %b 339} 340 341define <4 x i16> @vnsrl_v4i32_v4i16_sext(<4 x i32> %x, <4 x i16> %y) { 342; CHECK-LABEL: vnsrl_v4i32_v4i16_sext: 343; CHECK: # %bb.0: 344; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 345; CHECK-NEXT: vnsrl.wv v8, v8, v9 346; CHECK-NEXT: ret 347 %sext = sext <4 x i16> %y to <4 x i32> 348 %a = lshr <4 x i32> %x, %sext 349 %b = trunc <4 x i32> %a to <4 x i16> 350 ret <4 x i16> %b 351} 352 353define <4 x i16> @vnsrl_v4i32_v4i16_zext(<4 x i32> %x, <4 x i16> %y) { 354; CHECK-LABEL: vnsrl_v4i32_v4i16_zext: 355; CHECK: # %bb.0: 356; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 357; CHECK-NEXT: vnsrl.wv v8, v8, v9 358; CHECK-NEXT: ret 359 %zext = zext <4 x i16> %y to <4 x i32> 360 %a = lshr <4 x i32> %x, %zext 361 %b = trunc <4 x i32> %a to <4 x i16> 362 ret <4 x i16> %b 363} 364 365define <2 x i32> @vnsrl_v2i64_v2i32_sext(<2 x i64> %x, <2 x i32> %y) { 366; CHECK-LABEL: vnsrl_v2i64_v2i32_sext: 367; CHECK: # %bb.0: 368; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 369; CHECK-NEXT: vnsrl.wv v8, v8, v9 370; CHECK-NEXT: ret 371 %sext = sext <2 x i32> %y to <2 x i64> 372 %a = lshr <2 x i64> %x, %sext 373 %b = trunc <2 x i64> %a to <2 x i32> 374 ret <2 x i32> %b 375} 376 377define <2 x i32> @vnsrl_v2i64_v2i32_zext(<2 x i64> %x, <2 x i32> %y) { 378; CHECK-LABEL: vnsrl_v2i64_v2i32_zext: 379; CHECK: # %bb.0: 380; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 381; CHECK-NEXT: vnsrl.wv v8, v8, v9 382; CHECK-NEXT: ret 383 %zext = zext <2 x i32> %y to <2 x i64> 384 %a = lshr <2 x i64> %x, %zext 385 %b = trunc <2 x i64> %a to <2 x i32> 386 ret <2 x i32> %b 387} 388