ARM浮點(diǎn)運(yùn)算
強(qiáng)大的ARM v8A芯片,已經(jīng)不輸于JVM的設(shè)計(jì)了歇盼,也是很簡單舔痕。
源代碼:
double dadd(double a,double b){
return a+b;
}
double dsub(double a,double b){
return a-b;
}
double dmul(double a,double b){
return a*b;
}
double ddiv(double a,double b){
return a/b;
}
ARM v8a的浮點(diǎn)運(yùn)算
匯編代碼:
0000000000000760 <_Z4dadddd>:
760: 1e612800 fadd d0, d0, d1
764: d65f03c0 ret
0000000000000768 <_Z4dsubdd>:
768: 1e613800 fsub d0, d0, d1
76c: d65f03c0 ret
0000000000000770 <_Z4dmuldd>:
770: 1e610800 fmul d0, d0, d1
774: d65f03c0 ret
0000000000000778 <_Z4ddivdd>:
778: 1e611800 fdiv d0, d0, d1
77c: d65f03c0 ret
我們可以看到,寄存器已經(jīng)不是x開頭的通用寄存器了豹缀,而變成了d開頭的NEON寄存器伯复。我們實(shí)際上是借用了ARM v7a才出現(xiàn)的NEON指令才使得指令變得這么簡單。
也就是說邢笙,在ARM v8a架構(gòu)下使用NEON就不要像ARM v7a一樣的顯示調(diào)用了啸如,直接指明我要用的是D寄存器,具體怎么調(diào)用你們自己看著辦吧氮惯!
ARM v7a的浮點(diǎn)運(yùn)算:
同樣是NEON指令叮雳,但是v7a的就比v8a的看起來要復(fù)雜一點(diǎn)。不過倒更清晰地反映了邏輯事實(shí)妇汗。
v7a的NEON指令需要用vmov將通用寄存器中的數(shù)傳送到NEON寄存器中帘不,然后再進(jìn)行計(jì)算。結(jié)果再通過vmov送回到通用寄存器中杨箭。
00000fde <_Z4dadddd>:
fde: ec41 0b17 vmov d7, r0, r1
fe2: ec43 2b16 vmov d6, r2, r3
fe6: ee37 7b06 vadd.f64 d7, d7, d6
fea: ec51 0b17 vmov r0, r1, d7
fee: 4770 bx lr
00000ff0 <_Z4dsubdd>:
ff0: ec41 0b17 vmov d7, r0, r1
ff4: ec43 2b16 vmov d6, r2, r3
ff8: ee37 7b46 vsub.f64 d7, d7, d6
ffc: ec51 0b17 vmov r0, r1, d7
1000: 4770 bx lr
00001002 <_Z4dmuldd>:
1002: ec41 0b17 vmov d7, r0, r1
1006: ec43 2b16 vmov d6, r2, r3
100a: ee27 7b06 vmul.f64 d7, d7, d6
100e: ec51 0b17 vmov r0, r1, d7
1012: 4770 bx lr
00001014 <_Z4ddivdd>:
1014: ec41 0b17 vmov d7, r0, r1
1018: ec43 2b16 vmov d6, r2, r3
101c: ee87 7b06 vdiv.f64 d7, d7, d6
1020: ec51 0b17 vmov r0, r1, d7
1024: 4770 bx lr
傳統(tǒng)ARM的浮點(diǎn)運(yùn)算
沒啥說的寞焙,都得函數(shù)實(shí)現(xiàn)了:
00001248 <_Z3addll>:
1248: 1840 adds r0, r0, r1
124a: 4770 bx lr
0000124c <_Z3subll>:
124c: 1a40 subs r0, r0, r1
124e: 4770 bx lr
00001250 <_Z3mulll>:
1250: 4348 muls r0, r1
1252: 4770 bx lr
00001254 <_Z3divll>:
1254: b508 push {r3, lr}
1256: f001 ff47 bl 30e8 <_Unwind_GetTextRelBase+0x8>
125a: bd08 pop {r3, pc}
0000125c <_Z3modll>:
125c: b508 push {r3, lr}
125e: f001 ff4b bl 30f8 <_Unwind_GetTextRelBase+0x18>
1262: 1c08 adds r0, r1, #0
1264: bd08 pop {r3, pc}