C++Guns – RoboBlog

05.08.2018

C++ Guns: Assembler RMW (Read Modify Write) instructions

Filed under: Allgemein — Tags: — Thomas @ 16:08

Bin Heute über diesen GCC Bugfix gestolpert GCC 8 stopped using RMW (Read Modify Write) instructions on x86. Es gibt also Assembler Instruktionen die in einem Zug einen Wert laden, den Wert ändern, und ihn wieder zurück schreiben. Dabei spielt es keine Rolle, ob dabei erst noch ein Pointer dereferenziert werden muss, oder die Variable per Referenz an die Funktion übergeben wird.

Im Link ist auch ein kleines Beispiel enthalten, welches ich noch weiter vereinfacht habe:

void f(void);

void h(int& x) {
    if(!--x) 
}      

Mit g++ -O1 -fpeephole2 (alle außer Version 8.1, welcher ja den BUG enthält) enthält man folgenden optimierten Assembler Code:

h(int&):
        subl    $1, (%rdi)
        je      .L14
        ret
.L14:
        call    f()
        ret

Wichtig ist die erste Zeile. Hier wird 1 minus der Wert auf welchen die Referenz zeigt gerechnet und das Ergebnis zurück geschrieben. Das ist also eine RMW Instruktion. Ohne peephole Optimierung sieht der erzeugte Code wie folgt aus:

h(int&):
        movl    (%rdi), %eax
        subl    $1, %eax
        movl    %eax, (%rdi)
        je      .L14
        ret
.L14:
        call    f()
        ret

Hier werden die Schritte einzeln mit je einer Assembler Anweisung abgearbeitet. Es gibt wohl etliche dieser peephole Optimierungen. Bei denen wird immer nur ein kurzer Codeabschnitt analysiert und durch einen effizienteren ersetzt.

No Comments

No comments yet.

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.

Powered by WordPress