1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -verify-machineinstrs -mattr=+simd128 | FileCheck %s 3 4;; Check that masked shift counts are optimized out. 5 6target triple = "wasm32-unknown-unknown" 7 8define i32 @shl_i32(i32 %v, i32 %x) { 9; CHECK-LABEL: shl_i32: 10; CHECK: .functype shl_i32 (i32, i32) -> (i32) 11; CHECK-NEXT: # %bb.0: 12; CHECK-NEXT: local.get 0 13; CHECK-NEXT: local.get 1 14; CHECK-NEXT: i32.shl 15; CHECK-NEXT: # fallthrough-return 16 %m = and i32 %x, 31 17 %a = shl i32 %v, %m 18 ret i32 %a 19} 20 21define i32 @sra_i32(i32 %v, i32 %x) { 22; CHECK-LABEL: sra_i32: 23; CHECK: .functype sra_i32 (i32, i32) -> (i32) 24; CHECK-NEXT: # %bb.0: 25; CHECK-NEXT: local.get 0 26; CHECK-NEXT: local.get 1 27; CHECK-NEXT: i32.shr_s 28; CHECK-NEXT: # fallthrough-return 29 %m = and i32 %x, 31 30 %a = ashr i32 %v, %m 31 ret i32 %a 32} 33 34define i32 @srl_i32(i32 %v, i32 %x) { 35; CHECK-LABEL: srl_i32: 36; CHECK: .functype srl_i32 (i32, i32) -> (i32) 37; CHECK-NEXT: # %bb.0: 38; CHECK-NEXT: local.get 0 39; CHECK-NEXT: local.get 1 40; CHECK-NEXT: i32.shr_u 41; CHECK-NEXT: # fallthrough-return 42 %m = and i32 %x, 31 43 %a = lshr i32 %v, %m 44 ret i32 %a 45} 46 47define i64 @shl_i64(i64 %v, i64 %x) { 48; CHECK-LABEL: shl_i64: 49; CHECK: .functype shl_i64 (i64, i64) -> (i64) 50; CHECK-NEXT: # %bb.0: 51; CHECK-NEXT: local.get 0 52; CHECK-NEXT: local.get 1 53; CHECK-NEXT: i64.shl 54; CHECK-NEXT: # fallthrough-return 55 %m = and i64 %x, 63 56 %a = shl i64 %v, %m 57 ret i64 %a 58} 59 60define i64 @sra_i64(i64 %v, i64 %x) { 61; CHECK-LABEL: sra_i64: 62; CHECK: .functype sra_i64 (i64, i64) -> (i64) 63; CHECK-NEXT: # %bb.0: 64; CHECK-NEXT: local.get 0 65; CHECK-NEXT: local.get 1 66; CHECK-NEXT: i64.shr_s 67; CHECK-NEXT: # fallthrough-return 68 %m = and i64 %x, 63 69 %a = ashr i64 %v, %m 70 ret i64 %a 71} 72 73define i64 @srl_i64(i64 %v, i64 %x) { 74; CHECK-LABEL: srl_i64: 75; CHECK: .functype srl_i64 (i64, i64) -> (i64) 76; CHECK-NEXT: # %bb.0: 77; CHECK-NEXT: local.get 0 78; CHECK-NEXT: local.get 1 79; CHECK-NEXT: i64.shr_u 80; CHECK-NEXT: # fallthrough-return 81 %m = and i64 %x, 63 82 %a = lshr i64 %v, %m 83 ret i64 %a 84} 85 86define <16 x i8> @shl_v16i8(<16 x i8> %v, i8 %x) { 87; CHECK-LABEL: shl_v16i8: 88; CHECK: .functype shl_v16i8 (v128, i32) -> (v128) 89; CHECK-NEXT: # %bb.0: 90; CHECK-NEXT: local.get 0 91; CHECK-NEXT: local.get 1 92; CHECK-NEXT: i8x16.shl 93; CHECK-NEXT: # fallthrough-return 94 %m = and i8 %x, 7 95 %t = insertelement <16 x i8> undef, i8 %m, i32 0 96 %s = shufflevector <16 x i8> %t, <16 x i8> undef, 97 <16 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, 98 i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0> 99 %a = shl <16 x i8> %v, %s 100 ret <16 x i8> %a 101} 102 103define <16 x i8> @shl_v16i8_late(<16 x i8> %v, i8 %x) { 104; CHECK-LABEL: shl_v16i8_late: 105; CHECK: .functype shl_v16i8_late (v128, i32) -> (v128) 106; CHECK-NEXT: # %bb.0: 107; CHECK-NEXT: local.get 0 108; CHECK-NEXT: local.get 1 109; CHECK-NEXT: i8x16.shl 110; CHECK-NEXT: # fallthrough-return 111 %t = insertelement <16 x i8> undef, i8 %x, i32 0 112 %s = shufflevector <16 x i8> %t, <16 x i8> undef, 113 <16 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, 114 i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0> 115 %m = and <16 x i8> %s, <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, 116 i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7> 117 %a = shl <16 x i8> %v, %m 118 ret <16 x i8> %a 119} 120 121define <16 x i8> @ashr_v16i8(<16 x i8> %v, i8 %x) { 122; CHECK-LABEL: ashr_v16i8: 123; CHECK: .functype ashr_v16i8 (v128, i32) -> (v128) 124; CHECK-NEXT: # %bb.0: 125; CHECK-NEXT: local.get 0 126; CHECK-NEXT: local.get 1 127; CHECK-NEXT: i8x16.shr_s 128; CHECK-NEXT: # fallthrough-return 129 %m = and i8 %x, 7 130 %t = insertelement <16 x i8> undef, i8 %m, i32 0 131 %s = shufflevector <16 x i8> %t, <16 x i8> undef, 132 <16 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, 133 i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0> 134 %a = ashr <16 x i8> %v, %s 135 ret <16 x i8> %a 136} 137 138define <16 x i8> @ashr_v16i8_late(<16 x i8> %v, i8 %x) { 139; CHECK-LABEL: ashr_v16i8_late: 140; CHECK: .functype ashr_v16i8_late (v128, i32) -> (v128) 141; CHECK-NEXT: # %bb.0: 142; CHECK-NEXT: local.get 0 143; CHECK-NEXT: local.get 1 144; CHECK-NEXT: i8x16.shr_s 145; CHECK-NEXT: # fallthrough-return 146 %t = insertelement <16 x i8> undef, i8 %x, i32 0 147 %s = shufflevector <16 x i8> %t, <16 x i8> undef, 148 <16 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, 149 i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0> 150 %m = and <16 x i8> %s, <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, 151 i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7> 152 %a = ashr <16 x i8> %v, %m 153 ret <16 x i8> %a 154} 155 156define <16 x i8> @lshr_v16i8(<16 x i8> %v, i8 %x) { 157; CHECK-LABEL: lshr_v16i8: 158; CHECK: .functype lshr_v16i8 (v128, i32) -> (v128) 159; CHECK-NEXT: # %bb.0: 160; CHECK-NEXT: local.get 0 161; CHECK-NEXT: local.get 1 162; CHECK-NEXT: i8x16.shr_u 163; CHECK-NEXT: # fallthrough-return 164 %m = and i8 %x, 7 165 %t = insertelement <16 x i8> undef, i8 %m, i32 0 166 %s = shufflevector <16 x i8> %t, <16 x i8> undef, 167 <16 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, 168 i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0> 169 %a = lshr <16 x i8> %v, %s 170 ret <16 x i8> %a 171} 172 173define <16 x i8> @lshr_v16i8_late(<16 x i8> %v, i8 %x) { 174; CHECK-LABEL: lshr_v16i8_late: 175; CHECK: .functype lshr_v16i8_late (v128, i32) -> (v128) 176; CHECK-NEXT: # %bb.0: 177; CHECK-NEXT: local.get 0 178; CHECK-NEXT: local.get 1 179; CHECK-NEXT: i8x16.shr_u 180; CHECK-NEXT: # fallthrough-return 181 %t = insertelement <16 x i8> undef, i8 %x, i32 0 182 %s = shufflevector <16 x i8> %t, <16 x i8> undef, 183 <16 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, 184 i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0> 185 %m = and <16 x i8> %s, <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, 186 i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7> 187 %a = lshr <16 x i8> %v, %m 188 ret <16 x i8> %a 189} 190 191define <8 x i16> @shl_v8i16(<8 x i16> %v, i16 %x) { 192; CHECK-LABEL: shl_v8i16: 193; CHECK: .functype shl_v8i16 (v128, i32) -> (v128) 194; CHECK-NEXT: # %bb.0: 195; CHECK-NEXT: local.get 0 196; CHECK-NEXT: local.get 1 197; CHECK-NEXT: i16x8.shl 198; CHECK-NEXT: # fallthrough-return 199 %m = and i16 %x, 15 200 %t = insertelement <8 x i16> undef, i16 %m, i32 0 201 %s = shufflevector <8 x i16> %t, <8 x i16> undef, 202 <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0> 203 %a = shl <8 x i16> %v, %s 204 ret <8 x i16> %a 205} 206 207define <8 x i16> @shl_v8i16_late(<8 x i16> %v, i16 %x) { 208; CHECK-LABEL: shl_v8i16_late: 209; CHECK: .functype shl_v8i16_late (v128, i32) -> (v128) 210; CHECK-NEXT: # %bb.0: 211; CHECK-NEXT: local.get 0 212; CHECK-NEXT: local.get 1 213; CHECK-NEXT: i16x8.shl 214; CHECK-NEXT: # fallthrough-return 215 %t = insertelement <8 x i16> undef, i16 %x, i32 0 216 %s = shufflevector <8 x i16> %t, <8 x i16> undef, 217 <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0> 218 %m = and <8 x i16> %s, 219 <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15> 220 %a = shl <8 x i16> %v, %m 221 ret <8 x i16> %a 222} 223 224define <8 x i16> @ashr_v8i16(<8 x i16> %v, i16 %x) { 225; CHECK-LABEL: ashr_v8i16: 226; CHECK: .functype ashr_v8i16 (v128, i32) -> (v128) 227; CHECK-NEXT: # %bb.0: 228; CHECK-NEXT: local.get 0 229; CHECK-NEXT: local.get 1 230; CHECK-NEXT: i16x8.shr_s 231; CHECK-NEXT: # fallthrough-return 232 %m = and i16 %x, 15 233 %t = insertelement <8 x i16> undef, i16 %m, i32 0 234 %s = shufflevector <8 x i16> %t, <8 x i16> undef, 235 <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0> 236 %a = ashr <8 x i16> %v, %s 237 ret <8 x i16> %a 238} 239 240define <8 x i16> @ashr_v8i16_late(<8 x i16> %v, i16 %x) { 241; CHECK-LABEL: ashr_v8i16_late: 242; CHECK: .functype ashr_v8i16_late (v128, i32) -> (v128) 243; CHECK-NEXT: # %bb.0: 244; CHECK-NEXT: local.get 0 245; CHECK-NEXT: local.get 1 246; CHECK-NEXT: i16x8.shr_s 247; CHECK-NEXT: # fallthrough-return 248 %t = insertelement <8 x i16> undef, i16 %x, i32 0 249 %s = shufflevector <8 x i16> %t, <8 x i16> undef, 250 <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0> 251 %m = and <8 x i16> %s, 252 <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15> 253 %a = ashr <8 x i16> %v, %m 254 ret <8 x i16> %a 255} 256 257define <8 x i16> @lshr_v8i16(<8 x i16> %v, i16 %x) { 258; CHECK-LABEL: lshr_v8i16: 259; CHECK: .functype lshr_v8i16 (v128, i32) -> (v128) 260; CHECK-NEXT: # %bb.0: 261; CHECK-NEXT: local.get 0 262; CHECK-NEXT: local.get 1 263; CHECK-NEXT: i16x8.shr_u 264; CHECK-NEXT: # fallthrough-return 265 %m = and i16 %x, 15 266 %t = insertelement <8 x i16> undef, i16 %m, i32 0 267 %s = shufflevector <8 x i16> %t, <8 x i16> undef, 268 <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0> 269 %a = lshr <8 x i16> %v, %s 270 ret <8 x i16> %a 271} 272 273define <8 x i16> @lshr_v8i16_late(<8 x i16> %v, i16 %x) { 274; CHECK-LABEL: lshr_v8i16_late: 275; CHECK: .functype lshr_v8i16_late (v128, i32) -> (v128) 276; CHECK-NEXT: # %bb.0: 277; CHECK-NEXT: local.get 0 278; CHECK-NEXT: local.get 1 279; CHECK-NEXT: i16x8.shr_u 280; CHECK-NEXT: # fallthrough-return 281 %t = insertelement <8 x i16> undef, i16 %x, i32 0 282 %s = shufflevector <8 x i16> %t, <8 x i16> undef, 283 <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0> 284 %m = and <8 x i16> %s, 285 <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15> 286 %a = lshr <8 x i16> %v, %m 287 ret <8 x i16> %a 288} 289 290define <4 x i32> @shl_v4i32(<4 x i32> %v, i32 %x) { 291; CHECK-LABEL: shl_v4i32: 292; CHECK: .functype shl_v4i32 (v128, i32) -> (v128) 293; CHECK-NEXT: # %bb.0: 294; CHECK-NEXT: local.get 0 295; CHECK-NEXT: local.get 1 296; CHECK-NEXT: i32x4.shl 297; CHECK-NEXT: # fallthrough-return 298 %m = and i32 %x, 31 299 %t = insertelement <4 x i32> undef, i32 %m, i32 0 300 %s = shufflevector <4 x i32> %t, <4 x i32> undef, 301 <4 x i32> <i32 0, i32 0, i32 0, i32 0> 302 %a = shl <4 x i32> %v, %s 303 ret <4 x i32> %a 304} 305 306define <4 x i32> @shl_v4i32_late(<4 x i32> %v, i32 %x) { 307; CHECK-LABEL: shl_v4i32_late: 308; CHECK: .functype shl_v4i32_late (v128, i32) -> (v128) 309; CHECK-NEXT: # %bb.0: 310; CHECK-NEXT: local.get 0 311; CHECK-NEXT: local.get 1 312; CHECK-NEXT: i32x4.shl 313; CHECK-NEXT: # fallthrough-return 314 %t = insertelement <4 x i32> undef, i32 %x, i32 0 315 %s = shufflevector <4 x i32> %t, <4 x i32> undef, 316 <4 x i32> <i32 0, i32 0, i32 0, i32 0> 317 %m = and <4 x i32> %s, <i32 31, i32 31, i32 31, i32 31> 318 %a = shl <4 x i32> %v, %m 319 ret <4 x i32> %a 320} 321 322define <4 x i32> @ashr_v4i32(<4 x i32> %v, i32 %x) { 323; CHECK-LABEL: ashr_v4i32: 324; CHECK: .functype ashr_v4i32 (v128, i32) -> (v128) 325; CHECK-NEXT: # %bb.0: 326; CHECK-NEXT: local.get 0 327; CHECK-NEXT: local.get 1 328; CHECK-NEXT: i32x4.shr_s 329; CHECK-NEXT: # fallthrough-return 330 %m = and i32 %x, 31 331 %t = insertelement <4 x i32> undef, i32 %m, i32 0 332 %s = shufflevector <4 x i32> %t, <4 x i32> undef, 333 <4 x i32> <i32 0, i32 0, i32 0, i32 0> 334 %a = ashr <4 x i32> %v, %s 335 ret <4 x i32> %a 336} 337 338define <4 x i32> @ashr_v4i32_late(<4 x i32> %v, i32 %x) { 339; CHECK-LABEL: ashr_v4i32_late: 340; CHECK: .functype ashr_v4i32_late (v128, i32) -> (v128) 341; CHECK-NEXT: # %bb.0: 342; CHECK-NEXT: local.get 0 343; CHECK-NEXT: local.get 1 344; CHECK-NEXT: i32x4.shr_s 345; CHECK-NEXT: # fallthrough-return 346 %t = insertelement <4 x i32> undef, i32 %x, i32 0 347 %s = shufflevector <4 x i32> %t, <4 x i32> undef, 348 <4 x i32> <i32 0, i32 0, i32 0, i32 0> 349 %m = and <4 x i32> %s, <i32 31, i32 31, i32 31, i32 31> 350 %a = ashr <4 x i32> %v, %m 351 ret <4 x i32> %a 352} 353 354define <4 x i32> @lshr_v4i32(<4 x i32> %v, i32 %x) { 355; CHECK-LABEL: lshr_v4i32: 356; CHECK: .functype lshr_v4i32 (v128, i32) -> (v128) 357; CHECK-NEXT: # %bb.0: 358; CHECK-NEXT: local.get 0 359; CHECK-NEXT: local.get 1 360; CHECK-NEXT: i32x4.shr_u 361; CHECK-NEXT: # fallthrough-return 362 %m = and i32 %x, 31 363 %t = insertelement <4 x i32> undef, i32 %m, i32 0 364 %s = shufflevector <4 x i32> %t, <4 x i32> undef, 365 <4 x i32> <i32 0, i32 0, i32 0, i32 0> 366 %a = lshr <4 x i32> %v, %s 367 ret <4 x i32> %a 368} 369 370define <4 x i32> @lshr_v4i32_late(<4 x i32> %v, i32 %x) { 371; CHECK-LABEL: lshr_v4i32_late: 372; CHECK: .functype lshr_v4i32_late (v128, i32) -> (v128) 373; CHECK-NEXT: # %bb.0: 374; CHECK-NEXT: local.get 0 375; CHECK-NEXT: local.get 1 376; CHECK-NEXT: i32x4.shr_u 377; CHECK-NEXT: # fallthrough-return 378 %t = insertelement <4 x i32> undef, i32 %x, i32 0 379 %s = shufflevector <4 x i32> %t, <4 x i32> undef, 380 <4 x i32> <i32 0, i32 0, i32 0, i32 0> 381 %m = and <4 x i32> %s, <i32 31, i32 31, i32 31, i32 31> 382 %a = lshr <4 x i32> %v, %m 383 ret <4 x i32> %a 384} 385 386define <2 x i64> @shl_v2i64(<2 x i64> %v, i64 %x) { 387; CHECK-LABEL: shl_v2i64: 388; CHECK: .functype shl_v2i64 (v128, i64) -> (v128) 389; CHECK-NEXT: # %bb.0: 390; CHECK-NEXT: local.get 0 391; CHECK-NEXT: local.get 1 392; CHECK-NEXT: i32.wrap_i64 393; CHECK-NEXT: i64x2.shl 394; CHECK-NEXT: # fallthrough-return 395 %m = and i64 %x, 63 396 %t = insertelement <2 x i64> undef, i64 %m, i32 0 397 %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0> 398 %a = shl <2 x i64> %v, %s 399 ret <2 x i64> %a 400} 401 402define <2 x i64> @shl_v2i64_late(<2 x i64> %v, i64 %x) { 403; CHECK-LABEL: shl_v2i64_late: 404; CHECK: .functype shl_v2i64_late (v128, i64) -> (v128) 405; CHECK-NEXT: # %bb.0: 406; CHECK-NEXT: local.get 0 407; CHECK-NEXT: local.get 1 408; CHECK-NEXT: i32.wrap_i64 409; CHECK-NEXT: i64x2.shl 410; CHECK-NEXT: # fallthrough-return 411 %t = insertelement <2 x i64> undef, i64 %x, i32 0 412 %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0> 413 %m = and <2 x i64> %s, <i64 63, i64 63> 414 %a = shl <2 x i64> %v, %m 415 ret <2 x i64> %a 416} 417 418define <2 x i64> @ashr_v2i64(<2 x i64> %v, i64 %x) { 419; CHECK-LABEL: ashr_v2i64: 420; CHECK: .functype ashr_v2i64 (v128, i64) -> (v128) 421; CHECK-NEXT: # %bb.0: 422; CHECK-NEXT: local.get 0 423; CHECK-NEXT: local.get 1 424; CHECK-NEXT: i32.wrap_i64 425; CHECK-NEXT: i64x2.shr_s 426; CHECK-NEXT: # fallthrough-return 427 %m = and i64 %x, 63 428 %t = insertelement <2 x i64> undef, i64 %m, i32 0 429 %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0> 430 %a = ashr <2 x i64> %v, %s 431 ret <2 x i64> %a 432} 433 434define <2 x i64> @ashr_v2i64_late(<2 x i64> %v, i64 %x) { 435; CHECK-LABEL: ashr_v2i64_late: 436; CHECK: .functype ashr_v2i64_late (v128, i64) -> (v128) 437; CHECK-NEXT: # %bb.0: 438; CHECK-NEXT: local.get 0 439; CHECK-NEXT: local.get 1 440; CHECK-NEXT: i32.wrap_i64 441; CHECK-NEXT: i64x2.shr_s 442; CHECK-NEXT: # fallthrough-return 443 %t = insertelement <2 x i64> undef, i64 %x, i32 0 444 %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0> 445 %m = and <2 x i64> %s, <i64 63, i64 63> 446 %a = ashr <2 x i64> %v, %m 447 ret <2 x i64> %a 448} 449 450define <2 x i64> @lshr_v2i64(<2 x i64> %v, i64 %x) { 451; CHECK-LABEL: lshr_v2i64: 452; CHECK: .functype lshr_v2i64 (v128, i64) -> (v128) 453; CHECK-NEXT: # %bb.0: 454; CHECK-NEXT: local.get 0 455; CHECK-NEXT: local.get 1 456; CHECK-NEXT: i32.wrap_i64 457; CHECK-NEXT: i64x2.shr_u 458; CHECK-NEXT: # fallthrough-return 459 %m = and i64 %x, 63 460 %t = insertelement <2 x i64> undef, i64 %m, i32 0 461 %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0> 462 %a = lshr <2 x i64> %v, %s 463 ret <2 x i64> %a 464} 465 466define <2 x i64> @lshr_v2i64_late(<2 x i64> %v, i64 %x) { 467; CHECK-LABEL: lshr_v2i64_late: 468; CHECK: .functype lshr_v2i64_late (v128, i64) -> (v128) 469; CHECK-NEXT: # %bb.0: 470; CHECK-NEXT: local.get 0 471; CHECK-NEXT: local.get 1 472; CHECK-NEXT: i32.wrap_i64 473; CHECK-NEXT: i64x2.shr_u 474; CHECK-NEXT: # fallthrough-return 475 %t = insertelement <2 x i64> undef, i64 %x, i32 0 476 %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0> 477 %m = and <2 x i64> %s, <i64 63, i64 63> 478 %a = lshr <2 x i64> %v, %m 479 ret <2 x i64> %a 480} 481 482define <2 x i64> @shl_v2i64_i32(<2 x i64> %v, i32 %x) { 483; CHECK-LABEL: shl_v2i64_i32: 484; CHECK: .functype shl_v2i64_i32 (v128, i32) -> (v128) 485; CHECK-NEXT: # %bb.0: 486; CHECK-NEXT: local.get 0 487; CHECK-NEXT: local.get 1 488; CHECK-NEXT: i64x2.shl 489; CHECK-NEXT: # fallthrough-return 490 %z = and i32 %x, 63 491 %m = zext i32 %z to i64 492 %t = insertelement <2 x i64> undef, i64 %m, i32 0 493 %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0> 494 %a = shl <2 x i64> %v, %s 495 ret <2 x i64> %a 496} 497 498define <2 x i64> @shl_v2i64_i32_late(<2 x i64> %v, i32 %x) { 499; CHECK-LABEL: shl_v2i64_i32_late: 500; CHECK: .functype shl_v2i64_i32_late (v128, i32) -> (v128) 501; CHECK-NEXT: # %bb.0: 502; CHECK-NEXT: local.get 0 503; CHECK-NEXT: local.get 1 504; CHECK-NEXT: i64x2.shl 505; CHECK-NEXT: # fallthrough-return 506 %z = zext i32 %x to i64 507 %t = insertelement <2 x i64> undef, i64 %z, i32 0 508 %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0> 509 %m = and <2 x i64> %s, <i64 63, i64 63> 510 %a = shl <2 x i64> %v, %m 511 ret <2 x i64> %a 512} 513 514define <2 x i64> @ashr_v2i64_i32(<2 x i64> %v, i32 %x) { 515; CHECK-LABEL: ashr_v2i64_i32: 516; CHECK: .functype ashr_v2i64_i32 (v128, i32) -> (v128) 517; CHECK-NEXT: # %bb.0: 518; CHECK-NEXT: local.get 0 519; CHECK-NEXT: local.get 1 520; CHECK-NEXT: i64x2.shr_s 521; CHECK-NEXT: # fallthrough-return 522 %z = and i32 %x, 63 523 %m = zext i32 %z to i64 524 %t = insertelement <2 x i64> undef, i64 %m, i32 0 525 %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0> 526 %a = ashr <2 x i64> %v, %s 527 ret <2 x i64> %a 528} 529 530define <2 x i64> @ashr_v2i64_i32_late(<2 x i64> %v, i32 %x) { 531; CHECK-LABEL: ashr_v2i64_i32_late: 532; CHECK: .functype ashr_v2i64_i32_late (v128, i32) -> (v128) 533; CHECK-NEXT: # %bb.0: 534; CHECK-NEXT: local.get 0 535; CHECK-NEXT: local.get 1 536; CHECK-NEXT: i64x2.shr_s 537; CHECK-NEXT: # fallthrough-return 538 %z = zext i32 %x to i64 539 %t = insertelement <2 x i64> undef, i64 %z, i32 0 540 %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0> 541 %m = and <2 x i64> %s, <i64 63, i64 63> 542 %a = ashr <2 x i64> %v, %m 543 ret <2 x i64> %a 544} 545 546define <2 x i64> @lshr_v2i64_i32(<2 x i64> %v, i32 %x) { 547; CHECK-LABEL: lshr_v2i64_i32: 548; CHECK: .functype lshr_v2i64_i32 (v128, i32) -> (v128) 549; CHECK-NEXT: # %bb.0: 550; CHECK-NEXT: local.get 0 551; CHECK-NEXT: local.get 1 552; CHECK-NEXT: i64x2.shr_u 553; CHECK-NEXT: # fallthrough-return 554 %z = and i32 %x, 63 555 %m = zext i32 %z to i64 556 %t = insertelement <2 x i64> undef, i64 %m, i32 0 557 %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0> 558 %a = lshr <2 x i64> %v, %s 559 ret <2 x i64> %a 560} 561 562define <2 x i64> @lshr_v2i64_i32_late(<2 x i64> %v, i32 %x) { 563; CHECK-LABEL: lshr_v2i64_i32_late: 564; CHECK: .functype lshr_v2i64_i32_late (v128, i32) -> (v128) 565; CHECK-NEXT: # %bb.0: 566; CHECK-NEXT: local.get 0 567; CHECK-NEXT: local.get 1 568; CHECK-NEXT: i64x2.shr_u 569; CHECK-NEXT: # fallthrough-return 570 %z = zext i32 %x to i64 571 %t = insertelement <2 x i64> undef, i64 %z, i32 0 572 %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0> 573 %m = and <2 x i64> %s, <i64 63, i64 63> 574 %a = lshr <2 x i64> %v, %m 575 ret <2 x i64> %a 576} 577