Hirdetés

Aktív témák

  • P.H.

    senior tag

    válasz #95904256 #46 üzenetére

    Round()-ot nem hoztam fel példának, mert az összes Opt. Manual-ban az hozzák fel érvként, hogy a kerekítés az alapértelmezett FPU konvertálás integer-be (a 'la C).

    i:=16;
    atemp:=round(i);

    Delphi:

    mov eax,$00000010
    mov [ebp-$08],esi
    fild dword ptr [ebp-$08]
    call @ROUND

    ...

    @ROUND:
    sub esp,08h
    fistp qword ptr [esp]
    pop eax
    pop edx
    ret

    FLD/FILD Q[ESP]: float -> integer lenne a mondandó, ez pedig nem az.

    Lehet hogy a trunc() nem a legjobb példa, mert én SSE3-as FISTTP-et használok in-line, ellenben a szintén in-line ( és valóban nem funkcióhívás ) Delphi / C trunc() megoldással. Ennek ellenére a FISTTP kontra FSTCW+FLDCW+FISTP(+FLDCW) kombó sebességbeli különbsége elég látványos. Ezzel csak az a baj, hogy én nem sűrűn találkoztam SSE3-képes géppel a célközönségünkben. És holnap annak fogok nekiülni, hogy egy virtualizált, 32 vagy 64 MB memóriával ellátott Linux alatti Wine-s környezet normálisan futtassa a programomat.
    Én »jelenleg« SSE2 felett nem szoktam programot írni nagyközönségnek, mert nincs arra képes hardware (csak itthon).

Aktív témák