592 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -verify-machineinstrs -mattr=+simd128 | FileCheck %s3 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 013; CHECK-NEXT: local.get 114; CHECK-NEXT: i32.shl15; CHECK-NEXT: # fallthrough-return16 %m = and i32 %x, 3117 %a = shl i32 %v, %m18 ret i32 %a19}20 21define i64 @shl_i64_zext(i64 %v, i32 %x) {22; CHECK-LABEL: shl_i64_zext:23; CHECK: .functype shl_i64_zext (i64, i32) -> (i64)24; CHECK-NEXT: # %bb.0:25; CHECK-NEXT: local.get 026; CHECK-NEXT: local.get 127; CHECK-NEXT: i64.extend_i32_u28; CHECK-NEXT: i64.shl29; CHECK-NEXT: # fallthrough-return30 %m = and i32 %x, 6331 %z = zext i32 %m to i6432 %a = shl i64 %v, %z33 ret i64 %a34}35 36define i32 @sra_i32(i32 %v, i32 %x) {37; CHECK-LABEL: sra_i32:38; CHECK: .functype sra_i32 (i32, i32) -> (i32)39; CHECK-NEXT: # %bb.0:40; CHECK-NEXT: local.get 041; CHECK-NEXT: local.get 142; CHECK-NEXT: i32.shr_s43; CHECK-NEXT: # fallthrough-return44 %m = and i32 %x, 3145 %a = ashr i32 %v, %m46 ret i32 %a47}48 49define i32 @srl_i32(i32 %v, i32 %x) {50; CHECK-LABEL: srl_i32:51; CHECK: .functype srl_i32 (i32, i32) -> (i32)52; CHECK-NEXT: # %bb.0:53; CHECK-NEXT: local.get 054; CHECK-NEXT: local.get 155; CHECK-NEXT: i32.shr_u56; CHECK-NEXT: # fallthrough-return57 %m = and i32 %x, 3158 %a = lshr i32 %v, %m59 ret i32 %a60}61 62define i64 @shl_i64(i64 %v, i64 %x) {63; CHECK-LABEL: shl_i64:64; CHECK: .functype shl_i64 (i64, i64) -> (i64)65; CHECK-NEXT: # %bb.0:66; CHECK-NEXT: local.get 067; CHECK-NEXT: local.get 168; CHECK-NEXT: i64.shl69; CHECK-NEXT: # fallthrough-return70 %m = and i64 %x, 6371 %a = shl i64 %v, %m72 ret i64 %a73}74 75define i64 @sra_i64(i64 %v, i64 %x) {76; CHECK-LABEL: sra_i64:77; CHECK: .functype sra_i64 (i64, i64) -> (i64)78; CHECK-NEXT: # %bb.0:79; CHECK-NEXT: local.get 080; CHECK-NEXT: local.get 181; CHECK-NEXT: i64.shr_s82; CHECK-NEXT: # fallthrough-return83 %m = and i64 %x, 6384 %a = ashr i64 %v, %m85 ret i64 %a86}87 88define i64 @srl_i64(i64 %v, i64 %x) {89; CHECK-LABEL: srl_i64:90; CHECK: .functype srl_i64 (i64, i64) -> (i64)91; CHECK-NEXT: # %bb.0:92; CHECK-NEXT: local.get 093; CHECK-NEXT: local.get 194; CHECK-NEXT: i64.shr_u95; CHECK-NEXT: # fallthrough-return96 %m = and i64 %x, 6397 %a = lshr i64 %v, %m98 ret i64 %a99}100 101define <16 x i8> @shl_v16i8(<16 x i8> %v, i8 %x) {102; CHECK-LABEL: shl_v16i8:103; CHECK: .functype shl_v16i8 (v128, i32) -> (v128)104; CHECK-NEXT: # %bb.0:105; CHECK-NEXT: local.get 0106; CHECK-NEXT: local.get 1107; CHECK-NEXT: i8x16.shl108; CHECK-NEXT: # fallthrough-return109 %m = and i8 %x, 7110 %t = insertelement <16 x i8> undef, i8 %m, i32 0111 %s = shufflevector <16 x i8> %t, <16 x i8> undef,112 <16 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0,113 i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>114 %a = shl <16 x i8> %v, %s115 ret <16 x i8> %a116}117 118define <16 x i8> @shl_v16i8_late(<16 x i8> %v, i8 %x) {119; CHECK-LABEL: shl_v16i8_late:120; CHECK: .functype shl_v16i8_late (v128, i32) -> (v128)121; CHECK-NEXT: # %bb.0:122; CHECK-NEXT: local.get 0123; CHECK-NEXT: local.get 1124; CHECK-NEXT: i8x16.shl125; CHECK-NEXT: # fallthrough-return126 %t = insertelement <16 x i8> undef, i8 %x, i32 0127 %s = shufflevector <16 x i8> %t, <16 x i8> undef,128 <16 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0,129 i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>130 %m = and <16 x i8> %s, <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7,131 i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>132 %a = shl <16 x i8> %v, %m133 ret <16 x i8> %a134}135 136define <16 x i8> @ashr_v16i8(<16 x i8> %v, i8 %x) {137; CHECK-LABEL: ashr_v16i8:138; CHECK: .functype ashr_v16i8 (v128, i32) -> (v128)139; CHECK-NEXT: # %bb.0:140; CHECK-NEXT: local.get 0141; CHECK-NEXT: local.get 1142; CHECK-NEXT: i8x16.shr_s143; CHECK-NEXT: # fallthrough-return144 %m = and i8 %x, 7145 %t = insertelement <16 x i8> undef, i8 %m, i32 0146 %s = shufflevector <16 x i8> %t, <16 x i8> undef,147 <16 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0,148 i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>149 %a = ashr <16 x i8> %v, %s150 ret <16 x i8> %a151}152 153define <16 x i8> @ashr_v16i8_late(<16 x i8> %v, i8 %x) {154; CHECK-LABEL: ashr_v16i8_late:155; CHECK: .functype ashr_v16i8_late (v128, i32) -> (v128)156; CHECK-NEXT: # %bb.0:157; CHECK-NEXT: local.get 0158; CHECK-NEXT: local.get 1159; CHECK-NEXT: i8x16.shr_s160; CHECK-NEXT: # fallthrough-return161 %t = insertelement <16 x i8> undef, i8 %x, i32 0162 %s = shufflevector <16 x i8> %t, <16 x i8> undef,163 <16 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0,164 i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>165 %m = and <16 x i8> %s, <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7,166 i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>167 %a = ashr <16 x i8> %v, %m168 ret <16 x i8> %a169}170 171define <16 x i8> @lshr_v16i8(<16 x i8> %v, i8 %x) {172; CHECK-LABEL: lshr_v16i8:173; CHECK: .functype lshr_v16i8 (v128, i32) -> (v128)174; CHECK-NEXT: # %bb.0:175; CHECK-NEXT: local.get 0176; CHECK-NEXT: local.get 1177; CHECK-NEXT: i8x16.shr_u178; CHECK-NEXT: # fallthrough-return179 %m = and i8 %x, 7180 %t = insertelement <16 x i8> undef, i8 %m, i32 0181 %s = shufflevector <16 x i8> %t, <16 x i8> undef,182 <16 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0,183 i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>184 %a = lshr <16 x i8> %v, %s185 ret <16 x i8> %a186}187 188define <16 x i8> @lshr_v16i8_late(<16 x i8> %v, i8 %x) {189; CHECK-LABEL: lshr_v16i8_late:190; CHECK: .functype lshr_v16i8_late (v128, i32) -> (v128)191; CHECK-NEXT: # %bb.0:192; CHECK-NEXT: local.get 0193; CHECK-NEXT: local.get 1194; CHECK-NEXT: i8x16.shr_u195; CHECK-NEXT: # fallthrough-return196 %t = insertelement <16 x i8> undef, i8 %x, i32 0197 %s = shufflevector <16 x i8> %t, <16 x i8> undef,198 <16 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0,199 i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>200 %m = and <16 x i8> %s, <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7,201 i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>202 %a = lshr <16 x i8> %v, %m203 ret <16 x i8> %a204}205 206define <8 x i16> @shl_v8i16(<8 x i16> %v, i16 %x) {207; CHECK-LABEL: shl_v8i16:208; CHECK: .functype shl_v8i16 (v128, i32) -> (v128)209; CHECK-NEXT: # %bb.0:210; CHECK-NEXT: local.get 0211; CHECK-NEXT: local.get 1212; CHECK-NEXT: i16x8.shl213; CHECK-NEXT: # fallthrough-return214 %m = and i16 %x, 15215 %t = insertelement <8 x i16> undef, i16 %m, i32 0216 %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 %a = shl <8 x i16> %v, %s219 ret <8 x i16> %a220}221 222define <8 x i16> @shl_v8i16_late(<8 x i16> %v, i16 %x) {223; CHECK-LABEL: shl_v8i16_late:224; CHECK: .functype shl_v8i16_late (v128, i32) -> (v128)225; CHECK-NEXT: # %bb.0:226; CHECK-NEXT: local.get 0227; CHECK-NEXT: local.get 1228; CHECK-NEXT: i16x8.shl229; CHECK-NEXT: # fallthrough-return230 %t = insertelement <8 x i16> undef, i16 %x, i32 0231 %s = shufflevector <8 x i16> %t, <8 x i16> undef,232 <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>233 %m = and <8 x i16> %s,234 <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>235 %a = shl <8 x i16> %v, %m236 ret <8 x i16> %a237}238 239define <8 x i16> @ashr_v8i16(<8 x i16> %v, i16 %x) {240; CHECK-LABEL: ashr_v8i16:241; CHECK: .functype ashr_v8i16 (v128, i32) -> (v128)242; CHECK-NEXT: # %bb.0:243; CHECK-NEXT: local.get 0244; CHECK-NEXT: local.get 1245; CHECK-NEXT: i16x8.shr_s246; CHECK-NEXT: # fallthrough-return247 %m = and i16 %x, 15248 %t = insertelement <8 x i16> undef, i16 %m, i32 0249 %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 %a = ashr <8 x i16> %v, %s252 ret <8 x i16> %a253}254 255define <8 x i16> @ashr_v8i16_late(<8 x i16> %v, i16 %x) {256; CHECK-LABEL: ashr_v8i16_late:257; CHECK: .functype ashr_v8i16_late (v128, i32) -> (v128)258; CHECK-NEXT: # %bb.0:259; CHECK-NEXT: local.get 0260; CHECK-NEXT: local.get 1261; CHECK-NEXT: i16x8.shr_s262; CHECK-NEXT: # fallthrough-return263 %t = insertelement <8 x i16> undef, i16 %x, i32 0264 %s = shufflevector <8 x i16> %t, <8 x i16> undef,265 <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>266 %m = and <8 x i16> %s,267 <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>268 %a = ashr <8 x i16> %v, %m269 ret <8 x i16> %a270}271 272define <8 x i16> @lshr_v8i16(<8 x i16> %v, i16 %x) {273; CHECK-LABEL: lshr_v8i16:274; CHECK: .functype lshr_v8i16 (v128, i32) -> (v128)275; CHECK-NEXT: # %bb.0:276; CHECK-NEXT: local.get 0277; CHECK-NEXT: local.get 1278; CHECK-NEXT: i16x8.shr_u279; CHECK-NEXT: # fallthrough-return280 %m = and i16 %x, 15281 %t = insertelement <8 x i16> undef, i16 %m, i32 0282 %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 %a = lshr <8 x i16> %v, %s285 ret <8 x i16> %a286}287 288define <8 x i16> @lshr_v8i16_late(<8 x i16> %v, i16 %x) {289; CHECK-LABEL: lshr_v8i16_late:290; CHECK: .functype lshr_v8i16_late (v128, i32) -> (v128)291; CHECK-NEXT: # %bb.0:292; CHECK-NEXT: local.get 0293; CHECK-NEXT: local.get 1294; CHECK-NEXT: i16x8.shr_u295; CHECK-NEXT: # fallthrough-return296 %t = insertelement <8 x i16> undef, i16 %x, i32 0297 %s = shufflevector <8 x i16> %t, <8 x i16> undef,298 <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>299 %m = and <8 x i16> %s,300 <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>301 %a = lshr <8 x i16> %v, %m302 ret <8 x i16> %a303}304 305define <4 x i32> @shl_v4i32(<4 x i32> %v, i32 %x) {306; CHECK-LABEL: shl_v4i32:307; CHECK: .functype shl_v4i32 (v128, i32) -> (v128)308; CHECK-NEXT: # %bb.0:309; CHECK-NEXT: local.get 0310; CHECK-NEXT: local.get 1311; CHECK-NEXT: i32x4.shl312; CHECK-NEXT: # fallthrough-return313 %m = and i32 %x, 31314 %t = insertelement <4 x i32> undef, i32 %m, i32 0315 %s = shufflevector <4 x i32> %t, <4 x i32> undef,316 <4 x i32> <i32 0, i32 0, i32 0, i32 0>317 %a = shl <4 x i32> %v, %s318 ret <4 x i32> %a319}320 321define <4 x i32> @shl_v4i32_late(<4 x i32> %v, i32 %x) {322; CHECK-LABEL: shl_v4i32_late:323; CHECK: .functype shl_v4i32_late (v128, i32) -> (v128)324; CHECK-NEXT: # %bb.0:325; CHECK-NEXT: local.get 0326; CHECK-NEXT: local.get 1327; CHECK-NEXT: i32x4.shl328; CHECK-NEXT: # fallthrough-return329 %t = insertelement <4 x i32> undef, i32 %x, i32 0330 %s = shufflevector <4 x i32> %t, <4 x i32> undef,331 <4 x i32> <i32 0, i32 0, i32 0, i32 0>332 %m = and <4 x i32> %s, <i32 31, i32 31, i32 31, i32 31>333 %a = shl <4 x i32> %v, %m334 ret <4 x i32> %a335}336 337define <4 x i32> @ashr_v4i32(<4 x i32> %v, i32 %x) {338; CHECK-LABEL: ashr_v4i32:339; CHECK: .functype ashr_v4i32 (v128, i32) -> (v128)340; CHECK-NEXT: # %bb.0:341; CHECK-NEXT: local.get 0342; CHECK-NEXT: local.get 1343; CHECK-NEXT: i32x4.shr_s344; CHECK-NEXT: # fallthrough-return345 %m = and i32 %x, 31346 %t = insertelement <4 x i32> undef, i32 %m, i32 0347 %s = shufflevector <4 x i32> %t, <4 x i32> undef,348 <4 x i32> <i32 0, i32 0, i32 0, i32 0>349 %a = ashr <4 x i32> %v, %s350 ret <4 x i32> %a351}352 353define <4 x i32> @ashr_v4i32_late(<4 x i32> %v, i32 %x) {354; CHECK-LABEL: ashr_v4i32_late:355; CHECK: .functype ashr_v4i32_late (v128, i32) -> (v128)356; CHECK-NEXT: # %bb.0:357; CHECK-NEXT: local.get 0358; CHECK-NEXT: local.get 1359; CHECK-NEXT: i32x4.shr_s360; CHECK-NEXT: # fallthrough-return361 %t = insertelement <4 x i32> undef, i32 %x, i32 0362 %s = shufflevector <4 x i32> %t, <4 x i32> undef,363 <4 x i32> <i32 0, i32 0, i32 0, i32 0>364 %m = and <4 x i32> %s, <i32 31, i32 31, i32 31, i32 31>365 %a = ashr <4 x i32> %v, %m366 ret <4 x i32> %a367}368 369define <4 x i32> @lshr_v4i32(<4 x i32> %v, i32 %x) {370; CHECK-LABEL: lshr_v4i32:371; CHECK: .functype lshr_v4i32 (v128, i32) -> (v128)372; CHECK-NEXT: # %bb.0:373; CHECK-NEXT: local.get 0374; CHECK-NEXT: local.get 1375; CHECK-NEXT: i32x4.shr_u376; CHECK-NEXT: # fallthrough-return377 %m = and i32 %x, 31378 %t = insertelement <4 x i32> undef, i32 %m, i32 0379 %s = shufflevector <4 x i32> %t, <4 x i32> undef,380 <4 x i32> <i32 0, i32 0, i32 0, i32 0>381 %a = lshr <4 x i32> %v, %s382 ret <4 x i32> %a383}384 385define <4 x i32> @lshr_v4i32_late(<4 x i32> %v, i32 %x) {386; CHECK-LABEL: lshr_v4i32_late:387; CHECK: .functype lshr_v4i32_late (v128, i32) -> (v128)388; CHECK-NEXT: # %bb.0:389; CHECK-NEXT: local.get 0390; CHECK-NEXT: local.get 1391; CHECK-NEXT: i32x4.shr_u392; CHECK-NEXT: # fallthrough-return393 %t = insertelement <4 x i32> undef, i32 %x, i32 0394 %s = shufflevector <4 x i32> %t, <4 x i32> undef,395 <4 x i32> <i32 0, i32 0, i32 0, i32 0>396 %m = and <4 x i32> %s, <i32 31, i32 31, i32 31, i32 31>397 %a = lshr <4 x i32> %v, %m398 ret <4 x i32> %a399}400 401define <2 x i64> @shl_v2i64(<2 x i64> %v, i64 %x) {402; CHECK-LABEL: shl_v2i64:403; CHECK: .functype shl_v2i64 (v128, i64) -> (v128)404; CHECK-NEXT: # %bb.0:405; CHECK-NEXT: local.get 0406; CHECK-NEXT: local.get 1407; CHECK-NEXT: i32.wrap_i64408; CHECK-NEXT: i64x2.shl409; CHECK-NEXT: # fallthrough-return410 %m = and i64 %x, 63411 %t = insertelement <2 x i64> undef, i64 %m, i32 0412 %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0>413 %a = shl <2 x i64> %v, %s414 ret <2 x i64> %a415}416 417define <2 x i64> @shl_v2i64_late(<2 x i64> %v, i64 %x) {418; CHECK-LABEL: shl_v2i64_late:419; CHECK: .functype shl_v2i64_late (v128, i64) -> (v128)420; CHECK-NEXT: # %bb.0:421; CHECK-NEXT: local.get 0422; CHECK-NEXT: local.get 1423; CHECK-NEXT: i32.wrap_i64424; CHECK-NEXT: i64x2.shl425; CHECK-NEXT: # fallthrough-return426 %t = insertelement <2 x i64> undef, i64 %x, i32 0427 %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0>428 %m = and <2 x i64> %s, <i64 63, i64 63>429 %a = shl <2 x i64> %v, %m430 ret <2 x i64> %a431}432 433define <2 x i64> @ashr_v2i64(<2 x i64> %v, i64 %x) {434; CHECK-LABEL: ashr_v2i64:435; CHECK: .functype ashr_v2i64 (v128, i64) -> (v128)436; CHECK-NEXT: # %bb.0:437; CHECK-NEXT: local.get 0438; CHECK-NEXT: local.get 1439; CHECK-NEXT: i32.wrap_i64440; CHECK-NEXT: i64x2.shr_s441; CHECK-NEXT: # fallthrough-return442 %m = and i64 %x, 63443 %t = insertelement <2 x i64> undef, i64 %m, i32 0444 %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0>445 %a = ashr <2 x i64> %v, %s446 ret <2 x i64> %a447}448 449define <2 x i64> @ashr_v2i64_late(<2 x i64> %v, i64 %x) {450; CHECK-LABEL: ashr_v2i64_late:451; CHECK: .functype ashr_v2i64_late (v128, i64) -> (v128)452; CHECK-NEXT: # %bb.0:453; CHECK-NEXT: local.get 0454; CHECK-NEXT: local.get 1455; CHECK-NEXT: i32.wrap_i64456; CHECK-NEXT: i64x2.shr_s457; CHECK-NEXT: # fallthrough-return458 %t = insertelement <2 x i64> undef, i64 %x, i32 0459 %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0>460 %m = and <2 x i64> %s, <i64 63, i64 63>461 %a = ashr <2 x i64> %v, %m462 ret <2 x i64> %a463}464 465define <2 x i64> @lshr_v2i64(<2 x i64> %v, i64 %x) {466; CHECK-LABEL: lshr_v2i64:467; CHECK: .functype lshr_v2i64 (v128, i64) -> (v128)468; CHECK-NEXT: # %bb.0:469; CHECK-NEXT: local.get 0470; CHECK-NEXT: local.get 1471; CHECK-NEXT: i32.wrap_i64472; CHECK-NEXT: i64x2.shr_u473; CHECK-NEXT: # fallthrough-return474 %m = and i64 %x, 63475 %t = insertelement <2 x i64> undef, i64 %m, i32 0476 %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0>477 %a = lshr <2 x i64> %v, %s478 ret <2 x i64> %a479}480 481define <2 x i64> @lshr_v2i64_late(<2 x i64> %v, i64 %x) {482; CHECK-LABEL: lshr_v2i64_late:483; CHECK: .functype lshr_v2i64_late (v128, i64) -> (v128)484; CHECK-NEXT: # %bb.0:485; CHECK-NEXT: local.get 0486; CHECK-NEXT: local.get 1487; CHECK-NEXT: i32.wrap_i64488; CHECK-NEXT: i64x2.shr_u489; CHECK-NEXT: # fallthrough-return490 %t = insertelement <2 x i64> undef, i64 %x, i32 0491 %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0>492 %m = and <2 x i64> %s, <i64 63, i64 63>493 %a = lshr <2 x i64> %v, %m494 ret <2 x i64> %a495}496 497define <2 x i64> @shl_v2i64_i32(<2 x i64> %v, i32 %x) {498; CHECK-LABEL: shl_v2i64_i32:499; CHECK: .functype shl_v2i64_i32 (v128, i32) -> (v128)500; CHECK-NEXT: # %bb.0:501; CHECK-NEXT: local.get 0502; CHECK-NEXT: local.get 1503; CHECK-NEXT: i64x2.shl504; CHECK-NEXT: # fallthrough-return505 %z = and i32 %x, 63506 %m = zext i32 %z to i64507 %t = insertelement <2 x i64> undef, i64 %m, i32 0508 %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0>509 %a = shl <2 x i64> %v, %s510 ret <2 x i64> %a511}512 513define <2 x i64> @shl_v2i64_i32_late(<2 x i64> %v, i32 %x) {514; CHECK-LABEL: shl_v2i64_i32_late:515; CHECK: .functype shl_v2i64_i32_late (v128, i32) -> (v128)516; CHECK-NEXT: # %bb.0:517; CHECK-NEXT: local.get 0518; CHECK-NEXT: local.get 1519; CHECK-NEXT: i64x2.shl520; CHECK-NEXT: # fallthrough-return521 %z = zext i32 %x to i64522 %t = insertelement <2 x i64> undef, i64 %z, i32 0523 %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0>524 %m = and <2 x i64> %s, <i64 63, i64 63>525 %a = shl <2 x i64> %v, %m526 ret <2 x i64> %a527}528 529define <2 x i64> @ashr_v2i64_i32(<2 x i64> %v, i32 %x) {530; CHECK-LABEL: ashr_v2i64_i32:531; CHECK: .functype ashr_v2i64_i32 (v128, i32) -> (v128)532; CHECK-NEXT: # %bb.0:533; CHECK-NEXT: local.get 0534; CHECK-NEXT: local.get 1535; CHECK-NEXT: i64x2.shr_s536; CHECK-NEXT: # fallthrough-return537 %z = and i32 %x, 63538 %m = zext i32 %z to i64539 %t = insertelement <2 x i64> undef, i64 %m, i32 0540 %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0>541 %a = ashr <2 x i64> %v, %s542 ret <2 x i64> %a543}544 545define <2 x i64> @ashr_v2i64_i32_late(<2 x i64> %v, i32 %x) {546; CHECK-LABEL: ashr_v2i64_i32_late:547; CHECK: .functype ashr_v2i64_i32_late (v128, i32) -> (v128)548; CHECK-NEXT: # %bb.0:549; CHECK-NEXT: local.get 0550; CHECK-NEXT: local.get 1551; CHECK-NEXT: i64x2.shr_s552; CHECK-NEXT: # fallthrough-return553 %z = zext i32 %x to i64554 %t = insertelement <2 x i64> undef, i64 %z, i32 0555 %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0>556 %m = and <2 x i64> %s, <i64 63, i64 63>557 %a = ashr <2 x i64> %v, %m558 ret <2 x i64> %a559}560 561define <2 x i64> @lshr_v2i64_i32(<2 x i64> %v, i32 %x) {562; CHECK-LABEL: lshr_v2i64_i32:563; CHECK: .functype lshr_v2i64_i32 (v128, i32) -> (v128)564; CHECK-NEXT: # %bb.0:565; CHECK-NEXT: local.get 0566; CHECK-NEXT: local.get 1567; CHECK-NEXT: i64x2.shr_u568; CHECK-NEXT: # fallthrough-return569 %z = and i32 %x, 63570 %m = zext i32 %z to i64571 %t = insertelement <2 x i64> undef, i64 %m, i32 0572 %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0>573 %a = lshr <2 x i64> %v, %s574 ret <2 x i64> %a575}576 577define <2 x i64> @lshr_v2i64_i32_late(<2 x i64> %v, i32 %x) {578; CHECK-LABEL: lshr_v2i64_i32_late:579; CHECK: .functype lshr_v2i64_i32_late (v128, i32) -> (v128)580; CHECK-NEXT: # %bb.0:581; CHECK-NEXT: local.get 0582; CHECK-NEXT: local.get 1583; CHECK-NEXT: i64x2.shr_u584; CHECK-NEXT: # fallthrough-return585 %z = zext i32 %x to i64586 %t = insertelement <2 x i64> undef, i64 %z, i32 0587 %s = shufflevector <2 x i64> %t, <2 x i64> undef, <2 x i32> <i32 0, i32 0>588 %m = and <2 x i64> %s, <i64 63, i64 63>589 %a = lshr <2 x i64> %v, %m590 ret <2 x i64> %a591}592