{"id":3468,"date":"2018-05-10T17:21:57","date_gmt":"2018-05-10T16:21:57","guid":{"rendered":"http:\/\/roboblog.fatal-fury.de\/?p=3468"},"modified":"2018-05-10T17:21:57","modified_gmt":"2018-05-10T16:21:57","slug":"c-guns-schlecht-generiertes-assember-von-pascal-code","status":"publish","type":"post","link":"http:\/\/roboblog.fatal-fury.de\/?p=3468","title":{"rendered":"C++ Guns: schlecht generiertes Assember von Pascal Code"},"content":{"rendered":"<p>Das selbe Beispiel nochmal mit Pascal Code. F\u00fcr ein halbwegs vern\u00fcnftiges Ergebnis musste ich Optimierung O2 ausw\u00e4hlen und von Hand inline einschalten. Dead Code elimination funktioniert nicht. Die wesentliche Subroutine hat f\u00fcnf Subtraktionen, zwei Multiplikationen, elf MOVs, ein LEA und der Stack wird genutzt. Auch zum \u00fcbergeben der Funktionsparameter. Zur Erinnerung: Wir brauchen f\u00fcnf Subtraktionen, zwei Multiplikationen und vier explizite Kopier-Befehle (MOV) in C++.<br \/>\nBesser wird es nicht.<\/p>\n<pre class=\"brush: delphi; title: ; notranslate\" title=\"\">\r\nunit output;\r\ninterface\r\nimplementation\r\n\r\ntype\r\n  Point2D = record\r\n    x: double;\r\n    y: double;\r\n  end;\r\n\r\ntype \r\n  Line2D = record\r\n    pt1: Point2D;\r\n    pt2: Point2D;\r\n  end;\r\n\r\nOperator -(p1: Point2D; p2: Point2D) res: Point2D inline ;  \r\nbegin  \r\n  res.x := p1.x-p2.x;  \r\n  res.y := p1.y-p2.y;  \r\nend; \r\n\r\n  function func(line1: Line2D; line2: Line2D) : double;\r\nvar   \r\n    denominator: double; \r\n    a: Point2D;\r\n    b: Point2D;\r\nbegin\r\n    a := line1.pt2 - line1.pt1;\r\n    b := line2.pt1 - line2.pt2;\r\n    denominator := a.y * b.x - a.x * b.y;\r\n    exit(denominator)\r\nend;\r\n  \r\nend.\r\n<\/pre>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n\r\nfunc(line2d,line2d):\r\n  pushq %rbp\r\n  movq %rsp,%rbp\r\n  leaq -48(%rsp),%rsp\r\n  movsd 32(%rbp),%xmm0\r\n  subsd 16(%rbp),%xmm0\r\n  movsd %xmm0,-16(%rbp)\r\n  movsd 40(%rbp),%xmm0\r\n  subsd 24(%rbp),%xmm0\r\n  movsd %xmm0,-8(%rbp)\r\n  movsd 48(%rbp),%xmm0\r\n  subsd 64(%rbp),%xmm0\r\n  movsd %xmm0,-32(%rbp)\r\n  movsd 56(%rbp),%xmm0\r\n  subsd 72(%rbp),%xmm0\r\n  movsd %xmm0,-24(%rbp)\r\n  movsd -8(%rbp),%xmm0\r\n  mulsd -32(%rbp),%xmm0\r\n  movsd -16(%rbp),%xmm1\r\n  mulsd -24(%rbp),%xmm1\r\n  subsd %xmm1,%xmm0\r\n  leave\r\n  ret\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Das selbe Beispiel nochmal mit Pascal Code. F\u00fcr ein halbwegs vern\u00fcnftiges Ergebnis musste ich Optimierung O2 ausw\u00e4hlen und von Hand inline einschalten. Dead Code elimination funktioniert nicht. Die wesentliche Subroutine hat f\u00fcnf Subtraktionen, zwei Multiplikationen, elf MOVs, ein LEA und der Stack wird genutzt. Auch zum \u00fcbergeben der Funktionsparameter. Zur Erinnerung: Wir brauchen f\u00fcnf Subtraktionen, [&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-3468","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\/3468","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=3468"}],"version-history":[{"count":2,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3468\/revisions"}],"predecessor-version":[{"id":3470,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=\/wp\/v2\/posts\/3468\/revisions\/3470"}],"wp:attachment":[{"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3468"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3468"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/roboblog.fatal-fury.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3468"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}