Hirdetés

Keresés

Aktív témák

  • #95904256

    törölt tag

    válasz P.H. #48 üzenetére

    A FSTCW+FLDCW+FISTP+FLDCW helyett van gyorsabb TRUNC() megoldás is, most nem ugrik be a teljes kód, régen használtam már. De azért a következő pár sor alapján szerintem kikövetkeztethető a működése:

    FIST D[esp]
    FILD D[esp]
    FCOMPP
    FNSTSW AX
    TEST AH,xx
    Jcc READY
    SUB D[esp],1
    READY:

    Ez még mindig kétszer gyorsabb mint a CW regiszter módosításával működő TRUNC().

  • #95904256

    törölt tag

    válasz P.H. #48 üzenetére

    Még ha legegyszerűbb módon is hajtod végre a ROUND()-ot, de függvénnyel, akkor is ott marad a szubrutin hívás költsége, és igazából egy ilyen egyszerű függvénynél ez zavar. Mint megmutattad a TRUNC()-ot a Delphi is kifejtette "in-line", de az egyszerűbb! ROUND()-ot nem.

    szimpla CALL+RET páros átlagos órajeligénye kontra FLD+FISTP órajeligény
    ( a CPU általi utasításvégrehajtásba / ütemezésbe most nem bonyolódnék bele, aki ismeri az arhitektúrákat az úgyis tudja hogy mi merre mennyi )
    Core2: 18.4 / 9.0
    K10: 25.4 / 11.7
    K8: 25.2 / 10.6

    Megjegyezném a példádban szereplő esetben a ROUND()-ot így helyettesíteném:
    MOV EAX,ESI
    CDQ

Aktív témák

Hirdetés