[fpc-pascal] fast integer multiplication and one asm questio

Pianoman pianoman at centrum.sk
Tue Aug 2 17:22:03 CEST 2005


Hi, the UI32x32To64 function is great but is amazingly short. How can I
Specify which varriables in function will be accessed. In this function for
example it accesses a and b but source says mull (I don't know why not mul I
didnt find mull instruction in any assembly book) and %eax why mull %eax
multiplies a,b is it on the stack or why? If i would like to multiply a,b,c
what would look source code then? Thanx for response to those  quite stupid
assembly question(I am only beginner in asm :)
Pianoman
----- Original Message -----
From: <fpc-pascal-request at lists.freepascal.org>
To: <fpc-pascal at lists.freepascal.org>
Sent: Tuesday, August 02, 2005 12:00 PM
Subject: fpc-pascal Digest, Vol 12, Issue 2


Send fpc-pascal mailing list submissions to
fpc-pascal at lists.freepascal.org

To subscribe or unsubscribe via the World Wide Web, visit
http://lists.freepascal.org/mailman/listinfo/fpc-pascal
or, via email, send a message with subject or body 'help' to
fpc-pascal-request at lists.freepascal.org

You can reach the person managing the list at
fpc-pascal-owner at lists.freepascal.org

When replying, please edit your Subject line so it is more specific
than "Re: Contents of fpc-pascal digest..."


Today's Topics:

   1. Re:  lazarus crash at start (Jesus Reyes)
   2. Re:  fast integer multiplication (Gerhard Scholz)
   3.  Can a program find out how it was started?
      (miller at psy.otago.ac.nz)
   4. Re:  Can a program find out how it was started? (Moz)


----------------------------------------------------------------------

Message: 1
Date: Mon, 1 Aug 2005 11:21:10 -0500 (CDT)
From: Jesus Reyes <jesusrmx at yahoo.com.mx>
Subject: Re: [fpc-pascal] lazarus crash at start
To: FPC-Pascal users discussions <fpc-pascal at lists.freepascal.org>
Message-ID: <20050801162111.68197.qmail at web52306.mail.yahoo.com>
Content-Type: text/plain; charset=iso-8859-1


 --- Peter Vreman <peter at freepascal.org> 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/



------------------------------

Message: 2
Date: Mon, 1 Aug 2005 23:58:04 +0200
From: "Gerhard Scholz" <gs at g--s.de>
Subject: Re: [fpc-pascal] fast integer multiplication
To: "FPC-Pascal users discussions" <fpc-pascal at lists.freepascal.org>
Message-ID: <04d601c596e4$1aef7de0$f7dcb9d9 at es>
Content-Type: text/plain; charset="iso-8859-1"

...
>>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?
...
>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
        movl    a,%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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ULMUL.pas
Type: application/octet-stream
Size: 2604 bytes
Desc: not available
Url :
http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20050801/86cde0
70/ULMUL-0001.obj
-------------- next part --------------
A non-text attachment was scrubbed...
Name: tmuls.pas
Type: application/octet-stream
Size: 1291 bytes
Desc: not available
Url :
http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20050801/86cde0
70/tmuls-0001.obj
-------------- next part --------------
A non-text attachment was scrubbed...
Name: WTIMER.pas
Type: application/octet-stream
Size: 1645 bytes
Desc: not available
Url :
http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20050801/86cde0
70/WTIMER-0001.obj
-------------- next part --------------
A non-text attachment was scrubbed...
Name: TDRSC1.pas
Type: application/octet-stream
Size: 2879 bytes
Desc: not available
Url :
http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20050801/86cde0
70/TDRSC1-0001.obj

------------------------------

Message: 3
Date: Tue,  2 Aug 2005 22:03:45 +1200
From: miller at psy.otago.ac.nz
Subject: [fpc-pascal] Can a program find out how it was started?
To: fpc-pascal at lists.freepascal.org
Message-ID: <1122977025.42ef45014673a at www.psy.otago.ac.nz>
Content-Type: text/plain; charset=ISO-8859-1

Greetings from New Zealand,

I use fpc to compile programs intended to be run from the command line in a
cmd
window (Windows 2000, etc).  Sometimes, though, new users try to start the
programs by double-clicking on the exe file (application icon). When the
program starts, I would like to be able to tell if they have done that,
so that I can present a special error message.

So my question is:
  Is it possible for a program to tell whether it was started from
  the command line or started by double-clicking on the application icon?

I tried checking ParamStr(0) and DOSVersion, but these have the same values
regardless of how the program was started.

Any suggestions?

Thank you for your time,

Jeff Miller



------------------------------

Message: 4
Date: Tue, 2 Aug 2005 19:25:13 +1000
From: Moz <list at moz.geek.nz>
Subject: Re: [fpc-pascal] Can a program find out how it was started?
To: FPC-Pascal users discussions <fpc-pascal at lists.freepascal.org>
Message-ID: <1412152272.20050802192513 at moz.geek.nz>
Content-Type: text/plain; charset=us-ascii

miller at psy.otago.ac.nz said:
> Sometimes, though, new users try to start the programs by
> double-clicking on the exe file (application icon). When the program
> starts, I would like to be able to tell if they have done that, so
> that I can present a special error message.

One trivial solution is to drop a readline at the end of the help
routine. That way the cmd window stays open until they hit enter
(which you should tell them to do). Mildly annoying for people at the
command line if there's only a few lines of help, but solves the
problem.

Moz




------------------------------

_______________________________________________
fpc-pascal maillist  -  fpc-pascal at lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


End of fpc-pascal Digest, Vol 12, Issue 2
*****************************************


__________ Informacia od NOD32 1.977 (20050120) __________

Tato sprava bola preverena antivirusovym systemom NOD32.
http://www.eset.sk







More information about the fpc-pascal mailing list