brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.8 KiB · 1f7fc15 Raw
168 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=avx512vl | FileCheck %s --check-prefixes=AVX512VL3; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=avx512vl,avx512dq,avx512bw | FileCheck %s --check-prefixes=AVX512VLDQBW4 5; This test makes sure we don't use movmsk instructions when masked compares6; would be better. The use of the getmant intrinsic introduces a convertion7; scalar to vXi1 late after movmsk has been formed. Requiring it to be reversed.8 9declare <2 x double> @llvm.x86.avx512.mask.getmant.pd.128(<2 x double>, i32, <2 x double>, i8)10declare <4 x double> @llvm.x86.avx512.mask.getmant.pd.256(<4 x double>, i32, <4 x double>, i8)11declare <8 x double> @llvm.x86.avx512.mask.getmant.pd.512(<8 x double>, i32, <8 x double>, i8, i32)12declare <16 x float> @llvm.x86.avx512.mask.getmant.ps.512(<16 x float>, i32, <16 x float>, i16, i32)13 14define <2 x double> @movmsk2(<2 x double> %x0, <2 x double> %x2, <2 x i64> %mask) {15; AVX512VL-LABEL: movmsk2:16; AVX512VL:       ## %bb.0:17; AVX512VL-NEXT:    vpxor %xmm3, %xmm3, %xmm318; AVX512VL-NEXT:    vpcmpgtq %xmm2, %xmm3, %k119; AVX512VL-NEXT:    vgetmantpd $11, %xmm0, %xmm1 {%k1}20; AVX512VL-NEXT:    vmovapd %xmm1, %xmm021; AVX512VL-NEXT:    retq22;23; AVX512VLDQBW-LABEL: movmsk2:24; AVX512VLDQBW:       ## %bb.0:25; AVX512VLDQBW-NEXT:    vpmovq2m %xmm2, %k126; AVX512VLDQBW-NEXT:    vgetmantpd $11, %xmm0, %xmm1 {%k1}27; AVX512VLDQBW-NEXT:    vmovapd %xmm1, %xmm028; AVX512VLDQBW-NEXT:    retq29  %a = icmp slt <2 x i64> %mask, zeroinitializer30  %b = bitcast <2 x i1> %a to i231  %c = zext i2 %b to i832  %res = call <2 x double> @llvm.x86.avx512.mask.getmant.pd.128(<2 x double> %x0, i32 11, <2 x double> %x2, i8 %c)33  ret <2 x double> %res34}35 36define <4 x double> @movmsk4(<4 x double> %x0, <4 x double> %x2, <4 x i32> %mask) {37; AVX512VL-LABEL: movmsk4:38; AVX512VL:       ## %bb.0:39; AVX512VL-NEXT:    vpxor %xmm3, %xmm3, %xmm340; AVX512VL-NEXT:    vpcmpgtd %xmm2, %xmm3, %k141; AVX512VL-NEXT:    vgetmantpd $11, %ymm0, %ymm1 {%k1}42; AVX512VL-NEXT:    vmovapd %ymm1, %ymm043; AVX512VL-NEXT:    retq44;45; AVX512VLDQBW-LABEL: movmsk4:46; AVX512VLDQBW:       ## %bb.0:47; AVX512VLDQBW-NEXT:    vpmovd2m %xmm2, %k148; AVX512VLDQBW-NEXT:    vgetmantpd $11, %ymm0, %ymm1 {%k1}49; AVX512VLDQBW-NEXT:    vmovapd %ymm1, %ymm050; AVX512VLDQBW-NEXT:    retq51  %a = icmp slt <4 x i32> %mask, zeroinitializer52  %b = bitcast <4 x i1> %a to i453  %c = zext i4 %b to i854  %res = call <4 x double> @llvm.x86.avx512.mask.getmant.pd.256(<4 x double> %x0, i32 11, <4 x double> %x2, i8 %c)55  ret <4 x double> %res56}57 58define <8 x double> @movmsk8(<8 x double> %x0, <8 x double> %x2, <8 x i32> %mask) {59; AVX512VL-LABEL: movmsk8:60; AVX512VL:       ## %bb.0:61; AVX512VL-NEXT:    vpxor %xmm3, %xmm3, %xmm362; AVX512VL-NEXT:    vpcmpgtd %ymm2, %ymm3, %k163; AVX512VL-NEXT:    vgetmantpd $11, %zmm0, %zmm1 {%k1}64; AVX512VL-NEXT:    vmovapd %zmm1, %zmm065; AVX512VL-NEXT:    retq66;67; AVX512VLDQBW-LABEL: movmsk8:68; AVX512VLDQBW:       ## %bb.0:69; AVX512VLDQBW-NEXT:    vpmovd2m %ymm2, %k170; AVX512VLDQBW-NEXT:    vgetmantpd $11, %zmm0, %zmm1 {%k1}71; AVX512VLDQBW-NEXT:    vmovapd %zmm1, %zmm072; AVX512VLDQBW-NEXT:    retq73  %a = icmp slt <8 x i32> %mask, zeroinitializer74  %b = bitcast <8 x i1> %a to i875  %res = call <8 x double> @llvm.x86.avx512.mask.getmant.pd.512(<8 x double> %x0, i32 11, <8 x double> %x2, i8 %b, i32 4)76  ret <8 x double> %res77}78 79define <16 x float> @movmsk16(<16 x float> %x0, <16 x float> %x2, <16 x i8> %mask) {80; AVX512VL-LABEL: movmsk16:81; AVX512VL:       ## %bb.0:82; AVX512VL-NEXT:    vpmovmskb %xmm2, %eax83; AVX512VL-NEXT:    kmovw %eax, %k184; AVX512VL-NEXT:    vgetmantps $11, %zmm0, %zmm1 {%k1}85; AVX512VL-NEXT:    vmovaps %zmm1, %zmm086; AVX512VL-NEXT:    retq87;88; AVX512VLDQBW-LABEL: movmsk16:89; AVX512VLDQBW:       ## %bb.0:90; AVX512VLDQBW-NEXT:    vpmovb2m %xmm2, %k191; AVX512VLDQBW-NEXT:    vgetmantps $11, %zmm0, %zmm1 {%k1}92; AVX512VLDQBW-NEXT:    vmovaps %zmm1, %zmm093; AVX512VLDQBW-NEXT:    retq94  %a = icmp slt <16 x i8> %mask, zeroinitializer95  %b = bitcast <16 x i1> %a to i1696  %res = call <16 x float> @llvm.x86.avx512.mask.getmant.ps.512(<16 x float> %x0, i32 11, <16 x float> %x2, i16 %b, i32 4)97  ret <16 x float> %res98}99 100; Similar to above but with fp types bitcasted to int for the slt.101define <2 x double> @movmsk2_fp(<2 x double> %x0, <2 x double> %x2, <2 x double> %mask) {102; AVX512VL-LABEL: movmsk2_fp:103; AVX512VL:       ## %bb.0:104; AVX512VL-NEXT:    vpxor %xmm3, %xmm3, %xmm3105; AVX512VL-NEXT:    vpcmpgtq %xmm2, %xmm3, %k1106; AVX512VL-NEXT:    vgetmantpd $11, %xmm0, %xmm1 {%k1}107; AVX512VL-NEXT:    vmovapd %xmm1, %xmm0108; AVX512VL-NEXT:    retq109;110; AVX512VLDQBW-LABEL: movmsk2_fp:111; AVX512VLDQBW:       ## %bb.0:112; AVX512VLDQBW-NEXT:    vpmovq2m %xmm2, %k1113; AVX512VLDQBW-NEXT:    vgetmantpd $11, %xmm0, %xmm1 {%k1}114; AVX512VLDQBW-NEXT:    vmovapd %xmm1, %xmm0115; AVX512VLDQBW-NEXT:    retq116  %q = bitcast <2 x double> %mask to <2 x i64>117  %a = icmp slt <2 x i64> %q, zeroinitializer118  %b = bitcast <2 x i1> %a to i2119  %c = zext i2 %b to i8120  %res = call <2 x double> @llvm.x86.avx512.mask.getmant.pd.128(<2 x double> %x0, i32 11, <2 x double> %x2, i8 %c)121  ret <2 x double> %res122}123 124define <4 x double> @movmsk4_fp(<4 x double> %x0, <4 x double> %x2, <4 x float> %mask) {125; AVX512VL-LABEL: movmsk4_fp:126; AVX512VL:       ## %bb.0:127; AVX512VL-NEXT:    vpxor %xmm3, %xmm3, %xmm3128; AVX512VL-NEXT:    vpcmpgtd %xmm2, %xmm3, %k1129; AVX512VL-NEXT:    vgetmantpd $11, %ymm0, %ymm1 {%k1}130; AVX512VL-NEXT:    vmovapd %ymm1, %ymm0131; AVX512VL-NEXT:    retq132;133; AVX512VLDQBW-LABEL: movmsk4_fp:134; AVX512VLDQBW:       ## %bb.0:135; AVX512VLDQBW-NEXT:    vpmovd2m %xmm2, %k1136; AVX512VLDQBW-NEXT:    vgetmantpd $11, %ymm0, %ymm1 {%k1}137; AVX512VLDQBW-NEXT:    vmovapd %ymm1, %ymm0138; AVX512VLDQBW-NEXT:    retq139  %q = bitcast <4 x float> %mask to <4 x i32>140  %a = icmp slt <4 x i32> %q, zeroinitializer141  %b = bitcast <4 x i1> %a to i4142  %c = zext i4 %b to i8143  %res = call <4 x double> @llvm.x86.avx512.mask.getmant.pd.256(<4 x double> %x0, i32 11, <4 x double> %x2, i8 %c)144  ret <4 x double> %res145}146 147define <8 x double> @movmsk8_fp(<8 x double> %x0, <8 x double> %x2, <8 x float> %mask) {148; AVX512VL-LABEL: movmsk8_fp:149; AVX512VL:       ## %bb.0:150; AVX512VL-NEXT:    vpxor %xmm3, %xmm3, %xmm3151; AVX512VL-NEXT:    vpcmpgtd %ymm2, %ymm3, %k1152; AVX512VL-NEXT:    vgetmantpd $11, %zmm0, %zmm1 {%k1}153; AVX512VL-NEXT:    vmovapd %zmm1, %zmm0154; AVX512VL-NEXT:    retq155;156; AVX512VLDQBW-LABEL: movmsk8_fp:157; AVX512VLDQBW:       ## %bb.0:158; AVX512VLDQBW-NEXT:    vpmovd2m %ymm2, %k1159; AVX512VLDQBW-NEXT:    vgetmantpd $11, %zmm0, %zmm1 {%k1}160; AVX512VLDQBW-NEXT:    vmovapd %zmm1, %zmm0161; AVX512VLDQBW-NEXT:    retq162  %q = bitcast <8 x float> %mask to <8 x i32>163  %a = icmp slt <8 x i32> %q, zeroinitializer164  %b = bitcast <8 x i1> %a to i8165  %res = call <8 x double> @llvm.x86.avx512.mask.getmant.pd.512(<8 x double> %x0, i32 11, <8 x double> %x2, i8 %b, i32 4)166  ret <8 x double> %res167}168