{"id":3639,"date":"2018-08-05T16:35:34","date_gmt":"2018-08-05T15:35:34","guid":{"rendered":"http:\/\/roboblog.fatal-fury.de\/?p=3639"},"modified":"2018-08-05T16:35:34","modified_gmt":"2018-08-05T15:35:34","slug":"c-guns-assembler-rmw-read-modify-write-instructions","status":"publish","type":"post","link":"http:\/\/roboblog.fatal-fury.de\/?p=3639","title":{"rendered":"C++ Guns: Assembler RMW (Read Modify Write) instructions"},"content":{"rendered":"<p>Bin Heute \u00fcber diesen GCC Bugfix gestolpert <a href=\"https:\/\/gcc.gnu.org\/bugzilla\/show_bug.cgi?id=85683\"> GCC 8 stopped using RMW (Read Modify Write) instructions on x86<\/a>. Es gibt also Assembler Instruktionen die in einem Zug einen Wert laden, den Wert \u00e4ndern, und ihn wieder zur\u00fcck schreiben. Dabei spielt es keine Rolle, ob dabei erst noch ein Pointer dereferenziert werden muss, oder die Variable per Referenz an die Funktion \u00fcbergeben wird.<\/p>\n<p>Im Link ist auch ein kleines Beispiel enthalten, welches ich noch weiter vereinfacht habe:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nvoid f(void);\r\n\r\nvoid h(int&amp; x) {\r\n    if(!--x) \r\n}      \r\n<\/pre>\n<p>Mit g++ -O1 -fpeephole2 (alle au\u00dfer Version 8.1, welcher ja den BUG enth\u00e4lt) enth\u00e4lt man folgenden optimierten Assembler Code:<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nh(int&amp;):\r\n        subl    $1, (%rdi)\r\n        je      .L14\r\n        ret\r\n.L14:\r\n        call    f()\r\n        ret\r\n<\/pre>\n<p>Wichtig ist die erste Zeile. Hier wird 1 minus der Wert auf welchen die Referenz zeigt gerechnet und das Ergebnis zur\u00fcck geschrieben. Das ist also eine RMW Instruktion. Ohne peephole Optimierung sieht der erzeugte Code wie folgt aus:<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nh(int&amp;):\r\n        movl    (%rdi), %eax\r\n        subl    $1, %eax\r\n        movl    %eax, (%rdi)\r\n        je      .L14\r\n        ret\r\n.L14:\r\n        call    f()\r\n        ret\r\n<\/pre>\n<p>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.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bin Heute \u00fcber 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 \u00e4ndern, und ihn wieder zur\u00fcck schreiben. Dabei spielt es keine Rolle, ob dabei erst noch ein Pointer dereferenziert werden muss, oder die Variable [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[17],"class_list":["post-3639","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-cpp"],"_links":{"self":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3639","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3639"}],"version-history":[{"count":2,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3639\/revisions"}],"predecessor-version":[{"id":3641,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3639\/revisions\/3641"}],"wp:attachment":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3639"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3639"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3639"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}