[fpc-pascal] fast integer multiplication
Marcel Martin
mm10 at ellipsa.net
Thu Jul 28 19:16:08 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).
>
>
> 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
More information about the fpc-pascal
mailing list