[ARM] Cortex-M4 schedule additions
[llvm-complete.git] / test / CodeGen / ARM / vaba.ll
blob4323f3184469780c6a42f423291d5a64a9b5e057
1 ; RUN: llc -mtriple=arm-eabi -mattr=+neon %s -o - | FileCheck %s
3 define <8 x i8> @vabas8(<8 x i8>* %A, <8 x i8>* %B, <8 x i8>* %C) nounwind {
4 ;CHECK-LABEL: vabas8:
5 ;CHECK: vaba.s8
6         %tmp1 = load <8 x i8>, <8 x i8>* %A
7         %tmp2 = load <8 x i8>, <8 x i8>* %B
8         %tmp3 = load <8 x i8>, <8 x i8>* %C
9         %tmp4 = call <8 x i8> @llvm.arm.neon.vabds.v8i8(<8 x i8> %tmp2, <8 x i8> %tmp3)
10         %tmp5 = add <8 x i8> %tmp1, %tmp4
11         ret <8 x i8> %tmp5
14 define <4 x i16> @vabas16(<4 x i16>* %A, <4 x i16>* %B, <4 x i16>* %C) nounwind {
15 ;CHECK-LABEL: vabas16:
16 ;CHECK: vaba.s16
17         %tmp1 = load <4 x i16>, <4 x i16>* %A
18         %tmp2 = load <4 x i16>, <4 x i16>* %B
19         %tmp3 = load <4 x i16>, <4 x i16>* %C
20         %tmp4 = call <4 x i16> @llvm.arm.neon.vabds.v4i16(<4 x i16> %tmp2, <4 x i16> %tmp3)
21         %tmp5 = add <4 x i16> %tmp1, %tmp4
22         ret <4 x i16> %tmp5
25 define <2 x i32> @vabas32(<2 x i32>* %A, <2 x i32>* %B, <2 x i32>* %C) nounwind {
26 ;CHECK-LABEL: vabas32:
27 ;CHECK: vaba.s32
28         %tmp1 = load <2 x i32>, <2 x i32>* %A
29         %tmp2 = load <2 x i32>, <2 x i32>* %B
30         %tmp3 = load <2 x i32>, <2 x i32>* %C
31         %tmp4 = call <2 x i32> @llvm.arm.neon.vabds.v2i32(<2 x i32> %tmp2, <2 x i32> %tmp3)
32         %tmp5 = add <2 x i32> %tmp1, %tmp4
33         ret <2 x i32> %tmp5
36 define <8 x i8> @vabau8(<8 x i8>* %A, <8 x i8>* %B, <8 x i8>* %C) nounwind {
37 ;CHECK-LABEL: vabau8:
38 ;CHECK: vaba.u8
39         %tmp1 = load <8 x i8>, <8 x i8>* %A
40         %tmp2 = load <8 x i8>, <8 x i8>* %B
41         %tmp3 = load <8 x i8>, <8 x i8>* %C
42         %tmp4 = call <8 x i8> @llvm.arm.neon.vabdu.v8i8(<8 x i8> %tmp2, <8 x i8> %tmp3)
43         %tmp5 = add <8 x i8> %tmp1, %tmp4
44         ret <8 x i8> %tmp5
47 define <4 x i16> @vabau16(<4 x i16>* %A, <4 x i16>* %B, <4 x i16>* %C) nounwind {
48 ;CHECK-LABEL: vabau16:
49 ;CHECK: vaba.u16
50         %tmp1 = load <4 x i16>, <4 x i16>* %A
51         %tmp2 = load <4 x i16>, <4 x i16>* %B
52         %tmp3 = load <4 x i16>, <4 x i16>* %C
53         %tmp4 = call <4 x i16> @llvm.arm.neon.vabdu.v4i16(<4 x i16> %tmp2, <4 x i16> %tmp3)
54         %tmp5 = add <4 x i16> %tmp1, %tmp4
55         ret <4 x i16> %tmp5
58 define <2 x i32> @vabau32(<2 x i32>* %A, <2 x i32>* %B, <2 x i32>* %C) nounwind {
59 ;CHECK-LABEL: vabau32:
60 ;CHECK: vaba.u32
61         %tmp1 = load <2 x i32>, <2 x i32>* %A
62         %tmp2 = load <2 x i32>, <2 x i32>* %B
63         %tmp3 = load <2 x i32>, <2 x i32>* %C
64         %tmp4 = call <2 x i32> @llvm.arm.neon.vabdu.v2i32(<2 x i32> %tmp2, <2 x i32> %tmp3)
65         %tmp5 = add <2 x i32> %tmp1, %tmp4
66         ret <2 x i32> %tmp5
69 define <16 x i8> @vabaQs8(<16 x i8>* %A, <16 x i8>* %B, <16 x i8>* %C) nounwind {
70 ;CHECK-LABEL: vabaQs8:
71 ;CHECK: vaba.s8
72         %tmp1 = load <16 x i8>, <16 x i8>* %A
73         %tmp2 = load <16 x i8>, <16 x i8>* %B
74         %tmp3 = load <16 x i8>, <16 x i8>* %C
75         %tmp4 = call <16 x i8> @llvm.arm.neon.vabds.v16i8(<16 x i8> %tmp2, <16 x i8> %tmp3)
76         %tmp5 = add <16 x i8> %tmp1, %tmp4
77         ret <16 x i8> %tmp5
80 define <8 x i16> @vabaQs16(<8 x i16>* %A, <8 x i16>* %B, <8 x i16>* %C) nounwind {
81 ;CHECK-LABEL: vabaQs16:
82 ;CHECK: vaba.s16
83         %tmp1 = load <8 x i16>, <8 x i16>* %A
84         %tmp2 = load <8 x i16>, <8 x i16>* %B
85         %tmp3 = load <8 x i16>, <8 x i16>* %C
86         %tmp4 = call <8 x i16> @llvm.arm.neon.vabds.v8i16(<8 x i16> %tmp2, <8 x i16> %tmp3)
87         %tmp5 = add <8 x i16> %tmp1, %tmp4
88         ret <8 x i16> %tmp5
91 define <4 x i32> @vabaQs32(<4 x i32>* %A, <4 x i32>* %B, <4 x i32>* %C) nounwind {
92 ;CHECK-LABEL: vabaQs32:
93 ;CHECK: vaba.s32
94         %tmp1 = load <4 x i32>, <4 x i32>* %A
95         %tmp2 = load <4 x i32>, <4 x i32>* %B
96         %tmp3 = load <4 x i32>, <4 x i32>* %C
97         %tmp4 = call <4 x i32> @llvm.arm.neon.vabds.v4i32(<4 x i32> %tmp2, <4 x i32> %tmp3)
98         %tmp5 = add <4 x i32> %tmp1, %tmp4
99         ret <4 x i32> %tmp5
102 define <16 x i8> @vabaQu8(<16 x i8>* %A, <16 x i8>* %B, <16 x i8>* %C) nounwind {
103 ;CHECK-LABEL: vabaQu8:
104 ;CHECK: vaba.u8
105         %tmp1 = load <16 x i8>, <16 x i8>* %A
106         %tmp2 = load <16 x i8>, <16 x i8>* %B
107         %tmp3 = load <16 x i8>, <16 x i8>* %C
108         %tmp4 = call <16 x i8> @llvm.arm.neon.vabdu.v16i8(<16 x i8> %tmp2, <16 x i8> %tmp3)
109         %tmp5 = add <16 x i8> %tmp1, %tmp4
110         ret <16 x i8> %tmp5
113 define <8 x i16> @vabaQu16(<8 x i16>* %A, <8 x i16>* %B, <8 x i16>* %C) nounwind {
114 ;CHECK-LABEL: vabaQu16:
115 ;CHECK: vaba.u16
116         %tmp1 = load <8 x i16>, <8 x i16>* %A
117         %tmp2 = load <8 x i16>, <8 x i16>* %B
118         %tmp3 = load <8 x i16>, <8 x i16>* %C
119         %tmp4 = call <8 x i16> @llvm.arm.neon.vabdu.v8i16(<8 x i16> %tmp2, <8 x i16> %tmp3)
120         %tmp5 = add <8 x i16> %tmp1, %tmp4
121         ret <8 x i16> %tmp5
124 define <4 x i32> @vabaQu32(<4 x i32>* %A, <4 x i32>* %B, <4 x i32>* %C) nounwind {
125 ;CHECK-LABEL: vabaQu32:
126 ;CHECK: vaba.u32
127         %tmp1 = load <4 x i32>, <4 x i32>* %A
128         %tmp2 = load <4 x i32>, <4 x i32>* %B
129         %tmp3 = load <4 x i32>, <4 x i32>* %C
130         %tmp4 = call <4 x i32> @llvm.arm.neon.vabdu.v4i32(<4 x i32> %tmp2, <4 x i32> %tmp3)
131         %tmp5 = add <4 x i32> %tmp1, %tmp4
132         ret <4 x i32> %tmp5
135 declare <8 x i8>  @llvm.arm.neon.vabds.v8i8(<8 x i8>, <8 x i8>) nounwind readnone
136 declare <4 x i16> @llvm.arm.neon.vabds.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
137 declare <2 x i32> @llvm.arm.neon.vabds.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
139 declare <8 x i8>  @llvm.arm.neon.vabdu.v8i8(<8 x i8>, <8 x i8>) nounwind readnone
140 declare <4 x i16> @llvm.arm.neon.vabdu.v4i16(<4 x i16>, <4 x i16>) nounwind readnone
141 declare <2 x i32> @llvm.arm.neon.vabdu.v2i32(<2 x i32>, <2 x i32>) nounwind readnone
143 declare <16 x i8> @llvm.arm.neon.vabds.v16i8(<16 x i8>, <16 x i8>) nounwind readnone
144 declare <8 x i16> @llvm.arm.neon.vabds.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
145 declare <4 x i32> @llvm.arm.neon.vabds.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
147 declare <16 x i8> @llvm.arm.neon.vabdu.v16i8(<16 x i8>, <16 x i8>) nounwind readnone
148 declare <8 x i16> @llvm.arm.neon.vabdu.v8i16(<8 x i16>, <8 x i16>) nounwind readnone
149 declare <4 x i32> @llvm.arm.neon.vabdu.v4i32(<4 x i32>, <4 x i32>) nounwind readnone
151 define <8 x i16> @vabals8(<8 x i16>* %A, <8 x i8>* %B, <8 x i8>* %C) nounwind {
152 ;CHECK-LABEL: vabals8:
153 ;CHECK: vabal.s8
154         %tmp1 = load <8 x i16>, <8 x i16>* %A
155         %tmp2 = load <8 x i8>, <8 x i8>* %B
156         %tmp3 = load <8 x i8>, <8 x i8>* %C
157         %tmp4 = call <8 x i8> @llvm.arm.neon.vabds.v8i8(<8 x i8> %tmp2, <8 x i8> %tmp3)
158         %tmp5 = zext <8 x i8> %tmp4 to <8 x i16>
159         %tmp6 = add <8 x i16> %tmp1, %tmp5
160         ret <8 x i16> %tmp6
163 define <4 x i32> @vabals16(<4 x i32>* %A, <4 x i16>* %B, <4 x i16>* %C) nounwind {
164 ;CHECK-LABEL: vabals16:
165 ;CHECK: vabal.s16
166         %tmp1 = load <4 x i32>, <4 x i32>* %A
167         %tmp2 = load <4 x i16>, <4 x i16>* %B
168         %tmp3 = load <4 x i16>, <4 x i16>* %C
169         %tmp4 = call <4 x i16> @llvm.arm.neon.vabds.v4i16(<4 x i16> %tmp2, <4 x i16> %tmp3)
170         %tmp5 = zext <4 x i16> %tmp4 to <4 x i32>
171         %tmp6 = add <4 x i32> %tmp1, %tmp5
172         ret <4 x i32> %tmp6
175 define <2 x i64> @vabals32(<2 x i64>* %A, <2 x i32>* %B, <2 x i32>* %C) nounwind {
176 ;CHECK-LABEL: vabals32:
177 ;CHECK: vabal.s32
178         %tmp1 = load <2 x i64>, <2 x i64>* %A
179         %tmp2 = load <2 x i32>, <2 x i32>* %B
180         %tmp3 = load <2 x i32>, <2 x i32>* %C
181         %tmp4 = call <2 x i32> @llvm.arm.neon.vabds.v2i32(<2 x i32> %tmp2, <2 x i32> %tmp3)
182         %tmp5 = zext <2 x i32> %tmp4 to <2 x i64>
183         %tmp6 = add <2 x i64> %tmp1, %tmp5
184         ret <2 x i64> %tmp6
187 define <8 x i16> @vabalu8(<8 x i16>* %A, <8 x i8>* %B, <8 x i8>* %C) nounwind {
188 ;CHECK-LABEL: vabalu8:
189 ;CHECK: vabal.u8
190         %tmp1 = load <8 x i16>, <8 x i16>* %A
191         %tmp2 = load <8 x i8>, <8 x i8>* %B
192         %tmp3 = load <8 x i8>, <8 x i8>* %C
193         %tmp4 = call <8 x i8> @llvm.arm.neon.vabdu.v8i8(<8 x i8> %tmp2, <8 x i8> %tmp3)
194         %tmp5 = zext <8 x i8> %tmp4 to <8 x i16>
195         %tmp6 = add <8 x i16> %tmp1, %tmp5
196         ret <8 x i16> %tmp6
199 define <4 x i32> @vabalu16(<4 x i32>* %A, <4 x i16>* %B, <4 x i16>* %C) nounwind {
200 ;CHECK-LABEL: vabalu16:
201 ;CHECK: vabal.u16
202         %tmp1 = load <4 x i32>, <4 x i32>* %A
203         %tmp2 = load <4 x i16>, <4 x i16>* %B
204         %tmp3 = load <4 x i16>, <4 x i16>* %C
205         %tmp4 = call <4 x i16> @llvm.arm.neon.vabdu.v4i16(<4 x i16> %tmp2, <4 x i16> %tmp3)
206         %tmp5 = zext <4 x i16> %tmp4 to <4 x i32>
207         %tmp6 = add <4 x i32> %tmp1, %tmp5
208         ret <4 x i32> %tmp6
211 define <2 x i64> @vabalu32(<2 x i64>* %A, <2 x i32>* %B, <2 x i32>* %C) nounwind {
212 ;CHECK-LABEL: vabalu32:
213 ;CHECK: vabal.u32
214         %tmp1 = load <2 x i64>, <2 x i64>* %A
215         %tmp2 = load <2 x i32>, <2 x i32>* %B
216         %tmp3 = load <2 x i32>, <2 x i32>* %C
217         %tmp4 = call <2 x i32> @llvm.arm.neon.vabdu.v2i32(<2 x i32> %tmp2, <2 x i32> %tmp3)
218         %tmp5 = zext <2 x i32> %tmp4 to <2 x i64>
219         %tmp6 = add <2 x i64> %tmp1, %tmp5
220         ret <2 x i64> %tmp6