[英]ARMv8 Advanced SIMD: "invalid addressing mode at operand 2 -- `st1 {V1.D}[0],[x20,640]'"
我試圖將 64 位從 V 寄存器到 X 寄存器中保存的地址存儲到內存中,但出現錯誤,“操作數 2 的尋址模式無效 -- `st1 {V1.D}[0],[x20, 640]”。
從ARMv8 指令集概述,操作應如下所示:
ST1 {Vt.<\\T>}[index], vaddr 從一個通道(一個寄存器的)存儲單個 1 元素結構
所有 SIMD 加載存儲結構指令都使用語法術語vaddr作為以下尋址模式的簡寫: [base] 由基址寄存器 Xn 或 SP 尋址的內存。 [base],Xm 內存由基址寄存器 Xn 或 SP 尋址,由 64 位變址寄存器 Xm 后遞增。 [base],#immMemory 由 Xn 或 SP 尋址,后遞增一個立即數,該值必須等於傳輸到/從內存的總字節數。
下面是具體顯示我想要完成的代碼。 對我來說,看起來應該沒問題。
__asm__ volatile (
"MOV V0.D[0], %[A_MASK] \n\t"
"ST1 {V0.D}[0], %[D] \n\t"
:
: [D] "m" (<pointer>), [A_MASK] "r" (0xFF000000)
: "memory", "V0"
);
st1
沒有偏移,所以[x20,640]
是非法的。 只有[x20]
和類似的才是合法的。 要強制 gcc 生成正確的地址,請使用手冊定義的Q
約束
使用沒有偏移量的單個基址寄存器的內存地址
請注意,gcc 具有向量支持,因此您可能不需要為此使用程序集。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.