使用AVX的JWASM无法编译和AVX指令

发布于 2025-02-10 13:42:59 字数 3818 浏览 1 评论 0原文

我有一个使用AVX的MASM程序,但是当我尝试用JWASM组装(MASM克隆)时会出现错误。我找不到任何指令来正确组装AVX指令(例如.mmx.xmm)。

.686
.xmm
.model flat,c

.code

AVXPackedInt_16 proc
; Prologo funzione
    push ebp
    mov ebp,esp

; Carica Argomento
    mov eax,[ebp+8]                         ; eax = pointer to a
    mov ecx,[ebp+12]                        ; ecx = pointer to b
    mov edx,[ebp+16]                        ; edx = pointer to res

    vmovdqa ymm0,ymmword ptr [eax]          ; Usando questa istruzione dobbiamo allineare rispetto ad un limite di 32-bit.      ymm0 = a
    vmovdqa ymm1,ymmword ptr [ecx]          ; ymm1 = b

; Addizione
    vpaddw ymm2,ymm0,ymm1                   ; ymm2 = ymm0 + ymm1, wraparound
    vpaddsw ymm3,ymm0,ymm1                  ; ymm3 = ymm0 + ymm1, signed saturation

; Sottrazione
    vpsubw ymm4,ymm0,ymm1                   ; ymm4 = ymm0 - ymm1, wraparound
    vpsubsw ymm5,ymm0,ymm1                  ; ymm5 = ymm0 - ymm1, signed saturation

; Valore Minimo
    vpminsw ymm6,ymm0,ymm1                  ; Valore Minimo con Segno

; Valore Massimo
    vpmaxsw ymm7,ymm0,ymm1                  ; Valore Massimo con Segno

; Salva Risultati
    vmovdqa ymmword ptr [edx],ymm2          ; Salva "ymm0 + ymm1, wraparound" dentro la memoria puntata da "edx" cioe` res[0]
    vmovdqa ymmword ptr [edx+32],ymm3       ; Salva "ymm0 + ymm1, signed saturation"
    vmovdqa ymmword ptr [edx+64],ymm4       ; Salva "ymm0 - ymm1, wraparound"
    vmovdqa ymmword ptr [edx+96],ymm5       ; Salva "ymm0 - ymm1, signed saturation"
    vmovdqa ymmword ptr [edx+128],ymm6      ; Salva "valore minimo con segno"
    vmovdqa ymmword ptr [edx+160],ymm7      ; Salva "valore massimo con segno"

    vzeroupper                              ; Pone a zero i 128 bits di ordine maggiore di tutti i registri ymm salvando da penalita' riguardanti le performance

    pop ebp
    ret

AVXPackedInt_16 endp

AVXPackedInt_32 proc
; Prologo Funzione
    push ebp
    mov ebp,esp

; Carico Argomenti
    mov eax,[ebp+8]                         ; eax = pointer to a
    mov ecx,[ebp+12]                        ; ecx = pointer to b
    mov edx,[ebp+16]                        ; edx = pointer to res

    vmovdqa ymm0,ymmword ptr [eax]          ; Usando questa istruzione dobbiamo allineare rispetto ad un limite di 32-bit.      ymm0 = a
    vmovdqa ymm1,ymmword ptr [ecx]          ; ymm1 = b

    vphaddd ymm2,ymm0,ymm1                  ; addizione orizzontale
    vphsubd ymm3,ymm0,ymm1                  ; sottrazione orizzontale
    vpmulld ymm4,ymm0,ymm1                 ; moltiplicazione con segno
    vpsllvd ymm5,ymm0,ymm1                  ; shift logico a sinistra               ymm5 = ymm0 << ymm1
    vpsravd ymm6,ymm0,ymm1                  ; shift aritmetico a destra             

; Salva Risultati
    vmovdqa ymmword ptr [edx],ymm2          ; Salva ymm2
    vmovdqa ymmword ptr [edx+32],ymm3       ; Salva ymm3
    vmovdqa ymmword ptr [edx+64],ymm4       ; Salva ymm4
    vmovdqa ymmword ptr [edx+96],ymm5       ; Salva ymm5
    vmovdqa ymmword ptr [edx+128],ymm6      ; Salva ymm6
    vmovdqa ymmword ptr [edx+160],ymm7      ; Salva ymm7

    vzeroupper

    pop ebp
    ret

AVXPackedInt_32 endp
            end

当我尝试使用Jwasm编译时,我会遇到以下错误:

avxpackedintarith.asm(21):错误A2049:无效的说明操作数 avxpackedintarith.asm(22):错误A2049:无效的说明操作数 avxpackedintarith.asm(25):错误A2049:无效的说明操作数 avxpackedintarith.asm(26):错误A2049:无效的说明操作数 avxpackedintarith.asm(29):错误A2049:无效的说明操作数 avxpackedintarith.asm(32):错误A2049:无效的说明操作数 avxpackedintarith.asm(62):错误A2049:无效的说明操作数 avxpackedintarith.asm(63):错误A2049:无效的说明操作数 avxpackedintarith.asm(65):错误A2209:语法错误:vpslvd avxpackedintarith.asm(66):错误A2209:语法错误:vpsrvd avxpackedintarith.asm:82行,1次,0 ms,0警告,11个错误

我该如何解决此问题?

I have a MASM program which uses AVX but I get errors when I try to assemble it with JWASM (a MASM clone). I couldn't find any directives to properly assemble the AVX instructions (like .mmx or .xmm).

.686
.xmm
.model flat,c

.code

AVXPackedInt_16 proc
; Prologo funzione
    push ebp
    mov ebp,esp

; Carica Argomento
    mov eax,[ebp+8]                         ; eax = pointer to a
    mov ecx,[ebp+12]                        ; ecx = pointer to b
    mov edx,[ebp+16]                        ; edx = pointer to res

    vmovdqa ymm0,ymmword ptr [eax]          ; Usando questa istruzione dobbiamo allineare rispetto ad un limite di 32-bit.      ymm0 = a
    vmovdqa ymm1,ymmword ptr [ecx]          ; ymm1 = b

; Addizione
    vpaddw ymm2,ymm0,ymm1                   ; ymm2 = ymm0 + ymm1, wraparound
    vpaddsw ymm3,ymm0,ymm1                  ; ymm3 = ymm0 + ymm1, signed saturation

; Sottrazione
    vpsubw ymm4,ymm0,ymm1                   ; ymm4 = ymm0 - ymm1, wraparound
    vpsubsw ymm5,ymm0,ymm1                  ; ymm5 = ymm0 - ymm1, signed saturation

; Valore Minimo
    vpminsw ymm6,ymm0,ymm1                  ; Valore Minimo con Segno

; Valore Massimo
    vpmaxsw ymm7,ymm0,ymm1                  ; Valore Massimo con Segno

; Salva Risultati
    vmovdqa ymmword ptr [edx],ymm2          ; Salva "ymm0 + ymm1, wraparound" dentro la memoria puntata da "edx" cioe` res[0]
    vmovdqa ymmword ptr [edx+32],ymm3       ; Salva "ymm0 + ymm1, signed saturation"
    vmovdqa ymmword ptr [edx+64],ymm4       ; Salva "ymm0 - ymm1, wraparound"
    vmovdqa ymmword ptr [edx+96],ymm5       ; Salva "ymm0 - ymm1, signed saturation"
    vmovdqa ymmword ptr [edx+128],ymm6      ; Salva "valore minimo con segno"
    vmovdqa ymmword ptr [edx+160],ymm7      ; Salva "valore massimo con segno"

    vzeroupper                              ; Pone a zero i 128 bits di ordine maggiore di tutti i registri ymm salvando da penalita' riguardanti le performance

    pop ebp
    ret

