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?
pshufwis 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.xmmdirective instead of.mmx. This should work:.xmmalso implies.mmxso you don't need both. If you do use both then.mmxhas to come before.xmm. I don't recommend using both.The other instructions added as MMX extensions with SSE-1 were:
PINSRWInsert 16-bit value from general register into one of four elements (specified by immediate)
PEXTRWExtract one of four elements (specified by immediate) to a general register
PMULHUMultiply four 16-bit unsigned elements returning most significant 16 bits of each
PSHUFWFull shuffle of 16-bit elements under control of 8-bit immediate mask
PMOVMSBMove 8-bit mask composed of MSbs of byte elements to a general register
PAVGBAverage of byte elements (Di = –(Di+ Si + 1)/2, i = 0…7)
PAVGWAverage of 16-bit elements (Di = –(Di + Si + 1)/2, i = 0…3)
PSADBWSum of absolute value of differences of 16-bit elements (D1,0 = ∑i=0…3 |Di – Si|)
PMINSWMinimum of signed 16-bit elements
PMINUBMinimum of unsigned byte elements
PMAXSWMaximum of signed 16-bit elements
PMAXUBMaximum of unsigned byte elements
You must use
.686(or later) alongside.xmmfor.xmmdirective to work as expected.