Betragsbildung, Multiplikation, Addition -> Dauer



  • Man wird wohl noch prüfen, ob die Zahl wirklich negativ ist. Letztendlich müsste der Compiler aber erkennen, dass du den Betrag haben willst, um die richtige Befehlsfolge zu bilden. Es sollte aber auch nicht so schwierig den C-Code zu evaluieren. Der Test auf kleiner Null sollte identisch sein. Es ist also nur wichtig den Faktor richtig zu interpretieren. Und da hab ich bei modernen Compilern eigentlich keine Zweifel.



  • Paul Müller schrieb:

    Man wird wohl noch prüfen, ob die Zahl wirklich negativ ist. Letztendlich müsste der Compiler aber erkennen, dass du den Betrag haben willst, um die richtige Befehlsfolge zu bilden. Es sollte aber auch nicht so schwierig den C-Code zu evaluieren. Der Test auf kleiner Null sollte identisch sein. Es ist also nur wichtig den Faktor richtig zu interpretieren. Und da hab ich bei modernen Compilern eigentlich keine Zweifel.

    Klar erkennt der das. Ich hab' jetzt nur M16C angeguckt, da sind's nur zwei Befehle:

    jpz    over  ;jump on plus or zero
            neg.w  R0    ;2s complement
    over:
                         ; continue with sth. else
    

    Ganz so deterministisch kann man das trotzdem nicht sehen, weil ich nicht weiß, ob für den Compiler R0 jetzt wirklich das wichtigste ist, vllt. mag er da lieber einen Schleifenzähler unterbringen, auf jeden Fall ist vorher ein move nötig, Umladen kostet unglaublich Zeit. Im Kern sind's aber nur zwei Befehle.
    Weitere Unwägbarkeiten sind momentaner Stand der Pipes und was evtl. eine Branch Prediction machen würde. Das Odd/Even- Alignment spielt ggf. auch eine große Rolle.
    Die Handreichung von Renesas für's branchen lautet:

    2 cycles. If branched to label, the number of cycles above is increased by 2

    Für das Komplement braucht die Registeradressierung nur 1 Cycle, bei indirekt- indiziert sind's 3 Cycles.
    Aber was der Compiler hernimmt, ist schwer zu sagen, i.A. ist jedoch Optimierung von Hand nicht nötig.


Anmelden zum Antworten