Signierte gesättigte Addition von 64-Bit-Ints?

8

Ich suche nach einem C-Code für eine vorzeichenbehaftete gesättigte 64-Bit-Addition, die mit dem gcc-Optimierer zu effizientem X86-64-Code kompiliert. Portabler Code wäre ideal, obwohl bei Bedarf eine asm-Lösung verwendet werden könnte.

%Vor%

Die Funktion wie geschrieben erzeugt eine ziemlich lange Assembly-Ausgabe mit mehreren Verzweigungen. Irgendwelche Tipps zur Optimierung? Scheint so, als ob es mit nur ein ADD mit ein paar CMOV Anweisungen implementiert werden könnte, aber ich bin ein wenig eingerostet mit diesem Zeug.

    
drwowe 10.07.2013, 20:16
quelle

3 Antworten

9

Dies kann weiter optimiert werden, aber hier ist eine portable Lösung. Es ruft kein undefiniertes Verhalten auf und es wird vor dem Auftreten eines Integer-Überlaufs gesucht.

%Vor%     
ouah 10.07.2013 22:57
quelle
3

Dies ist eine Lösung, die in der Art und Weise fortgesetzt wird, die in einem der Kommentare angegeben wurde, und wurde auch in Ouahs Lösung verwendet. hier sollte der generierte Code ohne bedingte Sprünge sein

%Vor%

Der erste sieht so aus, als würde es eine bedingte Bewegung geben, aber wegen der speziellen Werte kommt mein Compiler mit einem Zusatz davon: im 2er-Komplement ist INT64_MIN INT64_MAX+1 . Es gibt dann nur einen bedingten Zug für die Zuweisung der Summe, falls etwas in Ordnung ist.

All dies hat kein UB, weil in der abstrakten Zustandsmaschine die Summe nur dann erfolgt, wenn kein Überlauf vorliegt.

    
Jens Gustedt 11.07.2013 07:13
quelle
1

Ich suche immer noch nach einer anständigen portablen Lösung, aber das ist so gut, wie ich es bisher gemacht habe:

Vorschläge für Verbesserungen?

%Vor%     
drwowe 10.07.2013 21:24
quelle

Tags und Links