Florian Klaempfl a écrit :
Vincent Snijders wrote:


Hi,

Suppose I have the following code:

var
 a,b: dword;
 c: qword;

begin
 a := 10000000;
 b := 20000000;
 c := a * b;
 writeln(c);
end.

Now, although c is large enough to contain the result only the lower
dword is filled. I can force correct results by using c := qword(a) * b,
but the slow fpc_mul_qword is used.

The code generated for the above sample is:
# [16] c:=a*b;
   movl    U_P$PROJECT1_A,%edx
   movl    U_P$PROJECT1_B,%eax
   mull    %edx
   movl    $0,%edx
   movl    %eax,U_P$PROJECT1_C
   movl    %edx,U_P$PROJECT1_C+4

What I want is the above code, but without the "movl $0,%edx"
instruction. Is there a way to do this (wihtout using fpc_mul_qword).


Only assembler for now. Any suggestions how the compiler could be told
to generate such code?

Since you ask the question, I suppose you cannot simply
suppress the "movl $0,%edx" line generation [*]. What about
using a compiler directive, something like {$EXTENDEDMUL ON/OFF}
for instance?

[*] Note that because of this line, currently FPC has not a
"coherent" behaviour. If you write x := y*z with x: Word and
y,z: Byte or with x: Longword and y,z: Word, the resulting value
x is the exact multiplication result and not the result truncated
to the size of the multiplicand and multiplicator type (like it
is with x: QWord and y,z: Longword).

MM


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

Reply via email to