AVXPackedInt_16 endp

AVXPackedInt_32 proc
; Prologo Funzione
    push ebp
    mov ebp,esp

; Carico Argomenti
    mov eax,[ebp+8]                         ; eax = pointer to a
    mov ecx,[ebp+12]                        ; ecx = pointer to b
    mov edx,[ebp+16]                        ; edx = pointer to res

    vmovdqa ymm0,ymmword ptr [eax]          ; Usando questa istruzione dobbiamo allineare rispetto ad un limite di 32-bit.      ymm0 = a
    vmovdqa ymm1,ymmword ptr [ecx]          ; ymm1 = b

    vphaddd ymm2,ymm0,ymm1                  ; addizione orizzontale
    vphsubd ymm3,ymm0,ymm1                  ; sottrazione orizzontale
    vpmulld ymm4,ymm0,ymm1                 ; moltiplicazione con segno
    vpsllvd ymm5,ymm0,ymm1                  ; shift logico a sinistra               ymm5 = ymm0 << ymm1
    vpsravd ymm6,ymm0,ymm1                  ; shift aritmetico a destra             

; Salva Risultati
    vmovdqa ymmword ptr [edx],ymm2          ; Salva ymm2
    vmovdqa ymmword ptr [edx+32],ymm3       ; Salva ymm3
    vmovdqa ymmword ptr [edx+64],ymm4       ; Salva ymm4
    vmovdqa ymmword ptr [edx+96],ymm5       ; Salva ymm5
    vmovdqa ymmword ptr [edx+128],ymm6      ; Salva ymm6
    vmovdqa ymmword ptr [edx+160],ymm7      ; Salva ymm7

    vzeroupper

    pop ebp
    ret

AVXPackedInt_32 endp
            end

I Get the following errors when I try to compile with Jwasm:

AVXPackedIntArith.asm(21) : Error A2049: Invalid instruction operands
AVXPackedIntArith.asm(22) : Error A2049: Invalid instruction operands
AVXPackedIntArith.asm(25) : Error A2049: Invalid instruction operands
AVXPackedIntArith.asm(26) : Error A2049: Invalid instruction operands
AVXPackedIntArith.asm(29) : Error A2049: Invalid instruction operands
AVXPackedIntArith.asm(32) : Error A2049: Invalid instruction operands
AVXPackedIntArith.asm(62) : Error A2049: Invalid instruction operands
AVXPackedIntArith.asm(63) : Error A2049: Invalid instruction operands
AVXPackedIntArith.asm(65) : Error A2209: Syntax error: vpslvd
AVXPackedIntArith.asm(66) : Error A2209: Syntax error: vpsrvd
AVXPackedIntArith.asm: 82 lines, 1 passes, 0 ms, 0 warnings, 11 errors

How can I solve this problem?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文