JWASM with AVX cannot compile and AVX directive

124 Views Asked by At

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?

0

There are 0 best solutions below