• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: llc < %s -march=x86-64 -mcpu=corei7 | FileCheck %s
2
3; Splat patterns below
4
5
6define <4 x i32> @shl4(<4 x i32> %A) nounwind {
7entry:
8; CHECK:      shl4
9; CHECK:      pslld
10; CHECK-NEXT: pslld
11  %B = shl <4 x i32> %A,  < i32 2, i32 2, i32 2, i32 2>
12  %C = shl <4 x i32> %A,  < i32 1, i32 1, i32 1, i32 1>
13  %K = xor <4 x i32> %B, %C
14  ret <4 x i32> %K
15}
16
17define <4 x i32> @shr4(<4 x i32> %A) nounwind {
18entry:
19; CHECK:      shr4
20; CHECK:      psrld
21; CHECK-NEXT: psrld
22  %B = lshr <4 x i32> %A,  < i32 2, i32 2, i32 2, i32 2>
23  %C = lshr <4 x i32> %A,  < i32 1, i32 1, i32 1, i32 1>
24  %K = xor <4 x i32> %B, %C
25  ret <4 x i32> %K
26}
27
28define <4 x i32> @sra4(<4 x i32> %A) nounwind {
29entry:
30; CHECK:      sra4
31; CHECK:      psrad
32; CHECK-NEXT: psrad
33  %B = ashr <4 x i32> %A,  < i32 2, i32 2, i32 2, i32 2>
34  %C = ashr <4 x i32> %A,  < i32 1, i32 1, i32 1, i32 1>
35  %K = xor <4 x i32> %B, %C
36  ret <4 x i32> %K
37}
38
39define <2 x i64> @shl2(<2 x i64> %A) nounwind {
40entry:
41; CHECK:      shl2
42; CHECK:      psllq
43; CHECK-NEXT: psllq
44  %B = shl <2 x i64> %A,  < i64 2, i64 2>
45  %C = shl <2 x i64> %A,  < i64 9, i64 9>
46  %K = xor <2 x i64> %B, %C
47  ret <2 x i64> %K
48}
49
50define <2 x i64> @shr2(<2 x i64> %A) nounwind {
51entry:
52; CHECK:      shr2
53; CHECK:      psrlq
54; CHECK-NEXT: psrlq
55  %B = lshr <2 x i64> %A,  < i64 8, i64 8>
56  %C = lshr <2 x i64> %A,  < i64 1, i64 1>
57  %K = xor <2 x i64> %B, %C
58  ret <2 x i64> %K
59}
60
61
62define <8 x i16> @shl8(<8 x i16> %A) nounwind {
63entry:
64; CHECK:      shl8
65; CHECK:      psllw
66; CHECK-NEXT: psllw
67  %B = shl <8 x i16> %A,  < i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>
68  %C = shl <8 x i16> %A,  < i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
69  %K = xor <8 x i16> %B, %C
70  ret <8 x i16> %K
71}
72
73define <8 x i16> @shr8(<8 x i16> %A) nounwind {
74entry:
75; CHECK:      shr8
76; CHECK:      psrlw
77; CHECK-NEXT: psrlw
78  %B = lshr <8 x i16> %A,  < i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>
79  %C = lshr <8 x i16> %A,  < i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
80  %K = xor <8 x i16> %B, %C
81  ret <8 x i16> %K
82}
83
84define <8 x i16> @sra8(<8 x i16> %A) nounwind {
85entry:
86; CHECK:      sra8
87; CHECK:      psraw
88; CHECK-NEXT: psraw
89  %B = ashr <8 x i16> %A,  < i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2>
90  %C = ashr <8 x i16> %A,  < i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
91  %K = xor <8 x i16> %B, %C
92  ret <8 x i16> %K
93}
94
95; non splat test
96
97
98define <8 x i16> @sll8_nosplat(<8 x i16> %A) nounwind {
99entry:
100; CHECK: sll8_nosplat
101; CHECK-NOT: psll
102; CHECK-NOT: psll
103  %B = shl <8 x i16> %A,  < i16 1, i16 2, i16 3, i16 6, i16 2, i16 2, i16 2, i16 2>
104  %C = shl <8 x i16> %A,  < i16 9, i16 7, i16 5, i16 1, i16 4, i16 1, i16 1, i16 1>
105  %K = xor <8 x i16> %B, %C
106  ret <8 x i16> %K
107}
108
109
110define <2 x i64> @shr2_nosplat(<2 x i64> %A) nounwind {
111entry:
112; CHECK: shr2_nosplat
113; CHECK-NOT:  psrlq
114; CHECK-NOT:  psrlq
115  %B = lshr <2 x i64> %A,  < i64 8, i64 1>
116  %C = lshr <2 x i64> %A,  < i64 1, i64 0>
117  %K = xor <2 x i64> %B, %C
118  ret <2 x i64> %K
119}
120
121
122; Other shifts
123
124define <2 x i32> @shl2_other(<2 x i32> %A) nounwind {
125entry:
126; CHECK: shl2_other
127; CHECK-not:      psllq
128  %B = shl <2 x i32> %A,  < i32 2, i32 2>
129  %C = shl <2 x i32> %A,  < i32 9, i32 9>
130  %K = xor <2 x i32> %B, %C
131  ret <2 x i32> %K
132}
133
134define <2 x i32> @shr2_other(<2 x i32> %A) nounwind {
135entry:
136; CHECK: shr2_other
137; CHECK-NOT:      psrlq
138  %B = lshr <2 x i32> %A,  < i32 8, i32 8>
139  %C = lshr <2 x i32> %A,  < i32 1, i32 1>
140  %K = xor <2 x i32> %B, %C
141  ret <2 x i32> %K
142}
143