Hi,

Win32 .exe compiled on Win64 computer, latest SVN build.

I am trying to multiply 2 Integers (Declared as LongInt but sometimes need to use it as LongWord) and put the result into a QWord (64bit unsigned) result variable on Win32.
However, it seems that the result is always cut to 32bit.
Checked the assembler window inside Lazarus and there is a "mull" instruction and immediately after that there is a zeroing out of the "EDX" register cutting the "EDX:EAX" result short.
Simplified example:

var
A: LongInt;
C: QWord;

begin
  A := $12345678;
  C := LongWord(A) * LongWord(255);
.
.
.
end;

Am I doing something wrong in the code to accomplish this?

in Assembly it could be something like:
asm//Intel syntax
  mov edx, $12345678
  mov eax, 255
  mul edx
...store
end;
which would store the 64 bit result from EDX:EAX
However, the code actually generated is something like:
asm//Lazarus syntax
  mull ...
  mov $0x0, %edx   <- why is this here?
then stores both eax and edx into the variable
end;

Thanks for any help,

AB

PS: Any way to see the assembler window in Intel assembly syntax?

_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to