学习在kernel态下使用NEON对算法进行加速的方法
<p>本文跟着小编一起来学习在linux kernel态下如何使用neon对算法进行加速的技巧,内容通过图文实例给大家做了详细分析,一起来看下。</p>
<p>
arm处理器从cortex系列开始集成neon处理单元,该单元可以简单理解为协处理器,专门为矩阵运算等算法设计,特别适用于图像、视频、音频处理等场景,应用也很广泛。</p>
<p>
本文先对neon处理单元进行简要介绍,然后介绍如何在内核态下使用neon,最后列举实例说明。</p>
<p>
<span><strong>一.neon简介</strong></span></p>
<p>
其实最好的资料就是官方文档,cortex™-a series programmer's guide ,以下描述摘自该文档</p>
<p>
1.1 simd</p>
<p>
neon采用simd架构,single instruction multy data,一条指令处理多个数据,neon中这多个数据可以很多,而且配置灵活(8bit、16bit、32bit为单位,可多个单位数据),这是优势所在。</p>
<p>
如下图,apu需要至少四条指令完成加操作,而neon只需要1条,考虑到ld和st,节省的指令更多。</p>
<p>
<img title="学习在kernel态下使用NEON对算法进行加速的方法" alt="学习在kernel态下使用NEON对算法进行加速的方法" src="https://zhuji.jb51.net/uploads/img/202305/7fb2912423e43a5b96f2f1942345a3ab.jpg"></p>
<p>
上述特性,使neon特别适合处理块数据、图像、视频、音频等。</p>
<p>
1.2 neon architecture overview</p>
<p>
neon也是load/store架构,寄存器为64bit/128bit,可形成向量化数据,配合若干便于向量操作的指令。</p>
<p>
1.2.1 commonality with vfp 1.2.2 data type</p>
<p>
<img title="学习在kernel态下使用NEON对算法进行加速的方法" alt="学习在kernel态下使用NEON对算法进行加速的方法" src="https://zhuji.jb51.net/uploads/img/202305/67af9c52f9e8dcce82953d9e271ab737.jpg"></p>
<p>
指令中的数据类型表示,例如vmlal.s8:</p>
<p>
<img title="学习在kernel态下使用NEON对算法进行加速的方法" alt="学习在kernel态下使用NEON对算法进行加速的方法" src="https://zhuji.jb51.net/uploads/img/202305/45d557f23453e36d9fd3b2647a7c7af4.jpg"></p>
<p>
1.2.3 registers </p>
<p>
32个64bit寄存器,d0~d31;同时可组成16个128 bit寄存器,q0~q15。与vfp公用。</p>
<p>
<img title="学习在kernel态下使用NEON对算法进行加速的方法" alt="学习在kernel态下使用NEON对算法进行加速的方法" src="https://zhuji.jb51.net/uploads/img/202305/aed5c492ba86675a56ab1a8060fa1948.jpg"></p>
<p>
寄存器内部的数据单位为8bit、16bit、32bit,可以根据需要灵活配置。</p>
<p>
<img title="学习在kernel态下使用NEON对算法进行加速的方法" alt="学习在kernel态下使用NEON对算法进行加速的方法" src="https://zhuji.jb51.net/uploads/img/202305/07fddcfcc76488d60921c505295199e2.jpg"></p>
<p>
neon的指令有normal,long,wide,narrow和saturating variants等几种后缀,是根据操作的源src和dst寄存器的类型确定的。</p>
<p>
<img title="学习在kernel态下使用NEON对算法进行加速的方法" alt="学习在kernel态下使用NEON对算法进行加速的方法" src="https://zhuji.jb51.net/uploads/img/202305/14bc1ac37353fd3635808b9391393a53.jpg"></p>
<p>
<img title="学习在kernel态下使用NEON对算法进行加速的方法" alt="学习在kernel态下使用NEON对算法进行加速的方法" src="https://zhuji.jb51.net/uploads/img/202305/ec3cda3597ee59f6fcc90a78449e3eb5.jpg"></p>
<p>
1.2.4 instruction set</p>
<p>
<img title="学习在kernel态下使用NEON对算法进行加速的方法" alt="学习在kernel态下使用NEON对算法进行加速的方法" src="https://zhuji.jb51.net/uploads/img/202305/833252adf94205e4ec70669e725c4270.jpg"></p>
<p>
<img title="学习在kernel态下使用NEON对算法进行加速的方法" alt="学习在kernel态下使用NEON对算法进行加速的方法" src="https://zhuji.jb51.net/uploads/img/202305/c67be37dbf2709dce25937cbf347c435.jpg"></p>
<p>
1.3 neon 指令分类概述</p>
<p>
指令比较多, 详细可参考cortex™-a series programmer's guide。可大体分为:</p>
<p>
neon general data processing instructions neon shift instructions neon logical and compare operations neon arithmetic instructions neon multiply instructions neon load and store element and structure instructions b.8 neon and vfp pseudo-instructions</p>
<p>
简单罗列一下各指令</p>
<p>
<img title="学习在kernel态下使用NEON对算法进行加速的方法" alt="学习在kernel态下使用NEON对算法进行加速的方法" src="https://zhuji.jb51.net/uploads/img/202305/97221f976a2cce1da3d4d571afc24506.jpg"></p>
<p>
<img title="学习在kernel态下使用NEON对算法进行加速的方法" alt="学习在kernel态下使用NEON对算法进行加速的方法" src="https://zhuji.jb51.net/uploads/img/202305/e6f306165cceb32a55c5173d52ba618a.jpg"></p>
<p>
<img title="学习在kernel态下使用NEON对算法进行加速的方法" alt="学习在kernel态下使用NEON对算法进行加速的方法" src="https://zhuji.jb51.net/uploads/img/202305/6c64de15ccbf5c1bb5d3b3a3694b274f.jpg"></p>
<p>
<img title="学习在kernel态下使用NEON对算法进行加速的方法" alt="学习在kernel态下使用NEON对算法进行加速的方法" src="https://zhuji.jb51.net/uploads/img/202305/9864b3506af506c1faa72ada08cad14b.jpg"></p>
<p>
<img title="学习在kernel态下使用NEON对算法进行加速的方法" alt="学习在kernel态下使用NEON对算法进行加速的方法" src="https://zhuji.jb51.net/uploads/img/202305/ab9e637aaa5aa96f57973469979a9e30.jpg"></p>
<p>
无循环左移,负数左移按右移处理。</p>
<p>
load和store指令不太好理解,说明一下。</p>
<p>
<img title="学习在kernel态下使用NEON对算法进行加速的方法" alt="学习在kernel态下使用NEON对算法进行加速的方法" src="https://zhuji.jb51.net/uploads/img/202305/e81a8abdf7d0aa5004a782ce3f11fbb0.jpg"></p>
<p>
1.4 neon 使用方式 </p>
<p>
1.4.1 neon使用方式</p>
<p>
neon有若干种使用方式:</p>
<p>
c语言被编译器自动向量化,需要增加编译选项,且c语言编码时有若干注意事项。这种方式不确定性太大,没啥实用价值 neon汇编,可行,汇编稍微复杂一点,但是核心算法还是值得的 intrinsics,gcc和armcc等编译器提供了若干与neon对应的inline函数,可直接在c语言里调用,这些函数反汇编时会直接编程响应的neon指令。这种方式比较实用与c语言环境,且相对简单。本文后续使用这种方式进行详细说明。 1.4.2 c语言neon数据类型</p>
<p>
需包含arm_neon.h头文件,该头文件在gcc目录里。都是向量数据。</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterxhtml" id="highlighter_793855">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
<div class="line number7 index6 alt2">
7</div>
<div class="line number8 index7 alt1">
8</div>
<div class="line number9 index8 alt2">
9</div>
<div class="line number10 index9 alt1">
10</div>
<div class="line number11 index10 alt2">
11</div>
<div class="line number12 index11 alt1">
12</div>
<div class="line number13 index12 alt2">
13</div>
<div class="line number14 index13 alt1">
14</div>
<div class="line number15 index14 alt2">
15</div>
<div class="line number16 index15 alt1">
16</div>
<div class="line number17 index16 alt2">
17</div>
<div class="line number18 index17 alt1">
18</div>
<div class="line number19 index18 alt2">
19</div>
<div class="line number20 index19 alt1">
20</div>
<div class="line number21 index20 alt2">
21</div>
<div class="line number22 index21 alt1">
22</div>
<div class="line number23 index22 alt2">
23</div>
<div class="line number24 index23 alt1">
24</div>
<div class="line number25 index24 alt2">
25</div>
<div class="line number26 index25 alt1">
26</div>
<div class="line number27 index26 alt2">
27</div>
<div class="line number28 index27 alt1">
28</div>
<div class="line number29 index28 alt2">
29</div>
<div class="line number30 index29 alt1">
30</div>
<div class="line number31 index30 alt2">
31</div>
<div class="line number32 index31 alt1">
32</div>
<div class="line number33 index32 alt2">
33</div>
<div class="line number34 index33 alt1">
34</div>
<div class="line number35 index34 alt2">
35</div>
<div class="line number36 index35 alt1">
36</div>
<div class="line number37 index36 alt2">
37</div>
<div class="line number38 index37 alt1">
38</div>
<div class="line number39 index38 alt2">
39</div>
<div class="line number40 index39 alt1">
40</div>
<div class="line number41 index40 alt2">
41</div>
<div class="line number42 index41 alt1">
42</div>
<div class="line number43 index42 alt2">
43</div>
<div class="line number44 index43 alt1">
44</div>
<div class="line number45 index44 alt2">
45</div>
<div class="line number46 index45 alt1">
46</div>
<div class="line number47 index46 alt2">
47</div>
<div class="line number48 index47 alt1">
48</div>
<div class="line number49 index48 alt2">
49</div>
<div class="line number50 index49 alt1">
50</div>
<div class="line number51 index50 alt2">
51</div>
<div class="line number52 index51 alt1">
52</div>
<div class="line number53 index52 alt2">
53</div>
<div class="line number54 index53 alt1">
54</div>
<div class="line number55 index54 alt2">
55</div>
<div class="line number56 index55 alt1">
56</div>
<div class="line number57 index56 alt2">
57</div>
<div class="line number58 index57 alt1">
58</div>
<div class="line number59 index58 alt2">
59</div>
<div class="line number60 index59 alt1">
60</div>
<div class="line number61 index60 alt2">
61</div>
<div class="line number62 index61 alt1">
62</div>
<div class="line number63 index62 alt2">
63</div>
<div class="line number64 index63 alt1">
64</div>
<div class="line number65 index64 alt2">
65</div>
<div class="line number66 index65 alt1">
66</div>
<div class="line number67 index66 alt2">
67</div>
<div class="line number68 index67 alt1">
68</div>
<div class="line number69 index68 alt2">
69</div>
<div class="line number70 index69 alt1">
70</div>
<div class="line number71 index70 alt2">
71</div>
<div class="line number72 index71 alt1">
72</div>
<div class="line number73 index72 alt2">
73</div>
<div class="line number74 index73 alt1">
74</div>
<div class="line number75 index74 alt2">
75</div>
<div class="line number76 index75 alt1">
76</div>
<div class="line number77 index76 alt2">
77</div>
<div class="line number78 index77 alt1">
78</div>
<div class="line number79 index78 alt2">
79</div>
<div class="line number80 index79 alt1">
80</div>
<div class="line number81 index80 alt2">
81</div>
<div class="line number82 index81 alt1">
82</div>
<div class="line number83 index82 alt2">
83</div>
<div class="line number84 index83 alt1">
84</div>
<div class="line number85 index84 alt2">
85</div>
<div class="line number86 index85 alt1">
86</div>
<div class="line number87 index86 alt2">
87</div>
<div class="line number88 index87 alt1">
88</div>
<div class="line number89 index88 alt2">
89</div>
<div class="line number90 index89 alt1">
90</div>
<div class="line number91 index90 alt2">
91</div>
<div class="line number92 index91 alt1">
92</div>
<div class="line number93 index92 alt2">
93</div>
<div class="line number94 index93 alt1">
94</div>
<div class="line number95 index94 alt2">
95</div>
<div class="line number96 index95 alt1">
96</div>
<div class="line number97 index96 alt2">
97</div>
<div class="line number98 index97 alt1">
98</div>
<div class="line number99 index98 alt2">
99</div>
<div class="line number100 index99 alt1">
100</div>
<div class="line number101 index100 alt2">
101</div>
<div class="line number102 index101 alt1">
102</div>
<div class="line number103 index102 alt2">
103</div>
<div class="line number104 index103 alt1">
104</div>
<div class="line number105 index104 alt2">
105</div>
<div class="line number106 index105 alt1">
106</div>
<div class="line number107 index106 alt2">
107</div>
<div class="line number108 index107 alt1">
108</div>
<div class="line number109 index108 alt2">
109</div>
<div class="line number110 index109 alt1">
110</div>
<div class="line number111 index110 alt2">
111</div>
<div class="line number112 index111 alt1">
112</div>
<div class="line number113 index112 alt2">
113</div>
<div class="line number114 index113 alt1">
114</div>
<div class="line number115 index114 alt2">
115</div>
<div class="line number116 index115 alt1">
116</div>
<div class="line number117 index116 alt2">
117</div>
<div class="line number118 index117 alt1">
118</div>
<div class="line number119 index118 alt2">
119</div>
<div class="line number120 index119 alt1">
120</div>
<div class="line number121 index120 alt2">
121</div>
<div class="line number122 index121 alt1">
122</div>
<div class="line number123 index122 alt2">
123</div>
<div class="line number124 index123 alt1">
124</div>
<div class="line number125 index124 alt2">
125</div>
<div class="line number126 index125 alt1">
126</div>
<div class="line number127 index126 alt2">
127</div>
<div class="line number128 index127 alt1">
128</div>
<div class="line number129 index128 alt2">
129</div>
<div class="line number130 index129 alt1">
130</div>
<div class="line number131 index130 alt2">
131</div>
<div class="line number132 index131 alt1">
132</div>
<div class="line number133 index132 alt2">
133</div>
<div class="line number134 index133 alt1">
134</div>
<div class="line number135 index134 alt2">
135</div>
<div class="line number136 index135 alt1">
136</div>
<div class="line number137 index136 alt2">
137</div>
<div class="line number138 index137 alt1">
138</div>
<div class="line number139 index138 alt2">
139</div>
<div class="line number140 index139 alt1">
140</div>
<div class="line number141 index140 alt2">
141</div>
<div class="line number142 index141 alt1">
142</div>
<div class="line number143 index142 alt2">
143</div>
<div class="line number144 index143 alt1">
144</div>
<div class="line number145 index144 alt2">
145</div>
<div class="line number146 index145 alt1">
146</div>
<div class="line number147 index146 alt2">
147</div>
<div class="line number148 index147 alt1">
148</div>
<div class="line number149 index148 alt2">
149</div>
<div class="line number150 index149 alt1">
150</div>
<div class="line number151 index150 alt2">
151</div>
<div class="line number152 index151 alt1">
152</div>
<div class="line number153 index152 alt2">
153</div>
<div class="line number154 index153 alt1">
154</div>
<div class="line number155 index154 alt2">
155</div>
<div class="line number156 index155 alt1">
156</div>
<div class="line number157 index156 alt2">
157</div>
<div class="line number158 index157 alt1">
158</div>
<div class="line number159 index158 alt2">
159</div>
<div class="line number160 index159 alt1">
160</div>
<div class="line number161 index160 alt2">
161</div>
<div class="line number162 index161 alt1">
162</div>
<div class="line number163 index162 alt2">
163</div>
<div class="line number164 index163 alt1">
164</div>
<div class="line number165 index164 alt2">
165</div>
<div class="line number166 index165 alt1">
166</div>
<div class="line number167 index166 alt2">
167</div>
<div class="line number168 index167 alt1">
168</div>
<div class="line number169 index168 alt2">
169</div>
<div class="line number170 index169 alt1">
170</div>
<div class="line number171 index170 alt2">
171</div>
<div class="line number172 index171 alt1">
172</div>
<div class="line number173 index172 alt2">
173</div>
<div class="line number174 index173 alt1">
174</div>
<div class="line number175 index174 alt2">
175</div>
<div class="line number176 index175 alt1">
176</div>
<div class="line number177 index176 alt2">
177</div>
<div class="line number178 index177 alt1">
178</div>
<div class="line number179 index178 alt2">
179</div>
<div class="line number180 index179 alt1">
180</div>
<div class="line number181 index180 alt2">
181</div>
<div class="line number182 index181 alt1">
182</div>
<div class="line number183 index182 alt2">
183</div>
<div class="line number184 index183 alt1">
184</div>
<div class="line number185 index184 alt2">
185</div>
<div class="line number186 index185 alt1">
186</div>
<div class="line number187 index186 alt2">
187</div>
<div class="line number188 index187 alt1">
188</div>
<div class="line number189 index188 alt2">
189</div>
<div class="line number190 index189 alt1">
190</div>
<div class="line number191 index190 alt2">
191</div>
<div class="line number192 index191 alt1">
192</div>
<div class="line number193 index192 alt2">
193</div>
<div class="line number194 index193 alt1">
194</div>
<div class="line number195 index194 alt2">
195</div>
<div class="line number196 index195 alt1">
196</div>
<div class="line number197 index196 alt2">
197</div>
<div class="line number198 index197 alt1">
198</div>
<div class="line number199 index198 alt2">
199</div>
<div class="line number200 index199 alt1">
200</div>
<div class="line number201 index200 alt2">
201</div>
<div class="line number202 index201 alt1">
202</div>
<div class="line number203 index202 alt2">
203</div>
<div class="line number204 index203 alt1">
204</div>
<div class="line number205 index204 alt2">
205</div>
<div class="line number206 index205 alt1">
206</div>
<div class="line number207 index206 alt2">
207</div>
<div class="line number208 index207 alt1">
208</div>
<div class="line number209 index208 alt2">
209</div>
<div class="line number210 index209 alt1">
210</div>
<div class="line number211 index210 alt2">
211</div>
<div class="line number212 index211 alt1">
212</div>
<div class="line number213 index212 alt2">
213</div>
<div class="line number214 index213 alt1">
214</div>
<div class="line number215 index214 alt2">
215</div>
<div class="line number216 index215 alt1">
216</div>
<div class="line number217 index216 alt2">
217</div>
<div class="line number218 index217 alt1">
218</div>
<div class="line number219 index218 alt2">
219</div>
<div class="line number220 index219 alt1">
220</div>
<div class="line number221 index220 alt2">
221</div>
<div class="line number222 index221 alt1">
222</div>
<div class="line number223 index222 alt2">
223</div>
<div class="line number224 index223 alt1">
224</div>
<div class="line number225 index224 alt2">
225</div>
<div class="line number226 index225 alt1">
226</div>
<div class="line number227 index226 alt2">
227</div>
<div class="line number228 index227 alt1">
228</div>
<div class="line number229 index228 alt2">
229</div>
<div class="line number230 index229 alt1">
230</div>
<div class="line number231 index230 alt2">
231</div>
<div class="line number232 index231 alt1">
232</div>
<div class="line number233 index232 alt2">
233</div>
<div class="line number234 index233 alt1">
234</div>
<div class="line number235 index234 alt2">
235</div>
<div class="line number236 index235 alt1">
236</div>
<div class="line number237 index236 alt2">
237</div>
<div class="line number238 index237 alt1">
238</div>
<div class="line number239 index238 alt2">
239</div>
<div class="line number240 index239 alt1">
240</div>
<div class="line number241 index240 alt2">
241</div>
<div class="line number242 index241 alt1">
242</div>
<div class="line number243 index242 alt2">
243</div>
<div class="line number244 index243 alt1">
244</div>
<div class="line number245 index244 alt2">
245</div>
<div class="line number246 index245 alt1">
246</div>
<div class="line number247 index246 alt2">
247</div>
<div class="line number248 index247 alt1">
248</div>
<div class="line number249 index248 alt2">
249</div>
<div class="line number250 index249 alt1">
250</div>
<div class="line number251 index250 alt2">
251</div>
<div class="line number252 index251 alt1">
252</div>
<div class="line number253 index252 alt2">
253</div>
<div class="line number254 index253 alt1">
254</div>
<div class="line number255 index254 alt2">
255</div>
<div class="line number256 index255 alt1">
256</div>
<div class="line number257 index256 alt2">
257</div>
<div class="line number258 index257 alt1">
258</div>
<div class="line number259 index258 alt2">
259</div>
<div class="line number260 index259 alt1">
260</div>
<div class="line number261 index260 alt2">
261</div>
<div class="line number262 index261 alt1">
262</div>
<div class="line number263 index262 alt2">
263</div>
<div class="line number264 index263 alt1">
264</div>
<div class="line number265 index264 alt2">
265</div>
<div class="line number266 index265 alt1">
266</div>
<div class="line number267 index266 alt2">
267</div>
<div class="line number268 index267 alt1">
268</div>
<div class="line number269 index268 alt2">
269</div>
<div class="line number270 index269 alt1">
270</div>
<div class="line number271 index270 alt2">
271</div>
<div class="line number272 index271 alt1">
272</div>
<div class="line number273 index272 alt2">
273</div>
<div class="line number274 index273 alt1">
274</div>
<div class="line number275 index274 alt2">
275</div>
<div class="line number276 index275 alt1">
276</div>
<div class="line number277 index276 alt2">
277</div>
<div class="line number278 index277 alt1">
278</div>
<div class="line number279 index278 alt2">
279</div>
<div class="line number280 index279 alt1">
280</div>
<div class="line number281 index280 alt2">
281</div>
<div class="line number282 index281 alt1">
282</div>
<div class="line number283 index282 alt2">
283</div>
<div class="line number284 index283 alt1">
284</div>
<div class="line number285 index284 alt2">
285</div>
<div class="line number286 index285 alt1">
286</div>
<div class="line number287 index286 alt2">
287</div>
<div class="line number288 index287 alt1">
288</div>
<div class="line number289 index288 alt2">
289</div>
<div class="line number290 index289 alt1">
290</div>
<div class="line number291 index290 alt2">
291</div>
<div class="line number292 index291 alt1">
292</div>
<div class="line number293 index292 alt2">
293</div>
<div class="line number294 index293 alt1">
294</div>
<div class="line number295 index294 alt2">
295</div>
<div class="line number296 index295 alt1">
296</div>
<div class="line number297 index296 alt2">
297</div>
<div class="line number298 index297 alt1">
298</div>
<div class="line number299 index298 alt2">
299</div>
<div class="line number300 index299 alt1">
300</div>
<div class="line number301 index300 alt2">
301</div>
<div class="line number302 index301 alt1">
302</div>
<div class="line number303 index302 alt2">
303</div>
<div class="line number304 index303 alt1">
304</div>
<div class="line number305 index304 alt2">
305</div>
<div class="line number306 index305 alt1">
306</div>
<div class="line number307 index306 alt2">
307</div>
<div class="line number308 index307 alt1">
308</div>
<div class="line number309 index308 alt2">
309</div>
<div class="line number310 index309 alt1">
310</div>
<div class="line number311 index310 alt2">
311</div>
<div class="line number312 index311 alt1">
312</div>
<div class="line number313 index312 alt2">
313</div>
<div class="line number314 index313 alt1">
314</div>
<div class="line number315 index314 alt2">
315</div>
<div class="line number316 index315 alt1">
316</div>
<div class="line number317 index316 alt2">
317</div>
<div class="line number318 index317 alt1">
318</div>
<div class="line number319 index318 alt2">
319</div>
<div class="line number320 index319 alt1">
320</div>
<div class="line number321 index320 alt2">
321</div>
<div class="line number322 index321 alt1">
322</div>
<div class="line number323 index322 alt2">
323</div>
<div class="line number324 index323 alt1">
324</div>
<div class="line number325 index324 alt2">
325</div>
<div class="line number326 index325 alt1">
326</div>
<div class="line number327 index326 alt2">
327</div>
<div class="line number328 index327 alt1">
328</div>
<div class="line number329 index328 alt2">
329</div>
<div class="line number330 index329 alt1">
330</div>
<div class="line number331 index330 alt2">
331</div>
<div class="line number332 index331 alt1">
332</div>
<div class="line number333 index332 alt2">
333</div>
<div class="line number334 index333 alt1">
334</div>
<div class="line number335 index334 alt2">
335</div>
<div class="line number336 index335 alt1">
336</div>
<div class="line number337 index336 alt2">
337</div>
<div class="line number338 index337 alt1">
338</div>
<div class="line number339 index338 alt2">
339</div>
<div class="line number340 index339 alt1">
340</div>
<div class="line number341 index340 alt2">
341</div>
<div class="line number342 index341 alt1">
342</div>
<div class="line number343 index342 alt2">
343</div>
<div class="line number344 index343 alt1">
344</div>
<div class="line number345 index344 alt2">
345</div>
<div class="line number346 index345 alt1">
346</div>
<div class="line number347 index346 alt2">
347</div>
<div class="line number348 index347 alt1">
348</div>
<div class="line number349 index348 alt2">
349</div>
<div class="line number350 index349 alt1">
350</div>
<div class="line number351 index350 alt2">
351</div>
<div class="line number352 index351 alt1">
352</div>
<div class="line number353 index352 alt2">
353</div>
<div class="line number354 index353 alt1">
354</div>
<div class="line number355 index354 alt2">
355</div>
<div class="line number356 index355 alt1">
356</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="xhtml plain">typedef __builtin_neon_qi int8x8_t __attribute__ ((__vector_size__ (8)));</code>
</div>
<div class="line number2 index1 alt1">
<code class="xhtml plain">typedef __builtin_neon_hi int16x4_t __attribute__ ((__vector_size__ (8)));</code>
</div>
<div class="line number3 index2 alt2">
<code class="xhtml plain">typedef __builtin_neon_si int32x2_t __attribute__ ((__vector_size__ (8)));</code>
</div>
<div class="line number4 index3 alt1">
<code class="xhtml plain">typedef __builtin_neon_di int64x1_t;</code>
</div>
<div class="line number5 index4 alt2">
<code class="xhtml plain">typedef __builtin_neon_sf float32x2_t __attribute__ ((__vector_size__ (8)));</code>
</div>
<div class="line number6 index5 alt1">
<code class="xhtml plain">typedef __builtin_neon_poly8 poly8x8_t __attribute__ ((__vector_size__ (8)));</code>
</div>
<div class="line number7 index6 alt2">
<code class="xhtml plain">typedef __builtin_neon_poly16 poly16x4_t __attribute__ ((__vector_size__ (8)));</code>
</div>
<div class="line number8 index7 alt1">
<code class="xhtml plain">typedef __builtin_neon_uqi uint8x8_t __attribute__ ((__vector_size__ (8)));</code>
</div>
<div class="line number9 index8 alt2">
<code class="xhtml plain">typedef __builtin_neon_uhi uint16x4_t __attribute__ ((__vector_size__ (8)));</code>
</div>
<div class="line number10 index9 alt1">
<code class="xhtml plain">typedef __builtin_neon_usi uint32x2_t __attribute__ ((__vector_size__ (8)));</code>
</div>
<div class="line number11 index10 alt2">
<code class="xhtml plain">typedef __builtin_neon_udi uint64x1_t;</code>
</div>
<div class="line number12 index11 alt1">
<code class="xhtml plain">typedef __builtin_neon_qi int8x16_t __attribute__ ((__vector_size__ (16)));</code>
</div>
<div class="line number13 index12 alt2">
<code class="xhtml plain">typedef __builtin_neon_hi int16x8_t __attribute__ ((__vector_size__ (16)));</code>
</div>
<div class="line number14 index13 alt1">
<code class="xhtml plain">typedef __builtin_neon_si int32x4_t __attribute__ ((__vector_size__ (16)));</code>
</div>
<div class="line number15 index14 alt2">
<code class="xhtml plain">typedef __builtin_neon_di int64x2_t __attribute__ ((__vector_size__ (16)));</code>
</div>
<div class="line number16 index15 alt1">
<code class="xhtml plain">typedef __builtin_neon_sf float32x4_t __attribute__ ((__vector_size__ (16)));</code>
</div>
<div class="line number17 index16 alt2">
<code class="xhtml plain">typedef __builtin_neon_poly8 poly8x16_t __attribute__ ((__vector_size__ (16)));</code>
</div>
<div class="line number18 index17 alt1">
<code class="xhtml plain">typedef __builtin_neon_poly16 poly16x8_t __attribute__ ((__vector_size__ (16)));</code>
</div>
<div class="line number19 index18 alt2">
<code class="xhtml plain">typedef __builtin_neon_uqi uint8x16_t __attribute__ ((__vector_size__ (16)));</code>
</div>
<div class="line number20 index19 alt1">
<code class="xhtml plain">typedef __builtin_neon_uhi uint16x8_t __attribute__ ((__vector_size__ (16)));</code>
</div>
<div class="line number21 index20 alt2">
<code class="xhtml plain">typedef __builtin_neon_usi uint32x4_t __attribute__ ((__vector_size__ (16)));</code>
</div>
<div class="line number22 index21 alt1">
<code class="xhtml plain">typedef __builtin_neon_udi uint64x2_t __attribute__ ((__vector_size__ (16)));</code>
</div>
<div class="line number23 index22 alt2">
</div>
<div class="line number24 index23 alt1">
<code class="xhtml plain">typedef float float32_t;</code>
</div>
<div class="line number25 index24 alt2">
<code class="xhtml plain">typedef __builtin_neon_poly8 poly8_t;</code>
</div>
<div class="line number26 index25 alt1">
<code class="xhtml plain">typedef __builtin_neon_poly16 poly16_t;</code>
</div>
<div class="line number27 index26 alt2">
</div>
<div class="line number28 index27 alt1">
<code class="xhtml plain">typedef struct int8x8x2_t</code>
</div>
<div class="line number29 index28 alt2">
<code class="xhtml plain">{</code>
</div>
<div class="line number30 index29 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">int8x8_t val;</code>
</div>
<div class="line number31 index30 alt2">
<code class="xhtml plain">} int8x8x2_t;</code>
</div>
<div class="line number32 index31 alt1">
</div>
<div class="line number33 index32 alt2">
<code class="xhtml plain">typedef struct int8x16x2_t</code>
</div>
<div class="line number34 index33 alt1">
<code class="xhtml plain">{</code>
</div>
<div class="line number35 index34 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">int8x16_t val;</code>
</div>
<div class="line number36 index35 alt1">
<code class="xhtml plain">} int8x16x2_t;</code>
</div>
<div class="line number37 index36 alt2">
</div>
<div class="line number38 index37 alt1">
<code class="xhtml plain">typedef struct int16x4x2_t</code>
</div>
<div class="line number39 index38 alt2">
<code class="xhtml plain">{</code>
</div>
<div class="line number40 index39 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">int16x4_t val;</code>
</div>
<div class="line number41 index40 alt2">
<code class="xhtml plain">} int16x4x2_t;</code>
</div>
<div class="line number42 index41 alt1">
</div>
<div class="line number43 index42 alt2">
<code class="xhtml plain">typedef struct int16x8x2_t</code>
</div>
<div class="line number44 index43 alt1">
<code class="xhtml plain">{</code>
</div>
<div class="line number45 index44 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">int16x8_t val;</code>
</div>
<div class="line number46 index45 alt1">
<code class="xhtml plain">} int16x8x2_t;</code>
</div>
<div class="line number47 index46 alt2">
</div>
<div class="line number48 index47 alt1">
<code class="xhtml plain">typedef struct int32x2x2_t</code>
</div>
<div class="line number49 index48 alt2">
<code class="xhtml plain">{</code>
</div>
<div class="line number50 index49 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">int32x2_t val;</code>
</div>
<div class="line number51 index50 alt2">
<code class="xhtml plain">} int32x2x2_t;</code>
</div>
<div class="line number52 index51 alt1">
</div>
<div class="line number53 index52 alt2">
<code class="xhtml plain">typedef struct int32x4x2_t</code>
</div>
<div class="line number54 index53 alt1">
<code class="xhtml plain">{</code>
</div>
<div class="line number55 index54 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">int32x4_t val;</code>
</div>
<div class="line number56 index55 alt1">
<code class="xhtml plain">} int32x4x2_t;</code>
</div>
<div class="line number57 index56 alt2">
</div>
<div class="line number58 index57 alt1">
<code class="xhtml plain">typedef struct int64x1x2_t</code>
</div>
<div class="line number59 index58 alt2">
<code class="xhtml plain">{</code>
</div>
<div class="line number60 index59 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">int64x1_t val;</code>
</div>
<div class="line number61 index60 alt2">
<code class="xhtml plain">} int64x1x2_t;</code>
</div>
<div class="line number62 index61 alt1">
</div>
<div class="line number63 index62 alt2">
<code class="xhtml plain">typedef struct int64x2x2_t</code>
</div>
<div class="line number64 index63 alt1">
<code class="xhtml plain">{</code>
</div>
<div class="line number65 index64 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">int64x2_t val;</code>
</div>
<div class="line number66 index65 alt1">
<code class="xhtml plain">} int64x2x2_t;</code>
</div>
<div class="line number67 index66 alt2">
</div>
<div class="line number68 index67 alt1">
<code class="xhtml plain">typedef struct uint8x8x2_t</code>
</div>
<div class="line number69 index68 alt2">
<code class="xhtml plain">{</code>
</div>
<div class="line number70 index69 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">uint8x8_t val;</code>
</div>
<div class="line number71 index70 alt2">
<code class="xhtml plain">} uint8x8x2_t;</code>
</div>
<div class="line number72 index71 alt1">
</div>
<div class="line number73 index72 alt2">
<code class="xhtml plain">typedef struct uint8x16x2_t</code>
</div>
<div class="line number74 index73 alt1">
<code class="xhtml plain">{</code>
</div>
<div class="line number75 index74 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">uint8x16_t val;</code>
</div>
<div class="line number76 index75 alt1">
<code class="xhtml plain">} uint8x16x2_t;</code>
</div>
<div class="line number77 index76 alt2">
</div>
<div class="line number78 index77 alt1">
<code class="xhtml plain">typedef struct uint16x4x2_t</code>
</div>
<div class="line number79 index78 alt2">
<code class="xhtml plain">{</code>
</div>
<div class="line number80 index79 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">uint16x4_t val;</code>
</div>
<div class="line number81 index80 alt2">
<code class="xhtml plain">} uint16x4x2_t;</code>
</div>
<div class="line number82 index81 alt1">
</div>
<div class="line number83 index82 alt2">
<code class="xhtml plain">typedef struct uint16x8x2_t</code>
</div>
<div class="line number84 index83 alt1">
<code class="xhtml plain">{</code>
</div>
<div class="line number85 index84 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">uint16x8_t val;</code>
</div>
<div class="line number86 index85 alt1">
<code class="xhtml plain">} uint16x8x2_t;</code>
</div>
<div class="line number87 index86 alt2">
</div>
<div class="line number88 index87 alt1">
<code class="xhtml plain">typedef struct uint32x2x2_t</code>
</div>
<div class="line number89 index88 alt2">
<code class="xhtml plain">{</code>
</div>
<div class="line number90 index89 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">uint32x2_t val;</code>
</div>
<div class="line number91 index90 alt2">
<code class="xhtml plain">} uint32x2x2_t;</code>
</div>
<div class="line number92 index91 alt1">
</div>
<div class="line number93 index92 alt2">
<code class="xhtml plain">typedef struct uint32x4x2_t</code>
</div>
<div class="line number94 index93 alt1">
<code class="xhtml plain">{</code>
</div>
<div class="line number95 index94 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">uint32x4_t val;</code>
</div>
<div class="line number96 index95 alt1">
<code class="xhtml plain">} uint32x4x2_t;</code>
</div>
<div class="line number97 index96 alt2">
</div>
<div class="line number98 index97 alt1">
<code class="xhtml plain">typedef struct uint64x1x2_t</code>
</div>
<div class="line number99 index98 alt2">
<code class="xhtml plain">{</code>
</div>
<div class="line number100 index99 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">uint64x1_t val;</code>
</div>
<div class="line number101 index100 alt2">
<code class="xhtml plain">} uint64x1x2_t;</code>
</div>
<div class="line number102 index101 alt1">
</div>
<div class="line number103 index102 alt2">
<code class="xhtml plain">typedef struct uint64x2x2_t</code>
</div>
<div class="line number104 index103 alt1">
<code class="xhtml plain">{</code>
</div>
<div class="line number105 index104 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">uint64x2_t val;</code>
</div>
<div class="line number106 index105 alt1">
<code class="xhtml plain">} uint64x2x2_t;</code>
</div>
<div class="line number107 index106 alt2">
</div>
<div class="line number108 index107 alt1">
<code class="xhtml plain">typedef struct float32x2x2_t</code>
</div>
<div class="line number109 index108 alt2">
<code class="xhtml plain">{</code>
</div>
<div class="line number110 index109 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">float32x2_t val;</code>
</div>
<div class="line number111 index110 alt2">
<code class="xhtml plain">} float32x2x2_t;</code>
</div>
<div class="line number112 index111 alt1">
</div>
<div class="line number113 index112 alt2">
<code class="xhtml plain">typedef struct float32x4x2_t</code>
</div>
<div class="line number114 index113 alt1">
<code class="xhtml plain">{</code>
</div>
<div class="line number115 index114 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">float32x4_t val;</code>
</div>
<div class="line number116 index115 alt1">
<code class="xhtml plain">} float32x4x2_t;</code>
</div>
<div class="line number117 index116 alt2">
</div>
<div class="line number118 index117 alt1">
<code class="xhtml plain">typedef struct poly8x8x2_t</code>
</div>
<div class="line number119 index118 alt2">
<code class="xhtml plain">{</code>
</div>
<div class="line number120 index119 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">poly8x8_t val;</code>
</div>
<div class="line number121 index120 alt2">
<code class="xhtml plain">} poly8x8x2_t;</code>
</div>
<div class="line number122 index121 alt1">
</div>
<div class="line number123 index122 alt2">
<code class="xhtml plain">typedef struct poly8x16x2_t</code>
</div>
<div class="line number124 index123 alt1">
<code class="xhtml plain">{</code>
</div>
<div class="line number125 index124 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">poly8x16_t val;</code>
</div>
<div class="line number126 index125 alt1">
<code class="xhtml plain">} poly8x16x2_t;</code>
</div>
<div class="line number127 index126 alt2">
</div>
<div class="line number128 index127 alt1">
<code class="xhtml plain">typedef struct poly16x4x2_t</code>
</div>
<div class="line number129 index128 alt2">
<code class="xhtml plain">{</code>
</div>
<div class="line number130 index129 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">poly16x4_t val;</code>
</div>
<div class="line number131 index130 alt2">
<code class="xhtml plain">} poly16x4x2_t;</code>
</div>
<div class="line number132 index131 alt1">
</div>
<div class="line number133 index132 alt2">
<code class="xhtml plain">typedef struct poly16x8x2_t</code>
</div>
<div class="line number134 index133 alt1">
<code class="xhtml plain">{</code>
</div>
<div class="line number135 index134 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">poly16x8_t val;</code>
</div>
<div class="line number136 index135 alt1">
<code class="xhtml plain">} poly16x8x2_t;</code>
</div>
<div class="line number137 index136 alt2">
</div>
<div class="line number138 index137 alt1">
<code class="xhtml plain">typedef struct int8x8x3_t</code>
</div>
<div class="line number139 index138 alt2">
<code class="xhtml plain">{</code>
</div>
<div class="line number140 index139 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">int8x8_t val;</code>
</div>
<div class="line number141 index140 alt2">
<code class="xhtml plain">} int8x8x3_t;</code>
</div>
<div class="line number142 index141 alt1">
</div>
<div class="line number143 index142 alt2">
<code class="xhtml plain">typedef struct int8x16x3_t</code>
</div>
<div class="line number144 index143 alt1">
<code class="xhtml plain">{</code>
</div>
<div class="line number145 index144 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">int8x16_t val;</code>
</div>
<div class="line number146 index145 alt1">
<code class="xhtml plain">} int8x16x3_t;</code>
</div>
<div class="line number147 index146 alt2">
</div>
<div class="line number148 index147 alt1">
<code class="xhtml plain">typedef struct int16x4x3_t</code>
</div>
<div class="line number149 index148 alt2">
<code class="xhtml plain">{</code>
</div>
<div class="line number150 index149 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">int16x4_t val;</code>
</div>
<div class="line number151 index150 alt2">
<code class="xhtml plain">} int16x4x3_t;</code>
</div>
<div class="line number152 index151 alt1">
</div>
<div class="line number153 index152 alt2">
<code class="xhtml plain">typedef struct int16x8x3_t</code>
</div>
<div class="line number154 index153 alt1">
<code class="xhtml plain">{</code>
</div>
<div class="line number155 index154 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">int16x8_t val;</code>
</div>
<div class="line number156 index155 alt1">
<code class="xhtml plain">} int16x8x3_t;</code>
</div>
<div class="line number157 index156 alt2">
</div>
<div class="line number158 index157 alt1">
<code class="xhtml plain">typedef struct int32x2x3_t</code>
</div>
<div class="line number159 index158 alt2">
<code class="xhtml plain">{</code>
</div>
<div class="line number160 index159 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">int32x2_t val;</code>
</div>
<div class="line number161 index160 alt2">
<code class="xhtml plain">} int32x2x3_t;</code>
</div>
<div class="line number162 index161 alt1">
</div>
<div class="line number163 index162 alt2">
<code class="xhtml plain">typedef struct int32x4x3_t</code>
</div>
<div class="line number164 index163 alt1">
<code class="xhtml plain">{</code>
</div>
<div class="line number165 index164 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">int32x4_t val;</code>
</div>
<div class="line number166 index165 alt1">
<code class="xhtml plain">} int32x4x3_t;</code>
</div>
<div class="line number167 index166 alt2">
</div>
<div class="line number168 index167 alt1">
<code class="xhtml plain">typedef struct int64x1x3_t</code>
</div>
<div class="line number169 index168 alt2">
<code class="xhtml plain">{</code>
</div>
<div class="line number170 index169 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">int64x1_t val;</code>
</div>
<div class="line number171 index170 alt2">
<code class="xhtml plain">} int64x1x3_t;</code>
</div>
<div class="line number172 index171 alt1">
</div>
<div class="line number173 index172 alt2">
<code class="xhtml plain">typedef struct int64x2x3_t</code>
</div>
<div class="line number174 index173 alt1">
<code class="xhtml plain">{</code>
</div>
<div class="line number175 index174 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">int64x2_t val;</code>
</div>
<div class="line number176 index175 alt1">
<code class="xhtml plain">} int64x2x3_t;</code>
</div>
<div class="line number177 index176 alt2">
</div>
<div class="line number178 index177 alt1">
<code class="xhtml plain">typedef struct uint8x8x3_t</code>
</div>
<div class="line number179 index178 alt2">
<code class="xhtml plain">{</code>
</div>
<div class="line number180 index179 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">uint8x8_t val;</code>
</div>
<div class="line number181 index180 alt2">
<code class="xhtml plain">} uint8x8x3_t;</code>
</div>
<div class="line number182 index181 alt1">
</div>
<div class="line number183 index182 alt2">
<code class="xhtml plain">typedef struct uint8x16x3_t</code>
</div>
<div class="line number184 index183 alt1">
<code class="xhtml plain">{</code>
</div>
<div class="line number185 index184 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">uint8x16_t val;</code>
</div>
<div class="line number186 index185 alt1">
<code class="xhtml plain">} uint8x16x3_t;</code>
</div>
<div class="line number187 index186 alt2">
</div>
<div class="line number188 index187 alt1">
<code class="xhtml plain">typedef struct uint16x4x3_t</code>
</div>
<div class="line number189 index188 alt2">
<code class="xhtml plain">{</code>
</div>
<div class="line number190 index189 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">uint16x4_t val;</code>
</div>
<div class="line number191 index190 alt2">
<code class="xhtml plain">} uint16x4x3_t;</code>
</div>
<div class="line number192 index191 alt1">
</div>
<div class="line number193 index192 alt2">
<code class="xhtml plain">typedef struct uint16x8x3_t</code>
</div>
<div class="line number194 index193 alt1">
<code class="xhtml plain">{</code>
</div>
<div class="line number195 index194 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">uint16x8_t val;</code>
</div>
<div class="line number196 index195 alt1">
<code class="xhtml plain">} uint16x8x3_t;</code>
</div>
<div class="line number197 index196 alt2">
</div>
<div class="line number198 index197 alt1">
<code class="xhtml plain">typedef struct uint32x2x3_t</code>
</div>
<div class="line number199 index198 alt2">
<code class="xhtml plain">{</code>
</div>
<div class="line number200 index199 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">uint32x2_t val;</code>
</div>
<div class="line number201 index200 alt2">
<code class="xhtml plain">} uint32x2x3_t;</code>
</div>
<div class="line number202 index201 alt1">
</div>
<div class="line number203 index202 alt2">
<code class="xhtml plain">typedef struct uint32x4x3_t</code>
</div>
<div class="line number204 index203 alt1">
<code class="xhtml plain">{</code>
</div>
<div class="line number205 index204 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">uint32x4_t val;</code>
</div>
<div class="line number206 index205 alt1">
<code class="xhtml plain">} uint32x4x3_t;</code>
</div>
<div class="line number207 index206 alt2">
</div>
<div class="line number208 index207 alt1">
<code class="xhtml plain">typedef struct uint64x1x3_t</code>
</div>
<div class="line number209 index208 alt2">
<code class="xhtml plain">{</code>
</div>
<div class="line number210 index209 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">uint64x1_t val;</code>
</div>
<div class="line number211 index210 alt2">
<code class="xhtml plain">} uint64x1x3_t;</code>
</div>
<div class="line number212 index211 alt1">
</div>
<div class="line number213 index212 alt2">
<code class="xhtml plain">typedef struct uint64x2x3_t</code>
</div>
<div class="line number214 index213 alt1">
<code class="xhtml plain">{</code>
</div>
<div class="line number215 index214 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">uint64x2_t val;</code>
</div>
<div class="line number216 index215 alt1">
<code class="xhtml plain">} uint64x2x3_t;</code>
</div>
<div class="line number217 index216 alt2">
</div>
<div class="line number218 index217 alt1">
<code class="xhtml plain">typedef struct float32x2x3_t</code>
</div>
<div class="line number219 index218 alt2">
<code class="xhtml plain">{</code>
</div>
<div class="line number220 index219 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">float32x2_t val;</code>
</div>
<div class="line number221 index220 alt2">
<code class="xhtml plain">} float32x2x3_t;</code>
</div>
<div class="line number222 index221 alt1">
</div>
<div class="line number223 index222 alt2">
<code class="xhtml plain">typedef struct float32x4x3_t</code>
</div>
<div class="line number224 index223 alt1">
<code class="xhtml plain">{</code>
</div>
<div class="line number225 index224 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">float32x4_t val;</code>
</div>
<div class="line number226 index225 alt1">
<code class="xhtml plain">} float32x4x3_t;</code>
</div>
<div class="line number227 index226 alt2">
</div>
<div class="line number228 index227 alt1">
<code class="xhtml plain">typedef struct poly8x8x3_t</code>
</div>
<div class="line number229 index228 alt2">
<code class="xhtml plain">{</code>
</div>
<div class="line number230 index229 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">poly8x8_t val;</code>
</div>
<div class="line number231 index230 alt2">
<code class="xhtml plain">} poly8x8x3_t;</code>
</div>
<div class="line number232 index231 alt1">
</div>
<div class="line number233 index232 alt2">
<code class="xhtml plain">typedef struct poly8x16x3_t</code>
</div>
<div class="line number234 index233 alt1">
<code class="xhtml plain">{</code>
</div>
<div class="line number235 index234 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">poly8x16_t val;</code>
</div>
<div class="line number236 index235 alt1">
<code class="xhtml plain">} poly8x16x3_t;</code>
</div>
<div class="line number237 index236 alt2">
</div>
<div class="line number238 index237 alt1">
<code class="xhtml plain">typedef struct poly16x4x3_t</code>
</div>
<div class="line number239 index238 alt2">
<code class="xhtml plain">{</code>
</div>
<div class="line number240 index239 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">poly16x4_t val;</code>
</div>
<div class="line number241 index240 alt2">
<code class="xhtml plain">} poly16x4x3_t;</code>
</div>
<div class="line number242 index241 alt1">
</div>
<div class="line number243 index242 alt2">
<code class="xhtml plain">typedef struct poly16x8x3_t</code>
</div>
<div class="line number244 index243 alt1">
<code class="xhtml plain">{</code>
</div>
<div class="line number245 index244 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">poly16x8_t val;</code>
</div>
<div class="line number246 index245 alt1">
<code class="xhtml plain">} poly16x8x3_t;</code>
</div>
<div class="line number247 index246 alt2">
</div>
<div class="line number248 index247 alt1">
<code class="xhtml plain">typedef struct int8x8x4_t</code>
</div>
<div class="line number249 index248 alt2">
<code class="xhtml plain">{</code>
</div>
<div class="line number250 index249 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">int8x8_t val;</code>
</div>
<div class="line number251 index250 alt2">
<code class="xhtml plain">} int8x8x4_t;</code>
</div>
<div class="line number252 index251 alt1">
</div>
<div class="line number253 index252 alt2">
<code class="xhtml plain">typedef struct int8x16x4_t</code>
</div>
<div class="line number254 index253 alt1">
<code class="xhtml plain">{</code>
</div>
<div class="line number255 index254 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">int8x16_t val;</code>
</div>
<div class="line number256 index255 alt1">
<code class="xhtml plain">} int8x16x4_t;</code>
</div>
<div class="line number257 index256 alt2">
</div>
<div class="line number258 index257 alt1">
<code class="xhtml plain">typedef struct int16x4x4_t</code>
</div>
<div class="line number259 index258 alt2">
<code class="xhtml plain">{</code>
</div>
<div class="line number260 index259 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">int16x4_t val;</code>
</div>
<div class="line number261 index260 alt2">
<code class="xhtml plain">} int16x4x4_t;</code>
</div>
<div class="line number262 index261 alt1">
</div>
<div class="line number263 index262 alt2">
<code class="xhtml plain">typedef struct int16x8x4_t</code>
</div>
<div class="line number264 index263 alt1">
<code class="xhtml plain">{</code>
</div>
<div class="line number265 index264 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">int16x8_t val;</code>
</div>
<div class="line number266 index265 alt1">
<code class="xhtml plain">} int16x8x4_t;</code>
</div>
<div class="line number267 index266 alt2">
</div>
<div class="line number268 index267 alt1">
<code class="xhtml plain">typedef struct int32x2x4_t</code>
</div>
<div class="line number269 index268 alt2">
<code class="xhtml plain">{</code>
</div>
<div class="line number270 index269 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">int32x2_t val;</code>
</div>
<div class="line number271 index270 alt2">
<code class="xhtml plain">} int32x2x4_t;</code>
</div>
<div class="line number272 index271 alt1">
</div>
<div class="line number273 index272 alt2">
<code class="xhtml plain">typedef struct int32x4x4_t</code>
</div>
<div class="line number274 index273 alt1">
<code class="xhtml plain">{</code>
</div>
<div class="line number275 index274 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">int32x4_t val;</code>
</div>
<div class="line number276 index275 alt1">
<code class="xhtml plain">} int32x4x4_t;</code>
</div>
<div class="line number277 index276 alt2">
</div>
<div class="line number278 index277 alt1">
<code class="xhtml plain">typedef struct int64x1x4_t</code>
</div>
<div class="line number279 index278 alt2">
<code class="xhtml plain">{</code>
</div>
<div class="line number280 index279 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">int64x1_t val;</code>
</div>
<div class="line number281 index280 alt2">
<code class="xhtml plain">} int64x1x4_t;</code>
</div>
<div class="line number282 index281 alt1">
</div>
<div class="line number283 index282 alt2">
<code class="xhtml plain">typedef struct int64x2x4_t</code>
</div>
<div class="line number284 index283 alt1">
<code class="xhtml plain">{</code>
</div>
<div class="line number285 index284 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">int64x2_t val;</code>
</div>
<div class="line number286 index285 alt1">
<code class="xhtml plain">} int64x2x4_t;</code>
</div>
<div class="line number287 index286 alt2">
</div>
<div class="line number288 index287 alt1">
<code class="xhtml plain">typedef struct uint8x8x4_t</code>
</div>
<div class="line number289 index288 alt2">
<code class="xhtml plain">{</code>
</div>
<div class="line number290 index289 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">uint8x8_t val;</code>
</div>
<div class="line number291 index290 alt2">
<code class="xhtml plain">} uint8x8x4_t;</code>
</div>
<div class="line number292 index291 alt1">
</div>
<div class="line number293 index292 alt2">
<code class="xhtml plain">typedef struct uint8x16x4_t</code>
</div>
<div class="line number294 index293 alt1">
<code class="xhtml plain">{</code>
</div>
<div class="line number295 index294 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">uint8x16_t val;</code>
</div>
<div class="line number296 index295 alt1">
<code class="xhtml plain">} uint8x16x4_t;</code>
</div>
<div class="line number297 index296 alt2">
</div>
<div class="line number298 index297 alt1">
<code class="xhtml plain">typedef struct uint16x4x4_t</code>
</div>
<div class="line number299 index298 alt2">
<code class="xhtml plain">{</code>
</div>
<div class="line number300 index299 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">uint16x4_t val;</code>
</div>
<div class="line number301 index300 alt2">
<code class="xhtml plain">} uint16x4x4_t;</code>
</div>
<div class="line number302 index301 alt1">
</div>
<div class="line number303 index302 alt2">
<code class="xhtml plain">typedef struct uint16x8x4_t</code>
</div>
<div class="line number304 index303 alt1">
<code class="xhtml plain">{</code>
</div>
<div class="line number305 index304 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">uint16x8_t val;</code>
</div>
<div class="line number306 index305 alt1">
<code class="xhtml plain">} uint16x8x4_t;</code>
</div>
<div class="line number307 index306 alt2">
</div>
<div class="line number308 index307 alt1">
<code class="xhtml plain">typedef struct uint32x2x4_t</code>
</div>
<div class="line number309 index308 alt2">
<code class="xhtml plain">{</code>
</div>
<div class="line number310 index309 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">uint32x2_t val;</code>
</div>
<div class="line number311 index310 alt2">
<code class="xhtml plain">} uint32x2x4_t;</code>
</div>
<div class="line number312 index311 alt1">
</div>
<div class="line number313 index312 alt2">
<code class="xhtml plain">typedef struct uint32x4x4_t</code>
</div>
<div class="line number314 index313 alt1">
<code class="xhtml plain">{</code>
</div>
<div class="line number315 index314 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">uint32x4_t val;</code>
</div>
<div class="line number316 index315 alt1">
<code class="xhtml plain">} uint32x4x4_t;</code>
</div>
<div class="line number317 index316 alt2">
</div>
<div class="line number318 index317 alt1">
<code class="xhtml plain">typedef struct uint64x1x4_t</code>
</div>
<div class="line number319 index318 alt2">
<code class="xhtml plain">{</code>
</div>
<div class="line number320 index319 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">uint64x1_t val;</code>
</div>
<div class="line number321 index320 alt2">
<code class="xhtml plain">} uint64x1x4_t;</code>
</div>
<div class="line number322 index321 alt1">
</div>
<div class="line number323 index322 alt2">
<code class="xhtml plain">typedef struct uint64x2x4_t</code>
</div>
<div class="line number324 index323 alt1">
<code class="xhtml plain">{</code>
</div>
<div class="line number325 index324 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">uint64x2_t val;</code>
</div>
<div class="line number326 index325 alt1">
<code class="xhtml plain">} uint64x2x4_t;</code>
</div>
<div class="line number327 index326 alt2">
</div>
<div class="line number328 index327 alt1">
<code class="xhtml plain">typedef struct float32x2x4_t</code>
</div>
<div class="line number329 index328 alt2">
<code class="xhtml plain">{</code>
</div>
<div class="line number330 index329 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">float32x2_t val;</code>
</div>
<div class="line number331 index330 alt2">
<code class="xhtml plain">} float32x2x4_t;</code>
</div>
<div class="line number332 index331 alt1">
</div>
<div class="line number333 index332 alt2">
<code class="xhtml plain">typedef struct float32x4x4_t</code>
</div>
<div class="line number334 index333 alt1">
<code class="xhtml plain">{</code>
</div>
<div class="line number335 index334 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">float32x4_t val;</code>
</div>
<div class="line number336 index335 alt1">
<code class="xhtml plain">} float32x4x4_t;</code>
</div>
<div class="line number337 index336 alt2">
</div>
<div class="line number338 index337 alt1">
<code class="xhtml plain">typedef struct poly8x8x4_t</code>
</div>
<div class="line number339 index338 alt2">
<code class="xhtml plain">{</code>
</div>
<div class="line number340 index339 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">poly8x8_t val;</code>
</div>
<div class="line number341 index340 alt2">
<code class="xhtml plain">} poly8x8x4_t;</code>
</div>
<div class="line number342 index341 alt1">
</div>
<div class="line number343 index342 alt2">
<code class="xhtml plain">typedef struct poly8x16x4_t</code>
</div>
<div class="line number344 index343 alt1">
<code class="xhtml plain">{</code>
</div>
<div class="line number345 index344 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">poly8x16_t val;</code>
</div>
<div class="line number346 index345 alt1">
<code class="xhtml plain">} poly8x16x4_t;</code>
</div>
<div class="line number347 index346 alt2">
</div>
<div class="line number348 index347 alt1">
<code class="xhtml plain">typedef struct poly16x4x4_t</code>
</div>
<div class="line number349 index348 alt2">
<code class="xhtml plain">{</code>
</div>
<div class="line number350 index349 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">poly16x4_t val;</code>
</div>
<div class="line number351 index350 alt2">
<code class="xhtml plain">} poly16x4x4_t;</code>
</div>
<div class="line number352 index351 alt1">
</div>
<div class="line number353 index352 alt2">
<code class="xhtml plain">typedef struct poly16x8x4_t</code>
</div>
<div class="line number354 index353 alt1">
<code class="xhtml plain">{</code>
</div>
<div class="line number355 index354 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">poly16x8_t val;</code>
</div>
<div class="line number356 index355 alt1">
<code class="xhtml plain">} poly16x8x4_t;</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
1.4.3 gcc的neon函数</p>
<p>
跟neon指令对应,详见gcc手册。</p>
<p>
<img title="学习在kernel态下使用NEON对算法进行加速的方法" alt="学习在kernel态下使用NEON对算法进行加速的方法" src="https://zhuji.jb51.net/uploads/img/202305/089aa699c7098e342470314f60a2446e.jpg"></p>
<p>
<strong> 二.内核状态下使用neon的规则</strong></p>
<p>
在linux里,应用态可以比较方便使用neon instrinsic,增加头arm_neon.h头文件后直接使用。但是内核态下使用neon有较多限制,在linux内核文档 /documentation/arm/kernel_mode_neon.txt对此有详细说明。要点为:</p>
<p>
<img title="学习在kernel态下使用NEON对算法进行加速的方法" alt="学习在kernel态下使用NEON对算法进行加速的方法" src="https://zhuji.jb51.net/uploads/img/202305/b68394ffd7060757ef3eac89617f793b.jpg"></p>
<p>
还有一点特别关键:</p>
<p>
<img title="学习在kernel态下使用NEON对算法进行加速的方法" alt="学习在kernel态下使用NEON对算法进行加速的方法" src="https://zhuji.jb51.net/uploads/img/202305/58defbe99d3e314ddbdb59b5a688e304.jpg"></p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterxhtml" id="highlighter_883606">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="xhtml plain">cc /work/platform-zynq/drivers/zynq_fpga_driver/mmi_neon/lcd_hw_fs8812_neon.o</code>
</div>
<div class="line number2 index1 alt1">
<code class="xhtml plain">in file included from /home/liuwanpeng/lin/lib/gcc/arm-xilinx-linux-gnueabi/4.8.3/include/arm_neon.h:39:0,</code>
</div>
<div class="line number3 index2 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">from /work/platform-zynq/drivers/zynq_fpga_driver/mmi_neon/lcd_hw_fs8812_neon.c:8:</code>
</div>
<div class="line number4 index3 alt1">
<code class="xhtml plain">/home/liuwanpeng/lin/lib/gcc/arm-xilinx-linux-gnueabi/4.8.3/include/stdint.h:9:26: error: no include path in which to search for stdint.h</code>
</div>
<div class="line number5 index4 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain"># include_next <</code><code class="xhtml keyword">stdint.h</code><code class="xhtml plain">></code>
</div>
<div class="line number6 index5 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">没有使用-ffreestanding编译选项时,在内核态下使用出现此编译错误。</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
三.实例</p>
<p>
neon一般在图像等领域,最小处理单位就是8bit,而不是1bit,这方便的例子非常多,本文就不说明了。在实际项目中,我需要对液晶的一组数据按位操作,变换,形成新的数据,如果用传统arm指令,掩码、移位、循环,想想效率就非常低。于是决定使用neon的位相关指令完成上述任务。</p>
<p>
3.1 任务说明</p>
<p>
如下图,需要对各个bit进行转换,组成新的数据。</p>
<p>
<img title="学习在kernel态下使用NEON对算法进行加速的方法" alt="学习在kernel态下使用NEON对算法进行加速的方法" src="https://zhuji.jb51.net/uploads/img/202305/c3924b80b02ba185d3e21bf0a906486d.jpg"></p>
<p>
3.2 算法说明</p>
<p>
使用vmsk、vshl、vadd等位操作完成。</p>
<p>
3.3 kernel配置</p>
<p>
必须配置内核支持neon,否则kernel_neon_begin()和kernel_neon_end()等函数不会编辑进去。</p>
<p>
make menuconfig:floating point emulation,如下图。</p>
<p>
<img title="学习在kernel态下使用NEON对算法进行加速的方法" alt="学习在kernel态下使用NEON对算法进行加速的方法" src="https://zhuji.jb51.net/uploads/img/202305/dd49e62d737efdb9a3488773716cb8cc.jpg"></p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterxhtml" id="highlighter_916234">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="xhtml plain">未使能“support for neon in kernel mode”时会报错:</code>
</div>
<div class="line number2 index1 alt1">
<code class="xhtml plain">mmi_module_amp: unknown symbol kernel_neon_begin (err 0)</code>
</div>
<div class="line number3 index2 alt2">
<code class="xhtml plain">mmi_module_amp: unknown symbol kernel_neon_end (err 0)</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
3.4 模块代码</p>
<p>
由于neon代码需要单独设置编译选项,所以单独建立了一个内核模块,makefile如下:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterxhtml" id="highlighter_396630">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="xhtml plain">cflags_module += -o3 -mfpu=neon -mfloat-abi=softfp -ffreestanding </code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
核心代码:</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterxhtml" id="highlighter_274680">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="xhtml plain">#include <</code><code class="xhtml keyword">linux</code><code class="xhtml plain">/module.h> </code>
</div>
<div class="line number2 index1 alt1">
<code class="xhtml plain">#include <</code><code class="xhtml keyword">linux</code><code class="xhtml plain">/printk.h></code>
</div>
<div class="line number3 index2 alt2">
<code class="xhtml plain">#include <</code><code class="xhtml keyword">arm_neon.h</code><code class="xhtml plain">> // 来自gcc的头文件,必须用-ffreestanding编译选徐昂</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<p>
#define lcd_8812_row_bytes 16<br>
#define lcd_8812_page_rows 8<br>
#define lcd_page_bytes (lcd_8812_row_bytes*lcd_8812_page_rows)</p>
<div>
<div class="syntaxhighlighterxhtml" id="highlighter_492655">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
<div class="line number7 index6 alt2">
7</div>
<div class="line number8 index7 alt1">
8</div>
<div class="line number9 index8 alt2">
9</div>
<div class="line number10 index9 alt1">
10</div>
<div class="line number11 index10 alt2">
11</div>
<div class="line number12 index11 alt1">
12</div>
<div class="line number13 index12 alt2">
13</div>
<div class="line number14 index13 alt1">
14</div>
<div class="line number15 index14 alt2">
15</div>
<div class="line number16 index15 alt1">
16</div>
<div class="line number17 index16 alt2">
17</div>
<div class="line number18 index17 alt1">
18</div>
<div class="line number19 index18 alt2">
19</div>
<div class="line number20 index19 alt1">
20</div>
<div class="line number21 index20 alt2">
21</div>
<div class="line number22 index21 alt1">
22</div>
<div class="line number23 index22 alt2">
23</div>
<div class="line number24 index23 alt1">
24</div>
<div class="line number25 index24 alt2">
25</div>
<div class="line number26 index25 alt1">
26</div>
<div class="line number27 index26 alt2">
27</div>
<div class="line number28 index27 alt1">
28</div>
<div class="line number29 index28 alt2">
29</div>
<div class="line number30 index29 alt1">
30</div>
<div class="line number31 index30 alt2">
31</div>
<div class="line number32 index31 alt1">
32</div>
<div class="line number33 index32 alt2">
33</div>
<div class="line number34 index33 alt1">
34</div>
<div class="line number35 index34 alt2">
35</div>
<div class="line number36 index35 alt1">
36</div>
<div class="line number37 index36 alt2">
37</div>
<div class="line number38 index37 alt1">
38</div>
<div class="line number39 index38 alt2">
39</div>
<div class="line number40 index39 alt1">
40</div>
<div class="line number41 index40 alt2">
41</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="xhtml plain">int fs8812_cvt_buf( uint8 * dst, uint8 * src )</code>
</div>
<div class="line number2 index1 alt1">
<code class="xhtml plain">{</code>
</div>
<div class="line number3 index2 alt2">
</div>
<div class="line number4 index3 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">uint8x16_t v_src;</code>
</div>
<div class="line number5 index4 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">uint8x16_t v_tmp;</code>
</div>
<div class="line number6 index5 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">uint8x16_t v_dst;</code>
</div>
<div class="line number7 index6 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">uint8x16_t v_msk;</code>
</div>
<div class="line number8 index7 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">int8x16_t v_shift;</code>
</div>
<div class="line number9 index8 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">int8 rshl_bits = {0,1,2,3,4,5,6,7};</code>
</div>
<div class="line number10 index9 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">int8 row,bit;</code>
</div>
<div class="line number11 index10 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">uint8 page;</code>
</div>
<div class="line number12 index11 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">uint8 * fb_page_x = null; </code>
</div>
<div class="line number13 index12 alt2">
</div>
<div class="line number14 index13 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">// convert the frame_buf for fs8812</code>
</div>
<div class="line number15 index14 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">for( page=0;page<4;page++ ){</code>
</div>
<div class="line number16 index15 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">fb_page_x = src + page*lcd_page_bytes;</code>
</div>
<div class="line number17 index16 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">for( row=0;row<lcd_8812_page_rows;row++ )</code>
</div>
<div class="line number18 index17 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">v_src = vld1q_u8( fb_page_x + row*lcd_8812_row_bytes );</code>
</div>
<div class="line number19 index18 alt2">
<code class="xhtml plain"> for( bit=0;bit<8;bit++){</code>
</div>
<div class="line number20 index19 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain"> v_msk = vdupq_n_u8(1<<bit);</code>
</div>
<div class="line number21 index20 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain"> for( row=0;row<lcd_8812_page_rows;row++){</code>
</div>
<div class="line number22 index21 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain"> v_tmp = vandq_u8(v_src,v_msk); // only process the desire bit</code>
</div>
<div class="line number23 index22 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain"> v_shift = vdupq_n_s8( rshl_bits-bit );</code>
</div>
<div class="line number24 index23 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain"> v_tmp = vshlq_u8( v_tmp,v_shift );</code>
</div>
<div class="line number25 index24 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain"> } </code>
</div>
<div class="line number26 index25 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain"> v_dst = vorrq_u8(v_tmp,v_tmp); // all bit_x convert to one row</code>
</div>
<div class="line number27 index26 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain"> v_dst |= vorrq_u8(v_tmp,v_tmp);</code>
</div>
<div class="line number28 index27 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain"> v_dst |= vorrq_u8(v_tmp,v_tmp);</code>
</div>
<div class="line number29 index28 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain"> v_dst |= vorrq_u8(v_tmp,v_tmp); </code>
</div>
<div class="line number30 index29 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain"> }</code>
</div>
<div class="line number31 index30 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain"> // store to ram</code>
</div>
<div class="line number32 index31 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain"> fb_page_x = dst + page*lcd_page_bytes;</code>
</div>
<div class="line number33 index32 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain"> for( row=0;row<lcd_8812_page_rows;row++ ){</code>
</div>
<div class="line number34 index33 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain"> vst1q_u8(fb_page_x,v_dst);</code>
</div>
<div class="line number35 index34 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain"> fb_page_x += lcd_8812_row_bytes;</code>
</div>
<div class="line number36 index35 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain"> }</code>
</div>
<div class="line number37 index36 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">}</code>
</div>
<div class="line number38 index37 alt1">
<code class="xhtml plain"> return 0;</code>
</div>
<div class="line number39 index38 alt2">
<code class="xhtml plain">}</code>
</div>
<div class="line number40 index39 alt1">
</div>
<div class="line number41 index40 alt2">
<code class="xhtml plain">export_symbol_gpl(fs8812_cvt_buf);</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
调用模块,务必没有“-mfpu=neon -mfloat-abi=softfp ”选项</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterxhtml" id="highlighter_239479">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="xhtml plain">// convert the frame_buf for fs8812</code>
</div>
<div class="line number2 index1 alt1">
<code class="xhtml plain">kernel_neon_begin();</code>
</div>
<div class="line number3 index2 alt2">
<code class="xhtml plain">fs8812_cvt_buf( g_tmp_buf, frame_buf );</code>
</div>
<div class="line number4 index3 alt1">
<code class="xhtml plain">kernel_neon_end();</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
</div>
<p>
以上就是本篇文章的全部内容,大家有不懂的可以在下面留言区讨论。</p>
<p>
原文链接:https://www.cnblogs.com/liuwanpeng/p/7833000.html</p>
頁:
[1]