|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
: F' |2 p% T- g5 C5 x. F& K通用算术指令:
8 c& z$ f; ?# Y& P' ^! J8 t- Z6 n4 n: Z9 ?
VABA:绝对值累加、VABD:绝对值相加、VABS:绝对值、VNEG:求反、VADD、VADDW、VADDL、VSUB、VSUBL、VSUBW:加减0 C0 f$ g- u8 ~
: \6 f, T; b- b! _% H6 LVPADD:将两个向量的相邻元素相加) y' R- m7 y, a' Q
' E; G7 l. Z/ o' t5 _$ ~1 B如VPADD.I16 {d2}, d0, d10 i! t0 F7 ?1 K& G' a) m7 t
t0 B& B, t: ]* u0 |/ `5 q
8 w8 p6 O' N/ r2 O) [- @
+ ?3 u* r" s7 S6 I& l
VPADDL:VPADDL.S16 d0, d11 i& J G/ s0 ~ q2 d1 ~
* F7 x# P! v& @7 u4 F. ^
" d' u( v, k1 A' p2 F5 k
& s/ N9 D0 N5 M4 x
VMAX:最大值,VMIN:最小值
8 ^/ b9 ~% I8 l; }' K2 f
' e+ L8 d# W- l2 t4 L. LVMUL、VMULL、VMLA(乘加)、VMLS(乘减)、
; k- h$ X, M/ r7 X! h" F7 \* r. y6 h3 `# g
2 E- x- \" B' N8 ?
) n# d) @; U7 g6 {& i
加载存储指令:( e; @4 N- n7 T: E$ d) d
8 |/ N3 |# q& Z% I) W/ B$ uVLD和VST
) ^& C R( c3 C* T( ^* C
# E8 k7 C( S2 q, u
! M2 z, Q- y, k3 m" s' m" D
5 u2 I9 c+ v4 i& c2 f6 s5 ] U8 D3 S/ a! u
交叉存取的示意图:
7 f7 l S( p: f3 P" r( y" m% Z
( `: k) c& L4 T5 L3 O* U
) M/ ^! N+ o$ e8 o
# y) o Q' M' U( N8 E: |! |VREV反转元素指令:
: r% F, C& g& N7 P/ R0 Q
; Z( {" a3 I/ v
5 i' Z: e$ e$ O; R7 q+ W6 _3 Z
; H! d5 M& m6 d' `8 \
VEXT移位指令: ?* ]6 V2 K7 q/ ` ]
/ i9 ^+ d M+ Q0 n T/ Z% w: v
7 _; V, y' T" A5 ?% z& |* E) _+ h4 z/ e. q: } J$ m* Z
VTRN转置指令:可以用于矩阵的转置
& @" r+ C9 N/ j& D5 f; s6 H( ~" d! i' Q3 e
8 Z x& B y" }
9 q- _% r# V( x+ x# `
e# ]2 ?* [2 H! q+ F4 H; ^8 M9 i+ M9 F
VZIP指令:压缩,类似交叉存取
7 k A/ S6 K3 C4 ^" J" }' T( t x1 K* @
; G3 Y8 i* ^4 Z9 V( ?/ {, w* j7 z
1 F: b' r8 D: ?VUZP指令:解压操作,类似交叉存取4 b# ` g7 s; [* {$ h/ S
1 w2 d) K: T2 c% ^9 _
4 x3 z4 w' B# w( i
# A% O# e0 t' }9 g6 p+ u9 P! }* aVTBL查表指令:从d0,d1中查找d3中的索引值,如果找到则取出,没有找到则为0,存入d2中$ ~! Z6 F. h# g
6 l7 F3 J8 s. Z& k
; B8 J7 M3 j4 c: u! R5 A! n* B/ l
8 o y( K3 y9 X, X. ]
4 \9 {) l+ K' K0 h) [% ]- G8 X$ P三、需要注意的地方0 I" g2 X, y9 {
3 E% B" t, u- o' b load数据的时候,第一次load会把数据放在cache里面,只要不超过cache的大小,下一次load同样数据的时候,则会比第一次load要快很多,会直接从cache中load数据,这样在汇编程序设计的时候是非常需要考虑的问题。6 P' k/ h k8 v. S/ R7 R) q( U
' T8 L; K* s7 A* m1 H
如:求取一个图像的均值,8*8的窗口,先行求和,然后列求和出来均值,这时候会有两个函数,数据会加载两遍,如果按照这样去优化的话则优化不了多少。如果换成上面这种思路,先做行16行,然后再做列,这样数据都在cache里面,做列的时候load数据会很快。- p% p+ N* I) t
0 B6 ^$ z) U7 y+ h' |* ^ 在做neon乘法指令的时候会有大约2个clock的阻塞时间,如果你要立即使用乘法的结果,则就会阻塞在这里,在写neon指令的时候需要特别注意。乘法的结果不能立即使用,可以将一些其他的操作插入到乘法后面而不会有时间的消耗。
1 X& j$ d1 L) B. L) m0 x4 ~( Z1 b- I. F, v1 e! b! x7 Z
如:vmul.u16 q1, d3, d4
5 f0 u9 P' I- K; V- C, d. `- q5 l6 ^5 G/ o" z; k7 P9 F9 c
vadd.u32 q1, q2, q3
+ Q" [( c, e, u4 ?' A0 P+ [% a6 T/ D/ S9 x. z& D/ B
此时直接使用乘法的结果q1则会阻塞,执行vadd需要再等待2个clock的时间
; |" Z: G& q7 E+ l+ G0 s" f+ J& R0 ~
使用饱和指令的时候,如乘法饱和的时候,在做乘法后会再去做一次饱和,所以时间要比直接做乘法要慢。
; Q' T+ [1 Q% _+ Y- O& F6 {/ N
6 K/ T/ c+ E; A+ {: x m如: vmul.u16 q1, d3, d4
4 U; W9 r6 D$ }$ k
* v. l& j. L: ~- }3 d* J* }& x* j vqmul.u32 q1, q2, q39 l) l3 ?) x/ Z# {2 m
! {; c& s7 S) _5 ]0 Y后一个的时间要比第一个的时间要久。/ H0 x6 k" E- [; |$ X/ U! w9 B
7 y$ X7 Z) F# k/ ]$ g8 t在对16位数据进行load或者store操作的时候,需要注意的是字节移位。比如是16位数据,则load 8个16位数据,如果指定寄存器进行偏移,此时需要特别注意。7 k4 w2 m Q# b! K, E/ h
$ W0 C" t5 F( `例如:vld1.64 {d0}, [r0], r1! }( D" Q) f4 e; M
|
|