<?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: Juro Zaw</title>
    <description>The latest articles on DEV Community by Juro Zaw (@jurozaw).</description>
    <link>https://dev.to/jurozaw</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%2F2677125%2Fca7a59c4-f69d-4339-ae9c-9f8d3759118a.jpg</url>
      <title>DEV Community: Juro Zaw</title>
      <link>https://dev.to/jurozaw</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jurozaw"/>
    <language>en</language>
    <item>
      <title>Queues - DSA Notes 📝</title>
      <dc:creator>Juro Zaw</dc:creator>
      <pubDate>Mon, 12 May 2025 22:21:36 +0000</pubDate>
      <link>https://dev.to/jurozaw/queues-dsa-notes-33l1</link>
      <guid>https://dev.to/jurozaw/queues-dsa-notes-33l1</guid>
      <description>&lt;h2&gt;
  
  
  🎯 Learning Goals
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;What are Queues and how to implement them?&lt;/li&gt;
&lt;li&gt;What are their time complexities?&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 Key Concepts (aka My Notes)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;FIFO - First In, First Out

&lt;ul&gt;
&lt;li&gt;Enqueue = Pushing at the end&lt;/li&gt;
&lt;li&gt;Dequeue = Removing from the &lt;strong&gt;beginning&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Achieve it using &lt;code&gt;LinkedList&lt;/code&gt;
&lt;/li&gt;

&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Think of this as a line (left and right) whereas a stack is vertical (top and bottom).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Enqueue
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;We are using singly linked list here.&lt;/li&gt;
&lt;li&gt;Need to check for cases where queue is empty and where it is not
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;enqueue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&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="n"&gt;newNode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ListNode&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;if&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;next&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;newNode&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;next&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;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;newNode&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⌚ Time complexity is &lt;code&gt;O(1)&lt;/code&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  Dequeue
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Let’s check if the queue is empty too and then return the value
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;dequeue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# if the queue is empty
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&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;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;
    &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;next&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⌚ Time complexity is &lt;code&gt;O(1)&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;There is also a ‘Deque’ data structure which allows you to enqueue and dequeue from both head and tail.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⌚ Time Complexities
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operation&lt;/th&gt;
&lt;th&gt;Big-0&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Enqueue&lt;/td&gt;
&lt;td&gt;O(1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dequeue&lt;/td&gt;
&lt;td&gt;O(1)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  💪 LeetCode Problems
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;1700. Number of Students Unable to Eat Lunch (&lt;a href="https://leetcode.com/problems/number-of-students-unable-to-eat-lunch/description/" rel="noopener noreferrer"&gt;Link&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;225. Implement Stack using Queues (&lt;a href="https://leetcode.com/problems/implement-stack-using-queues/description/" rel="noopener noreferrer"&gt;Link&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
    </item>
    <item>
      <title>Doubly Linked Lists - DSA Notes 📝</title>
      <dc:creator>Juro Zaw</dc:creator>
      <pubDate>Fri, 09 May 2025 21:14:35 +0000</pubDate>
      <link>https://dev.to/jurozaw/doubly-linked-lists-dsa-notes-1bdo</link>
      <guid>https://dev.to/jurozaw/doubly-linked-lists-dsa-notes-1bdo</guid>
      <description>&lt;h2&gt;
  
  
  🎯 Learning Goals
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;What are doubly linked lists?&lt;/li&gt;
&lt;li&gt;What are its operations’ time complexities?&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 Key Concepts (aka My Notes)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Two pointers (&lt;code&gt;next&lt;/code&gt; and &lt;code&gt;prev&lt;/code&gt;)

&lt;ul&gt;
&lt;li&gt;Null &lt;code&gt;prev&lt;/code&gt; means it is the head of the list&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Insertion at End
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Same as Singly Linked&lt;/li&gt;
&lt;li&gt;But, make sure to update &lt;code&gt;prev&lt;/code&gt; pointer too&lt;/li&gt;
&lt;li&gt;The order is important

&lt;ul&gt;
&lt;li&gt;Don’t update the &lt;code&gt;tail&lt;/code&gt; pointer without updating the old &lt;code&gt;tail&lt;/code&gt;’s &lt;code&gt;next&lt;/code&gt; and &lt;code&gt;NewListNode&lt;/code&gt;’s &lt;code&gt;prev&lt;/code&gt;)
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;next&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;NewListNode&lt;/span&gt;
&lt;span class="n"&gt;NewListNode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tail&lt;/span&gt;
&lt;span class="c1"&gt;# Update tail pointers
&lt;/span&gt;&lt;span class="n"&gt;tail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;next&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⌚ Time complexity is &lt;code&gt;O(1)&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Deletion at End
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Deletion means just not having anything point to that last node&lt;/li&gt;
&lt;li&gt;For this one, important to save the pointer to the node before the  &lt;code&gt;tail&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;So that, we can set the tail pointer to that node.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Here, &lt;code&gt;ListNode2&lt;/code&gt; is just a variable name. It can be &lt;code&gt;temp&lt;/code&gt; or anything.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;ListNode2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prev&lt;/span&gt;
&lt;span class="n"&gt;ListNode2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;next&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;
&lt;span class="n"&gt;tail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ListNode2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⌚ Time complexity is &lt;code&gt;O(1)&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O(1) insertion and deletion means that theoretically we can use these guys are implement &lt;strong&gt;Stacks&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Access
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Same as Singly Linked List, but can go both directions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⌚ Time complexity is &lt;code&gt;O(n)&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ⌚ Time Complexities
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operation&lt;/th&gt;
&lt;th&gt;Big-O&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Access&lt;/td&gt;
&lt;td&gt;O(n)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Search&lt;/td&gt;
&lt;td&gt;O(n)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Insertion (end)&lt;/td&gt;
&lt;td&gt;O(1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deletion (end)&lt;/td&gt;
&lt;td&gt;O(1)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  💪 LeetCode Problems
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;707. Design Linked List (&lt;a href="https://leetcode.com/problems/design-linked-list/description/" rel="noopener noreferrer"&gt;Link&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;1472. Design Browser History (&lt;a href="https://leetcode.com/problems/design-browser-history/description/" rel="noopener noreferrer"&gt;Link&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
    </item>
    <item>
      <title>Singly Linked Lists - DSA Notes 📝</title>
      <dc:creator>Juro Zaw</dc:creator>
      <pubDate>Tue, 06 May 2025 00:00:28 +0000</pubDate>
      <link>https://dev.to/jurozaw/singly-linked-lists-dsa-notes-5amf</link>
      <guid>https://dev.to/jurozaw/singly-linked-lists-dsa-notes-5amf</guid>
      <description>&lt;h2&gt;
  
  
  🎯 Learning Goals
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;What are the characteristics of Singly Linked Lists?&lt;/li&gt;
&lt;li&gt;What are its time complexities?&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 Key Concepts (aka My Notes)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is a &lt;code&gt;ListNode&lt;/code&gt;?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Has a &lt;strong&gt;&lt;code&gt;value&lt;/code&gt;&lt;/strong&gt; and a &lt;strong&gt;&lt;code&gt;next&lt;/code&gt;&lt;/strong&gt; pointer

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;next&lt;/code&gt;&lt;/strong&gt; is a reference to another &lt;code&gt;ListNode&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Order in memory may not be &lt;strong&gt;contiguous&lt;/strong&gt; (unlike arrays which are)&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Traversal
&lt;/h3&gt;

&lt;p&gt;Simple while loop with a current pointer can be used:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;cur&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ListNode1&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;cur&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;cur&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cur&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;next&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⌚ Time complexity is &lt;code&gt;O(n)&lt;/code&gt; , where n is the number of nodes in the linked list&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Now if the Linked List is circular (i.e. last node points back to first) traversing like this would cause an &lt;strong&gt;infinite&lt;/strong&gt; loop.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;It would be helpful if we’re keeping track of the &lt;code&gt;head&lt;/code&gt; and the &lt;code&gt;tail&lt;/code&gt; of the linked list using pointers&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Insertion
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Advantage over array is that inserting is always &lt;code&gt;O(1)&lt;/code&gt; even if we insert in middle.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s say we wanna add at the end or &lt;code&gt;tail&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;next&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;NewListNode&lt;/span&gt;
&lt;span class="n"&gt;tail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;NewListNode&lt;/span&gt;
&lt;span class="c1"&gt;# or this line 'tail = tail.next', both are correct
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⌚ Time complexity is &lt;code&gt;O(1)&lt;/code&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  Deletion
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Removing any node is constant time &lt;strong&gt;ASSUMING&lt;/strong&gt; we have a pointer to the &lt;strong&gt;previous&lt;/strong&gt; node.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s say we wanna remove the second node:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;next&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;next&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;next&lt;/span&gt;
&lt;span class="c1"&gt;# Just set the next pointer of head to the one after the deleted node
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Can be assumed that garbage collection will take place for the deleted node&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⌚ Time complexity is &lt;code&gt;O(1)&lt;/code&gt; &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For both of these operations, the caveat is if we don’t have a &lt;strong&gt;reference&lt;/strong&gt; to the node at the desired position (&lt;code&gt;head&lt;/code&gt; or &lt;code&gt;tail&lt;/code&gt;), the time will still be &lt;code&gt;O(n)&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  ⌚ Time Complexities
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operation&lt;/th&gt;
&lt;th&gt;Big-O&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Reading/ Access&lt;/td&gt;
&lt;td&gt;O(n)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Traversal/ Search&lt;/td&gt;
&lt;td&gt;O(n)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Insertion&lt;/td&gt;
&lt;td&gt;O(1)*&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deletion&lt;/td&gt;
&lt;td&gt;O(1)*&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;*Assumes you have a reference to the node at the position (if not it is &lt;code&gt;O(n)&lt;/code&gt; )&lt;/p&gt;

&lt;h2&gt;
  
  
  💪 LeetCode Problems
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;206. Reverse Linked List (&lt;a href="https://leetcode.com/problems/reverse-linked-list/description/" rel="noopener noreferrer"&gt;Link&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;21. Merge Two Sorted Lists (&lt;a href="https://leetcode.com/problems/merge-two-sorted-lists/description/" rel="noopener noreferrer"&gt;Link&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
    </item>
    <item>
      <title>Stacks - DSA Notes 📝</title>
      <dc:creator>Juro Zaw</dc:creator>
      <pubDate>Thu, 01 May 2025 16:46:36 +0000</pubDate>
      <link>https://dev.to/jurozaw/stacks-dsa-notes-8om</link>
      <guid>https://dev.to/jurozaw/stacks-dsa-notes-8om</guid>
      <description>&lt;h2&gt;
  
  
  🎯 Learning Goals
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;How are Stacks implemented?&lt;/li&gt;
&lt;li&gt;What are the time complexities?&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 Key Concepts (aka My Notes)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Stacks
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Dynamic arrays are already Stacks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LIFO&lt;/strong&gt; (Last In is the First Out)&lt;/li&gt;
&lt;li&gt;There should be a pointer for the last element in the array.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Push
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Appending an element to the end of a dynamic array&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⌚ Time Complexity is O(1).&lt;/p&gt;

&lt;h3&gt;
  
  
  Push
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Removing an element to the end of a dynamic array&lt;/li&gt;
&lt;li&gt;It is wise to check if the stack is empty before popping&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⌚ Time Complexity is O(1).&lt;/p&gt;

&lt;h3&gt;
  
  
  Peek
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Returning an element to the end of a dynamic array&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⌚ Time Complexity is O(1).&lt;/p&gt;

&lt;h2&gt;
  
  
  ⌚ Time Complexity for Stacks
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operation&lt;/th&gt;
&lt;th&gt;Big-O&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Push&lt;/td&gt;
&lt;td&gt;O(1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pop&lt;/td&gt;
&lt;td&gt;O(1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Peek&lt;/td&gt;
&lt;td&gt;O(1)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  💪 LeetCode Problems
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;155. Min Stack (&lt;a href="https://leetcode.com/problems/min-stack/description/" rel="noopener noreferrer"&gt;Link&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;20. Valid Parentheses (&lt;a href="https://leetcode.com/problems/valid-parentheses/description/" rel="noopener noreferrer"&gt;Link&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
    </item>
    <item>
      <title>Dynamic Arrays - DSA Notes 📝</title>
      <dc:creator>Juro Zaw</dc:creator>
      <pubDate>Thu, 01 May 2025 16:15:09 +0000</pubDate>
      <link>https://dev.to/jurozaw/dynamic-arrays-dsa-notes-49l8</link>
      <guid>https://dev.to/jurozaw/dynamic-arrays-dsa-notes-49l8</guid>
      <description>&lt;h2&gt;
  
  
  🎯 Learning Goal
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;What are the characteristics of dynamic arrays?&lt;/li&gt;
&lt;li&gt;What are the time complexities of dynamic arrays?&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 Key Concepts (aka My Notes)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Dynamic Arrays
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Can grow as elements are added.&lt;/li&gt;
&lt;li&gt;Different languages have different default array size (Java = 10 and C# = 4)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Insertion at end (Pushing)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;End Pointer (or length) is important!&lt;/li&gt;
&lt;li&gt;Insert a value at &lt;code&gt;arr[length]&lt;/code&gt; and resize if &lt;code&gt;length &amp;gt;= capacity&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Insert n in the last position of the array
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;pushback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;capacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resize&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# insert at next empty position
&lt;/span&gt;    &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;
    &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⌚ Amortized Time Complexity is O(1)&lt;/p&gt;

&lt;p&gt;This is &lt;strong&gt;amortized&lt;/strong&gt;, meaning it's the average time taken for a sequence of pushing operations.&lt;/p&gt;

&lt;p&gt;The resizing only happen when the array runs out of size, which does not happen on every push.&lt;/p&gt;

&lt;p&gt;This is the same for deleting at end (popping)&lt;/p&gt;

&lt;h3&gt;
  
  
  Resizing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Copy the values to a new static array which is 2x the size&lt;/li&gt;
&lt;li&gt;Deallocate the old array when everything has been copied over
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;resize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Create new array of double capacity
&lt;/span&gt;    &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;capacity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;capacity&lt;/span&gt;
    &lt;span class="n"&gt;newArr&lt;/span&gt; &lt;span class="o"&gt;=&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="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;capacity&lt;/span&gt; 

    &lt;span class="c1"&gt;# Copy elements to newArr
&lt;/span&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;newArr&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;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arr&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;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;newArr&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⌚ Time Complexity for resize is O(n)&lt;/p&gt;

&lt;h2&gt;
  
  
  🤔 Analyzing Time Complexity
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Analyzing means we consider &lt;strong&gt;the sum of all operations&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, to go from array of size 1 to size 8 requires 15 operations. Array operations went from 1 -&amp;gt; 2 -&amp;gt; 4 -&amp;gt; 8 (Don't forget to count the resizing as 1 extra operation.)&lt;/p&gt;

&lt;p&gt;The last term is always greater than the sum of all the terms before it. (1+ 2 + 4 &amp;lt; 8).&lt;/p&gt;

&lt;p&gt;The formula is that for any array size &lt;em&gt;n&lt;/em&gt;, it will take at most &lt;em&gt;2n&lt;/em&gt; operations. (15 &amp;gt; 2 . 8)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Constants are dropped in time complexity analysis.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's why resizing time complexity is O(n),&lt;/p&gt;

&lt;h2&gt;
  
  
  ⌚ Time Complexity for Dynamic Arrays
&lt;/h2&gt;

&lt;p&gt;Essentially the same as Static Arrays.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operation&lt;/th&gt;
&lt;th&gt;Big-O&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Access&lt;/td&gt;
&lt;td&gt;O(1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Insertion (at end)&lt;/td&gt;
&lt;td&gt;O(1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Insertion (at middle)&lt;/td&gt;
&lt;td&gt;O(n) because of shifting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deletion (at end)&lt;/td&gt;
&lt;td&gt;O(1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deletion (at middle)&lt;/td&gt;
&lt;td&gt;O(n) because of shifting&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  💪 LeetCode Problems
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;1929. Concatenation of Array (&lt;a href="https://leetcode.com/problems/concatenation-of-array/description/" rel="noopener noreferrer"&gt;Link&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
    </item>
    <item>
      <title>Static Arrays - DSA Notes 📝</title>
      <dc:creator>Juro Zaw</dc:creator>
      <pubDate>Wed, 30 Apr 2025 00:46:10 +0000</pubDate>
      <link>https://dev.to/jurozaw/static-arrays-dsa-notes-3h43</link>
      <guid>https://dev.to/jurozaw/static-arrays-dsa-notes-3h43</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Welcome to my new series on the BIG topic, Data Structures &amp;amp; Algorithms. Follow along with me as I learn everything about DSA to grind &lt;a href="https://leetcode.com/" rel="noopener noreferrer"&gt;Leetcode&lt;/a&gt;!💪 &lt;br&gt;
Here, you will find all my notes on the topic. Starting everything off with Arrays. 😀&lt;/p&gt;

&lt;h2&gt;
  
  
  🎯 Learning Goal
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;What are the characteristics of static arrays?&lt;/li&gt;
&lt;li&gt;What does reading, inserting and deleting look like for static arrays?&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 Key Concepts (aka My Notes)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Static Arrays
&lt;/h3&gt;

&lt;p&gt;The size of a static array cannot change once declared. Once they are full, you cannot add more items.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reading
&lt;/h3&gt;

&lt;p&gt;Accessing a certain element in an array is always &lt;strong&gt;instant&lt;/strong&gt; because you have the &lt;strong&gt;index&lt;/strong&gt; number.&lt;/p&gt;

&lt;p&gt;⌚ Time complexity is &lt;code&gt;O(1)&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;O(1)&lt;/code&gt; means it's constant time. Even if the size of the data grows, the number of operations stay the same.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Traversing
&lt;/h3&gt;

&lt;p&gt;You can use &lt;code&gt;for&lt;/code&gt;/ &lt;code&gt;while&lt;/code&gt; loops to go through an array and do a certain operation. (for example, printing everything in an array)&lt;/p&gt;

&lt;p&gt;⌚ For an array of size &lt;code&gt;n&lt;/code&gt;, the time complexity is &lt;code&gt;O(n)&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;This means that the number of operations grow linearly with the size of the data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deleting
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Deleting from End of Array
&lt;/h4&gt;

&lt;p&gt;In statically typed languages (not JS or Python), you can remove element at the end (&lt;code&gt;n-1&lt;/code&gt; index) by the way of &lt;strong&gt;soft delete&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Soft Delete&lt;/strong&gt; is basically overwriting the value of an element you wanna delete to &lt;code&gt;0&lt;/code&gt;, &lt;code&gt;null&lt;/code&gt; or &lt;code&gt;-1&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# The last element is overwritten by 0. Length is decremented.
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;deleteEnd&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;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;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;length&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="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⌚ Time complexity is &lt;code&gt;O(1)&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Deleting at &lt;code&gt;ith&lt;/code&gt; index
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Shift all values one position to the &lt;strong&gt;left&lt;/strong&gt; of the index &lt;code&gt;i&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;By shift to left, it means just overwrite the &lt;code&gt;arr[i]&lt;/code&gt; with the value from the right
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;deleteMiddle&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;length&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="c1"&gt;# From i + 1 to length - 1, shift left by one position
&lt;/span&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&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="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;arr&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="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="n"&gt;arr&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⌚ Time complexity is &lt;code&gt;O(n)&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;This is because the worst case is we have to shift everything in the array of &lt;code&gt;n&lt;/code&gt; size to &lt;br&gt;
the left.&lt;/p&gt;

&lt;h3&gt;
  
  
  Insertion
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Inserting at the End of Array
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Insert at the &lt;code&gt;length&lt;/code&gt; index.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;insertEnd&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;capacity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;capacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⌚ Time complexity is &lt;code&gt;O(1)&lt;/code&gt;. &lt;/p&gt;

&lt;h4&gt;
  
  
  Inserting at the &lt;code&gt;ith&lt;/code&gt; index
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Shift everything to the &lt;strong&gt;right&lt;/strong&gt; of &lt;code&gt;i&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;If it's full, the last element is lost&lt;/li&gt;
&lt;li&gt;Then, insert at the specified index
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;insertMiddle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&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;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Shift elements to the right to make space for the new element
&lt;/span&gt;    &lt;span class="k"&gt;if&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;length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Index will decrement from the very end up to i
&lt;/span&gt;        &lt;span class="c1"&gt;# value at i will move and we overwrite the old value with our inserted value
&lt;/span&gt;        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;length&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;-&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="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;arr&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="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="n"&gt;arr&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="c1"&gt;# Insert vale at specified index
&lt;/span&gt;        &lt;span class="n"&gt;arr&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;value&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⌚ Time complexity is &lt;code&gt;O(n)&lt;/code&gt;. &lt;/p&gt;

&lt;h3&gt;
  
  
  ⌚ Time Complexity
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operation&lt;/th&gt;
&lt;th&gt;Big-O Time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Reading&lt;/td&gt;
&lt;td&gt;O(1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Insertion (at end)&lt;/td&gt;
&lt;td&gt;O(1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Insertion (at &lt;code&gt;i&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;O(n)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deletion (at end)&lt;/td&gt;
&lt;td&gt;O(1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deletion (at &lt;code&gt;i&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;O(n)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  💪 LeetCode Problems
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;26. Remove Duplicates from Sorted Array (&lt;a href="https://leetcode.com/problems/remove-duplicates-from-sorted-array/description/" rel="noopener noreferrer"&gt;Link&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;27. Remove Element (&lt;a href="https://leetcode.com/problems/remove-element/description/" rel="noopener noreferrer"&gt;Link&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
    </item>
    <item>
      <title>Tidy &amp; Wrap Up - Project Stage 03</title>
      <dc:creator>Juro Zaw</dc:creator>
      <pubDate>Thu, 17 Apr 2025 23:02:06 +0000</pubDate>
      <link>https://dev.to/jurozaw/tidy-wrap-up-project-stage-03-38h2</link>
      <guid>https://dev.to/jurozaw/tidy-wrap-up-project-stage-03-38h2</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Welcome to the final blog post of SPO600 series! 😄&lt;/p&gt;

&lt;p&gt;This stage of the project will focus on enhancing some features as well as fix anything from stage 02.&lt;/p&gt;

&lt;p&gt;You might remember from stage 02, the code was running on &lt;code&gt;x86&lt;/code&gt;, but failing on &lt;code&gt;AArch64&lt;/code&gt; with a &lt;strong&gt;segmentation&lt;/strong&gt; fault. This would be my first thing to fix before I could proceed with implementing the new functionality.&lt;/p&gt;




&lt;h2&gt;
  
  
  Debugging the AArch64 Segmentation Issue
&lt;/h2&gt;

&lt;p&gt;Looking at the error backtrace from &lt;code&gt;AArch64&lt;/code&gt;, I can see that my GCC pass is crashing in the &lt;code&gt;compare_functions&lt;/code&gt; method when trying to print GIMPLE statements.&lt;/p&gt;

&lt;p&gt;The issue is in how I'm calling &lt;code&gt;print_gimple_stmt&lt;/code&gt;. On &lt;code&gt;AArch64&lt;/code&gt;, the statement might have unexpected structures or null pointers that cause the printing function to crash. This part:&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;gimple_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt1&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_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt2&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;dump_file&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;"Statement %zu: Different gimple codes&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;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;print_gimple_stmt&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="n"&gt;stmt1&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;TDF_SLIM&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// Line 164 - causing crash&lt;/span&gt;
        &lt;span class="n"&gt;print_gimple_stmt&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="n"&gt;stmt2&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;TDF_SLIM&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add a safety check and I'll modify the function to print in another way as it is the one that is causing the issue.&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;// Iterate through statements and compare them&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;func1_stmts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&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;gimple&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;stmt1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;func1_stmts&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;gimple&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;stmt2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;func2_stmts&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="c1"&gt;// Add safety check for null statements&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;stmt1&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;stmt2&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;dump_file&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;"Statement %zu: One or both statements are null&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;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="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="c1"&gt;// Check if statement codes are different&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;stmt1&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_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt2&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;dump_file&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;"Statement %zu: Different gimple codes (%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;i&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;stmt1&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;stmt2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

        &lt;span class="c1"&gt;// Use safer printing method without TDF_SLIM flag, which might be causing issues on AArch64&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;"Statement 1 code: %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;gimple_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt1&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;"Statement 2 code: %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;gimple_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt2&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="c1"&gt;// Rest of the comparison logic...&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Now, let's run this code in our &lt;code&gt;/spo600/examples/test-clone&lt;/code&gt; directory. The details for running this code has been presented in the previous stage 02. &lt;/p&gt;

&lt;p&gt;This is the output after running &lt;code&gt;make all&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%2Fw0okz9gh3kdxmhs02scp.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%2Fw0okz9gh3kdxmhs02scp.png" alt="Output" width="800" height="245"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There seems to be no more segmentation fault and the program seemed to have been compiled by GCC. Let's check our dump file.&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%2Fpfeg4fq8cjwgge4snxae.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%2Fpfeg4fq8cjwgge4snxae.png" alt="Dump File" width="800" height="252"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This seems to be working, so that's done!&lt;/p&gt;




&lt;h2&gt;
  
  
  Guaranteeing Prune Output for Every Function
&lt;/h2&gt;

&lt;p&gt;During stage 2,  I discovered that non‑clone functions (like &lt;code&gt;main&lt;/code&gt;, &lt;code&gt;.resolver&lt;/code&gt;, or any routine without a &lt;code&gt;.&amp;lt;variant&amp;gt;&lt;/code&gt; suffix) were being silently skipped. There was no decision at all for these functions.&lt;/p&gt;

&lt;p&gt;I want to fix it so that there is a prune decision for every single function, regardless of here is a variant or not.&lt;/p&gt;

&lt;p&gt;First, as soon as we enter &lt;code&gt;execute&lt;/code&gt;, if we deem it as not a clone by our &lt;code&gt;is_clone_function&lt;/code&gt;, print a decision and return immediately.&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="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;is_clone_or_default&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;is_clone_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fndecl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;base_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;variant&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_clone_or_default&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="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;func_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;IDENTIFIER_POINTER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DECL_NAME&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fndecl&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;dump_file&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;"NOPRUNE: %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;func_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="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_clone_or_default&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="c1"&gt;// The rest ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, when we push a &lt;code&gt;.default&lt;/code&gt; into the group, check if its the only member. If so, there’s nothing to prune against, so print "NOPRUNE: base.default" right away.&lt;/p&gt;

&lt;p&gt;Change that part to this:&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;is_clone_or_default&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="c1"&gt;// Some code.....&lt;/span&gt;

    &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clone_groups&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;base_name&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="n"&gt;group&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;info&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;info&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;variant&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;".default"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&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="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;dump_file&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;"NOPRUNE: %s%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_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="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;variant&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="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;Now, when we check the test code, we can see every function has a decision attached to it!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Default&lt;/strong&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%2Fvjv0958s9tpuoc6flvvx.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%2Fvjv0958s9tpuoc6flvvx.png" alt="Output" width="800" height="112"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Variant&lt;/strong&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%2F0g9mt1i9v3mhioa5ym94.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%2F0g9mt1i9v3mhioa5ym94.png" alt="Output" width="800" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Function without variant&lt;/strong&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%2Fucczx3w3v4cbzl3yntyy.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%2Fucczx3w3v4cbzl3yntyy.png" alt="Output" width="672" height="143"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resolver&lt;/strong&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%2Fr82fd3l7cw6hffu9rcrv.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%2Fr82fd3l7cw6hffu9rcrv.png" alt="Output" width="800" height="210"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Main&lt;/strong&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%2Fisuc7wbft04ueelbfkw0.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%2Fisuc7wbft04ueelbfkw0.png" alt="Ouput" width="751" height="245"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So that is working! &lt;/p&gt;

&lt;p&gt;When we run the same thing in &lt;code&gt;AArch64&lt;/code&gt; we can see that it runs as well.&lt;/p&gt;


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

&lt;p&gt;Now, we will need to create test cases to see if it can process multiple sets of cloned functions.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Source code for test cases: &lt;a href="https://github.com/kzaw28/spo600-project/tree/main/stage03" rel="noopener noreferrer"&gt;Here&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The test will have 2 functions.&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="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;stdlib.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="cp"&gt;#ifndef CLONE_ATTRIBUTE
#define CLONE_ATTRIBUTE
#endif
&lt;/span&gt;
&lt;span class="c1"&gt;// Simple arithmetic function – expected to be PRUNED&lt;/span&gt;
&lt;span class="n"&gt;CLONE_ATTRIBUTE&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;add_numbers&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="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="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;result&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="n"&gt;b&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;result&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;100&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;result&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;50&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="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&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="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Array-processing function – expected to be NOPRUNED&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;process_array&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;arr&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;size&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;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;size&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="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&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="mi"&gt;2&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;arr&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;arr&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="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;3&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;arr&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;arr&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="mi"&gt;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="p"&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;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Test add_numbers&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;"add_numbers(10,20) = %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;add_numbers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&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;"add_numbers(70,50) = %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;add_numbers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

    &lt;span class="c1"&gt;// Test process_array&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;10&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="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&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="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="n"&gt;process_array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&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;"Processed array: "&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;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="mi"&gt;10&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="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"%d "&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;array&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;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;"&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;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;add_numbers&lt;/code&gt; is a very simple arithmetic function. The compiler can easily optimize both variants to nearly identical code. So it is a great candidate for PRUNE.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;process_array&lt;/code&gt; has more data-dependent branching and loop-based behavior. The clones may diverge more due to architecture-specific vectorization, likely a NOPRUNE.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You need that CLONE_ATTRIBUTE for what we're going to do in the &lt;code&gt;Makefile&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now, that's not all. We have created the test but we need to modify the &lt;code&gt;Makefile&lt;/code&gt;. Essentially we want our &lt;code&gt;Makefile&lt;/code&gt; to compile two versions per architecture. (PRUNE and NOTPRUNE).&lt;/p&gt;

&lt;p&gt;We also want to inject the &lt;code&gt;target_clones&lt;/code&gt; attribute via macro. (This was done in the sample test that we used before).&lt;/p&gt;

&lt;p&gt;Add these to the &lt;code&gt;Makefile&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="cp"&gt;# x86‑64 PRUNE build
&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;tc1&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;test1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LIBRARIES&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CC&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;D&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;CLONE_ATTRIBUTE&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_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="err"&gt;'&lt;/span&gt; \
          &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;march&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="mi"&gt;64&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CFLAGS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;test1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LIBRARIES&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="err"&gt;$@&lt;/span&gt;

&lt;span class="cp"&gt;# x86‑64 NOPRUNE build
&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;tc1&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;test1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LIBRARIES&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CC&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;D&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;CLONE_ATTRIBUTE&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_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;"arch=x86-64-v3"&lt;/span&gt;&lt;span class="p"&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;march&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="mi"&gt;64&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CFLAGS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;test1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LIBRARIES&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="err"&gt;$@&lt;/span&gt;

&lt;span class="cp"&gt;# AArch64 PRUNE build
&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;aarch64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;tc1&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;test1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LIBRARIES&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CC&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;D&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;CLONE_ATTRIBUTE&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_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;"rng"&lt;/span&gt;&lt;span class="p"&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;march&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;armv8&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CFLAGS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;test1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LIBRARIES&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="err"&gt;$@&lt;/span&gt;

&lt;span class="cp"&gt;# AArch64 NOPRUNE build
&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;aarch64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;tc1&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;test1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LIBRARIES&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CC&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;D&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="n"&gt;CLONE_ATTRIBUTE&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_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;"sve2"&lt;/span&gt;&lt;span class="p"&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;march&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;armv8&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CFLAGS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;test1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LIBRARIES&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="err"&gt;$@&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;This is referenced from the professor's test case. Basically for each of our function in the test case there will be PRUNE and NOPRUNE builds. The CLONE_ATTRIBUTE helps us with that.&lt;/p&gt;

&lt;p&gt;Make sure to add our builds in the BINARIES macro.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AARCH64_BINARIES = clone-test-aarch64-prune clone-test-aarch64-noprune clone-test-aarch64-tc1-prune clone-test-aarch64-tc1-noprune
X86_BINARIES = clone-test-x86-prune clone-test-x86-noprune clone-test-x86-tc1-prune clone-test-x86-tc1-noprune
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now run &lt;code&gt;make all&lt;/code&gt; again, and check the dump files.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;make all
nano clone-test-x86-tc1-noprune-test1.c.265t.kzaw
nano clone-test-x86-tc1-prune-test1.c.265t.kzaw
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Test Case Results
&lt;/h2&gt;

&lt;h3&gt;
  
  
  x86 NOPRUNE Build
&lt;/h3&gt;

&lt;p&gt;Default &lt;code&gt;add_numbers&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%2Fgceem0b5wog30mbg27xj.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%2Fgceem0b5wog30mbg27xj.png" alt="Output" width="644" height="111"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Default &lt;code&gt;process_array&lt;/code&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%2Fk5nrc4plsdxx057l3jvx.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%2Fk5nrc4plsdxx057l3jvx.png" alt="Output" width="675" height="118"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;process_array.popcnt&lt;/code&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%2Fcjbebf2jplfvu1brhryr.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%2Fcjbebf2jplfvu1brhryr.png" alt="Output" width="681" height="176"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;add_numbers.popcnt&lt;/code&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%2Fic2g7napqyfdydorvk21.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%2Fic2g7napqyfdydorvk21.png" alt="Output" width="676" height="167"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The function dumped 'NOPRUNE' for resolvers and main.&lt;/p&gt;

&lt;h3&gt;
  
  
  x86 PRUNE Build
&lt;/h3&gt;

&lt;p&gt;Default &lt;code&gt;add_numbers&lt;/code&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%2Flxlx28cz43bnvlxu94dc.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%2Flxlx28cz43bnvlxu94dc.png" alt="Output" width="636" height="97"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Default &lt;code&gt;process_array&lt;/code&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%2F0chdq22e25nn5bpkiofc.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%2F0chdq22e25nn5bpkiofc.png" alt="Output" width="688" height="118"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;process_array.popcnt&lt;/code&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%2Fd0oc7kujozy7y8hm95v9.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%2Fd0oc7kujozy7y8hm95v9.png" alt="Output" width="685" height="169"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;add_numbers.popcnt&lt;/code&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%2Frm35otwms30yzhlwo6de.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%2Frm35otwms30yzhlwo6de.png" alt="Output" width="685" height="163"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The function dumped 'NOPRUNE' for resolvers and main.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You will notice that &lt;code&gt;add_numbers&lt;/code&gt; is PRUNE for both builds. That's because it is &lt;strong&gt;too simple&lt;/strong&gt;. Any modern architecture (even with vectorization, popcnt, etc.) will generate the same instructions for this function.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  AArch64 NOPRUNE Build
&lt;/h3&gt;

&lt;p&gt;Default &lt;code&gt;add_numbers&lt;/code&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%2Froscennjlos80neg167y.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%2Froscennjlos80neg167y.png" alt="Output" width="654" height="131"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Default &lt;code&gt;process_array&lt;/code&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%2F81wjayq1qfwi59fr8xrj.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%2F81wjayq1qfwi59fr8xrj.png" alt="Output" width="652" height="106"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;process_array.sve2&lt;/code&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%2Fusxfdl3p6ep7h5l4tw7u.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%2Fusxfdl3p6ep7h5l4tw7u.png" alt="Output" width="669" height="181"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;add_numbers.sve2&lt;/code&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%2Fdmrny7xgsr3zhtect4sj.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%2Fdmrny7xgsr3zhtect4sj.png" alt="Output" width="670" height="192"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The function dumped 'NOPRUNE' for resolvers and main.&lt;/p&gt;

&lt;h3&gt;
  
  
  AArch64 PRUNE Build
&lt;/h3&gt;

&lt;p&gt;Default &lt;code&gt;add_numbers&lt;/code&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%2Fv46yjcjz64o6jikqw880.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%2Fv46yjcjz64o6jikqw880.png" alt="Output" width="672" height="135"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Default &lt;code&gt;process_array&lt;/code&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%2Fekg7fm9f4z74jiuc3ycm.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%2Fekg7fm9f4z74jiuc3ycm.png" alt="Output" width="668" height="109"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;process_array.rng&lt;/code&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%2F7zzbxchlcmej5sd08cdz.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%2F7zzbxchlcmej5sd08cdz.png" alt="Output" width="674" height="176"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;add_numbers.rng&lt;/code&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%2Ferchwlbnl3r2r6a38i69.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%2Ferchwlbnl3r2r6a38i69.png" alt="Output" width="680" height="195"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The function dumped 'NOPRUNE' for resolvers and main.&lt;/p&gt;

&lt;p&gt;-- &lt;/p&gt;

&lt;h2&gt;
  
  
  Source Code
&lt;/h2&gt;

&lt;p&gt;Please note that all source code is available on my &lt;a href="https://github.com/kzaw28/spo600-project/tree/main/stage03" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You will find 3 files under &lt;code&gt;/stage03/&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Makefile&lt;/code&gt;: Makefile needed for running tests&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;test1.c&lt;/code&gt;: Test file&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tree-kzaw-fix-prune.cc&lt;/code&gt;: Updated pass&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Overall, this specific project stage allowed me to understand more about writing test cases for the pass. We've learnt much about compiling and adding logic to pass in the previous stages, and learning about test cases is a full circle moment. I learnt not only about writing a specific &lt;code&gt;test.c&lt;/code&gt; logic but also how to write a Makefile to run alongside the tests.&lt;/p&gt;

&lt;p&gt;This whole project and SPO600 series enabled me to think deeper and dive into the world of assembly language. From the basic 6502 language to actually working on the &lt;code&gt;gcc&lt;/code&gt; compiler, it's all such a cool experience. I will cherish the learnings I have obtained from this course, and I'm sure understanding the most basic language will help me become a better programmer! 😄&lt;/p&gt;

&lt;p&gt;Thank you so much for following me along on this journey. Till next time ~&lt;/p&gt;

</description>
    </item>
    <item>
      <title>6502 Program Lab - Lab 3</title>
      <dc:creator>Juro Zaw</dc:creator>
      <pubDate>Sat, 12 Apr 2025 00:00:07 +0000</pubDate>
      <link>https://dev.to/jurozaw/lab-3-6502-program-lab-3594</link>
      <guid>https://dev.to/jurozaw/lab-3-6502-program-lab-3594</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Welcome to Lab 3! 😄&lt;/p&gt;

&lt;p&gt;In this lab, I will be creating a simple program in the 6502 assembly language. Before I tell you what program I am writing, there are some requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Must work in &lt;a href="http://6502.proximity.on.ca/" rel="noopener noreferrer"&gt;6502 Emulator&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Must output to character screen and graphics screen&lt;/li&gt;
&lt;li&gt;Must input from user keyboard&lt;/li&gt;
&lt;li&gt;Must use arithmetic operations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fulfilling these requirements, the program I am writing is a &lt;strong&gt;random number guessing game&lt;/strong&gt;! &lt;/p&gt;

&lt;p&gt;How the game plays: the player tries to guess a random number between 1 and 9. They get 5 tries, and the outcome is a bitmap display filled with a color (green for a win, red for a loss). &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;✅ The source code is provided at the end of this blog post  after the whole thing has been walked through!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let's start!&lt;/p&gt;




&lt;h2&gt;
  
  
  📌 Setup &amp;amp; ROM Routines
&lt;/h2&gt;

&lt;p&gt;Before we get into the main game loop, I need to define a few ROM routines. These routines will handle things like screen clearing, keyboard input, and text output.&lt;/p&gt;

&lt;p&gt;I also allocate zero page variables for fast access.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;; ROM routines entry points
define SCINIT  $ff81    ; initialize/clear screen
define CHRIN   $ffcf    ; input character from keyboard
define CHROUT  $ffd2    ; output character to screen

; Zero Page Variables
define TEXT_PTR   $40  ; pointer for text (low byte)
define TEXT_PTR_H $41  ; pointer for text (high byte)
define GUESS      $42  ; user guess
define ATTEMPTS   $43  ; remaining attempts (5 tries)
define ANSWER     $45  ; correct answer (ASCII value)

* = $0600      ; Program starts here

    JSR SCINIT          ; Clear screen

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

&lt;/div&gt;






&lt;h2&gt;
  
  
  📌 Random Number Generation
&lt;/h2&gt;

&lt;p&gt;Let's start with this part as I want to make sure the random number is generating properly before continuing on. &lt;/p&gt;

&lt;p&gt;We know that &lt;code&gt;6502&lt;/code&gt; does not have true randomness. So we use pseudo-random behavior from system memory. I used the value at &lt;code&gt;$FE&lt;/code&gt; (a common pseudo-random location), but filtered it to keep only ASCII '1' to '9'.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RANDOM:
getRandom:
    LDA $FE         ; Load a value from memory address $FE
    CMP #$31        ; Compare with ASCII '1' (value = $31)
    BCC getRandom   ; If it's less than '1', try again
    CMP #$3A        ; Compare with ASCII ':' (value = $3A, one past '9')
    BCS getRandom   ; If it's '9' or more, try again
    RTS             ; Return with a valid value in A
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's quite simple. We compare the &lt;code&gt;$FE&lt;/code&gt; value so that it can be only between 1 and 9. &lt;/p&gt;

&lt;p&gt;This loop continues until value is between &lt;code&gt;$31&lt;/code&gt; and &lt;code&gt;$39&lt;/code&gt;, which are the ASCII values for '1' to '9'.&lt;/p&gt;

&lt;p&gt;Then I use it in the main code (under that &lt;code&gt;JSR SCINIT&lt;/code&gt; line):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    JSR RANDOM
    STA ANSWER
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📌 Welcome Message!
&lt;/h2&gt;

&lt;p&gt;While we're at the main code, let's set the stage for the game. I want to print a nice welcome message and give the player 5 tries. I also reused a simple &lt;code&gt;PRINT&lt;/code&gt; subroutine that walks over null-terminated strings.&lt;/p&gt;

&lt;p&gt;I want to show something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT A NUMBER ( 1 - 9 )
YOU HAVE 5 CHANCES!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This should be straightforward. Please feel free to read the comments to see what it does in details. &lt;/p&gt;

&lt;p&gt;Referenced from &lt;a href="http://spo600.proximity.on.ca/doku.php?id=spo600:6502_emulator_example_code" rel="noopener noreferrer"&gt;SPO600: Place a Message on the Character Display&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;    LDA #$05         ; Load 5 into A (the number of tries)
    STA ATTEMPTS     ; Store it in ATTEMPTS variable

    LDA #&amp;lt;TITLE      ; Load the low byte of TITLE address into A
    STA TEXT_PTR     ; Store it in TEXT_PTR (pointer to the string)

    LDA #&amp;gt;TITLE      ; Load the high byte of TITLE address
    STA TEXT_PTR_H   ; Store it in TEXT_PTR_H (high part of pointer)

    LDY #$00         ; Set index Y = 0
    JSR PRINT        ; Call the PRINT subroutine to display the message

&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;PRINT:
    LDA (TEXT_PTR), Y    ; Load byte at address (TEXT_PTR + Y)
    BEQ DONE             ; If byte = 0 (null terminator), end of string
    JSR CHROUT           ; Otherwise, print the character
    INY                  ; Move to next character
    BNE PRINT            ; Loop until we hit null (BNE is always true unless Y wraps)
DONE:
    RTS
&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;TITLE:
    DCB "S","E","L","E","C","T",32,"A",32,"N","U","M","B","E","R",32
    DCB "(",32,"1",32,"-",32,"9",32,")",13
    DCB "Y","O","U",32,"H","A","V","E",32,"5",32,"C","H","A","N","C","E","S","!",0

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

&lt;/div&gt;



&lt;p&gt;At this point, if you run the code, you should get something like this:&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%2Fns43n8ipzj1hemnfglff.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%2Fns43n8ipzj1hemnfglff.png" alt="Welcome Message" width="219" height="92"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  📌 The Main Game Loop
&lt;/h2&gt;

&lt;p&gt;Now let's finish defining the main loop: it prints the input prompt, takes input, validates it, then compares it to the answer.&lt;/p&gt;

&lt;p&gt;Printing the input prompt is basically the same as printing the title:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;START:
    LDA #&amp;lt;INPUT         
    STA TEXT_PTR        
    LDA #&amp;gt;INPUT         
    STA TEXT_PTR_H      
    LDY #$00            
    JSR PRINT           
&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;INPUT:
    DCB 13,13
    DCB "E","N","T","E","R",32,"A",32,"N","U","M","B","E","R",32
    DCB "(",32,"1",32,"-",32,"9",32,")",":",32,0

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

&lt;/div&gt;



&lt;p&gt;After that, wait for input and then validate it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WAIT_INPUT:
    JSR CHRIN           ; Wait for player keypress (returns ASCII in A)

    CMP #$31            ; Compare with ASCII '1'
    BMI WAIT_INPUT      ; If below, invalid → wait again
    CMP #$3A            ; Compare with ASCII ':'
    BPL WAIT_INPUT      ; If 9 or above (':'), invalid → wait again

    STA GUESS           ; Save valid guess to GUESS variable
    JSR CHROUT          ; Echo the guess back to screen (user feedback)

    CMP ANSWER          ; Compare guess with the correct answer
    BEQ WIN             ; If equal → player wins!
    BCC HIGHER          ; If less → guess is lower → suggest to go higher
    BCS LOWER           ; If more → guess is higher → suggest to go lower
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We validate the input to prevent invalid characters. If it's a match, we jump to &lt;code&gt;WIN&lt;/code&gt;. Otherwise, we give feedback.&lt;/p&gt;




&lt;h2&gt;
  
  
  📌 Feedback: Higher or Lower
&lt;/h2&gt;

&lt;p&gt;You might have noticed &lt;code&gt;HIGHER&lt;/code&gt; and &lt;code&gt;LOWER&lt;/code&gt; when validating user input. It's basically just printing to the screen whether the number needs to be higher or not.&lt;/p&gt;

&lt;p&gt;The condition is already done in the main loop. So just define the text and the printing logic that we have used already before:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HIGHER_TEXT:
    DCB 13,"I","T","'", "S",32,"H","I","G","H","E","R",0

LOWER_TEXT:
    DCB 13,"I","T","'", "S",32,"L","O","W","E","R",0

HIGHER:
    LDA #&amp;lt;HIGHER_TEXT
    STA TEXT_PTR
    LDA #&amp;gt;HIGHER_TEXT
    STA TEXT_PTR_H
    LDY #$00
    JSR PRINT
    JMP UPDATE_ATTEMPTS

LOWER:
    LDA #&amp;lt;LOWER_TEXT
    STA TEXT_PTR
    LDA #&amp;gt;LOWER_TEXT
    STA TEXT_PTR_H
    LDY #$00
    JSR PRINT
    JMP UPDATE_ATTEMPTS

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

&lt;/div&gt;






&lt;h2&gt;
  
  
  📌 Track Attempts
&lt;/h2&gt;

&lt;p&gt;Now, what else is left? We need to track the user's tries. After every wrong guess, we decrement the number of attempts and decide whether to continue or end the game.&lt;/p&gt;

&lt;p&gt;We just reuse &lt;code&gt;START&lt;/code&gt; if they still have guesses left.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UPDATE_ATTEMPTS:
    DEC ATTEMPTS
    LDA ATTEMPTS
    BEQ LOSE ; Defining this below
    JMP START

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

&lt;/div&gt;






&lt;h2&gt;
  
  
  📌 Lose State
&lt;/h2&gt;

&lt;p&gt;Okay, almost done. Let's define what happens when a player loses. The game shows a message, reveals the correct answer, then fills the screen with red.&lt;/p&gt;

&lt;p&gt;Printing is the same as always. I want to also show what the answer was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LOSE:
    LDA #&amp;lt;LOSE_TEXT
    STA TEXT_PTR
    LDA #&amp;gt;LOSE_TEXT
    STA TEXT_PTR_H
    LDY #$00
    JSR PRINT

    LDA #&amp;lt;ANSWER_TEXT
    STA TEXT_PTR
    LDA #&amp;gt;ANSWER_TEXT
    STA TEXT_PTR_H
    LDY #$00
    JSR PRINT

    LDA ANSWER
    JSR CHROUT

&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;LOSE_TEXT:
    DCB 13,"Y","O","U",32,"L","O","S","T",32,"T","H","E",32,"G","A","M","E",0

ANSWER_TEXT:
    DCB 13,"T","H","E",32,"N","U","M","B","E","R",32,"W","A","S",32,0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then, call the subroutine to fill the screen with red, after which you can jump to game over.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    JSR FILL_RED
    JMP GAME_OVER
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's define &lt;code&gt;FILL_RED&lt;/code&gt;, which is the function that fills the bitmap display with red when the player loses.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FILL_RED:
    LDA #$00
    STA $10              ; Low byte of screen memory pointer
    LDA #$02
    STA $11              ; High byte → $0200 = screen start
    LDX #$06             ; Fill up to $0600
    LDY #$00
    LDA #$02             ; Red color code (system-dependent)
red_loop:
    STA ($10), y         ; Store red color at screen location
    INY                  ; Next byte
    BNE red_loop         ; If Y didn't wrap → loop again
    INC $11              ; Move to next screen row (high byte of address)
    LDY #$00             ; Reset Y
    CPX $11              ; Compare to target memory limit
    BNE red_loop         ; Keep going until we hit limit
    RTS

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

&lt;/div&gt;






&lt;h2&gt;
  
  
  📌 Win State
&lt;/h2&gt;

&lt;p&gt;Printing to text display:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WIN_TEXT:
    DCB 13,"Y","O","U",32,"W","I","N","!",32,"I","T","'", "S",32,0

WIN:
    LDA #&amp;lt;WIN_TEXT
    STA TEXT_PTR
    LDA #&amp;gt;WIN_TEXT
    STA TEXT_PTR_H
    LDY #$00
    JSR PRINT

    LDA ANSWER
    JSR CHROUT

    JSR FILL_GREEN

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

&lt;/div&gt;



&lt;p&gt;Green fill function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FILL_GREEN:
    LDA #$00
    STA $10
    LDA #$02
    STA $11
    LDX #$06
    LDY #$00
    LDA #$0D
green_loop:
    STA ($10), y
    INY
    BNE green_loop
    INC $11
    LDY #$00
    CPX $11
    BNE green_loop
    RTS

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

&lt;/div&gt;






&lt;h2&gt;
  
  
  📌 Game Reset
&lt;/h2&gt;

&lt;p&gt;After a win or loss, wait for a key press, then restart the game from the beginning:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GAME_OVER:
    JSR CHRIN
    JMP $0600
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ✅ SOURCE CODE ✅
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;; Number Guessing Game for 6502
; Guess the correct number (1-9). The answer is randomly generated each game.
; On win, the display fills with green; on loss, it fills with red.
; You get 5 tries to guess the number.

; ROM routines entry points
define SCINIT  $ff81    ; initialize/clear screen
define CHRIN   $ffcf    ; input character from keyboard
define CHROUT  $ffd2    ; output character to screen

; Zero Page Variables
define TEXT_PTR   $40  ; pointer for text (low byte)
define TEXT_PTR_H $41  ; pointer for text (high byte)
define GUESS      $42  ; user guess
define ATTEMPTS   $43  ; remaining attempts (5 tries)
define ANSWER     $45  ; correct answer (ASCII value)

* = $0600      ; Program starts here

    JSR SCINIT          ; Clear screen

    ; Generate random answer (1-9) using hardware randomness.
    ; The RANDOM subroutine returns an ASCII digit ('1'-'9') directly.
    JSR RANDOM
    STA ANSWER          ; Store the ASCII value

    LDA #$05            ; Set 5 attempts
    STA ATTEMPTS

    ; Print the title
    LDA #&amp;lt;TITLE
    STA TEXT_PTR 
    LDA #&amp;gt;TITLE
    STA TEXT_PTR_H
    LDY #$00
    JSR PRINT

START:
    ; Print the input prompt
    LDA #&amp;lt;INPUT
    STA TEXT_PTR
    LDA #&amp;gt;INPUT
    STA TEXT_PTR_H
    LDY #$00
    JSR PRINT

WAIT_INPUT:
    JSR CHRIN         ; Wait for user input (result in A)

    CMP #$31          ; Must be between ASCII '1' and '9'
    BMI WAIT_INPUT
    CMP #$3A
    BPL WAIT_INPUT

    STA GUESS         ; Store the user's guess
    JSR CHROUT        ; Echo the input on screen

    ; Compare the guess to the random answer
    CMP ANSWER
    BEQ WIN           ; Correct guess
    BCC HIGHER        ; If guess &amp;lt; answer, show "Higher"
    BCS LOWER         ; If guess &amp;gt; answer, show "Lower"

HIGHER:
    LDA #&amp;lt;HIGHER_TEXT
    STA TEXT_PTR
    LDA #&amp;gt;HIGHER_TEXT
    STA TEXT_PTR_H
    LDY #$00
    JSR PRINT
    JMP UPDATE_ATTEMPTS 

LOWER:
    LDA #&amp;lt;LOWER_TEXT
    STA TEXT_PTR
    LDA #&amp;gt;LOWER_TEXT
    STA TEXT_PTR_H
    LDY #$00
    JSR PRINT
    JMP UPDATE_ATTEMPTS 

UPDATE_ATTEMPTS:
    DEC ATTEMPTS      ; Decrease attempt count by 1
    LDA ATTEMPTS
    BEQ LOSE          ; If no attempts left, game over
    JMP START

LOSE:
    ; Print lose message
    LDA #&amp;lt;LOSE_TEXT
    STA TEXT_PTR 
    LDA #&amp;gt;LOSE_TEXT
    STA TEXT_PTR_H
    LDY #$00
    JSR PRINT

    ; Show the correct answer
    LDA #&amp;lt;ANSWER_TEXT
    STA TEXT_PTR
    LDA #&amp;gt;ANSWER_TEXT
    STA TEXT_PTR_H
    LDY #$00
    JSR PRINT
    LDA ANSWER
    JSR CHROUT        ; Print the answer

    JSR FILL_RED      ; Fill display with red
    JMP GAME_OVER

WIN:
    ; Print win message
    LDA #&amp;lt;WIN_TEXT
    STA TEXT_PTR 
    LDA #&amp;gt;WIN_TEXT
    STA TEXT_PTR_H
    LDY #$00
    JSR PRINT

    ; Show the correct answer
    LDA ANSWER
    JSR CHROUT        ; Print the answer

    JSR FILL_GREEN    ; Fill display with green

GAME_OVER:
    JSR CHRIN        ; Wait for any key press
    JMP $0600        ; Restart the game (generates new random answer)

; ---------------------------------------------------
; Subroutine RANDOM
; Generates a pseudo-random number using hardware randomness.
; Reads from memory location $FE until a valid candidate is found.
; Returns a valid ASCII digit in the range '1' to '9' (i.e., $31 to $39) in A.
RANDOM:
getRandom:
    LDA $FE         ; Get a pseudo-random candidate from hardware RNG
    CMP #$31        ; Check if candidate is &amp;gt;= '1' (ASCII $31)
    BCC getRandom   ; If candidate is less than '1', try again
    CMP #$3A        ; Check if candidate is less than ':' (ASCII $3A)
    BCS getRandom   ; If candidate is not less than $3A, try again
    RTS             ; Return valid candidate in A

; ---------------------------------------------------
; Subroutine PRINT
; Prints a null-terminated string pointed to by TEXT_PTR.
PRINT:
    LDA (TEXT_PTR), Y
    BEQ DONE        ; Zero terminator reached; stop printing
    JSR CHROUT      ; Output character
    INY
    BNE PRINT
DONE:
    RTS

; ---------------------------------------------------
; Subroutine FILL_GREEN
; Fills the display with green (color code $0D).
FILL_GREEN:
    LDA #$00
    STA $10         ; Set pointer low byte to 0
    LDA #$02
    STA $11         ; Set pointer high byte to 2 (base address $0200)
    LDX #$06        ; X = 6 (max for high-byte pointer)
    LDY #$00        ; Reset column index (Y) to 0
    LDA #$0D        ; Green color code
green_loop:
    STA ($10), y    ; Write green to display at pointer + Y
    INY             ; Increment column index
    BNE green_loop  ; Loop until Y wraps (256 pixels)
    INC $11         ; Move to next page (increment high-byte pointer)
    LDY #$00        ; Reset Y for new page
    CPX $11         ; Compare X with current pointer high byte
    BNE green_loop  ; Continue filling until done
    RTS

; ---------------------------------------------------
; Subroutine FILL_RED
; Fills the display with red (color code $02).
FILL_RED:
    LDA #$00
    STA $10         ; Set pointer low byte to 0
    LDA #$02
    STA $11         ; Set pointer high byte to 2 (base address $0200)
    LDX #$06        ; X = 6
    LDY #$00        ; Reset Y to 0
    LDA #$02        ; Red color code
red_loop:
    STA ($10), y    ; Write red to display at pointer + Y
    INY             ; Increment column index
    BNE red_loop    ; Loop until Y wraps (256 pixels)
    INC $11         ; Move to next page (increment high-byte pointer)
    LDY #$00        ; Reset Y for new page
    CPX $11         ; Compare X with current pointer high byte
    BNE red_loop    ; Continue filling until finished
    RTS

; ---------------------------------------------------
; Text Strings
TITLE:
    DCB "G","U","E","S","S",32
    DCB "A",32
    DCB "N","U","M","B","E","R",32
    DCB "B","E","T","W","E","E","N",32
    DCB "1",32
    DCB "T","O",32
    DCB "9",13
    DCB "Y","O","U",32
    DCB "H","A","V","E",32
    DCB "5",32
    DCB "T","R","I","E","S","!",0

INPUT:
    DCB 13,13
    DCB "E","N","T","E","R",32
    DCB "A",32
    DCB "N","U","M","B","E","R",32
    DCB "(", "1","-","9",")",":",32,0

HIGHER_TEXT:
    DCB 13
    DCB "H","I","G","H","E","R",".",".",".",0

LOWER_TEXT:
    DCB 13
    DCB "L","O","W","E","R",".",".",".",0

WIN_TEXT:
    DCB 13
    DCB "Y","O","U",32
    DCB "W","I","N","!",32
    DCB "T","H","E",32
    DCB "A","N","S","W","E","R",32
    DCB "I","S",32,0

LOSE_TEXT:
    DCB 13
    DCB "Y","O","U",32
    DCB "L","O","S","T",".",32
    DCB "G","A","M","E",32
    DCB "O","V","E","R","!",0

ANSWER_TEXT:
    DCB 13
    DCB "T","H","E",32
    DCB "A","N","S","W","E","R",32
    DCB "W","A","S",32,0

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Testing it
&lt;/h2&gt;

&lt;p&gt;Let's run  the whole game to make sure that it is running correctly.&lt;/p&gt;

&lt;p&gt;On run:&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%2Fy3ksae9r3klalrs6ioa9.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%2Fy3ksae9r3klalrs6ioa9.png" alt="Initial Game" width="546" height="294"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Low number should prompt 'HIGHER...':&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%2F19lj96f922dec9yqo5a9.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%2F19lj96f922dec9yqo5a9.png" alt="Low Number" width="519" height="298"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;High number should prompt 'LOWER...' :&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%2Fu1rv0v5kcvhde0jwmd1t.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%2Fu1rv0v5kcvhde0jwmd1t.png" alt="High Number" width="565" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A clip of getting it correct:&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%2Fc8o8q2o7g11oucwq9552.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%2Fc8o8q2o7g11oucwq9552.gif" alt="Getting it correct" width="706" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A clip of getting it wrong:&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%2Fo6l4qnuoslcmxk6cnng2.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%2Fo6l4qnuoslcmxk6cnng2.gif" alt="Lose" width="626" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see the code is running as intended! 😄&lt;/p&gt;




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

&lt;p&gt;Tackling this lab reminded me how brutal and rewarding the 6502 assembly can be. There's no high-level logic, so much so that even printing can take a while to figure out. You really learn to appreciate every instruction.&lt;/p&gt;

&lt;p&gt;It was fun though to figure out the game loop. Making subroutine is extremely helpful in keeping everything neat. My challenge was in figuring out the logic for generating random numbers. It was so simple in retrospect but I had to change my mindset on another logic to achieve it.&lt;/p&gt;

&lt;p&gt;I hope this breakdown helped you follow the logic and maybe even inspired you to make something of your own in assembly.&lt;/p&gt;

&lt;p&gt;See you next time~ 👋&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Testing &amp; Fixes - Project Stage 02</title>
      <dc:creator>Juro Zaw</dc:creator>
      <pubDate>Sun, 06 Apr 2025 17:47:16 +0000</pubDate>
      <link>https://dev.to/jurozaw/testing-fixes-project-stage-02-2i2a</link>
      <guid>https://dev.to/jurozaw/testing-fixes-project-stage-02-2i2a</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Welcome back (again) to Project Stage 02! 😄&lt;/p&gt;

&lt;p&gt;In the previous part, we implemented logic for our &lt;code&gt;tree-kzaw.cc&lt;/code&gt; pass which have been set up in &lt;code&gt;gcc&lt;/code&gt; since Project Stage 01. In this continued part of stage 02, I will be testing out our logic and adding any fixes as needed. &lt;/p&gt;

&lt;p&gt;As always, I will be using &lt;code&gt;aarch64&lt;/code&gt; and &lt;code&gt;x86&lt;/code&gt; servers to test my logic. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;❇️ Please find the source code here: &lt;a href="https://github.com/kzaw28/spo600-project" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; ❇️&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  📌 Recompiling &amp;amp; Rebuilding
&lt;/h2&gt;

&lt;p&gt;Now that our pass logic has been implemented in the previous blog, we will need to rebuild our &lt;code&gt;gcc&lt;/code&gt; to update it. Fortunately, if we did all that stuff with &lt;code&gt;Makefile.in&lt;/code&gt; from Project Stage 01, we won't have to wait to do a full &lt;code&gt;gcc&lt;/code&gt; rebuild.&lt;/p&gt;

&lt;p&gt;Run these commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ~/gcc-build-001
time make -j 24 |&amp;amp; tee build-stage2-01.log
make install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If nothing goes wrong, we should be good for testing!&lt;/p&gt;




&lt;h2&gt;
  
  
  📌 Testing
&lt;/h2&gt;

&lt;p&gt;In each of our servers, there is a file in the path: &lt;code&gt;/public/spo600-test-clone.tgz&lt;/code&gt;. Two binaries will be built once we extract this and use &lt;code&gt;make&lt;/code&gt;: one for &lt;code&gt;PRUNE&lt;/code&gt; test and one for &lt;code&gt;NOTPRUNE&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;We will run this code to extract it and go into the directory as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tar xvf /public/spo600-test-clone.tgz
cd ~/spo600/examples/test-clone
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I see see a &lt;code&gt;Makefile&lt;/code&gt;, &lt;code&gt;README.txt&lt;/code&gt; and some other &lt;code&gt;.c&lt;/code&gt; and &lt;code&gt;.h&lt;/code&gt; files. The &lt;code&gt;README.txt&lt;/code&gt; shows me that running &lt;code&gt;make&lt;/code&gt; will output two binaries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;test-clone-ARCH-prune&lt;/li&gt;
&lt;li&gt;test-clone-ARCH-noprune
where ARCH is either 'aarch64' or 'x86' depending on the server.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  👉 Setting Up Makefile
&lt;/h3&gt;

&lt;p&gt;Let's check the &lt;code&gt;Makefile&lt;/code&gt; as there are some changes we must do.&lt;/p&gt;

&lt;p&gt;Now there is a lot of things happening in there, but what we need to focus on is the &lt;code&gt;gcc&lt;/code&gt;. Within the file, you may see something like:&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;clone-test-x86-prune&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;clone-test-core.c $(LIBRARIES)&lt;/span&gt;
        gcc &lt;span class="nt"&gt;-D&lt;/span&gt; &lt;span class="s1"&gt;'CLONE_ATTRIBUTE=......&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, the &lt;code&gt;gcc&lt;/code&gt; means the server's root &lt;code&gt;gcc&lt;/code&gt;, not our local &lt;code&gt;gcc&lt;/code&gt; so we will change that. &lt;/p&gt;

&lt;p&gt;Add this at the top. Make sure to change the directory with your install directory (not build directory):&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;# Use the locally built GCC
&lt;/span&gt;&lt;span class="nv"&gt;CC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;$(&lt;/span&gt;HOME&lt;span class="p"&gt;)&lt;/span&gt;/gcc-test-001/bin/gcc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now replace all &lt;code&gt;gcc&lt;/code&gt; with &lt;code&gt;$(CC)&lt;/code&gt;.&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;clone-test-x86-prune&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;clone-test-core.c $(LIBRARIES)&lt;/span&gt;
        &lt;span class="p"&gt;$(&lt;/span&gt;CC&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nt"&gt;-D&lt;/span&gt; &lt;span class="s1"&gt;'CLONE_ATTRIBUTE=......&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ensures that the &lt;code&gt;gcc&lt;/code&gt; being used is our local one!  While we're at it, uncomment the &lt;code&gt;DUMP_ALL = 1&lt;/code&gt; since we would want to check dump files to know whether our code worked or not.&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;# Set DUMP_ALL to a non-empty value to enable all GCC dumps
&lt;/span&gt; &lt;span class="nv"&gt;DUMP_ALL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I think we are all done with &lt;code&gt;Makefile&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  👉 Checking Dump Files
&lt;/h3&gt;

&lt;p&gt;Now what we should do next is to run a &lt;code&gt;make&lt;/code&gt; command and check out our dump files.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;make all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you have run this, &lt;code&gt;ls&lt;/code&gt; to see the files in the directory. You will see a BUNCH of dump files.&lt;/p&gt;

&lt;p&gt;Like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;clone-test-core.c
clone-test-x86-noprune
clone-test-x86-noprune-clone-test-core.c.000i.cgraph
clone-test-x86-noprune-clone-test-core.c.000i.ipa-clones
clone-test-x86-noprune-clone-test-core.c.006t.original
&lt;/span&gt;&lt;span class="c"&gt;.
.
.
&lt;/span&gt;&lt;span class="go"&gt;clone-test-x86-prune
clone-test-x86-prune-clone-test-core.c.000i.cgraph
clone-test-x86-prune-clone-test-core.c.000i.ipa-clones
clone-test-x86-prune-clone-test-core.c.000i.type-inheritance
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On a closer look, you may notice that it is in 2 groups: one for &lt;code&gt;prune&lt;/code&gt; and one for &lt;code&gt;noprune&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Now, I don't really know which one to check, but I'm assuming the ones with our pass's names could be a great place to start.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;clone-test-x86-noprune-clone-test-core.c.265t.kzaw
clone-test-x86-prune-clone-test-core.c.265t.kzaw
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That sounds about right, I can see some of our printed messages. Checking the &lt;code&gt;prune&lt;/code&gt; dump file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;;; Function scale_samples (scale_samples.default, funcdef_no=23, decl_uid=3954, cgraph_uid=24, symbol_order=23)

__attribute__((target ("default"), target_clones ("default", "popcnt")))
void scale_samples (int16_t * in, int16_t * out, int cnt, int volume)
{
.
.
.
}

;; Function scale_samples.popcnt (scale_samples.popcnt, funcdef_no=25, decl_uid=3985, cgraph_uid=30, symbol_order=28)

&amp;gt;&amp;gt;&amp;gt;&amp;gt; Found potential clone: scale_samples.popcnt (base: scale_samples, variant: .popcnt)
&amp;gt;&amp;gt;&amp;gt;&amp;gt; Collected 165 statements from function scale_samples.popcnt
__attribute__((target ("popcnt"), target_clones ("default", "popcnt")))
void scale_samples.popcnt (int16_t * in, int16_t * out, int cnt, int volume)
{
.
.
.
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We know that the code is being compiled so that is good. However the logic might not be correct. What we can see from this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❌ It's not analyzing &lt;code&gt;scale_samples&lt;/code&gt;, I asumme it's because of the variant format (function.&lt;em&gt;variant&lt;/em&gt;). That function should be fixed.
&lt;/li&gt;
&lt;li&gt;❌ It's checking &lt;code&gt;scale_samples.popcnt&lt;/code&gt;, but it's stopped after collecting statements. Why?&lt;/li&gt;
&lt;li&gt;✅ It's skipping &lt;code&gt;scale_samples.resolver&lt;/code&gt;, which it should.&lt;/li&gt;
&lt;li&gt;✅ It's skipping &lt;code&gt;sum_sample&lt;/code&gt;, because there's no variant of it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's debug and fix it&lt;/p&gt;




&lt;h2&gt;
  
  
  📌 Debugging: PRUNE Case
&lt;/h2&gt;

&lt;p&gt;I want to make sure that the prune case work first. So let's fix those issues.&lt;/p&gt;

&lt;h3&gt;
  
  
  👉 Issue 1: Not Analyzing the Default Function
&lt;/h3&gt;

&lt;p&gt;The pass isn't recognizing &lt;code&gt;scale_samples&lt;/code&gt; (the default function) because it's only looking for functions with a period (&lt;code&gt;.&lt;/code&gt;) in their name.&lt;/p&gt;

&lt;p&gt;We need to modify the &lt;code&gt;is_clone_function&lt;/code&gt; method to also recognize the base function.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Instead of returning &lt;code&gt;false&lt;/code&gt; if the dot is not found. We do another check to see if it's a default function with &lt;code&gt;target_clones&lt;/code&gt; attribute.&lt;/li&gt;
&lt;li&gt;If it is, mark it as a &lt;code&gt;.default&lt;/code&gt; variant.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="p"&gt;...&lt;/span&gt;
  &lt;span class="c1"&gt;// Check if it's a default function with target_clones attribute&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;lookup_attribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"target_clones"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DECL_ATTRIBUTES&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;decl&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_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;func_name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;variant&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;".default"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// Use .default to mark it as the default variant&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;dump_file&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;"Found default function with clones: %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;full_name&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="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  👉 Issue 2: Fix Clone Comparison in &lt;code&gt;execute()&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Now that the default functions can come out of that compare function and continue with their statements being collected, we have to fix our comparison logic.&lt;/p&gt;

&lt;p&gt;In our existing code, it just compares the first two variants it finds, which might not include the default function. It also makes a single pruning decision for the base name, not distinguishing between variants.&lt;/p&gt;

&lt;p&gt;Let's change the &lt;code&gt;execute()&lt;/code&gt; logic. Specifically in the part where we select the functions to compare from the &lt;code&gt;clone_groups&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Here we added code to find the default function in the group. Then, set it up to compare all variants against the default function (not just the first two).&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;// Find the default variant to use as reference&lt;/span&gt;
      &lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;default_idx&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;clone_groups&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;base_name&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;size&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="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;clone_groups&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;base_name&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;variant&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;".default"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="n"&gt;default_idx&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="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="p"&gt;}&lt;/span&gt;

      &lt;span class="c1"&gt;// Compare each non-default variant with the default&lt;/span&gt;
      &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;function_info&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;default_info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clone_groups&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;base_name&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;default_idx&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;all_same&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Below is the new comparison logic. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;There is now a loop to compare each variant against the default&lt;/li&gt;
&lt;li&gt;Added individual pruning for each variant (if it matches default or not)&lt;/li&gt;
&lt;li&gt;Added overall decision for default function (if all variants are same or not)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&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;clone_groups&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;base_name&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;size&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="k"&gt;if&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;default_idx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Skip comparing default to itself&lt;/span&gt;

        &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;function_info&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;variant_info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clone_groups&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;base_name&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;if&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="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;"Comparing %s%s with %s%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_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="n"&gt;default_info&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;variant&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="n"&gt;base_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="n"&gt;variant_info&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;variant&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="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;are_same&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;compare_functions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;default_info&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stmts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;variant_info&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stmts&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// If any variant differs from default, mark the group as different&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;are_same&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="n"&gt;all_same&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="c1"&gt;// Print the pruning decision for this specific variant&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;dump_file&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;"NOPRUNE: %s%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_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="n"&gt;variant_info&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;variant&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="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="c1"&gt;// Print the pruning decision for this specific variant&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;dump_file&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%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_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="n"&gt;variant_info&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;variant&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="c1"&gt;// Print the overall pruning decision for the default function&lt;/span&gt;
      &lt;span class="n"&gt;print_prune_decision&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;all_same&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I believe this should be good. Let's test it again.&lt;/p&gt;

&lt;h3&gt;
  
  
  👉 Test Changes
&lt;/h3&gt;

&lt;p&gt;After running the &lt;code&gt;make all&lt;/code&gt; again after changes, let's check dump files.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;;; Function scale_samples (scale_samples.default, funcdef_no=23, decl_uid=3954, cgraph_uid=24, symbol_order=23)

Found default function with clones: scale_samples
Collected 165 statements from function scale_samples
Collected 165 statements from function scale_samples.default
__attribute__((target ("default"), target_clones ("default", "popcnt")))
void scale_samples (int16_t * in, int16_t * out, int cnt, int volume)
{
.
.
.
}

;; Function scale_samples.popcnt (scale_samples.popcnt, funcdef_no=25, decl_uid=3985, cgraph_uid=30, symbol_order=28)

Found potential clone: scale_samples.popcnt (base: scale_samples, variant: .popcnt)
Collected 165 statements from function scale_samples.popcnt
Collected 165 statements from function scale_samples.popcnt
Analyzing clones of function: scale_samples
Comparing scale_samples.default with scale_samples.popcnt
Functions are substantially the same
PRUNE: scale_samples.popcnt
NOPRUNE: scale_samples
__attribute__((target ("popcnt"), target_clones ("default", "popcnt")))
void scale_samples.popcnt (int16_t * in, int16_t * out, int cnt, int volume)
{
.
.
.
}

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

&lt;/div&gt;



&lt;p&gt;As you can see, it is working. We can see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Checking default, skipping logic when it's the only one&lt;/li&gt;
&lt;li&gt;✅ Checking &lt;code&gt;.popcnt&lt;/code&gt; variant, determining the variant should be PRUNE.&lt;/li&gt;
&lt;li&gt;✅ Decision given for the function itself, since it has a variant, it should be PRUNE.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here is the screenshot:&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%2Fke6ie03g35cvpd8jftuf.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%2Fke6ie03g35cvpd8jftuf.png" alt="Dump File" width="800" height="289"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Great! Now we know our logic is working. How about for the NOPRUNE case?&lt;/p&gt;


&lt;h2&gt;
  
  
  📌 Debugging: NOPRUNE Case
&lt;/h2&gt;

&lt;p&gt;Let's check the dump file, &lt;code&gt;clone-test-x86-noprune-clone-test-core.c.265t.kzaw&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;;; Function scale_samples (scale_samples.default, funcdef_no=23, decl_uid=3954, cgraph_uid=24, symbol_order=23)

Found default function with clones: scale_samples
Collected 165 statements from function scale_samples
Collected 165 statements from function scale_samples.default
__attribute__((target ("default"), target_clones ("default", "arch=x86-64-v3")))
void scale_samples (int16_t * in, int16_t * out, int cnt, int volume)
{
.
.
.
}

;; Function scale_samples.arch_x86_64_v3 (scale_samples.arch_x86_64_v3, funcdef_no=25, decl_uid=3985, cgraph_uid=30, sy&amp;gt;
Found potential clone: scale_samples.arch_x86_64_v3 (base: scale_samples, variant: .arch_x86_64_v3)
Collected 193 statements from function scale_samples.arch_x86_64_v3
Collected 193 statements from function scale_samples.arch_x86_64_v3
Analyzing clones of function: scale_samples
Comparing scale_samples.default with scale_samples.arch_x86_64_v3
Functions have different statement counts: 165 vs 193
NOPRUNE: scale_samples.arch_x86_64_v3
NOPRUNE: scale_samples
__attribute__((target ("arch=x86-64-v3"), target_clones ("default", "arch=x86-64-v3")))
void scale_samples.arch_x86_64_v3 (int16_t * in, int16_t * out, int cnt, int volume)
{
.
.
.
}

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

&lt;/div&gt;



&lt;p&gt;It is also working. We can see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Checking default, skipping logic when it's the only one.&lt;/li&gt;
&lt;li&gt;✅ Checking &lt;code&gt;.arch_x86_64_v3&lt;/code&gt; variant, determining the variant should be NOPRUNE.&lt;/li&gt;
&lt;li&gt;✅ Decision given for the function itself, since there is no clone, it should be NOPRUNE.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Screenshot:&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%2Frdpe6hdezf597angk0p2.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%2Frdpe6hdezf597angk0p2.png" alt="Dump File" width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  📌 How about &lt;code&gt;AArch64&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;OKAY! So we know that our pass is working fine in the &lt;code&gt;x86&lt;/code&gt; server since so far, everything we have done is within that server. &lt;/p&gt;

&lt;p&gt;Let's check it in the &lt;code&gt;aarch64&lt;/code&gt; server now. Hopefully, we don't have to change anything. &lt;/p&gt;

&lt;p&gt;After running the &lt;code&gt;make&lt;/code&gt; in our &lt;code&gt;spo600/examples/test-clone&lt;/code&gt; directory, I got this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[kzaw@aarch64-002 test-clone]$ make all
/home/kzaw/gcc-test-001/bin/gcc -c  vol_createsample.c -o vol_createsample.o
/home/kzaw/gcc-test-001/bin/gcc -D 'CLONE_ATTRIBUTE=__attribute__((target_clones("default","rng") ))'\
        -march=armv8-a -g -O3 -fno-lto  -ftree-vectorize  -fdump-tree-all -fdump-ipa-all -fdump-rtl-all \
        clone-test-core.c vol_createsample.o -o clone-test-aarch64-prune
clone-test-core.c:28:6: warning: Function Multi Versioning support is experimental, and the behavior is likely to change [-Wexperimental-fmv-target]
   28 | void scale_samples(int16_t *in, int16_t *out, int cnt, int volume) {
      |      ^~~~~~~~~~~~~
during GIMPLE pass: kzaw
dump file: clone-test-aarch64-prune-clone-test-core.c.265t.kzaw
clone-test-core.c: In function ‘scale_samples.rng’:
clone-test-core.c:28:6: internal compiler error: Segmentation fault
0x22cf17b internal_error(char const*, ...)
        /home/kzaw/git/gcc/gcc/diagnostic-global-context.cc:517
0xfe97fb crash_signal
        /home/kzaw/git/gcc/gcc/toplev.cc:322
0x22ef0ff pp_string(pretty_printer*, char const*)
        /home/kzaw/git/gcc/gcc/pretty-print.cc:2656
0x22f013f format_phase_2
        /home/kzaw/git/gcc/gcc/pretty-print.cc:2035
0x22f013f pretty_printer::format(text_info&amp;amp;)
        /home/kzaw/git/gcc/gcc/pretty-print.cc:1711
0x22f1cb3 pp_format(pretty_printer*, text_info*)
        /home/kzaw/git/gcc/gcc/pretty-print.h:594
0x22f1cb3 pp_printf(pretty_printer*, char const*, ...)
        /home/kzaw/git/gcc/gcc/pretty-print.cc:2578
0xc2f0c3 print_gimple_stmt(_IO_FILE*, gimple*, int, dump_flag)
        /home/kzaw/git/gcc/gcc/gimple-pretty-print.cc:159
0x1055597 compare_functions
        /home/kzaw/git/gcc/gcc/tree-kzaw.cc:163
0x1055597 execute
        /home/kzaw/git/gcc/gcc/tree-kzaw.cc:372
Please submit a full bug report, with preprocessed source (by using -freport-bug).
Please include the complete backtrace with any bug report.
See &amp;lt;https://gcc.gnu.org/bugs/&amp;gt; for instructions.
make: *** [Makefile:38: clone-test-aarch64-prune] Error 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's a whole lot of words but what we can get from this is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The crash definitely happened during our GIMPLE pass: &lt;code&gt;kzaw&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;It happened at Line 163 (inside &lt;code&gt;compare_functions&lt;/code&gt;) and Line 372 (inside &lt;code&gt;execute&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Overall, this project stage 02 was a different level of difficult compared to stage 01. Where stage 01 had more issues with compiling, for this stage 02, a lot of effort went into creating the logic for the pass. &lt;/p&gt;

&lt;p&gt;As you can see from my blog journey, I went through a lot of debugging for the pass to work as intended. Then again, it was different for each server, so more care needed to be put into the pass logic.&lt;/p&gt;

&lt;p&gt;All in all, this stage jogged my memory on C/C++ language and made me research on a lot of &lt;code&gt;gcc&lt;/code&gt; macro functions that could help me in what I am trying to achieve. I received help by working together with other classmates. Overall, this project was a challenge all the way from implementation to testing!&lt;/p&gt;

&lt;p&gt;Thank you. 😄&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Clone-Pruning Analysis Pass - Project Stage 02</title>
      <dc:creator>Juro Zaw</dc:creator>
      <pubDate>Sat, 05 Apr 2025 01:32:13 +0000</pubDate>
      <link>https://dev.to/jurozaw/clone-pruning-analysis-pass-project-stage-02-3gd3</link>
      <guid>https://dev.to/jurozaw/clone-pruning-analysis-pass-project-stage-02-3gd3</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Welcome to Project Stage 02! 😄&lt;/p&gt;

&lt;p&gt;In our last stage, we went through the journey of making a basic GCC pass that goes through statements and functions to print out simple statistics. Building off of it, for this stage, we are creating a more advanced pass.&lt;/p&gt;

&lt;p&gt;To avoid extra implications, I will just try to overwrite the pass I already made in stage 01. As always, I will be using &lt;code&gt;aarch64&lt;/code&gt; and &lt;code&gt;x86&lt;/code&gt; servers to test my logic. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;❇️ Please find the source code here: &lt;a href="https://github.com/kzaw28/spo600-project" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; ❇️&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  📌 Understanding the Requirements
&lt;/h2&gt;

&lt;p&gt;According to my course instructions (&lt;a href="http://spo600.cdot.systems/doku.php?id=spo600:2025_winter_project#project_stage_2clone-pruning_analysis_pass" rel="noopener noreferrer"&gt;Here&lt;/a&gt;), let's summarize what we have to do this time around:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Identify cloned functions (name pattern &lt;code&gt;function.variant&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Compare cloned functions to check if they are substantially the same.&lt;/li&gt;
&lt;li&gt;Output a string on whether to prune the functions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's incrementally implement the code.&lt;/p&gt;




&lt;h2&gt;
  
  
  📌 Cleaning Up Pass Structure
&lt;/h2&gt;

&lt;p&gt;Basing of our code in Stage 01, we're gonna set up the structure so that we can start fresh. Nothing special here. 😄&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="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;
&lt;/span&gt;
&lt;span class="c1"&gt;// Additional headers needed for clone analysis&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;"cgraph.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;&amp;lt;map&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;vector&amp;gt;&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="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;pass_data&lt;/span&gt; &lt;span class="n"&gt;pass_data_kzaw&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;"kzaw"&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_TREE_NRV&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="cm"&gt;/* properties_required */&lt;/span&gt;
  &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="cm"&gt;/* properties_provided */&lt;/span&gt;
  &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="cm"&gt;/* properties_destroyed */&lt;/span&gt;
  &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="cm"&gt;/* todo_flags_start */&lt;/span&gt;
  &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="cm"&gt;/* todo_flags_finish */&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_kzaw&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_kzaw&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;pass_data_kzaw&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;final&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="mi"&gt;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;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="k"&gt;final&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="c1"&gt;// Helper methods for clone analysis will go here&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// Pass execution code will go here&lt;/span&gt;

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

&lt;span class="c1"&gt;// Factory function that creates an instance of 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_kzaw&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_kzaw&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;
  
  
  📌 Pseudocode for &lt;code&gt;execute()&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;It's important to know what we are trying to do in &lt;code&gt;execute()&lt;/code&gt; before implementing any function. Here is what I can come up with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Get the function declaration (a function &lt;code&gt;fun&lt;/code&gt; will be passed as argument)&lt;/li&gt;
&lt;li&gt;Check if the function's name follows the pattern of a clone (i.e., contains a dot separating a base name and a variant).&lt;/li&gt;
&lt;li&gt;If a clone is detected, add its info (statements, name, etc.) to a map of clones (mapped by base name)&lt;/li&gt;
&lt;li&gt;If the clone group contains two or more variants, it compares the first two variants' statements&lt;/li&gt;
&lt;li&gt;Log a prune decision&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since we are trying to store the function's information, we will need a data structure and the map group that I mentioned. You might have noticed from the above code that there is a &lt;code&gt;private:&lt;/code&gt; block in our class. Let's add it there.&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="nl"&gt;private:&lt;/span&gt;
  &lt;span class="c1"&gt;// Data structure to store function information&lt;/span&gt;
  &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;function_info&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;decl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;                 &lt;span class="c1"&gt;// Function declaration&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="c1"&gt;// Function pointer&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_name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;     &lt;span class="c1"&gt;// Base function name (without variant)&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;variant&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;       &lt;span class="c1"&gt;// Variant part of the name&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;gimple&lt;/span&gt; &lt;span class="o"&gt;*&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;stmts&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Statements in the function&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;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;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;function_info&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;clone_groups&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This pseudocode looks reasonable for now so let us continue!&lt;/p&gt;




&lt;h2&gt;
  
  
  📌 &lt;code&gt;is_clone_function&lt;/code&gt;: Check for a Clone
&lt;/h2&gt;

&lt;p&gt;Before we implement the code, we should add a helper method. Let's add our function signature in the &lt;code&gt;private&lt;/code&gt; block. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Every signature of subsequent functions I create in this project will be added in this block. I will not state it explicitly from now on.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  👉 Function Signature and Purpose
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="nf"&gt;is_clone_function&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;decl&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="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;base_name&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="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;variant&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;It takes a function declaration (&lt;code&gt;decl&lt;/code&gt;) and two string references (&lt;code&gt;base_name&lt;/code&gt; and &lt;code&gt;variant&lt;/code&gt;). &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The &lt;code&gt;tree&lt;/code&gt; data structure is used to represent various programming constructs, such as expressions, statements, declarations, and types, in a uniform way. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Purpose&lt;/strong&gt;&lt;br&gt;
To check if a given function declaration is a clone function. A clone function is identified by having a dot (.) in its name that separates the base name from a variant suffix. The function returns &lt;code&gt;true&lt;/code&gt; if the pattern is found and the function is not a resolver; otherwise, it returns &lt;code&gt;false&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  👉 Function Logic
&lt;/h3&gt;

&lt;p&gt;We will get the name of the function and then look for a pattern. If it matches, return &lt;code&gt;true&lt;/code&gt;, otherwise, &lt;code&gt;false&lt;/code&gt;. Please note that it is important especially in working with GCC compilation process to print out any useful information to the dump file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source Code&lt;/strong&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="kt"&gt;bool&lt;/span&gt;
&lt;span class="n"&gt;pass_kzaw&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;is_clone_function&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;decl&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="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;base_name&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="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;variant&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Get the function name&lt;/span&gt;
  &lt;span class="k"&gt;const&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;full_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;IDENTIFIER_POINTER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DECL_NAME&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;decl&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;func_name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;full_name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Look for the '.variant' pattern in the function name&lt;/span&gt;
  &lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;dot_pos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;func_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="sc"&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;dot_pos&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_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;func_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;dot_pos&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;variant&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;func_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="n"&gt;dot_pos&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Skip resolver functions&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;variant&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;".resolver"&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="n"&gt;dump_file&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;"Found potential clone: %s (base: %s, variant: %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;full_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;base_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="n"&gt;variant&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;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="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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📌 &lt;code&gt;collect_function_statements&lt;/code&gt;: Collect Function Statements
&lt;/h2&gt;

&lt;p&gt;We will need a function to collect all the statements from a function.&lt;/p&gt;

&lt;h3&gt;
  
  
  👉 Function Signature and Purpose
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;collect_function_statements&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="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;gimple&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;stmts&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It takes a reference to a vector of gimple * (statements). Its goal is to collect all GIMPLE statements from the function into the provided vector.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Purpose&lt;/strong&gt;&lt;br&gt;
To go through all basic blocks in the given function and collect each GIMPLE statement from those blocks into the &lt;code&gt;stmts&lt;/code&gt; vector.&lt;/p&gt;
&lt;h3&gt;
  
  
  👉 Function Logic
&lt;/h3&gt;

&lt;p&gt;We did something like this in project stage 01.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source Code&lt;/strong&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="kt"&gt;void&lt;/span&gt;
&lt;span class="n"&gt;pass_kzaw&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;collect_function_statements&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="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;gimple&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;stmts&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="c1"&gt;// Clear the vector in case it's being reused&lt;/span&gt;
  &lt;span class="n"&gt;stmts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="c1"&gt;// Collect all statements in the function&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="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;stmts&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;stmt&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;dump_file&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;"Collected %zu statements from 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;stmts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&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="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;
  
  
  📌 &lt;code&gt;compare_functions&lt;/code&gt;: Compare Functions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  👉 Function Signature and Purpose
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;pass_kzaw&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;compare_functions&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;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;gimple&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;func1_stmts&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;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;gimple&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;func2_stmts&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This function takes two vectors of GIMPLE statements and compares them structurally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Purpose&lt;/strong&gt;&lt;br&gt;
To determine if the two functions are equal or not, ignoring minor differences like variable renaming. This function detects the clones by comparing their statements after grouping them by a common base name.&lt;/p&gt;
&lt;h3&gt;
  
  
  👉 Function Logic
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Statement Count Check&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We first check if the number of statements in both functions is the same. If they are different, it could count as being 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="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func1_stmts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;func2_stmts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&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;dump_file&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;"Functions have different statement counts: %zu vs %zu&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;func1_stmts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;func2_stmts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Iterating Through Statements&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next, we will loop over the statements from both functions at the same time. For each pair at the same index, the first check is to compare their GIMPLE codes. (which denote the type of statement).&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;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;func1_stmts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&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;gimple&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;stmt1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;func1_stmts&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;gimple&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;stmt2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;func2_stmts&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="c1"&gt;// Check if statement codes are different&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;stmt1&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_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt2&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;dump_file&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;"Statement %zu: Different gimple codes&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;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="n"&gt;print_gimple_stmt&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="n"&gt;stmt1&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;TDF_SLIM&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="n"&gt;print_gimple_stmt&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="n"&gt;stmt2&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;TDF_SLIM&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Detailed Comparison based on Statement Type&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A &lt;code&gt;switch&lt;/code&gt; statement is used to perform type-specific comparisons for each GIMPLE statement. &lt;/p&gt;

&lt;p&gt;⚠️ Now there are a LOT of GIMPLE statements and this code would be way complex and out of scope if we were to implement each of them. So I decided to only implement for 4: GIMPLE_ASSIGN, GIMPLE_CALL, GIMPLE_COND and GIMPLE_RETURN since these are the basic code logics.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Please also note that help was retrieved from community members at my  Stack Overflow and Discord. Macros were also referenced from &lt;a href="https://gcc.gnu.org/onlinedocs/gccint/GIMPLE.html" rel="noopener noreferrer"&gt;GCC Documentation&lt;/a&gt;. At this point of the project, I'm not really confident in the logic but I really appreciate everyone who helped me. 🙏.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;  &lt;span class="c1"&gt;// Compare based on statement type&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;stmt1&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;➡️ GIMPLE_ASSIGN (Assignment Statements)&lt;/p&gt;

&lt;p&gt;For assignment statements, the function compares:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The right-hand side operation code.&lt;/li&gt;
&lt;li&gt;The number of operands.&lt;/li&gt;
&lt;li&gt;The operand types and, for constants, their exact values.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&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="c1"&gt;// Check operation code&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_assign_rhs_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt1&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;stmt2&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;dump_file&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;"Assignment operation mismatch at statement %zu&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;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="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="c1"&gt;// Check operand count&lt;/span&gt;
    &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="n"&gt;op_count1&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;stmt1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="n"&gt;op_count2&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;stmt2&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;op_count1&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;op_count2&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;dump_file&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;"Different number of operands at statement %zu&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;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="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="c1"&gt;// For constants and literals, values must match exactly&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;unsigned&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;1&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="n"&gt;op_count1&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;tree&lt;/span&gt; &lt;span class="n"&gt;op1&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;stmt1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;j&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;op2&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;stmt2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;j&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_CODE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;op1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;TREE_CODE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;op2&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;dump_file&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;"Different operand types at statement %zu&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;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="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="c1"&gt;// For constants, compare values&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;CONSTANT_CLASS_P&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;op1&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;CONSTANT_CLASS_P&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;op2&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;vrp_operand_equal_p&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;op1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;op2&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;dump_file&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;"Different constant values at statement %zu&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;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="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="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;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;➡️ GIMPLE_CALL (Function Calls)&lt;/p&gt;

&lt;p&gt;For function calls, the function checks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;That the type of function call (tree code) is the same.&lt;/li&gt;
&lt;li&gt;If the call is direct (address expression), it compares the function declarations.&lt;/li&gt;
&lt;li&gt;The number of arguments in the call.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&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="c1"&gt;// Check if calling the same function&lt;/span&gt;
    &lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="n"&gt;func1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_call_fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;as_a&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;gcall&lt;/span&gt; &lt;span class="o"&gt;*&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt1&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;func2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_call_fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;as_a&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;gcall&lt;/span&gt; &lt;span class="o"&gt;*&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt2&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_CODE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;TREE_CODE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func2&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;dump_file&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;"Different function call types at statement %zu&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;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="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="c1"&gt;// If it's a direct function call, compare the function declarations&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_CODE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;ADDR_EXPR&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;fn_decl1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TREE_OPERAND&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func1&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;tree&lt;/span&gt; &lt;span class="n"&gt;fn_decl2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TREE_OPERAND&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func2&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="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DECL_NAME&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fn_decl1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;DECL_NAME&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fn_decl2&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;dump_file&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;"Calling different functions at statement %zu&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;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="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="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Check argument count&lt;/span&gt;
    &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="n"&gt;arg_count1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_call_num_args&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;as_a&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;gcall&lt;/span&gt; &lt;span class="o"&gt;*&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="n"&gt;arg_count2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_call_num_args&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;as_a&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;gcall&lt;/span&gt; &lt;span class="o"&gt;*&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt2&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;arg_count1&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;arg_count2&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;dump_file&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;"Different number of arguments in call at statement %zu&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;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="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="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;➡️ GIMPLE_COND (Conditional Statements)&lt;/p&gt;

&lt;p&gt;For conditional statements, the function compares the conditional codes of both statements.&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;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="c1"&gt;// Check condition code&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="n"&gt;code1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_cond_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;as_a&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;gcond&lt;/span&gt; &lt;span class="o"&gt;*&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt1&lt;/span&gt;&lt;span class="p"&gt;));&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="n"&gt;code2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_cond_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;as_a&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;gcond&lt;/span&gt; &lt;span class="o"&gt;*&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt2&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;code1&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;code2&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;dump_file&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;"Different conditional codes at statement %zu&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;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="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="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;➡️ GIMPLE_COND (Conditional Statements)&lt;/p&gt;

&lt;p&gt;For return statements, the function checks whether one statement returns a value while the other does not.&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;case&lt;/span&gt; &lt;span class="n"&gt;GIMPLE_RETURN&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Check if one returns a value and the other doesn't&lt;/span&gt;
    &lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="n"&gt;ret_val1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_return_retval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;as_a&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;greturn&lt;/span&gt; &lt;span class="o"&gt;*&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt1&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;ret_val2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_return_retval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;as_a&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;greturn&lt;/span&gt; &lt;span class="o"&gt;*&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt2&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;ret_val1&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;NULL_TREE&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="n"&gt;ret_val2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;NULL_TREE&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;dump_file&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;"One function returns a value, the other doesn't at statement %zu&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;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="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="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;For any statement types not explicitly handled, the function assumes that if the GIMPLE code is the same, the statements are considered equal.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Successful Comparison&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If all pairs of statements pass the comparison checks, the function logs that the functions are substantially the same and returns &lt;code&gt;true&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;// If we've made it this far, the functions are considered substantially the same&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;dump_file&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;"Functions are substantially the same&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="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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Source Code&lt;/strong&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="kt"&gt;bool&lt;/span&gt;
&lt;span class="n"&gt;pass_kzaw&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;compare_functions&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;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;gimple&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;func1_stmts&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;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;gimple&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;func2_stmts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// First check: different statement count means different functions&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;func1_stmts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;func2_stmts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&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;dump_file&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;"Functions have different statement counts: %zu vs %zu&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;func1_stmts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;func2_stmts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&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="c1"&gt;// Iterate through statements and compare them&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;func1_stmts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&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;gimple&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;stmt1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;func1_stmts&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;gimple&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;stmt2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;func2_stmts&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="c1"&gt;// Check if statement codes are different&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;stmt1&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_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt2&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;dump_file&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;"Statement %zu: Different gimple codes&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;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;print_gimple_stmt&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="n"&gt;stmt1&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;TDF_SLIM&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;print_gimple_stmt&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="n"&gt;stmt2&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;TDF_SLIM&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="c1"&gt;// Compare based on statement type&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;stmt1&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="c1"&gt;// Check operation code&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_assign_rhs_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt1&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;stmt2&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;dump_file&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;"Assignment operation mismatch at statement %zu&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;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="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="c1"&gt;// Check operand count&lt;/span&gt;
        &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="n"&gt;op_count1&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;stmt1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="n"&gt;op_count2&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;stmt2&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;op_count1&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;op_count2&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;dump_file&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;"Different number of operands at statement %zu&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;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="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="c1"&gt;// For constants and literals, values must match exactly&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;unsigned&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;1&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="n"&gt;op_count1&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;tree&lt;/span&gt; &lt;span class="n"&gt;op1&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;stmt1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;j&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;op2&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;stmt2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;j&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_CODE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;op1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;TREE_CODE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;op2&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;dump_file&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;"Different operand types at statement %zu&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;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="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="c1"&gt;// For constants, compare values&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;CONSTANT_CLASS_P&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;op1&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;CONSTANT_CLASS_P&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;op2&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;vrp_operand_equal_p&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;op1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;op2&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;dump_file&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;"Different constant values at statement %zu&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;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="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="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;break&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="c1"&gt;// Check if calling the same function&lt;/span&gt;
        &lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="n"&gt;func1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_call_fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;as_a&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;gcall&lt;/span&gt; &lt;span class="o"&gt;*&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt1&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;func2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_call_fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;as_a&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;gcall&lt;/span&gt; &lt;span class="o"&gt;*&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt2&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_CODE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;TREE_CODE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func2&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;dump_file&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;"Different function call types at statement %zu&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;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="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="c1"&gt;// If it's a direct function call, compare the function declarations&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_CODE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;ADDR_EXPR&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;fn_decl1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TREE_OPERAND&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func1&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;tree&lt;/span&gt; &lt;span class="n"&gt;fn_decl2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TREE_OPERAND&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func2&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="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DECL_NAME&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fn_decl1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;DECL_NAME&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fn_decl2&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;dump_file&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;"Calling different functions at statement %zu&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;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="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="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// Check argument count&lt;/span&gt;
        &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="n"&gt;arg_count1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_call_num_args&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;as_a&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;gcall&lt;/span&gt; &lt;span class="o"&gt;*&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
        &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="n"&gt;arg_count2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_call_num_args&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;as_a&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;gcall&lt;/span&gt; &lt;span class="o"&gt;*&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt2&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;arg_count1&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;arg_count2&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;dump_file&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;"Different number of arguments in call at statement %zu&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;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="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="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="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="c1"&gt;// Check condition code&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="n"&gt;code1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_cond_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;as_a&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;gcond&lt;/span&gt; &lt;span class="o"&gt;*&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt1&lt;/span&gt;&lt;span class="p"&gt;));&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="n"&gt;code2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_cond_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;as_a&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;gcond&lt;/span&gt; &lt;span class="o"&gt;*&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt2&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;code1&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;code2&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;dump_file&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;"Different conditional codes at statement %zu&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;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="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="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="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;GIMPLE_RETURN&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Check if one returns a value and the other doesn't&lt;/span&gt;
        &lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="n"&gt;ret_val1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_return_retval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;as_a&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;greturn&lt;/span&gt; &lt;span class="o"&gt;*&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt1&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;ret_val2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gimple_return_retval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;as_a&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;greturn&lt;/span&gt; &lt;span class="o"&gt;*&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stmt2&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;ret_val1&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;NULL_TREE&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="n"&gt;ret_val2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;NULL_TREE&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;dump_file&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;"One function returns a value, the other doesn't at statement %zu&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;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="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="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="k"&gt;default&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
      &lt;span class="c1"&gt;// For other statement types, we consider them the same if the code matches&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="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// If we've made it this far, the functions are considered substantially the same&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;dump_file&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;"Functions are substantially the same&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="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;h2&gt;
  
  
  📌 &lt;code&gt;print_prune_decision&lt;/code&gt;: Print Decision
&lt;/h2&gt;

&lt;p&gt;Finally, this is the function that prints whether a function should be pruned or not.&lt;/p&gt;

&lt;h3&gt;
  
  
  👉 Function Signature and Purpose
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;print_prune_decision&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;base_name&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;should_prune&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;Purpose&lt;/strong&gt;&lt;br&gt;
Logs a decision based on whether a clone function group (identified by its base name) should be pruned or not.&lt;/p&gt;
&lt;h3&gt;
  
  
  👉 Function Logic
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Source Code&lt;/strong&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="kt"&gt;void&lt;/span&gt;
&lt;span class="n"&gt;pass_kzaw&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;print_prune_decision&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;base_name&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;should_prune&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;dump_file&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;should_prune&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_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;"NOPRUNE: %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_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="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;






&lt;h2&gt;
  
  
  📌 &lt;code&gt;execute()&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Now that all of our required functions have been implemented, it's time to tie everything together by implementing the main &lt;code&gt;execute()&lt;/code&gt; function.&lt;/p&gt;

&lt;h3&gt;
  
  
  👉 Function Logic
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Source Code&lt;/strong&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="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
&lt;span class="n"&gt;pass_kzaw&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;fun&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Get the function declaration&lt;/span&gt;
  &lt;span class="n"&gt;tree&lt;/span&gt; &lt;span class="n"&gt;fndecl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;current_function_decl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Skip external functions or those with no body&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;fndecl&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;DECL_EXTERNAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fndecl&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;DECL_STRUCT_FUNCTION&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fndecl&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="c1"&gt;// Check if this is a clone function&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_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;variant&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;is_clone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;is_clone_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fndecl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;base_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;variant&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_clone&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Collect statements in this function&lt;/span&gt;
    &lt;span class="n"&gt;function_info&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fndecl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fun&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="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;base_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;base_name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;variant&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;variant&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;collect_function_statements&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="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stmts&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Add to the appropriate clone group&lt;/span&gt;
    &lt;span class="n"&gt;clone_groups&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;base_name&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;info&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Check if we've seen enough clones of this function to make a decision&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;clone_groups&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;base_name&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&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;dump_file&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;"Analyzing clones of 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;base_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="c1"&gt;// Compare the first two variants&lt;/span&gt;
      &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;function_info&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;info1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clone_groups&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;base_name&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="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;function_info&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;info2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clone_groups&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;base_name&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="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;are_same&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;compare_functions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;info1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stmts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;info2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stmts&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="c1"&gt;// Print the pruning decision&lt;/span&gt;
      &lt;span class="n"&gt;print_prune_decision&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;are_same&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="c1"&gt;// Clear the clone group after making the decision&lt;/span&gt;
      &lt;span class="c1"&gt;// This ensures we only emit one decision per base function&lt;/span&gt;
      &lt;span class="n"&gt;clone_groups&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;erase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base_name&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="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;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;I would like to end this part of the project stage 02 here. We have implemented the logic for the pass. I won't go into details of compiling and building &lt;code&gt;gcc&lt;/code&gt; again as they have been mentioned in Lab 4 and Project Stage 01.&lt;/p&gt;

&lt;p&gt;The next step will be to test out this logic in our &lt;code&gt;x86&lt;/code&gt; and &lt;code&gt;aarch64&lt;/code&gt; servers. Let us go to the next part of this Project Stage 02.&lt;/p&gt;

&lt;p&gt;Thank you for coding with me! 😄&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Fixing Issues &amp; Continued - Project Stage 01</title>
      <dc:creator>Juro Zaw</dc:creator>
      <pubDate>Wed, 02 Apr 2025 17:33:48 +0000</pubDate>
      <link>https://dev.to/jurozaw/fixing-issues-continued-project-stage-01-3eie</link>
      <guid>https://dev.to/jurozaw/fixing-issues-continued-project-stage-01-3eie</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;📌 Find My Source Code Here: &lt;a href="https://github.com/kzaw28/spo600-project" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Hello everyone, welcome back!&lt;/p&gt;

&lt;p&gt;This is a continuation of my Project 01 blog post. There were some errors in Project Stage 01 so we will be fixing that. &lt;/p&gt;

&lt;p&gt;You can find the first part here: &lt;a href="https://dev.to/jurozaw/create-a-basic-gcc-pass-project-stage-01-2bng"&gt;Link&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  📌 Install Error?
&lt;/h2&gt;

&lt;p&gt;So my issue was that I could not &lt;code&gt;make install&lt;/code&gt; after running the &lt;code&gt;make&lt;/code&gt; command in the directory. This is the error:&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%2Fy5si8pqocc0itga5c4np.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%2Fy5si8pqocc0itga5c4np.png" alt="Error Code" width="546" height="124"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This error is vague but it seems to generally mean that&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Makefile&lt;/code&gt; was corrupted or was not completed&lt;/li&gt;
&lt;li&gt;Configure didn't finish properly&lt;/li&gt;
&lt;li&gt;Wrong directory&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this case, i think that the first point makes the most sense to be the issue. &lt;/p&gt;

&lt;h2&gt;
  
  
  📌 Build Error?
&lt;/h2&gt;

&lt;p&gt;So when I check the &lt;code&gt;build.log&lt;/code&gt; to investigate, I saw a BUNCH of code lines that says &lt;code&gt;undefined reference to ...&lt;/code&gt;. Example of a part of the log:&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%2Fikhy60jxw9jkbm1sxwfi.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%2Fikhy60jxw9jkbm1sxwfi.png" alt="Error" width="733" height="177"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This definitely means that &lt;code&gt;make&lt;/code&gt; was not completed successfully, had an error at one point and all the error cascaded.&lt;/p&gt;

&lt;p&gt;If I check &lt;code&gt;config.log&lt;/code&gt;, I can also find some 'missing' files.&lt;/p&gt;

&lt;h2&gt;
  
  
  📌 Basic Code
&lt;/h2&gt;

&lt;p&gt;This is the changed code, I used for my basic &lt;code&gt;tree-kzaw.cc&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="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;
&lt;/span&gt;
&lt;span class="c1"&gt;// Added headers:&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;"cgraph.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;
&lt;/span&gt;
&lt;span class="c1"&gt;// Test pass&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;pass_data_kzaw&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;"kzaw"&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_TREE_NRV&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="cm"&gt;/* properties_required */&lt;/span&gt;
  &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="cm"&gt;/* properties_provided */&lt;/span&gt;
  &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="cm"&gt;/* properties_destroyed */&lt;/span&gt;
  &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="cm"&gt;/* todo_flags_start */&lt;/span&gt;
  &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="cm"&gt;/* todo_flags_finish */&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_kzaw&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_kzaw&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;pass_data_kzaw&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="cm"&gt;/* opt_pass methods: */&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="mi"&gt;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;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="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_kzaw&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="p"&gt;)&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="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;func_cnt&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;FOR_EACH_FUNCTION&lt;/span&gt; &lt;span class="p"&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="k"&gt;if&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="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;"=== Function %d Name '%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="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;func_cnt&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="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;dump_file&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;"&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;#### End kzaw diagnostics, start regular dump of current gimple ####&lt;/span&gt;&lt;span class="se"&gt;\n\n\n&lt;/span&gt;&lt;span class="s"&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="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// Moved return statement outside the if block to ensure it always returns&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="c1"&gt;// Factory function that creates an instance of 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_kzaw&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_kzaw&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;
  
  
  📌 What did I do?
&lt;/h2&gt;

&lt;p&gt;After trying at the hour for many many hours, I decided to rebuild the whole &lt;code&gt;gcc&lt;/code&gt; from scratch. Yes, this would take long but it was the only viable option as the logs were too big of a size and complicated to decipher. &lt;/p&gt;

&lt;p&gt;I deleted the &lt;code&gt;~/git/gcc&lt;/code&gt; and rebuilt the entire thing again.&lt;/p&gt;

&lt;p&gt;However, I realized there are very important details that you will need to consider for creating your own GCC pass.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅  Get the Names Right
&lt;/h3&gt;

&lt;p&gt;The main error you could face is getting and putting the names. This is very IMPORTANT! For example, taking the naming convention from my code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;tree-name.cc&lt;/code&gt;: This is the name of your pass definition &lt;strong&gt;file&lt;/strong&gt;. You will put your logic in here. When you add a &lt;code&gt;.o&lt;/code&gt; to &lt;code&gt;OBJS&lt;/code&gt; in &lt;code&gt;Makefile.in&lt;/code&gt;, you are using the filename so it will be &lt;code&gt;tree-name.o&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pass_name&lt;/code&gt;: This will typically be the name of your &lt;strong&gt;pass&lt;/strong&gt; itself! Not to be mistaken with the &lt;strong&gt;file name&lt;/strong&gt;. This is what you are using in &lt;code&gt;passes.def&lt;/code&gt; where you will define a &lt;code&gt;NEXT_PASS(pass_name)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;make_pass_name&lt;/code&gt;: This is the name of function within your file. It will be used in the &lt;code&gt;tree-pass.h&lt;/code&gt; &lt;strong&gt;header&lt;/strong&gt; file so use it when &lt;strong&gt;declaring&lt;/strong&gt; the function within the header.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅  Get Directories Right
&lt;/h3&gt;

&lt;p&gt;Specifically, please be carefully with where you are calling the commands from. They have to be very specific. Here are important ones:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Configure command&lt;/strong&gt;: The configure command (&lt;code&gt;~/git/gcc/configure --prefix=$HOME/gcc-test-001&lt;/code&gt;)
need to be called from your &lt;strong&gt;build&lt;/strong&gt; directory. (&lt;code&gt;~/gcc-build-001/&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GCC subdirectory&lt;/strong&gt;: Creating a pass with regards to &lt;code&gt;gcc&lt;/code&gt; source code must be in &lt;code&gt;~/git/gcc/gcc&lt;/code&gt;. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;Makefile&lt;/code&gt; remove&lt;/strong&gt;: When you change &lt;code&gt;Makefile.in&lt;/code&gt; for the first time, and you need to remove the initial &lt;code&gt;Makefile&lt;/code&gt;. Make sure that you are in the &lt;code&gt;~/gcc-build-001/gcc&lt;/code&gt; subdirectory!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If everything goes and attention is detailed, the install will be successful!&lt;/p&gt;

&lt;p&gt;Now let's move on 😄&lt;/p&gt;




&lt;h2&gt;
  
  
  📌 Test it Out
&lt;/h2&gt;

&lt;p&gt;We have confirmation that our &lt;code&gt;gcc&lt;/code&gt; is installed. Now we will need to test it out. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;test.c&lt;/code&gt; file
&lt;/h3&gt;

&lt;p&gt;Make a new &lt;code&gt;test.c&lt;/code&gt; file:&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;void&lt;/span&gt; &lt;span class="nf"&gt;function1&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;"I'm function1!&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="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;function2&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;"I'm function2!&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="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;function3&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;"I'm function3!&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="p"&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;function1&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; 
    &lt;span class="n"&gt;function2&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; 
    &lt;span class="n"&gt;function3&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;h3&gt;
  
  
  Makefile
&lt;/h3&gt;

&lt;p&gt;To &lt;code&gt;make&lt;/code&gt; and run our new &lt;code&gt;test.c&lt;/code&gt; file, we will need to add a new Makefile.&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="nv"&gt;BINARIES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;
&lt;span class="nv"&gt;CCFLAGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nt"&gt;-g&lt;/span&gt; &lt;span class="nt"&gt;-O0&lt;/span&gt; &lt;span class="nt"&gt;-fno-builtin&lt;/span&gt; &lt;span class="nt"&gt;-fdump-tree-kzaw&lt;/span&gt;

&lt;span class="nl"&gt;all&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;${BINARIES}&lt;/span&gt;

&lt;span class="nl"&gt;test&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;test.c&lt;/span&gt;
    &lt;span class="nv"&gt;$$&lt;/span&gt;HOME/gcc-test-001/bin/gcc &lt;span class="p"&gt;${&lt;/span&gt;CCFLAGS&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nb"&gt;test &lt;/span&gt;test.c

&lt;span class="nl"&gt;clean&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="p"&gt;${&lt;/span&gt;BINARIES&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;.o &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Things to note:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add &lt;code&gt;-fdump-tree-kzaw&lt;/code&gt; to check our dump file. (The dump file name is from our pass file name)&lt;/li&gt;
&lt;li&gt;Make sure to configure our local &lt;code&gt;gcc&lt;/code&gt;, not the server &lt;code&gt;gcc&lt;/code&gt;. We define the path from our test directory.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Run command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;make test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now check your dumpfile, you will see something like this which means it is working:&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%2F3p60v8mdkj8b3ifx3d1l.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%2F3p60v8mdkj8b3ifx3d1l.png" alt="Output" width="800" height="194"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  📌 Updating the Code
&lt;/h2&gt;

&lt;p&gt;Now that our basic code is working, it is time to edit it so that it can count both the basic blocks and &lt;strong&gt;GIMPLE statements&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;The goal is to traverse basic blocks and statements within a function, while the old code traverses functions in the entire program.&lt;/p&gt;

&lt;p&gt;The main portion of the code we will be editing is the &lt;code&gt;execute()&lt;/code&gt; function. &lt;/p&gt;

&lt;p&gt;First, we'll modify the function signature to actually use the &lt;code&gt;function *fun&lt;/code&gt; parameter.&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="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
&lt;span class="n"&gt;pass_kzaw&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;fun&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, we need to declare variables for going through basic blocks and counting both blocks and statements.&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="n"&gt;basic_block&lt;/span&gt; &lt;span class="n"&gt;block&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;block_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;statement_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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of traversing all functions in the program with &lt;code&gt;FOR_EACH_FUNCTION&lt;/code&gt;, we now use &lt;code&gt;FOR_EACH_BB_FN&lt;/code&gt; to iterate through all basic blocks in the current function.&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;// Traverse basic blocks in the current function&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;block&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="n"&gt;block_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;if&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="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;"===== Basic block count: %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;block_count&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;For each basic block, we add a nested loop using gimple_stmt_iterator to traverse all statements within that block,&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;// For each basic block, traverse statements&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;block&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;g&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;statement_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;if&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="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;"----- Statement count: %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;statement_count&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="n"&gt;print_gimple_stmt&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="n"&gt;g&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;TDF_VOPS&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;TDF_MEMSYMS&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="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, we add summary statistics that report the total number of basic blocks and statements encountered.&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;// Print summary information&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;dump_file&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;"------------------------------------&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;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;"Total 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;block_count&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;"Total 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;statement_count&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;"------------------------------------&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&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="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Completed &lt;code&gt;execute()&lt;/code&gt; Code:&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="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
&lt;span class="n"&gt;pass_kzaw&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;fun&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;block&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;block_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;statement_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;// Traverse basic blocks in the current function&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;block&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="n"&gt;block_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;if&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="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;"===== Basic block count: %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;block_count&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// For each basic block, traverse statements&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;block&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;g&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;statement_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;if&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="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;"----- Statement count: %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;statement_count&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;print_gimple_stmt&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="n"&gt;g&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;TDF_VOPS&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;TDF_MEMSYMS&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;// Print summary information&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;dump_file&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;"------------------------------------&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;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;"Total 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;block_count&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;"Total 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;statement_count&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;"------------------------------------&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&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="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;Once you have finished editing the &lt;code&gt;tree-name.cc&lt;/code&gt; file and the logic, please rebuild the &lt;code&gt;gcc&lt;/code&gt; in your build directory using &lt;code&gt;make&lt;/code&gt;. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note that we don't have to do all of these &lt;code&gt;Makefile.in&lt;/code&gt; stuff as it is only done the first time you add a pass.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When you go to your test file, make and run again, this will be the output!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dump File Output:&lt;/strong&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="p"&gt;;;&lt;/span&gt; &lt;span class="n"&gt;Function&lt;/span&gt; &lt;span class="nf"&gt;function1&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function1&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;0&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;2335&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;1&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;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="o"&gt;=====&lt;/span&gt; &lt;span class="n"&gt;Basic&lt;/span&gt; &lt;span class="n"&gt;block&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;1&lt;/span&gt; &lt;span class="o"&gt;=====&lt;/span&gt;
&lt;span class="o"&gt;-----&lt;/span&gt; &lt;span class="n"&gt;Statement&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;1&lt;/span&gt; &lt;span class="o"&gt;-----&lt;/span&gt;
&lt;span class="cp"&gt;# .MEM_2 = VDEF &amp;lt;.MEM_1(D)&amp;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;"I&lt;/span&gt;&lt;span class="se"&gt;\'&lt;/span&gt;&lt;span class="s"&gt;m function1!&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="o"&gt;-----&lt;/span&gt; &lt;span class="n"&gt;Statement&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;2&lt;/span&gt; &lt;span class="o"&gt;-----&lt;/span&gt;
&lt;span class="cp"&gt;# VUSE &amp;lt;.MEM_2&amp;gt;
&lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;------------------------------------&lt;/span&gt;
&lt;span class="n"&gt;Total&lt;/span&gt; &lt;span class="n"&gt;Basic&lt;/span&gt; &lt;span class="n"&gt;Blocks&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;Total&lt;/span&gt; &lt;span class="n"&gt;Gimple&lt;/span&gt; &lt;span class="n"&gt;Statements&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="o"&gt;------------------------------------&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;function1&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;bb&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&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;"I&lt;/span&gt;&lt;span class="se"&gt;\'&lt;/span&gt;&lt;span class="s"&gt;m function1!&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="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;Function&lt;/span&gt; &lt;span class="nf"&gt;function2&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function2&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;1&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;2337&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;2&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;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="o"&gt;=====&lt;/span&gt; &lt;span class="n"&gt;Basic&lt;/span&gt; &lt;span class="n"&gt;block&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;1&lt;/span&gt; &lt;span class="o"&gt;=====&lt;/span&gt;
&lt;span class="o"&gt;-----&lt;/span&gt; &lt;span class="n"&gt;Statement&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;1&lt;/span&gt; &lt;span class="o"&gt;-----&lt;/span&gt;
&lt;span class="cp"&gt;# .MEM_2 = VDEF &amp;lt;.MEM_1(D)&amp;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;"I&lt;/span&gt;&lt;span class="se"&gt;\'&lt;/span&gt;&lt;span class="s"&gt;m function2!&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="o"&gt;-----&lt;/span&gt; &lt;span class="n"&gt;Statement&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;2&lt;/span&gt; &lt;span class="o"&gt;-----&lt;/span&gt;
&lt;span class="cp"&gt;# VUSE &amp;lt;.MEM_2&amp;gt;
&lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;------------------------------------&lt;/span&gt;
&lt;span class="n"&gt;Total&lt;/span&gt; &lt;span class="n"&gt;Basic&lt;/span&gt; &lt;span class="n"&gt;Blocks&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;Total&lt;/span&gt; &lt;span class="n"&gt;Gimple&lt;/span&gt; &lt;span class="n"&gt;Statements&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="o"&gt;------------------------------------&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;function2&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;bb&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&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;"I&lt;/span&gt;&lt;span class="se"&gt;\'&lt;/span&gt;&lt;span class="s"&gt;m function2!&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="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;Function&lt;/span&gt; &lt;span class="nf"&gt;function3&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function3&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;2&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;2339&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;3&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;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="o"&gt;=====&lt;/span&gt; &lt;span class="n"&gt;Basic&lt;/span&gt; &lt;span class="n"&gt;block&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;1&lt;/span&gt; &lt;span class="o"&gt;=====&lt;/span&gt;
&lt;span class="o"&gt;-----&lt;/span&gt; &lt;span class="n"&gt;Statement&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;1&lt;/span&gt; &lt;span class="o"&gt;-----&lt;/span&gt;
&lt;span class="cp"&gt;# .MEM_2 = VDEF &amp;lt;.MEM_1(D)&amp;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;"I&lt;/span&gt;&lt;span class="se"&gt;\'&lt;/span&gt;&lt;span class="s"&gt;m function3!&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="o"&gt;-----&lt;/span&gt; &lt;span class="n"&gt;Statement&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;2&lt;/span&gt; &lt;span class="o"&gt;-----&lt;/span&gt;
&lt;span class="cp"&gt;# VUSE &amp;lt;.MEM_2&amp;gt;
&lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;------------------------------------&lt;/span&gt;
&lt;span class="n"&gt;Total&lt;/span&gt; &lt;span class="n"&gt;Basic&lt;/span&gt; &lt;span class="n"&gt;Blocks&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;Total&lt;/span&gt; &lt;span class="n"&gt;Gimple&lt;/span&gt; &lt;span class="n"&gt;Statements&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="o"&gt;------------------------------------&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;function3&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;bb&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&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;"I&lt;/span&gt;&lt;span class="se"&gt;\'&lt;/span&gt;&lt;span class="s"&gt;m function3!&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="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;Function&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&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;3&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;2341&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;4&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;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="o"&gt;=====&lt;/span&gt; &lt;span class="n"&gt;Basic&lt;/span&gt; &lt;span class="n"&gt;block&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;1&lt;/span&gt; &lt;span class="o"&gt;=====&lt;/span&gt;
&lt;span class="o"&gt;-----&lt;/span&gt; &lt;span class="n"&gt;Statement&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;1&lt;/span&gt; &lt;span class="o"&gt;-----&lt;/span&gt;
&lt;span class="cp"&gt;# .MEM_2 = VDEF &amp;lt;.MEM_1(D)&amp;gt;
&lt;/span&gt;&lt;span class="n"&gt;function1&lt;/span&gt; &lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;-----&lt;/span&gt; &lt;span class="n"&gt;Statement&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;2&lt;/span&gt; &lt;span class="o"&gt;-----&lt;/span&gt;
&lt;span class="cp"&gt;# .MEM_3 = VDEF &amp;lt;.MEM_2&amp;gt;
&lt;/span&gt;&lt;span class="n"&gt;function2&lt;/span&gt; &lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;-----&lt;/span&gt; &lt;span class="n"&gt;Statement&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;3&lt;/span&gt; &lt;span class="o"&gt;-----&lt;/span&gt;
&lt;span class="cp"&gt;# .MEM_4 = VDEF &amp;lt;.MEM_3&amp;gt;
&lt;/span&gt;&lt;span class="n"&gt;function3&lt;/span&gt; &lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;-----&lt;/span&gt; &lt;span class="n"&gt;Statement&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;4&lt;/span&gt; &lt;span class="o"&gt;-----&lt;/span&gt;
&lt;span class="n"&gt;_5&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="o"&gt;=====&lt;/span&gt; &lt;span class="n"&gt;Basic&lt;/span&gt; &lt;span class="n"&gt;block&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;2&lt;/span&gt; &lt;span class="o"&gt;=====&lt;/span&gt;
&lt;span class="o"&gt;-----&lt;/span&gt; &lt;span class="n"&gt;Statement&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;5&lt;/span&gt; &lt;span class="o"&gt;-----&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;L0&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;:&lt;/span&gt;
&lt;span class="o"&gt;-----&lt;/span&gt; &lt;span class="n"&gt;Statement&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;6&lt;/span&gt; &lt;span class="o"&gt;-----&lt;/span&gt;
&lt;span class="cp"&gt;# VUSE &amp;lt;.MEM_4&amp;gt;
&lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;------------------------------------&lt;/span&gt;
&lt;span class="n"&gt;Total&lt;/span&gt; &lt;span class="n"&gt;Basic&lt;/span&gt; &lt;span class="n"&gt;Blocks&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="n"&gt;Total&lt;/span&gt; &lt;span class="n"&gt;Gimple&lt;/span&gt; &lt;span class="n"&gt;Statements&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6&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="p"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;D&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2344&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;_5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;bb&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;function1&lt;/span&gt; &lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="n"&gt;function2&lt;/span&gt; &lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="n"&gt;function3&lt;/span&gt; &lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="n"&gt;_5&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;bb&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;L0&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;:&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_5&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 code can be run both in &lt;code&gt;x86&lt;/code&gt; and &lt;code&gt;aarch64&lt;/code&gt; servers!&lt;br&gt;
That brings us to the end of Project Stage 01! 😄&lt;/p&gt;




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

&lt;p&gt;This stage took me a few tries to get running, but that made me understand all the more about creating &lt;code&gt;gcc&lt;/code&gt; passes. Even a simple thing such as creating a pass can take so long if you are not being cautious about your file names, function names and directories.&lt;/p&gt;

&lt;p&gt;All my learnings from my errors are condensed into a section at the start of this post. Please make sure to check it out so that you don't repeat my mistakes.&lt;/p&gt;

&lt;p&gt;I will see you in Project Stage 02. Please stay safe!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>64-Bit Assembly Language - Lab 5</title>
      <dc:creator>Juro Zaw</dc:creator>
      <pubDate>Sat, 22 Mar 2025 20:37:41 +0000</pubDate>
      <link>https://dev.to/jurozaw/lab-5-aarch64-64-bit-assembly-language-lab-40am</link>
      <guid>https://dev.to/jurozaw/lab-5-aarch64-64-bit-assembly-language-lab-40am</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Hi everybody! In lab 5, we are moving forward from &lt;code&gt;6502&lt;/code&gt; assembly language to modern processors such as &lt;code&gt;x86&lt;/code&gt; and &lt;code&gt;aarch64&lt;/code&gt;. Although &lt;code&gt;6502&lt;/code&gt; is offers a minimal instruction set, these modern processors have far more advanced capabilities and architecture. In this lab, we will be exploring the assembly languages in them.&lt;/p&gt;

&lt;p&gt;All the experimentations will be made in &lt;code&gt;x86&lt;/code&gt; and &lt;code&gt;aarch64&lt;/code&gt; remote servers. &lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up
&lt;/h2&gt;

&lt;p&gt;In our class servers, the code examples are obtained through the path: &lt;code&gt;/public/spo600-assembler-lab-examples.tgz&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;We will extract this &lt;code&gt;.tgz&lt;/code&gt; file using the command &lt;code&gt;tar&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;tar xvf /public/spo600-assembler-lab-examples.tgz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The code will be presented in this structure:&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;h2&gt;
  
  
  📌 &lt;code&gt;AArch64&lt;/code&gt; Assembly Program
&lt;/h2&gt;

&lt;p&gt;First, we will look at &lt;code&gt;aarch64&lt;/code&gt; server. Log in and go to the AArch64 assembly example directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ~/spo600/examples/hello/assembler/aarch64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is a &lt;code&gt;hello.s&lt;/code&gt; file. This is the source file of our code!&lt;/p&gt;

&lt;p&gt;Next, you will see that there is a &lt;code&gt;Makefile&lt;/code&gt; in this location. This means that we can run &lt;code&gt;make&lt;/code&gt; and compile our program. Build the program using the &lt;code&gt;make&lt;/code&gt; command. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Based on the dependencies defined in the &lt;code&gt;Makefile&lt;/code&gt;, &lt;code&gt;make&lt;/code&gt; determines which parts of the code have changed and need to be rebuilt, then executes the necessary commands to update only those parts.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;make
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After this, you will see a binary file named &lt;code&gt;hello&lt;/code&gt; in the directory. Run this resulting binary file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;./hello
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It will show you a &lt;strong&gt;"Hello, world!"&lt;/strong&gt; on your terminal.&lt;/p&gt;

&lt;p&gt;Okay, now let's take a look at the code using &lt;code&gt;objdump&lt;/code&gt; command. I want to compare the disassembled output of the object file (&lt;code&gt;hello.o&lt;/code&gt;) to the source file (&lt;code&gt;hello.s&lt;/code&gt;).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;objdump &lt;span class="nt"&gt;-d&lt;/span&gt; hello.o &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; hello_disassembled.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Disassembled Output (&lt;code&gt;hello.o&lt;/code&gt;)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hello.o:     file format elf64-littleaarch64


Disassembly of section .text:

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

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Source File (&lt;code&gt;hello.s&lt;/code&gt;)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight actionscript"&gt;&lt;code&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;globl&lt;/span&gt; &lt;span class="nx"&gt;_start&lt;/span&gt;
&lt;span class="nl"&gt;_start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

        &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&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="cm"&gt;/* file descriptor: 1 is stdout */&lt;/span&gt;
        &lt;span class="nx"&gt;adr&lt;/span&gt;     &lt;span class="nx"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt;         &lt;span class="cm"&gt;/* message location (memory address) */&lt;/span&gt;
        &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;x2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;len&lt;/span&gt;         &lt;span class="cm"&gt;/* message length (bytes) */&lt;/span&gt;

        &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&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="cm"&gt;/* write is syscall #64 */&lt;/span&gt;
        &lt;span class="nx"&gt;svc&lt;/span&gt;     &lt;span class="mi"&gt;0&lt;/span&gt;               &lt;span class="cm"&gt;/* invoke syscall */&lt;/span&gt;

        &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&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="cm"&gt;/* status -&amp;gt; 0 */&lt;/span&gt;
        &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&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="cm"&gt;/* exit is syscall #93 */&lt;/span&gt;
        &lt;span class="nx"&gt;svc&lt;/span&gt;     &lt;span class="mi"&gt;0&lt;/span&gt;               &lt;span class="cm"&gt;/* invoke syscall */&lt;/span&gt;

&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;
&lt;span class="nl"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ascii&lt;/span&gt;      &lt;span class="s2"&gt;"Hello, world!\n"&lt;/span&gt;
&lt;span class="nx"&gt;len&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;    &lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Looking at these two files, the disassembly file is an accurate instruction-by-instruction translation into machine code from our source file. The only difference is when we use the &lt;code&gt;msg&lt;/code&gt; label in the &lt;code&gt;adr&lt;/code&gt; instruction. However, this arose from the nature of how symbols are represented in disassembled code. &lt;/p&gt;




&lt;h2&gt;
  
  
  Modifying the &lt;code&gt;AArch64&lt;/code&gt; Assembly Program
&lt;/h2&gt;

&lt;p&gt;Here is a basic loop in AArch64 assembler.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight actionscript"&gt;&lt;code&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;
 &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;globl&lt;/span&gt; &lt;span class="nx"&gt;_start&lt;/span&gt;
 &lt;span class="nx"&gt;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;                          &lt;span class="cm"&gt;/* starting value for the loop index; **note that this is a symbol (constant)**, not a variable */&lt;/span&gt;
 &lt;span class="nx"&gt;max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;                         &lt;span class="cm"&gt;/* loop exits when the index hits this number (loop condition is i&amp;lt;max) */&lt;/span&gt;
 &lt;span class="nl"&gt;_start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;min&lt;/span&gt;
 &lt;span class="nl"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

     &lt;span class="cm"&gt;/* ... body of the loop ... do something useful here ... */&lt;/span&gt;

     &lt;span class="nx"&gt;add&lt;/span&gt;     &lt;span class="nx"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&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="cm"&gt;/* increment the loop counter */&lt;/span&gt;
     &lt;span class="nx"&gt;cmp&lt;/span&gt;     &lt;span class="nx"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;max&lt;/span&gt;        &lt;span class="cm"&gt;/* see if we've hit the max */&lt;/span&gt;
     &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ne&lt;/span&gt;    &lt;span class="nx"&gt;loop&lt;/span&gt;            &lt;span class="cm"&gt;/* if not, then continue the loop */&lt;/span&gt;

     &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&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="cm"&gt;/* set exit status to 0 */&lt;/span&gt;
     &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&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="cm"&gt;/* exit is syscall #93 */&lt;/span&gt;
     &lt;span class="nx"&gt;svc&lt;/span&gt;     &lt;span class="mi"&gt;0&lt;/span&gt;               &lt;span class="cm"&gt;/* invoke syscall */&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The code is looping 6 times (&lt;code&gt;max&lt;/code&gt; is 6). It stores the loop's index in register 19 (&lt;code&gt;x19&lt;/code&gt;) to keep track of iterations. The body of the loop is empty right now.&lt;/p&gt;

&lt;h3&gt;
  
  
  ☑️ Print Loop
&lt;/h3&gt;

&lt;p&gt;Let's change this code so that it prints out "Loop" on every iteration. We added a &lt;code&gt;.data&lt;/code&gt; section and added the print in the body of the loop. &lt;br&gt;
Change &lt;code&gt;hello.s&lt;/code&gt; like below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight actionscript"&gt;&lt;code&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;globl&lt;/span&gt; &lt;span class="nx"&gt;_start&lt;/span&gt;

&lt;span class="nx"&gt;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;                          &lt;span class="cm"&gt;/* starting value for the loop index */&lt;/span&gt;
&lt;span class="nx"&gt;max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;                          &lt;span class="cm"&gt;/* loop exits when the index hits this number */&lt;/span&gt;

&lt;span class="nl"&gt;_start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;min&lt;/span&gt;            &lt;span class="cm"&gt;/* initialize loop counter */&lt;/span&gt;
&lt;span class="nl"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="cm"&gt;/* Print "Loop" message */&lt;/span&gt;
    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&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="cm"&gt;/* file descriptor: 1 is stdout */&lt;/span&gt;
    &lt;span class="nx"&gt;adr&lt;/span&gt;     &lt;span class="nx"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt;             &lt;span class="cm"&gt;/* message location (memory address) */&lt;/span&gt;
    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;x2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;len&lt;/span&gt;             &lt;span class="cm"&gt;/* message length (bytes) */&lt;/span&gt;
    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&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="cm"&gt;/* write is syscall #64 */&lt;/span&gt;
    &lt;span class="nx"&gt;svc&lt;/span&gt;     &lt;span class="mi"&gt;0&lt;/span&gt;                   &lt;span class="cm"&gt;/* invoke syscall */&lt;/span&gt;

    &lt;span class="nx"&gt;add&lt;/span&gt;     &lt;span class="nx"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&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="cm"&gt;/* increment the loop counter */&lt;/span&gt;
    &lt;span class="nx"&gt;cmp&lt;/span&gt;     &lt;span class="nx"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;max&lt;/span&gt;            &lt;span class="cm"&gt;/* see if we've hit the max */&lt;/span&gt;
    &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ne&lt;/span&gt;    &lt;span class="nx"&gt;loop&lt;/span&gt;                &lt;span class="cm"&gt;/* if not, then continue the loop */&lt;/span&gt;

    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&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="cm"&gt;/* set exit status to 0 */&lt;/span&gt;
    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&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="cm"&gt;/* exit is syscall #93 */&lt;/span&gt;
    &lt;span class="nx"&gt;svc&lt;/span&gt;     &lt;span class="mi"&gt;0&lt;/span&gt;                   &lt;span class="cm"&gt;/* invoke syscall */&lt;/span&gt;

&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;
&lt;span class="nl"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ascii&lt;/span&gt;      &lt;span class="s2"&gt;"Loop\n"&lt;/span&gt;
&lt;span class="nx"&gt;len&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;    &lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test this new code by using &lt;code&gt;make&lt;/code&gt; and running&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make clean
make
./hello
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[kzaw@aarch64-002 aarch64]$ ./hello
Loop
Loop
Loop
Loop
Loop
Loop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ☑️ Print Loop and Index Number
&lt;/h3&gt;

&lt;p&gt;Let's change the code again so that it will print &lt;code&gt;Loop: #&lt;/code&gt; where '#' is the current index number. &lt;/p&gt;

&lt;p&gt;To do that, we will need to convert our loop counter number to its ASCII character representation. In ASCII/ISO-8859-1/Unicode UTF-8, the digit characters are in the range 48-57 (0x30-0x39).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight actionscript"&gt;&lt;code&gt;&lt;span class="nx"&gt;add&lt;/span&gt;     &lt;span class="nx"&gt;x20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt;       &lt;span class="cm"&gt;/* x20 = x19 + 48 (ASCII '0') */&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This converts the loop counter in register 19 (&lt;code&gt;x19&lt;/code&gt;) by adding 48 value (ASCII code for '0') and stores the new value in &lt;code&gt;x20&lt;/code&gt;. For example, &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;when &lt;code&gt;x19&lt;/code&gt; = 0, &lt;code&gt;x20&lt;/code&gt; becomes 48 (ASCII '0'). &lt;/li&gt;
&lt;li&gt;when &lt;code&gt;x19&lt;/code&gt; = 1, &lt;code&gt;x20&lt;/code&gt; becomes 49 (ASCII '1').&lt;/li&gt;
&lt;li&gt;And so on...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next, define our message.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight actionscript"&gt;&lt;code&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ascii&lt;/span&gt;      &lt;span class="s2"&gt;"Loop: #\n"&lt;/span&gt;    &lt;span class="cm"&gt;/* # is a placeholder for the digit */&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I added this below code into the body of the loop. What's happening here is that I am getting the address of the &lt;code&gt;msg&lt;/code&gt;, and then adding an offset of 6 bytes to point to the position after "Loop: ". (which is 6 characters long). &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The &lt;code&gt;strb&lt;/code&gt; instruction writes a byte from a register into a memory.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;w20&lt;/code&gt; is the 32 bit view of &lt;code&gt;x20&lt;/code&gt;. When used with &lt;code&gt;strb&lt;/code&gt;, this means we take the lowest 8 bits (1 byte) from that register. In this context, where &lt;code&gt;x20&lt;/code&gt; is pointing to an ASCII digit (which takes 1 byte),  the instruction will ignore the other 24 bits and ensure unnecessary space isn't taken.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;[x21]&lt;/code&gt; is the location to store the ASCII digit to. Now this whole thing means the instruction will write that ASCII digit to the memory location pointed to by &lt;code&gt;x21&lt;/code&gt; ('#').&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight actionscript"&gt;&lt;code&gt;&lt;span class="nx"&gt;adr&lt;/span&gt;     &lt;span class="nx"&gt;x21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt;            &lt;span class="cm"&gt;/* Get address of message */&lt;/span&gt;
&lt;span class="nx"&gt;add&lt;/span&gt;     &lt;span class="nx"&gt;x21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;        &lt;span class="cm"&gt;/* Position of the digit character (after "Loop: ") */&lt;/span&gt;
&lt;span class="nx"&gt;strb&lt;/span&gt;    &lt;span class="nx"&gt;w20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;x21&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;          &lt;span class="cm"&gt;/* Store the ASCII character at that position */&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✨&lt;br&gt;
&lt;strong&gt;Modified Code:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight actionscript"&gt;&lt;code&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;globl&lt;/span&gt; &lt;span class="nx"&gt;_start&lt;/span&gt;

&lt;span class="nx"&gt;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;                          &lt;span class="cm"&gt;/* starting value for the loop index */&lt;/span&gt;
&lt;span class="nx"&gt;max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;                          &lt;span class="cm"&gt;/* loop exits when the index hits this number */&lt;/span&gt;

&lt;span class="nl"&gt;_start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;min&lt;/span&gt;            &lt;span class="cm"&gt;/* initialize loop counter */&lt;/span&gt;
&lt;span class="nl"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="cm"&gt;/* Convert loop counter to ASCII character */&lt;/span&gt;
    &lt;span class="nx"&gt;add&lt;/span&gt;     &lt;span class="nx"&gt;x20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt;       &lt;span class="cm"&gt;/* x20 = x19 + 48 (ASCII '0') */&lt;/span&gt;

    &lt;span class="cm"&gt;/* Store the ASCII digit in the message */&lt;/span&gt;
    &lt;span class="nx"&gt;adr&lt;/span&gt;     &lt;span class="nx"&gt;x21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt;            &lt;span class="cm"&gt;/* Get address of message */&lt;/span&gt;
    &lt;span class="nx"&gt;add&lt;/span&gt;     &lt;span class="nx"&gt;x21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;        &lt;span class="cm"&gt;/* Position of the digit character (after "Loop: ") */&lt;/span&gt;
    &lt;span class="nx"&gt;strb&lt;/span&gt;    &lt;span class="nx"&gt;w20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;x21&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;          &lt;span class="cm"&gt;/* Store the ASCII character at that position */&lt;/span&gt;

    &lt;span class="cm"&gt;/* Print message with loop counter */&lt;/span&gt;
    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&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="cm"&gt;/* file descriptor: 1 is stdout */&lt;/span&gt;
    &lt;span class="nx"&gt;adr&lt;/span&gt;     &lt;span class="nx"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt;             &lt;span class="cm"&gt;/* message location (memory address) */&lt;/span&gt;
    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;x2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;len&lt;/span&gt;             &lt;span class="cm"&gt;/* message length (bytes) */&lt;/span&gt;
    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&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="cm"&gt;/* write is syscall #64 */&lt;/span&gt;
    &lt;span class="nx"&gt;svc&lt;/span&gt;     &lt;span class="mi"&gt;0&lt;/span&gt;                   &lt;span class="cm"&gt;/* invoke syscall */&lt;/span&gt;

    &lt;span class="nx"&gt;add&lt;/span&gt;     &lt;span class="nx"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&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="cm"&gt;/* increment the loop counter */&lt;/span&gt;
    &lt;span class="nx"&gt;cmp&lt;/span&gt;     &lt;span class="nx"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;max&lt;/span&gt;            &lt;span class="cm"&gt;/* see if we've hit the max */&lt;/span&gt;
    &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ne&lt;/span&gt;    &lt;span class="nx"&gt;loop&lt;/span&gt;                &lt;span class="cm"&gt;/* if not, then continue the loop */&lt;/span&gt;

    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&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="cm"&gt;/* set exit status to 0 */&lt;/span&gt;
    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&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="cm"&gt;/* exit is syscall #93 */&lt;/span&gt;
    &lt;span class="nx"&gt;svc&lt;/span&gt;     &lt;span class="mi"&gt;0&lt;/span&gt;                   &lt;span class="cm"&gt;/* invoke syscall */&lt;/span&gt;

&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;
&lt;span class="nl"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ascii&lt;/span&gt;      &lt;span class="s2"&gt;"Loop: #\n"&lt;/span&gt;    &lt;span class="cm"&gt;/* # is a placeholder for the digit */&lt;/span&gt;
&lt;span class="nx"&gt;len&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;    &lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[kzaw@aarch64-002 aarch64]$ ./hello
Loop: 0
Loop: 1
Loop: 2
Loop: 3
Loop: 4
Loop: 5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ☑️ Loop From 00 - 32
&lt;/h3&gt;

&lt;p&gt;The next requirement is to loop from 00 - 32, printing in 2-digit decimal numbers. Besides changing the &lt;code&gt;max&lt;/code&gt; symbol to 33, there are other important changes we must do.&lt;/p&gt;

&lt;p&gt;We copy the loop counter to x22.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight actionscript"&gt;&lt;code&gt;&lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;x22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x19&lt;/span&gt;            &lt;span class="cm"&gt;/* Copy loop counter to x22 */&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, we need to change our code to cater for two-digit conversion.&lt;br&gt;
Before, it was just adding the ASCII number to our counter and that was it. Now it is more complicated.&lt;/p&gt;

&lt;p&gt;How we calculate the tens digit is basically divide by 10. The &lt;code&gt;udiv&lt;/code&gt; instruction gets the quotient in the division. &lt;/p&gt;

&lt;p&gt;So &lt;code&gt;x20 = x22 / 10&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight actionscript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* Calculate tens digit: quotient of division by 10 */&lt;/span&gt;
&lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;x23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;            &lt;span class="cm"&gt;/* Set divisor to 10 */&lt;/span&gt;
&lt;span class="nx"&gt;udiv&lt;/span&gt;    &lt;span class="nx"&gt;x20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x23&lt;/span&gt;       &lt;span class="cm"&gt;/* x20 = x22 / 10 (quotient = tens digit) */&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that the tens digit is extracted, we can get the ones digit by getting the remainder. To do this, we will use &lt;code&gt;mul&lt;/code&gt; to multiply the quotient with 10. This value is then subtracted from original value to get the remainder.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight actionscript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* Calculate ones digit: remainder of division by 10 */&lt;/span&gt;
&lt;span class="nx"&gt;mul&lt;/span&gt;     &lt;span class="nx"&gt;x24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x23&lt;/span&gt;       &lt;span class="cm"&gt;/* x24 = quotient * 10 */&lt;/span&gt;
&lt;span class="nx"&gt;sub&lt;/span&gt;     &lt;span class="nx"&gt;x21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x24&lt;/span&gt;       &lt;span class="cm"&gt;/* x21 = original - (quotient * 10) = remainder */&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After all of this, we can convert everything to ASCII.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight actionscript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* Convert digits to ASCII */&lt;/span&gt;
&lt;span class="nx"&gt;add&lt;/span&gt;     &lt;span class="nx"&gt;x20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt;       &lt;span class="cm"&gt;/* Convert tens digit to ASCII */&lt;/span&gt;
&lt;span class="nx"&gt;add&lt;/span&gt;     &lt;span class="nx"&gt;x21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt;       &lt;span class="cm"&gt;/* Convert ones digit to ASCII */&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let me show you a table of registers, comparing the old and new so we can understand better.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Register&lt;/th&gt;
&lt;th&gt;Original Purpose&lt;/th&gt;
&lt;th&gt;New Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;x19&lt;/td&gt;
&lt;td&gt;Loop counter&lt;/td&gt;
&lt;td&gt;Loop counter (unchanged)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;x20&lt;/td&gt;
&lt;td&gt;ASCII digit&lt;/td&gt;
&lt;td&gt;Tens digit (after conversion to ASCII)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;x21&lt;/td&gt;
&lt;td&gt;Message pointer&lt;/td&gt;
&lt;td&gt;Ones digit (after conversion to ASCII)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;x22&lt;/td&gt;
&lt;td&gt;–&lt;/td&gt;
&lt;td&gt;Copy of loop counter for calculations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;x23&lt;/td&gt;
&lt;td&gt;–&lt;/td&gt;
&lt;td&gt;Constant value 10 (divisor)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;x24&lt;/td&gt;
&lt;td&gt;–&lt;/td&gt;
&lt;td&gt;Pointer for message buffer manipulation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Calculation is completed! Change the logic where we change the message to accommodate the two digits.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight actionscript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* Store the ASCII digits in the message */&lt;/span&gt;
&lt;span class="nx"&gt;adr&lt;/span&gt;     &lt;span class="nx"&gt;x24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt;            &lt;span class="cm"&gt;/* Get address of message */&lt;/span&gt;
&lt;span class="nx"&gt;add&lt;/span&gt;     &lt;span class="nx"&gt;x24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;        &lt;span class="cm"&gt;/* Position of the first digit (after "Loop: ") */&lt;/span&gt;
&lt;span class="nx"&gt;strb&lt;/span&gt;    &lt;span class="nx"&gt;w20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;x24&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;          &lt;span class="cm"&gt;/* Store the tens digit */&lt;/span&gt;
&lt;span class="nx"&gt;add&lt;/span&gt;     &lt;span class="nx"&gt;x24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;        &lt;span class="cm"&gt;/* Move to the position of the second digit */&lt;/span&gt;
&lt;span class="nx"&gt;strb&lt;/span&gt;    &lt;span class="nx"&gt;w21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;x24&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;          &lt;span class="cm"&gt;/* Store the ones digit */&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✨&lt;br&gt;
&lt;strong&gt;Modified Code:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight actionscript"&gt;&lt;code&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;globl&lt;/span&gt; &lt;span class="nx"&gt;_start&lt;/span&gt;

&lt;span class="nx"&gt;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;                          &lt;span class="cm"&gt;/* starting value for the loop index */&lt;/span&gt;
&lt;span class="nx"&gt;max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;33&lt;/span&gt;                         &lt;span class="cm"&gt;/* loop exits when the index hits this number */&lt;/span&gt;

&lt;span class="nl"&gt;_start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;min&lt;/span&gt;            &lt;span class="cm"&gt;/* initialize loop counter */&lt;/span&gt;
&lt;span class="nl"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="cm"&gt;/* Convert loop counter to two ASCII digits */&lt;/span&gt;
    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;x22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x19&lt;/span&gt;            &lt;span class="cm"&gt;/* Copy loop counter to x22 */&lt;/span&gt;

    &lt;span class="cm"&gt;/* Calculate tens digit: quotient of division by 10 */&lt;/span&gt;
    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;x23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;            &lt;span class="cm"&gt;/* Set divisor to 10 */&lt;/span&gt;
    &lt;span class="nx"&gt;udiv&lt;/span&gt;    &lt;span class="nx"&gt;x20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x23&lt;/span&gt;       &lt;span class="cm"&gt;/* x20 = x22 / 10 (quotient = tens digit) */&lt;/span&gt;

    &lt;span class="cm"&gt;/* Calculate ones digit: remainder of division by 10 */&lt;/span&gt;
    &lt;span class="nx"&gt;mul&lt;/span&gt;     &lt;span class="nx"&gt;x24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x23&lt;/span&gt;       &lt;span class="cm"&gt;/* x24 = quotient * 10 */&lt;/span&gt;
    &lt;span class="nx"&gt;sub&lt;/span&gt;     &lt;span class="nx"&gt;x21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x24&lt;/span&gt;       &lt;span class="cm"&gt;/* x21 = original - (quotient * 10) = remainder */&lt;/span&gt;

    &lt;span class="cm"&gt;/* Convert digits to ASCII */&lt;/span&gt;
    &lt;span class="nx"&gt;add&lt;/span&gt;     &lt;span class="nx"&gt;x20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt;       &lt;span class="cm"&gt;/* Convert tens digit to ASCII */&lt;/span&gt;
    &lt;span class="nx"&gt;add&lt;/span&gt;     &lt;span class="nx"&gt;x21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt;       &lt;span class="cm"&gt;/* Convert ones digit to ASCII */&lt;/span&gt;

    &lt;span class="cm"&gt;/* Store the ASCII digits in the message */&lt;/span&gt;
    &lt;span class="nx"&gt;adr&lt;/span&gt;     &lt;span class="nx"&gt;x24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt;            &lt;span class="cm"&gt;/* Get address of message */&lt;/span&gt;
    &lt;span class="nx"&gt;add&lt;/span&gt;     &lt;span class="nx"&gt;x24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;        &lt;span class="cm"&gt;/* Position of the first digit (after "Loop: ") */&lt;/span&gt;
    &lt;span class="nx"&gt;strb&lt;/span&gt;    &lt;span class="nx"&gt;w20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;x24&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;          &lt;span class="cm"&gt;/* Store the tens digit */&lt;/span&gt;
    &lt;span class="nx"&gt;add&lt;/span&gt;     &lt;span class="nx"&gt;x24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;        &lt;span class="cm"&gt;/* Move to the position of the second digit */&lt;/span&gt;
    &lt;span class="nx"&gt;strb&lt;/span&gt;    &lt;span class="nx"&gt;w21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;x24&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;          &lt;span class="cm"&gt;/* Store the ones digit */&lt;/span&gt;

    &lt;span class="cm"&gt;/* Print message with loop counter */&lt;/span&gt;
    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&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="cm"&gt;/* file descriptor: 1 is stdout */&lt;/span&gt;
    &lt;span class="nx"&gt;adr&lt;/span&gt;     &lt;span class="nx"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt;             &lt;span class="cm"&gt;/* message location (memory address) */&lt;/span&gt;
    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;x2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;len&lt;/span&gt;             &lt;span class="cm"&gt;/* message length (bytes) */&lt;/span&gt;
    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&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="cm"&gt;/* write is syscall #64 */&lt;/span&gt;
    &lt;span class="nx"&gt;svc&lt;/span&gt;     &lt;span class="mi"&gt;0&lt;/span&gt;                   &lt;span class="cm"&gt;/* invoke syscall */&lt;/span&gt;

    &lt;span class="nx"&gt;add&lt;/span&gt;     &lt;span class="nx"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&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="cm"&gt;/* increment the loop counter */&lt;/span&gt;
    &lt;span class="nx"&gt;cmp&lt;/span&gt;     &lt;span class="nx"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;max&lt;/span&gt;            &lt;span class="cm"&gt;/* see if we've hit the max */&lt;/span&gt;
    &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ne&lt;/span&gt;    &lt;span class="nx"&gt;loop&lt;/span&gt;                &lt;span class="cm"&gt;/* if not, then continue the loop */&lt;/span&gt;

    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&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="cm"&gt;/* set exit status to 0 */&lt;/span&gt;
    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&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="cm"&gt;/* exit is syscall #93 */&lt;/span&gt;
    &lt;span class="nx"&gt;svc&lt;/span&gt;     &lt;span class="mi"&gt;0&lt;/span&gt;                   &lt;span class="cm"&gt;/* invoke syscall */&lt;/span&gt;

&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;
&lt;span class="nl"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ascii&lt;/span&gt;      &lt;span class="s2"&gt;"Loop: ##\n"&lt;/span&gt;   &lt;span class="cm"&gt;/* ## are placeholders for the two digits */&lt;/span&gt;
&lt;span class="nx"&gt;len&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;    &lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output:&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;kzaw@aarch64-002 aarch64]&lt;span class="nv"&gt;$ &lt;/span&gt;./hello
Loop: 00
Loop: 01
...
Loop: 09
Loop: 10
...
Loop: 32
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ☑️ Loop Without Trailing Zeros
&lt;/h3&gt;

&lt;p&gt;The next change we're making is removing the leading zero for single-digit numbers. &lt;/p&gt;

&lt;p&gt;To make this happen, we need to implement &lt;strong&gt;conditional&lt;/strong&gt; logic that detects whether we're dealing with a single-digit or double-digit number, and formats the output accordingly.&lt;/p&gt;

&lt;p&gt;We need to use different message formats depending on the number's value:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For numbers 0-9: Use "Loop:  #" (notice two spaces after the colon)&lt;/li&gt;
&lt;li&gt;For numbers 10-32: Use "Loop: ##" (notice one space after the colon)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight actionscript"&gt;&lt;code&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;
&lt;span class="nl"&gt;msg1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ascii&lt;/span&gt;      &lt;span class="s2"&gt;"Loop:  #\n"&lt;/span&gt;   &lt;span class="cm"&gt;/* Single-digit format (note: two spaces after colon) */&lt;/span&gt;
&lt;span class="nx"&gt;len1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;msg1&lt;/span&gt;
&lt;span class="nl"&gt;msg2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ascii&lt;/span&gt;      &lt;span class="s2"&gt;"Loop: ##\n"&lt;/span&gt;   &lt;span class="cm"&gt;/* Double-digit format (note: one space after colon) */&lt;/span&gt;
&lt;span class="nx"&gt;len2&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;msg2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;strong&gt;KEY&lt;/strong&gt; change is this conditional check. We compare the tens digit with the ASCII value '0'. If it's not '0', then we know we have a two-digit number. We will make a new &lt;code&gt;double_digit&lt;/code&gt; function for our condition.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight actionscript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* Determine if number is single or double digit */&lt;/span&gt;
&lt;span class="nx"&gt;cmp&lt;/span&gt;     &lt;span class="nx"&gt;x20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt;            &lt;span class="cm"&gt;/* Compare tens digit to ASCII '0' */&lt;/span&gt;
&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ne&lt;/span&gt;    &lt;span class="nx"&gt;double_digit&lt;/span&gt;        &lt;span class="cm"&gt;/* If not '0', it's a double-digit number */&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If it's not double digit, then we continue on to the single digit case. Use &lt;code&gt;msg1&lt;/code&gt; and store in position 6. After the logic, jump to the common &lt;code&gt;print_msg&lt;/code&gt; routine.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight actionscript"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* Single-digit case (0-9) */&lt;/span&gt;
&lt;span class="nx"&gt;adr&lt;/span&gt;     &lt;span class="nx"&gt;x24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;msg1&lt;/span&gt;           &lt;span class="cm"&gt;/* Get address of single-digit message */&lt;/span&gt;
&lt;span class="nx"&gt;strb&lt;/span&gt;    &lt;span class="nx"&gt;w21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;x24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;      &lt;span class="cm"&gt;/* Store ones digit at position after "Loop: " */&lt;/span&gt;
&lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x24&lt;/span&gt;             &lt;span class="cm"&gt;/* Set message address for print */&lt;/span&gt;
&lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;x2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;len1&lt;/span&gt;            &lt;span class="cm"&gt;/* Set message length */&lt;/span&gt;
&lt;span class="nx"&gt;b&lt;/span&gt;       &lt;span class="nx"&gt;print_msg&lt;/span&gt;           &lt;span class="cm"&gt;/* Jump to print routine */&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If it's double digit, we would jump to &lt;code&gt;double_digit&lt;/code&gt; routine. Use &lt;code&gt;msg2&lt;/code&gt;, set the length and address up for printing and then fall through to the print logic.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight actionscript"&gt;&lt;code&gt;&lt;span class="nx"&gt;double_digit&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="cm"&gt;/* Double-digit case (10-32) */&lt;/span&gt;
    &lt;span class="nx"&gt;adr&lt;/span&gt;     &lt;span class="nx"&gt;x24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;msg2&lt;/span&gt;           &lt;span class="cm"&gt;/* Get address of double-digit message */&lt;/span&gt;
    &lt;span class="nx"&gt;strb&lt;/span&gt;    &lt;span class="nx"&gt;w20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;x24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;      &lt;span class="cm"&gt;/* Store tens digit */&lt;/span&gt;
    &lt;span class="nx"&gt;strb&lt;/span&gt;    &lt;span class="nx"&gt;w21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;x24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;      &lt;span class="cm"&gt;/* Store ones digit */&lt;/span&gt;
    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x24&lt;/span&gt;             &lt;span class="cm"&gt;/* Set message address for print */&lt;/span&gt;
    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;x2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;len2&lt;/span&gt;            &lt;span class="cm"&gt;/* Set message length */&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the printing logic below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight actionscript"&gt;&lt;code&gt;&lt;span class="nx"&gt;print_msg&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="cm"&gt;/* Print message with loop counter */&lt;/span&gt;
    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&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="cm"&gt;/* file descriptor: 1 is stdout */&lt;/span&gt;
    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&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="cm"&gt;/* write is syscall #64 */&lt;/span&gt;
    &lt;span class="nx"&gt;svc&lt;/span&gt;     &lt;span class="mi"&gt;0&lt;/span&gt;                   &lt;span class="cm"&gt;/* invoke syscall */&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✨&lt;br&gt;
&lt;strong&gt;Modified Code:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight actionscript"&gt;&lt;code&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;globl&lt;/span&gt; &lt;span class="nx"&gt;_start&lt;/span&gt;

&lt;span class="nx"&gt;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;                          &lt;span class="cm"&gt;/* starting value for the loop index */&lt;/span&gt;
&lt;span class="nx"&gt;max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;33&lt;/span&gt;                         &lt;span class="cm"&gt;/* loop exits when the index hits this number */&lt;/span&gt;

&lt;span class="nl"&gt;_start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;min&lt;/span&gt;            &lt;span class="cm"&gt;/* initialize loop counter */&lt;/span&gt;
&lt;span class="nl"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="cm"&gt;/* Convert loop counter to two ASCII digits */&lt;/span&gt;
    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;x22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x19&lt;/span&gt;            &lt;span class="cm"&gt;/* Copy loop counter to x22 */&lt;/span&gt;

    &lt;span class="cm"&gt;/* Calculate tens digit: quotient of division by 10 */&lt;/span&gt;
    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;x23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;            &lt;span class="cm"&gt;/* Set divisor to 10 */&lt;/span&gt;
    &lt;span class="nx"&gt;udiv&lt;/span&gt;    &lt;span class="nx"&gt;x20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x23&lt;/span&gt;       &lt;span class="cm"&gt;/* x20 = x22 / 10 (quotient = tens digit) */&lt;/span&gt;

    &lt;span class="cm"&gt;/* Calculate ones digit: remainder of division by 10 */&lt;/span&gt;
    &lt;span class="nx"&gt;mul&lt;/span&gt;     &lt;span class="nx"&gt;x24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x23&lt;/span&gt;       &lt;span class="cm"&gt;/* x24 = quotient * 10 */&lt;/span&gt;
    &lt;span class="nx"&gt;sub&lt;/span&gt;     &lt;span class="nx"&gt;x21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x24&lt;/span&gt;       &lt;span class="cm"&gt;/* x21 = original - (quotient * 10) = remainder */&lt;/span&gt;

    &lt;span class="cm"&gt;/* Convert digits to ASCII */&lt;/span&gt;
    &lt;span class="nx"&gt;add&lt;/span&gt;     &lt;span class="nx"&gt;x20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt;       &lt;span class="cm"&gt;/* Convert tens digit to ASCII */&lt;/span&gt;
    &lt;span class="nx"&gt;add&lt;/span&gt;     &lt;span class="nx"&gt;x21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt;       &lt;span class="cm"&gt;/* Convert ones digit to ASCII */&lt;/span&gt;

    &lt;span class="cm"&gt;/* Determine if number is single or double digit */&lt;/span&gt;
    &lt;span class="nx"&gt;cmp&lt;/span&gt;     &lt;span class="nx"&gt;x20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt;            &lt;span class="cm"&gt;/* Compare tens digit to ASCII '0' */&lt;/span&gt;
    &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ne&lt;/span&gt;    &lt;span class="nx"&gt;double_digit&lt;/span&gt;        &lt;span class="cm"&gt;/* If not '0', it's a double-digit number */&lt;/span&gt;

    &lt;span class="cm"&gt;/* Single-digit case (0-9) */&lt;/span&gt;
    &lt;span class="nx"&gt;adr&lt;/span&gt;     &lt;span class="nx"&gt;x24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;msg1&lt;/span&gt;           &lt;span class="cm"&gt;/* Get address of single-digit message */&lt;/span&gt;
    &lt;span class="nx"&gt;strb&lt;/span&gt;    &lt;span class="nx"&gt;w21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;x24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;      &lt;span class="cm"&gt;/* Store ones digit at position after "Loop:  " */&lt;/span&gt;
    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x24&lt;/span&gt;             &lt;span class="cm"&gt;/* Set message address for print */&lt;/span&gt;
    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;x2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;len1&lt;/span&gt;            &lt;span class="cm"&gt;/* Set message length */&lt;/span&gt;
    &lt;span class="nx"&gt;b&lt;/span&gt;       &lt;span class="nx"&gt;print_msg&lt;/span&gt;           &lt;span class="cm"&gt;/* Jump to print routine */&lt;/span&gt;

&lt;span class="nl"&gt;double_digit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="cm"&gt;/* Double-digit case (10-32) */&lt;/span&gt;
    &lt;span class="nx"&gt;adr&lt;/span&gt;     &lt;span class="nx"&gt;x24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;msg2&lt;/span&gt;           &lt;span class="cm"&gt;/* Get address of double-digit message */&lt;/span&gt;
    &lt;span class="nx"&gt;strb&lt;/span&gt;    &lt;span class="nx"&gt;w20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;x24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;      &lt;span class="cm"&gt;/* Store tens digit */&lt;/span&gt;
    &lt;span class="nx"&gt;strb&lt;/span&gt;    &lt;span class="nx"&gt;w21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;x24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;      &lt;span class="cm"&gt;/* Store ones digit */&lt;/span&gt;
    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x24&lt;/span&gt;             &lt;span class="cm"&gt;/* Set message address for print */&lt;/span&gt;
    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;x2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;len2&lt;/span&gt;            &lt;span class="cm"&gt;/* Set message length */&lt;/span&gt;

&lt;span class="nl"&gt;print_msg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="cm"&gt;/* Print message with loop counter */&lt;/span&gt;
    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&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="cm"&gt;/* file descriptor: 1 is stdout */&lt;/span&gt;
    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&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="cm"&gt;/* write is syscall #64 */&lt;/span&gt;
    &lt;span class="nx"&gt;svc&lt;/span&gt;     &lt;span class="mi"&gt;0&lt;/span&gt;                   &lt;span class="cm"&gt;/* invoke syscall */&lt;/span&gt;

    &lt;span class="nx"&gt;add&lt;/span&gt;     &lt;span class="nx"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&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="cm"&gt;/* increment the loop counter */&lt;/span&gt;
    &lt;span class="nx"&gt;cmp&lt;/span&gt;     &lt;span class="nx"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;max&lt;/span&gt;            &lt;span class="cm"&gt;/* see if we've hit the max */&lt;/span&gt;
    &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ne&lt;/span&gt;    &lt;span class="nx"&gt;loop&lt;/span&gt;                &lt;span class="cm"&gt;/* if not, then continue the loop */&lt;/span&gt;

    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&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="cm"&gt;/* set exit status to 0 */&lt;/span&gt;
    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&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="cm"&gt;/* exit is syscall #93 */&lt;/span&gt;
    &lt;span class="nx"&gt;svc&lt;/span&gt;     &lt;span class="mi"&gt;0&lt;/span&gt;                   &lt;span class="cm"&gt;/* invoke syscall */&lt;/span&gt;

&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;
&lt;span class="nl"&gt;msg1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ascii&lt;/span&gt;      &lt;span class="s2"&gt;"Loop:  #\n"&lt;/span&gt;   &lt;span class="cm"&gt;/* Single-digit format (note: two spaces after colon) */&lt;/span&gt;
&lt;span class="nx"&gt;len1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;msg1&lt;/span&gt;
&lt;span class="nl"&gt;msg2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ascii&lt;/span&gt;      &lt;span class="s2"&gt;"Loop: ##\n"&lt;/span&gt;   &lt;span class="cm"&gt;/* Double-digit format (note: one space after colon) */&lt;/span&gt;
&lt;span class="nx"&gt;len2&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;msg2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Loop:  0
Loop:  1
Loop:  2
...
Loop:  9
Loop: 10
Loop: 11
...
Loop: 32
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ☑️ Loop with Hex Output (0 - 20)
&lt;/h3&gt;

&lt;p&gt;Now, let's say we want to output in hex instead of decimal. Remove the single vs. double digit branch. These are the changes you can make.&lt;/p&gt;

&lt;p&gt;We will now divide by 16 instead of 10. This makes the quotient the “high nibble” (first hexadecimal digit) and the remainder the “low nibble.”&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight actionscript"&gt;&lt;code&gt;    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;x23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For each nibble, check whether its value is less than 10. If it is, convert it to ASCII by adding 48. If it's not, we add 55 so that 1o becomes 65 (&lt;code&gt;'A'&lt;/code&gt;), 11 becomes 66 (&lt;code&gt;'B'&lt;/code&gt;), etc. &lt;/p&gt;

&lt;p&gt;Here's that logic for the high nibble. The same is applied to low nibble.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight actionscript"&gt;&lt;code&gt;    &lt;span class="nx"&gt;cmp&lt;/span&gt;     &lt;span class="nx"&gt;x20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;            &lt;span class="cm"&gt;/* Check if high nibble is less than 10 */&lt;/span&gt;
    &lt;span class="nx"&gt;blt&lt;/span&gt;     &lt;span class="nx"&gt;high_digit_decimal&lt;/span&gt;
    &lt;span class="nx"&gt;add&lt;/span&gt;     &lt;span class="nx"&gt;x20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;55&lt;/span&gt;       &lt;span class="cm"&gt;/* For hex A-F */&lt;/span&gt;
    &lt;span class="nx"&gt;b&lt;/span&gt;       &lt;span class="nx"&gt;high_digit_done&lt;/span&gt;
&lt;span class="nl"&gt;high_digit_decimal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nx"&gt;add&lt;/span&gt;     &lt;span class="nx"&gt;x20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt;       &lt;span class="cm"&gt;/* For digits 0-9 */&lt;/span&gt;
&lt;span class="nl"&gt;high_digit_done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;✨&lt;br&gt;
&lt;strong&gt;Modified Code:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight actionscript"&gt;&lt;code&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;globl&lt;/span&gt; &lt;span class="nx"&gt;_start&lt;/span&gt;

&lt;span class="nx"&gt;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;                          &lt;span class="cm"&gt;/* starting value for the loop index */&lt;/span&gt;
&lt;span class="nx"&gt;max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;33&lt;/span&gt;                         &lt;span class="cm"&gt;/* loop exits when the index hits this number */&lt;/span&gt;

&lt;span class="nl"&gt;_start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;min&lt;/span&gt;            &lt;span class="cm"&gt;/* initialize loop counter */&lt;/span&gt;
&lt;span class="nl"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="cm"&gt;/* Convert loop counter to two hexadecimal digits */&lt;/span&gt;
    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;x22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x19&lt;/span&gt;            &lt;span class="cm"&gt;/* Copy loop counter to x22 */&lt;/span&gt;

    &lt;span class="cm"&gt;/* Calculate high nibble: quotient of division by 16 */&lt;/span&gt;
    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;x23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;            &lt;span class="cm"&gt;/* Set divisor to 16 for hex */&lt;/span&gt;
    &lt;span class="nx"&gt;udiv&lt;/span&gt;    &lt;span class="nx"&gt;x20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x23&lt;/span&gt;       &lt;span class="cm"&gt;/* x20 = x22 / 16 (high nibble) */&lt;/span&gt;

    &lt;span class="cm"&gt;/* Calculate low nibble: remainder of division by 16 */&lt;/span&gt;
    &lt;span class="nx"&gt;mul&lt;/span&gt;     &lt;span class="nx"&gt;x24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x23&lt;/span&gt;       &lt;span class="cm"&gt;/* x24 = high nibble * 16 */&lt;/span&gt;
    &lt;span class="nx"&gt;sub&lt;/span&gt;     &lt;span class="nx"&gt;x21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x24&lt;/span&gt;       &lt;span class="cm"&gt;/* x21 = original - (high nibble * 16) = low nibble */&lt;/span&gt;

    &lt;span class="cm"&gt;/* Convert high nibble to ASCII */&lt;/span&gt;
    &lt;span class="nx"&gt;cmp&lt;/span&gt;     &lt;span class="nx"&gt;x20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;            &lt;span class="cm"&gt;/* Check if high nibble is less than 10 */&lt;/span&gt;
    &lt;span class="nx"&gt;blt&lt;/span&gt;     &lt;span class="nx"&gt;high_digit_decimal&lt;/span&gt;
    &lt;span class="cm"&gt;/* For hex A-F: add 55 (10+55=65 -&amp;gt; 'A') */&lt;/span&gt;
    &lt;span class="nx"&gt;add&lt;/span&gt;     &lt;span class="nx"&gt;x20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;55&lt;/span&gt;       
    &lt;span class="nx"&gt;b&lt;/span&gt;       &lt;span class="nx"&gt;high_digit_done&lt;/span&gt;
&lt;span class="nl"&gt;high_digit_decimal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nx"&gt;add&lt;/span&gt;     &lt;span class="nx"&gt;x20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt;       &lt;span class="cm"&gt;/* For digits 0-9: add 48 ('0') */&lt;/span&gt;
&lt;span class="nl"&gt;high_digit_done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

    &lt;span class="cm"&gt;/* Convert low nibble to ASCII */&lt;/span&gt;
    &lt;span class="nx"&gt;cmp&lt;/span&gt;     &lt;span class="nx"&gt;x21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;            &lt;span class="cm"&gt;/* Check if low nibble is less than 10 */&lt;/span&gt;
    &lt;span class="nx"&gt;blt&lt;/span&gt;     &lt;span class="nx"&gt;low_digit_decimal&lt;/span&gt;
    &lt;span class="cm"&gt;/* For hex A-F */&lt;/span&gt;
    &lt;span class="nx"&gt;add&lt;/span&gt;     &lt;span class="nx"&gt;x21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;55&lt;/span&gt;       
    &lt;span class="nx"&gt;b&lt;/span&gt;       &lt;span class="nx"&gt;low_digit_done&lt;/span&gt;
&lt;span class="nl"&gt;low_digit_decimal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nx"&gt;add&lt;/span&gt;     &lt;span class="nx"&gt;x21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt;       &lt;span class="cm"&gt;/* For digits 0-9 */&lt;/span&gt;
&lt;span class="nl"&gt;low_digit_done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

    &lt;span class="cm"&gt;/* Store the ASCII characters in the message template */&lt;/span&gt;
    &lt;span class="nx"&gt;adr&lt;/span&gt;     &lt;span class="nx"&gt;x24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt;           &lt;span class="cm"&gt;/* Get address of the message template */&lt;/span&gt;
    &lt;span class="nx"&gt;strb&lt;/span&gt;    &lt;span class="nx"&gt;w20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;x24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;      &lt;span class="cm"&gt;/* Store high nibble at position after "Loop: " */&lt;/span&gt;
    &lt;span class="nx"&gt;strb&lt;/span&gt;    &lt;span class="nx"&gt;w21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;x24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;      &lt;span class="cm"&gt;/* Store low nibble */&lt;/span&gt;

    &lt;span class="cm"&gt;/* Print message */&lt;/span&gt;
    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;x24&lt;/span&gt;             &lt;span class="cm"&gt;/* Set message address for print */&lt;/span&gt;
    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;x2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;len&lt;/span&gt;             &lt;span class="cm"&gt;/* Set message length */&lt;/span&gt;
    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&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="cm"&gt;/* file descriptor: 1 is stdout */&lt;/span&gt;
    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&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="cm"&gt;/* write is syscall #64 */&lt;/span&gt;
    &lt;span class="nx"&gt;svc&lt;/span&gt;     &lt;span class="mi"&gt;0&lt;/span&gt;                   &lt;span class="cm"&gt;/* invoke syscall */&lt;/span&gt;

    &lt;span class="nx"&gt;add&lt;/span&gt;     &lt;span class="nx"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&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="cm"&gt;/* increment the loop counter */&lt;/span&gt;
    &lt;span class="nx"&gt;cmp&lt;/span&gt;     &lt;span class="nx"&gt;x19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;max&lt;/span&gt;            &lt;span class="cm"&gt;/* see if we've hit the max */&lt;/span&gt;
    &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ne&lt;/span&gt;    &lt;span class="nx"&gt;loop&lt;/span&gt;                &lt;span class="cm"&gt;/* if not, then continue the loop */&lt;/span&gt;

    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&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="cm"&gt;/* set exit status to 0 */&lt;/span&gt;
    &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&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="cm"&gt;/* exit is syscall #93 */&lt;/span&gt;
    &lt;span class="nx"&gt;svc&lt;/span&gt;     &lt;span class="mi"&gt;0&lt;/span&gt;                   &lt;span class="cm"&gt;/* invoke syscall */&lt;/span&gt;

&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;
&lt;span class="nl"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ascii&lt;/span&gt;      &lt;span class="s2"&gt;"Loop: ##\n"&lt;/span&gt;   &lt;span class="cm"&gt;/* Message format for hexadecimal output */&lt;/span&gt;
&lt;span class="nx"&gt;len&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;   &lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;msg&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[kzaw@aarch64-002 aarch64]$ ./hello
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; Assembly Program
&lt;/h2&gt;

&lt;p&gt;While the overall logic of our loop programs are similar, several key differences set &lt;code&gt;x86_64&lt;/code&gt; apart from &lt;code&gt;AArch64&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Overall Differences
&lt;/h3&gt;

&lt;p&gt;The first difference is in register naming and constants. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Aarch64&lt;/code&gt;: Registers are named as x0, x1, …, and constants are used without a special prefix.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;x86&lt;/code&gt;: Registers have names like %rax, %rdi, %rsi, etc., and constants are prefixed with &lt;code&gt;$&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Memory addressing is also different.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Aarch64&lt;/code&gt;: We use &lt;code&gt;adr&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;x86&lt;/code&gt;: We use the &lt;code&gt;lea&lt;/code&gt; (load effective address) instruction combined with &lt;code&gt;%rip&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Syscall is different.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Aarch64&lt;/code&gt;: The syscall is invoked with &lt;code&gt;svc 0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;x86&lt;/code&gt;: We use the &lt;code&gt;syscall&lt;/code&gt; instruction.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are only other differences in division and arithmetic logic which you will see in the code.&lt;/p&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd ~/spo600/examples/hello/assembler/x86_64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this directory, you'll find two assembly source files: &lt;code&gt;hello-gas.s&lt;/code&gt; using GNU Assembly syntax (GAS) and &lt;code&gt;hello-nasm.s&lt;/code&gt; using the NASM syntax. We'll work with the GAS syntax version since it's more consistent with what we used for AArch64.&lt;/p&gt;

&lt;h3&gt;
  
  
  ☑️ Basic Loop Template
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight actionscript"&gt;&lt;code&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;
 &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;globl&lt;/span&gt;    &lt;span class="nx"&gt;_start&lt;/span&gt;

 &lt;span class="nx"&gt;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;                         &lt;span class="cm"&gt;/* starting value for the loop index */&lt;/span&gt;
 &lt;span class="nx"&gt;max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;                         &lt;span class="cm"&gt;/* loop exits when the index hits this number */&lt;/span&gt;

 &lt;span class="nl"&gt;_start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;$min&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;r15&lt;/span&gt;           &lt;span class="cm"&gt;/* loop index */&lt;/span&gt;

 &lt;span class="nl"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="cm"&gt;/* ... body of the loop ... do something useful here ... */&lt;/span&gt;

     &lt;span class="nx"&gt;inc&lt;/span&gt;     &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;r15&lt;/span&gt;                &lt;span class="cm"&gt;/* increment the loop index */&lt;/span&gt;
     &lt;span class="nx"&gt;cmp&lt;/span&gt;     &lt;span class="nx"&gt;$max&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;r15&lt;/span&gt;           &lt;span class="cm"&gt;/* see if we've hit the max */&lt;/span&gt;
     &lt;span class="nx"&gt;jne&lt;/span&gt;     &lt;span class="nx"&gt;loop&lt;/span&gt;                &lt;span class="cm"&gt;/* if not, then continue the loop */&lt;/span&gt;

     &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;$0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rdi&lt;/span&gt;             &lt;span class="cm"&gt;/* set exit status to 0 */&lt;/span&gt;
     &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;$60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rax&lt;/span&gt;            &lt;span class="cm"&gt;/* exit is syscall #60 */&lt;/span&gt;
     &lt;span class="nx"&gt;syscall&lt;/span&gt;                     &lt;span class="cm"&gt;/* invoke syscall */&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Some differences from AArch64:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The direction in &lt;code&gt;mov&lt;/code&gt; instructions is reversed (destination first)&lt;/li&gt;
&lt;li&gt;We use &lt;code&gt;inc&lt;/code&gt; for incrementing instead of &lt;code&gt;add&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;We use &lt;code&gt;jne&lt;/code&gt; (jump if not equal) instead of &lt;code&gt;b.ne&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ☑️ Print Loop
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight actionscript"&gt;&lt;code&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;
 &lt;span class="nl"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ascii&lt;/span&gt; &lt;span class="s2"&gt;"Loop\n"&lt;/span&gt;
 &lt;span class="nx"&gt;len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;

 &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;
 &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;globl&lt;/span&gt;    &lt;span class="nx"&gt;_start&lt;/span&gt;

 &lt;span class="nx"&gt;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;                         &lt;span class="cm"&gt;/* starting value for the loop index */&lt;/span&gt;
 &lt;span class="nx"&gt;max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;                         &lt;span class="cm"&gt;/* loop exits when the index hits this number */&lt;/span&gt;

 &lt;span class="nl"&gt;_start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;$min&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;r15&lt;/span&gt;           &lt;span class="cm"&gt;/* loop index */&lt;/span&gt;

 &lt;span class="nl"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;$1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rax&lt;/span&gt;   &lt;span class="cm"&gt;/* syscall: write */&lt;/span&gt;
     &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;$1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rdi&lt;/span&gt;   &lt;span class="cm"&gt;/* File descriptor: stdout */&lt;/span&gt;
     &lt;span class="nx"&gt;lea&lt;/span&gt;     &lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rip&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rsi&lt;/span&gt; &lt;span class="cm"&gt;/* Message address */&lt;/span&gt;
     &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;$len&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rdx&lt;/span&gt; &lt;span class="cm"&gt;/* Message length */&lt;/span&gt;
     &lt;span class="nx"&gt;syscall&lt;/span&gt;            &lt;span class="cm"&gt;/* Invoke syscall */&lt;/span&gt;

     &lt;span class="nx"&gt;inc&lt;/span&gt;     &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;r15&lt;/span&gt;                &lt;span class="cm"&gt;/* increment the loop index */&lt;/span&gt;
     &lt;span class="nx"&gt;cmp&lt;/span&gt;     &lt;span class="nx"&gt;$max&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;r15&lt;/span&gt;           &lt;span class="cm"&gt;/* see if we've hit the max */&lt;/span&gt;
     &lt;span class="nx"&gt;jne&lt;/span&gt;     &lt;span class="nx"&gt;loop&lt;/span&gt;                &lt;span class="cm"&gt;/* if not, then continue the loop */&lt;/span&gt;

     &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;$0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rdi&lt;/span&gt;             &lt;span class="cm"&gt;/* set exit status to 0 */&lt;/span&gt;
     &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;$60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rax&lt;/span&gt;            &lt;span class="cm"&gt;/* exit is syscall #60 */&lt;/span&gt;
     &lt;span class="nx"&gt;syscall&lt;/span&gt;                     &lt;span class="cm"&gt;/* invoke syscall */&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;lea&lt;/code&gt; instruction is used to load the address of &lt;code&gt;msg&lt;/code&gt; into the &lt;code&gt;%rsi&lt;/code&gt; register. The (&lt;code&gt;%rip&lt;/code&gt;) part is relative addressing from the current instruction pointer.&lt;/p&gt;

&lt;p&gt;The registers used are different!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;%rax&lt;/code&gt; holds the syscall number (1 for write)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;%rdi&lt;/code&gt; holds the first argument (file descriptor: 1 for stdout)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;%rsi&lt;/code&gt; holds the second argument (message address)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;%rdx&lt;/code&gt; holds the third argument (message length)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you run the code with &lt;code&gt;make&lt;/code&gt; and &lt;code&gt;./hello-gas&lt;/code&gt;, you should see it printing Loop 6 times as intended.&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%2Flpiznhime3uiboja3l1b.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%2Flpiznhime3uiboja3l1b.png" alt="Test" width="800" height="154"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ☑️ Print Loop and Index Number
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight actionscript"&gt;&lt;code&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;
 &lt;span class="nl"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ascii&lt;/span&gt; &lt;span class="s2"&gt;"Loop   \n"&lt;/span&gt;
 &lt;span class="nx"&gt;len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;

 &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;
 &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;globl&lt;/span&gt;    &lt;span class="nx"&gt;_start&lt;/span&gt;

 &lt;span class="nx"&gt;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;                         &lt;span class="cm"&gt;/* starting value for the loop index */&lt;/span&gt;
 &lt;span class="nx"&gt;max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;                         &lt;span class="cm"&gt;/* loop exits when the index hits this number */&lt;/span&gt;

 &lt;span class="nl"&gt;_start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;$min&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;r15&lt;/span&gt;           &lt;span class="cm"&gt;/* loop index */&lt;/span&gt;

 &lt;span class="nl"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="nx"&gt;mov&lt;/span&gt;        &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;r15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rax&lt;/span&gt;
     &lt;span class="nx"&gt;mov&lt;/span&gt;        &lt;span class="nx"&gt;$10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;r10&lt;/span&gt;
     &lt;span class="nx"&gt;xor&lt;/span&gt;        &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rdx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rdx&lt;/span&gt;
     &lt;span class="nx"&gt;div&lt;/span&gt;        &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;r10&lt;/span&gt;            &lt;span class="cm"&gt;/* quotient is stored in %rax, remainder in %rdx */&lt;/span&gt;

     &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;Convert&lt;/span&gt; &lt;span class="nx"&gt;digits&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;ASCII&lt;/span&gt;
     &lt;span class="nx"&gt;add&lt;/span&gt;     &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="s1"&gt;'0'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;al&lt;/span&gt;
     &lt;span class="nx"&gt;add&lt;/span&gt;     &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="s1"&gt;'0'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;dl&lt;/span&gt;

     &lt;span class="nx"&gt;lea&lt;/span&gt;        &lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rip&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rsi&lt;/span&gt; &lt;span class="cm"&gt;/* Message address */&lt;/span&gt;
     &lt;span class="nx"&gt;movb&lt;/span&gt;    &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;al&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rsi&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="cm"&gt;/* Store tens digit in the 6th position of msg */&lt;/span&gt;
     &lt;span class="nx"&gt;movb&lt;/span&gt;    &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;dl&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="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rsi&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;    &lt;span class="cm"&gt;/* Store units digit in the 7th position of msg */&lt;/span&gt;

     &lt;span class="nx"&gt;mov&lt;/span&gt;        &lt;span class="nx"&gt;$1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rax&lt;/span&gt;   &lt;span class="cm"&gt;/* syscall: write */&lt;/span&gt;
     &lt;span class="nx"&gt;mov&lt;/span&gt;        &lt;span class="nx"&gt;$1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rdi&lt;/span&gt;   &lt;span class="cm"&gt;/* File descriptor: stdout */&lt;/span&gt;
     &lt;span class="nx"&gt;mov&lt;/span&gt;        &lt;span class="nx"&gt;$len&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rdx&lt;/span&gt; &lt;span class="cm"&gt;/* Message length */&lt;/span&gt;
     &lt;span class="nx"&gt;syscall&lt;/span&gt;            &lt;span class="cm"&gt;/* Invoke syscall */&lt;/span&gt;

     &lt;span class="nx"&gt;inc&lt;/span&gt;     &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;r15&lt;/span&gt;                &lt;span class="cm"&gt;/* increment the loop index */&lt;/span&gt;
     &lt;span class="nx"&gt;cmp&lt;/span&gt;     &lt;span class="nx"&gt;$max&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;r15&lt;/span&gt;           &lt;span class="cm"&gt;/* see if we've hit the max */&lt;/span&gt;
     &lt;span class="nx"&gt;jne&lt;/span&gt;     &lt;span class="nx"&gt;loop&lt;/span&gt;                &lt;span class="cm"&gt;/* if not, then continue the loop */&lt;/span&gt;

     &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;$0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rdi&lt;/span&gt;             &lt;span class="cm"&gt;/* set exit status to 0 */&lt;/span&gt;
     &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;$60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rax&lt;/span&gt;            &lt;span class="cm"&gt;/* exit is syscall #60 */&lt;/span&gt;
     &lt;span class="nx"&gt;syscall&lt;/span&gt;                     &lt;span class="cm"&gt;/* invoke syscall */&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here we're using different instructions for arithmetic:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We first copy the loop counter from &lt;code&gt;%r15&lt;/code&gt; to &lt;code&gt;%rax&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;xor %rdx, %rdx&lt;/code&gt; instruction clears the &lt;code&gt;%rdx&lt;/code&gt; register &lt;/li&gt;
&lt;li&gt;The &lt;code&gt;div %r10&lt;/code&gt; instruction divides the combined 128-bit value in &lt;code&gt;%rdx:%rax&lt;/code&gt; by the value in &lt;code&gt;%r10&lt;/code&gt; (which is 10)&lt;/li&gt;
&lt;li&gt;After division, &lt;code&gt;%rax&lt;/code&gt; contains the quotient and &lt;code&gt;%rdx&lt;/code&gt; contains the remainder&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;%al&lt;/code&gt; refers to the lower 8 bits of &lt;code&gt;%rax&lt;/code&gt;, and &lt;code&gt;%dl&lt;/code&gt; refers to the lower 8 bits of &lt;code&gt;%rdx&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;movb&lt;/code&gt; instruction moves a single byte to memory&lt;/li&gt;
&lt;/ul&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%2Fczpw6g3xlh3dtqmct4p3.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%2Fczpw6g3xlh3dtqmct4p3.png" alt="Test" width="800" height="172"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ☑️ Loop From 00 - 32
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight actionscript"&gt;&lt;code&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;
 &lt;span class="nl"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ascii&lt;/span&gt; &lt;span class="s2"&gt;"Loop   \n"&lt;/span&gt;
 &lt;span class="nx"&gt;len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;

 &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;
 &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;globl&lt;/span&gt;    &lt;span class="nx"&gt;_start&lt;/span&gt;

 &lt;span class="nx"&gt;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;                         &lt;span class="cm"&gt;/* starting value for the loop index */&lt;/span&gt;
 &lt;span class="nx"&gt;max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;33&lt;/span&gt;                        &lt;span class="cm"&gt;/* loop exits when the index hits this number */&lt;/span&gt;

 &lt;span class="nl"&gt;_start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;$min&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;r15&lt;/span&gt;           &lt;span class="cm"&gt;/* loop index */&lt;/span&gt;

 &lt;span class="nl"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="nx"&gt;mov&lt;/span&gt;        &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;r15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rax&lt;/span&gt;
     &lt;span class="nx"&gt;mov&lt;/span&gt;        &lt;span class="nx"&gt;$10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;r10&lt;/span&gt;
     &lt;span class="nx"&gt;xor&lt;/span&gt;        &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rdx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rdx&lt;/span&gt;
     &lt;span class="nx"&gt;div&lt;/span&gt;        &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;r10&lt;/span&gt;            &lt;span class="cm"&gt;/* quotient is stored in %rax, remainder in %rdx */&lt;/span&gt;

     &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;Convert&lt;/span&gt; &lt;span class="nx"&gt;digits&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;ASCII&lt;/span&gt;
     &lt;span class="nx"&gt;add&lt;/span&gt;     &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="s1"&gt;'0'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;al&lt;/span&gt;
     &lt;span class="nx"&gt;add&lt;/span&gt;     &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="s1"&gt;'0'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;dl&lt;/span&gt;

     &lt;span class="nx"&gt;lea&lt;/span&gt;        &lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rip&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rsi&lt;/span&gt; &lt;span class="cm"&gt;/* Message address */&lt;/span&gt;
     &lt;span class="nx"&gt;movb&lt;/span&gt;    &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;al&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rsi&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="cm"&gt;/* Store tens digit in the 6th position of msg */&lt;/span&gt;
     &lt;span class="nx"&gt;movb&lt;/span&gt;    &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;dl&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="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rsi&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;    &lt;span class="cm"&gt;/* Store units digit in the 7th position of msg */&lt;/span&gt;

     &lt;span class="nx"&gt;mov&lt;/span&gt;        &lt;span class="nx"&gt;$1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rax&lt;/span&gt;   &lt;span class="cm"&gt;/* syscall: write */&lt;/span&gt;
     &lt;span class="nx"&gt;mov&lt;/span&gt;        &lt;span class="nx"&gt;$1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rdi&lt;/span&gt;   &lt;span class="cm"&gt;/* File descriptor: stdout */&lt;/span&gt;
     &lt;span class="nx"&gt;mov&lt;/span&gt;        &lt;span class="nx"&gt;$len&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rdx&lt;/span&gt; &lt;span class="cm"&gt;/* Message length */&lt;/span&gt;
     &lt;span class="nx"&gt;syscall&lt;/span&gt;            &lt;span class="cm"&gt;/* Invoke syscall */&lt;/span&gt;

     &lt;span class="nx"&gt;inc&lt;/span&gt;     &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;r15&lt;/span&gt;                &lt;span class="cm"&gt;/* increment the loop index */&lt;/span&gt;
     &lt;span class="nx"&gt;cmp&lt;/span&gt;     &lt;span class="nx"&gt;$max&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;r15&lt;/span&gt;           &lt;span class="cm"&gt;/* see if we've hit the max */&lt;/span&gt;
     &lt;span class="nx"&gt;jne&lt;/span&gt;     &lt;span class="nx"&gt;loop&lt;/span&gt;                &lt;span class="cm"&gt;/* if not, then continue the loop */&lt;/span&gt;

     &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;$0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rdi&lt;/span&gt;             &lt;span class="cm"&gt;/* set exit status to 0 */&lt;/span&gt;
     &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;$60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rax&lt;/span&gt;            &lt;span class="cm"&gt;/* exit is syscall #60 */&lt;/span&gt;
     &lt;span class="nx"&gt;syscall&lt;/span&gt;                     &lt;span class="cm"&gt;/* invoke syscall */&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The only change here is to set &lt;code&gt;max = 33&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%2Fh6u2pism60f4wtiq8cti.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%2Fh6u2pism60f4wtiq8cti.png" alt="Test" width="800" height="769"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ☑️ Loop Without Trailing Zeros
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight actionscript"&gt;&lt;code&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;
 &lt;span class="nl"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ascii&lt;/span&gt; &lt;span class="s2"&gt;"Loop   \n"&lt;/span&gt;
 &lt;span class="nx"&gt;len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;

 &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;
 &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;globl&lt;/span&gt;    &lt;span class="nx"&gt;_start&lt;/span&gt;

 &lt;span class="nx"&gt;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;                         &lt;span class="cm"&gt;/* starting value for the loop index */&lt;/span&gt;
 &lt;span class="nx"&gt;max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;33&lt;/span&gt;                        &lt;span class="cm"&gt;/* loop exits when the index hits this number */&lt;/span&gt;

 &lt;span class="nl"&gt;_start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;$min&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;r15&lt;/span&gt;           &lt;span class="cm"&gt;/* loop index */&lt;/span&gt;

 &lt;span class="nl"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="nx"&gt;mov&lt;/span&gt;        &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;r15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rax&lt;/span&gt;
     &lt;span class="nx"&gt;mov&lt;/span&gt;        &lt;span class="nx"&gt;$10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;r10&lt;/span&gt;
     &lt;span class="nx"&gt;xor&lt;/span&gt;        &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rdx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rdx&lt;/span&gt;
     &lt;span class="nx"&gt;div&lt;/span&gt;        &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;r10&lt;/span&gt;            &lt;span class="cm"&gt;/* quotient is stored in %rax, remainder in %rdx */&lt;/span&gt;

     &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="nx"&gt;Convert&lt;/span&gt; &lt;span class="nx"&gt;digits&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;ASCII&lt;/span&gt;
     &lt;span class="nx"&gt;add&lt;/span&gt;        &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="s1"&gt;'0'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;al&lt;/span&gt;
     &lt;span class="nx"&gt;add&lt;/span&gt;        &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="s1"&gt;'0'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;dl&lt;/span&gt;

     &lt;span class="nx"&gt;cmp&lt;/span&gt;        &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="s1"&gt;'0'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;al&lt;/span&gt;
     &lt;span class="nx"&gt;lea&lt;/span&gt;        &lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rip&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rsi&lt;/span&gt; &lt;span class="cm"&gt;/* Message address */&lt;/span&gt;
     &lt;span class="nx"&gt;je&lt;/span&gt;         &lt;span class="nx"&gt;single_digit&lt;/span&gt;

     &lt;span class="nx"&gt;movb&lt;/span&gt;       &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;al&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rsi&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="cm"&gt;/* Store tens digit in the 6th position of msg */&lt;/span&gt;
     &lt;span class="nx"&gt;movb&lt;/span&gt;       &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;dl&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="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rsi&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;    &lt;span class="cm"&gt;/* Store units digit in the 7th position of msg */&lt;/span&gt;
     &lt;span class="nx"&gt;jmp&lt;/span&gt;        &lt;span class="nx"&gt;print&lt;/span&gt;

&lt;span class="nl"&gt;single_digit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="nx"&gt;movb&lt;/span&gt;       &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;dl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rsi&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="cm"&gt;/* Store units digit in the 6th position of msg */&lt;/span&gt;
     &lt;span class="nx"&gt;movb&lt;/span&gt;       &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="s1"&gt;' '&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="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rsi&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;    &lt;span class="cm"&gt;/* Store space in the 7th position of msg */&lt;/span&gt;

&lt;span class="nl"&gt;print&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="nx"&gt;mov&lt;/span&gt;        &lt;span class="nx"&gt;$1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rax&lt;/span&gt;   &lt;span class="cm"&gt;/* syscall: write */&lt;/span&gt;
     &lt;span class="nx"&gt;mov&lt;/span&gt;        &lt;span class="nx"&gt;$1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rdi&lt;/span&gt;   &lt;span class="cm"&gt;/* File descriptor: stdout */&lt;/span&gt;
     &lt;span class="nx"&gt;mov&lt;/span&gt;        &lt;span class="nx"&gt;$len&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rdx&lt;/span&gt; &lt;span class="cm"&gt;/* Message length */&lt;/span&gt;
     &lt;span class="nx"&gt;syscall&lt;/span&gt;            &lt;span class="cm"&gt;/* Invoke syscall */&lt;/span&gt;

     &lt;span class="nx"&gt;inc&lt;/span&gt;     &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;r15&lt;/span&gt;                &lt;span class="cm"&gt;/* increment the loop index */&lt;/span&gt;
     &lt;span class="nx"&gt;cmp&lt;/span&gt;     &lt;span class="nx"&gt;$max&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;r15&lt;/span&gt;           &lt;span class="cm"&gt;/* see if we've hit the max */&lt;/span&gt;
     &lt;span class="nx"&gt;jne&lt;/span&gt;     &lt;span class="nx"&gt;loop&lt;/span&gt;                &lt;span class="cm"&gt;/* if not, then continue the loop */&lt;/span&gt;

     &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;$0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rdi&lt;/span&gt;             &lt;span class="cm"&gt;/* set exit status to 0 */&lt;/span&gt;
     &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;$60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rax&lt;/span&gt;            &lt;span class="cm"&gt;/* exit is syscall #60 */&lt;/span&gt;
     &lt;span class="nx"&gt;syscall&lt;/span&gt;                     &lt;span class="cm"&gt;/* invoke syscall */&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Key changes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We compare the tens digit (&lt;code&gt;%al&lt;/code&gt;) with ASCII '0'&lt;/li&gt;
&lt;li&gt;If equal (&lt;code&gt;je&lt;/code&gt;), we jump to the &lt;code&gt;single_digit&lt;/code&gt; label&lt;/li&gt;
&lt;li&gt;For single-digit numbers, we display only the ones digit followed by a space&lt;/li&gt;
&lt;li&gt;We use &lt;code&gt;jmp print&lt;/code&gt; to skip the single-digit handling code for two-digit numbers&lt;/li&gt;
&lt;/ul&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%2Fngjnpv4je7cx87wee39j.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%2Fngjnpv4je7cx87wee39j.png" alt="Test" width="800" height="768"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ☑️ Loop with Hex Output (0 - 20)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight actionscript"&gt;&lt;code&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;
 &lt;span class="nl"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ascii&lt;/span&gt; &lt;span class="s2"&gt;"Loop   \n"&lt;/span&gt;
 &lt;span class="nx"&gt;len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;

 &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;
 &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;globl&lt;/span&gt;    &lt;span class="nx"&gt;_start&lt;/span&gt;

 &lt;span class="nx"&gt;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;                         &lt;span class="cm"&gt;/* starting value for the loop index */&lt;/span&gt;
 &lt;span class="nx"&gt;max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mh"&gt;0x21&lt;/span&gt;                      &lt;span class="cm"&gt;/* loop exits when the index hits this number */&lt;/span&gt;

 &lt;span class="nl"&gt;_start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;$min&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;r15&lt;/span&gt;           &lt;span class="cm"&gt;/* loop index */&lt;/span&gt;

 &lt;span class="nl"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="nx"&gt;mov&lt;/span&gt;        &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;r15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rax&lt;/span&gt;
     &lt;span class="nx"&gt;mov&lt;/span&gt;        &lt;span class="nx"&gt;$16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;r10&lt;/span&gt;
     &lt;span class="nx"&gt;xor&lt;/span&gt;        &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rdx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rdx&lt;/span&gt;
     &lt;span class="nx"&gt;div&lt;/span&gt;        &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;r10&lt;/span&gt;            &lt;span class="cm"&gt;/* quotient is stored in %rax, remainder in %rdx */&lt;/span&gt;

     &lt;span class="nx"&gt;cmp&lt;/span&gt;        &lt;span class="nx"&gt;$9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;al&lt;/span&gt;
     &lt;span class="nx"&gt;jg&lt;/span&gt;         &lt;span class="nx"&gt;convert_letter_l&lt;/span&gt;
     &lt;span class="nx"&gt;add&lt;/span&gt;        &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="s1"&gt;'0'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;al&lt;/span&gt;
     &lt;span class="nx"&gt;jmp&lt;/span&gt;        &lt;span class="nx"&gt;right_digit&lt;/span&gt;

&lt;span class="nl"&gt;convert_letter_l&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="nx"&gt;sub&lt;/span&gt;        &lt;span class="nx"&gt;$10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;al&lt;/span&gt;
     &lt;span class="nx"&gt;add&lt;/span&gt;        &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="s1"&gt;'A'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;al&lt;/span&gt;

&lt;span class="nl"&gt;right_digit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="nx"&gt;cmp&lt;/span&gt;        &lt;span class="nx"&gt;$9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;dl&lt;/span&gt;
     &lt;span class="nx"&gt;jg&lt;/span&gt;         &lt;span class="nx"&gt;convert_letter_r&lt;/span&gt;
     &lt;span class="nx"&gt;add&lt;/span&gt;        &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="s1"&gt;'0'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;dl&lt;/span&gt;
     &lt;span class="nx"&gt;jmp&lt;/span&gt;        &lt;span class="nx"&gt;store_num&lt;/span&gt;

&lt;span class="nl"&gt;convert_letter_r&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="nx"&gt;sub&lt;/span&gt;        &lt;span class="nx"&gt;$10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;dl&lt;/span&gt;
     &lt;span class="nx"&gt;add&lt;/span&gt;        &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="s1"&gt;'A'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;dl&lt;/span&gt;

&lt;span class="nl"&gt;store_num&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="nx"&gt;lea&lt;/span&gt;     &lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rip&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rsi&lt;/span&gt;
     &lt;span class="nx"&gt;movb&lt;/span&gt;    &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;al&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rsi&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
     &lt;span class="nx"&gt;movb&lt;/span&gt;    &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;dl&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="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rsi&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nl"&gt;print&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="nx"&gt;mov&lt;/span&gt;        &lt;span class="nx"&gt;$1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rax&lt;/span&gt;   &lt;span class="cm"&gt;/* syscall: write */&lt;/span&gt;
     &lt;span class="nx"&gt;mov&lt;/span&gt;        &lt;span class="nx"&gt;$1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rdi&lt;/span&gt;   &lt;span class="cm"&gt;/* File descriptor: stdout */&lt;/span&gt;
     &lt;span class="nx"&gt;mov&lt;/span&gt;        &lt;span class="nx"&gt;$len&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rdx&lt;/span&gt; &lt;span class="cm"&gt;/* Message length */&lt;/span&gt;
     &lt;span class="nx"&gt;syscall&lt;/span&gt;            &lt;span class="cm"&gt;/* Invoke syscall */&lt;/span&gt;

     &lt;span class="nx"&gt;inc&lt;/span&gt;     &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;r15&lt;/span&gt;                &lt;span class="cm"&gt;/* increment the loop index */&lt;/span&gt;
     &lt;span class="nx"&gt;cmp&lt;/span&gt;     &lt;span class="nx"&gt;$max&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;r15&lt;/span&gt;           &lt;span class="cm"&gt;/* see if we've hit the max */&lt;/span&gt;
     &lt;span class="nx"&gt;jne&lt;/span&gt;     &lt;span class="nx"&gt;loop&lt;/span&gt;                &lt;span class="cm"&gt;/* if not, then continue the loop */&lt;/span&gt;

     &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;$0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rdi&lt;/span&gt;             &lt;span class="cm"&gt;/* set exit status to 0 */&lt;/span&gt;
     &lt;span class="nx"&gt;mov&lt;/span&gt;     &lt;span class="nx"&gt;$60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;rax&lt;/span&gt;            &lt;span class="cm"&gt;/* exit is syscall #60 */&lt;/span&gt;
     &lt;span class="nx"&gt;syscall&lt;/span&gt;                     &lt;span class="cm"&gt;/* invoke syscall */&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%2Fg358h4goxnya7a63jxv7.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%2Fg358h4goxnya7a63jxv7.png" alt="Test" width="800" height="764"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;This lab helped me understand and code more in modern assembly language.  I got used to multiple logic concepts from memory manipulation, loops to character encoding! This helped me solidify my understanding.&lt;/p&gt;

&lt;p&gt;One major takeaway is how explicit everything is in assembly. Every character printed and every loop iteration must be carefully crafted. I became fully aware that this is the low-level assembly and there is not BTS. I had to manage my own memory locations and be cautious with my index counters. It is far more low level than C!&lt;/p&gt;

&lt;p&gt;Thank you for your time. See you soon! 😄&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
