[fpc-pascal] fast integer multiplication
Peter Vreman
peter at freepascal.org
Fri Jul 29 08:00:23 CEST 2005
> 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).
No. At the time a*b is calculated there is nothing known about the size of
the result.
>> 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?
I don't like this. This means we have to add directives for all kind of
special cpu features to improve some special corner cases.
More information about the fpc-pascal
mailing list