php小編百草為您帶來了關于在Go的匯編器中如何更高效地將全局數據加載到NEON寄存器的解決方案。Go語言在底層使用匯編器來優化性能,而NEON寄存器是ARM架構中的一種特殊寄存器,用于加速多媒體和信號處理操作。本文將介紹如何使用適當的指令和技巧,以提高數據加載到NEON寄存器的效率,從而優化Go程序的性能。讓我們一起來看看吧!
問題內容
arm64 asm代碼中有p256one全局數據作為示例:
DATA p256one+0x00(SB)/8, $0x0000000000000001 DATA p256one+0x08(SB)/8, $0xffffffff00000000 DATA p256one+0x10(SB)/8, $0xffffffffffffffff DATA p256one+0x18(SB)/8, $0x00000000fffffffe GLOBL p256one(SB), 8, $32
登錄后復制
我需要將 p256one(SB) 加載到 V0 和 V1 寄存器中。目前我使用以下方法:
LDP p256one+0x00(SB), (R0, R1) LDP p256one+0x10(SB), (R2, R3) VMOV R0, V0.D[0] VMOV R1, V0.D[1] VMOV R2, V1.D[0] VMOV R3, V1.D[1]
登錄后復制
這里總共使用了六個指令。我們知道我們可以加載內存數據,如下所示:
VLD1 (R0), [V0.B16, V1.B16]
登錄后復制
但是我們似乎無法用同樣的方法加載全局數據。
那么,在Go的匯編代碼中是否有更高效的方式將全局數據加載到NEON寄存器中呢?
解決方法
嘗試將地址加載到寄存器中,然后從該地址加載:
MOVD $p256one(SB), R0 VLD1 (R0), [V0.B16, V1.B16]
登錄后復制