Hi
I'm not sure if I understand the behaviour of "option Arch:xxx" in 64 bit correctly :rolleyes: (http://masm32.com/board/index.php?topic=8451.msg92482#msg92482 (http://masm32.com/board/index.php?topic=8451.msg92482#msg92482)).
I came across this while passing a REAL4 as an argument of a 64 bit proc using an older mobile CPU that doesn't support vector instructions and crashed the app when running (Exception instruction not supported).
Because of this, I commented out the "option Arch:AVX" for my own code (that uses vector instructions) and all was fine again, even if @Arch reported 1.
This is, afaik because in 64 bit, AVX is the default. What is strange is the following inconsistency. I use this simple code:
MyProc proc r4:REAL4
%echo $ToStr(%@Arch) ;This echoes the content of @Arch
fld r4
ret
MyProc endp
Scenario 1: option commented out
;option arch:AVX
echo @Arch => 1
invoke MyProc, r4MyVal
000000013FF8001C movd xmm0,dword ptr [r4MyVal]
000000013FF80021 call MyProc (013FF7F174h)
Scenario 2: option Arch:SSE
option arch:SSE
echo @Arch => 0
invoke MyProc, r4MyVal
000000013FF8001C movd xmm0,dword ptr [r4MyVal]
000000013FF80021 call MyProc (013FF7F174h)
Scenario 3: option Arch:SSE
option arch:AVX
echo @Arch => 1
invoke MyProc, r4MyVal
000000013F10F6E7 vmovd xmm0,dword ptr [r4MyVal]
000000013F10F6EC call MyProc (013F10F174h)
As you can see, the default @Arch = 1 isn't working when invoke is called.
Biterider
Hi Biterider,
Some inconsistency exist with UASM 2.49.1 or lower. John fixed this in the uasm 2.50 branch. With @Arch or invoke moves.
IFNDEF ARCH_SSE
ARCH_SSE EQU 0
ENDIF
IFNDEF ARCH_AVX
ARCH_AVX EQU 1
ENDIF
IF @Arch EQ ARCH_AVX
MOV EAX, val
VMOVD reg, EAX
ELSE
MOV EAX, val
MOVD reg, EAX
ENDIF
.IF @Arch EQ ARCH_AVX
MOV EAX, val
VMOVD reg, EAX
.ELSE
MOV EAX, val
MOVD reg, EAX
.ENDIF
echo @Arch EQ ARCH_SSE ;;0 true if @Arch == 0
echo @Arch EQ ARCH_AVX ;;1 true if @Arch == 1
echo @Arch GE ARCH_SSE ;;0 true if @Arch >= 0 (inclusive 1)
echo @Arch GE ARCH_AVX ;;1 true if @Arch >= 1
Hi KradMoonRa
OK, good to know. Thanks.
Biterider