|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
2 P+ I0 l6 u1 [* T1 R, u& R2 Z通用算术指令:6 G, q4 q& B$ n
1 o1 i- k+ U+ ?" @
VABA:绝对值累加、VABD:绝对值相加、VABS:绝对值、VNEG:求反、VADD、VADDW、VADDL、VSUB、VSUBL、VSUBW:加减- W7 N7 {( G! F9 ?6 ~: S7 y* d
$ M% @3 c! E: C
VPADD:将两个向量的相邻元素相加
5 L8 Q" V3 R0 p; |; d3 ^' C5 _7 d8 k* n7 W
如VPADD.I16 {d2}, d0, d1
4 C# w& E6 l a; }% `7 t) C' A7 [: i, L$ I) D
; U; ~$ t' x, Z$ ~/ @$ t+ K0 V3 w2 [5 a$ _+ @* Y- |
VPADDL:VPADDL.S16 d0, d1. ]+ U; m, ^/ f, G( `; Y
* Q2 D" a7 c) f
0 W8 ]- k) K/ z" L- R4 F( W3 Q) Y4 r# |4 J
VMAX:最大值,VMIN:最小值
9 G8 u' s# \' V: H' {% y; I/ W) c0 h# j ^' q+ t. C
VMUL、VMULL、VMLA(乘加)、VMLS(乘减)、
" `& i- t; Q: Y& i: {5 |* ]7 S* @3 K; ~6 P. f
7 ]5 S& v' @/ B* E/ l& a: b$ d2 |% i
, e$ ~1 v2 M+ `$ d4 Y8 S; H加载存储指令:
4 F4 w I5 a0 g7 ]' G
' B( @) W5 g) L" V4 v- H9 oVLD和VST
( g% M* Y+ ]& _! P5 u& X; ~
/ o8 o) X# y1 z/ K f
: d c& E$ k# x+ ?+ e- Z* A% ^
6 z j/ D$ `6 b4 T; m8 q, m: O
, ^% N! g8 `3 U* z/ c" ?1 p! P Z
交叉存取的示意图:. p: w" o3 R( h# S, z
$ |9 |6 e, P4 ~) l
" e8 |( K5 V% ]0 L8 V5 G( g$ u
- F6 G0 u! s0 t/ B3 i. X( J) WVREV反转元素指令:: J1 U ^ \) i5 Y+ B' l$ [' G
1 [- C' z( ~$ v$ m8 m. ], b
- P1 }: g+ Q6 ~7 \
6 z1 m6 S6 q7 w4 O) b' m$ aVEXT移位指令:/ h2 k6 v! Z3 _! O$ h8 ]
/ ~: J; r: T+ S; G
7 w. k* \/ ~( g5 S
1 K: Q8 j( n, H, ^' DVTRN转置指令:可以用于矩阵的转置3 @; F, ?1 S! a6 K; b9 P. d
5 b8 f1 M% \) L/ m; ^" e
( d3 H: I# ~3 P* T7 y I& ^ S# A. `( ^
$ j" k* m$ w) }9 w5 p% Q/ b- n
, N/ J y8 N$ V+ X* R
% O+ a @9 |# d- W
VZIP指令:压缩,类似交叉存取/ b4 a& w* L _9 b0 ^
7 C0 H& m9 V5 U- K
4 Q" U( q' ]2 c2 ` n: H6 S* ]0 |! M6 K9 O. r5 Q, C7 _9 @
VUZP指令:解压操作,类似交叉存取
0 }) \( Y1 j. @1 {4 b/ X
% Q4 h* B6 M- E2 d7 O
, u) I$ ?+ A, a9 L+ N
6 G+ i2 ], Q) R& D( s+ BVTBL查表指令:从d0,d1中查找d3中的索引值,如果找到则取出,没有找到则为0,存入d2中& Q7 ^; a7 E1 a6 u
; V% b$ K! j( t0 u- \ @! U
1 c& M- W5 k6 s8 ]: o
/ f/ c) x& ~% ^% t- A7 J1 f1 B1 ?
0 S9 ^. Q9 P* Z- R5 l1 Y6 J( C5 V三、需要注意的地方
0 k1 a( N4 J6 X/ @
$ b* b7 q: J- t* i load数据的时候,第一次load会把数据放在cache里面,只要不超过cache的大小,下一次load同样数据的时候,则会比第一次load要快很多,会直接从cache中load数据,这样在汇编程序设计的时候是非常需要考虑的问题。
5 N! o0 d; I& }) M% ]7 k4 C8 u( _" }/ `3 _
如:求取一个图像的均值,8*8的窗口,先行求和,然后列求和出来均值,这时候会有两个函数,数据会加载两遍,如果按照这样去优化的话则优化不了多少。如果换成上面这种思路,先做行16行,然后再做列,这样数据都在cache里面,做列的时候load数据会很快。4 v+ D5 \# }+ j9 D/ B8 m
- m% U0 a" w( \% Z0 i" H' z 在做neon乘法指令的时候会有大约2个clock的阻塞时间,如果你要立即使用乘法的结果,则就会阻塞在这里,在写neon指令的时候需要特别注意。乘法的结果不能立即使用,可以将一些其他的操作插入到乘法后面而不会有时间的消耗。
' F( a4 \: v, ?! B$ }5 w: V( ~/ @1 D Y6 g
如:vmul.u16 q1, d3, d4
1 C$ m9 F$ ~% K, y* j- _! o) a7 f7 p$ L% B
vadd.u32 q1, q2, q3
' l& m! t9 q) ^( L) Q3 b
+ H5 t* B6 U3 {- |) T. Z' ^) {此时直接使用乘法的结果q1则会阻塞,执行vadd需要再等待2个clock的时间3 V! E' d F) P* K8 p: d
: J$ [9 C% v q6 ]7 h6 w) e
使用饱和指令的时候,如乘法饱和的时候,在做乘法后会再去做一次饱和,所以时间要比直接做乘法要慢。7 F# P: ^; o: L$ w6 F
1 Y B9 b/ [' N) Y如: vmul.u16 q1, d3, d4& V5 Z1 t. w9 ^
/ j6 l: d1 L& C5 g0 i
vqmul.u32 q1, q2, q3
# L$ X' f3 q6 l% d/ d# w
. J' [$ h% e `% E( g3 h7 c后一个的时间要比第一个的时间要久。
3 p7 [9 d, ?% ^; d+ I& d1 t6 T
. E$ h# j5 t4 v* f在对16位数据进行load或者store操作的时候,需要注意的是字节移位。比如是16位数据,则load 8个16位数据,如果指定寄存器进行偏移,此时需要特别注意。0 _" c. ?: O% j
2 [0 Q9 v1 Z. ^2 J3 g1 s
例如:vld1.64 {d0}, [r0], r1
& f7 _$ ^% t- @9 B3 G& K |
|