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