我是新來的彙編和NEON編程。 我的任務是部分由C轉換算法的使用NEON指令ARM彙編。 該算法需要一個INT32陣列,從這個數組加載不同的值,做了一些bitshifting和XOR,並且在另一個數組寫入的結果。 後來,我將使用帶有64位值的數組,但現在我只是嘗試重寫代碼。ARM NEON彙編 - 使用和理解
C Pseudo code:
out_array[index] = shiftSome(in_array[index])^shiftSome(in_array[index]);
因此,這裏有我的關於NEON指令的問題:
1)如果我打開一個寄存器:
vld1.32 d0, [r1]
將其從內存或2x32Bit只加載32位填寫64Bit霓虹燈D-Register?
2)我怎樣才能訪問2/4/8(I32,I16,I8)的d-註冊的部分?
3.)我試圖從偏移量的數組中加載不同的值,但它不似乎 工作...我在做什麼錯...這裏是我的代碼: (這是一個整數數組所以我正嘗試加載例如3-元件,其應具有64位= 8字節的偏移)
asm volatile(
"vld1.32 d0, [%0], #8 \n"
"vst1.32 d0, [%1]" : : "r" (a), "r" (out): "d0", "r5");
其中「a」是數組和「out」是一個指針,指向一個整數(用於調試)。
4)我加載從數組我需要把它轉移到右邊的值之後,但它似乎並沒有工作:
vshr.u32 d0, d0, #24 // C code: x >> 24;
5)是否有可能只裝1字節在霓虹燈註冊表中,這樣我就不必移動/掩蓋某些東西來獲取我需要的一個字節?
6)我需要使用內聯彙編程序,但我不知道最後一行是什麼:
input list : output list : what is this for?
7)你知道與代碼示例什麼好NEON參考?
規劃署上的三星Galaxy S2,Cortex-A9處理器運行,如果有什麼差別。謝謝您的幫助。
----------------編輯-------------------
這就是我發現:
- 它總是加載完整寄存器(64位)
- 您可以使用「VMOV」指令傳遞一個霓虹燈的一部分註冊一個ARM寄存器。
- 該偏移量應該在一個arm寄存器中,並且將在之後的 的基地址上加上內存訪問。
- 這是「慘敗REG名單」。使用的每一種和 既不在輸入或輸出列表註冊,應該寫在這裏。
2.從SIMD移動內容寄存器ARM寄存器會造成一個完整的管道沖洗,你花費大約14個週期。躲開它。 – 2017-10-15 06:42:07