I have the following assembly program that gives me an error when compilating:
.686
.mmx
.model flat,c
.code
MmxAdd proc
push ebp
mov ebp,esp
mov eax, [ebp+24]
cmp eax, AddOpTableCount
jae BadAddOp
movq mm0,[ebp+8]
movq mm1,[ebp+16]
jmp [AddOpTable+eax*4]
MmxPaddb:
paddb mm0,mm1
jmp SaveResult
MmxPaddsb:
paddsb mm0,mm1
jmp SaveResult
MmxPaddusb:
paddusb mm0,mm1
jmp SaveResult
MmxPaddw:
paddw mm0,mm1
jmp SaveResult
MmxPaddsw:
paddsw mm0,mm1
jmp SaveResult
MmxPaddusw:
paddusw mm0,mm1
jmp SaveResult
MmxPaddd:
paddd mm0,mm1
jmp SaveResult
BadAddOp:
pxor mm0,mm0
SaveResult:
movd eax,mm0
pshufw mm2,mm0, 01001110b
movd edx,mm2
emms
pop ebp
ret
align 4
AddOpTable:
dword MmxPaddb, MmxPaddsb, MmxPaddusb
dword MmxPaddw, MmxPaddsw, MmxPaddusw
dword MmxPaddd
AddOpTableCount equ ($-AddOpTable) / size dword
MmxAdd endp
end
But every time I try to compile it with JWASM I get the following error:
Mmx_Addition.asm(51) : Error A2030: Instruction or register not accepted in current CPU mode
That is the instruction that give me the error:
pshufw mm2,mm0, 01001110b
How can I solve this?
pshufw is considered an SSE(SSE-1) instruction. The instruction was considered an an extension to MMX aka MMXEXT, and to use it you will have to enable SSE using the .xmm directive instead of .mmx. This should work:
.686
.xmm
.model flat,c
.code
.xmm also implies .mmx so you don't need both. If you do use both then .mmx has to come before .xmm. I don't recommend using both.
The other instructions added as MMX extensions with SSE-1 were:
PINSRW
Insert 16-bit value from general register into one of four elements (specified by immediate)
PEXTRW
Extract one of four elements (specified by immediate) to a general register
PMULHU
Multiply four 16-bit unsigned elements returning most significant 16 bits of each
PSHUFW
Full shuffle of 16-bit elements under control of 8-bit immediate mask
PMOVMSB
Move 8-bit mask composed of MSbs of byte elements to a general register
PAVGB
Average of byte elements (Di = –(Di+ Si + 1)/2, i = 0…7)
PAVGW
Average of 16-bit elements (Di = –(Di + Si + 1)/2, i = 0…3)
PSADBW
Sum of absolute value of differences of 16-bit elements (D1,0 = ∑i=0…3 |Di – Si|)
PMINSW
Minimum of signed 16-bit elements
PMINUB
Minimum of unsigned byte elements
PMAXSW
Maximum of signed 16-bit elements
PMAXUB
Maximum of unsigned byte elements
You must use .686 (or later) alongside .xmm for .xmm directive to work as expected.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With