> 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. _______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal