Add a bit IsUndef to MachineOperand. This indicates the def / use register operand...
[oota-llvm.git] / test / CodeGen / ARM / vdup.ll
1 ; RUN: llvm-as < %s | llc -march=arm -mattr=+neon > %t
2 ; RUN: grep vdup.8 %t | count 4
3 ; RUN: grep vdup.16 %t | count 4
4 ; RUN: grep vdup.32 %t | count 8
5
6 define <8 x i8> @v_dup8(i8 %A) nounwind {
7         %tmp1 = insertelement <8 x i8> zeroinitializer, i8 %A, i32 0
8         %tmp2 = insertelement <8 x i8> %tmp1, i8 %A, i32 1
9         %tmp3 = insertelement <8 x i8> %tmp2, i8 %A, i32 2
10         %tmp4 = insertelement <8 x i8> %tmp3, i8 %A, i32 3
11         %tmp5 = insertelement <8 x i8> %tmp4, i8 %A, i32 4
12         %tmp6 = insertelement <8 x i8> %tmp5, i8 %A, i32 5
13         %tmp7 = insertelement <8 x i8> %tmp6, i8 %A, i32 6
14         %tmp8 = insertelement <8 x i8> %tmp7, i8 %A, i32 7
15         ret <8 x i8> %tmp8
16 }
17
18 define <4 x i16> @v_dup16(i16 %A) nounwind {
19         %tmp1 = insertelement <4 x i16> zeroinitializer, i16 %A, i32 0
20         %tmp2 = insertelement <4 x i16> %tmp1, i16 %A, i32 1
21         %tmp3 = insertelement <4 x i16> %tmp2, i16 %A, i32 2
22         %tmp4 = insertelement <4 x i16> %tmp3, i16 %A, i32 3
23         ret <4 x i16> %tmp4
24 }
25
26 define <2 x i32> @v_dup32(i32 %A) nounwind {
27         %tmp1 = insertelement <2 x i32> zeroinitializer, i32 %A, i32 0
28         %tmp2 = insertelement <2 x i32> %tmp1, i32 %A, i32 1
29         ret <2 x i32> %tmp2
30 }
31
32 define <2 x float> @v_dupfloat(float %A) nounwind {
33         %tmp1 = insertelement <2 x float> zeroinitializer, float %A, i32 0
34         %tmp2 = insertelement <2 x float> %tmp1, float %A, i32 1
35         ret <2 x float> %tmp2
36 }
37
38 define <16 x i8> @v_dupQ8(i8 %A) nounwind {
39         %tmp1 = insertelement <16 x i8> zeroinitializer, i8 %A, i32 0
40         %tmp2 = insertelement <16 x i8> %tmp1, i8 %A, i32 1
41         %tmp3 = insertelement <16 x i8> %tmp2, i8 %A, i32 2
42         %tmp4 = insertelement <16 x i8> %tmp3, i8 %A, i32 3
43         %tmp5 = insertelement <16 x i8> %tmp4, i8 %A, i32 4
44         %tmp6 = insertelement <16 x i8> %tmp5, i8 %A, i32 5
45         %tmp7 = insertelement <16 x i8> %tmp6, i8 %A, i32 6
46         %tmp8 = insertelement <16 x i8> %tmp7, i8 %A, i32 7
47         %tmp9 = insertelement <16 x i8> %tmp8, i8 %A, i32 8
48         %tmp10 = insertelement <16 x i8> %tmp9, i8 %A, i32 9
49         %tmp11 = insertelement <16 x i8> %tmp10, i8 %A, i32 10
50         %tmp12 = insertelement <16 x i8> %tmp11, i8 %A, i32 11
51         %tmp13 = insertelement <16 x i8> %tmp12, i8 %A, i32 12
52         %tmp14 = insertelement <16 x i8> %tmp13, i8 %A, i32 13
53         %tmp15 = insertelement <16 x i8> %tmp14, i8 %A, i32 14
54         %tmp16 = insertelement <16 x i8> %tmp15, i8 %A, i32 15
55         ret <16 x i8> %tmp16
56 }
57
58 define <8 x i16> @v_dupQ16(i16 %A) nounwind {
59         %tmp1 = insertelement <8 x i16> zeroinitializer, i16 %A, i32 0
60         %tmp2 = insertelement <8 x i16> %tmp1, i16 %A, i32 1
61         %tmp3 = insertelement <8 x i16> %tmp2, i16 %A, i32 2
62         %tmp4 = insertelement <8 x i16> %tmp3, i16 %A, i32 3
63         %tmp5 = insertelement <8 x i16> %tmp4, i16 %A, i32 4
64         %tmp6 = insertelement <8 x i16> %tmp5, i16 %A, i32 5
65         %tmp7 = insertelement <8 x i16> %tmp6, i16 %A, i32 6
66         %tmp8 = insertelement <8 x i16> %tmp7, i16 %A, i32 7
67         ret <8 x i16> %tmp8
68 }
69
70 define <4 x i32> @v_dupQ32(i32 %A) nounwind {
71         %tmp1 = insertelement <4 x i32> zeroinitializer, i32 %A, i32 0
72         %tmp2 = insertelement <4 x i32> %tmp1, i32 %A, i32 1
73         %tmp3 = insertelement <4 x i32> %tmp2, i32 %A, i32 2
74         %tmp4 = insertelement <4 x i32> %tmp3, i32 %A, i32 3
75         ret <4 x i32> %tmp4
76 }
77
78 define <4 x float> @v_dupQfloat(float %A) nounwind {
79         %tmp1 = insertelement <4 x float> zeroinitializer, float %A, i32 0
80         %tmp2 = insertelement <4 x float> %tmp1, float %A, i32 1
81         %tmp3 = insertelement <4 x float> %tmp2, float %A, i32 2
82         %tmp4 = insertelement <4 x float> %tmp3, float %A, i32 3
83         ret <4 x float> %tmp4
84 }
85
86 ; Check to make sure it works with shuffles, too.
87
88 define <8 x i8> @v_shuffledup8(i8 %A) nounwind {
89         %tmp1 = insertelement <8 x i8> undef, i8 %A, i32 0
90         %tmp2 = shufflevector <8 x i8> %tmp1, <8 x i8> undef, <8 x i32> zeroinitializer
91         ret <8 x i8> %tmp2
92 }
93
94 define <4 x i16> @v_shuffledup16(i16 %A) nounwind {
95         %tmp1 = insertelement <4 x i16> undef, i16 %A, i32 0
96         %tmp2 = shufflevector <4 x i16> %tmp1, <4 x i16> undef, <4 x i32> zeroinitializer
97         ret <4 x i16> %tmp2
98 }
99
100 define <2 x i32> @v_shuffledup32(i32 %A) nounwind {
101         %tmp1 = insertelement <2 x i32> undef, i32 %A, i32 0
102         %tmp2 = shufflevector <2 x i32> %tmp1, <2 x i32> undef, <2 x i32> zeroinitializer
103         ret <2 x i32> %tmp2
104 }
105
106 define <2 x float> @v_shuffledupfloat(float %A) nounwind {
107         %tmp1 = insertelement <2 x float> undef, float %A, i32 0
108         %tmp2 = shufflevector <2 x float> %tmp1, <2 x float> undef, <2 x i32> zeroinitializer
109         ret <2 x float> %tmp2
110 }
111
112 define <16 x i8> @v_shuffledupQ8(i8 %A) nounwind {
113         %tmp1 = insertelement <16 x i8> undef, i8 %A, i32 0
114         %tmp2 = shufflevector <16 x i8> %tmp1, <16 x i8> undef, <16 x i32> zeroinitializer
115         ret <16 x i8> %tmp2
116 }
117
118 define <8 x i16> @v_shuffledupQ16(i16 %A) nounwind {
119         %tmp1 = insertelement <8 x i16> undef, i16 %A, i32 0
120         %tmp2 = shufflevector <8 x i16> %tmp1, <8 x i16> undef, <8 x i32> zeroinitializer
121         ret <8 x i16> %tmp2
122 }
123
124 define <4 x i32> @v_shuffledupQ32(i32 %A) nounwind {
125         %tmp1 = insertelement <4 x i32> undef, i32 %A, i32 0
126         %tmp2 = shufflevector <4 x i32> %tmp1, <4 x i32> undef, <4 x i32> zeroinitializer
127         ret <4 x i32> %tmp2
128 }
129
130 define <4 x float> @v_shuffledupQfloat(float %A) nounwind {
131         %tmp1 = insertelement <4 x float> undef, float %A, i32 0
132         %tmp2 = shufflevector <4 x float> %tmp1, <4 x float> undef, <4 x i32> zeroinitializer
133         ret <4 x float> %tmp2
134 }