[XviD-devel] Re: Don't do " signed /= unsigned "

Felix von Leitner xvid-devel@xvid.org
Sun, 19 Jan 2003 04:47:27 +0100


Thus spake Christoph Lampert (chl@math.uni-bonn.de):
> dx /= (1+quarterpel)

> and this gives me wrong results if dx is signed int (which it is)
> and quarterpel is unsigned (which I declared that way, since it's a 0 or 
> 1 flag). Division is then done unsigned!

Na das klingt aber wie eine sehr dumme Idee.  Eine Integer-Division ist
so das langsamste, was man auf heutigen Prozessoren tun kann.  Auf
meinem C3 kostet es z.B. 42 (!) Zyklen, ein falsch vorhergesagter Sprung
kostet "nur" 12 Zyklen.

Wenn hier eh nur durch 1 oder 2 geteilt wird, dann doch lieber

  dx >>= quarterpel

oder so.  Das kostet auf aktuellen CPUs 1 Takt und hat keinen Sprung
drin.

> if (quarterpel) dx/=2;

> which works flawlessly with unsigned quarterpel, too.

Auf einem C3 kostet auch ein richtig vorhergesagter Sprung bis zu 5
Taktzyklen.  Ich biete an, den xvid-Code nach solchen Fallen abzusuchen,
aber dazu brauche ich Kommentare im Quellcode, der zu globalen Variablen
und Funktionsargumenten auch den Wertebereich und das Alignment ansagen,
wenn möglich nicht nur maximal sondern auch die wahrscheinlichen Werte.

Außerdem kann man bei C99 Kompilern auch mit restrict und expect echt
was reißen.  Gibt es einen schönen Benchmark-Korpus, welche Funktion wie
häufig aufgerufen wird und so?  Oder muß ich mir das selber machen mit
mplayer?

Felix