Software > Coding

Kopie Funktion

<< < (2/4) > >>

1ST1:
Ist das zufällig für den 68080? Hast du mal drüber nachgedacht, ob du da AMMX einsetzen kannst? Das wäre dann SIMD, das müsste die Sache gut beschleunigen...

tuxie:
Hier geht es um einen Einfachen move!!! Gunnar hat mir eine Gedankenstütze gegeben
1
move.w
 --
2
move.l
 --
3
move.l
move.w
 --
4
move.l
move.l
dbra
5
move.l
move.l
dbra
move.w
6
move.l
move.l
dbra
move.l
 7
4*n +3rest
aus=breite and 3
if breite >=4 auswahl+4

So das quasi keine schleifen mehr entstehen da die schleifen echt zeit kosten.
Problem ist, man weiss nicht wieviele Pixel in der Zeile existieren, es können 4 sein aber es könnten auch 380 sein.
Das ziel ist es den Block von A nach B zu kopieren!! Am besten ohne schleifen, was aber nicht geht aber man könnte die Schleifendurchlaeufe reduzieren auf ein minimum.

Wie kann ich am besten den Pointer recasten? So das ich quasi anstatt einem word ein Langword kopiere ? Weil das kann der Core sehr schnell.. Aber dazu muss ich die Pointer auf die Adressen recasten.. aber irgendwie will das nicht in meinen Kopf rein. brrrrr

Thorsten Otto:
In deinem Beispeil (für die innere Schleife, die innerhalb der Zeile kopiert), in etwa so:


--- Code: ---if (w >= 4)
{
    long *dst_addrl = (long *)dst_addr;
    long *src_addrl = (long *)src_addr;
    for (j = w / 2 - 1; j >= 0; j--)
        *dst_addrl++ = *src_addrl++;
}

--- Ende Code ---

ohne hier jetzt die Sonderfälle zu berücksichtigen wenn die Anzahl ungerade ist.

Chocco:
for-Schleifen sind immer etwas tricky. Am besten nimmt man wohl eine while-Schleife, bei der auf >0 getestet wird. Im Compiler Explorer wird aus:


--- Code: ---    j = w;
    while( j-- ) {
        *dst_addr++ = *src_addr++;
    }

--- Ende Code ---

Die in meinen Augen schnellste Variante:


--- Code: ---L9:
        movew a1@+,a0@+
        dbra d0,L9

--- Ende Code ---

Thorsten Otto:
Dein Beispiel ist das gleiche wie

--- Code: ---for (j = w; j--; )...
--- Ende Code ---
Es hat nichts mit for/while zu tun, sondern lediglich wie die Ende-Bedingung aussieht. Und auch ob innnerhalb der Schleife nur ein move gemacht wird, oder mehrere:


--- Code: ---void test(char *dst, char *src, unsigned short n)
{
    short i;

    for (i = n - 1; i >= 0; i--)
        *dst++ = *src++;
}

--- Ende Code ---
erzeugt
--- Code: ---.L3:
        move.b (%a0)+,(%a1)+
        dbra %d0,.L3

--- Ende Code ---
(siehe http://brownbot.mooo.com/z/V4E4wk).

Aber
--- Code: ---void test(short *dst, short *src, unsigned short n)
{
    short i;

    for (i = n - 1; i >= 0; i--)
    {
        *dst++ = *src++;
        *dst++ = *src++;
    }
}

--- Ende Code ---
benutzt x(a0) anstatt post-increment (siehe http://brownbot.mooo.com/z/qTe-ge)

Navigation

[0] Themen-Index

[#] Nächste Seite

[*] Vorherige Sete

Zur normalen Ansicht wechseln