[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