]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/CodeGen/X86/avx-trunc.ll
Vendor import of llvm release_40 branch r292009:
[FreeBSD/FreeBSD.git] / test / CodeGen / X86 / avx-trunc.ll
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s
3
4 define <4 x i32> @trunc_64_32(<4 x i64> %A) nounwind uwtable readnone ssp{
5 ; CHECK-LABEL: trunc_64_32:
6 ; CHECK:       # BB#0:
7 ; CHECK-NEXT:    vextractf128 $1, %ymm0, %xmm1
8 ; CHECK-NEXT:    vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
9 ; CHECK-NEXT:    vzeroupper
10 ; CHECK-NEXT:    retq
11   %B = trunc <4 x i64> %A to <4 x i32>
12   ret <4 x i32>%B
13 }
14
15 define <8 x i16> @trunc_32_16(<8 x i32> %A) nounwind uwtable readnone ssp{
16 ; CHECK-LABEL: trunc_32_16:
17 ; CHECK:       # BB#0:
18 ; CHECK-NEXT:    vextractf128 $1, %ymm0, %xmm1
19 ; CHECK-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15]
20 ; CHECK-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
21 ; CHECK-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
22 ; CHECK-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
23 ; CHECK-NEXT:    vzeroupper
24 ; CHECK-NEXT:    retq
25   %B = trunc <8 x i32> %A to <8 x i16>
26   ret <8 x i16>%B
27 }
28
29 define <16 x i8> @trunc_16_8(<16 x i16> %A) nounwind uwtable readnone ssp{
30 ; CHECK-LABEL: trunc_16_8:
31 ; CHECK:       # BB#0:
32 ; CHECK-NEXT:    vextractf128 $1, %ymm0, %xmm1
33 ; CHECK-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u>
34 ; CHECK-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
35 ; CHECK-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
36 ; CHECK-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
37 ; CHECK-NEXT:    vzeroupper
38 ; CHECK-NEXT:    retq
39   %B = trunc <16 x i16> %A to <16 x i8>
40   ret <16 x i8> %B
41 }
42
43 define <16 x i8> @usat_trunc_wb_256(<16 x i16> %i) {
44 ; CHECK-LABEL: usat_trunc_wb_256:
45 ; CHECK:       # BB#0:
46 ; CHECK-NEXT:    vextractf128 $1, %ymm0, %xmm1
47 ; CHECK-NEXT:    vpackuswb %xmm1, %xmm0, %xmm0
48 ; CHECK-NEXT:    vzeroupper
49 ; CHECK-NEXT:    retq
50   %x3 = icmp ult <16 x i16> %i, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
51   %x5 = select <16 x i1> %x3, <16 x i16> %i, <16 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255>
52   %x6 = trunc <16 x i16> %x5 to <16 x i8>
53   ret <16 x i8> %x6
54 }
55
56 define <8 x i16> @usat_trunc_dw_256(<8 x i32> %i) {
57 ; CHECK-LABEL: usat_trunc_dw_256:
58 ; CHECK:       # BB#0:
59 ; CHECK-NEXT:    vextractf128 $1, %ymm0, %xmm1
60 ; CHECK-NEXT:    vpackusdw %xmm1, %xmm0, %xmm0
61 ; CHECK-NEXT:    vzeroupper
62 ; CHECK-NEXT:    retq
63   %x3 = icmp ult <8 x i32> %i, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
64   %x5 = select <8 x i1> %x3, <8 x i32> %i, <8 x i32> <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
65   %x6 = trunc <8 x i32> %x5 to <8 x i16>
66   ret <8 x i16> %x6
67 }