1*61521a5aSJing Bao; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2*61521a5aSJing Bao; RUN: llc < %s -verify-machineinstrs -mattr=+simd128 | FileCheck %s 3*61521a5aSJing Bao 4*61521a5aSJing Bao; Test that a vector trunc correctly optimizes and lowers to narrow instructions 5*61521a5aSJing Bao 6*61521a5aSJing Baotarget triple = "wasm32-unknown-unknown" 7*61521a5aSJing Bao 8*61521a5aSJing Baodefine <16 x i8> @trunc16i64_16i8(<16 x i64> %a) { 9*61521a5aSJing Bao; CHECK-LABEL: trunc16i64_16i8: 10*61521a5aSJing Bao; CHECK: .functype trunc16i64_16i8 (v128, v128, v128, v128, v128, v128, v128, v128) -> (v128) 11*61521a5aSJing Bao; CHECK-NEXT: .local v128 12*61521a5aSJing Bao; CHECK-NEXT: # %bb.0: # %entry 13*61521a5aSJing Bao; CHECK-NEXT: local.get 0 14*61521a5aSJing Bao; CHECK-NEXT: v128.const 255, 255 15*61521a5aSJing Bao; CHECK-NEXT: local.tee 8 16*61521a5aSJing Bao; CHECK-NEXT: v128.and 17*61521a5aSJing Bao; CHECK-NEXT: local.get 1 18*61521a5aSJing Bao; CHECK-NEXT: local.get 8 19*61521a5aSJing Bao; CHECK-NEXT: v128.and 20*61521a5aSJing Bao; CHECK-NEXT: i16x8.narrow_i32x4_u 21*61521a5aSJing Bao; CHECK-NEXT: local.get 2 22*61521a5aSJing Bao; CHECK-NEXT: local.get 8 23*61521a5aSJing Bao; CHECK-NEXT: v128.and 24*61521a5aSJing Bao; CHECK-NEXT: local.get 3 25*61521a5aSJing Bao; CHECK-NEXT: local.get 8 26*61521a5aSJing Bao; CHECK-NEXT: v128.and 27*61521a5aSJing Bao; CHECK-NEXT: i16x8.narrow_i32x4_u 28*61521a5aSJing Bao; CHECK-NEXT: i16x8.narrow_i32x4_u 29*61521a5aSJing Bao; CHECK-NEXT: local.get 4 30*61521a5aSJing Bao; CHECK-NEXT: local.get 8 31*61521a5aSJing Bao; CHECK-NEXT: v128.and 32*61521a5aSJing Bao; CHECK-NEXT: local.get 5 33*61521a5aSJing Bao; CHECK-NEXT: local.get 8 34*61521a5aSJing Bao; CHECK-NEXT: v128.and 35*61521a5aSJing Bao; CHECK-NEXT: i16x8.narrow_i32x4_u 36*61521a5aSJing Bao; CHECK-NEXT: local.get 6 37*61521a5aSJing Bao; CHECK-NEXT: local.get 8 38*61521a5aSJing Bao; CHECK-NEXT: v128.and 39*61521a5aSJing Bao; CHECK-NEXT: local.get 7 40*61521a5aSJing Bao; CHECK-NEXT: local.get 8 41*61521a5aSJing Bao; CHECK-NEXT: v128.and 42*61521a5aSJing Bao; CHECK-NEXT: i16x8.narrow_i32x4_u 43*61521a5aSJing Bao; CHECK-NEXT: i16x8.narrow_i32x4_u 44*61521a5aSJing Bao; CHECK-NEXT: i8x16.narrow_i16x8_u 45*61521a5aSJing Bao; CHECK-NEXT: # fallthrough-return 46*61521a5aSJing Baoentry: 47*61521a5aSJing Bao %0 = trunc <16 x i64> %a to <16 x i8> 48*61521a5aSJing Bao ret <16 x i8> %0 49*61521a5aSJing Bao} 50*61521a5aSJing Bao 51*61521a5aSJing Baodefine <16 x i8> @trunc16i32_16i8(<16 x i32> %a) { 52*61521a5aSJing Bao; CHECK-LABEL: trunc16i32_16i8: 53*61521a5aSJing Bao; CHECK: .functype trunc16i32_16i8 (v128, v128, v128, v128) -> (v128) 54*61521a5aSJing Bao; CHECK-NEXT: .local v128 55*61521a5aSJing Bao; CHECK-NEXT: # %bb.0: # %entry 56*61521a5aSJing Bao; CHECK-NEXT: local.get 0 57*61521a5aSJing Bao; CHECK-NEXT: v128.const 255, 255, 255, 255 58*61521a5aSJing Bao; CHECK-NEXT: local.tee 4 59*61521a5aSJing Bao; CHECK-NEXT: v128.and 60*61521a5aSJing Bao; CHECK-NEXT: local.get 1 61*61521a5aSJing Bao; CHECK-NEXT: local.get 4 62*61521a5aSJing Bao; CHECK-NEXT: v128.and 63*61521a5aSJing Bao; CHECK-NEXT: i16x8.narrow_i32x4_u 64*61521a5aSJing Bao; CHECK-NEXT: local.get 2 65*61521a5aSJing Bao; CHECK-NEXT: local.get 4 66*61521a5aSJing Bao; CHECK-NEXT: v128.and 67*61521a5aSJing Bao; CHECK-NEXT: local.get 3 68*61521a5aSJing Bao; CHECK-NEXT: local.get 4 69*61521a5aSJing Bao; CHECK-NEXT: v128.and 70*61521a5aSJing Bao; CHECK-NEXT: i16x8.narrow_i32x4_u 71*61521a5aSJing Bao; CHECK-NEXT: i8x16.narrow_i16x8_u 72*61521a5aSJing Bao; CHECK-NEXT: # fallthrough-return 73*61521a5aSJing Baoentry: 74*61521a5aSJing Bao %0 = trunc <16 x i32> %a to <16 x i8> 75*61521a5aSJing Bao ret <16 x i8> %0 76*61521a5aSJing Bao} 77*61521a5aSJing Bao 78*61521a5aSJing Baodefine <16 x i8> @trunc16i16_16i8(<16 x i16> %a) { 79*61521a5aSJing Bao; CHECK-LABEL: trunc16i16_16i8: 80*61521a5aSJing Bao; CHECK: .functype trunc16i16_16i8 (v128, v128) -> (v128) 81*61521a5aSJing Bao; CHECK-NEXT: .local v128 82*61521a5aSJing Bao; CHECK-NEXT: # %bb.0: # %entry 83*61521a5aSJing Bao; CHECK-NEXT: local.get 0 84*61521a5aSJing Bao; CHECK-NEXT: v128.const 255, 255, 255, 255, 255, 255, 255, 255 85*61521a5aSJing Bao; CHECK-NEXT: local.tee 2 86*61521a5aSJing Bao; CHECK-NEXT: v128.and 87*61521a5aSJing Bao; CHECK-NEXT: local.get 1 88*61521a5aSJing Bao; CHECK-NEXT: local.get 2 89*61521a5aSJing Bao; CHECK-NEXT: v128.and 90*61521a5aSJing Bao; CHECK-NEXT: i8x16.narrow_i16x8_u 91*61521a5aSJing Bao; CHECK-NEXT: # fallthrough-return 92*61521a5aSJing Baoentry: 93*61521a5aSJing Bao %0 = trunc <16 x i16> %a to <16 x i8> 94*61521a5aSJing Bao ret <16 x i8> %0 95*61521a5aSJing Bao} 96*61521a5aSJing Bao 97*61521a5aSJing Baodefine <8 x i16> @trunc8i64_8i16(<8 x i64> %a) { 98*61521a5aSJing Bao; CHECK-LABEL: trunc8i64_8i16: 99*61521a5aSJing Bao; CHECK: .functype trunc8i64_8i16 (v128, v128, v128, v128) -> (v128) 100*61521a5aSJing Bao; CHECK-NEXT: .local v128 101*61521a5aSJing Bao; CHECK-NEXT: # %bb.0: # %entry 102*61521a5aSJing Bao; CHECK-NEXT: local.get 0 103*61521a5aSJing Bao; CHECK-NEXT: v128.const 65535, 65535 104*61521a5aSJing Bao; CHECK-NEXT: local.tee 4 105*61521a5aSJing Bao; CHECK-NEXT: v128.and 106*61521a5aSJing Bao; CHECK-NEXT: local.get 1 107*61521a5aSJing Bao; CHECK-NEXT: local.get 4 108*61521a5aSJing Bao; CHECK-NEXT: v128.and 109*61521a5aSJing Bao; CHECK-NEXT: i16x8.narrow_i32x4_u 110*61521a5aSJing Bao; CHECK-NEXT: local.get 2 111*61521a5aSJing Bao; CHECK-NEXT: local.get 4 112*61521a5aSJing Bao; CHECK-NEXT: v128.and 113*61521a5aSJing Bao; CHECK-NEXT: local.get 3 114*61521a5aSJing Bao; CHECK-NEXT: local.get 4 115*61521a5aSJing Bao; CHECK-NEXT: v128.and 116*61521a5aSJing Bao; CHECK-NEXT: i16x8.narrow_i32x4_u 117*61521a5aSJing Bao; CHECK-NEXT: i16x8.narrow_i32x4_u 118*61521a5aSJing Bao; CHECK-NEXT: # fallthrough-return 119*61521a5aSJing Baoentry: 120*61521a5aSJing Bao %0 = trunc <8 x i64> %a to <8 x i16> 121*61521a5aSJing Bao ret <8 x i16> %0 122*61521a5aSJing Bao} 123*61521a5aSJing Bao 124*61521a5aSJing Baodefine <8 x i16> @trunc8i32_8i16(<8 x i32> %a) { 125*61521a5aSJing Bao; CHECK-LABEL: trunc8i32_8i16: 126*61521a5aSJing Bao; CHECK: .functype trunc8i32_8i16 (v128, v128) -> (v128) 127*61521a5aSJing Bao; CHECK-NEXT: .local v128 128*61521a5aSJing Bao; CHECK-NEXT: # %bb.0: # %entry 129*61521a5aSJing Bao; CHECK-NEXT: local.get 0 130*61521a5aSJing Bao; CHECK-NEXT: v128.const 65535, 65535, 65535, 65535 131*61521a5aSJing Bao; CHECK-NEXT: local.tee 2 132*61521a5aSJing Bao; CHECK-NEXT: v128.and 133*61521a5aSJing Bao; CHECK-NEXT: local.get 1 134*61521a5aSJing Bao; CHECK-NEXT: local.get 2 135*61521a5aSJing Bao; CHECK-NEXT: v128.and 136*61521a5aSJing Bao; CHECK-NEXT: i16x8.narrow_i32x4_u 137*61521a5aSJing Bao; CHECK-NEXT: # fallthrough-return 138*61521a5aSJing Baoentry: 139*61521a5aSJing Bao %0 = trunc <8 x i32> %a to <8 x i16> 140*61521a5aSJing Bao ret <8 x i16> %0 141*61521a5aSJing Bao} 142