|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
$ Y6 e! s2 `/ F
通用算术指令:* {& d0 k; I* g8 }5 Y
$ T* i* J8 j0 x- _2 T: q7 bVABA:绝对值累加、VABD:绝对值相加、VABS:绝对值、VNEG:求反、VADD、VADDW、VADDL、VSUB、VSUBL、VSUBW:加减
& y) N7 U$ z; W3 H- U) U
# n& B; m# _% H3 m+ U5 zVPADD:将两个向量的相邻元素相加6 k0 H, y( i9 E! t
y: s) ~8 v0 e- Y4 ~8 _! q
如VPADD.I16 {d2}, d0, d1* h9 d2 d5 V( K0 S; m
c9 ~0 E. W$ @( r
5 h0 u7 N7 W$ U# h% O. N% X% `* K& N. v s B- o/ U/ V# e$ E
VPADDL:VPADDL.S16 d0, d1 c! W) J( E6 U: ~
3 v, x+ y b1 @8 [" P& _
/ g% \; |% K" g) f
' D0 A+ w* b% M8 Z0 h7 `! Y% _VMAX:最大值,VMIN:最小值
6 q% \4 I8 ]) ~5 B- ?9 x" n9 S H
7 m* F6 {& r9 w- r4 Q5 t" k! b$ k TVMUL、VMULL、VMLA(乘加)、VMLS(乘减)、3 r( j7 e/ X d) Q1 Q5 B4 ~* r! s) I
+ h8 u7 g7 y! j$ \$ r3 \; {
' F: [7 X# D9 H, ]) }1 W/ G% F
. T% Y6 H. T6 T- u加载存储指令:
0 B. {& A2 }% K: y% o% T, I5 |! X. U" T
VLD和VST
8 q5 C7 f) e. }
4 g: o: a- H" q
! u. e. ?# G1 R& P/ C$ d# t h
% S3 h2 o+ u# |% W
+ j$ f2 X3 k; \2 P1 `* f Z( n交叉存取的示意图:
2 X( z9 h; s: D- U3 Q8 p9 r
; |4 i% y* F2 o5 M$ c
2 C u2 l6 u6 c& { P
& j% F, |3 A* lVREV反转元素指令:
# p# d5 [ \; I, O0 E! v1 P$ I( o6 F1 N; r9 y4 {
. Q6 `" H; k8 x% L( g
" L$ B% k# H4 @VEXT移位指令: P) J3 Z( B3 b M
9 c5 s' n/ V" m, u& i
9 m- M7 X: V& p1 W/ w& s3 D% d
5 o$ A- h/ C" d8 b3 AVTRN转置指令:可以用于矩阵的转置
9 i) z$ ]. d7 o8 H5 V. z& Z( Y3 b& `3 X( b7 ~5 e
- {( g+ g: f7 X, ?3 |8 D4 D
Q+ Z! ]/ R- N. l
! x l! Y( m" a, z
, T& M g' U( Y. l% S3 aVZIP指令:压缩,类似交叉存取
1 }+ M1 T+ m. |' w, `: q8 I4 X* c7 K2 M$ l& \. @6 F( l) \& B- N) |
: a2 ~& @& r b; c7 W
. a# a/ M0 S5 r4 F! b
VUZP指令:解压操作,类似交叉存取' D: C5 B1 g' B* [
% q. v j7 ?5 A: B, P$ B
& O# g$ [6 s8 z" B9 O4 V
& `7 H) U* R0 w$ h3 Z" N4 g3 HVTBL查表指令:从d0,d1中查找d3中的索引值,如果找到则取出,没有找到则为0,存入d2中2 }9 C1 E G0 P
( |' k0 k, r( _
2 y+ R; f; b6 M+ G) h
, a& L8 K4 T6 H+ S. D% w
& A% i9 Y; M0 j3 X [
三、需要注意的地方/ x1 M( I- r ], g' k$ n
0 c% Z9 e& `+ s9 ]- L$ m
load数据的时候,第一次load会把数据放在cache里面,只要不超过cache的大小,下一次load同样数据的时候,则会比第一次load要快很多,会直接从cache中load数据,这样在汇编程序设计的时候是非常需要考虑的问题。
+ G, Y3 X# D- b: r. x
% G" O9 O* }4 Y, u3 z4 r3 Z 如:求取一个图像的均值,8*8的窗口,先行求和,然后列求和出来均值,这时候会有两个函数,数据会加载两遍,如果按照这样去优化的话则优化不了多少。如果换成上面这种思路,先做行16行,然后再做列,这样数据都在cache里面,做列的时候load数据会很快。
2 L" [1 ]1 o+ U5 N1 _4 p6 G4 o0 S4 G+ c* U
在做neon乘法指令的时候会有大约2个clock的阻塞时间,如果你要立即使用乘法的结果,则就会阻塞在这里,在写neon指令的时候需要特别注意。乘法的结果不能立即使用,可以将一些其他的操作插入到乘法后面而不会有时间的消耗。) l% e# c/ X$ B" A
& ]: b+ W: ]. v7 _4 V& z3 V; h) \
如:vmul.u16 q1, d3, d4
" f. q! n- I! G1 M7 M6 u9 H* e# ]0 f& |4 c: Q+ f# t. H; g9 R! }
vadd.u32 q1, q2, q3, R) l% [* S2 \5 p8 X4 v% X
$ g; x* B# l+ D3 H" r8 F7 @此时直接使用乘法的结果q1则会阻塞,执行vadd需要再等待2个clock的时间1 K9 j! h8 S0 f: B8 \
5 r! ^2 p# N8 ?, e使用饱和指令的时候,如乘法饱和的时候,在做乘法后会再去做一次饱和,所以时间要比直接做乘法要慢。! g0 ?4 Z9 j$ S/ Y. F5 S
, a* l0 S# y# ]
如: vmul.u16 q1, d3, d4
?% j. u! E- n8 w1 G
. C* z" M2 {0 F% s6 j vqmul.u32 q1, q2, q3# K( L6 }7 [2 ? G% j1 n. K% Q
* y9 j/ D+ a7 C6 f后一个的时间要比第一个的时间要久。
+ Q9 m- w9 f2 P; f. w
6 G4 Y% b S+ T; ?% b# n. w" F6 J在对16位数据进行load或者store操作的时候,需要注意的是字节移位。比如是16位数据,则load 8个16位数据,如果指定寄存器进行偏移,此时需要特别注意。7 X) f8 } P3 D# F9 s( {
, u1 f ~' a7 }例如:vld1.64 {d0}, [r0], r1$ U6 I. n5 P2 c
|
|