Add full x86 fast-isel support for memcpy and memset.
[oota-llvm.git] / test / CodeGen / X86 / x86-shifts.ll
1 ; RUN: llc < %s -march=x86-64 -mcpu=corei7 | FileCheck %s
2
3 ; Splat patterns below
4
5
6 define <4 x i32> @shl4(<4 x i32> %A) nounwind {
7 entry:
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
17 define <4 x i32> @shr4(<4 x i32> %A) nounwind {
18 entry:
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
28 define <4 x i32> @sra4(<4 x i32> %A) nounwind {
29 entry:
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
39 define <2 x i64> @shl2(<2 x i64> %A) nounwind {
40 entry:
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
50 define <2 x i64> @shr2(<2 x i64> %A) nounwind {
51 entry:
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
62 define <8 x i16> @shl8(<8 x i16> %A) nounwind {
63 entry:
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
73 define <8 x i16> @shr8(<8 x i16> %A) nounwind {
74 entry:
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
84 define <8 x i16> @sra8(<8 x i16> %A) nounwind {
85 entry:
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
98 define <8 x i16> @sll8_nosplat(<8 x i16> %A) nounwind {
99 entry:
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
110 define <2 x i64> @shr2_nosplat(<2 x i64> %A) nounwind {
111 entry:
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
124 define <2 x i32> @shl2_other(<2 x i32> %A) nounwind {
125 entry:
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
134 define <2 x i32> @shr2_other(<2 x i32> %A) nounwind {
135 entry:
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 }