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