簡體   English   中英

ARMv8 高級 SIMD:“操作數 2 處的尋址模式無效——`st1 {V1.D}[0],[x20,640]'”

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM