0d0087b973343cb92464dbb053db911001447642
[oota-llvm.git] / test / CodeGen / ARM / vdup.ll
1 ; RUN: llvm-as < %s | llc -march=arm -mattr=+neon | FileCheck %s
2 ; RUN: grep vdup.8 %t | count 4
3 ; RUN: grep vdup.16 %t | count 4
4 ; RUN: grep vdup.32 %t | count 10
5
6 define <8 x i8> @v_dup8(i8 %A) nounwind {
7 ;CHECK: v_dup8:
8 ;CHECK: vdup.8
9         %tmp1 = insertelement <8 x i8> zeroinitializer, i8 %A, i32 0
10         %tmp2 = insertelement <8 x i8> %tmp1, i8 %A, i32 1
11         %tmp3 = insertelement <8 x i8> %tmp2, i8 %A, i32 2
12         %tmp4 = insertelement <8 x i8> %tmp3, i8 %A, i32 3
13         %tmp5 = insertelement <8 x i8> %tmp4, i8 %A, i32 4
14         %tmp6 = insertelement <8 x i8> %tmp5, i8 %A, i32 5
15         %tmp7 = insertelement <8 x i8> %tmp6, i8 %A, i32 6
16         %tmp8 = insertelement <8 x i8> %tmp7, i8 %A, i32 7
17         ret <8 x i8> %tmp8
18 }
19
20 define <4 x i16> @v_dup16(i16 %A) nounwind {
21 ;CHECK: v_dup16:
22 ;CHECK: vdup.16
23         %tmp1 = insertelement <4 x i16> zeroinitializer, i16 %A, i32 0
24         %tmp2 = insertelement <4 x i16> %tmp1, i16 %A, i32 1
25         %tmp3 = insertelement <4 x i16> %tmp2, i16 %A, i32 2
26         %tmp4 = insertelement <4 x i16> %tmp3, i16 %A, i32 3
27         ret <4 x i16> %tmp4
28 }
29
30 define <2 x i32> @v_dup32(i32 %A) nounwind {
31 ;CHECK: v_dup32:
32 ;CHECK: vdup.32
33         %tmp1 = insertelement <2 x i32> zeroinitializer, i32 %A, i32 0
34         %tmp2 = insertelement <2 x i32> %tmp1, i32 %A, i32 1
35         ret <2 x i32> %tmp2
36 }
37
38 define <2 x float> @v_dupfloat(float %A) nounwind {
39 ;CHECK: v_dupfloat:
40 ;CHECK: vdup.32
41         %tmp1 = insertelement <2 x float> zeroinitializer, float %A, i32 0
42         %tmp2 = insertelement <2 x float> %tmp1, float %A, i32 1
43         ret <2 x float> %tmp2
44 }
45
46 define <16 x i8> @v_dupQ8(i8 %A) nounwind {
47 ;CHECK: v_dupQ8:
48 ;CHECK: vdup.8
49         %tmp1 = insertelement <16 x i8> zeroinitializer, i8 %A, i32 0
50         %tmp2 = insertelement <16 x i8> %tmp1, i8 %A, i32 1
51         %tmp3 = insertelement <16 x i8> %tmp2, i8 %A, i32 2
52         %tmp4 = insertelement <16 x i8> %tmp3, i8 %A, i32 3
53         %tmp5 = insertelement <16 x i8> %tmp4, i8 %A, i32 4
54         %tmp6 = insertelement <16 x i8> %tmp5, i8 %A, i32 5
55         %tmp7 = insertelement <16 x i8> %tmp6, i8 %A, i32 6
56         %tmp8 = insertelement <16 x i8> %tmp7, i8 %A, i32 7
57         %tmp9 = insertelement <16 x i8> %tmp8, i8 %A, i32 8
58         %tmp10 = insertelement <16 x i8> %tmp9, i8 %A, i32 9
59         %tmp11 = insertelement <16 x i8> %tmp10, i8 %A, i32 10
60         %tmp12 = insertelement <16 x i8> %tmp11, i8 %A, i32 11
61         %tmp13 = insertelement <16 x i8> %tmp12, i8 %A, i32 12
62         %tmp14 = insertelement <16 x i8> %tmp13, i8 %A, i32 13
63         %tmp15 = insertelement <16 x i8> %tmp14, i8 %A, i32 14
64         %tmp16 = insertelement <16 x i8> %tmp15, i8 %A, i32 15
65         ret <16 x i8> %tmp16
66 }
67
68 define <8 x i16> @v_dupQ16(i16 %A) nounwind {
69 ;CHECK: v_dupQ16:
70 ;CHECK: vdup.16
71         %tmp1 = insertelement <8 x i16> zeroinitializer, i16 %A, i32 0
72         %tmp2 = insertelement <8 x i16> %tmp1, i16 %A, i32 1
73         %tmp3 = insertelement <8 x i16> %tmp2, i16 %A, i32 2
74         %tmp4 = insertelement <8 x i16> %tmp3, i16 %A, i32 3
75         %tmp5 = insertelement <8 x i16> %tmp4, i16 %A, i32 4
76         %tmp6 = insertelement <8 x i16> %tmp5, i16 %A, i32 5
77         %tmp7 = insertelement <8 x i16> %tmp6, i16 %A, i32 6
78         %tmp8 = insertelement <8 x i16> %tmp7, i16 %A, i32 7
79         ret <8 x i16> %tmp8
80 }
81
82 define <4 x i32> @v_dupQ32(i32 %A) nounwind {
83 ;CHECK: v_dupQ32:
84 ;CHECK: vdup.32
85         %tmp1 = insertelement <4 x i32> zeroinitializer, i32 %A, i32 0
86         %tmp2 = insertelement <4 x i32> %tmp1, i32 %A, i32 1
87         %tmp3 = insertelement <4 x i32> %tmp2, i32 %A, i32 2
88         %tmp4 = insertelement <4 x i32> %tmp3, i32 %A, i32 3
89         ret <4 x i32> %tmp4
90 }
91
92 define <4 x float> @v_dupQfloat(float %A) nounwind {
93 ;CHECK: v_dupQfloat:
94 ;CHECK: vdup.32
95         %tmp1 = insertelement <4 x float> zeroinitializer, float %A, i32 0
96         %tmp2 = insertelement <4 x float> %tmp1, float %A, i32 1
97         %tmp3 = insertelement <4 x float> %tmp2, float %A, i32 2
98         %tmp4 = insertelement <4 x float> %tmp3, float %A, i32 3
99         ret <4 x float> %tmp4
100 }
101
102 ; Check to make sure it works with shuffles, too.
103
104 define <8 x i8> @v_shuffledup8(i8 %A) nounwind {
105 ;CHECK: v_shuffledup8:
106 ;CHECK: vdup.8
107         %tmp1 = insertelement <8 x i8> undef, i8 %A, i32 0
108         %tmp2 = shufflevector <8 x i8> %tmp1, <8 x i8> undef, <8 x i32> zeroinitializer
109         ret <8 x i8> %tmp2
110 }
111
112 define <4 x i16> @v_shuffledup16(i16 %A) nounwind {
113 ;CHECK: v_shuffledup16:
114 ;CHECK: vdup.16
115         %tmp1 = insertelement <4 x i16> undef, i16 %A, i32 0
116         %tmp2 = shufflevector <4 x i16> %tmp1, <4 x i16> undef, <4 x i32> zeroinitializer
117         ret <4 x i16> %tmp2
118 }
119
120 define <2 x i32> @v_shuffledup32(i32 %A) nounwind {
121 ;CHECK: v_shuffledup32:
122 ;CHECK: vdup.32
123         %tmp1 = insertelement <2 x i32> undef, i32 %A, i32 0
124         %tmp2 = shufflevector <2 x i32> %tmp1, <2 x i32> undef, <2 x i32> zeroinitializer
125         ret <2 x i32> %tmp2
126 }
127
128 define <2 x float> @v_shuffledupfloat(float %A) nounwind {
129 ;CHECK: v_shuffledupfloat:
130 ;CHECK: vdup.32
131         %tmp1 = insertelement <2 x float> undef, float %A, i32 0
132         %tmp2 = shufflevector <2 x float> %tmp1, <2 x float> undef, <2 x i32> zeroinitializer
133         ret <2 x float> %tmp2
134 }
135
136 define <16 x i8> @v_shuffledupQ8(i8 %A) nounwind {
137 ;CHECK: v_shuffledupQ8:
138 ;CHECK: vdup.8
139         %tmp1 = insertelement <16 x i8> undef, i8 %A, i32 0
140         %tmp2 = shufflevector <16 x i8> %tmp1, <16 x i8> undef, <16 x i32> zeroinitializer
141         ret <16 x i8> %tmp2
142 }
143
144 define <8 x i16> @v_shuffledupQ16(i16 %A) nounwind {
145 ;CHECK: v_shuffledupQ16:
146 ;CHECK: vdup.16
147         %tmp1 = insertelement <8 x i16> undef, i16 %A, i32 0
148         %tmp2 = shufflevector <8 x i16> %tmp1, <8 x i16> undef, <8 x i32> zeroinitializer
149         ret <8 x i16> %tmp2
150 }
151
152 define <4 x i32> @v_shuffledupQ32(i32 %A) nounwind {
153 ;CHECK: v_shuffledupQ32:
154 ;CHECK: vdup.32
155         %tmp1 = insertelement <4 x i32> undef, i32 %A, i32 0
156         %tmp2 = shufflevector <4 x i32> %tmp1, <4 x i32> undef, <4 x i32> zeroinitializer
157         ret <4 x i32> %tmp2
158 }
159
160 define <4 x float> @v_shuffledupQfloat(float %A) nounwind {
161 ;CHECK: v_shuffledupQfloat:
162 ;CHECK: vdup.32
163         %tmp1 = insertelement <4 x float> undef, float %A, i32 0
164         %tmp2 = shufflevector <4 x float> %tmp1, <4 x float> undef, <4 x i32> zeroinitializer
165         ret <4 x float> %tmp2
166 }
167
168 define <2 x float> @v_shuffledupfloat2(float* %A) nounwind {
169 ;CHECK: v_shuffledupfloat2:
170 ;CHECK: vdup.32
171         %tmp0 = load float* %A
172         %tmp1 = insertelement <2 x float> undef, float %tmp0, i32 0
173         %tmp2 = shufflevector <2 x float> %tmp1, <2 x float> undef, <2 x i32> zeroinitializer
174         ret <2 x float> %tmp2
175 }
176
177 define <4 x float> @v_shuffledupQfloat2(float* %A) nounwind {
178 ;CHECK: v_shuffledupQfloat2:
179 ;CHECK: vdup.32
180         %tmp0 = load float* %A
181         %tmp1 = insertelement <4 x float> undef, float %tmp0, i32 0
182         %tmp2 = shufflevector <4 x float> %tmp1, <4 x float> undef, <4 x i32> zeroinitializer
183         ret <4 x float> %tmp2
184 }