181 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; Test that a vector trunc correctly optimizes and lowers to narrow instructions5 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 v12812; CHECK-NEXT: # %bb.0: # %entry13; CHECK-NEXT: local.get 014; CHECK-NEXT: v128.const 255, 25515; CHECK-NEXT: local.tee 816; CHECK-NEXT: v128.and17; CHECK-NEXT: local.get 118; CHECK-NEXT: local.get 819; CHECK-NEXT: v128.and20; CHECK-NEXT: i16x8.narrow_i32x4_u21; CHECK-NEXT: local.get 222; CHECK-NEXT: local.get 823; CHECK-NEXT: v128.and24; CHECK-NEXT: local.get 325; CHECK-NEXT: local.get 826; CHECK-NEXT: v128.and27; CHECK-NEXT: i16x8.narrow_i32x4_u28; CHECK-NEXT: i16x8.narrow_i32x4_u29; CHECK-NEXT: local.get 430; CHECK-NEXT: local.get 831; CHECK-NEXT: v128.and32; CHECK-NEXT: local.get 533; CHECK-NEXT: local.get 834; CHECK-NEXT: v128.and35; CHECK-NEXT: i16x8.narrow_i32x4_u36; CHECK-NEXT: local.get 637; CHECK-NEXT: local.get 838; CHECK-NEXT: v128.and39; CHECK-NEXT: local.get 740; CHECK-NEXT: local.get 841; CHECK-NEXT: v128.and42; CHECK-NEXT: i16x8.narrow_i32x4_u43; CHECK-NEXT: i16x8.narrow_i32x4_u44; CHECK-NEXT: i8x16.narrow_i16x8_u45; CHECK-NEXT: # fallthrough-return46entry:47 %0 = trunc <16 x i64> %a to <16 x i8>48 ret <16 x i8> %049}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 v12855; CHECK-NEXT: # %bb.0: # %entry56; CHECK-NEXT: local.get 057; CHECK-NEXT: v128.const 255, 255, 255, 25558; CHECK-NEXT: local.tee 459; CHECK-NEXT: v128.and60; CHECK-NEXT: local.get 161; CHECK-NEXT: local.get 462; CHECK-NEXT: v128.and63; CHECK-NEXT: i16x8.narrow_i32x4_u64; CHECK-NEXT: local.get 265; CHECK-NEXT: local.get 466; CHECK-NEXT: v128.and67; CHECK-NEXT: local.get 368; CHECK-NEXT: local.get 469; CHECK-NEXT: v128.and70; CHECK-NEXT: i16x8.narrow_i32x4_u71; CHECK-NEXT: i8x16.narrow_i16x8_u72; CHECK-NEXT: # fallthrough-return73entry:74 %0 = trunc <16 x i32> %a to <16 x i8>75 ret <16 x i8> %076}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 v12882; CHECK-NEXT: # %bb.0: # %entry83; CHECK-NEXT: local.get 084; CHECK-NEXT: v128.const 255, 255, 255, 255, 255, 255, 255, 25585; CHECK-NEXT: local.tee 286; CHECK-NEXT: v128.and87; CHECK-NEXT: local.get 188; CHECK-NEXT: local.get 289; CHECK-NEXT: v128.and90; CHECK-NEXT: i8x16.narrow_i16x8_u91; CHECK-NEXT: # fallthrough-return92entry:93 %0 = trunc <16 x i16> %a to <16 x i8>94 ret <16 x i8> %095}96 97define <8 x i8> @trunc8i16_8i8(<8 x i16> %a) {98; CHECK-LABEL: trunc8i16_8i8:99; CHECK: .functype trunc8i16_8i8 (v128) -> (v128)100; CHECK-NEXT: # %bb.0: # %entry101; CHECK-NEXT: local.get 0102; CHECK-NEXT: local.get 0103; CHECK-NEXT: i8x16.shuffle 0, 2, 4, 6, 8, 10, 12, 14, 0, 0, 0, 0, 0, 0, 0, 0104; CHECK-NEXT: # fallthrough-return105entry:106 %0 = trunc <8 x i16> %a to <8 x i8>107 ret <8 x i8> %0108}109 110define <8 x i16> @trunc8i64_8i16(<8 x i64> %a) {111; CHECK-LABEL: trunc8i64_8i16:112; CHECK: .functype trunc8i64_8i16 (v128, v128, v128, v128) -> (v128)113; CHECK-NEXT: .local v128114; CHECK-NEXT: # %bb.0: # %entry115; CHECK-NEXT: local.get 0116; CHECK-NEXT: v128.const 65535, 65535117; CHECK-NEXT: local.tee 4118; CHECK-NEXT: v128.and119; CHECK-NEXT: local.get 1120; CHECK-NEXT: local.get 4121; CHECK-NEXT: v128.and122; CHECK-NEXT: i16x8.narrow_i32x4_u123; CHECK-NEXT: local.get 2124; CHECK-NEXT: local.get 4125; CHECK-NEXT: v128.and126; CHECK-NEXT: local.get 3127; CHECK-NEXT: local.get 4128; CHECK-NEXT: v128.and129; CHECK-NEXT: i16x8.narrow_i32x4_u130; CHECK-NEXT: i16x8.narrow_i32x4_u131; CHECK-NEXT: # fallthrough-return132entry:133 %0 = trunc <8 x i64> %a to <8 x i16>134 ret <8 x i16> %0135}136 137define <8 x i16> @trunc8i32_8i16(<8 x i32> %a) {138; CHECK-LABEL: trunc8i32_8i16:139; CHECK: .functype trunc8i32_8i16 (v128, v128) -> (v128)140; CHECK-NEXT: .local v128141; CHECK-NEXT: # %bb.0: # %entry142; CHECK-NEXT: local.get 0143; CHECK-NEXT: v128.const 65535, 65535, 65535, 65535144; CHECK-NEXT: local.tee 2145; CHECK-NEXT: v128.and146; CHECK-NEXT: local.get 1147; CHECK-NEXT: local.get 2148; CHECK-NEXT: v128.and149; CHECK-NEXT: i16x8.narrow_i32x4_u150; CHECK-NEXT: # fallthrough-return151entry:152 %0 = trunc <8 x i32> %a to <8 x i16>153 ret <8 x i16> %0154}155 156define <4 x i16> @trunc4i32_4i16(<4 x i32> %a) {157; CHECK-LABEL: trunc4i32_4i16:158; CHECK: .functype trunc4i32_4i16 (v128) -> (v128)159; CHECK-NEXT: # %bb.0: # %entry160; CHECK-NEXT: local.get 0161; CHECK-NEXT: local.get 0162; CHECK-NEXT: i8x16.shuffle 0, 1, 4, 5, 8, 9, 12, 13, 0, 1, 0, 1, 0, 1, 0, 1163; CHECK-NEXT: # fallthrough-return164entry:165 %0 = trunc <4 x i32> %a to <4 x i16>166 ret <4 x i16> %0167}168 169define <4 x i8> @trunc4i32_4i8(<4 x i32> %a) {170; CHECK-LABEL: trunc4i32_4i8:171; CHECK: .functype trunc4i32_4i8 (v128) -> (v128)172; CHECK-NEXT: # %bb.0: # %entry173; CHECK-NEXT: local.get 0174; CHECK-NEXT: local.get 0175; CHECK-NEXT: i8x16.shuffle 0, 4, 8, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0176; CHECK-NEXT: # fallthrough-return177entry:178 %0 = trunc <4 x i32> %a to <4 x i8>179 ret <4 x i8> %0180}181