使用AVX的JWASM无法编译和AVX指令
我有一个使用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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论