SDAG: Legalize vector BSWAP into a shuffle if the shuffle is legal but the bswap...
[oota-llvm.git] / test / CodeGen / X86 / bswap-vector.ll
1 ; RUN: llc < %s -mcpu=x86-64 | FileCheck %s -check-prefix=CHECK-NOSSSE3
2 ; RUN: llc < %s -mcpu=core2 | FileCheck %s -check-prefix=CHECK-SSSE3
3 ; RUN: llc < %s -mcpu=core-avx2 | FileCheck %s -check-prefix=CHECK-AVX2
4 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
5 target triple = "x86_64-unknown-linux-gnu"
6
7 declare <8 x i16> @llvm.bswap.v8i16(<8 x i16>)
8 declare <4 x i32> @llvm.bswap.v4i32(<4 x i32>)
9 declare <2 x i64> @llvm.bswap.v2i64(<2 x i64>)
10
11 define <8 x i16> @test1(<8 x i16> %v) #0 {
12 entry:
13   %r = call <8 x i16> @llvm.bswap.v8i16(<8 x i16> %v)
14   ret <8 x i16> %r
15
16 ; CHECK-NOSSSE3-LABEL: @test1
17 ; CHECK-NOSSSE3: rolw
18 ; CHECK-NOSSSE3: rolw
19 ; CHECK-NOSSSE3: rolw
20 ; CHECK-NOSSSE3: rolw
21 ; CHECK-NOSSSE3: rolw
22 ; CHECK-NOSSSE3: rolw
23 ; CHECK-NOSSSE3: rolw
24 ; CHECK-NOSSSE3: rolw
25 ; CHECK-NOSSSE3: retq
26
27 ; CHECK-SSSE3-LABEL: @test1
28 ; CHECK-SSSE3: pshufb
29 ; CHECK-SSSE3-NEXT: retq
30
31 ; CHECK-AVX2-LABEL: @test1
32 ; CHECK-AVX2: vpshufb
33 ; CHECK-AVX2-NEXT: retq
34 }
35
36 define <4 x i32> @test2(<4 x i32> %v) #0 {
37 entry:
38   %r = call <4 x i32> @llvm.bswap.v4i32(<4 x i32> %v)
39   ret <4 x i32> %r
40
41 ; CHECK-NOSSSE3-LABEL: @test2
42 ; CHECK-NOSSSE3: bswapl
43 ; CHECK-NOSSSE3: bswapl
44 ; CHECK-NOSSSE3: bswapl
45 ; CHECK-NOSSSE3: bswapl
46 ; CHECK-NOSSSE3: retq
47
48 ; CHECK-SSSE3-LABEL: @test2
49 ; CHECK-SSSE3: pshufb
50 ; CHECK-SSSE3-NEXT: retq
51
52 ; CHECK-AVX2-LABEL: @test2
53 ; CHECK-AVX2: vpshufb
54 ; CHECK-AVX2-NEXT: retq
55 }
56
57 define <2 x i64> @test3(<2 x i64> %v) #0 {
58 entry:
59   %r = call <2 x i64> @llvm.bswap.v2i64(<2 x i64> %v)
60   ret <2 x i64> %r
61
62 ; CHECK-NOSSSE3-LABEL: @test3
63 ; CHECK-NOSSSE3: bswapq
64 ; CHECK-NOSSSE3: bswapq
65 ; CHECK-NOSSSE3: retq
66
67 ; CHECK-SSSE3-LABEL: @test3
68 ; CHECK-SSSE3: pshufb
69 ; CHECK-SSSE3-NEXT: retq
70
71 ; CHECK-AVX2-LABEL: @test3
72 ; CHECK-AVX2: vpshufb
73 ; CHECK-AVX2-NEXT: retq
74 }
75
76 declare <16 x i16> @llvm.bswap.v16i16(<16 x i16>)
77 declare <8 x i32> @llvm.bswap.v8i32(<8 x i32>)
78 declare <4 x i64> @llvm.bswap.v4i64(<4 x i64>)
79
80 define <16 x i16> @test4(<16 x i16> %v) #0 {
81 entry:
82   %r = call <16 x i16> @llvm.bswap.v16i16(<16 x i16> %v)
83   ret <16 x i16> %r
84
85 ; CHECK-SSSE3-LABEL: @test4
86 ; CHECK-SSSE3: pshufb
87 ; CHECK-SSSE3: pshufb
88 ; CHECK-SSSE3-NEXT: retq
89
90 ; CHECK-AVX2-LABEL: @test4
91 ; CHECK-AVX2: vpshufb
92 ; CHECK-AVX2-NEXT: retq
93 }
94
95 define <8 x i32> @test5(<8 x i32> %v) #0 {
96 entry:
97   %r = call <8 x i32> @llvm.bswap.v8i32(<8 x i32> %v)
98   ret <8 x i32> %r
99
100 ; CHECK-SSSE3-LABEL: @test5
101 ; CHECK-SSSE3: pshufb
102 ; CHECK-SSSE3: pshufb
103 ; CHECK-SSSE3-NEXT: retq
104
105 ; CHECK-AVX2-LABEL: @test5
106 ; CHECK-AVX2: vpshufb
107 ; CHECK-AVX2-NEXT: retq
108 }
109
110 define <4 x i64> @test6(<4 x i64> %v) #0 {
111 entry:
112   %r = call <4 x i64> @llvm.bswap.v4i64(<4 x i64> %v)
113   ret <4 x i64> %r
114
115 ; CHECK-SSSE3-LABEL: @test6
116 ; CHECK-SSSE3: pshufb
117 ; CHECK-SSSE3: pshufb
118 ; CHECK-SSSE3-NEXT: retq
119
120 ; CHECK-AVX2-LABEL: @test6
121 ; CHECK-AVX2: vpshufb
122 ; CHECK-AVX2-NEXT: retq
123 }
124
125
126 attributes #0 = { nounwind uwtable }
127