When ext-loading and trunc-storing vectors to memory, on x86 32bit systems, allow...
[oota-llvm.git] / test / CodeGen / X86 / pointer-vector.ll
1 ; RUN: llc < %s -mtriple=i686-linux -mcpu=corei7 | FileCheck %s
2 ; RUN: opt -instsimplify %s -disable-output
3
4 ;CHECK: SHUFF0
5 define <8 x i32*> @SHUFF0(<4 x i32*> %ptrv) nounwind {
6 entry:
7   %G = shufflevector <4 x i32*> %ptrv, <4 x i32*> %ptrv, <8 x i32> <i32 2, i32 7, i32 1, i32 2, i32 4, i32 5, i32 1, i32 1>
8 ;CHECK: pshufd
9   ret <8 x i32*> %G
10 ;CHECK: ret
11 }
12
13 ;CHECK: SHUFF1
14 define <4 x i32*> @SHUFF1(<4 x i32*> %ptrv) nounwind {
15 entry:
16   %G = shufflevector <4 x i32*> %ptrv, <4 x i32*> %ptrv, <4 x i32> <i32 2, i32 7, i32 7, i32 2>
17 ;CHECK: pshufd
18   ret <4 x i32*> %G
19 ;CHECK: ret
20 }
21
22 ;CHECK: SHUFF3
23 define <4 x i8*> @SHUFF3(<4 x i8*> %ptrv) nounwind {
24 entry:
25   %G = shufflevector <4 x i8*> %ptrv, <4 x i8*> undef, <4 x i32> <i32 2, i32 7, i32 1, i32 2>
26 ;CHECK: pshufd
27   ret <4 x i8*> %G
28 ;CHECK: ret
29 }
30
31 ;CHECK: LOAD0
32 define <4 x i8*> @LOAD0(<4 x i8*>* %p) nounwind {
33 entry:
34   %G = load <4 x i8*>* %p
35 ;CHECK: movaps
36   ret <4 x i8*> %G
37 ;CHECK: ret
38 }
39
40 ;CHECK: LOAD1
41 define <4 x i8*> @LOAD1(<4 x i8*>* %p) nounwind {
42 entry:
43   %G = load <4 x i8*>* %p
44 ;CHECK: movdqa
45 ;CHECK: pshufd
46 ;CHECK: movdqa
47   %T = shufflevector <4 x i8*> %G, <4 x i8*> %G, <4 x i32> <i32 7, i32 1, i32 4, i32 3>
48   store <4 x i8*> %T, <4 x i8*>* %p
49   ret <4 x i8*> %G
50 ;CHECK: ret
51 }
52
53 ;CHECK: LOAD2
54 define <4 x i8*> @LOAD2(<4 x i8*>* %p) nounwind {
55 entry:
56   %I = alloca <4 x i8*>
57 ;CHECK: sub
58   %G = load <4 x i8*>* %p
59 ;CHECK: movaps
60   store <4 x i8*> %G, <4 x i8*>* %I
61 ;CHECK: movaps
62   %Z = load <4 x i8*>* %I
63   ret <4 x i8*> %Z
64 ;CHECK: add
65 ;CHECK: ret
66 }
67
68 ;CHECK: INT2PTR0
69 define <4 x i32> @INT2PTR0(<4 x i8*>* %p) nounwind {
70 entry:
71   %G = load <4 x i8*>* %p
72 ;CHECK: movl
73 ;CHECK: movaps
74   %K = ptrtoint <4 x i8*> %G to <4 x i32>
75 ;CHECK: ret
76   ret <4 x i32> %K
77 }
78
79 ;CHECK: INT2PTR1
80 define <4 x i32*> @INT2PTR1(<4 x i8>* %p) nounwind {
81 entry:
82   %G = load <4 x i8>* %p
83 ;CHECK: movl
84 ;CHECK: movd
85 ;CHECK: pshufb
86 ;CHECK: pand
87   %K = inttoptr <4 x i8> %G to <4 x i32*>
88 ;CHECK: ret
89   ret <4 x i32*> %K
90 }
91
92 ;CHECK: BITCAST0
93 define <4 x i32*> @BITCAST0(<4 x i8*>* %p) nounwind {
94 entry:
95   %G = load <4 x i8*>* %p
96 ;CHECK: movl
97   %T = bitcast <4 x i8*> %G to <4 x i32*>
98 ;CHECK: movaps
99 ;CHECK: ret
100   ret <4 x i32*> %T
101 }
102
103 ;CHECK: BITCAST1
104 define <2 x i32*> @BITCAST1(<2 x i8*>* %p) nounwind {
105 entry:
106   %G = load <2 x i8*>* %p
107 ;CHECK: movl
108 ;CHECK: movsd
109   %T = bitcast <2 x i8*> %G to <2 x i32*>
110 ;CHECK: ret
111   ret <2 x i32*> %T
112 }
113
114 ;CHECK: ICMP0
115 define <4 x i32> @ICMP0(<4 x i8*>* %p0, <4 x i8*>* %p1) nounwind {
116 entry:
117   %g0 = load <4 x i8*>* %p0
118   %g1 = load <4 x i8*>* %p1
119   %k = icmp sgt <4 x i8*> %g0, %g1
120   ;CHECK: pcmpgtd
121   %j = select <4 x i1> %k, <4 x i32> <i32 0, i32 1, i32 2, i32 4>, <4 x i32> <i32 9, i32 8, i32 7, i32 6>
122   ret <4 x i32> %j
123   ;CHECK: ret
124 }
125
126 ;CHECK: ICMP1
127 define <4 x i32> @ICMP1(<4 x i8*>* %p0, <4 x i8*>* %p1) nounwind {
128 entry:
129   %g0 = load <4 x i8*>* %p0
130   %g1 = load <4 x i8*>* %p1
131   %k = icmp eq <4 x i8*> %g0, %g1
132   ;CHECK: pcmpeqd
133   %j = select <4 x i1> %k, <4 x i32> <i32 0, i32 1, i32 2, i32 4>, <4 x i32> <i32 9, i32 8, i32 7, i32 6>
134   ret <4 x i32> %j
135   ;CHECK: ret
136 }
137