Re: [fpc-pascal] fast integer multiplication
... >>The code generated for the above sample is: >># [16] c:=a*b; >>movlU_P$PROJECT1_A,%edx >>movlU_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? ... >function UI32x32To64(A,B: Longword): QWord; >assembler; register; nostackframe; >asm >mull %edx >end; > >It is fast but certainly much less than if it were inlined. My suggestion would be: FUNCTION lmul ( CONST a, b : LongInt ) : int64 ; inline ; BEGIN {$ifdef cpu86} ASM movla,%eax imull b movl%eax,lmul movl%edx,lmul+4 END ; {$else} {$ifdef cpu68k} lmul := int64 ( a ) * b ; {$else} {$ifdef cpusparc} lmul := int64 ( a ) * b ; {$else} {$ifdef cpualpha} lmul := int64 ( a ) * b ; {$else} {$ifdef cpupowerpc} lmul := int64 ( a ) * b ; {$else} lmul := int64 ( a ) * b ; {$endif} {$endif} {$endif} {$endif} {$endif} END ; and similar for unsigned mul. (shortened here; full code in ulmul.pas; liitle test in tmuls.pas, timing routines in wtimer/tdrsc1) Is portable so code doesn't need to be rewritten when compiled for other processors (but not optimal then) Tested only on i386. Seems to be faster than standard multiplication (interesting: significantly faster for signed mul than for unsigned mul), can be assembly-coded in the branches for the other cpus (if there are opcodes for such a multiplication - I don't know), could go to unit math.pp. It seems that routines which contain assembler are not inlined; on the day somebody finds a trick to inline such code they should be really fast. Gerhard ULMUL.pas Description: Binary data tmuls.pas Description: Binary data WTIMER.pas Description: Binary data TDRSC1.pas Description: Binary data ___ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Re: [fpc-pascal] lazarus crash at start
--- Peter Vreman <[EMAIL PROTECTED]> escribió: > At 01:12 1-8-2005, you wrote: > >Trying to find why lazarus crashes at start in win98 I found a > courious > >problem, global variable IsConsole is true when it should be false > as > >lazarus is built as a gui application. > > > >Digging I found that IsConsole is set in two functions in > wprt0.as: > >_mainCRTStartup sets to true and _WinMainCRTStartup sets to False, > this > >cause a wrong setup of standard Output that DebugLn (lclprocs.pas) > use to > >emit debug messages. > > > >It seems that this functions are 'used' in the linker script, for > example > >ld .--verbose shows that by default a ENTRY(_mainCRTStartup) it's > used. I > >looked into the generated lazarus link.res file and didn't find a > ENTRY > >section so I guess it uses the default and that's why even when > lazarus is > >a gui app, it's linked as a console app. > > > >To demostrate this I modified the link.res script to inculde > >ENTRY(_WinMainCRTStartup) section and then linked, the resulting > >lazarus.exe file now behaves as a gui app and won't crash at > start. > > > >It seems that WriteResponseFile lacks the code to add the ENTRY > section to > >the link.res script but I don't know if it's supposed to be there > or > >should it be in another stage, any comments? > > You need to use {$apptype gui} or use the -WG parameter. For the > compiler > it is not known if the application needs a console or not. > > > Peter > Lazarus is already compiled with -WG Jesus Reyes A. __ Correo Yahoo! Espacio para todos tus mensajes, antivirus y antispam ¡gratis! Regístrate ya - http://correo.yahoo.com.mx/ ___ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Re: [fpc-pascal] lazarus crash at start
Peter Vreman wrote: At 01:12 1-8-2005, you wrote: Trying to find why lazarus crashes at start in win98 I found a courious problem, global variable IsConsole is true when it should be false as lazarus is built as a gui application. You need to use {$apptype gui} or use the -WG parameter. For the compiler it is not known if the application needs a console or not. If you use -WG, IsConsole should be false. Correct? Vincent. ___ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal
Re: [fpc-pascal] lazarus crash at start
At 01:12 1-8-2005, you wrote: Trying to find why lazarus crashes at start in win98 I found a courious problem, global variable IsConsole is true when it should be false as lazarus is built as a gui application. Digging I found that IsConsole is set in two functions in wprt0.as: _mainCRTStartup sets to true and _WinMainCRTStartup sets to False, this cause a wrong setup of standard Output that DebugLn (lclprocs.pas) use to emit debug messages. It seems that this functions are 'used' in the linker script, for example ld .--verbose shows that by default a ENTRY(_mainCRTStartup) it's used. I looked into the generated lazarus link.res file and didn't find a ENTRY section so I guess it uses the default and that's why even when lazarus is a gui app, it's linked as a console app. To demostrate this I modified the link.res script to inculde ENTRY(_WinMainCRTStartup) section and then linked, the resulting lazarus.exe file now behaves as a gui app and won't crash at start. It seems that WriteResponseFile lacks the code to add the ENTRY section to the link.res script but I don't know if it's supposed to be there or should it be in another stage, any comments? You need to use {$apptype gui} or use the -WG parameter. For the compiler it is not known if the application needs a console or not. Peter ___ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal