<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: JP </title>
    <description>The latest articles on DEV Community by JP  (@jpjpjp).</description>
    <link>https://dev.to/jpjpjp</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F313834%2F8fbce9ea-e24b-4c3b-87ec-ecb03ef4a18b.png</url>
      <title>DEV Community: JP </title>
      <link>https://dev.to/jpjpjp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jpjpjp"/>
    <language>en</language>
    <item>
      <title>SPO600 Project Stage 3: Wrapping it Up</title>
      <dc:creator>JP </dc:creator>
      <pubDate>Thu, 17 Apr 2025 18:43:21 +0000</pubDate>
      <link>https://dev.to/jpjpjp/spo600-project-stage-3-wrapping-it-up-2422</link>
      <guid>https://dev.to/jpjpjp/spo600-project-stage-3-wrapping-it-up-2422</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Welcome back! These are the goals for the final installment of the SPO600 Project:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The pass must identify 2+ versions of a cloned function.&lt;/li&gt;
&lt;li&gt;Create a test case that provides a “PRUNE” or “NO PRUNE” recommendation.&lt;/li&gt;
&lt;li&gt;Refactor and clean up the Stage 2 implementation.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Note: here’s the &lt;a href="https://github.com/JP-sDEV/spo600-stage-2-3" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt; containing the test cases for and stage 3 implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding Multiple Function Versions of a Cloned Function
&lt;/h2&gt;

&lt;p&gt;The current implementation has access to all variants via call graph but only records the “fingerprint” of a single variant.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ~/gccsrc/gcc/gcc/tree-prune-clones.cc&lt;/span&gt;

&lt;span class="p"&gt;...&lt;/span&gt;

&lt;span class="c1"&gt;// Compare variable reference maps&lt;/span&gt;
&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;orig_map_iter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_var_map_1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;clone_map_iter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_var_map_2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;

&lt;span class="nf"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orig_map_iter&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;gimple_var_map_1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orig_map_iter&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;clone_map_iter&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;orig_map_iter&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;second&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;clone_map_iter&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;second&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;orig_map_iter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;clone_map_iter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Creating a Function “Fingerprint”
&lt;/h3&gt;

&lt;p&gt;A fingerprint is unique to each person and can be used to identify a person. It can work in a similar way for functions, where the number of basic blocks, statements, and operations can identify the structure of a variant. &lt;/p&gt;

&lt;p&gt;This approach must be approached with caution, as there is an increased risk of false positives for both “PRUNE” and “NO PRUNE” cases (Spoiler: I ran into that issue during refactoring).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ~/gccsrc/gcc/gcc/tree-prune-clones.cc&lt;/span&gt;
&lt;span class="k"&gt;namespace&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;

 &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;FunctionFingerPrint&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;bb_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;stmt_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="n"&gt;gimple_code&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;gimple_ops&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ops_count&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="n"&gt;tree_code&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;op_types&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;mapped_ids&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="p"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Recording a Function “Fingerprint”
&lt;/h3&gt;

&lt;p&gt;Multiple variants can be stored in a &lt;code&gt;map&lt;/code&gt; data structure where the variant name is the key and the function “Fingerprint” is the corresponding value.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ~/gccsrc/gcc/gcc/tree-prune-clones.cc&lt;/span&gt;
&lt;span class="k"&gt;namespace&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="p"&gt;...&lt;/span&gt;

 &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;pass_prune_clones&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;gimple_opt_pass&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;public:&lt;/span&gt;
        &lt;span class="n"&gt;pass_prune_clones&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gcc&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ctxt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;gimple_opt_pass&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="n"&gt;GIMPLE_PASS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                               &lt;span class="s"&gt;"prune_clones"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                               &lt;span class="n"&gt;OPTGROUP_NONE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                               &lt;span class="n"&gt;TV_NONE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                               &lt;span class="n"&gt;PROP_cfg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                               &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
                              &lt;span class="n"&gt;ctxt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

        &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;get_base&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FunctionFingerPrint&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;fingerprints&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="p"&gt;...&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Recording the function stays the same from stage 2, but refactored into a &lt;code&gt;GimpleVarMapper&lt;/code&gt; class.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ~/gccsrc/gcc/gcc/tree-prune-clones.cc&lt;/span&gt;
&lt;span class="k"&gt;namespace&lt;/span&gt; 
&lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="p"&gt;...&lt;/span&gt;

    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GimpleVarMapper&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;public:&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;getGimpleVars&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;resolver_map&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gimple&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;compare_map&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;gimple_vars&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gimple_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;GIMPLE_ASSIGN&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="n"&gt;lhs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_assign_lhs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="n"&gt;gimple_vars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lhs&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;rhs_ops&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_num_ops&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;rhs_ops&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                    &lt;span class="n"&gt;gimple_vars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gimple_op&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;GIMPLE_DEBUG_BIND&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_debug_bind_get_var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                    &lt;span class="n"&gt;gimple_vars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_debug_bind_get_value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                    &lt;span class="n"&gt;gimple_vars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;GIMPLE_COND&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="n"&gt;lhs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_cond_lhs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                    &lt;span class="n"&gt;gimple_vars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lhs&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="n"&gt;rhs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_cond_rhs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                    &lt;span class="n"&gt;gimple_vars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rhs&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;GIMPLE_CALL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="n"&gt;lhs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_call_lhs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                    &lt;span class="n"&gt;gimple_vars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lhs&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;gimple_vars&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resolver_map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;resolver_map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;compare_map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resolver_map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="k"&gt;else&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;resolver_map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                    &lt;span class="n"&gt;compare_map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="p"&gt;...&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the base function is recorded, the variants are fingerprinted and compared to the base function’s fingerprint. A boolean value is returned, corresponding to a “PRUNE” or “NO PRUNE” recommendation made in &lt;code&gt;pass_prune_clones::execute&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ~/gccsrc/gcc/gcc/tree-prune-clones.cc&lt;/span&gt;
&lt;span class="k"&gt;namespace&lt;/span&gt; 
&lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="p"&gt;...&lt;/span&gt;

    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CloneComparator&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;public:&lt;/span&gt;
        &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;compare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;FunctionFingerPrint&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;resolver_map&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;FunctionFingerPrint&lt;/span&gt; &lt;span class="n"&gt;curr_fingerprint&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;curr_resolver_map&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;curr_ids&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="n"&gt;basic_block&lt;/span&gt; &lt;span class="n"&gt;bb&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;FOR_EACH_BB_FN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;curr_fingerprint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bb_count&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gimple_stmt_iterator&lt;/span&gt; &lt;span class="n"&gt;gsi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gsi_start_bb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bb&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;gsi_end_p&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;gsi_next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gsi&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;curr_fingerprint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stmt_count&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;curr_fingerprint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bb_count&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;resolver_map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bb_count&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;curr_fingerprint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stmt_count&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;resolver_map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stmt_count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;gop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resolver_map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gimple_ops&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;opc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resolver_map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ops_count&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;ot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resolver_map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;op_types&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

            &lt;span class="n"&gt;GimpleVarMapper&lt;/span&gt; &lt;span class="n"&gt;varMapper&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="n"&gt;FOR_EACH_BB_FN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gimple_stmt_iterator&lt;/span&gt; &lt;span class="n"&gt;gsi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gsi_start_bb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bb&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;gsi_end_p&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;gsi_next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gsi&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;gimple&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gsi_stmt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                    &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;varMapper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getGimpleVars&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;curr_resolver_map&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;curr_ids&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

                    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gimple_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;gop&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;gimple_num_ops&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;opc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

                    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;gop&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;GIMPLE_ASSIGN&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ot&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;gimple_assign_rhs_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

                    &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;gop&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                    &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;opc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;resolver_map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mapped_ids&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;curr_ids&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="p"&gt;...&lt;/span&gt;

 &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;pass_prune_clones&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;gimple_opt_pass&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;pass_prune_clones&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
                 &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;CloneComparator&lt;/span&gt; &lt;span class="n"&gt;comparator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;comparator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resolver_map&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                    &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="n"&gt;fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dump_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"[ PRUNE ]: %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c_str&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
                    &lt;span class="p"&gt;}&lt;/span&gt;
                    &lt;span class="k"&gt;else&lt;/span&gt;
                    &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="n"&gt;fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dump_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"[ NO PRUNE ]: %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c_str&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
                    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ta-da! The pass now has the ability to make a “PRUNE” or “NO PRUNE” recommendation on each variant. We’ll confirm the functionality in the “Results” section.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test Cases
&lt;/h2&gt;

&lt;p&gt;One of the new tests was inspired by the original test case provided by Chris Tyler - where it uses a “for” loop to scale an &lt;code&gt;int16&lt;/code&gt; value and converts it into an &lt;code&gt;int32&lt;/code&gt; value then back to &lt;code&gt;int16&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="c1"&gt;//~/spo600/examples/test-clone/clone-test-core.c&lt;/span&gt;

&lt;span class="c1"&gt;// Original&lt;/span&gt;
&lt;span class="n"&gt;CLONE_ATTRIBUTE&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;scale_samples&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int16_t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int16_t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;cnt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;volume&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;cnt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;((((&lt;/span&gt;&lt;span class="kt"&gt;int32_t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="kt"&gt;int32_t&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="mi"&gt;32767&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;volume&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Unrolling 4 Units
&lt;/h3&gt;

&lt;p&gt;This test was inspired by one of the 6502 optimization techniques - loop unrolling. This test combines both vectorization and arithmetic test cases.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Slightly modified - unrolling 4 units&lt;/span&gt;
&lt;span class="n"&gt;CLONE_ATTRIBUTE&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;scale_samples_alt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int16_t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int16_t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;cnt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;volume&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int32_t&lt;/span&gt; &lt;span class="n"&gt;factor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="kt"&gt;int32_t&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="mi"&gt;32767&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;volume&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;cnt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;cnt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(((&lt;/span&gt;&lt;span class="kt"&gt;int32_t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;factor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The original test case used a “for” loop, processing a single unit at a time. With unrolling, it processes a “packet” of 4 units at a time. It accomplishes the same task but as seen in 6502, unrolling reduces the number of branches and loop counters.&lt;/p&gt;

&lt;p&gt;This structural difference makes the function more focused on vectorization, and it’s likely to be preserved by clone detection as a unique variant, rather than pruned.&lt;/p&gt;

&lt;h3&gt;
  
  
  Arithmetic Operation
&lt;/h3&gt;

&lt;p&gt;This test case is rather simple, where 2 &lt;code&gt;int&lt;/code&gt; values are added via pointers.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Scaler operation&lt;/span&gt;
&lt;span class="n"&gt;CLONE_ATTRIBUTE&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;scalar_op&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This test can be considered a baseline to verify whether the pruning pass can distinguish between simple scalar operations and more complex, vectorizable variants like the previous case.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performing the Tests
&lt;/h2&gt;

&lt;p&gt;The directory with the original test was cloned:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;cd ~/spo600/examples&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cp -r ./test-clone ./test-clone-2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Insert the test cases in &lt;code&gt;clone-test-core.c&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ~/spo600/examples/test-clone-2/clone-test-core.c&lt;/span&gt;

&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdint.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdbool.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"vol.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;sum_sample&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int16_t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;buff&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;samples&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;samples&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;buff&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Original&lt;/span&gt;
&lt;span class="n"&gt;CLONE_ATTRIBUTE&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;scale_samples&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int16_t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int16_t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;cnt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;volume&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;cnt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;((((&lt;/span&gt;&lt;span class="kt"&gt;int32_t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="kt"&gt;int32_t&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="mi"&gt;32767&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;volume&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="err"&gt;*/&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;Slightly&lt;/span&gt; &lt;span class="n"&gt;modified&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;unrolling&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="n"&gt;units&lt;/span&gt;
&lt;span class="n"&gt;CLONE_ATTRIBUTE&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;scale_samples_alt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int16_t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int16_t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;cnt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;volume&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int32_t&lt;/span&gt; &lt;span class="n"&gt;factor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="kt"&gt;int32_t&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="mi"&gt;32767&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;volume&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;cnt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;cnt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(((&lt;/span&gt;&lt;span class="kt"&gt;int32_t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;factor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Scaler operation&lt;/span&gt;
&lt;span class="n"&gt;CLONE_ATTRIBUTE&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;scalar_op&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int16_t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int16_t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;calloc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SAMPLES&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int16_t&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="kt"&gt;int16_t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int16_t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;calloc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SAMPLES&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int16_t&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;vol_createsample&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SAMPLES&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argc&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sc"&gt;'a'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;scale_samples_alt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SAMPLES&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;VOLUME&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;scalar_op&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;scale_samples&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SAMPLES&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;VOLUME&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;scalar_op&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;ttl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sum_sample&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SAMPLES&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Result: %d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ttl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;free&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;free&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Uncomment &lt;code&gt;DUMP_ALL = 1&lt;/code&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use the built gcc with the &lt;code&gt;prune_clones&lt;/code&gt; pass&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;PATH="$HOME/gcc-test-002/bin:$PATH"&lt;/code&gt;

&lt;ol&gt;
&lt;li&gt;Note: use your gcc directory&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Run command &lt;code&gt;make all&lt;/code&gt; to generate the dump files&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Contains the “PRUNE” or “NO PRUNE” log.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;p&gt;And the results!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;// x86

japablo@x86-001:~/spo600/examples/test-clone-2&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"PRUNE"&lt;/span&gt; clone-test-x86-&lt;span class="k"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;**&lt;/span&gt;clone-test-x86-noprune-clone-test-core.c.264t.prune_clones:[ PRUNE &lt;span class="o"&gt;]&lt;/span&gt;: scalar_op.arch_x86_64_v3
clone-test-x86-noprune-clone-test-core.c.264t.prune_clones:[ PRUNE &lt;span class="o"&gt;]&lt;/span&gt;: scale_samples_alt.arch_x86_64_v3&lt;span class="k"&gt;**&lt;/span&gt;
clone-test-x86-noprune-clone-test-core.c.264t.prune_clones:[ NO PRUNE &lt;span class="o"&gt;]&lt;/span&gt;: scale_samples.arch_x86_64_v3
clone-test-x86-prune-clone-test-core.c.264t.prune_clones:[ PRUNE &lt;span class="o"&gt;]&lt;/span&gt;: scalar_op.popcnt
clone-test-x86-prune-clone-test-core.c.264t.prune_clones:[ PRUNE &lt;span class="o"&gt;]&lt;/span&gt;: scale_samples_alt.popcnt
clone-test-x86-prune-clone-test-core.c.264t.prune_clones:[ PRUNE &lt;span class="o"&gt;]&lt;/span&gt;: scale_samples.popcnt

// aarch64
&lt;span class="o"&gt;[&lt;/span&gt;japablo@aarch64-002 test-clone]&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"PRUNE"&lt;/span&gt; clone-test-aarch64-&lt;span class="k"&gt;*&lt;/span&gt;
clone-test-aarch64-noprune-clone-test-core.c.264t.prune_clones:[ PRUNE &lt;span class="o"&gt;]&lt;/span&gt;: scalar_op.sve2
clone-test-aarch64-noprune-clone-test-core.c.264t.prune_clones:[ PRUNE &lt;span class="o"&gt;]&lt;/span&gt;: scalar_op.fp
&lt;span class="k"&gt;**&lt;/span&gt;clone-test-aarch64-noprune-clone-test-core.c.264t.prune_clones:[ NO PRUNE &lt;span class="o"&gt;]&lt;/span&gt;: scale_samples_alt.sve2&lt;span class="k"&gt;**&lt;/span&gt;
clone-test-aarch64-noprune-clone-test-core.c.264t.prune_clones:[ PRUNE &lt;span class="o"&gt;]&lt;/span&gt;: scale_samples_alt.fp
clone-test-aarch64-noprune-clone-test-core.c.264t.prune_clones:[ NO PRUNE &lt;span class="o"&gt;]&lt;/span&gt;: scale_samples.sve2
clone-test-aarch64-noprune-clone-test-core.c.264t.prune_clones:[ PRUNE &lt;span class="o"&gt;]&lt;/span&gt;: scale_samples.fp
clone-test-aarch64-prune-clone-test-core.c.264t.prune_clones:[ PRUNE &lt;span class="o"&gt;]&lt;/span&gt;: scalar_op.sve2
clone-test-aarch64-prune-clone-test-core.c.264t.prune_clones:[ PRUNE &lt;span class="o"&gt;]&lt;/span&gt;: scalar_op.fp
clone-test-aarch64-prune-clone-test-core.c.264t.prune_clones:[ NO PRUNE &lt;span class="o"&gt;]&lt;/span&gt;: scale_samples_alt.sve2
clone-test-aarch64-prune-clone-test-core.c.264t.prune_clones:[ PRUNE &lt;span class="o"&gt;]&lt;/span&gt;: scale_samples_alt.fp
clone-test-aarch64-prune-clone-test-core.c.264t.prune_clones:[ NO PRUNE &lt;span class="o"&gt;]&lt;/span&gt;: scale_samples.sve2
clone-test-aarch64-prune-clone-test-core.c.264t.prune_clones:[ PRUNE &lt;span class="o"&gt;]&lt;/span&gt;: scale_samples.fp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: I added &lt;code&gt;sve2&lt;/code&gt; and &lt;code&gt;fp&lt;/code&gt; when compiling in &lt;code&gt;aarch64&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Discussion
&lt;/h3&gt;

&lt;p&gt;Looking at the results, there are some false positives, where it recommends “PRUNE” when it should not, and false negatives, where it recommends “NO PRUNE” when it should. This can be attributed to the level of specificity in how a function is fingerprinted. &lt;/p&gt;

&lt;p&gt;When refactoring, I tried normalizing SSA names and expressions, but the implementation ended up being too aggressive—treating variables with different origins, like parameters, constants, or intermediate results, as the same. That led to a higher false positive rate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1.Assumption of Same Control Flow for Comparison
&lt;/h3&gt;

&lt;p&gt;The fingerprint comparison assumes that the control flow structure (basic blocks, statements) of the functions will be identical if they are clones. However, optimizations like reordering of basic blocks or merging of identical blocks could cause differences in control flow that don't impact the semantic behavior of the program. This could lead to false negatives where a valid clone is not pruned.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Hard-Coded Assumptions in Function Name Processing
&lt;/h3&gt;

&lt;p&gt;The code assumes that the function name always contains a ".resolver" suffix to indicate whether a function is a resolver. This is a somewhat brittle approach, as the naming conventions could change, leading to incorrect behavior. Additionally, the method for extracting the base function name from the full name (&lt;code&gt;name.substr(0, name.find("."))&lt;/code&gt;) may fail in edge cases, such as when function names multiple dots.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Potential for Incorrect Handling of Debugging Information
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;GIMPLE_DEBUG_BIND&lt;/code&gt; operation is considered during SSA variable resolution, but debugging information may not always be included in actual program behavior, leading to the inclusion of irrelevant variables during the comparison. This could affect the accuracy of the pruning process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Overall, this project was challenging—not just in theory, but especially in practice. Actually coding, testing each idea, and going through countless GCC builds taught me way more than just reading about it ever could. While the implementation isn’t perfect, it’s something I never would’ve attempted—or even understood—just four months ago. I had zero knowledge of this back then, so I’m really proud I was able to get it done!&lt;/p&gt;

</description>
      <category>spo600</category>
      <category>gcc</category>
    </item>
    <item>
      <title>SPO600 Project Stage 2, Part 3: “Prune Away!”</title>
      <dc:creator>JP </dc:creator>
      <pubDate>Sun, 06 Apr 2025 03:16:51 +0000</pubDate>
      <link>https://dev.to/jpjpjp/project-stage-2-part-3-prune-away-23g0</link>
      <guid>https://dev.to/jpjpjp/project-stage-2-part-3-prune-away-23g0</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Welcome back for the final part of stage 2, printing a “prune” suggestion in the dump file. Each function can be identified by its “fingerprint”, all we need to do is compare them and print a suggestion to prune or not. Let’s get started!&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparing Function Fingerprints
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ~/gccsrc/gcc/gcc/tree-prune-clones.cc&lt;/span&gt;

&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;base_function&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;gimple_bb_count_1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;gimple_stmt_count_1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="n"&gt;gimple_code&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;gimple_sequence_1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;gimple_ops_count_1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="n"&gt;tree_code&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;gimple_op_types_1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;gimple_var_map_1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;

&lt;span class="n"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;pass_prune_clones&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;compare_function_info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;bb_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;stmt_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;basic_block&lt;/span&gt; &lt;span class="n"&gt;bb&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;first_occurrence_map&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;gimple_var_map_2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;FOR_EACH_BB_FN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;bb_count&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gimple_stmt_iterator&lt;/span&gt; &lt;span class="n"&gt;gsi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gsi_start_bb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bb&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;gsi_end_p&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;gsi_next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gsi&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;stmt_count&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_gimple_vars&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_occurrence_map&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gsi_stmt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;gimple_var_map_2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bb_count&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;gimple_bb_count_1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dump_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"[DIFF] BB count: %d vs %d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;bb_count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gimple_bb_count_1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt_count&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;gimple_stmt_count_1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dump_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"[DIFF] Statement count: %d vs %d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;stmt_count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gimple_stmt_count_1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bb_count&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;gimple_bb_count_1&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;stmt_count&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;gimple_stmt_count_1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_sequence_1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;count_it&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_ops_count_1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;optype_it&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_op_types_1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="n"&gt;FOR_EACH_BB_FN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gimple_stmt_iterator&lt;/span&gt; &lt;span class="n"&gt;gsi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gsi_start_bb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bb&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;gsi_end_p&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;gsi_next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gsi&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gimple_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi_stmt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;gimple_num_ops&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi_stmt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;count_it&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;GIMPLE_ASSIGN&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;optype_it&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;gimple_assign_rhs_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi_stmt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;count_it&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Compare variable reference maps&lt;/span&gt;
    &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;orig_map_iter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_var_map_1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;clone_map_iter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_var_map_2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orig_map_iter&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;gimple_var_map_1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orig_map_iter&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;clone_map_iter&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;orig_map_iter&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;second&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;clone_map_iter&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;second&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;orig_map_iter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;clone_map_iter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; traverse every &lt;strong&gt;basic block&lt;/strong&gt; in the function using &lt;code&gt;FOR_EACH_BB_FN&lt;/code&gt;, and count:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The number of basic blocks (&lt;code&gt;bb_count&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;The number of statements (&lt;code&gt;stmt_count&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We also regenerate a &lt;strong&gt;variable usage map&lt;/strong&gt; (&lt;code&gt;gimple_var_map_2&lt;/code&gt;) by calling &lt;code&gt;get_gimple_vars(...)&lt;/code&gt; on each statement. This tracks &lt;strong&gt;how and where each variable is used&lt;/strong&gt;, without caring about their actual names.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; Compare Block &amp;amp; Statement Counts&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bb_count&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;gimple_bb_count_1&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;stmt_count&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;gimple_stmt_count_1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Before diving into deep comparison, we check if the raw &lt;strong&gt;shape&lt;/strong&gt; of the functions match:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Same number of basic blocks?&lt;/li&gt;
&lt;li&gt;Same number of GIMPLE statements?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If these are different, we conclude early — the functions are structured differently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3.&lt;/strong&gt;  Compare GIMPLE Statement Patterns&lt;/p&gt;

&lt;p&gt;We iterate through each basic block and each GIMPLE statement, comparing the overall structure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;type&lt;/strong&gt; of GIMPLE statement (e.g., &lt;code&gt;GIMPLE_ASSIGN&lt;/code&gt;, &lt;code&gt;GIMPLE_CALL&lt;/code&gt;, etc.)&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;number of operands&lt;/strong&gt; in the statement&lt;/li&gt;
&lt;li&gt;And if it’s an &lt;strong&gt;assignment&lt;/strong&gt;, we go deeper:

&lt;ul&gt;
&lt;li&gt;We compare the &lt;strong&gt;operation type&lt;/strong&gt; used on the &lt;strong&gt;RHS&lt;/strong&gt; (right-hand side).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;These checks ensure that both functions are doing the &lt;strong&gt;same operations&lt;/strong&gt; in the &lt;strong&gt;same order&lt;/strong&gt;, even if the variable names (LHS/RHS identifiers) are different.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ~/gccsrc/gcc/gcc/tree-prune-clones.cc&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;gimple_sequence_2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gimple_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;gimple_ops_count_2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gimple_num_ops&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;is_gimple_assign&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;gimple_op_types_2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gimple_assign_rhs_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;gimple_code(stmt)&lt;/code&gt; tells you what type of statement it is (&lt;code&gt;GIMPLE_ASSIGN&lt;/code&gt;, &lt;code&gt;GIMPLE_CALL&lt;/code&gt;, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gimple_num_ops(stmt)&lt;/code&gt; tells you how many operands it uses&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gimple_assign_rhs_code(stmt)&lt;/code&gt; is the key one — it gives you the &lt;strong&gt;specific opcode&lt;/strong&gt; on the RHS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4.&lt;/strong&gt; Compare Variable Usage Roles&lt;/p&gt;

&lt;p&gt;The final and most subtle comparison:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ~/gccsrc/gcc/gcc/tree-prune-clones.cc&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orig_map_iter&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;clone_map_iter&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;orig_map_iter&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;second&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;clone_map_iter&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;second&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We compare the &lt;strong&gt;normalized variable usage maps&lt;/strong&gt; (&lt;code&gt;gimple_var_map_1&lt;/code&gt; vs. &lt;code&gt;gimple_var_map_2&lt;/code&gt;). These maps tell us things like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“The second statement uses the same variable as the one first used in statement X.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If the maps are identical, that means the &lt;strong&gt;variables play the same roles in both functions&lt;/strong&gt;, even if their names are completely different.&lt;/p&gt;

&lt;h3&gt;
  
  
  Putting it all Together
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ~/gccsrc/gcc/gcc/tree-prune-clones.cc&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;vector&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;map&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"config.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"system.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"coretypes.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"backend.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"tree.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"gimple.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"tree-pass.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"ssa.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"tree-pretty-print.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"gimple-iterator.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"gimple-walk.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"internal-fn.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"gimple-pretty-print.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"cgraph.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"gimple-ssa.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"attribs.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"pretty-print.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"tree-inline.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"intl.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"function.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"basic-block.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="n"&gt;namespace&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;pass_data&lt;/span&gt; &lt;span class="n"&gt;prune_clones_pass_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;GIMPLE_PASS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="cm"&gt;/* type */&lt;/span&gt;
        &lt;span class="s"&gt;"prune_clones"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="cm"&gt;/* name */&lt;/span&gt;
        &lt;span class="n"&gt;OPTGROUP_NONE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="cm"&gt;/* optinfo_flags */&lt;/span&gt;
        &lt;span class="n"&gt;TV_NONE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="cm"&gt;/* tv_id */&lt;/span&gt;
        &lt;span class="n"&gt;PROP_cfg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="n"&gt;pass_prune_clones&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;public&lt;/span&gt; &lt;span class="n"&gt;gimple_opt_pass&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;public:&lt;/span&gt;
        &lt;span class="n"&gt;pass_prune_clones&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gcc&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ctxt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;gimple_opt_pass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prune_clones_pass_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ctxt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

        &lt;span class="n"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;final&lt;/span&gt; &lt;span class="n"&gt;override&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;set_pass_param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;override&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
        &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;final&lt;/span&gt; &lt;span class="n"&gt;override&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nl"&gt;private:&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;get_gimple_vars&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;first_occurrence_map&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gimple&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;out_map&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;is_base_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;record_function_info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;compare_function_info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;base_function&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;gimple_bb_count_1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;gimple_stmt_count_1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="n"&gt;gimple_code&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;gimple_sequence_1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;gimple_ops_count_1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="n"&gt;tree_code&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;gimple_op_types_1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;gimple_var_map_1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;pass_prune_clones&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;get_gimple_vars&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;first_occurrence_map&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gimple&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;out_map&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gimple_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;GIMPLE_COND&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="n"&gt;left_op&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_cond_lhs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="n"&gt;right_op&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_cond_rhs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;left_op&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;left_op&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;right_op&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;right_op&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;GIMPLE_CALL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="n"&gt;left_op&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_call_lhs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;left_op&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;left_op&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;GIMPLE_ASSIGN&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="n"&gt;left_op&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_assign_lhs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;left_op&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;rhs_ops&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_num_ops&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;rhs_ops&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="n"&gt;op&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_op&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;op&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;GIMPLE_DEBUG_BIND&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="n"&gt;debug_var&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_debug_bind_get_var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="n"&gt;debug_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_debug_bind_get_value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;debug_var&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;debug_var&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;debug_value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;debug_value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="nl"&gt;default:&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="n"&gt;debug_var&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;::&lt;/span&gt;&lt;span class="n"&gt;iterator&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;first_occurrence_map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;debug_var&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;first_occurrence_map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;out_map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;second&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;first_occurrence_map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;debug_var&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="n"&gt;out_map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;pass_prune_clones&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;is_base_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base_function&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;".resolver"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;npos&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;pass_prune_clones&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;record_function_info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;basic_block&lt;/span&gt; &lt;span class="n"&gt;bb&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;first_occurrence_map&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="n"&gt;FOR_EACH_BB_FN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;gimple_bb_count_1&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gimple_stmt_iterator&lt;/span&gt; &lt;span class="n"&gt;gsi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gsi_start_bb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bb&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;gsi_end_p&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;gsi_next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gsi&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;gimple_stmt_count_1&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_gimple_vars&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_occurrence_map&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gsi_stmt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;gimple_var_map_1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="n"&gt;gimple_sequence_1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gimple_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi_stmt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
                &lt;span class="n"&gt;gimple_ops_count_1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gimple_num_ops&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi_stmt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;is_gimple_assign&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi_stmt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;gimple_op_types_1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gimple_assign_rhs_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi_stmt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;pass_prune_clones&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;compare_function_info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;bb_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;stmt_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;basic_block&lt;/span&gt; &lt;span class="n"&gt;bb&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;first_occurrence_map&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;gimple_var_map_2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="n"&gt;FOR_EACH_BB_FN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;bb_count&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gimple_stmt_iterator&lt;/span&gt; &lt;span class="n"&gt;gsi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gsi_start_bb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bb&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;gsi_end_p&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;gsi_next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gsi&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;stmt_count&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_gimple_vars&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_occurrence_map&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gsi_stmt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;gimple_var_map_2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bb_count&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;gimple_bb_count_1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dump_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"[DIFF] BB count: %d vs %d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;bb_count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gimple_bb_count_1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt_count&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;gimple_stmt_count_1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dump_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"[DIFF] Statement count: %d vs %d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;stmt_count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gimple_stmt_count_1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bb_count&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;gimple_bb_count_1&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;stmt_count&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;gimple_stmt_count_1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_sequence_1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;count_it&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_ops_count_1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;optype_it&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_op_types_1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="n"&gt;FOR_EACH_BB_FN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gimple_stmt_iterator&lt;/span&gt; &lt;span class="n"&gt;gsi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gsi_start_bb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bb&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;gsi_end_p&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;gsi_next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gsi&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gimple_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi_stmt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;gimple_num_ops&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi_stmt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;count_it&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;GIMPLE_ASSIGN&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;optype_it&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;gimple_assign_rhs_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi_stmt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;count_it&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// Compare variable reference maps&lt;/span&gt;
        &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;orig_map_iter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_var_map_1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;clone_map_iter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_var_map_2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orig_map_iter&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;gimple_var_map_1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;orig_map_iter&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;clone_map_iter&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;orig_map_iter&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;second&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;clone_map_iter&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;second&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;orig_map_iter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;clone_map_iter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;pass_prune_clones&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;dump_file&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;cgraph_node&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cgraph_node&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;decl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dump_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"ERROR: cgraph_node::get(func-&amp;gt;decl)&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base_function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;".resolver"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;npos&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;base_function&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;substr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;".resolver"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
            &lt;span class="n"&gt;fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dump_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"[BASE] Found: %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;base_function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c_str&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;is_base_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;// Record info for the first matching function&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gimple_bb_count_1&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;gimple_stmt_count_1&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;record_function_info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="err"&gt;*/&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;Compare&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;cloned&lt;/span&gt; &lt;span class="n"&gt;functions&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;compare_function_info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dump_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"[PRUNE]: %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;base_function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c_str&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dump_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"[NO PRUNE]: %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;base_function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c_str&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;// anonymous namespace&lt;/span&gt;

&lt;span class="n"&gt;gimple_opt_pass&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nf"&gt;make_pass_prune_clones&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gcc&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ctxt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;pass_prune_clones&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctxt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The pruning suggestion is bolded in &lt;code&gt;unsigned int pass_prune_clones::execute&lt;/code&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Setup
&lt;/h3&gt;

&lt;p&gt;Setup instructions can be found &lt;a href="https://dev.to/jpjpjp/spo600-project-stage-2-part-2-where-art-thou-clones-3hkf"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Test Results
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="n"&gt;japablo&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;x86&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mo"&gt;001&lt;/span&gt;&lt;span class="o"&gt;:~/&lt;/span&gt;&lt;span class="n"&gt;spo600&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;examples&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;clone&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="n"&gt;cat&lt;/span&gt; &lt;span class="n"&gt;clone&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;noprune&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;clone&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;core&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;228&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prune_clones&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;;;&lt;/span&gt; &lt;span class="n"&gt;Function&lt;/span&gt; &lt;span class="n"&gt;scale_samples&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arch_x86_64_v3&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scale_samples&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arch_x86_64_v3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;funcdef_no&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;decl_uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3985&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cgraph_uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;symbol_order&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;DIFF&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;BB&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt; &lt;span class="n"&gt;vs&lt;/span&gt; &lt;span class="mi"&gt;31&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;NO&lt;/span&gt; &lt;span class="n"&gt;PRUNE&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; 

&lt;span class="n"&gt;japablo&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;x86&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mo"&gt;001&lt;/span&gt;&lt;span class="o"&gt;:~/&lt;/span&gt;&lt;span class="n"&gt;spo600&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;examples&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;clone&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="n"&gt;cat&lt;/span&gt; &lt;span class="n"&gt;clone&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;prune&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;clone&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;core&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;228&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prune_clones&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;;;&lt;/span&gt; &lt;span class="n"&gt;Function&lt;/span&gt; &lt;span class="n"&gt;scale_samples&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;popcnt&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scale_samples&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;popcnt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;funcdef_no&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;decl_uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3985&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cgraph_uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;symbol_order&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;PRUNE&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; 
&lt;span class="n"&gt;__attribute__&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"popcnt"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;target_clones&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"default"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"popcnt"&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;scale_samples&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;popcnt&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int16_t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int16_t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;cnt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;volume&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The respective tests show which function can be safely pruned and which ones should not be pruned!&lt;/p&gt;

&lt;h2&gt;
  
  
  Reflection
&lt;/h2&gt;

&lt;p&gt;The bulk of the work for this stage was done in &lt;a href="https://dev.to/jpjpjp/spo600-project-stage-2-part-2-where-art-thou-clones-3hkf"&gt;part 2&lt;/a&gt;. This was easier since we have the maps that “fingerprint” each function variant. &lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Time to rest my mind for a bit. Talk soon!&lt;/p&gt;

</description>
      <category>spo600</category>
      <category>gcc</category>
      <category>assembly</category>
    </item>
    <item>
      <title>SPO600 Project Stage 2, Part 2: "Where Art Thou, Clones?"</title>
      <dc:creator>JP </dc:creator>
      <pubDate>Sun, 06 Apr 2025 02:34:14 +0000</pubDate>
      <link>https://dev.to/jpjpjp/spo600-project-stage-2-part-2-where-art-thou-clones-3hkf</link>
      <guid>https://dev.to/jpjpjp/spo600-project-stage-2-part-2-where-art-thou-clones-3hkf</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;I’ll keep the introduction short - welcome back! The code will be broken down into parts and explained as we go along.  Let’s find those function variants! &lt;/p&gt;

&lt;h2&gt;
  
  
  Identifying the Function Variants
&lt;/h2&gt;

&lt;p&gt;Identifying the clones require a reference point - the base function serves as the “source of truth” with its respective basic blocks, statements, control flow, etc., and becomes the template to compare against when analyzing the variants. &lt;/p&gt;

&lt;h3&gt;
  
  
  Identifying the Base Function
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ~/gccsrc/gcc/gcc/tree-prune-clones.cc&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;

&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;base_function&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;...&lt;/span&gt;

&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;pass_prune_clones&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base_function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;".resolver"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;npos&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;base_function&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;substr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;".resolver"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
      &lt;span class="n"&gt;fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dump_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"[BASE] Found: %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;base_function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c_str&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;...&lt;/span&gt;

&lt;span class="n"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;pass_prune_clones&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;is_base_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base_function&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;".resolver"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;npos&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first thing to do is to get the name of the function when entering the call graph. Note that the name of function can have any of the variant extensions (e.g. &lt;code&gt;.constprop.0&lt;/code&gt;, &lt;code&gt;.ssa&lt;/code&gt;, etc.). &lt;code&gt;.resolver&lt;/code&gt; is the source function because ifuncs get resolved during runtime - allow multiple implementations during runtime. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;pass_prune_clones::execute&lt;/code&gt; extracts the function name from &lt;code&gt;.resolver&lt;/code&gt;. &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pass_prune_clones::is_base_function&lt;/code&gt; checks if the current node is function variant by comparing it the base function name&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Fingerprinting Functions
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;gcc&lt;/code&gt; documentation provides a &lt;a href="https://gcc.gnu.org/onlinedocs/gccint/Tuple-specific-accessors.html" rel="noopener noreferrer"&gt;list of accessors&lt;/a&gt; that simplifies the extraction in&lt;code&gt;GIMPLE&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The combo of &lt;code&gt;get_gimple_vars&lt;/code&gt; and &lt;code&gt;record_function_info&lt;/code&gt; is being used to &lt;strong&gt;record a structured fingerprint&lt;/strong&gt; of a function — not based on specific variable names, but on &lt;strong&gt;how it behaves structurally&lt;/strong&gt; (e.g., statement types, number of operands, variable usage patterns).&lt;/p&gt;

&lt;p&gt;&lt;code&gt;get_gimple_vars(...)&lt;/code&gt; processes a &lt;strong&gt;single GIMPLE statement&lt;/strong&gt; by:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Extract Variables&lt;/p&gt;

&lt;p&gt;For &lt;code&gt;GIMPLE_COND&lt;/code&gt;, &lt;code&gt;GIMPLE_ASSIGN&lt;/code&gt; ,&lt;code&gt;GIMPLE_CALL&lt;/code&gt;, and &lt;code&gt;GIMPLE_DEBUG_BIND&lt;/code&gt;, it collects involved &lt;code&gt;tree&lt;/code&gt; variables (like lhs/rhs, debug values) into a &lt;code&gt;std::vector&amp;lt;tree&amp;gt; vars&lt;/code&gt; — rather than identifying variables by their names, it tracks their first occurrence and usage position for structural comparisons across different functions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Map First Occurrence&lt;/p&gt;

&lt;p&gt;For each variable in &lt;code&gt;vars&lt;/code&gt;:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- If this is the **first time** it appears, it's assigned a new ID `i`.
- If it's been seen before, it reuses the same ID.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The output is stored in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;first_occurrence_map&lt;/code&gt;: mapping &lt;code&gt;tree → ID&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;out_map&lt;/code&gt;: mapping &lt;code&gt;ID of this statement → ID of first occurrence&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This abstract variable names away and focusses on their role — &lt;code&gt;a = b + c&lt;/code&gt; and &lt;code&gt;x = y + z&lt;/code&gt; would look the same if variable &lt;em&gt;roles&lt;/em&gt; match.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ~/gccsrc/gcc/gcc/tree-prune-clones.cc&lt;/span&gt;

&lt;span class="p"&gt;...&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;pass_prune_clones&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;get_gimple_vars&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;first_occurrence_map&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gimple&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;out_map&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gimple_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;GIMPLE_COND&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="n"&gt;left_op&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_cond_lhs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="n"&gt;right_op&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_cond_rhs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;left_op&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;left_op&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;right_op&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;right_op&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;GIMPLE_CALL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="n"&gt;left_op&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_call_lhs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;left_op&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;left_op&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;GIMPLE_ASSIGN&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="n"&gt;left_op&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_assign_lhs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;left_op&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;rhs_ops&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_num_ops&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;rhs_ops&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="n"&gt;op&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_op&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;op&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;GIMPLE_DEBUG_BIND&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="n"&gt;debug_var&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_debug_bind_get_var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="n"&gt;debug_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_debug_bind_get_value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;debug_var&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;debug_var&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;debug_value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;debug_value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nl"&gt;default:&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="n"&gt;debug_var&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;::&lt;/span&gt;&lt;span class="n"&gt;iterator&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;first_occurrence_map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;debug_var&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;first_occurrence_map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;out_map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;second&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;first_occurrence_map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;debug_var&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;out_map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Putting it Together
&lt;/h3&gt;

&lt;p&gt;Finally, there’s a way to identify the base function and to fingerprint each function for comparison! Let’s put the code all together!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ~/gccsrc/gcc/gcc/tree-prune-clones.cc&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;vector&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;map&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"config.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"system.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"coretypes.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"backend.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"tree.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"gimple.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"tree-pass.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"ssa.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"tree-pretty-print.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"gimple-iterator.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"gimple-walk.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"internal-fn.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"gimple-pretty-print.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"cgraph.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"gimple-ssa.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"attribs.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"pretty-print.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"tree-inline.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"intl.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"function.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"basic-block.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="n"&gt;namespace&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;pass_data&lt;/span&gt; &lt;span class="n"&gt;prune_clones_pass_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;GIMPLE_PASS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="cm"&gt;/* type */&lt;/span&gt;
        &lt;span class="s"&gt;"prune_clones"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="cm"&gt;/* name */&lt;/span&gt;
        &lt;span class="n"&gt;OPTGROUP_NONE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="cm"&gt;/* optinfo_flags */&lt;/span&gt;
        &lt;span class="n"&gt;TV_NONE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="cm"&gt;/* tv_id */&lt;/span&gt;
        &lt;span class="n"&gt;PROP_cfg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="n"&gt;pass_prune_clones&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;public&lt;/span&gt; &lt;span class="n"&gt;gimple_opt_pass&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;public:&lt;/span&gt;
        &lt;span class="n"&gt;pass_prune_clones&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gcc&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ctxt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;gimple_opt_pass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prune_clones_pass_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ctxt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

        &lt;span class="n"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;final&lt;/span&gt; &lt;span class="n"&gt;override&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;set_pass_param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;override&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
        &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;final&lt;/span&gt; &lt;span class="n"&gt;override&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nl"&gt;private:&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;get_gimple_vars&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;first_occurrence_map&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gimple&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;out_map&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;is_base_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;record_function_info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;base_function&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;gimple_bb_count_1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;gimple_stmt_count_1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="n"&gt;gimple_code&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;gimple_sequence_1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;gimple_ops_count_1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="n"&gt;tree_code&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;gimple_op_types_1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;gimple_var_map_1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;pass_prune_clones&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;get_gimple_vars&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;first_occurrence_map&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gimple&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;out_map&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gimple_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;GIMPLE_COND&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="n"&gt;left_op&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_cond_lhs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="n"&gt;right_op&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_cond_rhs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;left_op&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;left_op&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;right_op&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;right_op&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;GIMPLE_CALL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="n"&gt;left_op&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_call_lhs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;left_op&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;left_op&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;GIMPLE_ASSIGN&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="n"&gt;left_op&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_assign_lhs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;left_op&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;rhs_ops&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_num_ops&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;rhs_ops&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="n"&gt;op&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_op&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;op&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;GIMPLE_DEBUG_BIND&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="n"&gt;debug_var&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_debug_bind_get_var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="n"&gt;debug_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_debug_bind_get_value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;debug_var&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;debug_var&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;debug_value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;debug_value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="nl"&gt;default:&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="n"&gt;debug_var&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;vars&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;::&lt;/span&gt;&lt;span class="n"&gt;iterator&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;first_occurrence_map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;debug_var&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;first_occurrence_map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;out_map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;second&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;first_occurrence_map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;debug_var&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="n"&gt;out_map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;pass_prune_clones&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;is_base_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base_function&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;".resolver"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;npos&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;pass_prune_clones&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;record_function_info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;basic_block&lt;/span&gt; &lt;span class="n"&gt;bb&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;tree&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;first_occurrence_map&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="n"&gt;FOR_EACH_BB_FN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;gimple_bb_count_1&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gimple_stmt_iterator&lt;/span&gt; &lt;span class="n"&gt;gsi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gsi_start_bb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bb&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;gsi_end_p&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;gsi_next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gsi&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;gimple_stmt_count_1&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_gimple_vars&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_occurrence_map&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gsi_stmt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;gimple_var_map_1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="n"&gt;gimple_sequence_1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gimple_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi_stmt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
                &lt;span class="n"&gt;gimple_ops_count_1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gimple_num_ops&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi_stmt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;is_gimple_assign&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi_stmt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;gimple_op_types_1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push_back&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gimple_assign_rhs_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi_stmt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;pass_prune_clones&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;dump_file&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;cfg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;cgraph_node&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cgraph_node&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;decl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dump_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"ERROR: cgraph_node::get(func-&amp;gt;decl)&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base_function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;".resolver"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;npos&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;base_function&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;substr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;".resolver"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
            &lt;span class="n"&gt;fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dump_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"[BASE] Found: %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;base_function&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c_str&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;is_base_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;// Record info for the first matching function&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gimple_bb_count_1&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;gimple_stmt_count_1&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;record_function_info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;// anonymous namespace&lt;/span&gt;

&lt;span class="n"&gt;gimple_opt_pass&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nf"&gt;make_pass_prune_clones&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gcc&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ctxt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;pass_prune_clones&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctxt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;p&gt;The test cases were generously provided by Professor Chris Tyler.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setup
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Build &lt;code&gt;gcc&lt;/code&gt; with the newly added pass

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;cd ~/gcc-build-002&lt;/code&gt;&lt;/li&gt;
&lt;li&gt; &lt;code&gt;time make -j$(nproc) |&amp;amp; tee rebuild_log.log&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;make install&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;cd ~&lt;/code&gt; &lt;/li&gt;

&lt;li&gt;
&lt;code&gt;tar xvf /public/spo600-test-clone.tgz&lt;/code&gt;: copy the test cases into current directory&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;cd ~/spo600/examples/test-clone&lt;/code&gt; &lt;/li&gt;

&lt;li&gt;
&lt;code&gt;vim Makefile&lt;/code&gt; and uncomment &lt;code&gt;DUMP_ALL&lt;/code&gt; &lt;/li&gt;

&lt;li&gt;
&lt;code&gt;PATH=”$HOME/gcc-test-001/bin:$PATH"&lt;/code&gt;: set default &lt;code&gt;gcc&lt;/code&gt; to the newly built version&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;make&lt;/code&gt;: execute test cases&lt;/li&gt;

&lt;/ol&gt;

&lt;p&gt;Note: &lt;code&gt;ls&lt;/code&gt; will reveal all the dumpfiles created, find the name of the pass. In my case my pass was named &lt;code&gt;prune-clones&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Test Results
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;japablo@x86-001:~/spo600/examples/test-clone&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;clone-test-x86-prune-clone-test-core.c.228t.prune_clones | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"DIFF"&lt;/span&gt;
&lt;span class="p"&gt;;;&lt;/span&gt; Function scale_samples.arch_x86_64_v3 &lt;span class="o"&gt;(&lt;/span&gt;scale_samples.arch_x86_64_v3, &lt;span class="nv"&gt;funcdef_no&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;25, &lt;span class="nv"&gt;decl_uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3985, &lt;span class="nv"&gt;cgraph_uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;30, &lt;span class="nv"&gt;symbol_order&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;28&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;DIFF] BB count: 40 vs 31

japablo@x86-001:~/spo600/examples/test-clone&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;clone-test-x86-prune-clone-test-core.c.228t.prune_clones
&lt;span class="p"&gt;;;&lt;/span&gt; Function scale_samples.resolver &lt;span class="o"&gt;(&lt;/span&gt;scale_samples.resolver, &lt;span class="nv"&gt;funcdef_no&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;27, &lt;span class="nv"&gt;decl_uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4477, &lt;span class="nv"&gt;cgraph_uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;32, &lt;span class="nv"&gt;symbol_order&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;30&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;BASE] Found: scale_samples

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Running the tests shows when a base function has been found and shows the differences in basic block count between the base and variant!&lt;/p&gt;

&lt;h2&gt;
  
  
  Reflection
&lt;/h2&gt;

&lt;p&gt;This stage of the project was challenging but rewarding. There was a lot of trial and error along the way. My initial approach to identifying function variants—by checking file extensions, which partially worked.&lt;/p&gt;

&lt;p&gt;Resources like the GCC documentation, YouTube tutorials, and StackOverflow were invaluable in helping me discover the right functions to traverse and extract information for fingerprinting.&lt;/p&gt;

&lt;p&gt;A big thank you to Professor Chris Tyler as well for providing the test cases, which were conveniently automated using a Makefile.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The hardest part is done! Time to tackle the last part: Prune Suggestion.&lt;/p&gt;

</description>
      <category>spo600</category>
      <category>gcc</category>
      <category>assembly</category>
    </item>
    <item>
      <title>SPO600 Project Stage 2, Part 1: “To Prune, or not to Prune”</title>
      <dc:creator>JP </dc:creator>
      <pubDate>Sat, 05 Apr 2025 22:41:39 +0000</pubDate>
      <link>https://dev.to/jpjpjp/spo600-project-stage-2-part-1-to-prune-or-not-to-prune-3hdd</link>
      <guid>https://dev.to/jpjpjp/spo600-project-stage-2-part-1-to-prune-or-not-to-prune-3hdd</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Welcome back! This blog is a continuation from &lt;a href="https://dev.to/jpjpjp/spo600-project-stage-1-gimple-and-passes-5b2"&gt;SPO600 Project Stage 1&lt;/a&gt; - where a pass was created that counts the number of basic blocks and &lt;code&gt;GIMPLE&lt;/code&gt; statements for a given function. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Project Stage 2&lt;/strong&gt; will be the “meat and potatoes” of the project — where &lt;strong&gt;variations of a function are compared to determine whether they can be "pruned" or not&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Compiling with &lt;code&gt;gcc&lt;/code&gt; is not a one-step process. Instead, there are multiple optimization stages between the source code and the final executable. In each stage, the code can translated into a different form or cloned while remaining functionally the same — which raises the question: &lt;strong&gt;can these forms be safely “pruned”?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Gameplan
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Background
&lt;/h3&gt;

&lt;p&gt;This problem is similar to &lt;a href="https://leetcode.com/problems/same-tree/description/" rel="noopener noreferrer"&gt;LeetCode question 100. Same Tree&lt;/a&gt; where the tree can be traversed to identify similarities in their tree structure. However, &lt;code&gt;GIMPLE&lt;/code&gt; representations differ in a number of ways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The control flow graphs contain n-ary tree structures rather than binary trees, where each basic block could have multiple statements and each statement containing different number of operands.&lt;/li&gt;
&lt;li&gt;Nodes represent a mix of GIMPLE operations (ASSIGN, CALL, COND, etc.).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Luckily, GCC has APIs for traversing and analyzing these structures, to name few:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gimple.h&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gimple-iterator.h&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gimple-walk.h&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gimple-pretty-print.h&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Steps
&lt;/h3&gt;

&lt;p&gt;“Pruning” a function can be determined by:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Identifying all function variations created&lt;/li&gt;
&lt;li&gt;Compare each function variations via their &lt;code&gt;GIMPLE&lt;/code&gt; representations &lt;/li&gt;
&lt;li&gt;Suggest to “prune” if the &lt;code&gt;GIMPLE&lt;/code&gt; representations are similar

&lt;ol&gt;
&lt;li&gt;Note: to be considered &lt;strong&gt;similar&lt;/strong&gt;:

&lt;ol&gt;
&lt;li&gt;Both variations have  &lt;strong&gt;identical control flow graphs&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Both variations have &lt;strong&gt;identical number of  operands&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Both variations have &lt;strong&gt;identical operands&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;/li&gt;

&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Stay tuned! Next blog will explore step 1 of the plan: Identifying all function variations created.&lt;/p&gt;

</description>
      <category>spo600</category>
      <category>gcc</category>
      <category>assembly</category>
    </item>
    <item>
      <title>SPO600 Project Stage 1: Gimple and Passes</title>
      <dc:creator>JP </dc:creator>
      <pubDate>Mon, 10 Mar 2025 04:47:14 +0000</pubDate>
      <link>https://dev.to/jpjpjp/spo600-project-stage-1-gimple-and-passes-5b2</link>
      <guid>https://dev.to/jpjpjp/spo600-project-stage-1-gimple-and-passes-5b2</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;In the &lt;a href="https://dev.to/jpjpjp/spo600-lab-5-analyzing-and-experimenting-with-assembly-1f9o"&gt;previous post&lt;/a&gt;, a development instance &lt;code&gt;gcc&lt;/code&gt; was set up - where we can experiment and contribute our changes. &lt;code&gt;x86&lt;/code&gt; variants are rapidly growing, where each variant is optimized for different architectures, use cases, etc. &lt;code&gt;gcc&lt;/code&gt; unfortunately struggles to keep up with increasing number of platform-specific optimizations, leading to an increasing amount of time when selecting the platform to build .&lt;/p&gt;

&lt;p&gt;This project aims to automate the platform selection process, widening the range of supported platforms. The first stage of the project involves the introduction of &lt;a href="https://gcc.gnu.org/onlinedocs/gccint/GIMPLE.html" rel="noopener noreferrer"&gt;GIMPLE&lt;/a&gt; and “passes”. Specifically focussing on counting the number of basic blocks and statements during compilation, providing insight into code structure. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;GIMPLE&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;GIMPLE&lt;/code&gt; is a intermediate representation used by &lt;code&gt;gcc&lt;/code&gt; when compiling. It breaks down the source code into a lower-level where it can be easier to analyze and manipulate - this becomes important in the optimization stages of compilation where transformations occur to improve performance and efficiency. &lt;/p&gt;

&lt;h2&gt;
  
  
  Passes
&lt;/h2&gt;

&lt;p&gt;Passes are steps in the compiling process where the code is transformed or analyzed to improve performance, or for efficiency. &lt;/p&gt;

&lt;h1&gt;
  
  
  Setup and Execution
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;Implementing a pass requires 4 major steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Define the pass in a source file (&lt;code&gt;.cc&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Register the pass in the sequence of transformations found in &lt;code&gt;passes.def&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Modify &lt;code&gt;tree-pass.h&lt;/code&gt; to associate the header files for helper functions &lt;/li&gt;
&lt;li&gt;Update the Makefile to compile and link the pass&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Creating the Pass
&lt;/h2&gt;

&lt;p&gt;The pass must be created in the &lt;code&gt;gcc&lt;/code&gt; subfolder (i.e. &lt;code&gt;gcc-source/gcc&lt;/code&gt;). A quick &lt;code&gt;ls&lt;/code&gt; is this directory will reveal the existing passes and transformations in &lt;code&gt;gcc&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;japablo&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;x86&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mo"&gt;001&lt;/span&gt;&lt;span class="o"&gt;:~/&lt;/span&gt;&lt;span class="n"&gt;gccsrc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;gcc&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="n"&gt;ls&lt;/span&gt;
&lt;span class="n"&gt;ABOUT&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;GCC&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;NLS&lt;/span&gt;                   &lt;span class="n"&gt;gimple&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;                        &lt;span class="n"&gt;range&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;op&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cc&lt;/span&gt;
&lt;span class="n"&gt;acinclude&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;m4&lt;/span&gt;                    &lt;span class="n"&gt;gimple&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;expr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cc&lt;/span&gt;                    &lt;span class="n"&gt;range&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;op&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;
&lt;span class="n"&gt;aclocal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;m4&lt;/span&gt;                      &lt;span class="n"&gt;gimple&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;expr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;                     &lt;span class="n"&gt;range&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;op&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;mixed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;
&lt;span class="n"&gt;ada&lt;/span&gt;                             &lt;span class="n"&gt;gimple&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fold&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cc&lt;/span&gt;                    &lt;span class="n"&gt;range&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;op&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ptr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cc&lt;/span&gt;
&lt;span class="n"&gt;addresses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;                     &lt;span class="n"&gt;gimple&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fold&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;                     &lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;md&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cc&lt;/span&gt;
&lt;span class="n"&gt;adjust&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;alignment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cc&lt;/span&gt;             &lt;span class="n"&gt;gimple&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;                          &lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;md&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;
&lt;span class="n"&gt;alias&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cc&lt;/span&gt;                        &lt;span class="n"&gt;gimple&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;harden&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;conditionals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cc&lt;/span&gt;     &lt;span class="n"&gt;README&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Portability&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: these are some of the transformations. Moving back to the main topic of creating the source code in the pass, here is implementation of the pass.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// gcc/tree-japablo.cc&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"config.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"system.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"coretypes.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"backend.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"tree.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"gimple.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"tree-pass.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"ssa.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"tree-pretty-print.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"gimple-iterator.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"gimple-walk.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"internal-fn.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"gimple-pretty-print.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"cgraph.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"gimple-ssa.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"attribs.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"pretty-print.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"tree-inline.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"intl.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"function.h"&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;"basic-block.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Pass metadata definition&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;pass_data&lt;/span&gt; &lt;span class="n"&gt;my_pass_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;GIMPLE_PASS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="c1"&gt;// Pass type (GIMPLE-level pass)&lt;/span&gt;
        &lt;span class="s"&gt;"japablo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;         &lt;span class="c1"&gt;// Name of the pass&lt;/span&gt;
        &lt;span class="n"&gt;OPTGROUP_NONE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="c1"&gt;// No specific option group&lt;/span&gt;
        &lt;span class="n"&gt;TV_NONE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;           &lt;span class="c1"&gt;// No timevar (profiling category)&lt;/span&gt;
        &lt;span class="n"&gt;PROP_cfg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;          &lt;span class="c1"&gt;// Requires CFG (Control Flow Graph)&lt;/span&gt;
        &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                 &lt;span class="c1"&gt;// Properties required (None)&lt;/span&gt;
        &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                 &lt;span class="c1"&gt;// Properties destroyed (None)&lt;/span&gt;
        &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                 &lt;span class="c1"&gt;// Todo flags start&lt;/span&gt;
        &lt;span class="mi"&gt;0&lt;/span&gt;                  &lt;span class="c1"&gt;// Todo flags finish&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="c1"&gt;// Custom GIMPLE pass class&lt;/span&gt;
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;pass_japablo&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;gimple_opt_pass&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;public:&lt;/span&gt;
        &lt;span class="c1"&gt;// Constructor: initialize the parent class with the pass context&lt;/span&gt;
        &lt;span class="n"&gt;pass_japablo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gcc&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;gimple_opt_pass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;my_pass_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

        &lt;span class="c1"&gt;// Execute method: called when the pass runs on a function&lt;/span&gt;
        &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;fun&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

            &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Function: %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;function_name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fun&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

            &lt;span class="c1"&gt;// Count basic blocks and GIMPLE statements&lt;/span&gt;
            &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;bb_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;stmt_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="c1"&gt;// Iterate through all basic blocks&lt;/span&gt;
            &lt;span class="n"&gt;basic_block&lt;/span&gt; &lt;span class="n"&gt;bb&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;FOR_EACH_BB_FN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fun&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
               &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;bb_count&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gimple_stmt_iterator&lt;/span&gt; &lt;span class="n"&gt;gsi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gsi_start_bb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bb&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;gsi_end_p&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;gsi_next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gsi&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;stmt_count&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// Count GIMPLE statements&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Basic blocks: %d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bb_count&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"GIMPLE statements: %d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stmt_count&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Pass execution successful&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="cm"&gt;/* fun */&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Always run this pass&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Factory function to instantiate the pass&lt;/span&gt;
&lt;span class="n"&gt;gimple_opt_pass&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nf"&gt;make_pass_japablo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gcc&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ctxt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;pass_japablo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctxt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Namespace and Pass Metadata
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;pass_data&lt;/span&gt; &lt;span class="n"&gt;my_pass_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;GIMPLE_PASS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="c1"&gt;// Pass type (GIMPLE-level pass)&lt;/span&gt;
        &lt;span class="s"&gt;"japablo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;         &lt;span class="c1"&gt;// Name of the pass&lt;/span&gt;
        &lt;span class="n"&gt;OPTGROUP_NONE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="c1"&gt;// No specific option group&lt;/span&gt;
        &lt;span class="n"&gt;TV_NONE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;           &lt;span class="c1"&gt;// No timevar (profiling category)&lt;/span&gt;
        &lt;span class="n"&gt;PROP_cfg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;          &lt;span class="c1"&gt;// Requires CFG (Control Flow Graph)&lt;/span&gt;
        &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                 &lt;span class="c1"&gt;// Properties required (None)&lt;/span&gt;
        &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                 &lt;span class="c1"&gt;// Properties destroyed (None)&lt;/span&gt;
        &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                 &lt;span class="c1"&gt;// Todo flags start&lt;/span&gt;
        &lt;span class="mi"&gt;0&lt;/span&gt;                  &lt;span class="c1"&gt;// Todo flags finish&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This groups the pass definition and metadata - configuring the pass, how it should be behave, and how it fits into &lt;code&gt;gcc&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Custom Pass Class &lt;code&gt;pass_japablo&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;pass_japablo&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;gimple_opt_pass&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;public:&lt;/span&gt;
        &lt;span class="c1"&gt;// Constructor: initialize the parent class with the pass context&lt;/span&gt;
        &lt;span class="n"&gt;pass_japablo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gcc&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;gimple_opt_pass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;my_pass_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

        &lt;span class="c1"&gt;// Execute method: called when the pass runs on a function&lt;/span&gt;
        &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;fun&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

            &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Function: %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;function_name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fun&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

            &lt;span class="c1"&gt;// Count basic blocks and GIMPLE statements&lt;/span&gt;
            &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;bb_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;stmt_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="c1"&gt;// Iterate through all basic blocks&lt;/span&gt;
            &lt;span class="n"&gt;basic_block&lt;/span&gt; &lt;span class="n"&gt;bb&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;FOR_EACH_BB_FN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fun&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
               &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;bb_count&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gimple_stmt_iterator&lt;/span&gt; &lt;span class="n"&gt;gsi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gsi_start_bb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bb&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;gsi_end_p&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gsi&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;gsi_next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;gsi&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;stmt_count&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// Count GIMPLE statements&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Basic blocks: %d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bb_count&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"GIMPLE statements: %d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stmt_count&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Pass execution successful&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;gate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="cm"&gt;/* fun */&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Always run this pass&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The pass inherits from the &lt;code&gt;gimple_opt_pass&lt;/code&gt;, a base class defining a &lt;code&gt;GIMPLE&lt;/code&gt; pass. The pass is initialized with the metadata defined previously. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;execute&lt;/code&gt; takes in a function and prints the name of the function with the number of basic blocks using &lt;code&gt;FOR_EACH_BB_FN&lt;/code&gt;, a loop macro in &lt;code&gt;gcc&lt;/code&gt; that simplifies iterating over each basic block of a function. The inner loop counts the number of &lt;code&gt;GIMPLE&lt;/code&gt; statements using &lt;code&gt;GIMBLE&lt;/code&gt; specific functions to iterate over &lt;code&gt;GIMPLE&lt;/code&gt; statements in its intermediate form.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Factory Function for the Pass&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;gimple_opt_pass&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nf"&gt;make_pass_japablo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gcc&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ctxt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;pass_japablo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctxt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A factory function is used to create an instance of the pass class (i.e. &lt;code&gt;pass_japablo&lt;/code&gt;) and create objects (e.g. &lt;code&gt;.o&lt;/code&gt;). &lt;/p&gt;

&lt;h2&gt;
  
  
  Registering the Pass
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  NEXT_PASS (pass_assumptions);
  NEXT_PASS (pass_tm_init);
  PUSH_INSERT_PASSES_WITHIN (pass_tm_init)
      NEXT_PASS (pass_tm_mark);
      NEXT_PASS (pass_tm_memopt);
      NEXT_PASS (pass_tm_edges);
  POP_INSERT_PASSES ()
  NEXT_PASS (pass_simduid_cleanup);
  NEXT_PASS (pass_vtable_verify);
  NEXT_PASS (pass_lower_vaarg);
  NEXT_PASS (pass_lower_vector);
  NEXT_PASS (pass_lower_complex_O0);
  NEXT_PASS (pass_lower_bitint_O0);
  NEXT_PASS (pass_sancov_O0);
  NEXT_PASS (pass_lower_switch_O0);
  NEXT_PASS (pass_asan_O0);
  NEXT_PASS (pass_tsan_O0);
  NEXT_PASS (pass_sanopt);
  NEXT_PASS (pass_cleanup_eh);
  NEXT_PASS (pass_musttail);
  NEXT_PASS (pass_lower_resx);
  **NEXT_PASS (pass_japablo);**
  NEXT_PASS (pass_nrv);
  NEXT_PASS (pass_gimple_isel);
  NEXT_PASS (pass_harden_conditional_branches);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where the pass is placed matters. In this case, &lt;code&gt;pass_japablo&lt;/code&gt; will count the basic blocks and statements of the functions that were transformed in previous passes.  &lt;/p&gt;

&lt;p&gt;Semantics is key in this part. I found out the hard way by putting &lt;strong&gt;&lt;code&gt;NEXT_PASS (make_pass_japablo);&lt;/code&gt;&lt;/strong&gt; instead of &lt;strong&gt;&lt;code&gt;NEXT_PASS (pass_japablo);&lt;/code&gt; resulting in this error:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./pass-instances.def: In constructor ‘gcc::pass_manager::pass_manager&lt;span class="o"&gt;(&lt;/span&gt;gcc::context&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;’:
../../gccsrc/gcc/passes.cc:1624:20: error: ‘make_make_jp_pass’ was not declared &lt;span class="k"&gt;in &lt;/span&gt;this scope&lt;span class="p"&gt;;&lt;/span&gt; did you mean ‘make_jp_pass’?
 1624 |       PASS &lt;span class="c"&gt;## _1 = make_##PASS (m_ctxt);          \&lt;/span&gt;
      |                    ^~~~~
./pass-instances.def:68:3: note: &lt;span class="k"&gt;in &lt;/span&gt;expansion of macro ‘NEXT_PASS’
   68 |   NEXT_PASS &lt;span class="o"&gt;(&lt;/span&gt;make_jp_pass, 1&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      |   ^~~~~~~~~

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luckily, the hints &lt;code&gt;PASS ## _1 = make_##PASS (m_ctxt);&lt;/code&gt; and &lt;code&gt;‘make_make_jp_pass’ was not declared in this scope; did you mean ‘make_jp_pass’?&lt;/code&gt; led to the fix&lt;/p&gt;

&lt;p&gt;led to the fix. &lt;/p&gt;

&lt;h2&gt;
  
  
  Modifying &lt;code&gt;tree-pass.h&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="n"&gt;gimple_opt_pass&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nf"&gt;make_pass_tracer&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gcc&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ctxt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="n"&gt;gimple_opt_pass&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nf"&gt;make_pass_warn_restrict&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gcc&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ctxt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="n"&gt;gimple_opt_pass&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nf"&gt;make_pass_warn_unused_result&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gcc&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ctxt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="n"&gt;gimple_opt_pass&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nf"&gt;make_pass_japablo&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gcc&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ctxt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Updating the &lt;code&gt;Makefile&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="nv"&gt;OBJS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
...
 &lt;span class="err"&gt;tree-inline.o&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;
        &lt;span class="err"&gt;tree-into-ssa.o&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;
        &lt;span class="err"&gt;tree-iterator.o&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;
        &lt;span class="err"&gt;**tree-japablo.o&lt;/span&gt; &lt;span class="err"&gt;\**&lt;/span&gt;
        &lt;span class="err"&gt;tree-logical-location.o&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Rebuilding &lt;code&gt;gcc&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Rebuilding &lt;code&gt;gcc&lt;/code&gt; with the new pass will require to &lt;code&gt;cd&lt;/code&gt; into the build directory &lt;code&gt;japablo@x86-001:~/gcc-build-001$&lt;/code&gt; and run &lt;code&gt;make clean&lt;/code&gt;. According to the &lt;code&gt;Makefile&lt;/code&gt; documentation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="c"&gt;# 3. Use "make clean" to remove the previous build.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Running &lt;code&gt;make clean&lt;/code&gt; will give us a clean slate, reducing the chance for build conflicts from a previous build. &lt;/p&gt;

&lt;h1&gt;
  
  
  Results
&lt;/h1&gt;

&lt;p&gt;Here is a sample of what if printed to the console as &lt;code&gt;japablo-pass&lt;/code&gt; is executed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="nl"&gt;Function&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;gimple_simplify_373&lt;/span&gt;
&lt;span class="nl"&gt;Basic blocks&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;465&lt;/span&gt;
&lt;span class="nl"&gt;GIMPLE statements&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;4630&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let’s recompile the code in lab 4, a simple "hello world" program. The pass should print the number of basic blocks and &lt;code&gt;GIMPLE&lt;/code&gt; statements in the simple hello world program.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;japablo@x86-001:~/l4&lt;span class="nv"&gt;$ $HOME&lt;/span&gt;/gcc-test-001/bin/gcc test.c &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nb"&gt;test

&lt;/span&gt;Function: main
Basic blocks: 2
GIMPLE statements: 4

japablo@x86-001:~/l4&lt;span class="nv"&gt;$ &lt;/span&gt;./test
Hello, World!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Dump File
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;japablo@x86-001:~/l4$ $HOME/gcc-test-001/bin/gcc -fdump-tree-japablo test.c -o test

Function: main
Basic blocks: 2
GIMPLE statements: 4
japablo@x86-001:~/l4$ cat test.c.264t.japablo 

;; Function main (main, funcdef_no=0, decl_uid=3267, cgraph_uid=1, symbol_order=0)

int main ()
{
  int D.3270;
  int _3;

  &amp;lt;bb 2&amp;gt; :
  __builtin_puts (&amp;amp;"Hello, World!"[0]);
  _3 = 0;

  &amp;lt;bb 3&amp;gt; :
&amp;lt;L0&amp;gt;:
  return _3;

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;This stage of the project will serve as the basis on how to analyze the intermediate representation of source code. Being exposed to the underlying transformations of &lt;code&gt;gcc&lt;/code&gt; made me realize how complex a “hello world” program is. There are hundreds of optimizations happening “under the hood”, none that I am familiar with but made me curious to look into the source code of one of the “simpler” transformations and possibly experiment with it. &lt;/p&gt;

&lt;p&gt;So far I have been mostly studying and working with high-level programming and concepts and never had the opportunity to work with lower level code. Low-level programming is verbose and requires a deeper understanding of memory management, CPU architecture, etc. Excited to continue onto the next stage - let the experimenting begin!&lt;/p&gt;

</description>
      <category>spo600</category>
      <category>gcc</category>
    </item>
    <item>
      <title>SPO600 Lab 5 - Analyzing and Experimenting with Assembly</title>
      <dc:creator>JP </dc:creator>
      <pubDate>Wed, 05 Mar 2025 15:59:04 +0000</pubDate>
      <link>https://dev.to/jpjpjp/spo600-lab-5-analyzing-and-experimenting-with-assembly-1f9o</link>
      <guid>https://dev.to/jpjpjp/spo600-lab-5-analyzing-and-experimenting-with-assembly-1f9o</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;x86&lt;/code&gt; and &lt;code&gt;aarch64&lt;/code&gt; have a more rich set of instructions compared to &lt;code&gt;6502&lt;/code&gt; - the former is far more capable with complex operations. Each architecture are designed with different goals - &lt;code&gt;x86&lt;/code&gt; prioritizes raw performance, &lt;code&gt;aarch64&lt;/code&gt; prioritizes power efficiency, and &lt;code&gt;6502&lt;/code&gt; is simple and cost efficient (relative to today’s standards). &lt;/p&gt;

&lt;p&gt;Let’s slowly get introduced to the &lt;code&gt;x86&lt;/code&gt; and &lt;code&gt;aarch64&lt;/code&gt; instruction set by analyzing a simple “Hello World” program, then experiment with loops.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preparing the Lab Environment
&lt;/h2&gt;

&lt;p&gt;The source code was obtained by using &lt;code&gt;tar&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tar xvf /public/spo600-assembler-lab-examples.tgz&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This will extract the contents into the current directory - I decided to extract it into my &lt;code&gt;labs/l5&lt;/code&gt; directory. &lt;/p&gt;

&lt;p&gt;The source code directory follows this structure (&lt;a href="http://spo600.cdot.systems/doku.php?id=spo600:64-bit_assembly_language_lab" rel="noopener noreferrer"&gt;Source&lt;/a&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; spo600
 └── examples
     └── hello                     # "hello world" example programs
         ├── assembler
         │   ├── aarch64           # aarch64 gas assembly language version
         │   │   ├── hello.s
         │   │   └── Makefile
         │   ├── Makefile
         │   └── x86_64            # x86_64 assembly language versions
         │       ├── hello-gas.s   # ... gas syntax
         │       ├── hello-nasm.s  # ... nasm syntax
         │       └── Makefile
         └── c                     # Portable C versions
             ├── hello2.c          # ... using write()
             ├── hello3.c          # ... using syscall()
             ├── hello.c           # ... using printf()
             └── Makefile

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  &lt;code&gt;aarch64&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;Navigate to the &lt;code&gt;spo600/examples/hello/assembler/aarch64&lt;/code&gt; and run &lt;code&gt;make&lt;/code&gt;, the will assemble and link to create an executable named &lt;code&gt;hello&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Comparing the source code &lt;code&gt;hello.s&lt;/code&gt; to the disassembled output by using &lt;code&gt;objdump -d hello.o&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[japablo@aarch64-002 aarch64]$ cat hello.s
.text
.globl _start
_start:

    mov     x0, 1           /* file descriptor: 1 is stdout */
    adr     x1, msg     /* message location (memory address) */
    mov     x2, len     /* message length (bytes) */

    mov     x8, 64      /* write is syscall #64 */
    svc     0           /* invoke syscall */

    mov     x0, 0       /* status -&amp;gt; 0 */
    mov     x8, 93      /* exit is syscall #93 */
    svc     0           /* invoke syscall */

.data
msg:    .ascii      "Hello, world!\n"
len=    . - msg
[japablo@aarch64-002 aarch64]$ objdump -d hello.o

hello.o:     file format elf64-littleaarch64

Disassembly of section .text:

0000000000000000 &amp;lt;_start&amp;gt;:
   0:   d2800020    mov x0, #0x1                    // #1
   4:   10000001    adr x1, 0 &amp;lt;_start&amp;gt;
   8:   d28001c2    mov x2, #0xe                    // #14
   c:   d2800808    mov x8, #0x40                   // #64
  10:   d4000001    svc #0x0
  14:   d2800000    mov x0, #0x0                    // #0
  18:   d2800ba8    mov x8, #0x5d                   // #93
  1c:   d4000001    svc #0x0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The dissembled output is the machine readable version of the source code. Both versions have 8 instructions and each line starts with where the instruction starts followed by the binary code being executed followed by the corresponding human-readable instruction. &lt;/p&gt;

&lt;h2&gt;
  
  
  Loops
&lt;/h2&gt;

&lt;p&gt;The first step is to produce a loop to print “Loop” 5 times.&lt;/p&gt;

&lt;p&gt;The high level instructions are as follows:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;create a string variable &lt;code&gt;Loop:&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;have a &lt;code&gt;min&lt;/code&gt; and &lt;code&gt;max&lt;/code&gt; value, defines the number of loops&lt;/li&gt;
&lt;li&gt;initiate a variable to track loop iteration&lt;/li&gt;
&lt;li&gt;print the string variable &lt;code&gt;Loop:&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;print newline&lt;/li&gt;
&lt;li&gt;increment the loop counter&lt;/li&gt;
&lt;li&gt;check if iteration reaches the &lt;code&gt;max&lt;/code&gt; value
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;    &lt;span class="nf"&gt;.section&lt;/span&gt; &lt;span class="nv"&gt;.data&lt;/span&gt;
&lt;span class="nl"&gt;msg:&lt;/span&gt;    &lt;span class="nf"&gt;.ascii&lt;/span&gt; &lt;span class="s"&gt;"Loop: "&lt;/span&gt;        &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;message&lt;/span&gt; &lt;span class="nv"&gt;prefix&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="nv"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nl"&gt;digit:&lt;/span&gt;  &lt;span class="nf"&gt;.byte&lt;/span&gt; &lt;span class="s"&gt;'0'&lt;/span&gt;              &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;placeholder&lt;/span&gt; &lt;span class="nv"&gt;for&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;loop&lt;/span&gt; &lt;span class="nv"&gt;index&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;initialized&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="s"&gt;'0'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nl"&gt;newline:&lt;/span&gt;&lt;span class="nf"&gt;.ascii&lt;/span&gt; &lt;span class="err"&gt;"\&lt;/span&gt;&lt;span class="nv"&gt;n&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;            &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;newline&lt;/span&gt; &lt;span class="nb"&gt;ch&lt;/span&gt;&lt;span class="nv"&gt;aracter&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;.section&lt;/span&gt; &lt;span class="nv"&gt;.text&lt;/span&gt;
    &lt;span class="nf"&gt;.globl&lt;/span&gt; &lt;span class="nv"&gt;_start&lt;/span&gt;

    &lt;span class="nf"&gt;min&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;                    
    &lt;span class="nf"&gt;max&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;                    

&lt;span class="nl"&gt;_start:&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;min&lt;/span&gt;           &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;init&lt;/span&gt; &lt;span class="nv"&gt;loop&lt;/span&gt; &lt;span class="nv"&gt;counter&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;x19&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nl"&gt;loop:&lt;/span&gt;
    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nf"&gt;Write&lt;/span&gt; &lt;span class="s"&gt;"Loop: "&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;              &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;file&lt;/span&gt; &lt;span class="nv"&gt;descriptor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;stdout&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;ldr&lt;/span&gt;     &lt;span class="nv"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;msg&lt;/span&gt;           &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;load&lt;/span&gt; &lt;span class="nv"&gt;address&lt;/span&gt; &lt;span class="nv"&gt;of&lt;/span&gt; &lt;span class="s"&gt;"Loop: "&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;              &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="nv"&gt;s&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Loop: "&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;             &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;syscall&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;write&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;svc&lt;/span&gt;     &lt;span class="mi"&gt;0&lt;/span&gt;                  &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;invoke&lt;/span&gt; &lt;span class="nv"&gt;syscall&lt;/span&gt;

    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nf"&gt;Print&lt;/span&gt; &lt;span class="nv"&gt;newline&lt;/span&gt; &lt;span class="nb"&gt;ch&lt;/span&gt;&lt;span class="nv"&gt;aracter&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;             
    &lt;span class="nf"&gt;ldr&lt;/span&gt;     &lt;span class="nv"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;newline&lt;/span&gt;       &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;load&lt;/span&gt; &lt;span class="nv"&gt;address&lt;/span&gt; &lt;span class="nv"&gt;of&lt;/span&gt; &lt;span class="nv"&gt;newline&lt;/span&gt; &lt;span class="nb"&gt;ch&lt;/span&gt;&lt;span class="nv"&gt;aracter&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;              &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;             &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;syscall&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;write&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;svc&lt;/span&gt;     &lt;span class="mi"&gt;0&lt;/span&gt;                  &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;invoke&lt;/span&gt; &lt;span class="nv"&gt;syscall&lt;/span&gt;

    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nf"&gt;Increment&lt;/span&gt; &lt;span class="nv"&gt;loop&lt;/span&gt; &lt;span class="nv"&gt;counter&lt;/span&gt; &lt;span class="nv"&gt;and&lt;/span&gt; &lt;span class="nb"&gt;ch&lt;/span&gt;&lt;span class="nv"&gt;eck&lt;/span&gt; &lt;span class="nv"&gt;condition&lt;/span&gt;
    &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;     &lt;span class="nv"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;        &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;x19&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;x19&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="nf"&gt;cmp&lt;/span&gt;     &lt;span class="nv"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;max&lt;/span&gt;           &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;compare&lt;/span&gt; &lt;span class="nv"&gt;x19&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;max&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;b.ne&lt;/span&gt;    &lt;span class="nv"&gt;loop&lt;/span&gt;               &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;not&lt;/span&gt; &lt;span class="nv"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;continue&lt;/span&gt; &lt;span class="nv"&gt;loop&lt;/span&gt;

    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nf"&gt;Exit&lt;/span&gt; &lt;span class="nv"&gt;program&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;              &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;exit&lt;/span&gt; &lt;span class="nv"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;93&lt;/span&gt;             &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;syscall&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;exit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;93&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;svc&lt;/span&gt;     &lt;span class="mi"&gt;0&lt;/span&gt;                  &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;invoke&lt;/span&gt; &lt;span class="nv"&gt;syscall&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Loop:
Loop:
Loop:
Loop:
Loop:
Loop:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The instructions function similar to &lt;code&gt;6502&lt;/code&gt; where values are loaded in and out of registers, and these values can be compared by references an address. The &lt;code&gt;add&lt;/code&gt; instruction is not found in &lt;code&gt;6502&lt;/code&gt; but exists in &lt;code&gt;aarch64&lt;/code&gt;, where it sums 2 operands and stores it in an address.  Performing addition in &lt;code&gt;6502&lt;/code&gt; is verbose, requiring to track the carry flag, and loading values in and out of memory and the accumulator. &lt;/p&gt;

&lt;h3&gt;
  
  
  Loop with Iteration Number
&lt;/h3&gt;

&lt;p&gt;Next is to print the iteration next to &lt;code&gt;Loop:&lt;/code&gt; (e.g. &lt;code&gt;Loop: 1&lt;/code&gt;). The bolded instructions is what was added to include the iteration number in each loop.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;    &lt;span class="nf"&gt;.section&lt;/span&gt; &lt;span class="nv"&gt;.data&lt;/span&gt;
&lt;span class="nl"&gt;msg:&lt;/span&gt;    &lt;span class="nf"&gt;.ascii&lt;/span&gt; &lt;span class="s"&gt;"Loop: "&lt;/span&gt;        
&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nl"&gt;digit:&lt;/span&gt;  &lt;span class="nf"&gt;.byte&lt;/span&gt; &lt;span class="s"&gt;'0'&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;              &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;placeholder&lt;/span&gt; &lt;span class="nv"&gt;for&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;loop&lt;/span&gt; &lt;span class="nv"&gt;index&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;initialized&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="s"&gt;'0'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nl"&gt;newline:&lt;/span&gt;&lt;span class="nf"&gt;.ascii&lt;/span&gt; &lt;span class="err"&gt;"\&lt;/span&gt;&lt;span class="nv"&gt;n&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;            &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;newline&lt;/span&gt; &lt;span class="nb"&gt;ch&lt;/span&gt;&lt;span class="nv"&gt;aracter&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;.section&lt;/span&gt; &lt;span class="nv"&gt;.text&lt;/span&gt;
    &lt;span class="nf"&gt;.globl&lt;/span&gt; &lt;span class="nv"&gt;_start&lt;/span&gt;

    &lt;span class="nf"&gt;min&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;                    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;loop&lt;/span&gt; &lt;span class="nv"&gt;start&lt;/span&gt; &lt;span class="nv"&gt;index&lt;/span&gt;
    &lt;span class="nf"&gt;max&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;                    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;loop&lt;/span&gt; &lt;span class="nv"&gt;exit&lt;/span&gt; &lt;span class="nv"&gt;condition&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;exclusive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nl"&gt;_start:&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;min&lt;/span&gt;            &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;initialize&lt;/span&gt; &lt;span class="nv"&gt;loop&lt;/span&gt; &lt;span class="nv"&gt;counter&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;x19&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nl"&gt;loop:&lt;/span&gt;
    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nf"&gt;Write&lt;/span&gt; &lt;span class="s"&gt;"Loop: "&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;              &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;file&lt;/span&gt; &lt;span class="nv"&gt;descriptor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;stdout&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;ldr&lt;/span&gt;     &lt;span class="nv"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;msg&lt;/span&gt;           &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;load&lt;/span&gt; &lt;span class="nv"&gt;address&lt;/span&gt; &lt;span class="nv"&gt;of&lt;/span&gt; &lt;span class="s"&gt;"Loop: "&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;              &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="nv"&gt;s&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Loop: "&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;             &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;syscall&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;write&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;svc&lt;/span&gt;     &lt;span class="mi"&gt;0&lt;/span&gt;                  &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;invoke&lt;/span&gt; &lt;span class="nv"&gt;syscall&lt;/span&gt;

    &lt;span class="o"&gt;**//&lt;/span&gt; &lt;span class="nf"&gt;Convert&lt;/span&gt; &lt;span class="nv"&gt;loop&lt;/span&gt; &lt;span class="nv"&gt;index&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;ASCII&lt;/span&gt; &lt;span class="nv"&gt;and&lt;/span&gt; &lt;span class="nv"&gt;print&lt;/span&gt; &lt;span class="nv"&gt;it&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;              
    &lt;span class="nf"&gt;ldr&lt;/span&gt;     &lt;span class="nv"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;di&lt;/span&gt;&lt;span class="nv"&gt;git&lt;/span&gt;         &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;load&lt;/span&gt; &lt;span class="nv"&gt;address&lt;/span&gt; &lt;span class="nv"&gt;of&lt;/span&gt; &lt;span class="nb"&gt;di&lt;/span&gt;&lt;span class="nv"&gt;git&lt;/span&gt; &lt;span class="nv"&gt;buffer&lt;/span&gt;
    &lt;span class="nf"&gt;add&lt;/span&gt;     &lt;span class="nv"&gt;w20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;w19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'0'&lt;/span&gt;      &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;convert&lt;/span&gt; &lt;span class="nv"&gt;loop&lt;/span&gt; &lt;span class="nv"&gt;index&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;ASCII&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0x30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;strb&lt;/span&gt;    &lt;span class="nv"&gt;w20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;          &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;store&lt;/span&gt; &lt;span class="nv"&gt;ASCII&lt;/span&gt; &lt;span class="nb"&gt;ch&lt;/span&gt;&lt;span class="nv"&gt;aracter&lt;/span&gt; &lt;span class="nv"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;buffer&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;              &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;si&lt;/span&gt;&lt;span class="nv"&gt;ngle&lt;/span&gt; &lt;span class="nb"&gt;di&lt;/span&gt;&lt;span class="nv"&gt;git&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;             &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;syscall&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;write&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;svc&lt;/span&gt;     &lt;span class="mi"&gt;0&lt;/span&gt;                  &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;invoke&lt;/span&gt; &lt;span class="nv"&gt;syscall&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;

    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nf"&gt;Print&lt;/span&gt; &lt;span class="nv"&gt;newline&lt;/span&gt; &lt;span class="nb"&gt;ch&lt;/span&gt;&lt;span class="nv"&gt;aracter&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;              
    &lt;span class="nf"&gt;ldr&lt;/span&gt;     &lt;span class="nv"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;newline&lt;/span&gt;       &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;load&lt;/span&gt; &lt;span class="nv"&gt;address&lt;/span&gt; &lt;span class="nv"&gt;of&lt;/span&gt; &lt;span class="nv"&gt;newline&lt;/span&gt; &lt;span class="nb"&gt;ch&lt;/span&gt;&lt;span class="nv"&gt;aracter&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;              &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;             &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;syscall&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;write&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;svc&lt;/span&gt;     &lt;span class="mi"&gt;0&lt;/span&gt;                  &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;invoke&lt;/span&gt; &lt;span class="nv"&gt;syscall&lt;/span&gt;

    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nf"&gt;Increment&lt;/span&gt; &lt;span class="nv"&gt;loop&lt;/span&gt; &lt;span class="nv"&gt;counter&lt;/span&gt; &lt;span class="nv"&gt;and&lt;/span&gt; &lt;span class="nb"&gt;ch&lt;/span&gt;&lt;span class="nv"&gt;eck&lt;/span&gt; &lt;span class="nv"&gt;condition&lt;/span&gt;
    &lt;span class="nf"&gt;add&lt;/span&gt;     &lt;span class="nv"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;        &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;x19&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;x19&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="nf"&gt;cmp&lt;/span&gt;     &lt;span class="nv"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;max&lt;/span&gt;           &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;compare&lt;/span&gt; &lt;span class="nv"&gt;x19&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;max&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;b.ne&lt;/span&gt;    &lt;span class="nv"&gt;loop&lt;/span&gt;               &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;not&lt;/span&gt; &lt;span class="nv"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;continue&lt;/span&gt; &lt;span class="nv"&gt;loop&lt;/span&gt;

    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nf"&gt;Exit&lt;/span&gt; &lt;span class="nv"&gt;program&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;              &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;exit&lt;/span&gt; &lt;span class="nv"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;success&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;93&lt;/span&gt;             &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;syscall&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;exit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;93&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;svc&lt;/span&gt;     &lt;span class="mi"&gt;0&lt;/span&gt;                  &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;Invoke&lt;/span&gt; &lt;span class="nv"&gt;syscall&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Loop: 0
Loop: 1
Loop: 2
Loop: 3
Loop: 4
Loop: 5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;add&lt;/code&gt; converts the current iteration (in &lt;code&gt;w19&lt;/code&gt;) into its respective ASCII value to be printed in the console. It does this by adding the numerical value to &lt;code&gt;0x30&lt;/code&gt; (adding to &lt;code&gt;0x30&lt;/code&gt; acts as an offset when converting to ASCII) then storing the ASCII value in register &lt;code&gt;w20&lt;/code&gt;. &lt;code&gt;digit&lt;/code&gt; is updated with the the value in &lt;code&gt;w20&lt;/code&gt; with &lt;code&gt;strb w20, [x1]&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Loop to 32
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;    &lt;span class="nf"&gt;.section&lt;/span&gt; &lt;span class="nv"&gt;.data&lt;/span&gt;
&lt;span class="nl"&gt;msg:&lt;/span&gt;    &lt;span class="nf"&gt;.ascii&lt;/span&gt; &lt;span class="s"&gt;"Loop: "&lt;/span&gt;          
&lt;span class="nl"&gt;digits:&lt;/span&gt; &lt;span class="nf"&gt;.ascii&lt;/span&gt; &lt;span class="s"&gt;"00"&lt;/span&gt;             &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;Buffer&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;hold&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;di&lt;/span&gt;&lt;span class="nv"&gt;git&lt;/span&gt; &lt;span class="nv"&gt;number&lt;/span&gt;
&lt;span class="nl"&gt;newline:&lt;/span&gt;&lt;span class="nf"&gt;.ascii&lt;/span&gt; &lt;span class="err"&gt;"\&lt;/span&gt;&lt;span class="nv"&gt;n&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;             

    &lt;span class="nf"&gt;.section&lt;/span&gt; &lt;span class="nv"&gt;.text&lt;/span&gt;
    &lt;span class="nf"&gt;.globl&lt;/span&gt; &lt;span class="nv"&gt;_start&lt;/span&gt;

    &lt;span class="nf"&gt;min&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;                      
    &lt;span class="nf"&gt;max&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;33&lt;/span&gt;                     

&lt;span class="nl"&gt;_start:&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;min&lt;/span&gt;             

&lt;span class="nl"&gt;loop:&lt;/span&gt;
    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nf"&gt;Write&lt;/span&gt; &lt;span class="s"&gt;"Loop: "&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;                &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;file&lt;/span&gt; &lt;span class="nv"&gt;descriptor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;stdout&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;ldr&lt;/span&gt;     &lt;span class="nv"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;msg&lt;/span&gt;             &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;load&lt;/span&gt; &lt;span class="nv"&gt;address&lt;/span&gt; &lt;span class="nv"&gt;of&lt;/span&gt; &lt;span class="s"&gt;"Loop: "&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;                &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="nv"&gt;s&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;               &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;syscall&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;write&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;svc&lt;/span&gt;     &lt;span class="mi"&gt;0&lt;/span&gt;                    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;invoke&lt;/span&gt; &lt;span class="nv"&gt;syscall&lt;/span&gt;

    &lt;span class="o"&gt;**//&lt;/span&gt; &lt;span class="nf"&gt;Convert&lt;/span&gt; &lt;span class="nv"&gt;x19&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;di&lt;/span&gt;&lt;span class="nv"&gt;git&lt;/span&gt; &lt;span class="nv"&gt;ASCII&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;x19&lt;/span&gt;             &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;copy&lt;/span&gt; &lt;span class="nv"&gt;loop&lt;/span&gt; &lt;span class="nv"&gt;counter&lt;/span&gt;

    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nf"&gt;Divide&lt;/span&gt; &lt;span class="nv"&gt;by&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;extract&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;tens&lt;/span&gt; &lt;span class="nb"&gt;di&lt;/span&gt;&lt;span class="nv"&gt;git&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
    &lt;span class="nf"&gt;udiv&lt;/span&gt;    &lt;span class="nv"&gt;x22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;x20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;x21&lt;/span&gt;        &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;x22&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;quotient&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;tens&lt;/span&gt; &lt;span class="nv"&gt;place&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;msub&lt;/span&gt;    &lt;span class="nv"&gt;x23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;x22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;x21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;x20&lt;/span&gt;   &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;x23&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;remainder&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;ones&lt;/span&gt; &lt;span class="nv"&gt;place&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;add&lt;/span&gt;     &lt;span class="nv"&gt;w22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;w22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'0'&lt;/span&gt;        &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;convert&lt;/span&gt; &lt;span class="nv"&gt;quotient&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;ASCII&lt;/span&gt;
    &lt;span class="nf"&gt;add&lt;/span&gt;     &lt;span class="nv"&gt;w23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;w23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'0'&lt;/span&gt;        &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;convert&lt;/span&gt; &lt;span class="nv"&gt;remainder&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;ASCII&lt;/span&gt;

    &lt;span class="nf"&gt;ldr&lt;/span&gt;     &lt;span class="nv"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;di&lt;/span&gt;&lt;span class="nv"&gt;gits&lt;/span&gt;          &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;load&lt;/span&gt; &lt;span class="nv"&gt;address&lt;/span&gt; &lt;span class="nv"&gt;of&lt;/span&gt; &lt;span class="nb"&gt;di&lt;/span&gt;&lt;span class="nv"&gt;gits&lt;/span&gt; &lt;span class="nv"&gt;buffer&lt;/span&gt;
    &lt;span class="nf"&gt;strb&lt;/span&gt;    &lt;span class="nv"&gt;w22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;            &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;store&lt;/span&gt; &lt;span class="nv"&gt;tens&lt;/span&gt; &lt;span class="nb"&gt;di&lt;/span&gt;&lt;span class="nv"&gt;git&lt;/span&gt;
    &lt;span class="nf"&gt;strb&lt;/span&gt;    &lt;span class="nv"&gt;w23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;         &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;store&lt;/span&gt; &lt;span class="nv"&gt;ones&lt;/span&gt; &lt;span class="nb"&gt;di&lt;/span&gt;&lt;span class="nv"&gt;git&lt;/span&gt;

    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nf"&gt;Write&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;di&lt;/span&gt;&lt;span class="nv"&gt;git&lt;/span&gt; &lt;span class="nv"&gt;number&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;                
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;                &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="nv"&gt;s&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;               &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;syscall&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;write&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;svc&lt;/span&gt;     &lt;span class="mi"&gt;0&lt;/span&gt;                    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;invoke&lt;/span&gt; &lt;span class="nv"&gt;syscall&lt;/span&gt;

    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nf"&gt;Write&lt;/span&gt; &lt;span class="nv"&gt;newline&lt;/span&gt; &lt;span class="nb"&gt;ch&lt;/span&gt;&lt;span class="nv"&gt;aracter&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;                
    &lt;span class="nf"&gt;ldr&lt;/span&gt;     &lt;span class="nv"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;newline&lt;/span&gt;         &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;load&lt;/span&gt; &lt;span class="nv"&gt;address&lt;/span&gt; &lt;span class="nv"&gt;of&lt;/span&gt; &lt;span class="nv"&gt;newline&lt;/span&gt; &lt;span class="nb"&gt;ch&lt;/span&gt;&lt;span class="nv"&gt;aracter&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;                &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;               &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;syscall&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;write&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;svc&lt;/span&gt;     &lt;span class="mi"&gt;0&lt;/span&gt;                    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;invoke&lt;/span&gt; &lt;span class="nv"&gt;syscall&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;

    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nf"&gt;Increment&lt;/span&gt; &lt;span class="nv"&gt;loop&lt;/span&gt; &lt;span class="nv"&gt;counter&lt;/span&gt; &lt;span class="nv"&gt;and&lt;/span&gt; &lt;span class="nb"&gt;ch&lt;/span&gt;&lt;span class="nv"&gt;eck&lt;/span&gt; &lt;span class="nv"&gt;condition&lt;/span&gt;
    &lt;span class="nf"&gt;add&lt;/span&gt;     &lt;span class="nv"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;          &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;x19&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;x19&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="nf"&gt;cmp&lt;/span&gt;     &lt;span class="nv"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;max&lt;/span&gt;             &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;compare&lt;/span&gt; &lt;span class="nv"&gt;x19&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;max&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;b.ne&lt;/span&gt;    &lt;span class="nv"&gt;loop&lt;/span&gt;                 &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;not&lt;/span&gt; &lt;span class="nv"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;continue&lt;/span&gt; &lt;span class="nv"&gt;loop&lt;/span&gt;

    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nf"&gt;Exit&lt;/span&gt; &lt;span class="nv"&gt;program&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;                &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;exit&lt;/span&gt; &lt;span class="nv"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;success&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;93&lt;/span&gt;               &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;syscall&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;exit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;93&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;svc&lt;/span&gt;     &lt;span class="mi"&gt;0&lt;/span&gt;                    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;invoke&lt;/span&gt; &lt;span class="nv"&gt;syscall&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Loop: 00
Loop: 01
Loop: 02
Loop: 03
Loop: 04
Loop: 05
Loop: 06
Loop: 07
Loop: 08
Loop: 09
Loop: 10
Loop: 11
Loop: 12
Loop: 13
Loop: 14
Loop: 15
Loop: 16
Loop: 17
Loop: 18
Loop: 19
Loop: 20
Loop: 21
Loop: 22
Loop: 23
Loop: 24
Loop: 25
Loop: 26
Loop: 27
Loop: 28
Loop: 29
Loop: 30
Loop: 31
Loop: 32
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The addition of &lt;code&gt;udiv&lt;/code&gt; and &lt;code&gt;msub&lt;/code&gt; calculates the &lt;strong&gt;tens&lt;/strong&gt; and &lt;strong&gt;ones&lt;/strong&gt; digits, respectively.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;udiv&lt;/code&gt;, unsigned division, takes our loop counter stored in &lt;code&gt;x20&lt;/code&gt;, and &lt;code&gt;10&lt;/code&gt; stored in &lt;code&gt;x21&lt;/code&gt;, and stores the &lt;strong&gt;quotient&lt;/strong&gt; (tens digit) in &lt;code&gt;x22&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In the first iteration, when &lt;code&gt;x20&lt;/code&gt; (the loop counter) is &lt;code&gt;0&lt;/code&gt;, the operation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;&lt;span class="nf"&gt;udiv&lt;/span&gt; &lt;span class="nv"&gt;x22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;x20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;x21&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Calculates:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;&lt;span class="nf"&gt;x22&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="err"&gt;÷&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;tens&lt;/span&gt; &lt;span class="nb"&gt;di&lt;/span&gt;&lt;span class="nv"&gt;git&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since the quotient is &lt;code&gt;0&lt;/code&gt;, the &lt;strong&gt;tens&lt;/strong&gt; digit remains &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Next, the &lt;code&gt;msub&lt;/code&gt; instruction is used to calculate the &lt;strong&gt;remainder&lt;/strong&gt; (ones digit):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;msub x23, x22, x21, x20
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This performs the following calculation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;&lt;span class="nf"&gt;x23&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;x20&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;x22&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nv"&gt;x21&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="err"&gt;0&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;0&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="err"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="err"&gt;0&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;ones&lt;/span&gt; &lt;span class="nb"&gt;di&lt;/span&gt;&lt;span class="nv"&gt;git&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So, for the first iteration (&lt;code&gt;x20 = 0&lt;/code&gt;), both &lt;code&gt;x22&lt;/code&gt; (tens) and &lt;code&gt;x23&lt;/code&gt; (ones) are &lt;code&gt;0&lt;/code&gt;. &lt;/p&gt;

&lt;h3&gt;
  
  
  Loop to 32 Without Trailing 0’s
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;    &lt;span class="nf"&gt;.section&lt;/span&gt; &lt;span class="nv"&gt;.data&lt;/span&gt;
&lt;span class="nl"&gt;msg:&lt;/span&gt;    &lt;span class="nf"&gt;.ascii&lt;/span&gt; &lt;span class="s"&gt;"Loop: "&lt;/span&gt;          
&lt;span class="nl"&gt;digits:&lt;/span&gt; &lt;span class="nf"&gt;.ascii&lt;/span&gt; &lt;span class="s"&gt;"00"&lt;/span&gt;             &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;buffer&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;hold&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;di&lt;/span&gt;&lt;span class="nv"&gt;git&lt;/span&gt; &lt;span class="nv"&gt;number&lt;/span&gt;
&lt;span class="nl"&gt;newline:&lt;/span&gt;&lt;span class="nf"&gt;.ascii&lt;/span&gt; &lt;span class="err"&gt;"\&lt;/span&gt;&lt;span class="nv"&gt;n&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;             

    &lt;span class="nf"&gt;.section&lt;/span&gt; &lt;span class="nv"&gt;.text&lt;/span&gt;
    &lt;span class="nf"&gt;.globl&lt;/span&gt; &lt;span class="nv"&gt;_start&lt;/span&gt;

    &lt;span class="nf"&gt;min&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;                      
    &lt;span class="nf"&gt;max&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;33&lt;/span&gt;                     

&lt;span class="nl"&gt;_start:&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;min&lt;/span&gt;             &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;initialize&lt;/span&gt; &lt;span class="nv"&gt;loop&lt;/span&gt; &lt;span class="nv"&gt;counter&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;x19&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nl"&gt;loop:&lt;/span&gt;
    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nf"&gt;Write&lt;/span&gt; &lt;span class="s"&gt;"Loop: "&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;                &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;file&lt;/span&gt; &lt;span class="nv"&gt;descriptor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;stdout&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;ldr&lt;/span&gt;     &lt;span class="nv"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;msg&lt;/span&gt;             &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;load&lt;/span&gt; &lt;span class="nv"&gt;address&lt;/span&gt; &lt;span class="nv"&gt;of&lt;/span&gt; &lt;span class="s"&gt;"Loop: "&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;                &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="nv"&gt;s&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;               &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;syscall&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;write&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;svc&lt;/span&gt;     &lt;span class="mi"&gt;0&lt;/span&gt;                    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;invoke&lt;/span&gt; &lt;span class="nv"&gt;syscall&lt;/span&gt;

    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nf"&gt;Convert&lt;/span&gt; &lt;span class="nv"&gt;x19&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;di&lt;/span&gt;&lt;span class="nv"&gt;git&lt;/span&gt; &lt;span class="nv"&gt;ASCII&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;x19&lt;/span&gt;             &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;copy&lt;/span&gt; &lt;span class="nv"&gt;loop&lt;/span&gt; &lt;span class="nv"&gt;counter&lt;/span&gt;

    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nf"&gt;Divide&lt;/span&gt; &lt;span class="nv"&gt;by&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;extract&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;tens&lt;/span&gt; &lt;span class="nb"&gt;di&lt;/span&gt;&lt;span class="nv"&gt;git&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
    &lt;span class="nf"&gt;udiv&lt;/span&gt;    &lt;span class="nv"&gt;x22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;x20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;x21&lt;/span&gt;        &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;x22&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;quotient&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;tens&lt;/span&gt; &lt;span class="nv"&gt;place&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;msub&lt;/span&gt;    &lt;span class="nv"&gt;x23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;x22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;x21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;x20&lt;/span&gt;   &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;x23&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;remainder&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;ones&lt;/span&gt; &lt;span class="nv"&gt;place&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;add&lt;/span&gt;     &lt;span class="nv"&gt;w22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;w22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'0'&lt;/span&gt;        &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;convert&lt;/span&gt; &lt;span class="nv"&gt;quotient&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;ASCII&lt;/span&gt;
    &lt;span class="nf"&gt;add&lt;/span&gt;     &lt;span class="nv"&gt;w23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;w23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'0'&lt;/span&gt;        &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;convert&lt;/span&gt; &lt;span class="nv"&gt;remainder&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;ASCII&lt;/span&gt;

    &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nf"&gt;ldr&lt;/span&gt;     &lt;span class="nv"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;di&lt;/span&gt;&lt;span class="nv"&gt;gits&lt;/span&gt;          &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;load&lt;/span&gt; &lt;span class="nv"&gt;address&lt;/span&gt; &lt;span class="nv"&gt;of&lt;/span&gt; &lt;span class="nb"&gt;di&lt;/span&gt;&lt;span class="nv"&gt;gits&lt;/span&gt; &lt;span class="nv"&gt;buffer&lt;/span&gt;

    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nf"&gt;Handle&lt;/span&gt; &lt;span class="nv"&gt;leading&lt;/span&gt; &lt;span class="nv"&gt;zeros&lt;/span&gt;
    &lt;span class="nf"&gt;cmp&lt;/span&gt;     &lt;span class="nv"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;              &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nb"&gt;ch&lt;/span&gt;&lt;span class="nv"&gt;eck&lt;/span&gt; &lt;span class="nv"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;number&lt;/span&gt; &lt;span class="nv"&gt;is&lt;/span&gt; &lt;span class="nv"&gt;less&lt;/span&gt; &lt;span class="nv"&gt;than&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
    &lt;span class="nf"&gt;blt&lt;/span&gt;     &lt;span class="nv"&gt;print_ones_only&lt;/span&gt;      

    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nf"&gt;Store&lt;/span&gt; &lt;span class="nv"&gt;both&lt;/span&gt; &lt;span class="nb"&gt;di&lt;/span&gt;&lt;span class="nv"&gt;gits&lt;/span&gt;
    &lt;span class="nf"&gt;strb&lt;/span&gt;    &lt;span class="nv"&gt;w22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;            &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;store&lt;/span&gt; &lt;span class="nv"&gt;tens&lt;/span&gt; &lt;span class="nb"&gt;di&lt;/span&gt;&lt;span class="nv"&gt;git&lt;/span&gt;
    &lt;span class="nf"&gt;strb&lt;/span&gt;    &lt;span class="nv"&gt;w23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;         &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;store&lt;/span&gt; &lt;span class="nv"&gt;ones&lt;/span&gt; &lt;span class="nb"&gt;di&lt;/span&gt;&lt;span class="nv"&gt;git&lt;/span&gt;

    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;                &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;file&lt;/span&gt; &lt;span class="nv"&gt;descriptor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;stdout&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;                &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="nv"&gt;s&lt;/span&gt;
    &lt;span class="nf"&gt;b&lt;/span&gt;       &lt;span class="nv"&gt;write_digits&lt;/span&gt;

&lt;span class="nl"&gt;print_ones_only:&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;w22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;' '&lt;/span&gt;             &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nb"&gt;cl&lt;/span&gt;&lt;span class="nv"&gt;ear&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;tens&lt;/span&gt; &lt;span class="nv"&gt;place&lt;/span&gt; &lt;span class="nv"&gt;with&lt;/span&gt; &lt;span class="nv"&gt;a&lt;/span&gt; &lt;span class="nb"&gt;sp&lt;/span&gt;&lt;span class="nv"&gt;ace&lt;/span&gt;
    &lt;span class="nf"&gt;strb&lt;/span&gt;    &lt;span class="nv"&gt;w22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;            &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;store&lt;/span&gt; &lt;span class="nb"&gt;sp&lt;/span&gt;&lt;span class="nv"&gt;ace&lt;/span&gt; &lt;span class="nv"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;tens&lt;/span&gt; &lt;span class="nv"&gt;place&lt;/span&gt;
    &lt;span class="nf"&gt;strb&lt;/span&gt;    &lt;span class="nv"&gt;w23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;         &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;store&lt;/span&gt; &lt;span class="nv"&gt;ones&lt;/span&gt; &lt;span class="nb"&gt;di&lt;/span&gt;&lt;span class="nv"&gt;git&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;                &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;file&lt;/span&gt; &lt;span class="nv"&gt;descriptor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;stdout&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;                &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="nv"&gt;s&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;

&lt;span class="nl"&gt;write_digits:&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;               &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;syscall&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;write&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;svc&lt;/span&gt;     &lt;span class="mi"&gt;0&lt;/span&gt;                    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;invoke&lt;/span&gt; &lt;span class="nv"&gt;syscall&lt;/span&gt;

    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nf"&gt;Write&lt;/span&gt; &lt;span class="nv"&gt;newline&lt;/span&gt; &lt;span class="nb"&gt;ch&lt;/span&gt;&lt;span class="nv"&gt;aracter&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;                
    &lt;span class="nf"&gt;ldr&lt;/span&gt;     &lt;span class="nv"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;newline&lt;/span&gt;         &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;load&lt;/span&gt; &lt;span class="nv"&gt;address&lt;/span&gt; &lt;span class="nv"&gt;of&lt;/span&gt; &lt;span class="nv"&gt;newline&lt;/span&gt; &lt;span class="nb"&gt;ch&lt;/span&gt;&lt;span class="nv"&gt;aracter&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;                &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;               &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;syscall&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;write&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;svc&lt;/span&gt;     &lt;span class="mi"&gt;0&lt;/span&gt;                    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;invoke&lt;/span&gt; &lt;span class="nv"&gt;syscall&lt;/span&gt;

    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nf"&gt;Increment&lt;/span&gt; &lt;span class="nv"&gt;loop&lt;/span&gt; &lt;span class="nv"&gt;counter&lt;/span&gt; &lt;span class="nv"&gt;and&lt;/span&gt; &lt;span class="nb"&gt;ch&lt;/span&gt;&lt;span class="nv"&gt;eck&lt;/span&gt; &lt;span class="nv"&gt;condition&lt;/span&gt;
    &lt;span class="nf"&gt;add&lt;/span&gt;     &lt;span class="nv"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;          &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;x19&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;x19&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="nf"&gt;cmp&lt;/span&gt;     &lt;span class="nv"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;max&lt;/span&gt;             &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;compare&lt;/span&gt; &lt;span class="nv"&gt;x19&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;max&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;b.ne&lt;/span&gt;    &lt;span class="nv"&gt;loop&lt;/span&gt;                 &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;not&lt;/span&gt; &lt;span class="nv"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;continue&lt;/span&gt; &lt;span class="nv"&gt;loop&lt;/span&gt;

    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nf"&gt;Exit&lt;/span&gt; &lt;span class="nv"&gt;program&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;                &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;exit&lt;/span&gt; &lt;span class="nv"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;success&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;93&lt;/span&gt;               &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;syscall&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;exit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;93&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;svc&lt;/span&gt;     &lt;span class="mi"&gt;0&lt;/span&gt;                    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;invoke&lt;/span&gt; &lt;span class="nv"&gt;syscall&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Loop:  0
Loop:  1
Loop:  2
Loop:  3
Loop:  4
Loop:  5
Loop:  6
Loop:  7
Loop:  8
Loop:  9
Loop: 10
Loop: 11
Loop: 12
Loop: 13
Loop: 14
Loop: 15
Loop: 16
Loop: 17
Loop: 18
Loop: 19
Loop: 20
Loop: 21
Loop: 22
Loop: 23
Loop: 24
Loop: 25
Loop: 26
Loop: 27
Loop: 28
Loop: 29
Loop: 30
Loop: 31
Loop: 32
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the iteration is greater or equal to 10, the loop is the same otherwise, it will branch to &lt;code&gt;print_ones_only&lt;/code&gt; via &lt;code&gt;blt&lt;/code&gt;, where it will clear out the memory storing the tens values, then load the empty tens value followed by the ones value into &lt;code&gt;digit&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Looping to 32 with Hex Values
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;    &lt;span class="nf"&gt;.section&lt;/span&gt; &lt;span class="nv"&gt;.data&lt;/span&gt;
&lt;span class="nl"&gt;msg:&lt;/span&gt;    &lt;span class="nf"&gt;.ascii&lt;/span&gt; &lt;span class="s"&gt;"Loop: "&lt;/span&gt;          
&lt;span class="nl"&gt;digits:&lt;/span&gt; &lt;span class="nf"&gt;.ascii&lt;/span&gt; &lt;span class="s"&gt;"00"&lt;/span&gt;             
&lt;span class="nl"&gt;newline:&lt;/span&gt;&lt;span class="nf"&gt;.ascii&lt;/span&gt; &lt;span class="err"&gt;"\&lt;/span&gt;&lt;span class="nv"&gt;n&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;             

    &lt;span class="nf"&gt;.section&lt;/span&gt; &lt;span class="nv"&gt;.text&lt;/span&gt;
    &lt;span class="nf"&gt;.globl&lt;/span&gt; &lt;span class="nv"&gt;_start&lt;/span&gt;

    &lt;span class="nf"&gt;min&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;                      
    &lt;span class="nf"&gt;max&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;33&lt;/span&gt;                     

&lt;span class="nl"&gt;_start:&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;min&lt;/span&gt;              

&lt;span class="nl"&gt;loop:&lt;/span&gt;
    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nf"&gt;Write&lt;/span&gt; &lt;span class="s"&gt;"Loop: "&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;                &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;file&lt;/span&gt; &lt;span class="nv"&gt;descriptor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;stdout&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;ldr&lt;/span&gt;     &lt;span class="nv"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;msg&lt;/span&gt;             &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;load&lt;/span&gt; &lt;span class="nv"&gt;address&lt;/span&gt; &lt;span class="nv"&gt;of&lt;/span&gt; &lt;span class="s"&gt;"Loop: "&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;                &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="nv"&gt;s&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;               &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;syscall&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;write&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;svc&lt;/span&gt;     &lt;span class="mi"&gt;0&lt;/span&gt;                    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;invoke&lt;/span&gt; &lt;span class="nv"&gt;syscall&lt;/span&gt;

    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nf"&gt;Convert&lt;/span&gt; &lt;span class="nv"&gt;x19&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;di&lt;/span&gt;&lt;span class="nv"&gt;git&lt;/span&gt; &lt;span class="nv"&gt;hexadecimal&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;x19&lt;/span&gt;             &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;copy&lt;/span&gt; &lt;span class="nv"&gt;loop&lt;/span&gt; &lt;span class="nv"&gt;counter&lt;/span&gt;

    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nf"&gt;Get&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;hexadecimal&lt;/span&gt; &lt;span class="nv"&gt;value&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;              &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;hexadecimal&lt;/span&gt; &lt;span class="nv"&gt;base&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;udiv&lt;/span&gt;    &lt;span class="nv"&gt;x22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;x20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;x21&lt;/span&gt;        &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;x22&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;quotient&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;tens&lt;/span&gt; &lt;span class="nv"&gt;place&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;msub&lt;/span&gt;    &lt;span class="nv"&gt;x23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;x22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;x21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;x20&lt;/span&gt;   &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;x23&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;remainder&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;ones&lt;/span&gt; &lt;span class="nv"&gt;place&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="o"&gt;**//&lt;/span&gt; &lt;span class="nf"&gt;Convert&lt;/span&gt; &lt;span class="nv"&gt;quotient&lt;/span&gt; &lt;span class="nv"&gt;and&lt;/span&gt; &lt;span class="nv"&gt;remainder&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;ASCII&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;hex&lt;/span&gt; &lt;span class="nb"&gt;di&lt;/span&gt;&lt;span class="nv"&gt;gits&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;add&lt;/span&gt;     &lt;span class="nv"&gt;w22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;w22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'0'&lt;/span&gt;        &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;convert&lt;/span&gt; &lt;span class="nv"&gt;quotient&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;ASCII&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt; &lt;span class="nv"&gt;or&lt;/span&gt; &lt;span class="nv"&gt;A&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;F&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;add&lt;/span&gt;     &lt;span class="nv"&gt;w23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;w23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'0'&lt;/span&gt;        &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;convert&lt;/span&gt; &lt;span class="nv"&gt;remainder&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="nv"&gt;ASCII&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt; &lt;span class="nv"&gt;or&lt;/span&gt; &lt;span class="nv"&gt;A&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;F&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;cmp&lt;/span&gt;     &lt;span class="nv"&gt;w22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'9'&lt;/span&gt;             &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nb"&gt;ch&lt;/span&gt;&lt;span class="nv"&gt;eck&lt;/span&gt; &lt;span class="nv"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;quotient&lt;/span&gt; &lt;span class="nv"&gt;is&lt;/span&gt; &lt;span class="nv"&gt;greater&lt;/span&gt; &lt;span class="nv"&gt;than&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;A&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;F&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;ble&lt;/span&gt;     &lt;span class="nv"&gt;no_hex_conversion&lt;/span&gt;    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;less&lt;/span&gt; &lt;span class="nv"&gt;than&lt;/span&gt; &lt;span class="nv"&gt;or&lt;/span&gt; &lt;span class="nv"&gt;equal&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="s"&gt;'9'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;skip&lt;/span&gt;
    &lt;span class="nf"&gt;add&lt;/span&gt;     &lt;span class="nv"&gt;w22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;w22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;          &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;convert&lt;/span&gt; &lt;span class="s"&gt;'A'&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="s"&gt;'F'&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nl"&gt;no_hex_conversion:&lt;/span&gt;
    &lt;span class="nf"&gt;cmp&lt;/span&gt;     &lt;span class="nv"&gt;w23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'9'&lt;/span&gt;             &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nb"&gt;ch&lt;/span&gt;&lt;span class="nv"&gt;eck&lt;/span&gt; &lt;span class="nv"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;remainder&lt;/span&gt; &lt;span class="nv"&gt;is&lt;/span&gt; &lt;span class="nv"&gt;greater&lt;/span&gt; &lt;span class="nv"&gt;than&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;A&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;F&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;ble&lt;/span&gt;     &lt;span class="nv"&gt;no_hex_conversion_2&lt;/span&gt;  &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;less&lt;/span&gt; &lt;span class="nv"&gt;than&lt;/span&gt; &lt;span class="nv"&gt;or&lt;/span&gt; &lt;span class="nv"&gt;equal&lt;/span&gt; &lt;span class="nv"&gt;to&lt;/span&gt; &lt;span class="s"&gt;'9'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;skip&lt;/span&gt;
    &lt;span class="nf"&gt;add&lt;/span&gt;     &lt;span class="nv"&gt;w23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;w23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;          &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;convert&lt;/span&gt; &lt;span class="s"&gt;'A'&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="s"&gt;'F'&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nl"&gt;no_hex_conversion_2:&lt;/span&gt;
    &lt;span class="nf"&gt;ldr&lt;/span&gt;     &lt;span class="nv"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;di&lt;/span&gt;&lt;span class="nv"&gt;gits&lt;/span&gt;          &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;load&lt;/span&gt; &lt;span class="nv"&gt;address&lt;/span&gt; &lt;span class="nv"&gt;of&lt;/span&gt; &lt;span class="nb"&gt;di&lt;/span&gt;&lt;span class="nv"&gt;gits&lt;/span&gt; &lt;span class="nv"&gt;buffer&lt;/span&gt;

    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nf"&gt;Store&lt;/span&gt; &lt;span class="nv"&gt;both&lt;/span&gt; &lt;span class="nb"&gt;di&lt;/span&gt;&lt;span class="nv"&gt;gits&lt;/span&gt;
    &lt;span class="nf"&gt;strb&lt;/span&gt;    &lt;span class="nv"&gt;w22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;            &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;store&lt;/span&gt; &lt;span class="nv"&gt;quotient&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;tens&lt;/span&gt; &lt;span class="nv"&gt;place&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;strb&lt;/span&gt;    &lt;span class="nv"&gt;w23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;         &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;store&lt;/span&gt; &lt;span class="nv"&gt;remainder&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;ones&lt;/span&gt; &lt;span class="nv"&gt;place&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;                &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;file&lt;/span&gt; &lt;span class="nv"&gt;descriptor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;stdout&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;                &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="nv"&gt;s&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;
    &lt;span class="nf"&gt;b&lt;/span&gt;       &lt;span class="nv"&gt;write_digits&lt;/span&gt;

&lt;span class="nl"&gt;print_ones_only:&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;w22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;' '&lt;/span&gt;             &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nb"&gt;cl&lt;/span&gt;&lt;span class="nv"&gt;ear&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;tens&lt;/span&gt; &lt;span class="nv"&gt;place&lt;/span&gt; &lt;span class="nv"&gt;with&lt;/span&gt; &lt;span class="nv"&gt;a&lt;/span&gt; &lt;span class="nb"&gt;sp&lt;/span&gt;&lt;span class="nv"&gt;ace&lt;/span&gt;
    &lt;span class="nf"&gt;strb&lt;/span&gt;    &lt;span class="nv"&gt;w22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;            &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;store&lt;/span&gt; &lt;span class="nb"&gt;sp&lt;/span&gt;&lt;span class="nv"&gt;ace&lt;/span&gt; &lt;span class="nv"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;the&lt;/span&gt; &lt;span class="nv"&gt;tens&lt;/span&gt; &lt;span class="nv"&gt;place&lt;/span&gt;
    &lt;span class="nf"&gt;strb&lt;/span&gt;    &lt;span class="nv"&gt;w23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;         &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;store&lt;/span&gt; &lt;span class="nv"&gt;ones&lt;/span&gt; &lt;span class="nb"&gt;di&lt;/span&gt;&lt;span class="nv"&gt;git&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;                &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;file&lt;/span&gt; &lt;span class="nv"&gt;descriptor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;stdout&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;                &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="nv"&gt;s&lt;/span&gt;

&lt;span class="nl"&gt;write_digits:&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;               &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;syscall&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;write&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;svc&lt;/span&gt;     &lt;span class="mi"&gt;0&lt;/span&gt;                    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;invoke&lt;/span&gt; &lt;span class="nv"&gt;syscall&lt;/span&gt;

    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nf"&gt;Write&lt;/span&gt; &lt;span class="nv"&gt;newline&lt;/span&gt; &lt;span class="nb"&gt;ch&lt;/span&gt;&lt;span class="nv"&gt;aracter&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;                
    &lt;span class="nf"&gt;ldr&lt;/span&gt;     &lt;span class="nv"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;newline&lt;/span&gt;         &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;load&lt;/span&gt; &lt;span class="nv"&gt;address&lt;/span&gt; &lt;span class="nv"&gt;of&lt;/span&gt; &lt;span class="nv"&gt;newline&lt;/span&gt; &lt;span class="nb"&gt;ch&lt;/span&gt;&lt;span class="nv"&gt;aracter&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;                &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;               &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;syscall&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;write&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;svc&lt;/span&gt;     &lt;span class="mi"&gt;0&lt;/span&gt;                    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;invoke&lt;/span&gt; &lt;span class="nv"&gt;syscall&lt;/span&gt;

    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nf"&gt;Increment&lt;/span&gt; &lt;span class="nv"&gt;loop&lt;/span&gt; &lt;span class="nv"&gt;counter&lt;/span&gt; &lt;span class="nv"&gt;and&lt;/span&gt; &lt;span class="nb"&gt;ch&lt;/span&gt;&lt;span class="nv"&gt;eck&lt;/span&gt; &lt;span class="nv"&gt;condition&lt;/span&gt;
    &lt;span class="nf"&gt;add&lt;/span&gt;     &lt;span class="nv"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;          &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;x19&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;x19&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="nf"&gt;cmp&lt;/span&gt;     &lt;span class="nv"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;max&lt;/span&gt;             
    &lt;span class="nf"&gt;b.ne&lt;/span&gt;    &lt;span class="nv"&gt;loop&lt;/span&gt;                 &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;not&lt;/span&gt; &lt;span class="nv"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;continue&lt;/span&gt; &lt;span class="nv"&gt;loop&lt;/span&gt;

    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nf"&gt;Exit&lt;/span&gt; &lt;span class="nv"&gt;program&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;                &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;exit&lt;/span&gt; &lt;span class="nv"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;success&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;mov&lt;/span&gt;     &lt;span class="nv"&gt;x8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;93&lt;/span&gt;               &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;syscall&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;exit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;93&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;svc&lt;/span&gt;     &lt;span class="mi"&gt;0&lt;/span&gt;                    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="nv"&gt;invoke&lt;/span&gt; &lt;span class="nv"&gt;syscall&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The usual conversion to ASCII determines whether or not the tens and or ones need to offset to display its hexadecimal equivalent. Specially, &lt;strong&gt;&lt;code&gt;cmp     w22, '9'&lt;/code&gt; and &lt;code&gt;ble     no_hex_conversion&lt;/code&gt;&lt;/strong&gt; check if the tens is below 9, branching to &lt;code&gt;no_hex_conversion&lt;/code&gt; where it checks if the ones need conversion. &lt;/p&gt;

&lt;p&gt;The conversion to hexadecimal is adding an offset of 7 to its correspondent numerical value - resulting in a value between A-F.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Loop: 00
Loop: 01
Loop: 02
Loop: 03
Loop: 04
Loop: 05
Loop: 06
Loop: 07
Loop: 08
Loop: 09
Loop: 0A
Loop: 0B
Loop: 0C
Loop: 0D
Loop: 0E
Loop: 0F
Loop: 10
Loop: 11
Loop: 12
Loop: 13
Loop: 14
Loop: 15
Loop: 16
Loop: 17
Loop: 18
Loop: 19
Loop: 1A
Loop: 1B
Loop: 1C
Loop: 1D
Loop: 1E
Loop: 1F
Loop: 20
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;code&gt;x86&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;The same approach was taken with &lt;code&gt;x86&lt;/code&gt; for each loop, &lt;a href="https://github.com/JP-sDEV/spo600/tree/main/l5" rel="noopener noreferrer"&gt;Link to GitHub&lt;/a&gt; containing both &lt;code&gt;x86&lt;/code&gt; and &lt;code&gt;aarch64&lt;/code&gt; implementations. &lt;/p&gt;

&lt;h1&gt;
  
  
  Results
&lt;/h1&gt;

&lt;p&gt;The history of each architecture plays a role on how the data is handled. &lt;code&gt;x86&lt;/code&gt; was first introduced in 1978 with the Intel 8086 as a 16-bit processor (&lt;a href="https://en.wikipedia.org/wiki/X86" rel="noopener noreferrer"&gt;Source&lt;/a&gt;). &lt;code&gt;x86-64&lt;/code&gt; is also backwards compatible, meaning that 64 bit processor should work on 32 bit programs but not 16 bit programs directly. &lt;code&gt;aarch64&lt;/code&gt; is relatively new, first introduced in 2011 as part of the ARMv8 architecture (&lt;a href="https://en.wikipedia.org/wiki/ARM_architecture_family" rel="noopener noreferrer"&gt;Source&lt;/a&gt;). As we have seen, it uses RISC (Reduced Instruction Set Computer) design with a fixed 32-bit instruction size. While &lt;code&gt;x86-64&lt;/code&gt; prioritizes &lt;strong&gt;backward compatibility&lt;/strong&gt;, &lt;code&gt;aarch64&lt;/code&gt; maintains a cleaner instruction set and may support 32-bit ARM code on some hardware, though newer devices are 64-bit only.&lt;/p&gt;

&lt;p&gt;These design differences can be seen in how the iteration number is converted into its hexadecimal value. &lt;/p&gt;

&lt;h3&gt;
  
  
  Extracting Tens and Ones
&lt;/h3&gt;

&lt;p&gt;In x86, it handles the data in &lt;strong&gt;nibbles&lt;/strong&gt; (4 bits), where it holds the tens and ones. The instruction &lt;code&gt;shr rax, 4&lt;/code&gt; shifts the value right by 4 bits to isolate the &lt;strong&gt;high nibble&lt;/strong&gt; (tens place) in the lower 4 bits of the register. The instruction &lt;code&gt;and al, 0x0F&lt;/code&gt; performs a bitwise AND operation to isolate the &lt;strong&gt;low nibble&lt;/strong&gt; (ones place) by masking out the upper 4 bits.&lt;/p&gt;

&lt;p&gt;In &lt;code&gt;aarch64&lt;/code&gt;, the values are handled using arithmetic operations like &lt;strong&gt;&lt;code&gt;udiv&lt;/code&gt;&lt;/strong&gt; (for division) and &lt;strong&gt;&lt;code&gt;msub&lt;/code&gt;&lt;/strong&gt; (for remainder), which extract the tens and ones values directly. In contrast, &lt;code&gt;x86&lt;/code&gt; uses bitwise operations such as &lt;strong&gt;&lt;code&gt;shr&lt;/code&gt;&lt;/strong&gt; (shift right) and &lt;strong&gt;&lt;code&gt;and&lt;/code&gt;&lt;/strong&gt; (masking) to extract the tens and ones values by manipulating individual bits and nibbles.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;Each architecture produces the same result for each loop but their approaches differ. The history and design choices of each architecture partly explain why. &lt;code&gt;aarch64&lt;/code&gt; simplifies the complex operations of multiplication and division whereas &lt;code&gt;x86&lt;/code&gt; is quite verbose. The level of verbosity in &lt;code&gt;x86&lt;/code&gt; however does boost its performance because of direct management of bits with bitwise manipulation, and shifting - allowing for optimizations where possible.&lt;/p&gt;

</description>
      <category>spo600</category>
      <category>aarch64</category>
      <category>x86</category>
      <category>assembly</category>
    </item>
    <item>
      <title>SPO600 Lab 4 - x86 GCC vs aarch64 GCC</title>
      <dc:creator>JP </dc:creator>
      <pubDate>Mon, 03 Mar 2025 16:36:44 +0000</pubDate>
      <link>https://dev.to/jpjpjp/spo600-lab-4-x86-gcc-vs-aarch64-gcc-5f12</link>
      <guid>https://dev.to/jpjpjp/spo600-lab-4-x86-gcc-vs-aarch64-gcc-5f12</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Processors can differ in their design (i.e. architecture) to satisfy different requirements. One of the most oldest and well known architectures is &lt;code&gt;x86&lt;/code&gt;, introduced in 1978 by Intel, is optimized for performance in desktops and servers with the cost of high power consumption (&lt;a href="https://www.redhat.com/en/topics/linux/ARM-vs-x86" rel="noopener noreferrer"&gt;Source&lt;/a&gt;, &lt;a href="https://www.redhat.com/en/topics/linux/ARM-vs-x86" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://www.techtarget.com/whatis/definition/x86-64" rel="noopener noreferrer"&gt;Source 2&lt;/a&gt;). &lt;/p&gt;

&lt;p&gt;In 2020, Apple released their first in-house processor the M-Series processors (&lt;a href="https://en.wikipedia.org/wiki/Apple_M1" rel="noopener noreferrer"&gt;Source&lt;/a&gt;). The processor is based off the &lt;code&gt;aarch64&lt;/code&gt; architecture with the goal of being more energy efficient compared to &lt;code&gt;x86&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Each architecture has their own unique set of instructions. Therefore instructions for &lt;code&gt;x86&lt;/code&gt; won’t work on &lt;code&gt;aarch64&lt;/code&gt; and vice versa. When programming either low level (e.g. C, C++), or high level languages (e.g. Python, JavaScript) both need to go through a compiler - where the source code is translated into machine code specific to the architecture it is being compiled on. &lt;/p&gt;

&lt;p&gt;Here’s a table of popular programming languages with their associated compiler:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Programming Language&lt;/th&gt;
&lt;th&gt;Compiler&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;GCC, Clang&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C++&lt;/td&gt;
&lt;td&gt;G++, Clang++&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;CPython, PyPy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;V8&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;GCC&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;GCC&lt;/code&gt; is an open-source &lt;code&gt;C&lt;/code&gt; compiler, part of the GNU Compiler Collection. An advantage of &lt;code&gt;GCC&lt;/code&gt; is its extensive portability, as it can be compiled for a wide range of popular, and emerging architectures. &lt;a href="https://en.wikipedia.org/wiki/GNU_Compiler_Collection#Architectures" rel="noopener noreferrer"&gt;List of supported architectures&lt;/a&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  Lab 4
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;GCC&lt;/code&gt; can be ported and used on &lt;code&gt;x86&lt;/code&gt; and &lt;code&gt;aarch64&lt;/code&gt; architectures. Having access to both architectures, the &lt;code&gt;GCC&lt;/code&gt; source code can be cloned via &lt;code&gt;GitHub&lt;/code&gt; and installed locally.&lt;/p&gt;

&lt;h3&gt;
  
  
  Predictions
&lt;/h3&gt;

&lt;p&gt;Given the differences between the &lt;code&gt;x86&lt;/code&gt; and &lt;code&gt;aarch64&lt;/code&gt; architectures, I predict that &lt;code&gt;x86&lt;/code&gt; will compile &lt;code&gt;GCC&lt;/code&gt; quicker than &lt;code&gt;aarch64&lt;/code&gt;. &lt;/p&gt;

&lt;h3&gt;
  
  
  Possible Issues
&lt;/h3&gt;

&lt;p&gt;A factor that contributes to a quicker compile time is the amount of RAM, the &lt;code&gt;x86&lt;/code&gt; system has 64GB of RAM whereas the &lt;code&gt;aarch64&lt;/code&gt; system only has 32GB - this issue can limit how much physical RAM can be utilized and force memory swaps (i.e. moving data between RAM and the hard drive). &lt;/p&gt;

&lt;p&gt;The servers being used to compile &lt;code&gt;GCC&lt;/code&gt; are also shared. Therefore, depending when compiling occurs, the resources can be limited and also effect the compile times. &lt;/p&gt;

&lt;h2&gt;
  
  
  Setup
&lt;/h2&gt;

&lt;p&gt;The setup will be the same between systems. It’s possible to have multiple instances of &lt;code&gt;GCC&lt;/code&gt; on a single machine - to differentiate each &lt;code&gt;GCC&lt;/code&gt; build, a dedicated directory is created and a subdirectory is dedicated for the source code and another for the build. After building &lt;code&gt;GCC&lt;/code&gt; we could specify which &lt;code&gt;gcc&lt;/code&gt; to use to compile a &lt;code&gt;C&lt;/code&gt; program. &lt;/p&gt;

&lt;p&gt;The following steps will guide you on how to get the &lt;code&gt;GCC&lt;/code&gt; source code to building and compiling a  &lt;code&gt;C&lt;/code&gt; program using the newly installed &lt;code&gt;GCC&lt;/code&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Create and &lt;code&gt;cd&lt;/code&gt; into the source code directory&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/gcc-dev &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; ~/gcc-dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Clone the &lt;code&gt;GCC&lt;/code&gt; source code&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://gcc.gnu.org/git/gcc.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create and &lt;code&gt;cd&lt;/code&gt; into the build folder, this is where the &lt;code&gt;GCC&lt;/code&gt; build will happen&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ..
&lt;span class="nb"&gt;mkdir &lt;/span&gt;build-gcc
&lt;span class="nb"&gt;cd &lt;/span&gt;build-gcc
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Get the requirements needed to compile &lt;code&gt;GCC&lt;/code&gt; for the system architecture&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;../gcc/configure &lt;span class="nt"&gt;--prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;/gcc-build-x86-001/install &lt;span class="nt"&gt;--enable-languages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;c,c++ &lt;span class="nt"&gt;--disable-multilib&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Build &lt;code&gt;GCC&lt;/code&gt; via the &lt;code&gt;Makefile&lt;/code&gt; and use &lt;code&gt;time&lt;/code&gt; to log the runtime into &lt;code&gt;build.log&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;time &lt;/span&gt;make &lt;span class="nt"&gt;-j&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;nproc&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; 2&amp;gt;&amp;amp;1 | &lt;span class="nb"&gt;tee &lt;/span&gt;build.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Verify &lt;code&gt;GCC&lt;/code&gt; Compilation
&lt;/h3&gt;

&lt;p&gt;We’ll check the version of the installed &lt;code&gt;GCC&lt;/code&gt; compiler and compile &lt;code&gt;test.c&lt;/code&gt; that prints out “Hello World” to the console.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello, World!&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;aarch64&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;japablo@aarch64-002 l4]&lt;span class="nv"&gt;$ $HOME&lt;/span&gt;/gcc-build-x86-001/install/bin/gcc &lt;span class="nt"&gt;--version&lt;/span&gt;
gcc &lt;span class="o"&gt;(&lt;/span&gt;GCC&lt;span class="o"&gt;)&lt;/span&gt; 15.0.1 20250224 &lt;span class="o"&gt;(&lt;/span&gt;experimental&lt;span class="o"&gt;)&lt;/span&gt;
Copyright &lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt; 2025 Free Software Foundation, Inc.
This is free software&lt;span class="p"&gt;;&lt;/span&gt; see the &lt;span class="nb"&gt;source &lt;/span&gt;&lt;span class="k"&gt;for &lt;/span&gt;copying conditions.  There is NO
warranty&lt;span class="p"&gt;;&lt;/span&gt; not even &lt;span class="k"&gt;for &lt;/span&gt;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

&lt;span class="o"&gt;[&lt;/span&gt;japablo@aarch64-002 l4]&lt;span class="nv"&gt;$ $HOME&lt;/span&gt;/gcc-build-x86-001/install/bin/gcc test.c &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;japablo@aarch64-002 l4]&lt;span class="nv"&gt;$ &lt;/span&gt;./test
Hello, World!

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;x86&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;japablo@x86-001:~/gcc-dev/build-gcc&lt;span class="nv"&gt;$ $HOME&lt;/span&gt;/gcc-build-x86-001/install/bin/gcc &lt;span class="nt"&gt;--version&lt;/span&gt;
gcc &lt;span class="o"&gt;(&lt;/span&gt;GCC&lt;span class="o"&gt;)&lt;/span&gt; 15.0.1 20250224 &lt;span class="o"&gt;(&lt;/span&gt;experimental&lt;span class="o"&gt;)&lt;/span&gt;
Copyright &lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt; 2025 Free Software Foundation, Inc.
This is free software&lt;span class="p"&gt;;&lt;/span&gt; see the &lt;span class="nb"&gt;source &lt;/span&gt;&lt;span class="k"&gt;for &lt;/span&gt;copying conditions.  There is NO
warranty&lt;span class="p"&gt;;&lt;/span&gt; not even &lt;span class="k"&gt;for &lt;/span&gt;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

japablo@x86-001:~/l4&lt;span class="nv"&gt;$ $HOME&lt;/span&gt;/gcc-build-x86-001/install/bin/gcc test.c &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nb"&gt;test
&lt;/span&gt;japablo@x86-001:~/l4&lt;span class="nv"&gt;$ &lt;/span&gt;./test
Hello, World!

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;p&gt;It was hypothesized that the &lt;code&gt;x86&lt;/code&gt; system would finish quicker than &lt;code&gt;aarch64&lt;/code&gt; because of faster clock speeds.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# x86 &lt;/span&gt;
&lt;span class="k"&gt;**&lt;/span&gt;real  34m44.825s&lt;span class="k"&gt;**&lt;/span&gt;
user    385m35.938s
sys 13m4.008s

&lt;span class="c"&gt;# aarch64&lt;/span&gt;
&lt;span class="k"&gt;**&lt;/span&gt;real  107m55.004s&lt;span class="k"&gt;**&lt;/span&gt;
user    998m11.630s
sys 31m39.209s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For &lt;code&gt;aarch64&lt;/code&gt; system, it is said to compile &lt;code&gt;gcc&lt;/code&gt; in approximately 100 min according to the system description &lt;a href="http://spo600.cdot.systems/doku.php?id=spo600:spo600_servers" rel="noopener noreferrer"&gt;here&lt;/a&gt;. The resulting &lt;code&gt;aarch64&lt;/code&gt; did take approximately 7 minutes longer than expected.&lt;/p&gt;

</description>
      <category>spo600</category>
      <category>aarch64</category>
      <category>x86</category>
      <category>gcc</category>
    </item>
    <item>
      <title>Lab 3 - Wrapping up 6502 Assembly</title>
      <dc:creator>JP </dc:creator>
      <pubDate>Mon, 10 Feb 2025 20:28:01 +0000</pubDate>
      <link>https://dev.to/jpjpjp/lab-3-wrapping-up-6502-assembly-1j3h</link>
      <guid>https://dev.to/jpjpjp/lab-3-wrapping-up-6502-assembly-1j3h</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;Welcome back! We’ll be concluding the 6502 series by creating a program that covers 3 main topics:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Character output &lt;/li&gt;
&lt;li&gt;Character input &lt;/li&gt;
&lt;li&gt;A form of arithmetic (e.g. add, subtract, bitwise operations, etc.)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I decided to create a “simple” addition calculator. I quote “simple” because adding is on pencil and paper, and in most programming languages goes something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1 + 1 = 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When performing addition on paper, we add the ones, carry the ten (if any), add the tens, etc. Luckily 6502 assembly follows a similar process but with added complexity of memory and bit management. I’ll explain how the addition works along the way. Let’s jump straight into the program! &lt;/p&gt;

&lt;h1&gt;
  
  
  Addition Calculator
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;Here’s the entirety of the code, feel free to use it in the &lt;a href="http://6502.cdot.systems/" rel="noopener noreferrer"&gt;6502 emulator&lt;/a&gt;. Don’t worry, I’ll explain how it works in the following sections! &lt;/p&gt;

&lt;p&gt;Note: the character in and out sections of the code were taken from SPO600 week 4 class demonstration and can be found &lt;a href="http://spo600.cdot.systems/doku.php?id=spo600:start" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;; Predefined ROM Routines, found in their respective addresses
define SCINIT  $ff81 
define CHRIN   $ffcf
define CHROUT  $ffd2
define SCREEN  $ffed
define PLOT    $fff0

; Zero page memory locations
define INPUT1  $0010
define INPUT2  $0011
define RESULT  $0012

; ASCII Character constants
define BACKSPACE $08  
define ENTER     $0D  
define SPACE     $20
define BLACK     $A0
define LEFT      $83

; CODE TO TEST INPUT
START:
    JSR SCINIT  ; Initialize screen
    LDY #$00    ; Index for first number
    LDX #$00    ; Index for second number

; Display the initial message only once
LOOPFIRST:
    LDA PROMPTFIRST,Y
    BEQ GETFIRST
    JSR CHROUT 
    INY
    JMP LOOPFIRST

GETFIRST:
    JSR INPUTFIRST  ; Get first digit
    LDY #$00

LOOPSECOND:
    LDA PROMPTSECOND,Y
    BEQ GETSECOND
    JSR CHROUT
    INY
    JMP LOOPSECOND

GETSECOND:
    JSR INPUTSECOND  ; Get second digit
    LDY #$00

; Convert ASCII to number and add
    LDA INPUT1
    SEC
    SBC #$30   ; Convert ASCII to numerical value
    STA INPUT1 ; Store numerical value

    LDA INPUT2
    SEC
    SBC #$30   ; Convert ASCII to numerical value
    STA INPUT2 ; Store numerical value

    CLC        ; Clear carry flag before addition
    LDA INPUT1
    ADC INPUT2 ; Add the two numbers
    STA RESULT ; Store result

    LDY #$00

LOOPCONFIRM:
    LDA CONFIRM,Y
    BEQ PRINT_RESULT
    JSR CHROUT 
    INY
    JMP LOOPCONFIRM

PRINT_RESULT:
    LDA RESULT        ; Load the result
    CMP #10           ; Check if the result is greater than or equal to 10
    BPL TWO_DIGITS    ; If yes -&amp;gt; handle two digits

    ; Single-digit result
    CLC               ; Clear carry flag before ASCII conversion
    ADC #$30          ; Convert to ASCII
    JSR CHROUT        ; Display the result
    JMP END_PROGRAM

; Handle two-digit result
TWO_DIGITS:
    SEC
    SBC #10           ; Subtract 10 to get the units digit
    PHA               ; Save the units digit
    LDA #$31          ; Load ASCII for '1' (tens digit)
    JSR CHROUT        ; Display the tens digit
    PLA               ; Restore the units digit
    CLC               ; Clear carry flag before ASCII conversion
    ADC #$30          ; Convert to ASCII
    JSR CHROUT        ; Display the units digit

END_PROGRAM:
    BRK  ; End program

; PROMPTS
PROMPTFIRST:
    dcb "S", "P", "O", "6", "0", "0", 32, "L", "a", "b", 32, "3", 32, "-", 32, "A", "d", "d", 32, "2", 32, "N", "u", "m", "b", "e", "r", "s", $0D
    dcb "=", "=", "=", "=", "=", "=", "=", "=", "=", "=", "=", "=", "=", "=", "=", "=", "=", "=", "=", "=", "=", "=", "=", "=", "=", "=", "=", "=", "=", "=", $0D
    dcb "E", "N", "T", "E", "R", 32, "F", "I", "R", "S", "T", 32, "D", "I", "G", "I", "T", 32, "(", "0", "-", "9", ")", ":", 32, $00

PROMPTSECOND:
    dcb $0D, "E", "N", "T", "E", "R", 32, "S", "E", "C", "O", "N", "D", 32, "D", "I", "G", "I", "T", 32, "(", "0", "-", "9", ")", ":", 32, $00

CONFIRM:
    dcb $0D, $0D, "S", "U", "M", ":", 32, $00

; Subroutine to input first number
INPUTFIRST:
    LDY #$00    

GETKEY1: 
    LDA #BLACK           ; Black cursor color
    JSR CHROUT           
    LDA #LEFT            
    JSR CHROUT           

    JSR CHRIN            ; Get character from input
    CMP #$00             ; Check if key pressed
    BEQ GETKEY1          

    CMP #BACKSPACE       ; Check for backspace
    BNE CHECKENTER1      ; If not backspace, proceed

    ; Handle backspace
    CPY #$00             ; If nothing to delete, ignore
    BEQ GETKEY1
    DEY                  ; Move the cursor back by one
    LDA #SPACE           ; Clear the previous character using the SPACE character
    JSR CHROUT           ; Display the space to erase the character
    LDA #LEFT            ; Move cursor back one space
    JSR CHROUT           ; Apply cursor move
    JSR CHROUT           ; Redraw the cursor

    JMP GETKEY1

CHECKENTER1:
    CMP #ENTER
    BEQ CHECKCOUNT1

CHECKLETTER1:
    CMP #$30             ; Check if character is less than '0'
    BMI GETKEY1          ; If less, reject it
    CMP #$3A             ; Check if character is greater than '9' ($39 + 1)
    BPL GETKEY1          ; If greater, reject it

    CPY #$01             ; Check if we already have one digit
    BEQ GETKEY1          ; If yes, reject additional input

    STA INPUT1,Y         ; Store the valid digit
    JSR CHROUT           ; Display the character
    INY
    JMP GETKEY1

CHECKCOUNT1:
    CPY #1               ; Check if we have exactly one digit
    BNE GETKEY1          ; If not, continue waiting
    RTS  

; Subroutine to input second number 
INPUTSECOND:
    LDY #$00  

GETKEY2: 
    LDA #BLACK          
    JSR CHROUT          
    LDA #LEFT            
    JSR CHROUT          

    JSR CHRIN            ; Get character from input
    CMP #$00             ; Check if key pressed
    BEQ GETKEY2          ; If no key pressed, continue waiting

    CMP #BACKSPACE       ; Check for backspace
    BNE CHECKENTER2      ; If not backspace, proceed

    ; Handle backspace
    CPY #$00             ; If nothing to delete, ignore
    BEQ GETKEY2
    DEY                  ; Move the cursor back by one
    LDA #SPACE           ; Clear the previous character using the SPACE character
    JSR CHROUT           ; Display the space to erase the character
    LDA #LEFT            ; Move cursor back one space
    JSR CHROUT           ; Apply cursor move
    JSR CHROUT           ; Redraw the cursor

    JMP GETKEY2   

CHECKENTER2:
    CMP #ENTER
    BEQ CHECKCOUNT2   

CHECKLETTER2:
    CMP #$30             ; Check if character is less than '0'
    BMI GETKEY2          ; If less, reject it
    CMP #$3A             ; Check if character is greater than '9' ($39 + 1)
    BPL GETKEY2          ; If greater, reject it

    CPY #$01             ; Check if we already have one digit
    BEQ GETKEY2          ; If yes, reject additional input

    STA INPUT2,Y         ; Store the valid digit
    JSR CHROUT           ; Display the character
    INY
    JMP GETKEY2

CHECKCOUNT2:
    CPY #1               ; Check if we have exactly one digit
    BNE GETKEY2          ; If not, continue waiting
    RTS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Macros
&lt;/h2&gt;

&lt;p&gt;Let’s start with understanding the macros in the program, those with the &lt;code&gt;define&lt;/code&gt; keyword.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;; Predefined ROM Routines, found in their respective addresses
define SCINIT  $ff81 
define CHRIN   $ffcf
define CHROUT  $ffd2
define SCREEN  $ffed
define PLOT    $fff0

; Zero page variables
define INPUT1  $0010
define INPUT2  $0011
define RESULT  $0012

; ASCII Character constants
define BACKSPACE $08  
define ENTER     $0D  
define SPACE     $20
define BLACK     $A0
define LEFT      $83
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ROM Routines
&lt;/h3&gt;

&lt;p&gt;ROM routines are predefined routines that can be accessed by their respective addresses. It is similar to the standard libraries in &lt;code&gt;C/C++&lt;/code&gt; where functions are written to handle tedious processes. &lt;/p&gt;

&lt;p&gt;Let’s quickly go through each ROM routine, listed &lt;a href="http://spo600.cdot.systems/doku.php?id=spo600:6502_emulator" rel="noopener noreferrer"&gt;here&lt;/a&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;SCINIT&lt;/code&gt; — initialize screen, clearing data in the bitmap display&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;CHRIN&lt;/code&gt; — character in, input keyboard characters&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;CHROUT&lt;/code&gt; — output character to the screen&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;PLOT&lt;/code&gt; — get/set cursor coordinates&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Zero Page Variables
&lt;/h3&gt;

&lt;p&gt;Zero page variables are special because they are located in the first 256 bytes of memory (&lt;code&gt;$0000 - $00FF&lt;/code&gt;) and therefore have faster access times relative to non-zero page variables. &lt;code&gt;INPUT1&lt;/code&gt;, &lt;code&gt;INPUT2&lt;/code&gt;, and &lt;code&gt;RESULT&lt;/code&gt; will hold the first number, second number, and sum respectively.&lt;/p&gt;

&lt;h3&gt;
  
  
  ASCII Characters
&lt;/h3&gt;

&lt;p&gt;Characters are read in their hexadecimal representation. To read user input, the value can be compared to one of the ASCII characters and the appropriate action can be executed (e.g. &lt;code&gt;BACKSPACE&lt;/code&gt; removes a character from the screen). In the code, each key is encoded as their respective hexadecimal value.&lt;/p&gt;

&lt;p&gt;Reference of ASCII characters: &lt;a href="https://www.man7.org/linux/man-pages/man7/ascii.7.html" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  User Input
&lt;/h2&gt;

&lt;p&gt;There are a couple of key checks in the user input:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Check if input ranges from 0-9 &lt;/li&gt;
&lt;li&gt;Handling the &lt;code&gt;ENTER&lt;/code&gt; key&lt;/li&gt;
&lt;li&gt;Handling the &lt;code&gt;BACKSPACE&lt;/code&gt; key
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;; Subroutine to input first number
INPUTFIRST:
    LDY #$00    

GETKEY1: 
    LDA #BLACK           ; Black cursor color
    JSR CHROUT           
    LDA #LEFT            
    JSR CHROUT           

    JSR CHRIN            ; Get character from input
    CMP #$00             ; Check if key pressed
    BEQ GETKEY1          

    CMP #BACKSPACE       ; Check for backspace
    BNE CHECKENTER1      ; If not backspace, proceed

    ; Handle backspace
    CPY #$00             ; If nothing to delete, ignore
    BEQ GETKEY1
    DEY                  ; Move the cursor back by one
    LDA #SPACE           ; Clear the previous character using the SPACE character
    JSR CHROUT           ; Display the space to erase the character
    LDA #LEFT            ; Move cursor back one space
    JSR CHROUT           ; Apply cursor move
    JSR CHROUT           ; Redraw the cursor

    JMP GETKEY1

CHECKENTER1:
    CMP #ENTER
    BEQ CHECKCOUNT1

CHECKLETTER1:
    CMP #$30             ; Check if character is less than '0'
    BMI GETKEY1          ; If less, reject it
    CMP #$3A             ; Check if character is greater than '9' ($39 + 1)
    BPL GETKEY1          ; If greater, reject it

    CPY #$01             ; Check if we already have one digit
    BEQ GETKEY1          ; If yes, reject additional input

    STA INPUT1,Y         ; Store the valid digit
    JSR CHROUT           ; Display the character
    INY
    JMP GETKEY1

CHECKCOUNT1:
    CPY #1               ; Check if we have exactly one digit
    BNE GETKEY1          ; If not, continue waiting
    RTS  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;Y&lt;/code&gt; register acts as an index in order to access the characters in the &lt;code&gt;PROMPT&lt;/code&gt; instructions, as well as keeping track of input length.&lt;/p&gt;

&lt;p&gt;Note: the input is being compared in their respective hexadecimal values. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;GETKEY&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;GETKEY&lt;/code&gt; validates the input in the accumulator. First it prints out the black cursor, then waits until a character is inputted. If the input is a backspace, then it checks if the &lt;code&gt;Y&lt;/code&gt; register is &lt;code&gt;0&lt;/code&gt;, if it’s 0 then it means that there is nothing to delete and loops back to itself. Otherwise it will decrement &lt;code&gt;Y&lt;/code&gt; and replace the character with a space to clear out the character in the display. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;CHECKENTER&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;CHECKENTER&lt;/code&gt; checks if user presses the &lt;code&gt;ENTER&lt;/code&gt; key, and directs the program to &lt;code&gt;CHECKCOUNT&lt;/code&gt; where it checks if there is a character.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;CHECKCOUNT&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;CHECKCOUNT&lt;/code&gt; checks if there is exactly 1 character, this is needed because when pressing enter, it is not guaranteed there is any inpu*&lt;em&gt;t. This means that we are limited to single digits for the numbers being added.&lt;/em&gt;* If input is empty, the program returns to &lt;code&gt;GETKEY&lt;/code&gt; waiting until the user inputs a character. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;CHECKLETTER&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;CHECKLETTER&lt;/code&gt; is the final step in input validation, at this point, we can assume that the input is non-empty. Next is to validate that it is a character ranging from 0-9. &lt;/p&gt;

&lt;p&gt;The same process is repeated for getting the second number. &lt;/p&gt;

&lt;h2&gt;
  
  
  Performing Addition
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Converting ASCII to Numerical Value
&lt;/h3&gt;

&lt;p&gt;At this point, the inputted values have been represented as ASCII values. However the ASCII value of a number is not equal to its numerical value. For example, the number 1 is equal to 31 in hexadecimal, 2 is equal to 32, etc. Therefore, there is an offset of 30. &lt;/p&gt;

&lt;p&gt;To convert the ASCII into it’s proper numerical value, 30 will needs to be subtracted from its ASCII value.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;&lt;span class="nl"&gt;GETSECOND:&lt;/span&gt;
    &lt;span class="nf"&gt;JSR&lt;/span&gt; &lt;span class="nv"&gt;INPUTSECOND&lt;/span&gt;  &lt;span class="c1"&gt;; Get second digit&lt;/span&gt;
    &lt;span class="nf"&gt;LDY&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;

&lt;span class="c1"&gt;; Convert ASCII to number and add&lt;/span&gt;
    &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="nv"&gt;INPUT1&lt;/span&gt;
    &lt;span class="nf"&gt;SEC&lt;/span&gt;
    &lt;span class="nf"&gt;SBC&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;   &lt;span class="c1"&gt;; Convert ASCII to numerical value&lt;/span&gt;
    &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;INPUT1&lt;/span&gt; &lt;span class="c1"&gt;; Store numerical value&lt;/span&gt;

    &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="nv"&gt;INPUT2&lt;/span&gt;
    &lt;span class="nf"&gt;SEC&lt;/span&gt;
    &lt;span class="nf"&gt;SBC&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;   &lt;span class="c1"&gt;; Convert ASCII to numerical value&lt;/span&gt;
    &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;INPUT2&lt;/span&gt; &lt;span class="c1"&gt;; Store numerical value&lt;/span&gt;

    &lt;span class="nf"&gt;CLC&lt;/span&gt;        &lt;span class="c1"&gt;; Clear carry flag before addition&lt;/span&gt;
    &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="nv"&gt;INPUT1&lt;/span&gt;
    &lt;span class="nf"&gt;ADC&lt;/span&gt; &lt;span class="nv"&gt;INPUT2&lt;/span&gt; &lt;span class="c1"&gt;; Add the two numbers&lt;/span&gt;
    &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;RESULT&lt;/span&gt; &lt;span class="c1"&gt;; Store result&lt;/span&gt;

    &lt;span class="nf"&gt;LDY&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once converted, the value is stored into it’s respective zero page variable defined previously.&lt;/p&gt;

&lt;h3&gt;
  
  
  Performing Addition
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;    &lt;span class="nf"&gt;CLC&lt;/span&gt;        &lt;span class="c1"&gt;; Clear carry flag before addition&lt;/span&gt;
    &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="nv"&gt;INPUT1&lt;/span&gt;
    &lt;span class="nf"&gt;ADC&lt;/span&gt; &lt;span class="nv"&gt;INPUT2&lt;/span&gt; &lt;span class="c1"&gt;; Add the two numbers&lt;/span&gt;
    &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;RESULT&lt;/span&gt; &lt;span class="c1"&gt;; Store result&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The carry flag may be set from previous operations, and needs to be cleared before addition occurs. Once cleared, &lt;code&gt;INPUT1&lt;/code&gt; is loaded into the accumulator and &lt;code&gt;ADC INPUT2&lt;/code&gt; adds &lt;code&gt;INPUT2&lt;/code&gt; to &lt;code&gt;INPUT1&lt;/code&gt; and the carry flag will be set if the result exceeds 255. The result is then stored into the &lt;code&gt;RESULT&lt;/code&gt; memory address from the accumulator. &lt;/p&gt;

&lt;h2&gt;
  
  
  Printing the Result
&lt;/h2&gt;

&lt;p&gt;At this point, the result is stored in its numerical representation. However when displaying with &lt;code&gt;CHROUT&lt;/code&gt;, the result needs to be in its ASCII representation. For example, if the result was 9, without converting to its ASCII, it would display a horizontal tab.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CHROUT&lt;/code&gt; prints the character in the accumulator and must be in it’s ASCII representation. Since ASCII is limited to single digits e.g. there is no ASCII for 10, 11, 123, etc.) each number has be printed individually (e.g. printing the tens, ones, etc.).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;&lt;span class="nl"&gt;PRINT_RESULT:&lt;/span&gt;
    &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="nv"&gt;RESULT&lt;/span&gt;        &lt;span class="c1"&gt;; Load the result&lt;/span&gt;
    &lt;span class="nf"&gt;CMP&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;           &lt;span class="c1"&gt;; Check if the result is greater than or equal to 10&lt;/span&gt;
    &lt;span class="nf"&gt;BPL&lt;/span&gt; &lt;span class="nv"&gt;TWO_DIGITS&lt;/span&gt;    &lt;span class="c1"&gt;; If yes -&amp;gt; handle two digits&lt;/span&gt;

    &lt;span class="c1"&gt;; Single-digit result&lt;/span&gt;
    &lt;span class="nf"&gt;CLC&lt;/span&gt;               &lt;span class="c1"&gt;; Clear carry flag before ASCII conversion&lt;/span&gt;
    &lt;span class="nf"&gt;ADC&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;          &lt;span class="c1"&gt;; Convert to ASCII&lt;/span&gt;
    &lt;span class="nf"&gt;JSR&lt;/span&gt; &lt;span class="nb"&gt;CH&lt;/span&gt;&lt;span class="nv"&gt;ROUT&lt;/span&gt;        &lt;span class="c1"&gt;; Display the result&lt;/span&gt;
    &lt;span class="nf"&gt;JMP&lt;/span&gt; &lt;span class="nv"&gt;END_PROGRAM&lt;/span&gt;

&lt;span class="c1"&gt;; Handle two-digit result&lt;/span&gt;
&lt;span class="nl"&gt;TWO_DIGITS:&lt;/span&gt;
    &lt;span class="nf"&gt;SEC&lt;/span&gt;
    &lt;span class="nf"&gt;SBC&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;           &lt;span class="c1"&gt;; Subtract 10 to get the units digit&lt;/span&gt;
    &lt;span class="nf"&gt;PHA&lt;/span&gt;               &lt;span class="c1"&gt;; Save the units digit&lt;/span&gt;
    &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;31&lt;/span&gt;          &lt;span class="c1"&gt;; Load ASCII for '1' (tens digit)&lt;/span&gt;
    &lt;span class="nf"&gt;JSR&lt;/span&gt; &lt;span class="nb"&gt;CH&lt;/span&gt;&lt;span class="nv"&gt;ROUT&lt;/span&gt;        &lt;span class="c1"&gt;; Display the tens digit&lt;/span&gt;
    &lt;span class="nf"&gt;PLA&lt;/span&gt;               &lt;span class="c1"&gt;; Restore the units digit&lt;/span&gt;
    &lt;span class="nf"&gt;CLC&lt;/span&gt;               &lt;span class="c1"&gt;; Clear carry flag before ASCII conversion&lt;/span&gt;
    &lt;span class="nf"&gt;ADC&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;          &lt;span class="c1"&gt;; Convert to ASCII&lt;/span&gt;
    &lt;span class="nf"&gt;JSR&lt;/span&gt; &lt;span class="nb"&gt;CH&lt;/span&gt;&lt;span class="nv"&gt;ROUT&lt;/span&gt;        &lt;span class="c1"&gt;; Display the units digit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In &lt;code&gt;PRINT_RESULT&lt;/code&gt;, if &lt;code&gt;RESULT&lt;/code&gt; is greater than 9, then we need to handle the printing where the tens is printed first followed by the ones. Otherwise, 30 is added to the sum to convert it into its ASCII form. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzmcccnfsvvds23584z36.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzmcccnfsvvds23584z36.png" alt="Image description" width="203" height="87"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Printing 2 Digit Sum
&lt;/h3&gt;

&lt;p&gt;In the case of a 2 digit sum, &lt;code&gt;TWO_DIGITS&lt;/code&gt; the carry flag is set &lt;code&gt;SEC&lt;/code&gt; in order to carry out subtraction &lt;code&gt;SBC&lt;/code&gt;. The result is then subtracted by 10 then the difference is pushed onto the stack &lt;code&gt;PHA&lt;/code&gt; - this represents the number in the “ones” column.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;&lt;span class="c1"&gt;; Handle two-digit result&lt;/span&gt;
&lt;span class="nl"&gt;TWO_DIGITS:&lt;/span&gt;
    &lt;span class="nf"&gt;SEC&lt;/span&gt;
    &lt;span class="nf"&gt;SBC&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;           &lt;span class="c1"&gt;; Subtract 10 to get the units digit&lt;/span&gt;
    &lt;span class="nf"&gt;PHA&lt;/span&gt;               &lt;span class="c1"&gt;; Save the units digit&lt;/span&gt;
    &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;31&lt;/span&gt;          &lt;span class="c1"&gt;; Load ASCII for '1' (tens digit)&lt;/span&gt;
    &lt;span class="nf"&gt;JSR&lt;/span&gt; &lt;span class="nb"&gt;CH&lt;/span&gt;&lt;span class="nv"&gt;ROUT&lt;/span&gt;        &lt;span class="c1"&gt;; Display the tens digit&lt;/span&gt;
    &lt;span class="nf"&gt;PLA&lt;/span&gt;               &lt;span class="c1"&gt;; Restore the units digit&lt;/span&gt;
    &lt;span class="nf"&gt;CLC&lt;/span&gt;               &lt;span class="c1"&gt;; Clear carry flag before ASCII conversion&lt;/span&gt;
    &lt;span class="nf"&gt;ADC&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;          &lt;span class="c1"&gt;; Convert to ASCII&lt;/span&gt;
    &lt;span class="nf"&gt;JSR&lt;/span&gt; &lt;span class="nb"&gt;CH&lt;/span&gt;&lt;span class="nv"&gt;ROUT&lt;/span&gt;        &lt;span class="c1"&gt;; Display the units digit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The ASCII value for 1 is then printed, note that the max sum is 18, therefore, 1 is the largest value in the tens column. The “ones” column value is restored into the accumulator via &lt;code&gt;PLA&lt;/code&gt; and then printed. Using the stack was inspired by user “barrym95838” from the 6502 forum (&lt;a href="http://forum.6502.org/viewtopic.php?p=42766" rel="noopener noreferrer"&gt;Link&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmrctgkmh9efu9q2lyqgg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmrctgkmh9efu9q2lyqgg.png" alt="Image description" width="203" height="87"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;The open ended nature of this lab - where I choose what program to create was both a blessing and a curse. I was confident in managing the bits using the &lt;code&gt;LDA&lt;/code&gt;, &lt;code&gt;STA&lt;/code&gt;, etc. methods, with both immediate and absolute addressing modes - used to get and set the values. &lt;/p&gt;

&lt;p&gt;Where I had the most issue is dealing with outputting the 2 digit results. My first attempt resulted in the “ones” column being printed (i.e. without the “tens” column). For example &lt;code&gt;9 + 9&lt;/code&gt; would print out &lt;code&gt;8&lt;/code&gt; , the second digit of the sum of 18. Researching online has led to an interesting solution previously mentioned with the use of the stack. &lt;/p&gt;

&lt;p&gt;Overall I am happy with the program and excited to start with 64-bit compilers.&lt;/p&gt;

</description>
      <category>spo600</category>
      <category>programming</category>
      <category>assembly</category>
      <category>6502</category>
    </item>
    <item>
      <title>SPO600 Lab 2 - Animating on the Bitmap Display</title>
      <dc:creator>JP </dc:creator>
      <pubDate>Mon, 03 Feb 2025 14:30:03 +0000</pubDate>
      <link>https://dev.to/jpjpjp/spo600-lab-2-animating-on-the-bitmap-display-1kl2</link>
      <guid>https://dev.to/jpjpjp/spo600-lab-2-animating-on-the-bitmap-display-1kl2</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Welcome back, let’s continue with more 6502 assembly. In the last blog post, the bitmap display was introduced and it will filled with different colours. From that it was discovered that the bitmap display spans from page 2 to page 5 (i.e. &lt;code&gt;$0200 - $0500&lt;/code&gt;). &lt;/p&gt;

&lt;p&gt;Today an image will be animated through the bitmap display. Below is the starter code provided by Chris Tyler, the instructor of SPO600 course. We’ll continue using the &lt;a href="http://6502.cdot.systems/" rel="noopener noreferrer"&gt;6502 emulator&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;; draw-image-subroutine.6502&lt;/span&gt;
&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;; This is a routine that can place an arbitrary &lt;/span&gt;
&lt;span class="c1"&gt;; rectangular image on to the screen at given&lt;/span&gt;
&lt;span class="c1"&gt;; coordinates.&lt;/span&gt;
&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;; Chris Tyler 2024-09-17&lt;/span&gt;
&lt;span class="c1"&gt;; Licensed under GPLv2+&lt;/span&gt;
&lt;span class="c1"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;; The subroutine is below starting at the &lt;/span&gt;
&lt;span class="c1"&gt;; label "DRAW:"&lt;/span&gt;
&lt;span class="c1"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;; Test code for our subroutine&lt;/span&gt;
&lt;span class="c1"&gt;; Moves an image diagonally across the screen&lt;/span&gt;

&lt;span class="c1"&gt;; Zero-page variables&lt;/span&gt;
&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;XPOS&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;
&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;YPOS&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;

&lt;span class="nl"&gt;START:&lt;/span&gt;

&lt;span class="c1"&gt;; Set up the width and height elements of the data structure&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;05&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;       &lt;span class="c1"&gt;; IMAGE WIDTH&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;       &lt;span class="c1"&gt;; IMAGE HEIGHT&lt;/span&gt;

&lt;span class="c1"&gt;; Set initial position X=Y=0&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;XPOS&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;YPOS&lt;/span&gt;

&lt;span class="c1"&gt;; Main loop for diagonal animation&lt;/span&gt;
&lt;span class="nl"&gt;MAINLOOP:&lt;/span&gt;

  &lt;span class="c1"&gt;; Set pointer to the image&lt;/span&gt;
  &lt;span class="c1"&gt;; Use G_O or G_X as desired&lt;/span&gt;
  &lt;span class="c1"&gt;; The syntax #&amp;lt;LABEL returns the low byte of LABEL&lt;/span&gt;
  &lt;span class="c1"&gt;; The syntax #&amp;gt;LABEL returns the high byte of LABEL&lt;/span&gt;

  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;G_O&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;G_O&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;

  &lt;span class="c1"&gt;; Place the image on the screen&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;  &lt;span class="c1"&gt;; Address in zeropage of the data structure&lt;/span&gt;
  &lt;span class="nf"&gt;LDX&lt;/span&gt; &lt;span class="nv"&gt;XPOS&lt;/span&gt;  &lt;span class="c1"&gt;; X position&lt;/span&gt;
  &lt;span class="nf"&gt;LDY&lt;/span&gt; &lt;span class="nv"&gt;YPOS&lt;/span&gt;  &lt;span class="c1"&gt;; Y position&lt;/span&gt;
  &lt;span class="nf"&gt;JSR&lt;/span&gt; &lt;span class="nv"&gt;DRAW&lt;/span&gt;  &lt;span class="c1"&gt;; Call the subroutine&lt;/span&gt;

  &lt;span class="c1"&gt;; Delay to show the image&lt;/span&gt;
  &lt;span class="nf"&gt;LDY&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
  &lt;span class="nf"&gt;LDX&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;
&lt;span class="nl"&gt;DELAY:&lt;/span&gt;
  &lt;span class="nf"&gt;DEY&lt;/span&gt;
  &lt;span class="nf"&gt;BNE&lt;/span&gt; &lt;span class="nv"&gt;DELAY&lt;/span&gt;
  &lt;span class="nf"&gt;DEX&lt;/span&gt;
  &lt;span class="nf"&gt;BNE&lt;/span&gt; &lt;span class="nv"&gt;DELAY&lt;/span&gt;

  &lt;span class="c1"&gt;; Set pointer to the blank graphic&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;G_BLANK&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;G_BLANK&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;

  &lt;span class="c1"&gt;; Draw the blank graphic to clear the old image&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="c1"&gt;; LOCATION OF DATA STRUCTURE&lt;/span&gt;
  &lt;span class="nf"&gt;LDX&lt;/span&gt; &lt;span class="nv"&gt;XPOS&lt;/span&gt;
  &lt;span class="nf"&gt;LDY&lt;/span&gt; &lt;span class="nv"&gt;YPOS&lt;/span&gt;
  &lt;span class="nf"&gt;JSR&lt;/span&gt; &lt;span class="nv"&gt;DRAW&lt;/span&gt;

  &lt;span class="c1"&gt;; Increment the position&lt;/span&gt;
  &lt;span class="nf"&gt;INC&lt;/span&gt; &lt;span class="nv"&gt;XPOS&lt;/span&gt;
  &lt;span class="nf"&gt;INC&lt;/span&gt; &lt;span class="nv"&gt;YPOS&lt;/span&gt;

  &lt;span class="c1"&gt;; Continue for 29 frames of animation&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;
  &lt;span class="nf"&gt;CMP&lt;/span&gt; &lt;span class="nv"&gt;XPOS&lt;/span&gt;
  &lt;span class="nf"&gt;BNE&lt;/span&gt; &lt;span class="nv"&gt;MAINLOOP&lt;/span&gt;

  &lt;span class="c1"&gt;; Repeat infinitely&lt;/span&gt;
  &lt;span class="nf"&gt;JMP&lt;/span&gt; &lt;span class="nv"&gt;START&lt;/span&gt;

&lt;span class="c1"&gt;; ==========================================&lt;/span&gt;
&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;; DRAW :: Subroutine to draw an image on &lt;/span&gt;
&lt;span class="c1"&gt;;         the bitmapped display&lt;/span&gt;
&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;; Entry conditions:&lt;/span&gt;
&lt;span class="c1"&gt;;    A - location in zero page of: &lt;/span&gt;
&lt;span class="c1"&gt;;        a pointer to the image (2 bytes)&lt;/span&gt;
&lt;span class="c1"&gt;;        followed by the image width (1 byte)&lt;/span&gt;
&lt;span class="c1"&gt;;        followed by the image height (1 byte)&lt;/span&gt;
&lt;span class="c1"&gt;;    X - horizontal location to put the image&lt;/span&gt;
&lt;span class="c1"&gt;;    Y - vertical location to put the image&lt;/span&gt;
&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;; Exit conditions:&lt;/span&gt;
&lt;span class="c1"&gt;;    All registers are undefined&lt;/span&gt;
&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;; Zero-page memory locations&lt;/span&gt;
&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;IMGPTR&lt;/span&gt;    &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="nv"&gt;A0&lt;/span&gt;
&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;IMGPTRH&lt;/span&gt;   &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="nv"&gt;A1&lt;/span&gt;
&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;IMGWIDTH&lt;/span&gt;  &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="nv"&gt;A2&lt;/span&gt;
&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;IMGHEIGHT&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="nv"&gt;A3&lt;/span&gt;
&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;SCRPTR&lt;/span&gt;    &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="nv"&gt;A4&lt;/span&gt;
&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;SCRPTRH&lt;/span&gt;   &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="nv"&gt;A5&lt;/span&gt;
&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;SCRX&lt;/span&gt;      &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="nv"&gt;A6&lt;/span&gt;
&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;SCRY&lt;/span&gt;      &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="nv"&gt;A7&lt;/span&gt;

&lt;span class="nl"&gt;DRAW:&lt;/span&gt;
  &lt;span class="c1"&gt;; SAVE THE X AND Y REG VALUES&lt;/span&gt;
  &lt;span class="nf"&gt;STY&lt;/span&gt; &lt;span class="nv"&gt;SCRY&lt;/span&gt;
  &lt;span class="nf"&gt;STX&lt;/span&gt; &lt;span class="nv"&gt;SCRX&lt;/span&gt;

  &lt;span class="c1"&gt;; GET THE DATA STRUCTURE&lt;/span&gt;
  &lt;span class="nf"&gt;TAY&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;Y&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;IMGPTR&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0001&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;Y&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;IMGPTRH&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0002&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;Y&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;IMGWIDTH&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0003&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;Y&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;IMGHEIGHT&lt;/span&gt;

  &lt;span class="c1"&gt;; CALCULATE THE START OF THE IMAGE ON&lt;/span&gt;
  &lt;span class="c1"&gt;; SCREEN AND PLACE IN SCRPTRH&lt;/span&gt;
  &lt;span class="c1"&gt;;&lt;/span&gt;
  &lt;span class="c1"&gt;; THIS IS $0200 (START OF SCREEN) +&lt;/span&gt;
  &lt;span class="c1"&gt;; SCRX + SCRY * 32&lt;/span&gt;
  &lt;span class="c1"&gt;; &lt;/span&gt;
  &lt;span class="c1"&gt;; WE'LL DO THE MULTIPLICATION FIRST&lt;/span&gt;
  &lt;span class="c1"&gt;; START BY PLACING SCRY INTO SCRPTR&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;SCRPTRH&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="nv"&gt;SCRY&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;SCRPTR&lt;/span&gt;
  &lt;span class="c1"&gt;; NOW DO 5 LEFT SHIFTS TO MULTIPLY BY 32&lt;/span&gt;
  &lt;span class="nf"&gt;LDY&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;05&lt;/span&gt;     &lt;span class="c1"&gt;; NUMBER OF SHIFTS&lt;/span&gt;
&lt;span class="nl"&gt;MULT:&lt;/span&gt;
  &lt;span class="nf"&gt;ASL&lt;/span&gt; &lt;span class="nv"&gt;SCRPTR&lt;/span&gt;   &lt;span class="c1"&gt;; PERFORM 16-BIT LEFT SHIFT&lt;/span&gt;
  &lt;span class="nf"&gt;ROL&lt;/span&gt; &lt;span class="nv"&gt;SCRPTRH&lt;/span&gt;
  &lt;span class="nf"&gt;DEY&lt;/span&gt;
  &lt;span class="nf"&gt;BNE&lt;/span&gt; &lt;span class="nv"&gt;MULT&lt;/span&gt;

  &lt;span class="c1"&gt;; NOW ADD THE X VALUE&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="nv"&gt;SCRX&lt;/span&gt;
  &lt;span class="nf"&gt;CLC&lt;/span&gt;
  &lt;span class="nf"&gt;ADC&lt;/span&gt; &lt;span class="nv"&gt;SCRPTR&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;SCRPTR&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
  &lt;span class="nf"&gt;ADC&lt;/span&gt; &lt;span class="nv"&gt;SCRPTRH&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;SCRPTRH&lt;/span&gt;

  &lt;span class="c1"&gt;; NOW ADD THE SCREEN BASE ADDRESS OF $0200&lt;/span&gt;
  &lt;span class="c1"&gt;; SINCE THE LOW BYTE IS $00 WE CAN IGNORE IT&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;
  &lt;span class="nf"&gt;CLC&lt;/span&gt;
  &lt;span class="nf"&gt;ADC&lt;/span&gt; &lt;span class="nv"&gt;SCRPTRH&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;SCRPTRH&lt;/span&gt;
  &lt;span class="c1"&gt;; NOTE WE COULD HAVE DONE TWO: INC SCRPTRH&lt;/span&gt;

  &lt;span class="c1"&gt;; NOW WE HAVE A POINTER TO THE IMAGE IN MEM&lt;/span&gt;
  &lt;span class="c1"&gt;; COPY A ROW OF IMAGE DATA&lt;/span&gt;
&lt;span class="nl"&gt;COPYROW:&lt;/span&gt;
  &lt;span class="nf"&gt;LDY&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
&lt;span class="nl"&gt;ROWLOOP:&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;IMGPTR&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="nv"&gt;Y&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;SCRPTR&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="nv"&gt;Y&lt;/span&gt;
  &lt;span class="nf"&gt;INY&lt;/span&gt;
  &lt;span class="nf"&gt;CPY&lt;/span&gt; &lt;span class="nv"&gt;IMGWIDTH&lt;/span&gt;
  &lt;span class="nf"&gt;BNE&lt;/span&gt; &lt;span class="nv"&gt;ROWLOOP&lt;/span&gt;

  &lt;span class="c1"&gt;; NOW WE NEED TO ADVANCE TO THE NEXT ROW&lt;/span&gt;
  &lt;span class="c1"&gt;; ADD IMGWIDTH TO THE IMGPTR&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="nv"&gt;IMGWIDTH&lt;/span&gt;
  &lt;span class="nf"&gt;CLC&lt;/span&gt;
  &lt;span class="nf"&gt;ADC&lt;/span&gt; &lt;span class="nv"&gt;IMGPTR&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;IMGPTR&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
  &lt;span class="nf"&gt;ADC&lt;/span&gt; &lt;span class="nv"&gt;IMGPTRH&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;IMGPTRH&lt;/span&gt;

  &lt;span class="c1"&gt;; ADD 32 TO THE SCRPTR&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;
  &lt;span class="nf"&gt;CLC&lt;/span&gt;
  &lt;span class="nf"&gt;ADC&lt;/span&gt; &lt;span class="nv"&gt;SCRPTR&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;SCRPTR&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
  &lt;span class="nf"&gt;ADC&lt;/span&gt; &lt;span class="nv"&gt;SCRPTRH&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;SCRPTRH&lt;/span&gt;

  &lt;span class="c1"&gt;; DECREMENT THE LINE COUNT AND SEE IF WE'RE&lt;/span&gt;
  &lt;span class="c1"&gt;; DONE&lt;/span&gt;
  &lt;span class="nf"&gt;DEC&lt;/span&gt; &lt;span class="nv"&gt;IMGHEIGHT&lt;/span&gt;
  &lt;span class="nf"&gt;BNE&lt;/span&gt; &lt;span class="nv"&gt;COPYROW&lt;/span&gt;

  &lt;span class="nf"&gt;RTS&lt;/span&gt;

&lt;span class="c1"&gt;; ==========================================&lt;/span&gt;

&lt;span class="c1"&gt;; 5x5 pixel images&lt;/span&gt;

&lt;span class="c1"&gt;; Image of a blue "O" on black background&lt;/span&gt;
&lt;span class="nl"&gt;G_O:&lt;/span&gt;
&lt;span class="nf"&gt;DCB&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
&lt;span class="nf"&gt;DCB&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;e&lt;/span&gt;
&lt;span class="nf"&gt;DCB&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;e&lt;/span&gt;
&lt;span class="nf"&gt;DCB&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;e&lt;/span&gt;
&lt;span class="nf"&gt;DCB&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;

&lt;span class="c1"&gt;; Image of a yellow "X" on a black background&lt;/span&gt;
&lt;span class="nl"&gt;G_X:&lt;/span&gt;
&lt;span class="nf"&gt;DCB&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;
&lt;span class="nf"&gt;DCB&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
&lt;span class="nf"&gt;DCB&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
&lt;span class="nf"&gt;DCB&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
&lt;span class="nf"&gt;DCB&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;

&lt;span class="c1"&gt;; Image of a black square&lt;/span&gt;
&lt;span class="nl"&gt;G_BLANK:&lt;/span&gt;
&lt;span class="nf"&gt;DCB&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
&lt;span class="nf"&gt;DCB&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
&lt;span class="nf"&gt;DCB&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
&lt;span class="nf"&gt;DCB&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
&lt;span class="nf"&gt;DCB&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The starter code animates a blue circle at the top left corner of the bitmap display then moves it diagonally to the bottom right corner and repeats indefinitely. To understand how this works, let’s breakdown each routine/subroutine then explain how they work together. &lt;/p&gt;

&lt;h2&gt;
  
  
  Initial Setup
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Zero-Page Variables
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;&lt;span class="c1"&gt;; Zero-page variables&lt;/span&gt;
&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;XPOS&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;
&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;YPOS&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;define&lt;/code&gt; is a special keyword that defines constants. In this case, &lt;code&gt;XPOS&lt;/code&gt; and &lt;code&gt;YPOS&lt;/code&gt; represent the respective memory locations for the image’s coordinates. &lt;/p&gt;

&lt;h3&gt;
  
  
  Positional Setup
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;&lt;span class="nl"&gt;START:&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;05&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;       &lt;span class="c1"&gt;; IMAGE WIDTH&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;       &lt;span class="c1"&gt;; IMAGE HEIGHT&lt;/span&gt;

  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;XPOS&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;YPOS&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The image has dimensions of &lt;code&gt;5x5&lt;/code&gt;  and has the initial coordinates of &lt;code&gt;0,0&lt;/code&gt;, the top left corner of the bitmap display. &lt;/p&gt;

&lt;h2&gt;
  
  
  Main Animation Loop
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;&lt;span class="nl"&gt;MAINLOOP:&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;G_O&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;G_O&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The main animation loops loads the image’s address into the accumulator then stores its low then high byte into the memory locations &lt;code&gt;$10&lt;/code&gt; and &lt;code&gt;$11&lt;/code&gt; respectively.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;  &lt;span class="c1"&gt;; Place the image on the screen&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;  &lt;span class="c1"&gt;; Address in zeropage of the data structure&lt;/span&gt;
  &lt;span class="nf"&gt;LDX&lt;/span&gt; &lt;span class="nv"&gt;XPOS&lt;/span&gt;  &lt;span class="c1"&gt;; X position&lt;/span&gt;
  &lt;span class="nf"&gt;LDY&lt;/span&gt; &lt;span class="nv"&gt;YPOS&lt;/span&gt;  &lt;span class="c1"&gt;; Y position&lt;/span&gt;
  &lt;span class="nf"&gt;JSR&lt;/span&gt; &lt;span class="nv"&gt;DRAW&lt;/span&gt;  &lt;span class="c1"&gt;; Call the subroutine&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The low byte of the image is loaded in the X and Y coordinates - this is where the &lt;code&gt;DRAW&lt;/code&gt; subroutine will start drawing the image into the bitmap display. &lt;/p&gt;

&lt;h3&gt;
  
  
  Delay
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;  &lt;span class="nf"&gt;LDY&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
  &lt;span class="nf"&gt;LDX&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;
&lt;span class="nl"&gt;DELAY:&lt;/span&gt;
  &lt;span class="nf"&gt;DEY&lt;/span&gt;
  &lt;span class="nf"&gt;BNE&lt;/span&gt; &lt;span class="nv"&gt;DELAY&lt;/span&gt;
  &lt;span class="nf"&gt;DEX&lt;/span&gt;
  &lt;span class="nf"&gt;BNE&lt;/span&gt; &lt;span class="nv"&gt;DELAY&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;DELAY&lt;/code&gt; routine slows down the &lt;code&gt;DRAW&lt;/code&gt; routine to display a “solid” image. Without &lt;code&gt;DELAY&lt;/code&gt;, the image would flash rapidly. There are 2 loops - an outer loop that increments Y 256 times, and an inner loop that decrements X 80 times. Totalling &lt;code&gt;80 * 256 = 20480&lt;/code&gt; iterations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Animating the Image
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;  &lt;span class="c1"&gt;; Set pointer to the blank graphic&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;G_BLANK&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;G_BLANK&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;

  &lt;span class="c1"&gt;; Draw the blank graphic to clear the old image&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; 
  &lt;span class="nf"&gt;LDX&lt;/span&gt; &lt;span class="nv"&gt;XPOS&lt;/span&gt;
  &lt;span class="nf"&gt;LDY&lt;/span&gt; &lt;span class="nv"&gt;YPOS&lt;/span&gt;
  &lt;span class="nf"&gt;JSR&lt;/span&gt; &lt;span class="nv"&gt;DRAW&lt;/span&gt;

  &lt;span class="c1"&gt;; Increment the position&lt;/span&gt;
  &lt;span class="nf"&gt;INC&lt;/span&gt; &lt;span class="nv"&gt;XPOS&lt;/span&gt;
  &lt;span class="nf"&gt;INC&lt;/span&gt; &lt;span class="nv"&gt;YPOS&lt;/span&gt;

  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;
  &lt;span class="nf"&gt;CMP&lt;/span&gt; &lt;span class="nv"&gt;XPOS&lt;/span&gt;
  &lt;span class="nf"&gt;BNE&lt;/span&gt; &lt;span class="nv"&gt;MAINLOOP&lt;/span&gt;

  &lt;span class="nf"&gt;...&lt;/span&gt;
&lt;span class="c1"&gt;; Image of a black square&lt;/span&gt;
&lt;span class="nl"&gt;G_BLANK:&lt;/span&gt;
&lt;span class="nf"&gt;DCB&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
&lt;span class="nf"&gt;DCB&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
&lt;span class="nf"&gt;DCB&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
&lt;span class="nf"&gt;DCB&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
&lt;span class="nf"&gt;DCB&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To “animate” the image, the current image turns “blank” by replacing the image with black pixels. The low byte is then loaded into the accumulator, the X and Y position of the image is loaded in their respective registers where they are incremented. The image gets drawn in its new X, Y position - completing the animation. The completes after 29 “movements” then the same animation indefinitely. &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;DRAW&lt;/code&gt; Subroutine
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;DRAW&lt;/code&gt; subroutine is the most important part of the program - it calculates where the image goes at each iteration.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;IMGPTR&lt;/span&gt;    &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="nv"&gt;A0&lt;/span&gt;
&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;IMGPTRH&lt;/span&gt;   &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="nv"&gt;A1&lt;/span&gt;
&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;IMGWIDTH&lt;/span&gt;  &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="nv"&gt;A2&lt;/span&gt;
&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;IMGHEIGHT&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="nv"&gt;A3&lt;/span&gt;
&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;SCRPTR&lt;/span&gt;    &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="nv"&gt;A4&lt;/span&gt;
&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;SCRPTRH&lt;/span&gt;   &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="nv"&gt;A5&lt;/span&gt;
&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;SCRX&lt;/span&gt;      &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="nv"&gt;A6&lt;/span&gt;
&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;SCRY&lt;/span&gt;      &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="nv"&gt;A7&lt;/span&gt;
&lt;span class="nf"&gt;...&lt;/span&gt;

&lt;span class="nl"&gt;DRAW:&lt;/span&gt;
  &lt;span class="nf"&gt;STY&lt;/span&gt; &lt;span class="nv"&gt;SCRY&lt;/span&gt;
  &lt;span class="nf"&gt;STX&lt;/span&gt; &lt;span class="nv"&gt;SCRX&lt;/span&gt;
  &lt;span class="nf"&gt;TAY&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;Y&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;IMGPTR&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0001&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;Y&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;IMGPTRH&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0002&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;Y&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;IMGWIDTH&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0003&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;Y&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;IMGHEIGHT&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It starts by loading the position of the screen boundaries, and the image properties (X, Y coordinates, height, and width) from their respective memory addresses and stores them into the predefined register addresses - these values will be accessed later when calculating the position for the next image.&lt;/p&gt;

&lt;h3&gt;
  
  
  Calculating Screen Position
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;SCRPTRH&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="nv"&gt;SCRY&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;SCRPTR&lt;/span&gt;
  &lt;span class="nf"&gt;LDY&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;05&lt;/span&gt;
&lt;span class="nl"&gt;MULT:&lt;/span&gt;
  &lt;span class="nf"&gt;ASL&lt;/span&gt; &lt;span class="nv"&gt;SCRPTR&lt;/span&gt;
  &lt;span class="nf"&gt;ROL&lt;/span&gt; &lt;span class="nv"&gt;SCRPTRH&lt;/span&gt;
  &lt;span class="nf"&gt;DEY&lt;/span&gt;
  &lt;span class="nf"&gt;BNE&lt;/span&gt; &lt;span class="nv"&gt;MULT&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Calculation Steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clear the accumulator, this is where the calculation will take place&lt;/li&gt;
&lt;li&gt;Load the accumulator with the image’s Y-coordinate&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Y-coordinate is then loaded with &lt;code&gt;5&lt;/code&gt;, the number of shifts to move the pixel down since each row is 32 bytes long.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;&lt;span class="err"&gt;1&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="err"&gt;2&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="err"&gt;4&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="err"&gt;8&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="err"&gt;16&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="err"&gt;32&lt;/span&gt; 
&lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="err"&gt;2&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="err"&gt;3&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="err"&gt;4&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="err"&gt;5&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="err"&gt;6&lt;/span&gt; 
&lt;span class="nf"&gt;current&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code&gt;MULT&lt;/code&gt; routine shifts the the bits to left via &lt;code&gt;ASL&lt;/code&gt; and &lt;code&gt;ROL&lt;/code&gt; rotates the carry into the &lt;code&gt;SCRPTRH&lt;/code&gt;, Y registry is then decremented and repeats until Y = 0.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;&lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="nv"&gt;SCRX&lt;/span&gt;
&lt;span class="nf"&gt;CLC&lt;/span&gt;
&lt;span class="nf"&gt;ADC&lt;/span&gt; &lt;span class="nv"&gt;SCRPTR&lt;/span&gt;
&lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;SCRPTR&lt;/span&gt;
&lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
&lt;span class="nf"&gt;ADC&lt;/span&gt; &lt;span class="nv"&gt;SCRPTRH&lt;/span&gt;
&lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;SCRPTRH&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Calculating the X-coordinate introduces addition - where the low byte is added first followed by the high byte. The &lt;code&gt;ADC SCRPTR&lt;/code&gt; adds the low byte to the accumulator with carry. This carry value is then added to the high byte with the carry.&lt;/li&gt;
&lt;li&gt;At this point, &lt;code&gt;SCRPTR&lt;/code&gt; and &lt;code&gt;SCRPTRH&lt;/code&gt; hold the final addresses for the transformed image. &lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Inserting the Transformed Image
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;&lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;
&lt;span class="nf"&gt;CLC&lt;/span&gt;
&lt;span class="nf"&gt;ADC&lt;/span&gt; &lt;span class="nv"&gt;SCRPTRH&lt;/span&gt;
&lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;SCRPTRH&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The bitmap display base address of &lt;code&gt;02&lt;/code&gt; is loaded, with the carry flag cleared. The screen pointer high byte is set by adding the &lt;code&gt;SCRPTRH&lt;/code&gt; calculated in the last step.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;&lt;span class="nl"&gt;COPYROW:&lt;/span&gt;
  &lt;span class="nf"&gt;LDY&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
&lt;span class="nl"&gt;ROWLOOP:&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;IMGPTR&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="nv"&gt;Y&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;SCRPTR&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="nv"&gt;Y&lt;/span&gt;
  &lt;span class="nf"&gt;INY&lt;/span&gt;
  &lt;span class="nf"&gt;CPY&lt;/span&gt; &lt;span class="nv"&gt;IMGWIDTH&lt;/span&gt;
  &lt;span class="nf"&gt;BNE&lt;/span&gt; &lt;span class="nv"&gt;ROWLOOP&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The bytes are copied from &lt;code&gt;IMGPTR&lt;/code&gt; to the accumulator, then into &lt;code&gt;SCRPTR&lt;/code&gt; which is the memory corresponding the location on the bitmap display. The loop stops when the Y register reaches the end of the image row.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;&lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="nv"&gt;IMGWIDTH&lt;/span&gt;
&lt;span class="nf"&gt;CLC&lt;/span&gt;
&lt;span class="nf"&gt;ADC&lt;/span&gt; &lt;span class="nv"&gt;IMGPTR&lt;/span&gt;
&lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;IMGPTR&lt;/span&gt;
&lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
&lt;span class="nf"&gt;ADC&lt;/span&gt; &lt;span class="nv"&gt;IMGPTRH&lt;/span&gt;
&lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;IMGPTRH&lt;/span&gt;
&lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;
&lt;span class="nf"&gt;CLC&lt;/span&gt;
&lt;span class="nf"&gt;ADC&lt;/span&gt; &lt;span class="nv"&gt;SCRPTR&lt;/span&gt;
&lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;SCRPTR&lt;/span&gt;
&lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
&lt;span class="nf"&gt;ADC&lt;/span&gt; &lt;span class="nv"&gt;SCRPTRH&lt;/span&gt;
&lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;SCRPTRH&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To advance to the next row, the image width is loaded into the accumulator. &lt;code&gt;IMGPTR&lt;/code&gt; is then added to the image width, advancing the next row in the image. The updated image pointer is stored in &lt;code&gt;IMGPTR&lt;/code&gt;. &lt;code&gt;32&lt;/code&gt; is by added to &lt;code&gt;SCRPTR&lt;/code&gt; in the accumulator then stored back into &lt;code&gt;SCRPTR&lt;/code&gt;. The same processes is done with the high byte, with the carry byte. &lt;/p&gt;

&lt;h1&gt;
  
  
  Bouncing Graphic
&lt;/h1&gt;

&lt;p&gt;Let’s begin by changing the starting position. By loading the accumulator with different values and storing it in &lt;code&gt;XPOS&lt;/code&gt; and &lt;code&gt;YPOS&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;&lt;span class="nl"&gt;START:&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;05&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;       &lt;span class="c1"&gt;; IMAGE WIDTH&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;       &lt;span class="c1"&gt;; IMAGE HEIGHT&lt;/span&gt;

  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;F&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;XPOS&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;A&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;YPOS&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next let’s make the graphic bounce once it makes contact with the wall of the bitmap display. To do this we could invert the sign (e.g. &lt;code&gt;+/-&lt;/code&gt; ) of the X and Y direction when the graphic makes contact with the wall. &lt;/p&gt;

&lt;p&gt;To do this let’s define a constant value to represent the edge of the screen:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;&lt;span class="c1"&gt;; Zero-page variables&lt;/span&gt;
&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;XPOS&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;
&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;YPOS&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;
&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;MAXP&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next we need to track the image direction, is it moving “forwards” or “backwards”? In the case it moves “backwards”, the direction can be inverted, and vice versa.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;&lt;span class="c1"&gt;; Zero-page variables&lt;/span&gt;
&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;XPOS&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;
&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;YPOS&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;
&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;MAXP&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;
&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;CURDIR&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The X and Y sign also need to be tracked to know which direction the respective axes needs to move.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;&lt;span class="c1"&gt;; Zero-page variables&lt;/span&gt;
&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;XPOS&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;
&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;YPOS&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;
&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;MAXP&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;
&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;CURDIR&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;
&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;XFLAG&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;
&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;YFLAG&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We have the required variables track the movement, now let’s implement the logic of inverting the sign when it reaches the edge. &lt;/p&gt;

&lt;p&gt;First let’s initialize &lt;code&gt;CURDIR&lt;/code&gt;  to have a value of &lt;code&gt;0&lt;/code&gt; to indicate the forward direction and &lt;code&gt;MAXP&lt;/code&gt; &lt;code&gt;#$19&lt;/code&gt;, the edge of the screen.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;&lt;span class="nl"&gt;START:&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;CURDIR&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;MAXP&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next let’s implement the case where the image hits the edge with a subroutine:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;load the value corresponding to the edge&lt;/li&gt;
&lt;li&gt;compare the current &lt;code&gt;XPOS&lt;/code&gt; with the edge value&lt;/li&gt;
&lt;li&gt;call &lt;code&gt;CHECK_START&lt;/code&gt; to check if it hits the top left corner

&lt;ol&gt;
&lt;li&gt;since the signs are inverted, it will always reach the left corner given it’s new starting position.
&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;&lt;span class="nl"&gt;CHECK_DIRECTION:&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="nv"&gt;MAXP&lt;/span&gt;
  &lt;span class="nf"&gt;CMP&lt;/span&gt; &lt;span class="nv"&gt;XPOS&lt;/span&gt;
  &lt;span class="nf"&gt;BNE&lt;/span&gt; &lt;span class="nb"&gt;CH&lt;/span&gt;&lt;span class="nv"&gt;ECK_START&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;&lt;span class="nl"&gt;CHECK_START:&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="nv"&gt;XPOS&lt;/span&gt;
  &lt;span class="nf"&gt;CMP&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
  &lt;span class="nf"&gt;BNE&lt;/span&gt; &lt;span class="nv"&gt;CONTINUE_LOOP&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;CURDIR&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;CONTINUE_LOOP&lt;/code&gt; will check if the animation has finished, and repeat it indefinitely. Let’s look at the code all together.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;; draw-image-subroutine.6502&lt;/span&gt;
&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;; This is a routine that can place an arbitrary &lt;/span&gt;
&lt;span class="c1"&gt;; rectangular image on to the screen at given&lt;/span&gt;
&lt;span class="c1"&gt;; coordinates.&lt;/span&gt;
&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;; Chris Tyler 2024-09-17&lt;/span&gt;
&lt;span class="c1"&gt;; Licensed under GPLv2+&lt;/span&gt;
&lt;span class="c1"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;; The subroutine is below starting at the &lt;/span&gt;
&lt;span class="c1"&gt;; label "DRAW:"&lt;/span&gt;
&lt;span class="c1"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;; Test code for our subroutine&lt;/span&gt;
&lt;span class="c1"&gt;; Moves an image diagonally across the screen&lt;/span&gt;

&lt;span class="c1"&gt;; Zero-page variables&lt;/span&gt;
&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;XPOS&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;
&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;YPOS&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;
&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;MAXP&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt; 
&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;CURDIR&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;
&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;XFLAG&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;
&lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;YFLAG&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;

&lt;span class="nl"&gt;START:&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;CURDIR&lt;/span&gt;

  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;MAXP&lt;/span&gt;

  &lt;span class="c1"&gt;; Set up image width &amp;amp; height&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;05&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;

  &lt;span class="c1"&gt;; Set initial position X=Y=0&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;XPOS&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;A&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;YPOS&lt;/span&gt;

&lt;span class="nl"&gt;MAINLOOP:&lt;/span&gt;

  &lt;span class="c1"&gt;; Set pointer to the image&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;G_O&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;G_O&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;

&lt;span class="c1"&gt;; Put image on bitmap display&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;  
  &lt;span class="nf"&gt;LDX&lt;/span&gt; &lt;span class="nv"&gt;XPOS&lt;/span&gt;  
  &lt;span class="nf"&gt;LDY&lt;/span&gt; &lt;span class="nv"&gt;YPOS&lt;/span&gt;  
  &lt;span class="nf"&gt;JSR&lt;/span&gt; &lt;span class="nv"&gt;DRAW&lt;/span&gt; 

&lt;span class="c1"&gt;; Delay to show the image&lt;/span&gt;
  &lt;span class="nf"&gt;LDY&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
  &lt;span class="nf"&gt;LDX&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;
&lt;span class="nl"&gt;DELAY:&lt;/span&gt;
  &lt;span class="nf"&gt;DEY&lt;/span&gt;
  &lt;span class="nf"&gt;BNE&lt;/span&gt; &lt;span class="nv"&gt;DELAY&lt;/span&gt;
  &lt;span class="nf"&gt;DEX&lt;/span&gt;
  &lt;span class="nf"&gt;BNE&lt;/span&gt; &lt;span class="nv"&gt;DELAY&lt;/span&gt;

  &lt;span class="c1"&gt;; Put pointer to blank image&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;G_BLANK&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;G_BLANK&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;

  &lt;span class="c1"&gt;; Clear previous image position&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;  
  &lt;span class="nf"&gt;LDX&lt;/span&gt; &lt;span class="nv"&gt;XPOS&lt;/span&gt;
  &lt;span class="nf"&gt;LDY&lt;/span&gt; &lt;span class="nv"&gt;YPOS&lt;/span&gt;
  &lt;span class="nf"&gt;JSR&lt;/span&gt; &lt;span class="nv"&gt;DRAW&lt;/span&gt;

  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="nv"&gt;CURDIR&lt;/span&gt;
  &lt;span class="nf"&gt;BEQ&lt;/span&gt; &lt;span class="nv"&gt;INCREMENT_POS&lt;/span&gt;

  &lt;span class="nf"&gt;DEC&lt;/span&gt; &lt;span class="nv"&gt;XPOS&lt;/span&gt;
  &lt;span class="nf"&gt;DEC&lt;/span&gt; &lt;span class="nv"&gt;YPOS&lt;/span&gt;
  &lt;span class="nf"&gt;JMP&lt;/span&gt; &lt;span class="nb"&gt;CH&lt;/span&gt;&lt;span class="nv"&gt;ECK_DIRECTION&lt;/span&gt;

&lt;span class="nl"&gt;INCREMENT_POS:&lt;/span&gt;
  &lt;span class="nf"&gt;INC&lt;/span&gt; &lt;span class="nv"&gt;XPOS&lt;/span&gt;
  &lt;span class="nf"&gt;INC&lt;/span&gt; &lt;span class="nv"&gt;YPOS&lt;/span&gt;

&lt;span class="nl"&gt;CHECK_DIRECTION:&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="nv"&gt;MAXP&lt;/span&gt;
  &lt;span class="nf"&gt;CMP&lt;/span&gt; &lt;span class="nv"&gt;XPOS&lt;/span&gt;
  &lt;span class="nf"&gt;BNE&lt;/span&gt; &lt;span class="nb"&gt;CH&lt;/span&gt;&lt;span class="nv"&gt;ECK_START&lt;/span&gt;

  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="nv"&gt;XPOS&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;CURDIR&lt;/span&gt;
  &lt;span class="nf"&gt;JMP&lt;/span&gt; &lt;span class="nv"&gt;CONTINUE_LOOP&lt;/span&gt;

&lt;span class="nl"&gt;CHECK_START:&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="nv"&gt;XPOS&lt;/span&gt;
  &lt;span class="nf"&gt;CMP&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
  &lt;span class="nf"&gt;BNE&lt;/span&gt; &lt;span class="nv"&gt;CONTINUE_LOOP&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
  &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;CURDIR&lt;/span&gt;

&lt;span class="nl"&gt;CONTINUE_LOOP:&lt;/span&gt;
  &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;
  &lt;span class="nf"&gt;CMP&lt;/span&gt; &lt;span class="nv"&gt;XPOS&lt;/span&gt;
  &lt;span class="nf"&gt;BNE&lt;/span&gt; &lt;span class="nv"&gt;MAINLOOP&lt;/span&gt;
  &lt;span class="c1"&gt;; Repeat infinitely&lt;/span&gt;
  &lt;span class="nf"&gt;JMP&lt;/span&gt; &lt;span class="nv"&gt;START&lt;/span&gt;

  &lt;span class="c1"&gt;; ==========================================&lt;/span&gt;
  &lt;span class="c1"&gt;;&lt;/span&gt;
  &lt;span class="c1"&gt;; DRAW :: Subroutine to draw an image on &lt;/span&gt;
  &lt;span class="c1"&gt;;         the bitmapped display&lt;/span&gt;
  &lt;span class="c1"&gt;;&lt;/span&gt;
  &lt;span class="c1"&gt;; Entry conditions:&lt;/span&gt;
  &lt;span class="c1"&gt;;    A - location in zero page of: &lt;/span&gt;
  &lt;span class="c1"&gt;;        a pointer to the image (2 bytes)&lt;/span&gt;
  &lt;span class="c1"&gt;;        followed by the image width (1 byte)&lt;/span&gt;
  &lt;span class="c1"&gt;;        followed by the image height (1 byte)&lt;/span&gt;
  &lt;span class="c1"&gt;;    X - horizontal location to put the image&lt;/span&gt;
  &lt;span class="c1"&gt;;    Y - vertical location to put the image&lt;/span&gt;
  &lt;span class="c1"&gt;;&lt;/span&gt;
  &lt;span class="c1"&gt;; Exit conditions:&lt;/span&gt;
  &lt;span class="c1"&gt;;    All registers are undefined&lt;/span&gt;
  &lt;span class="c1"&gt;;&lt;/span&gt;
  &lt;span class="c1"&gt;; Zero-page memory locations&lt;/span&gt;
  &lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;IMGPTR&lt;/span&gt;    &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="nv"&gt;A0&lt;/span&gt;
  &lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;IMGPTRH&lt;/span&gt;   &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="nv"&gt;A1&lt;/span&gt;
  &lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;IMGWIDTH&lt;/span&gt;  &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="nv"&gt;A2&lt;/span&gt;
  &lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;IMGHEIGHT&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="nv"&gt;A3&lt;/span&gt;
  &lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;SCRPTR&lt;/span&gt;    &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="nv"&gt;A4&lt;/span&gt;
  &lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;SCRPTRH&lt;/span&gt;   &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="nv"&gt;A5&lt;/span&gt;
  &lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;SCRX&lt;/span&gt;      &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="nv"&gt;A6&lt;/span&gt;
  &lt;span class="nf"&gt;define&lt;/span&gt; &lt;span class="nv"&gt;SCRY&lt;/span&gt;      &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="nv"&gt;A7&lt;/span&gt;

  &lt;span class="nl"&gt;DRAW:&lt;/span&gt;
    &lt;span class="c1"&gt;; SAVE THE X AND Y REG VALUES&lt;/span&gt;
    &lt;span class="nf"&gt;STY&lt;/span&gt; &lt;span class="nv"&gt;SCRY&lt;/span&gt;
    &lt;span class="nf"&gt;STX&lt;/span&gt; &lt;span class="nv"&gt;SCRX&lt;/span&gt;

    &lt;span class="c1"&gt;; GET THE DATA STRUCTURE&lt;/span&gt;
    &lt;span class="nf"&gt;TAY&lt;/span&gt;
    &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;Y&lt;/span&gt;
    &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;IMGPTR&lt;/span&gt;
    &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0001&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;Y&lt;/span&gt;
    &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;IMGPTRH&lt;/span&gt;
    &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0002&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;Y&lt;/span&gt;
    &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;IMGWIDTH&lt;/span&gt;
    &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0003&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nv"&gt;Y&lt;/span&gt;
    &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;IMGHEIGHT&lt;/span&gt;

    &lt;span class="c1"&gt;; CALCULATE THE START OF THE IMAGE ON&lt;/span&gt;
    &lt;span class="c1"&gt;; SCREEN AND PLACE IN SCRPTRH&lt;/span&gt;
    &lt;span class="c1"&gt;;&lt;/span&gt;
    &lt;span class="c1"&gt;; THIS IS $0200 (START OF SCREEN) +&lt;/span&gt;
    &lt;span class="c1"&gt;; SCRX + SCRY * 32&lt;/span&gt;
    &lt;span class="c1"&gt;; &lt;/span&gt;
    &lt;span class="c1"&gt;; WE'LL DO THE MULTIPLICATION FIRST&lt;/span&gt;
    &lt;span class="c1"&gt;; START BY PLACING SCRY INTO SCRPTR&lt;/span&gt;
    &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
    &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;SCRPTRH&lt;/span&gt;
    &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="nv"&gt;SCRY&lt;/span&gt;
    &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;SCRPTR&lt;/span&gt;
    &lt;span class="c1"&gt;; NOW DO 5 LEFT SHIFTS TO MULTIPLY BY 32&lt;/span&gt;
    &lt;span class="nf"&gt;LDY&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;05&lt;/span&gt;     &lt;span class="c1"&gt;; NUMBER OF SHIFTS&lt;/span&gt;
  &lt;span class="nl"&gt;MULT:&lt;/span&gt;
    &lt;span class="nf"&gt;ASL&lt;/span&gt; &lt;span class="nv"&gt;SCRPTR&lt;/span&gt;   &lt;span class="c1"&gt;; PERFORM 16-BIT LEFT SHIFT&lt;/span&gt;
    &lt;span class="nf"&gt;ROL&lt;/span&gt; &lt;span class="nv"&gt;SCRPTRH&lt;/span&gt;
    &lt;span class="nf"&gt;DEY&lt;/span&gt;
    &lt;span class="nf"&gt;BNE&lt;/span&gt; &lt;span class="nv"&gt;MULT&lt;/span&gt;

    &lt;span class="c1"&gt;; NOW ADD THE X VALUE&lt;/span&gt;
    &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="nv"&gt;SCRX&lt;/span&gt;
    &lt;span class="nf"&gt;CLC&lt;/span&gt;
    &lt;span class="nf"&gt;ADC&lt;/span&gt; &lt;span class="nv"&gt;SCRPTR&lt;/span&gt;
    &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;SCRPTR&lt;/span&gt;
    &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
    &lt;span class="nf"&gt;ADC&lt;/span&gt; &lt;span class="nv"&gt;SCRPTRH&lt;/span&gt;
    &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;SCRPTRH&lt;/span&gt;

    &lt;span class="c1"&gt;; NOW ADD THE SCREEN BASE ADDRESS OF $0200&lt;/span&gt;
    &lt;span class="c1"&gt;; SINCE THE LOW BYTE IS $00 WE CAN IGNORE IT&lt;/span&gt;
    &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;
    &lt;span class="nf"&gt;CLC&lt;/span&gt;
    &lt;span class="nf"&gt;ADC&lt;/span&gt; &lt;span class="nv"&gt;SCRPTRH&lt;/span&gt;
    &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;SCRPTRH&lt;/span&gt;
    &lt;span class="c1"&gt;; NOTE WE COULD HAVE DONE TWO: INC SCRPTRH&lt;/span&gt;

    &lt;span class="c1"&gt;; NOW WE HAVE A POINTER TO THE IMAGE IN MEM&lt;/span&gt;
    &lt;span class="c1"&gt;; COPY A ROW OF IMAGE DATA&lt;/span&gt;
  &lt;span class="nl"&gt;COPYROW:&lt;/span&gt;
    &lt;span class="nf"&gt;LDY&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
  &lt;span class="nl"&gt;ROWLOOP:&lt;/span&gt;
    &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;IMGPTR&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="nv"&gt;Y&lt;/span&gt;
    &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;SCRPTR&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="nv"&gt;Y&lt;/span&gt;
    &lt;span class="nf"&gt;INY&lt;/span&gt;
    &lt;span class="nf"&gt;CPY&lt;/span&gt; &lt;span class="nv"&gt;IMGWIDTH&lt;/span&gt;
    &lt;span class="nf"&gt;BNE&lt;/span&gt; &lt;span class="nv"&gt;ROWLOOP&lt;/span&gt;

    &lt;span class="c1"&gt;; NOW WE NEED TO ADVANCE TO THE NEXT ROW&lt;/span&gt;
    &lt;span class="c1"&gt;; ADD IMGWIDTH TO THE IMGPTR&lt;/span&gt;
    &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="nv"&gt;IMGWIDTH&lt;/span&gt;
    &lt;span class="nf"&gt;CLC&lt;/span&gt;
    &lt;span class="nf"&gt;ADC&lt;/span&gt; &lt;span class="nv"&gt;IMGPTR&lt;/span&gt;
    &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;IMGPTR&lt;/span&gt;
    &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
    &lt;span class="nf"&gt;ADC&lt;/span&gt; &lt;span class="nv"&gt;IMGPTRH&lt;/span&gt;
    &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;IMGPTRH&lt;/span&gt;

    &lt;span class="c1"&gt;; ADD 32 TO THE SCRPTR&lt;/span&gt;
    &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;
    &lt;span class="nf"&gt;CLC&lt;/span&gt;
    &lt;span class="nf"&gt;ADC&lt;/span&gt; &lt;span class="nv"&gt;SCRPTR&lt;/span&gt;
    &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;SCRPTR&lt;/span&gt;
    &lt;span class="nf"&gt;LDA&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
    &lt;span class="nf"&gt;ADC&lt;/span&gt; &lt;span class="nv"&gt;SCRPTRH&lt;/span&gt;
    &lt;span class="nf"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;SCRPTRH&lt;/span&gt;

    &lt;span class="c1"&gt;; DECREMENT THE LINE COUNT AND SEE IF WE'RE&lt;/span&gt;
    &lt;span class="c1"&gt;; DONE&lt;/span&gt;
    &lt;span class="nf"&gt;DEC&lt;/span&gt; &lt;span class="nv"&gt;IMGHEIGHT&lt;/span&gt;
    &lt;span class="nf"&gt;BNE&lt;/span&gt; &lt;span class="nv"&gt;COPYROW&lt;/span&gt;

    &lt;span class="nf"&gt;RTS&lt;/span&gt;

  &lt;span class="c1"&gt;; ==========================================&lt;/span&gt;

  &lt;span class="c1"&gt;; 5x5 pixel images&lt;/span&gt;

  &lt;span class="c1"&gt;; Image of a blue "O" on black background&lt;/span&gt;
  &lt;span class="nl"&gt;G_O:&lt;/span&gt;
  &lt;span class="nf"&gt;DCB&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
  &lt;span class="nf"&gt;DCB&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;e&lt;/span&gt;
  &lt;span class="nf"&gt;DCB&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;e&lt;/span&gt;
  &lt;span class="nf"&gt;DCB&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;e&lt;/span&gt;
  &lt;span class="nf"&gt;DCB&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;

  &lt;span class="c1"&gt;; Image of a yellow "X" on a black background&lt;/span&gt;
  &lt;span class="nl"&gt;G_X:&lt;/span&gt;
  &lt;span class="nf"&gt;DCB&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;
  &lt;span class="nf"&gt;DCB&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
  &lt;span class="nf"&gt;DCB&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
  &lt;span class="nf"&gt;DCB&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
  &lt;span class="nf"&gt;DCB&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;

  &lt;span class="c1"&gt;; Image of a black square&lt;/span&gt;
  &lt;span class="nl"&gt;G_BLANK:&lt;/span&gt;
  &lt;span class="nf"&gt;DCB&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
  &lt;span class="nf"&gt;DCB&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
  &lt;span class="nf"&gt;DCB&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
  &lt;span class="nf"&gt;DCB&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
  &lt;span class="nf"&gt;DCB&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;The logic of the lab is simple, but found implementation difficult because of how verbosity of assembly. The verbose nature of assembly has made me appreciate high level languages and how much is hidden.&lt;/p&gt;

&lt;p&gt;From the lab, I learned more about the use-cases for subroutines, how and when to implement subroutines into other routines, and &lt;code&gt;BNE&lt;/code&gt; statements. This is similar to using “for” loops and “if” statements in high level programming languages. &lt;/p&gt;

&lt;p&gt;Overall, I had a difficult time with this lab but in a good way - I questioned what I understood about assembly to this point and challenged my analyzing skills, a transferable skill that goes beyond assembly code. Thanks for reading! See you soon!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Assembly Loops, Bit Shifts, and More!</title>
      <dc:creator>JP </dc:creator>
      <pubDate>Tue, 21 Jan 2025 19:20:42 +0000</pubDate>
      <link>https://dev.to/jpjpjp/assembly-loops-bit-shifts-and-more-117e</link>
      <guid>https://dev.to/jpjpjp/assembly-loops-bit-shifts-and-more-117e</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;As an introduction to software portability, I get to experiment with 6502 assembly code via an &lt;a href="http://6502.cdot.systems/" rel="noopener noreferrer"&gt;emulator&lt;/a&gt;. The lab is focussed on handling bytes located on registries and memory. Processors have a unique set of instructions. A subset of these instructions are manage the memory within, to, and from the registries and memory. &lt;/p&gt;

&lt;p&gt;A visualizer can be found in the emulator where each pixel represents a specific address in memory. &lt;/p&gt;

&lt;p&gt;Compared to the modern processor the 6502 is a “simple” processor but is still capable. The simplicity of the instruction set serves as a wonderful introduction into writing, understanding, and analyzing the time complexity of assembly code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;&lt;span class="c1"&gt;; 6502 Instruction Set&lt;/span&gt;
&lt;span class="nf"&gt;ADC&lt;/span&gt; &lt;span class="nv"&gt;AND&lt;/span&gt; &lt;span class="nv"&gt;ASL&lt;/span&gt; &lt;span class="nv"&gt;BCC&lt;/span&gt; &lt;span class="nv"&gt;BCS&lt;/span&gt; &lt;span class="nv"&gt;BEQ&lt;/span&gt; &lt;span class="nv"&gt;BIT&lt;/span&gt;
&lt;span class="nf"&gt;BMI&lt;/span&gt; &lt;span class="nv"&gt;BNE&lt;/span&gt; &lt;span class="nb"&gt;BP&lt;/span&gt;&lt;span class="nv"&gt;L&lt;/span&gt; &lt;span class="nv"&gt;BRK&lt;/span&gt; &lt;span class="nv"&gt;BVC&lt;/span&gt; &lt;span class="nv"&gt;BVS&lt;/span&gt; &lt;span class="nb"&gt;CL&lt;/span&gt;&lt;span class="nv"&gt;C&lt;/span&gt;
&lt;span class="nf"&gt;CLD&lt;/span&gt; &lt;span class="nb"&gt;CL&lt;/span&gt;&lt;span class="nv"&gt;I&lt;/span&gt; &lt;span class="nb"&gt;CL&lt;/span&gt;&lt;span class="nv"&gt;V&lt;/span&gt; &lt;span class="nv"&gt;CMP&lt;/span&gt; &lt;span class="nv"&gt;CPX&lt;/span&gt; &lt;span class="nv"&gt;CPY&lt;/span&gt; &lt;span class="nv"&gt;DEC&lt;/span&gt;
&lt;span class="nf"&gt;DEX&lt;/span&gt; &lt;span class="nv"&gt;DEY&lt;/span&gt; &lt;span class="nv"&gt;EOR&lt;/span&gt; &lt;span class="nv"&gt;INC&lt;/span&gt; &lt;span class="nv"&gt;INX&lt;/span&gt; &lt;span class="nv"&gt;INY&lt;/span&gt; &lt;span class="nv"&gt;JMP&lt;/span&gt;
&lt;span class="nf"&gt;JSR&lt;/span&gt; &lt;span class="nv"&gt;LDA&lt;/span&gt; &lt;span class="nv"&gt;LDX&lt;/span&gt; &lt;span class="nv"&gt;LDY&lt;/span&gt; &lt;span class="nv"&gt;LSR&lt;/span&gt; &lt;span class="nv"&gt;NOP&lt;/span&gt; &lt;span class="nv"&gt;ORA&lt;/span&gt;
&lt;span class="nf"&gt;PHA&lt;/span&gt; &lt;span class="nv"&gt;PHP&lt;/span&gt; &lt;span class="nv"&gt;PLA&lt;/span&gt; &lt;span class="nv"&gt;PLP&lt;/span&gt; &lt;span class="nv"&gt;ROL&lt;/span&gt; &lt;span class="nv"&gt;ROR&lt;/span&gt; &lt;span class="nv"&gt;RTI&lt;/span&gt;
&lt;span class="nf"&gt;RTS&lt;/span&gt; &lt;span class="nv"&gt;SBC&lt;/span&gt; &lt;span class="nv"&gt;SEC&lt;/span&gt; &lt;span class="nv"&gt;SED&lt;/span&gt; &lt;span class="nv"&gt;SEI&lt;/span&gt; &lt;span class="nv"&gt;STA&lt;/span&gt; &lt;span class="nv"&gt;STX&lt;/span&gt;
&lt;span class="nf"&gt;STY&lt;/span&gt; &lt;span class="nv"&gt;TAX&lt;/span&gt; &lt;span class="nv"&gt;TAY&lt;/span&gt; &lt;span class="nv"&gt;TSX&lt;/span&gt; &lt;span class="nv"&gt;TXA&lt;/span&gt; &lt;span class="nv"&gt;TXS&lt;/span&gt; &lt;span class="nv"&gt;TYA&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let’s get started! Here’s a sample of 6502 assembly code given in the lab notes, let’s break it down a couple lines at a time.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;    &lt;span class="nf"&gt;lda&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
    &lt;span class="nf"&gt;sta&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;
    &lt;span class="nf"&gt;lda&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;    
    &lt;span class="nf"&gt;sta&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;
    &lt;span class="nf"&gt;lda&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;
    &lt;span class="nf"&gt;ldy&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;
 &lt;span class="nl"&gt;loop:&lt;/span&gt;  &lt;span class="nf"&gt;sta&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="nv"&gt;y&lt;/span&gt;
    &lt;span class="nf"&gt;iny&lt;/span&gt;
    &lt;span class="nf"&gt;bne&lt;/span&gt; &lt;span class="nv"&gt;loop&lt;/span&gt;
    &lt;span class="nf"&gt;inc&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;
    &lt;span class="nf"&gt;ldx&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;
    &lt;span class="nf"&gt;cpx&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;06&lt;/span&gt;
    &lt;span class="nf"&gt;bne&lt;/span&gt; &lt;span class="nv"&gt;loop&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Understanding 6502 Assembly Code
&lt;/h1&gt;

&lt;p&gt;Before we start looking at the code, let’s understand the 6502 assembly syntax. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;#x&lt;/code&gt;:  represents an immediate operand value.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;$&lt;/code&gt;: prefix to represents a hexadecimal value.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;()&lt;/code&gt;: represents an indirect address, accessing memory indirectly by referencing an address in another location.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;    &lt;span class="nf"&gt;lda&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;    &lt;span class="c1"&gt;; set a pointer in memory location $40 to point to $0200&lt;/span&gt;
    &lt;span class="nf"&gt;sta&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;     &lt;span class="c1"&gt;; ... low byte ($00) goes in address $40&lt;/span&gt;
    &lt;span class="nf"&gt;lda&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;    
    &lt;span class="nf"&gt;sta&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;     &lt;span class="c1"&gt;; ... high byte ($02) goes into address $41&lt;/span&gt;
    &lt;span class="nf"&gt;lda&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;    &lt;span class="c1"&gt;; colour number&lt;/span&gt;
    &lt;span class="nf"&gt;ldy&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;    &lt;span class="c1"&gt;; set index to 0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Loading Values into the Registries
&lt;/h2&gt;

&lt;p&gt;The first couple of lines contain 3 unique instructions - &lt;code&gt;lda&lt;/code&gt;, &lt;code&gt;sta&lt;/code&gt;, &lt;code&gt;ldy&lt;/code&gt;. Here’s an overview of each instruction:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Assembly&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;lda&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Load Accumulator with Memory&lt;/td&gt;
&lt;td&gt;Transfer data from memory into the accumulator register.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Memory → Accumulator register |&lt;br&gt;
| &lt;code&gt;sta&lt;/code&gt; | Store Accumulator in Memory | Transfer data from accumulator into memory.&lt;/p&gt;

&lt;p&gt;Accumulator register → Memory |&lt;br&gt;
| &lt;code&gt;ldy&lt;/code&gt; | Load Index Registry Y from Memory | Transfer data from memory into the Y register.&lt;/p&gt;

&lt;p&gt;Y register → Memory |&lt;/p&gt;

&lt;p&gt;Lines 1-2 loads &lt;code&gt;00&lt;/code&gt; into the accumulator registry (i.e. &lt;code&gt;lda #$00&lt;/code&gt;), then the accumulator value is stored into the memory location &lt;code&gt;40&lt;/code&gt; . The same processes is repeated for value &lt;code&gt;41&lt;/code&gt; . Note that 6502 adopts a little-endian system, where bytes are read from right to left. &lt;/p&gt;
&lt;h2&gt;
  
  
  Loop
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt; &lt;span class="nl"&gt;loop:&lt;/span&gt;  &lt;span class="nf"&gt;sta&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="nv"&gt;y&lt;/span&gt; &lt;span class="c1"&gt;; set pixel colour at the address (pointer)+Y&lt;/span&gt;
    &lt;span class="nf"&gt;iny&lt;/span&gt;     &lt;span class="c1"&gt;; increment index&lt;/span&gt;
    &lt;span class="nf"&gt;bne&lt;/span&gt; &lt;span class="nv"&gt;loop&lt;/span&gt;    &lt;span class="c1"&gt;; continue until done the page (256 pixels)&lt;/span&gt;
    &lt;span class="nf"&gt;inc&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;     &lt;span class="c1"&gt;; increment the page&lt;/span&gt;
    &lt;span class="nf"&gt;ldx&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;     &lt;span class="c1"&gt;; get the current page number&lt;/span&gt;
    &lt;span class="nf"&gt;cpx&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;06&lt;/span&gt;    &lt;span class="c1"&gt;; compare with 6&lt;/span&gt;
    &lt;span class="nf"&gt;bne&lt;/span&gt; &lt;span class="nv"&gt;loop&lt;/span&gt;    &lt;span class="c1"&gt;; continue until done all pages&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Let’s review the instructions in this snippet:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Assembly&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;iny&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Increment Index Register Y by One&lt;/td&gt;
&lt;td&gt;Add one to the current value stored in registry Y.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bne&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Branch on Result Not Zero&lt;/td&gt;
&lt;td&gt;Conditional, branch to an specified address if the Z-flag equals 0.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;inc&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Increment Memory by One&lt;/td&gt;
&lt;td&gt;Add one to the contents of the addressed memory location.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ldx&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Load Index Register X From Memory&lt;/td&gt;
&lt;td&gt;Load the index register X from memory.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cpx&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Compare Index Register X to Memory&lt;/td&gt;
&lt;td&gt;Compare the value in the X register with a value in memory or an immediate value.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Inner Loop: Filling the Page with Yellow Pixels
&lt;/h3&gt;

&lt;p&gt;The inner loop starts by calculating where to store the current accumulator value. This is done by adding the value located in the memory address &lt;code&gt;40&lt;/code&gt; and the value in the &lt;code&gt;y&lt;/code&gt; register, which are &lt;code&gt;00&lt;/code&gt; and &lt;code&gt;00&lt;/code&gt; respectively. In the first iteration it will fill memory address with the value &lt;code&gt;07&lt;/code&gt; , stored in the accumulator register, which corresponds to yellow, then do the same with memory address &lt;code&gt;0201&lt;/code&gt;, etc. &lt;/p&gt;

&lt;p&gt;Once the loop reaches the max page size of 256, incrementing it will loop back to 00 — flagging the &lt;code&gt;bne&lt;/code&gt; instruction to branch off. &lt;/p&gt;
&lt;h3&gt;
  
  
  Outer Loop: Switching Pages
&lt;/h3&gt;

&lt;p&gt;The outer loop controls which page we are currently on. Remember that we start in page 2 (i.e. &lt;code&gt;02&lt;/code&gt; ) and is stored in memory address &lt;code&gt;41&lt;/code&gt; . The outer loops starts by incrementing the page number by 1 via &lt;code&gt;inc $41&lt;/code&gt; and then is loaded into the &lt;code&gt;x&lt;/code&gt; register where we check if it equal to 6 (i.e. &lt;code&gt;cpx #$06&lt;/code&gt;). &lt;/p&gt;

&lt;p&gt;Notice how we start from page 2 and stop at page 5 ( i.e. [2, 6)). Where the page technically gets incremented to the value 6 but &lt;code&gt;cpx $#06&lt;/code&gt; exits the loops, finishing the program instructions. &lt;/p&gt;

&lt;p&gt;Now that we understand what the code does, running it will fill the visualizer with yellow pixels! &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc9qwr545ewhet3och2i7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc9qwr545ewhet3och2i7.png" alt="Image description" width="443" height="879"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Code Analysis
&lt;/h1&gt;
&lt;h2&gt;
  
  
  Time Complexity
&lt;/h2&gt;

&lt;p&gt;The performance of 6502 assembly code can be quantified by the number of cycles it takes the processor to perform the given instructions. Remember that the 6502 processor has 56 instructions, each of these instructions have a cycle count associated with it. &lt;/p&gt;

&lt;p&gt;Below is a table that contain the instruction used in our program with its respective cycle count. &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Instruction&lt;/th&gt;
&lt;th&gt;Cycles&lt;/th&gt;
&lt;th&gt;Cycle Count&lt;/th&gt;
&lt;th&gt;Alt Cycles&lt;/th&gt;
&lt;th&gt;Alt Count&lt;/th&gt;
&lt;th&gt;Total&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LDA #$00&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;STA $40&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LDA #$02&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;STA $41&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LDA #$07&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LDY #$00&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;loop: STA ($40), y&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;256&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1536&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;INY&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;256&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;512&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BNE loop&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;255&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;767&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;INC $41&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LDX $41&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPX #06&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BNE loop&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Before we start calculating, let’s understand what each column in the table mean. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cycles — number of cycles for the instruction to finish executing&lt;/li&gt;
&lt;li&gt;Cycle Count — number of times the instruction runs&lt;/li&gt;
&lt;li&gt;Alt Cycles — number of additional cycles the instruction runs, depends on specific conditions&lt;/li&gt;
&lt;li&gt;Alt Count — number of times the Alt Cycle runs&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Initializing Values
&lt;/h3&gt;

&lt;p&gt;The first 6 instructions are only executed once since they “initialize” the starting values of where the memory starts and the offset.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;Initializing Values = 14 cycles
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Inner Loop
&lt;/h3&gt;

&lt;p&gt;The inner loop starting, lines 7- 9, fill the byte with a yellow pixel, and runs 256 times to fill each byte in the page. However on the 256th iteration, &lt;code&gt;BNE&lt;/code&gt; branches giving it a cycle count of 2 instead of 3.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;Inner Loop = 255 * (6 + 2 + 3) + 1 * (6 + 2 + 2)
           = 2805 + 10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: this calculation is only for a single page. &lt;/p&gt;

&lt;h3&gt;
  
  
  Outer Loop
&lt;/h3&gt;

&lt;p&gt;The outer loop, lines 10-13, switches the page. However on the last page, &lt;code&gt;BNE&lt;/code&gt; branches giving it a cycle count of 2 instead of 3.&lt;/p&gt;

&lt;p&gt;Here’s a more in-depth calculation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;Outer Loop = 3 * (5 + 3 + 2 + 3) + 1 * (5 + 3 + 2 + 2)
           = 31 + 12
           = 51 cycles
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Total
&lt;/h3&gt;

&lt;p&gt;Putting it all together:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;Total = Initializing Values + Inner Loop * 4 Pages + Outer Loop
      = 14 + (2815 * 4) + 51
      = **11325 cycles**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Performance
&lt;/h3&gt;

&lt;p&gt;The 6502 processor runs at a clock speed of 1Mhz, where each cycle takes 1 microsecond to complete. Let’s calculate the programs performance.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;Program cycle count = 11325 Cycles
Clock Speed = 1 Mhz
===================================
Time to complete = Program cycle count / Clock speed (Hz)
                 = 11325 Cycles / (1000000 Cycles / second)
                   = 0.011325 seconds

Time to complete = 0.011325 seconds = 11.325 milliseconds
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Memory Complexity
&lt;/h2&gt;

&lt;p&gt;The 6502 processor has a total of 256 pages where each page has 256 bytes, with a grand total of 65536 bytes of memory. Note that page 0 is optimized for 0 page addressing and page 1 is reserved for the stack. &lt;/p&gt;

&lt;p&gt;Our program is utilizing the memory in 3 ways — &lt;strong&gt;the assembly instructions, written values, and pointer memory.&lt;/strong&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  Assembly Instructions
&lt;/h3&gt;

&lt;p&gt;Each instruction in the program uses memory when executed, below is the associated memory to the instructions in the program.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Instruction&lt;/th&gt;
&lt;th&gt;Bytes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LDA #$00&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;STA $40&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LDA #$02&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;STA $41&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LDA #$07&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LDY #$00&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;loop: STA ($40), y&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;INY&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BNE loop&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;INC $41&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LDX $41&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPX #06&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BNE loop&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;Assembly instruction memory = 2 + 2 + 2 + 2 + 2 + 2 + 2 + 1 + 2 + 2 + 2 + 2 + 2
                           = 25 bytes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Summing the bytes from each instruction is a total of &lt;strong&gt;25 bytes&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Written Values
&lt;/h3&gt;

&lt;p&gt;As we’ve seen multiple times, the program stores &lt;code&gt;07&lt;/code&gt; into all the bytes of pages 2 to 5, and each page is 256 bytes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;Written values memory = 256 * 4
                                         = 1024 bytes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The program writes to 1024 bytes&lt;/p&gt;

&lt;h3&gt;
  
  
  Pointers
&lt;/h3&gt;

&lt;p&gt;In the beginning of the program we dedicate memory for the pointers to store the base address (i.e. &lt;code&gt;$40&lt;/code&gt; and &lt;code&gt;$41&lt;/code&gt;).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;Pointer memory = 1 + 1 
               = 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Total Memory
&lt;/h3&gt;

&lt;p&gt;Adding each of the ways the program uses memory, we have a grand total of 1051 bytes of memory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;Total memory usage = Assembly instructions + Written values + Pointers
                   = 25 + 1024 + 2
                   = 1051 bytes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Optimization and Modification
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Optimization
&lt;/h2&gt;

&lt;p&gt;The current code uses 2 loops, one to go through each address in the current and another to increment the page. Notice that each page has the same number of addresses, therefore, we can use the offset to set the pixel for all 4 pages at the same. &lt;strong&gt;This works because the low-byte of each address is the same for each page, and since we know which pages map to the bitmap visualizer we can use the absolute value, rather than a reference.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;    &lt;span class="nf"&gt;lda&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;        &lt;span class="c1"&gt;; Set color yellow&lt;/span&gt;
    &lt;span class="nf"&gt;ldy&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;        &lt;span class="c1"&gt;; Start with offset of 0&lt;/span&gt;

&lt;span class="nl"&gt;loop:&lt;/span&gt;
    &lt;span class="nf"&gt;sta&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;    &lt;span class="c1"&gt;; Set pixel for page 2&lt;/span&gt;
    &lt;span class="nf"&gt;sta&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;    &lt;span class="c1"&gt;; Set pixel for page 3&lt;/span&gt;
    &lt;span class="nf"&gt;sta&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;    &lt;span class="c1"&gt;; Set pixel for page 4&lt;/span&gt;
    &lt;span class="nf"&gt;sta&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;    &lt;span class="c1"&gt;; Set pixel for page 5&lt;/span&gt;
    &lt;span class="nf"&gt;iny&lt;/span&gt;             &lt;span class="c1"&gt;; Increment the offset&lt;/span&gt;

    &lt;span class="nf"&gt;bne&lt;/span&gt; &lt;span class="nv"&gt;loop&lt;/span&gt;        &lt;span class="c1"&gt;; Loop until overflow back to 00&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note that there is a single loop, reducing the runtime significantly. In terms of &lt;a href="https://www.freecodecamp.org/news/content/images/2021/06/1_KfZYFUT2OKfjekJlCeYvuQ.jpeg" rel="noopener noreferrer"&gt;Big O notation&lt;/a&gt;, this reduces the runtime from &lt;code&gt;O(n^2)&lt;/code&gt; to &lt;code&gt;O(n)&lt;/code&gt;. Let’s calculate the number of cycles. &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Instruction&lt;/th&gt;
&lt;th&gt;Cycles&lt;/th&gt;
&lt;th&gt;Cycle Count&lt;/th&gt;
&lt;th&gt;Alt Cycles&lt;/th&gt;
&lt;th&gt;Alt Count&lt;/th&gt;
&lt;th&gt;Total&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LDA #$07&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LDA #$00&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;loop: STA $0200, y&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;256&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1280&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;loop: STA $0300, y&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;256&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1280&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;loop: STA $0400, y&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;256&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1280&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;loop: STA $0500, y&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;256&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1280&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;INY&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;256&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;512&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BNE loop&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;767&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Total Cycles = 2 + 2 + (1280 * 4) + 512 + 767
             = **6403 cycles**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Percentage Reduction = (Original Cycle Count - Optimized Cycle Count) / Original Cycle Count) * 100
                     = (11325 - 6403) / 11325 * 100
                     = 0.4356 * 100
                     = **43.46 %**
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With the optimization, cycle count has been reduced by approximately 43%! In my opinion, the code does look cleaner, but as instructions get more complex, the absolute values addressing the pages may not work. &lt;/p&gt;

&lt;h2&gt;
  
  
  Modifications
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Modification 1: Change the Pixels to Light Blue
&lt;/h3&gt;

&lt;p&gt;The value for light blue can be found in the “Notes” output in the console. &lt;code&gt;$e&lt;/code&gt; corresponds to light blue. Let’s change the accumulator value to &lt;code&gt;$e&lt;/code&gt; in our optimized code and observe the difference.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;    &lt;span class="nf"&gt;lda&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="nv"&gt;e&lt;/span&gt;        &lt;span class="c1"&gt;; Set color light blue&lt;/span&gt;
    &lt;span class="nf"&gt;ldy&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;        &lt;span class="c1"&gt;; Start with offset of 0&lt;/span&gt;

&lt;span class="nl"&gt;loop:&lt;/span&gt;
    &lt;span class="nf"&gt;sta&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;    &lt;span class="c1"&gt;; Set pixel for page 2&lt;/span&gt;
    &lt;span class="nf"&gt;sta&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;    &lt;span class="c1"&gt;; Set pixel for page 3&lt;/span&gt;
    &lt;span class="nf"&gt;sta&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;    &lt;span class="c1"&gt;; Set pixel for page 4&lt;/span&gt;
    &lt;span class="nf"&gt;sta&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;0500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;    &lt;span class="c1"&gt;; Set pixel for page 5&lt;/span&gt;
    &lt;span class="nf"&gt;iny&lt;/span&gt;             &lt;span class="c1"&gt;; Increment the offset&lt;/span&gt;

    &lt;span class="nf"&gt;bne&lt;/span&gt; &lt;span class="nv"&gt;loop&lt;/span&gt;        &lt;span class="c1"&gt;; Loop until overflow back to 00&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fws40561zx9es515bu30i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fws40561zx9es515bu30i.png" alt="Light blue Bitmap" width="305" height="571"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Modification 2: Different Colours for each Page
&lt;/h3&gt;

&lt;p&gt;We can modify the original code to use the high-byte value for the colour code rather than a static value. Therefore, the first page (page 2) will use colour value &lt;code&gt;$02&lt;/code&gt; which is a red, then page 3 will use colour value &lt;code&gt;$03&lt;/code&gt; which is cyan, etc.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    lda #$00       ; Set pointer to $0200
    sta $40        ; Low byte in $40
    lda #$02       ; Set high byte of the pointer
    sta $41        ; High byte in $41
    ldy #$00       
loop:   
    lda $41        ; Use high byte as the color code
    sta ($40),y    ; Set pixel color at (pointer)+Y using high byte
    iny            ; Increment Y index
    bne loop       

    inc $41        ; Increment page
    cmp #$06       
    bne loop       

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq3adbha7vrmq3u6x8373.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq3adbha7vrmq3u6x8373.png" alt="Different Colours for each Page" width="306" height="596"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Modification 2: Random Colour for each Pixel
&lt;/h3&gt;

&lt;p&gt;We can modify the original code to generate a random colour in each iteration. From the “Notes” section from the emulator, &lt;br&gt;
&lt;code&gt;* Memory location $fe contains a new random byte on every read.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$fe&lt;/code&gt; can be used to get a random byte (i.e. colour) at each iteration.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      lda #$00        ; Set a pointer in memory location $40                                           
      sta $40         ; Low byte ($00) goes in address $40
      lda #$02        ; High byte ($02) goes into address $41
      sta $41
      ldy #$00        ; Set index to 0

loop: sta ($40), y    ; Set pixel color at the address 
                      ;  (pointer)+Y
      lda $fe     ; get a random color
      iny         ; Increment index
      bne loop    ; Continue until done the page (256 pixels)
      inc $41     ; Increment the page
      ldx $41     ; Get the current page number
      cpx #$06    ; Compare with 6
      bne loop    ; Continue until done all pages
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feiy5fsxqfbau7c2kwhjk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feiy5fsxqfbau7c2kwhjk.png" alt="Random Colour for each Byte" width="209" height="397"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbfeipqr7rbnisvj8prck.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbfeipqr7rbnisvj8prck.png" alt="Image description" width="209" height="397"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Experiments
&lt;/h1&gt;

&lt;p&gt;Now that we understand the assembly code, lets perform a number of experiments. &lt;/p&gt;
&lt;h2&gt;
  
  
  Experiment 1: &lt;code&gt;tya&lt;/code&gt; Instruction
&lt;/h2&gt;

&lt;p&gt;Let’s begin by adding &lt;code&gt;tya&lt;/code&gt; , transfer index Y to accumulator, instruction to the inner loop.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;    &lt;span class="nf"&gt;lda&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;    &lt;span class="c1"&gt;; set a pointer in memory location $40 to point to $0200&lt;/span&gt;
    &lt;span class="nf"&gt;sta&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;     &lt;span class="c1"&gt;;  low byte ($00) goes in address $40&lt;/span&gt;
    &lt;span class="nf"&gt;lda&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;    
    &lt;span class="nf"&gt;sta&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;     &lt;span class="c1"&gt;;  high byte ($02) goes into address $41&lt;/span&gt;
    &lt;span class="nf"&gt;lda&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;    &lt;span class="c1"&gt;; colour number&lt;/span&gt;
    &lt;span class="nf"&gt;ldy&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;    &lt;span class="c1"&gt;; set index to 0&lt;/span&gt;
 &lt;span class="nl"&gt;loop:&lt;/span&gt;  &lt;span class="nf"&gt;tya&lt;/span&gt; &lt;span class="c1"&gt;; ** NEW **, transfer index Y into accumulator&lt;/span&gt;
  &lt;span class="nf"&gt;sta&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="nv"&gt;y&lt;/span&gt;   &lt;span class="c1"&gt;; set pixel colour at the address (pointer)+Y&lt;/span&gt;
    &lt;span class="nf"&gt;iny&lt;/span&gt;     &lt;span class="c1"&gt;; increment index&lt;/span&gt;
    &lt;span class="nf"&gt;bne&lt;/span&gt; &lt;span class="nv"&gt;loop&lt;/span&gt;    &lt;span class="c1"&gt;; continue until done the page (256 pixels)&lt;/span&gt;
    &lt;span class="nf"&gt;inc&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;     &lt;span class="c1"&gt;; increment the page&lt;/span&gt;
    &lt;span class="nf"&gt;ldx&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;     &lt;span class="c1"&gt;; get the current page number&lt;/span&gt;
    &lt;span class="nf"&gt;cpx&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;06&lt;/span&gt;    &lt;span class="c1"&gt;; compare with 6&lt;/span&gt;
    &lt;span class="nf"&gt;bne&lt;/span&gt; &lt;span class="nv"&gt;loop&lt;/span&gt;    &lt;span class="c1"&gt;; continue until done all pages&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With a single instruction, we change the result to have vertical stripes of repeating colours, starting with black, white, burgundy, aqua, etc. Monitoring the memory starting at &lt;code&gt;0200&lt;/code&gt;, we can see the pattern in the values stored in each page:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;       0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
0200: 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
0210: 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f
0220: 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f
0230: 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f
0240: 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f
0250: 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f
0260: 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f
0270: 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f
0280: 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f
0290: 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f
02a0: a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af
02b0: b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf
02c0: c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf
02d0: d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df
02e0: e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef
02f0: f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the assembly code, the value in the &lt;code&gt;Y&lt;/code&gt; register is loaded into the accumulator, replacing the the initial value of &lt;code&gt;07&lt;/code&gt;. Entering the loop, the &lt;code&gt;Y&lt;/code&gt; value is now used as both the low byte, and the page offset — this can be seen in the matrix above, where the column value (i.e. offset value) is the same as the low byte. &lt;/p&gt;

&lt;p&gt;If we look at the notes section of the simulator the &lt;code&gt;Y&lt;/code&gt; value corresponds to the colour on the visualizer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$0: Black
$1: White
$2: Red
...
$d: Light green
$e: Light blue
$f: Light grey
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Experiment 2: &lt;code&gt;lsr&lt;/code&gt; Instruction
&lt;/h2&gt;

&lt;p&gt;Let’s add the &lt;code&gt;lsr&lt;/code&gt;, logical shift right, instruction immediately after &lt;code&gt;tya&lt;/code&gt; added in the previous experiment&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;    &lt;span class="nf"&gt;lda&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;    &lt;span class="c1"&gt;; set a pointer in memory location $40 to point to $0200&lt;/span&gt;
    &lt;span class="nf"&gt;sta&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;     &lt;span class="c1"&gt;; low byte ($00) goes in address $40&lt;/span&gt;
    &lt;span class="nf"&gt;lda&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;    
    &lt;span class="nf"&gt;sta&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;     &lt;span class="c1"&gt;; high byte ($02) goes into address $41&lt;/span&gt;
    &lt;span class="nf"&gt;lda&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;    &lt;span class="c1"&gt;; colour number&lt;/span&gt;
    &lt;span class="nf"&gt;ldy&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;    &lt;span class="c1"&gt;; set index to 0&lt;/span&gt;
 &lt;span class="nl"&gt;loop:&lt;/span&gt;  &lt;span class="nf"&gt;tya&lt;/span&gt; &lt;span class="c1"&gt;; transfer index Y into accumulator&lt;/span&gt;
  &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nf"&gt;lsr&lt;/span&gt; &lt;span class="c1"&gt;; ** NEW **, logical shift right**&lt;/span&gt;
  &lt;span class="nf"&gt;sta&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="nv"&gt;y&lt;/span&gt;   &lt;span class="c1"&gt;; set pixel colour at the address (pointer)+Y&lt;/span&gt;
    &lt;span class="nf"&gt;iny&lt;/span&gt;     &lt;span class="c1"&gt;; increment index&lt;/span&gt;
    &lt;span class="nf"&gt;bne&lt;/span&gt; &lt;span class="nv"&gt;loop&lt;/span&gt;    &lt;span class="c1"&gt;; continue until done the page (256 pixels)&lt;/span&gt;
    &lt;span class="nf"&gt;inc&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;     &lt;span class="c1"&gt;; increment the page&lt;/span&gt;
    &lt;span class="nf"&gt;ldx&lt;/span&gt; &lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;     &lt;span class="c1"&gt;; get the current page number&lt;/span&gt;
    &lt;span class="nf"&gt;cpx&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="kc"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;06&lt;/span&gt;    &lt;span class="c1"&gt;; compare with 6&lt;/span&gt;
    &lt;span class="nf"&gt;bne&lt;/span&gt; &lt;span class="nv"&gt;loop&lt;/span&gt;    &lt;span class="c1"&gt;; continue until done all pages&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy46kh8shxue9xjdf4g5k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy46kh8shxue9xjdf4g5k.png" alt="Image description" width="722" height="1403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With &lt;code&gt;lsr&lt;/code&gt;,  instead of each colour appearing twice, each colour appears only once with each vertical line being 1 pixel wider. By default, &lt;code&gt;lsr&lt;/code&gt; shifts the accumulator value to the right by 1 bit. This behaviour can be seen when monitoring the pages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;       0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
0200: 00 00 01 01 02 02 03 03 04 04 05 05 06 06 07 07
0210: 08 08 09 09 0a 0a 0b 0b 0c 0c 0d 0d 0e 0e 0f 0f
0220: 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17
0230: 18 18 19 19 1a 1a 1b 1b 1c 1c 1d 1d 1e 1e 1f 1f
0240: 20 20 21 21 22 22 23 23 24 24 25 25 26 26 27 27
0250: 28 28 29 29 2a 2a 2b 2b 2c 2c 2d 2d 2e 2e 2f 2f
0260: 30 30 31 31 32 32 33 33 34 34 35 35 36 36 37 37
0270: 38 38 39 39 3a 3a 3b 3b 3c 3c 3d 3d 3e 3e 3f 3f
0280: 40 40 41 41 42 42 43 43 44 44 45 45 46 46 47 47
0290: 48 48 49 49 4a 4a 4b 4b 4c 4c 4d 4d 4e 4e 4f 4f
02a0: 50 50 51 51 52 52 53 53 54 54 55 55 56 56 57 57
02b0: 58 58 59 59 5a 5a 5b 5b 5c 5c 5d 5d 5e 5e 5f 5f
02c0: 60 60 61 61 62 62 63 63 64 64 65 65 66 66 67 67
02d0: 68 68 69 69 6a 6a 6b 6b 6c 6c 6d 6d 6e 6e 6f 6f
02e0: 70 70 71 71 72 72 73 73 74 74 75 75 76 76 77 77
02f0: 78 78 79 79 7a 7a 7b 7b 7c 7c 7d 7d 7e 7e 7f 7f
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;lsr&lt;/code&gt; shifts the bits to the right by removing the right most bit and in this case, inserts a &lt;code&gt;0&lt;/code&gt; to the left most position. If we walk-through the first 3 iterations:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Iteration 1:

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;Y = A = 00&lt;/code&gt; → &lt;code&gt;00 = 0000 0000&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;After &lt;code&gt;lsr&lt;/code&gt;: &lt;code&gt;00 = 0000 0000&lt;/code&gt; → &lt;code&gt;00 = 0000 0000&lt;/code&gt;

&lt;ol&gt;
&lt;li&gt;Note: nothing changes&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;/li&gt;

&lt;li&gt; Iteration 2: 

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;Y =  A = 01&lt;/code&gt; → &lt;code&gt;01 = 0000 0001&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;After &lt;code&gt;lsr&lt;/code&gt;: &lt;code&gt;01 = 0000 0001&lt;/code&gt; → &lt;code&gt;00 = 0000 0000&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;li&gt;Iteration 3:

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;Y = A = 02&lt;/code&gt; → &lt;code&gt;02 = 0000 0010&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;After &lt;code&gt;lsr&lt;/code&gt;: &lt;code&gt;02 = 0000 0010&lt;/code&gt; → &lt;code&gt;01 = 0000 0001&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;

&lt;/ol&gt;

&lt;p&gt;These calculated values correspond their respective memory addresses. (e.g. &lt;code&gt;0200 - 0202&lt;/code&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  Experiment 2a: Repeating &lt;code&gt;lsr&lt;/code&gt; Instructions
&lt;/h3&gt;

&lt;p&gt;Let’s repeat the &lt;code&gt;lsr&lt;/code&gt; instructions multiple times. Given what we know about &lt;code&gt;lsr&lt;/code&gt;, the bits should shift &lt;code&gt;x&lt;/code&gt; amount of times to the right, where &lt;code&gt;x&lt;/code&gt; is the number of repeated &lt;code&gt;lsr&lt;/code&gt; instructions. &lt;/p&gt;

&lt;p&gt;Initially, I thought repeating &lt;code&gt;lsr&lt;/code&gt; once will (i.e. 2 &lt;code&gt;lsr&lt;/code&gt; in succession) will widen the lines by a factor of 2 but I was partly wrong. If we look at the image the same way the program loops, moving left to right, then top to bottom, we see that the colours are doubling in width. What I didn’t expect is the alternating pattern of colours. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fugaeeaedwfbpphixzf6n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fugaeeaedwfbpphixzf6n.png" alt="Image description" width="712" height="1436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The alternating colour pattern is due to right shift, where the width would increase &lt;code&gt;2^x&lt;/code&gt; times before going to the next colour.&lt;/p&gt;

&lt;p&gt;Let’s repeat this with 3 to 5 &lt;code&gt;lsr&lt;/code&gt; instructions in succession. Given our observations, we should see the colour cover 8, 16, then 32 pixels wide, before going to the next colour.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fncjq97w69gaq5nuhst5t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fncjq97w69gaq5nuhst5t.png" alt="3  raw `lsr` endraw " width="512" height="1069"&gt;&lt;/a&gt;&lt;br&gt;
3 &lt;code&gt;lsr&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8d35z7ub4akf0gib0kjs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8d35z7ub4akf0gib0kjs.png" alt="4  raw `lsr` endraw " width="492" height="1048"&gt;&lt;/a&gt;&lt;br&gt;
4 &lt;code&gt;lsr&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsjfmo285m34f8kgb9jji.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsjfmo285m34f8kgb9jji.png" alt="5  raw `lsr` endraw " width="495" height="1079"&gt;&lt;/a&gt;&lt;br&gt;
5 &lt;code&gt;lsr&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If we observe closely, the pattern is always black, white, burgundy, cyan, etc. &lt;/p&gt;
&lt;h3&gt;
  
  
  Experiment 2a: Repeating &lt;code&gt;asl&lt;/code&gt; Instructions
&lt;/h3&gt;

&lt;p&gt;Let’s repeat the &lt;code&gt;lsr&lt;/code&gt; experiment but replace &lt;code&gt;lsr&lt;/code&gt; with &lt;code&gt;asl&lt;/code&gt;. &lt;code&gt;asl&lt;/code&gt;, arithmetic shift left, shifting the bits to the left once. It completes this in a similar way, where the right most bit is removed and in this case a &lt;code&gt;0&lt;/code&gt; is inserted to the most right.  &lt;/p&gt;

&lt;p&gt;Let’s run through the first 3 iterations where one &lt;code&gt;asl&lt;/code&gt; is in the loop:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Iteration 1:

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;Y = A = 00&lt;/code&gt; → &lt;code&gt;00 = 0000 0000&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;After &lt;code&gt;asl&lt;/code&gt;: &lt;code&gt;00 = 0000 0000&lt;/code&gt; → &lt;code&gt;00 = 0000 0000&lt;/code&gt;

&lt;ol&gt;
&lt;li&gt;Note: nothing changes&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt; Iteration 2: 

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;Y =  A = 01&lt;/code&gt; → &lt;code&gt;01 = 0000 0001&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;After &lt;code&gt;asl&lt;/code&gt;: &lt;code&gt;01 = 0000 0001&lt;/code&gt; → &lt;code&gt;02 = 0000 0010&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Iteration 3:

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;Y = A = 02&lt;/code&gt; → &lt;code&gt;02 = 0000 0010&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;After &lt;code&gt;asl&lt;/code&gt;: &lt;code&gt;02 = 0000 0100&lt;/code&gt; → &lt;code&gt;04 = 0000 0100&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This pattern can be observed in the memory map:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;       0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
0200: **00 02 04** 06 08 0a 0c 0e 10 12 14 16 18 1a 1c 1e
0210: 20 22 24 26 28 2a 2c 2e 30 32 34 36 38 3a 3c 3e
0220: 40 42 44 46 48 4a 4c 4e 50 52 54 56 58 5a 5c 5e
0230: 60 62 64 66 68 6a 6c 6e 70 72 74 76 78 7a 7c 7e
0240: 80 82 84 86 88 8a 8c 8e 90 92 94 96 98 9a 9c 9e
0250: a0 a2 a4 a6 a8 aa ac ae b0 b2 b4 b6 b8 ba bc be
0260: c0 c2 c4 c6 c8 ca cc ce d0 d2 d4 d6 d8 da dc de
0270: e0 e2 e4 e6 e8 ea ec ee f0 f2 f4 f6 f8 fa fc fe
0280: 00 02 04 06 08 0a 0c 0e 10 12 14 16 18 1a 1c 1e
0290: 20 22 24 26 28 2a 2c 2e 30 32 34 36 38 3a 3c 3e
02a0: 40 42 44 46 48 4a 4c 4e 50 52 54 56 58 5a 5c 5e
02b0: 60 62 64 66 68 6a 6c 6e 70 72 74 76 78 7a 7c 7e
02c0: 80 82 84 86 88 8a 8c 8e 90 92 94 96 98 9a 9c 9e
02d0: a0 a2 a4 a6 a8 aa ac ae b0 b2 b4 b6 b8 ba bc be
02e0: c0 c2 c4 c6 c8 ca cc ce d0 d2 d4 d6 d8 da dc de
02f0: e0 e2 e4 e6 e8 ea ec ee f0 f2 f4 f6 f8 fa fc fe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm9t9dwyykps8ac41k33l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm9t9dwyykps8ac41k33l.png" alt="1  raw `asl` endraw " width="414" height="811"&gt;&lt;/a&gt;&lt;br&gt;
1 &lt;code&gt;asl&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;One interesting observation are the differences in colours between &lt;code&gt;asl&lt;/code&gt; and &lt;code&gt;lsr&lt;/code&gt;. Since we are shifting bits to the left, the colour values are increasing by a factor of 2 (e.g. &lt;code&gt;2x&lt;/code&gt; where &lt;code&gt;x&lt;/code&gt; is the number of &lt;code&gt;asl&lt;/code&gt; instructions in succession). &lt;/p&gt;

&lt;p&gt;The values resulting in &lt;code&gt;asl&lt;/code&gt; will always be of base 2, which explains the colour pattern of black (&lt;code&gt;$0&lt;/code&gt;), red (&lt;code&gt;$2&lt;/code&gt;), purple (&lt;code&gt;$4&lt;/code&gt;), etc. with 1 &lt;code&gt;asl&lt;/code&gt; the pattern ends with blue (&lt;code&gt;$e&lt;/code&gt;). Given the pattern, I expect the pattern to shorten by a factor of 2 because each value will be doubled (e.g. &lt;code&gt;$02&lt;/code&gt; → &lt;code&gt;$04&lt;/code&gt;, &lt;code&gt;$04&lt;/code&gt; → &lt;code&gt;$08&lt;/code&gt;, etc.). &lt;/p&gt;

&lt;p&gt;Let’s continue by adding the remaining &lt;code&gt;asl&lt;/code&gt; instructions:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1imj2kid3h3spc7x7lie.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1imj2kid3h3spc7x7lie.png" alt="2  raw `asl` endraw " width="271" height="534"&gt;&lt;/a&gt;&lt;br&gt;
2 &lt;code&gt;asl&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7age781j3bu6xjqj5g48.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7age781j3bu6xjqj5g48.png" alt="3  raw `asl` endraw " width="265" height="542"&gt;&lt;/a&gt;&lt;br&gt;
3 &lt;code&gt;asl&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feu8co21js5min0eg0y94.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feu8co21js5min0eg0y94.png" alt="4  raw `asl` endraw " width="278" height="571"&gt;&lt;/a&gt;&lt;br&gt;
4 &lt;code&gt;asl&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fem9zkiefjx3tq0mhv04q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fem9zkiefjx3tq0mhv04q.png" alt="5  raw `asl` endraw " width="278" height="571"&gt;&lt;/a&gt;&lt;br&gt;
5 &lt;code&gt;asl&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Notice at 4 and 5 &lt;code&gt;asl&lt;/code&gt;, it is filled with all black pixels. Shifting bits the to left 4+ times will being the value into the second byte, leaving the first byte to the filled with 0’s. For example let’s apply &lt;code&gt;asl&lt;/code&gt; 4 times to &lt;code&gt;01&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;01 = 0000 0001&lt;/code&gt; → &lt;code&gt;10 = 0001 0000&lt;/code&gt;. The second byte will be displayed in the bitmap visualizer, with 0 being a black pixel. We can see that the &lt;code&gt;1&lt;/code&gt; that starting in the first byte has been shifted into the second byte - leaving the first byte to be replaced with all 0’s.&lt;/p&gt;

&lt;h3&gt;
  
  
  Experiment 3: Repeating &lt;code&gt;iny&lt;/code&gt; Instructions
&lt;/h3&gt;

&lt;p&gt;We’ve seen &lt;code&gt;iny&lt;/code&gt; in the previous section where it was used to increment the memory address of a page. Let’s add more &lt;code&gt;iny&lt;/code&gt; instructions and observe the bitmap visualizer changes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbr7p005k5m6i8b911euu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbr7p005k5m6i8b911euu.png" alt="2  raw `iny` endraw " width="267" height="507"&gt;&lt;/a&gt;&lt;br&gt;
2 &lt;code&gt;iny&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy6mbhq36wfofj8fc2pnz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy6mbhq36wfofj8fc2pnz.png" alt="3  raw `iny` endraw " width="261" height="502"&gt;&lt;/a&gt;&lt;br&gt;
3 &lt;code&gt;iny&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuhe3r9pydhdvetgiucus.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuhe3r9pydhdvetgiucus.png" alt="4  raw `iny` endraw " width="265" height="529"&gt;&lt;/a&gt;&lt;br&gt;
4 &lt;code&gt;iny&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffedpv1kvc7im5xiyfx1y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffedpv1kvc7im5xiyfx1y.png" alt="5  raw `iny` endraw " width="273" height="553"&gt;&lt;/a&gt;&lt;br&gt;
5 &lt;code&gt;iny&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;One key observation is the run animation of the when there are odd number of &lt;code&gt;iny&lt;/code&gt; instructions. With 3, each page is being passed through 3 times before moving to the next page. The same observation is made when there are 5 &lt;code&gt;iny&lt;/code&gt; instructions, where a page would be passed through 5 times before moving to the next page. &lt;/p&gt;

&lt;p&gt;When it comes to even number of &lt;code&gt;iny&lt;/code&gt; instructions, the bitmap displays vertical stripes but the larger the step, the wider the black stripe becomes. &lt;/p&gt;

&lt;p&gt;This pattern can be understood by the relationship by calculating the modulus. Let’s use 3 and 2. &lt;code&gt;255 mod 3 = 0&lt;/code&gt;, with no remainder it means all memory addresses will be filled. &lt;code&gt;255 mod 2 = 1&lt;/code&gt;, with a remainder of 1, it means that every other memory address is skipped. This explains why we get a vertical stripe pattern with even numbers. &lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;In this lab, we wrote some assembly to understand the flow of data between registers, and memory! Comparing assembly to high level programming languages (e.g. Python, JavaScript), a lot can go wrong since there isn’t a “safety” net that warns you about potential issues before running the code. &lt;/p&gt;

&lt;p&gt;Dealing with memory in general can be tricky since you need to facilitate the movement, allocation, and deallocation. With my current knowledge I expect memory management strategies to be similar to C/C++. &lt;/p&gt;

&lt;p&gt;The shifting of bits to the left or right was a completely new concept and found it interesting how such a “small” change is responsible for a large change, in this lab it can change an pixel to a completely different colour. I imagine in larger, complex programs, bit shifting can cause a catastrophic event. I’m excited to use this knowledge in preparation for the next lab! See you soon!&lt;/p&gt;

</description>
      <category>spo600</category>
      <category>6502</category>
      <category>assembly</category>
    </item>
    <item>
      <title>New Beginnings: SPO600</title>
      <dc:creator>JP </dc:creator>
      <pubDate>Mon, 13 Jan 2025 16:22:20 +0000</pubDate>
      <link>https://dev.to/jpjpjp/new-beginnings-spo600-35n1</link>
      <guid>https://dev.to/jpjpjp/new-beginnings-spo600-35n1</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;When selecting my courses for my last semester, I saw “SPO600 - Software Portability and Optimization” and thought to myself - this is a good opportunity to step out of comfort zone of web technologies and learn about how software “works under the hood”. &lt;/p&gt;

&lt;p&gt;After reading the course description and I Googled “what is software portability?” One of the top answers were: “&lt;strong&gt;the ability of software to be efficiently used across different environments without losing functionality or quality&lt;/strong&gt;.” Through continued self research, portability deals with the “nitty-gritty” of code - where the code we write in high-level languages gets translated into machine code, which is specific to the architecture of the machine it is being run on.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flomqecvbjzh2v9j4sajy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flomqecvbjzh2v9j4sajy.gif" alt="image.png" width="548" height="259"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We interact with software everyday and most of us, myself included, don’t think twice about how and why it works? By the end of this course I want to understand “How do multi-platforms apps/games work?”, “How do game emulators work?”, “Why are some programming languages ‘faster’ than others?”. Of course these are a handful of questions I have but I believe I will have more interesting ones as the course progresses! &lt;/p&gt;

&lt;p&gt;I’ll have more updates soon!&lt;/p&gt;

&lt;p&gt;Jon&lt;/p&gt;




&lt;p&gt;Reference: Ram, J. (n.d.). Figure showing the translation of high-level language into machine code. Retrieved from &lt;a href="https://www.cs.trincoll.edu/%7Eram/jjjnotes/ch0/img2.gif" rel="noopener noreferrer"&gt;https://www.cs.trincoll.edu/~ram/jjjnotes/ch0/img2.gif&lt;/a&gt;&lt;/p&gt;

</description>
      <category>spo600</category>
    </item>
  </channel>
</rss>
