>>>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. > > But it is a special case because FPC makes it special. As I wrote > yesterday, when you write Word := Byte * Byte, what you get is > the exact result (not the result mod 2^8), when you write > Longword := Word * Word, what you get is the exact result (not the > Result mod 2^16), but when you write QWord := Longword * Longword, > there, what you get is not (always) the exact result but the result > mod 2^32. This is FPC which makes special this case by setting the > product high part to 0 (what it doesn't do with other cases). > > Being said that, I agree with you that adding compiler directives > is not a good thing [*]. Here, it would be sufficient to suppress > the generation of the line "movl $0,%edx". Since you do not do so, > I suppose there would be some side effects I don't see at the > moment, but it would be the simplest solution. > > [*] If QWord := Longword * Longword gave the exact result, it would > allow me to suppress a lot of compiler directives :-)
The rules are the same as with int64:=longint*longint. Below is a test. The result is -2 on both fpc and delphi. var e : int64; i,j : longint; begin i:=$7fffffff; j:=2; e:=i*j; writeln(e); end. _______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal