[NVPTX] Add missing patterns for div.approx with immediate denominator
[oota-llvm.git] / test / CodeGen / AArch64 / neon-simd-ldst.ll
1 ; RUN: llc < %s -O2 -verify-machineinstrs -mtriple=aarch64-none-linux-gnu -mattr=+neon | FileCheck %s
2
3 define void @test_ldstq_4v(i8* noalias %io, i32 %count) {
4 ; CHECK-LABEL: test_ldstq_4v
5 ; CHECK: ld4     {v0.16b, v1.16b, v2.16b, v3.16b}, [x0]
6 ; CHECK: st4     {v0.16b, v1.16b, v2.16b, v3.16b}, [x0]
7 entry:
8   %tobool62 = icmp eq i32 %count, 0
9   br i1 %tobool62, label %while.end, label %while.body
10
11 while.body:                                       ; preds = %entry, %while.body
12   %count.addr.063 = phi i32 [ %dec, %while.body ], [ %count, %entry ]
13   %dec = add i32 %count.addr.063, -1
14   %vld4 = tail call { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @llvm.arm.neon.vld4.v16i8(i8* %io, i32 1)
15   %vld4.fca.0.extract = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %vld4, 0
16   %vld4.fca.1.extract = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %vld4, 1
17   %vld4.fca.2.extract = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %vld4, 2
18   %vld4.fca.3.extract = extractvalue { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %vld4, 3
19   tail call void @llvm.arm.neon.vst4.v16i8(i8* %io, <16 x i8> %vld4.fca.0.extract, <16 x i8> %vld4.fca.1.extract, <16 x i8> %vld4.fca.2.extract, <16 x i8> %vld4.fca.3.extract, i32 1)
20   %tobool = icmp eq i32 %dec, 0
21   br i1 %tobool, label %while.end, label %while.body
22
23 while.end:                                        ; preds = %while.body, %entry
24   ret void
25 }
26
27 declare { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @llvm.arm.neon.vld4.v16i8(i8*, i32)
28
29 declare void @llvm.arm.neon.vst4.v16i8(i8*, <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, i32)
30
31 define void @test_ldstq_3v(i8* noalias %io, i32 %count) {
32 ; CHECK-LABEL: test_ldstq_3v
33 ; CHECK: ld3     {v0.16b, v1.16b, v2.16b}, [x0]
34 ; CHECK: st3     {v0.16b, v1.16b, v2.16b}, [x0]
35 entry:
36   %tobool47 = icmp eq i32 %count, 0
37   br i1 %tobool47, label %while.end, label %while.body
38
39 while.body:                                       ; preds = %entry, %while.body
40   %count.addr.048 = phi i32 [ %dec, %while.body ], [ %count, %entry ]
41   %dec = add i32 %count.addr.048, -1
42   %vld3 = tail call { <16 x i8>, <16 x i8>, <16 x i8> } @llvm.arm.neon.vld3.v16i8(i8* %io, i32 1)
43   %vld3.fca.0.extract = extractvalue { <16 x i8>, <16 x i8>, <16 x i8> } %vld3, 0
44   %vld3.fca.1.extract = extractvalue { <16 x i8>, <16 x i8>, <16 x i8> } %vld3, 1
45   %vld3.fca.2.extract = extractvalue { <16 x i8>, <16 x i8>, <16 x i8> } %vld3, 2
46   tail call void @llvm.arm.neon.vst3.v16i8(i8* %io, <16 x i8> %vld3.fca.0.extract, <16 x i8> %vld3.fca.1.extract, <16 x i8> %vld3.fca.2.extract, i32 1)
47   %tobool = icmp eq i32 %dec, 0
48   br i1 %tobool, label %while.end, label %while.body
49
50 while.end:                                        ; preds = %while.body, %entry
51   ret void
52 }
53
54 declare { <16 x i8>, <16 x i8>, <16 x i8> } @llvm.arm.neon.vld3.v16i8(i8*, i32)
55
56 declare void @llvm.arm.neon.vst3.v16i8(i8*, <16 x i8>, <16 x i8>, <16 x i8>, i32)
57
58 define void @test_ldstq_2v(i8* noalias %io, i32 %count) {
59 ; CHECK-LABEL: test_ldstq_2v
60 ; CHECK: ld2     {v0.16b, v1.16b}, [x0]
61 ; CHECK: st2     {v0.16b, v1.16b}, [x0]
62 entry:
63   %tobool22 = icmp eq i32 %count, 0
64   br i1 %tobool22, label %while.end, label %while.body
65
66 while.body:                                       ; preds = %entry, %while.body
67   %count.addr.023 = phi i32 [ %dec, %while.body ], [ %count, %entry ]
68   %dec = add i32 %count.addr.023, -1
69   %vld2 = tail call { <16 x i8>, <16 x i8> } @llvm.arm.neon.vld2.v16i8(i8* %io, i32 1)
70   %vld2.fca.0.extract = extractvalue { <16 x i8>, <16 x i8> } %vld2, 0
71   %vld2.fca.1.extract = extractvalue { <16 x i8>, <16 x i8> } %vld2, 1
72   tail call void @llvm.arm.neon.vst2.v16i8(i8* %io, <16 x i8> %vld2.fca.0.extract, <16 x i8> %vld2.fca.1.extract, i32 1)
73   %tobool = icmp eq i32 %dec, 0
74   br i1 %tobool, label %while.end, label %while.body
75
76 while.end:                                        ; preds = %while.body, %entry
77   ret void
78 }
79
80 declare { <16 x i8>, <16 x i8> } @llvm.arm.neon.vld2.v16i8(i8*, i32)
81
82 declare void @llvm.arm.neon.vst2.v16i8(i8*, <16 x i8>, <16 x i8>, i32)
83
84 define void @test_ldst_4v(i8* noalias %io, i32 %count) {
85 ; CHECK-LABEL: test_ldst_4v
86 ; CHECK: ld4     {v0.8b, v1.8b, v2.8b, v3.8b}, [x0]
87 ; CHECK: st4     {v0.8b, v1.8b, v2.8b, v3.8b}, [x0]
88 entry:
89   %tobool42 = icmp eq i32 %count, 0
90   br i1 %tobool42, label %while.end, label %while.body
91
92 while.body:                                       ; preds = %entry, %while.body
93   %count.addr.043 = phi i32 [ %dec, %while.body ], [ %count, %entry ]
94   %dec = add i32 %count.addr.043, -1
95   %vld4 = tail call { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @llvm.arm.neon.vld4.v8i8(i8* %io, i32 1)
96   %vld4.fca.0.extract = extractvalue { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } %vld4, 0
97   %vld4.fca.1.extract = extractvalue { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } %vld4, 1
98   %vld4.fca.2.extract = extractvalue { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } %vld4, 2
99   %vld4.fca.3.extract = extractvalue { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } %vld4, 3
100   tail call void @llvm.arm.neon.vst4.v8i8(i8* %io, <8 x i8> %vld4.fca.0.extract, <8 x i8> %vld4.fca.1.extract, <8 x i8> %vld4.fca.2.extract, <8 x i8> %vld4.fca.3.extract, i32 1)
101   %tobool = icmp eq i32 %dec, 0
102   br i1 %tobool, label %while.end, label %while.body
103
104 while.end:                                        ; preds = %while.body, %entry
105   ret void
106 }
107
108 declare { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @llvm.arm.neon.vld4.v8i8(i8*, i32)
109
110 declare void @llvm.arm.neon.vst4.v8i8(i8*, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, i32)
111
112 define void @test_ldst_3v(i8* noalias %io, i32 %count) {
113 ; CHECK-LABEL: test_ldst_3v
114 ; CHECK: ld3     {v0.8b, v1.8b, v2.8b}, [x0]
115 ; CHECK: st3     {v0.8b, v1.8b, v2.8b}, [x0]
116 entry:
117   %tobool32 = icmp eq i32 %count, 0
118   br i1 %tobool32, label %while.end, label %while.body
119
120 while.body:                                       ; preds = %entry, %while.body
121   %count.addr.033 = phi i32 [ %dec, %while.body ], [ %count, %entry ]
122   %dec = add i32 %count.addr.033, -1
123   %vld3 = tail call { <8 x i8>, <8 x i8>, <8 x i8> } @llvm.arm.neon.vld3.v8i8(i8* %io, i32 1)
124   %vld3.fca.0.extract = extractvalue { <8 x i8>, <8 x i8>, <8 x i8> } %vld3, 0
125   %vld3.fca.1.extract = extractvalue { <8 x i8>, <8 x i8>, <8 x i8> } %vld3, 1
126   %vld3.fca.2.extract = extractvalue { <8 x i8>, <8 x i8>, <8 x i8> } %vld3, 2
127   tail call void @llvm.arm.neon.vst3.v8i8(i8* %io, <8 x i8> %vld3.fca.0.extract, <8 x i8> %vld3.fca.1.extract, <8 x i8> %vld3.fca.2.extract, i32 1)
128   %tobool = icmp eq i32 %dec, 0
129   br i1 %tobool, label %while.end, label %while.body
130
131 while.end:                                        ; preds = %while.body, %entry
132   ret void
133 }
134
135 declare { <8 x i8>, <8 x i8>, <8 x i8> } @llvm.arm.neon.vld3.v8i8(i8*, i32)
136
137 declare void @llvm.arm.neon.vst3.v8i8(i8*, <8 x i8>, <8 x i8>, <8 x i8>, i32)
138
139 define void @test_ldst_2v(i8* noalias %io, i32 %count) {
140 ; CHECK-LABEL: test_ldst_2v
141 ; CHECK: ld2     {v0.8b, v1.8b}, [x0]
142 ; CHECK: st2     {v0.8b, v1.8b}, [x0]
143 entry:
144   %tobool22 = icmp eq i32 %count, 0
145   br i1 %tobool22, label %while.end, label %while.body
146
147 while.body:                                       ; preds = %entry, %while.body
148   %count.addr.023 = phi i32 [ %dec, %while.body ], [ %count, %entry ]
149   %dec = add i32 %count.addr.023, -1
150   %vld2 = tail call { <8 x i8>, <8 x i8> } @llvm.arm.neon.vld2.v8i8(i8* %io, i32 1)
151   %vld2.fca.0.extract = extractvalue { <8 x i8>, <8 x i8> } %vld2, 0
152   %vld2.fca.1.extract = extractvalue { <8 x i8>, <8 x i8> } %vld2, 1
153   tail call void @llvm.arm.neon.vst2.v8i8(i8* %io, <8 x i8> %vld2.fca.0.extract, <8 x i8> %vld2.fca.1.extract, i32 1)
154   %tobool = icmp eq i32 %dec, 0
155   br i1 %tobool, label %while.end, label %while.body
156
157 while.end:                                        ; preds = %while.body, %entry
158   ret void
159 }
160
161 declare { <8 x i8>, <8 x i8> } @llvm.arm.neon.vld2.v8i8(i8*, i32)
162
163 declare void @llvm.arm.neon.vst2.v8i8(i8*, <8 x i8>, <8 x i8>, i32)
164