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?
CodePudding user response:
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:
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 .xmm for .xmm directive to work as expected.
