Zitat Zitat von ogni42
aber: Nach dem Aufruf von muls steht in r1 das Ergebnis der Operation und wird ja auch so in saturate16 verwendet. Ist dann das r1=0 nicht irreführend?
In C sähe das ja so aus:
Code:
foo_t fmul (foo_t a, foo_t b)
{
    r1_r0 = a*b;
    v = (|a*b| > 1); // oder so
    saturate16 ();
    return r27_r26;
}

// Inputs: r1_r0 und Overflow (v-Flag)
void saturate16 (void)
{
    r27_r26 = sat16 (r0_r1, v);
    r1 = 0;
}
saturate16 saturiert also nicht nur, sondern löscht zusätzlich r1. Dadurch entfällt das clr r1 im inline asm (wird kürzer) und daher der Kommentar r1=0 an saturate 16.

BTW: Wieso kann die Multiplikation überhaupt überlaufen?

Wie ist da überhaupt die Darstellung der Fraction? Im Komplement oder als sign(a) : abs (a) ? Vermutlich ersteres, sonst wäre Strichrechnung ja recht aufwändig...