blob: b4f093c5e05b654969ddb1cbd070d18e53d6a655 [file] [log] [blame]
Bob Wilson3941cf72009-09-15 20:58:02 +00001; RUN: llc < %s -march=arm -mattr=+neon | FileCheck %s
Bob Wilsone60fee02009-06-22 23:27:02 +00002
3define i32 @vget_lanes8(<8 x i8>* %A) nounwind {
Bob Wilson3941cf72009-09-15 20:58:02 +00004;CHECK: vget_lanes8:
5;CHECK: vmov.s8
Bob Wilsone60fee02009-06-22 23:27:02 +00006 %tmp1 = load <8 x i8>* %A
7 %tmp2 = extractelement <8 x i8> %tmp1, i32 1
8 %tmp3 = sext i8 %tmp2 to i32
9 ret i32 %tmp3
10}
11
12define i32 @vget_lanes16(<4 x i16>* %A) nounwind {
Bob Wilson3941cf72009-09-15 20:58:02 +000013;CHECK: vget_lanes16:
14;CHECK: vmov.s16
Bob Wilsone60fee02009-06-22 23:27:02 +000015 %tmp1 = load <4 x i16>* %A
16 %tmp2 = extractelement <4 x i16> %tmp1, i32 1
17 %tmp3 = sext i16 %tmp2 to i32
18 ret i32 %tmp3
19}
20
21define i32 @vget_laneu8(<8 x i8>* %A) nounwind {
Bob Wilson3941cf72009-09-15 20:58:02 +000022;CHECK: vget_laneu8:
23;CHECK: vmov.u8
Bob Wilsone60fee02009-06-22 23:27:02 +000024 %tmp1 = load <8 x i8>* %A
25 %tmp2 = extractelement <8 x i8> %tmp1, i32 1
26 %tmp3 = zext i8 %tmp2 to i32
27 ret i32 %tmp3
28}
29
30define i32 @vget_laneu16(<4 x i16>* %A) nounwind {
Bob Wilson3941cf72009-09-15 20:58:02 +000031;CHECK: vget_laneu16:
32;CHECK: vmov.u16
Bob Wilsone60fee02009-06-22 23:27:02 +000033 %tmp1 = load <4 x i16>* %A
34 %tmp2 = extractelement <4 x i16> %tmp1, i32 1
35 %tmp3 = zext i16 %tmp2 to i32
36 ret i32 %tmp3
37}
38
39; Do a vector add to keep the extraction from being done directly from memory.
40define i32 @vget_lanei32(<2 x i32>* %A) nounwind {
Bob Wilson3941cf72009-09-15 20:58:02 +000041;CHECK: vget_lanei32:
42;CHECK: vmov.32
Bob Wilsone60fee02009-06-22 23:27:02 +000043 %tmp1 = load <2 x i32>* %A
44 %tmp2 = add <2 x i32> %tmp1, %tmp1
45 %tmp3 = extractelement <2 x i32> %tmp2, i32 1
46 ret i32 %tmp3
47}
48
49define i32 @vgetQ_lanes8(<16 x i8>* %A) nounwind {
Bob Wilson3941cf72009-09-15 20:58:02 +000050;CHECK: vgetQ_lanes8:
51;CHECK: vmov.s8
Bob Wilsone60fee02009-06-22 23:27:02 +000052 %tmp1 = load <16 x i8>* %A
53 %tmp2 = extractelement <16 x i8> %tmp1, i32 1
54 %tmp3 = sext i8 %tmp2 to i32
55 ret i32 %tmp3
56}
57
58define i32 @vgetQ_lanes16(<8 x i16>* %A) nounwind {
Bob Wilson3941cf72009-09-15 20:58:02 +000059;CHECK: vgetQ_lanes16:
60;CHECK: vmov.s16
Bob Wilsone60fee02009-06-22 23:27:02 +000061 %tmp1 = load <8 x i16>* %A
62 %tmp2 = extractelement <8 x i16> %tmp1, i32 1
63 %tmp3 = sext i16 %tmp2 to i32
64 ret i32 %tmp3
65}
66
67define i32 @vgetQ_laneu8(<16 x i8>* %A) nounwind {
Bob Wilson3941cf72009-09-15 20:58:02 +000068;CHECK: vgetQ_laneu8:
69;CHECK: vmov.u8
Bob Wilsone60fee02009-06-22 23:27:02 +000070 %tmp1 = load <16 x i8>* %A
71 %tmp2 = extractelement <16 x i8> %tmp1, i32 1
72 %tmp3 = zext i8 %tmp2 to i32
73 ret i32 %tmp3
74}
75
76define i32 @vgetQ_laneu16(<8 x i16>* %A) nounwind {
Bob Wilson3941cf72009-09-15 20:58:02 +000077;CHECK: vgetQ_laneu16:
78;CHECK: vmov.u16
Bob Wilsone60fee02009-06-22 23:27:02 +000079 %tmp1 = load <8 x i16>* %A
80 %tmp2 = extractelement <8 x i16> %tmp1, i32 1
81 %tmp3 = zext i16 %tmp2 to i32
82 ret i32 %tmp3
83}
84
85; Do a vector add to keep the extraction from being done directly from memory.
86define i32 @vgetQ_lanei32(<4 x i32>* %A) nounwind {
Bob Wilson3941cf72009-09-15 20:58:02 +000087;CHECK: vgetQ_lanei32:
88;CHECK: vmov.32
Bob Wilsone60fee02009-06-22 23:27:02 +000089 %tmp1 = load <4 x i32>* %A
90 %tmp2 = add <4 x i32> %tmp1, %tmp1
91 %tmp3 = extractelement <4 x i32> %tmp2, i32 1
92 ret i32 %tmp3
93}