<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Asm on Jiho Kim</title><link>https://blog.wlgh7407.com/tags/asm/</link><description>Recent content in Asm on Jiho Kim</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Tue, 31 Mar 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.wlgh7407.com/tags/asm/index.xml" rel="self" type="application/rss+xml"/><item><title>CSAPP Architecture Lab</title><link>https://blog.wlgh7407.com/posts/books/csapp/chapter-04-processor-architecture/260331_til_csapp-architecture-lab/</link><pubDate>Tue, 31 Mar 2026 00:00:00 +0000</pubDate><guid>https://blog.wlgh7407.com/posts/books/csapp/chapter-04-processor-architecture/260331_til_csapp-architecture-lab/</guid><description>&lt;h2 id="-상세-정리"&gt;&lt;a href="#-%ec%83%81%ec%84%b8-%ec%a0%95%eb%a6%ac" class="header-anchor"&gt;&lt;/a&gt;📝 상세 정리
&lt;/h2&gt;&lt;h3 id="part-a"&gt;&lt;a href="#part-a" class="header-anchor"&gt;&lt;/a&gt;Part A
&lt;/h3&gt;&lt;h4 id="sumys"&gt;&lt;a href="#sumys" class="header-anchor"&gt;&lt;/a&gt;sum.ys
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Y86_64 문법으로 연결리스트의 원소들을 더하는 C 코드를 바꾸자.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;.pos 0
 irmovq stack, %rsp
 call main
 halt

.align 8
ele1:
 .quad 0x00a
 .quad ele2
ele2:
 .quad 0x0b0
 .quad ele3
ele3:
 .quad 0xc00
 .quad 0

main:
 irmovq ele1, %rdi
 call sum_list
 ret

sum_list:
 irmovq $0, %rax
sum_list_while:
 andq %rdi, %rdi
 je sum_list_while_end
 mrmovq (%rdi), %rbx
 addq %rbx, %rax
 mrmovq 8(%rdi), %rdi
 jmp sum_list_while
sum_list_while_end:
 ret

.pos 0x200
stack:
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="rsumys"&gt;&lt;a href="#rsumys" class="header-anchor"&gt;&lt;/a&gt;rsum.ys
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;sum.ys와 같지만, 재귀함수로 구성하자.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;.pos 0
 irmovq stack, %rsp
 call main
 halt

.align 8
ele1:
 .quad 0x00a
 .quad ele2
ele2:
 .quad 0x0b0
 .quad ele3
ele3:
 .quad 0xc00
 .quad 0

main:
 irmovq ele1, %rdi
 call rsum_list
 ret

rsum_list:
 andq %rdi, %rdi
 jne rsum_list_func
 irmovq $0, %rax
 ret
rsum_list_func:
 pushq %rbx
 mrmovq (%rdi), %rbx
 mrmovq 8(%rdi), %rdi
 call rsum_list
 addq %rbx, %rax
 popq %rbx
 ret

.pos 0x200
stack:
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="copyys"&gt;&lt;a href="#copyys" class="header-anchor"&gt;&lt;/a&gt;copy.ys
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;이번엔 source 블럭에서 destination 블럭으로 값을 복사하는걸 수행하자&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;.pos 0
 irmovq stack, %rsp
 call main
 halt

.align 8
src:
 .quad 0x00a
 .quad 0x0b0
 .quad 0xc00
dest:
 .quad 0x111
 .quad 0x222
 .quad 0x333

main:
 irmovq src, %rdi
 irmovq dest, %rsi
 irmovq $3, %rdx
 call copy_block
 ret

copy_block:
 xorq %rax, %rax // result = 0
copy_block_while:
 andq %rdx, %rdx
 je copy_block_end
 irmovq $8, %rcx
 mrmovq (%rdi), %rbx // val = *src
 addq %rcx, %rdi // src++
 rmmovq %rbx, (%rsi) // *dest = val
 addq %rcx, %rsi // dest++
 xorq %rbx, %rax // result ^= val
 irmovq $1, %rbx
 subq %rbx, %rdx
 jmp copy_block_while
copy_block_end:
 ret

.pos 0x200
stack:
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="part-b"&gt;&lt;a href="#part-b" class="header-anchor"&gt;&lt;/a&gt;Part B
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;SEQ 프로세서 (seq-full.hcl)에 iaddq 명령어를 추가하자.&lt;/li&gt;
&lt;li&gt;Fetch / Decode / Execute / Mmory / Write-back를 잘 처리해야겠네&amp;hellip;
&lt;ul&gt;
&lt;li&gt;천천히 해보자&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="fetch"&gt;&lt;a href="#fetch" class="header-anchor"&gt;&lt;/a&gt;Fetch
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;################ Fetch Stage ###################################
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Determine instruction code
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;word icode &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;imem_error&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;INOP&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;imem_icode&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;;&lt;/span&gt;&lt;span style="color:#75715e"&gt;		# Default: get from instruction memory
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;]&lt;span style="color:#960050;background-color:#1e0010"&gt;;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Determine instruction function
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;word ifun &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;imem_error&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;FNONE&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;imem_ifun&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;;&lt;/span&gt;&lt;span style="color:#75715e"&gt;		# Default: get from instruction memory
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;]&lt;span style="color:#960050;background-color:#1e0010"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;bool instr_valid &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;icode&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	{ &lt;span style="color:#66d9ef"&gt;INOP&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;IHALT&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;IRRMOVQ&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;IIRMOVQ&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;IRMMOVQ&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;IMRMOVQ&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	 &lt;span style="color:#66d9ef"&gt;IOPQ&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;IJXX&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;ICALL&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;IRET&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;IPUSHQ&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;IPOPQ&lt;/span&gt; }&lt;span style="color:#960050;background-color:#1e0010"&gt;;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Does fetched instruction require a regid byte?
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;bool need_regids &lt;span style="color:#f92672"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;icode&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; { &lt;span style="color:#66d9ef"&gt;IRRMOVQ&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;IOPQ&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;IPUSHQ&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;IPOPQ&lt;/span&gt;, 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		 &lt;span style="color:#66d9ef"&gt;IIRMOVQ&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;IRMMOVQ&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;IMRMOVQ&lt;/span&gt; }&lt;span style="color:#960050;background-color:#1e0010"&gt;;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Does fetched instruction require a constant word?
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;bool need_valC &lt;span style="color:#f92672"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;icode&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; { &lt;span style="color:#66d9ef"&gt;IIRMOVQ&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;IRMMOVQ&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;IMRMOVQ&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;IJXX&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;ICALL&lt;/span&gt; }&lt;span style="color:#960050;background-color:#1e0010"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;iaddq를 뭐가 필요할까?&lt;/li&gt;
&lt;li&gt;일단 icode, ifun 은 물론 잘 있다고 생각하고, 아래를 생각해보자.&lt;/li&gt;
&lt;li&gt;instr_valid를 true로 만들기 위해 저기에다가 IIADDQ를 추가하고,&lt;/li&gt;
&lt;li&gt;레지스터가 필요한가? 아무래도 레지스터에 더해야한다.&lt;/li&gt;
&lt;li&gt;val_C도 필요한가? 아무래도 상수값을 더하려면 필요하다. 다 추가해주자.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="decode"&gt;&lt;a href="#decode" class="header-anchor"&gt;&lt;/a&gt;Decode
&lt;/h4&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;################ Decode Stage ###################################

## What register should be used as the A source?
word srcA = [
	icode in { IRRMOVQ, IRMMOVQ, IOPQ, IPUSHQ } : rA;
	icode in { IPOPQ, IRET } : RRSP;
	1 : RNONE; # Don&amp;#39;t need register
];

## What register should be used as the B source?
word srcB = [
	icode in { IOPQ, IRMMOVQ, IMRMOVQ } : rB;
	icode in { IPUSHQ, IPOPQ, ICALL, IRET } : RRSP;
	1 : RNONE; # Don&amp;#39;t need register
];

## What register should be used as the E destination?
word dstE = [
	icode in { IRRMOVQ } &amp;amp;&amp;amp; Cnd : rB;
	icode in { IIRMOVQ, IOPQ} : rB;
	icode in { IPUSHQ, IPOPQ, ICALL, IRET } : RRSP;
	1 : RNONE; # Don&amp;#39;t write any register
];

## What register should be used as the M destination?
word dstM = [
	icode in { IMRMOVQ, IPOPQ } : rA;
	1 : RNONE; # Don&amp;#39;t write any register
];
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;srcA, srcB, dstE, dstM중에선 뭐가 필요할까?&lt;/li&gt;
&lt;li&gt;아무래도 가져올필요 없으니 srcA, srcB는 필요 없는거같고, dst만 있으면 될것같다.
&lt;ul&gt;
&lt;li&gt;아니지, srcB에다가 더해야하는거니까 srcB도 가져와야한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;메모리에서 긁어온게 아니라 Execute에서 얻을 수 있는 값이니, dstE에 추가하면 되겠다.
&lt;ul&gt;
&lt;li&gt;근데 Cnd는 뭐지? condition중에 하나인거같은데, 일단 무조건 rB는 되어야하니 두번째줄에 넣자.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="execute"&gt;&lt;a href="#execute" class="header-anchor"&gt;&lt;/a&gt;Execute
&lt;/h4&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;################ Execute Stage ###################################

## Select input A to ALU
word aluA = [
	icode in { IRRMOVQ, IOPQ } : valA;
	icode in { IIRMOVQ, IRMMOVQ, IMRMOVQ } : valC;
	icode in { ICALL, IPUSHQ } : -8;
	icode in { IRET, IPOPQ } : 8;
	# Other instructions don&amp;#39;t need ALU
];

## Select input B to ALU
word aluB = [
	icode in { IRMMOVQ, IMRMOVQ, IOPQ, ICALL, 
		 IPUSHQ, IRET, IPOPQ } : valB;
	icode in { IRRMOVQ, IIRMOVQ } : 0;
	# Other instructions don&amp;#39;t need ALU
];

## Set the ALU function
word alufun = [
	icode == IOPQ : ifun;
	1 : ALUADD;
];

## Should the condition codes be updated?
bool set_cc = icode in { IOPQ };
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;계산이랑 조건비트 설정까지 다 해야하는 Execute 단계이다.&lt;/li&gt;
&lt;li&gt;aluA에 valC를, aluB에 valB를 넣어야겠지?&lt;/li&gt;
&lt;li&gt;alufun은 아니고, setcc는 켜야겠다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="memory"&gt;&lt;a href="#memory" class="header-anchor"&gt;&lt;/a&gt;Memory
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;여기선 뭐 할게 없죠 메모리에 접근을 안하는디&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="write-back"&gt;&lt;a href="#write-back" class="header-anchor"&gt;&lt;/a&gt;Write back
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;에? 원본 코드에는 여기가 없다. 알아서 되는 영역인듯?&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="program-counter-update"&gt;&lt;a href="#program-counter-update" class="header-anchor"&gt;&lt;/a&gt;Program Counter Update
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;이것도 자연스럽게 처리되어있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="test"&gt;&lt;a href="#test" class="header-anchor"&gt;&lt;/a&gt;Test
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;위의것들을 추가하면 간단하게 완료된다! 생각보다 쉽네&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Y86-64 Processor: seq-full.hcl
137 bytes of code read
IF: Fetched irmovq at 0x0. ra=----, rb=%rsp, valC = 0x100
IF: Fetched call at 0xa. ra=----, rb=----, valC = 0x38
Wrote 0x13 to address 0xf8
IF: Fetched irmovq at 0x38. ra=----, rb=%rdi, valC = 0x18
IF: Fetched irmovq at 0x42. ra=----, rb=%rsi, valC = 0x4
IF: Fetched call at 0x4c. ra=----, rb=----, valC = 0x56
Wrote 0x55 to address 0xf0
IF: Fetched xorq at 0x56. ra=%rax, rb=%rax, valC = 0x0
IF: Fetched andq at 0x58. ra=%rsi, rb=%rsi, valC = 0x0
IF: Fetched jmp at 0x5a. ra=----, rb=----, valC = 0x83
IF: Fetched jne at 0x83. ra=----, rb=----, valC = 0x63
IF: Fetched mrmovq at 0x63. ra=%r10, rb=%rdi, valC = 0x0
IF: Fetched addq at 0x6d. ra=%r10, rb=%rax, valC = 0x0
IF: Fetched iaddq at 0x6f. ra=----, rb=%rdi, valC = 0x8
IF: Fetched iaddq at 0x79. ra=----, rb=%rsi, valC = 0xffffffffffffffff
IF: Fetched jne at 0x83. ra=----, rb=----, valC = 0x63
IF: Fetched mrmovq at 0x63. ra=%r10, rb=%rdi, valC = 0x0
IF: Fetched addq at 0x6d. ra=%r10, rb=%rax, valC = 0x0
IF: Fetched iaddq at 0x6f. ra=----, rb=%rdi, valC = 0x8
IF: Fetched iaddq at 0x79. ra=----, rb=%rsi, valC = 0xffffffffffffffff
IF: Fetched jne at 0x83. ra=----, rb=----, valC = 0x63
IF: Fetched mrmovq at 0x63. ra=%r10, rb=%rdi, valC = 0x0
IF: Fetched addq at 0x6d. ra=%r10, rb=%rax, valC = 0x0
IF: Fetched iaddq at 0x6f. ra=----, rb=%rdi, valC = 0x8
IF: Fetched iaddq at 0x79. ra=----, rb=%rsi, valC = 0xffffffffffffffff
IF: Fetched jne at 0x83. ra=----, rb=----, valC = 0x63
IF: Fetched mrmovq at 0x63. ra=%r10, rb=%rdi, valC = 0x0
IF: Fetched addq at 0x6d. ra=%r10, rb=%rax, valC = 0x0
IF: Fetched iaddq at 0x6f. ra=----, rb=%rdi, valC = 0x8
IF: Fetched iaddq at 0x79. ra=----, rb=%rsi, valC = 0xffffffffffffffff
IF: Fetched jne at 0x83. ra=----, rb=----, valC = 0x63
IF: Fetched ret at 0x8c. ra=----, rb=----, valC = 0x0
IF: Fetched ret at 0x55. ra=----, rb=----, valC = 0x0
IF: Fetched halt at 0x13. ra=----, rb=----, valC = 0x0
32 instructions executed
Status = HLT
Condition Codes: Z=1 S=0 O=0
Changed Register State:
%rax: 0x0000000000000000 0x0000abcdabcdabcd
%rsp: 0x0000000000000000 0x0000000000000100
%rdi: 0x0000000000000000 0x0000000000000038
%r10: 0x0000000000000000 0x0000a000a000a000
Changed Memory State:
0x00f0: 0x0000000000000000 0x0000000000000055
0x00f8: 0x0000000000000000 0x0000000000000013
ISA Check Succeeds

./optest.pl -s ../seq/ssim -i
Simulating with ../seq/ssim
 All 58 ISA Checks Succeed
./jtest.pl -s ../seq/ssim -i
Simulating with ../seq/ssim
 All 96 ISA Checks Succeed
./ctest.pl -s ../seq/ssim -i
Simulating with ../seq/ssim
 All 22 ISA Checks Succeed
./htest.pl -s ../seq/ssim -i
Simulating with ../seq/ssim
 All 756 ISA Checks Succeed
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="part-c"&gt;&lt;a href="#part-c" class="header-anchor"&gt;&lt;/a&gt;Part C
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;ncopy.ys가 최대한 빠르게 실행대도록 최적화하는 단계이다.&lt;/li&gt;
&lt;li&gt;CPE가 7.5 이하로 가도록!&lt;/li&gt;
&lt;li&gt;pipe-full.hcl를 수정하고, ncopy.ys를 수정하자.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;make VERSION=full GUIMODE=&amp;#34;&amp;#34; # pipe-full.hcl 수정 후
make drivers # ncopy.ys 수정 후
./correctness.pl # 정확성 확인
./benchmark.pl # CPE 확인
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;처음 CPE는 15.18이다. 힘내보자고&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="pipe-fullhcl"&gt;&lt;a href="#pipe-fullhcl" class="header-anchor"&gt;&lt;/a&gt;pipe-full.hcl
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;일단 CPU부터 손보자.
&lt;ul&gt;
&lt;li&gt;여기서도 IIADDQ를 추가해야하는것 같다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="fetch-1"&gt;&lt;a href="#fetch-1" class="header-anchor"&gt;&lt;/a&gt;Fetch
&lt;/h5&gt;&lt;ul&gt;
&lt;li&gt;일단 f_PC는 상관 없을 것 같다.&lt;/li&gt;
&lt;li&gt;f_icode, f_ifun도 문제 없고..&lt;/li&gt;
&lt;li&gt;instr_valid는 추가해야겠지.&lt;/li&gt;
&lt;li&gt;위와 같이 need_regids, need_valC도 다 추가해야겠다.&lt;/li&gt;
&lt;li&gt;f_predPC는 점프할일 없으니까 f_valP 그대로!&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="decode-1"&gt;&lt;a href="#decode-1" class="header-anchor"&gt;&lt;/a&gt;Decode
&lt;/h5&gt;&lt;ul&gt;
&lt;li&gt;똑같이 d_srcB, d_dstE 두개를 남겨야할 것 같다.&lt;/li&gt;
&lt;li&gt;valA를 가져올때 이슈인데&amp;hellip; 포워딩을 해야되는데.&lt;/li&gt;
&lt;li&gt;valA에는 Execute 단계에서 valC를 가져오면 되고, valB는 땡겨올텐데&amp;hellip; 아 이미 코딩이 되어있다.
&lt;ul&gt;
&lt;li&gt;e_dstE, M_dstM, M_dstE, W_dstM, W_dstE 순서에서 땡겨온다. 안건드려도 될듯&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="execute-1"&gt;&lt;a href="#execute-1" class="header-anchor"&gt;&lt;/a&gt;Execute
&lt;/h5&gt;&lt;ul&gt;
&lt;li&gt;aluA는 E_valC에서 데려오는거니, 거기다가 IIADDQ를 넣어주자.&lt;/li&gt;
&lt;li&gt;aluB에는 E_valB에서 가져오게.&lt;/li&gt;
&lt;li&gt;alufun은 상관없고, setcc가 좀 이슈인데&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;## Should the condition codes be updated?
bool set_cc = E_icode == IOPQ &amp;amp;&amp;amp;
	# State changes only during normal operation
	!m_stat in { SADR, SINS, SHLT } &amp;amp;&amp;amp; !W_stat in { SADR, SINS, SHLT };
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;원래 코드가 이렇게 되어있는데, E_icode == IOPQ 부분을 in 문법으로 바꾸면 될까?&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;bool set_cc = E_icode in { IOPQ, IIADDQ} &amp;amp;&amp;amp;
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;이렇게 한번 바꿔보자.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="memory-1"&gt;&lt;a href="#memory-1" class="header-anchor"&gt;&lt;/a&gt;Memory
&lt;/h5&gt;&lt;ul&gt;
&lt;li&gt;할일 없지 않을까?&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="pipeline-register-conrtrol"&gt;&lt;a href="#pipeline-register-conrtrol" class="header-anchor"&gt;&lt;/a&gt;Pipeline Register conrtrol
&lt;/h5&gt;&lt;ul&gt;
&lt;li&gt;버블을 넣을까 말까인데, IADDQ는 뭐 상관 없었지.&lt;/li&gt;
&lt;li&gt;stall도 할 필요 없고.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="test-1"&gt;&lt;a href="#test-1" class="header-anchor"&gt;&lt;/a&gt;test
&lt;/h5&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;❯ cd ../y86-code; make testpsim
Makefile:42: warning: ignoring prerequisites on suffix rule definition
Makefile:45: warning: ignoring prerequisites on suffix rule definition
Makefile:48: warning: ignoring prerequisites on suffix rule definition
Makefile:51: warning: ignoring prerequisites on suffix rule definition
../pipe/psim -t asum.yo &amp;gt; asum.pipe
../pipe/psim -t asumr.yo &amp;gt; asumr.pipe
../pipe/psim -t cjr.yo &amp;gt; cjr.pipe
../pipe/psim -t j-cc.yo &amp;gt; j-cc.pipe
../pipe/psim -t poptest.yo &amp;gt; poptest.pipe
../pipe/psim -t pushquestion.yo &amp;gt; pushquestion.pipe
../pipe/psim -t pushtest.yo &amp;gt; pushtest.pipe
../pipe/psim -t prog1.yo &amp;gt; prog1.pipe
../pipe/psim -t prog2.yo &amp;gt; prog2.pipe
../pipe/psim -t prog3.yo &amp;gt; prog3.pipe
../pipe/psim -t prog4.yo &amp;gt; prog4.pipe
../pipe/psim -t prog5.yo &amp;gt; prog5.pipe
../pipe/psim -t prog6.yo &amp;gt; prog6.pipe
../pipe/psim -t prog7.yo &amp;gt; prog7.pipe
../pipe/psim -t prog8.yo &amp;gt; prog8.pipe
../pipe/psim -t ret-hazard.yo &amp;gt; ret-hazard.pipe
grep &amp;#34;ISA Check&amp;#34; *.pipe
asum.pipe:ISA Check Succeeds
asumr.pipe:ISA Check Succeeds
cjr.pipe:ISA Check Succeeds
j-cc.pipe:ISA Check Succeeds
poptest.pipe:ISA Check Succeeds
prog1.pipe:ISA Check Succeeds
prog2.pipe:ISA Check Succeeds
prog3.pipe:ISA Check Succeeds
prog4.pipe:ISA Check Succeeds
prog5.pipe:ISA Check Succeeds
prog6.pipe:ISA Check Succeeds
prog7.pipe:ISA Check Succeeds
prog8.pipe:ISA Check Succeeds
pushquestion.pipe:ISA Check Succeeds
pushtest.pipe:ISA Check Succeeds
ret-hazard.pipe:ISA Check Succeeds
rm asum.pipe asumr.pipe cjr.pipe j-cc.pipe poptest.pipe pushquestion.pipe pushtest.pipe prog1.pipe prog2.pipe prog3.pipe prog4.pipe prog5.pipe prog6.pipe prog7.pipe prog8.pipe ret-hazard.pipe
❯ cd ../ptest; make SIM=../pipe/psim TFLAGS=-i
./optest.pl -s ../pipe/psim -i
Simulating with ../pipe/psim
 All 58 ISA Checks Succeed
./jtest.pl -s ../pipe/psim -i
Simulating with ../pipe/psim
 All 96 ISA Checks Succeed
./ctest.pl -s ../pipe/psim -i
Simulating with ../pipe/psim
 All 22 ISA Checks Succeed
./htest.pl -s ../pipe/psim -i
Simulating with ../pipe/psim
 All 756 ISA Checks Succeed
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;구웃 잘 돌아간다&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="ncopyys"&gt;&lt;a href="#ncopyys" class="header-anchor"&gt;&lt;/a&gt;ncopy.ys
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;일단 아무래도 CPE는 그대로 15.18이다. 이걸 잘 바꿔보자.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# You can modify this portion
	# Loop header
	xorq %rax,%rax		# count = 0;
	andq %rdx,%rdx		# len &amp;lt;= 0?
	jle Done		# if so, goto Done:

Loop:	mrmovq (%rdi), %r10	# read val from src...
	rmmovq %r10, (%rsi)	# ...and store it to dst
	andq %r10, %r10		# val &amp;lt;= 0?
	jle Npos		# if so, goto Npos:
	irmovq $1, %r10
	addq %r10, %rax		# count++
Npos:	irmovq $1, %r10
	subq %r10, %rdx		# len--
	irmovq $8, %r10
	addq %r10, %rdi		# src++
	addq %r10, %rsi		# dst++
	andq %rdx,%rdx		# len &amp;gt; 0?
	jg Loop			# if so, goto Loop:
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;우리가 바꿀 수 있는건 이부분인데..&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="iiaddq"&gt;&lt;a href="#iiaddq" class="header-anchor"&gt;&lt;/a&gt;IIADDQ
&lt;/h5&gt;&lt;ul&gt;
&lt;li&gt;irmovq 를 이용해서 레지스트리에 값을 넣고, 그걸 addq로 연산하는 부분이 두군데 보인다.
&lt;ul&gt;
&lt;li&gt;이걸 iaddq로 줄일 수 있겠다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이걸 수행했더니 CPE가 15.18 -&amp;gt; 13.70으로 줄었다. 갈길이 멀어보인다..&lt;/li&gt;
&lt;li&gt;어라, Npos에도 $-1로 len&amp;ndash;를 구현할 수 있었다.
&lt;ul&gt;
&lt;li&gt;딱 하나 줄어서 12.70이 됐다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="순서-바꾸기"&gt;&lt;a href="#%ec%88%9c%ec%84%9c-%eb%b0%94%ea%be%b8%ea%b8%b0" class="header-anchor"&gt;&lt;/a&gt;순서 바꾸기?
&lt;/h5&gt;&lt;ul&gt;
&lt;li&gt;mmmovq가 없으니, mrmovq, rmmovq로 데이터를 복사하고 있다.&lt;/li&gt;
&lt;li&gt;그런데 이때 메모리 참조에서 하자드가 일어나서, bubble / stall이 들어가지 않았던가?&lt;/li&gt;
&lt;li&gt;이 사이에 andq를 넣어볼까?&lt;/li&gt;
&lt;li&gt;아 이것만으로는 같다&amp;hellip; 안되넹&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Loop:	mrmovq (%rdi), %r10	# read val from src...
	andq %r10, %r10		# val &amp;lt;= 0?
	rmmovq %r10, (%rsi)	# ...and store it to dst
	jle Npos		# if so, goto Npos:
	iaddq $1, %rax		# count++
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;아하, 안되는게 아니라 이렇게 수정한거였는데, andq에서도 결국 %r10이 필요해서 이슈가 생긴다.&lt;/li&gt;
&lt;li&gt;그런데 사이에 더 끼울수있는게 없는데..&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="어셈블리-최적화"&gt;&lt;a href="#%ec%96%b4%ec%85%88%eb%b8%94%eb%a6%ac-%ec%b5%9c%ec%a0%81%ed%99%94" class="header-anchor"&gt;&lt;/a&gt;어셈블리 최적화
&lt;/h5&gt;&lt;ul&gt;
&lt;li&gt;코드 자체를 최적화해볼까?&lt;/li&gt;
&lt;li&gt;점프같은걸 잘 없앨 수 있을거같은데. 점프 적중률을 올려보자.&lt;/li&gt;
&lt;li&gt;Y86-64는 언제나 점프를 안한다고 생각하고 움직인다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ncopy:
	xorq %rax,%rax		# count = 0;
	andq %rdx,%rdx		# len &amp;lt;= 0?
	jle Done		# if so, goto Done:

Loop:
	mrmovq (%rdi), %r10	# read val from src...
	andq %r10, %r10		# val &amp;lt;= 0?
	rmmovq %r10, (%rsi)	# ...and store it to dst
	# jle Npos		# if so, goto Npos:
	# iaddq $1, %rax		# count++
	jg plus1
Npos:
	iaddq $-1, %rdx		# len--
	iaddq $8, %rdi		# src++
	iaddq $8, %rsi		# dst++
	andq %rdx,%rdx		# len &amp;gt; 0?
	jle Done
	jmp Loop			# if so, goto Loop:
plus1:
	iaddq $1, %rax
	jmp Npos
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;쩝 이런느낌으로 해볼까 했는데, 오히려 명령어가 늘어서 15를 넘겨버렸다. 어떻게 하면 좋지? 점프를 덜타야할거같은데&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="버킷질"&gt;&lt;a href="#%eb%b2%84%ed%82%b7%ec%a7%88" class="header-anchor"&gt;&lt;/a&gt;버킷질
&lt;/h5&gt;&lt;ul&gt;
&lt;li&gt;제곱근분할법에서 하는것처럼, 버킷질로 묶어서 처리할 수 있지 않을까?&lt;/li&gt;
&lt;li&gt;그렇게하면 mrmovq 해저드도 없앨 수 있지 않을까?&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Loop:
	mrmovq (%rdi), %r10	# read val from src...
	mrmovq 8(%rdi), %r11 # src+1
	rmmovq %r10, (%rsi)	# ...and store it to dst
	rmmovq %r11, 8(%rsi) # src+1 to dst+1
	andq %r10, %r10		# val &amp;lt;= 0?
	jle Npos		# if so, goto Npos:
	iaddq $1, %rax		# count++
Npos:
	andq %r11, %r11
	jle Npos2
	iaddq $1, %rax
Npos2:
	iaddq $-2, %rdx		# len--
	iaddq $16, %rdi		# src++
	iaddq $16, %rsi		# dst++
	andq %rdx,%rdx		# len &amp;gt; 0?
	jg Loop			# if so, goto Loop:
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;아 다 좋은데.. 이게 짝수개일때만 동작한다. 홀수개이면 어카지? Loop2를 만들까?&lt;/li&gt;
&lt;li&gt;Loop로는 len &amp;gt; 1일때만 보내자.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ncopy:
	xorq %rax,%rax		# count = 0;
	iaddq $-1, %rdx
	jl Done
Loop:
	je move1
	mrmovq (%rdi), %r10	# read val from src...
	mrmovq 8(%rdi), %r11 # src+1
	rmmovq %r10, (%rsi)	# ...and store it to dst
	rmmovq %r11, 8(%rsi) # src+1 to dst+1
	andq %r10, %r10		# val &amp;lt;= 0?
	jle Npos		# if so, goto Npos:
	iaddq $1, %rax		# count++
Npos:
	andq %r11, %r11
	jle Npos2
	iaddq $1, %rax
Npos2:
	iaddq $16, %rdi		# src += 2
	iaddq $16, %rsi		# dst += 2
	iaddq $-2, %rdx		# len -= 2
	jge Loop
	jmp Done
move1:
	mrmovq (%rdi), %r10	# read val from src...
	rmmovq %r10, (%rsi)	# ...and store it to dst
	andq %r10, %r10		# val &amp;lt;= 0?
	jle Done		# if so, goto Npos:
	iaddq $1, %rax		# count++
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;오!! 이렇게하니까 된다!!&lt;/li&gt;
&lt;li&gt;CPE 10.08까지 줄였다.&lt;/li&gt;
&lt;li&gt;배치가 0~64개까지 있으니까, 대충 8개정도가 제곱근 분할법상 맞는거같지만..&lt;/li&gt;
&lt;li&gt;%r10부터 시작하니, %r10~r15까지 6개를 써서 해볼까? 하아 코드가 개길어진다&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-asm" data-lang="asm"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ncopy:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;xorq&lt;/span&gt; %rax,%rax		&lt;span style="color:#75715e"&gt;# count = 0;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;isbig:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;iaddq&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;$-6&lt;/span&gt;, %rdx
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;jge&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;Loop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;iaddq&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;$6&lt;/span&gt;, %rdx
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;router: &lt;span style="color:#75715e"&gt;# check remainder 0 to 5
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;iaddq&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;$-1&lt;/span&gt;, %rdx
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;jl&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;Done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;je&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;move1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;iaddq&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;$-2&lt;/span&gt;, %rdx
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;jl&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;move2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;je&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;move3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;iaddq&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;$-2&lt;/span&gt;, %rdx
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;jl&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;move4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;je&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;move5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Loop:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;mrmovq&lt;/span&gt; (%rdi), %r10
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;mrmovq&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;(%rdi), %r11
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;mrmovq&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;16&lt;/span&gt;(%rdi), %r12
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;mrmovq&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;24&lt;/span&gt;(%rdi), %r13
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;mrmovq&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;32&lt;/span&gt;(%rdi), %r14
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;mrmovq&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;40&lt;/span&gt;(%rdi), %r9
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;rmmovq&lt;/span&gt; %r10, (%rsi)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;rmmovq&lt;/span&gt; %r11, &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;(%rsi)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;rmmovq&lt;/span&gt; %r12, &lt;span style="color:#ae81ff"&gt;16&lt;/span&gt;(%rsi)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;rmmovq&lt;/span&gt; %r13, &lt;span style="color:#ae81ff"&gt;24&lt;/span&gt;(%rsi)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;rmmovq&lt;/span&gt; %r14, &lt;span style="color:#ae81ff"&gt;32&lt;/span&gt;(%rsi)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;rmmovq&lt;/span&gt; %r9, &lt;span style="color:#ae81ff"&gt;40&lt;/span&gt;(%rsi)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Npos_loop1:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;andq&lt;/span&gt; %r10, %r10
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;jle&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;Npos_loop2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;iaddq&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;$1&lt;/span&gt;, %rax
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Npos_loop2:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;andq&lt;/span&gt; %r11, %r11
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;jle&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;Npos_loop3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;iaddq&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;$1&lt;/span&gt;, %rax
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Npos_loop3:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;andq&lt;/span&gt; %r12, %r12
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;jle&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;Npos_loop4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;iaddq&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;$1&lt;/span&gt;, %rax
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Npos_loop4:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;andq&lt;/span&gt; %r13, %r13
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;jle&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;Npos_loop5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;iaddq&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;$1&lt;/span&gt;, %rax
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Npos_loop5:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;andq&lt;/span&gt; %r14, %r14
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;jle&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;Npos_loop6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;iaddq&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;$1&lt;/span&gt;, %rax
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Npos_loop6:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;andq&lt;/span&gt; %r9, %r9
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;jle&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;Loop_end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;iaddq&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;$1&lt;/span&gt;, %rax
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Loop_end:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;iaddq&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;$48&lt;/span&gt;, %rdi
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;iaddq&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;$48&lt;/span&gt;, %rsi
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;iaddq&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;$-6&lt;/span&gt;, %rdx
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;jge&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;Loop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;iaddq&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;$6&lt;/span&gt;, %rdx
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;jmp&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;router&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;move1:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;mrmovq&lt;/span&gt; (%rdi), %r10
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;rmmovq&lt;/span&gt; %r10, (%rsi)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;jmp&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;move_check10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;move2:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;mrmovq&lt;/span&gt; (%rdi), %r10
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;mrmovq&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;(%rdi), %r11
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;rmmovq&lt;/span&gt; %r10, (%rsi)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;rmmovq&lt;/span&gt; %r11, &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;(%rsi)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;jmp&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;move_check11&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;move3:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;mrmovq&lt;/span&gt; (%rdi), %r10
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;mrmovq&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;(%rdi), %r11
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;mrmovq&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;16&lt;/span&gt;(%rdi), %r12
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;rmmovq&lt;/span&gt; %r10, (%rsi)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;rmmovq&lt;/span&gt; %r11, &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;(%rsi)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;rmmovq&lt;/span&gt; %r12, &lt;span style="color:#ae81ff"&gt;16&lt;/span&gt;(%rsi)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;jmp&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;move_check12&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;move4:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;mrmovq&lt;/span&gt; (%rdi), %r10
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;mrmovq&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;(%rdi), %r11
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;mrmovq&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;16&lt;/span&gt;(%rdi), %r12
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;mrmovq&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;24&lt;/span&gt;(%rdi), %r13
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;rmmovq&lt;/span&gt; %r10, (%rsi)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;rmmovq&lt;/span&gt; %r11, &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;(%rsi)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;rmmovq&lt;/span&gt; %r12, &lt;span style="color:#ae81ff"&gt;16&lt;/span&gt;(%rsi)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;rmmovq&lt;/span&gt; %r13, &lt;span style="color:#ae81ff"&gt;24&lt;/span&gt;(%rsi)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;jmp&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;move_check13&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;move5:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;mrmovq&lt;/span&gt; (%rdi), %r10
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;mrmovq&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;(%rdi), %r11
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;mrmovq&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;16&lt;/span&gt;(%rdi), %r12
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;mrmovq&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;24&lt;/span&gt;(%rdi), %r13
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;mrmovq&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;32&lt;/span&gt;(%rdi), %r14
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;rmmovq&lt;/span&gt; %r10, (%rsi)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;rmmovq&lt;/span&gt; %r11, &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;(%rsi)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;rmmovq&lt;/span&gt; %r12, &lt;span style="color:#ae81ff"&gt;16&lt;/span&gt;(%rsi)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;rmmovq&lt;/span&gt; %r13, &lt;span style="color:#ae81ff"&gt;24&lt;/span&gt;(%rsi)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;rmmovq&lt;/span&gt; %r14, &lt;span style="color:#ae81ff"&gt;32&lt;/span&gt;(%rsi)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;move_check14:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;andq&lt;/span&gt; %r14, %r14
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;jle&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;move_check13&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;iaddq&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;$1&lt;/span&gt;, %rax
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;move_check13:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;andq&lt;/span&gt; %r13, %r13
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;jle&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;move_check12&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;iaddq&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;$1&lt;/span&gt;, %rax
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;move_check12:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;andq&lt;/span&gt; %r12, %r12
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;jle&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;move_check11&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;iaddq&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;$1&lt;/span&gt;, %rax
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;move_check11:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;andq&lt;/span&gt; %r11, %r11
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;jle&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;move_check10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;iaddq&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;$1&lt;/span&gt;, %rax
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;move_check10:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;andq&lt;/span&gt; %r10, %r10
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;jle&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;Done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;iaddq&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;$1&lt;/span&gt;, %rax
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;열심히 했더니 8.01까지 줄었다!!&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="이분-탐색"&gt;&lt;a href="#%ec%9d%b4%eb%b6%84-%ed%83%90%ec%83%89" class="header-anchor"&gt;&lt;/a&gt;이분 탐색
&lt;/h5&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;router_tree: # now 0 &amp;lt;= rdx &amp;lt;= 5
	iaddq $-3, %rdx
	je move3
	jg router_tree_R
router_tree_L: # rdx &amp;lt; 3
	iaddq $2, %rdx
	jl Done
	je move1
	jg move2
router_tree_R: # rdx &amp;gt; 3
	iaddq $-1, %rdx
	je move4
	jg move5
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;라우터를 이분탐색으로 해봤고, 7.80까지 줄일 수 있었다.&lt;/li&gt;
&lt;li&gt;move 로직도 좀 수정했다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;##################################################################
# You can modify this portion
	# Loop header
	xorq %rax,%rax		# count = 0;
isbig:
	iaddq $-6, %rdx
	jge Loop
router:
	iaddq $3, %rdx
	jl router_L
	je move3
	jg router_R
router_L:
	iaddq $2, %rdx
	jl Done
	je move1
	jmp move2
router_R:
	iaddq $-1, %rdx
	je move4
	jmp move5
Loop:
	mrmovq (%rdi), %r10
	mrmovq 8(%rdi), %r11
	mrmovq 16(%rdi), %r12
	mrmovq 24(%rdi), %r13
	mrmovq 32(%rdi), %r14
	mrmovq 40(%rdi), %r9
Npos_loop1:
	andq %r10, %r10
	rmmovq %r10, (%rsi)
	jle Npos_loop2
	iaddq $1, %rax
Npos_loop2:
	andq %r11, %r11
	rmmovq %r11, 8(%rsi)
	jle Npos_loop3
	iaddq $1, %rax
Npos_loop3:
	andq %r12, %r12
	rmmovq %r12, 16(%rsi)
	jle Npos_loop4
	iaddq $1, %rax
Npos_loop4:
	andq %r13, %r13
	rmmovq %r13, 24(%rsi)
	jle Npos_loop5
	iaddq $1, %rax
Npos_loop5:
	andq %r14, %r14
	rmmovq %r14, 32(%rsi)
	jle Npos_loop6
	iaddq $1, %rax
Npos_loop6:
	andq %r9, %r9
	rmmovq %r9, 40(%rsi)
	jle Loop_end
	iaddq $1, %rax
Loop_end:
	iaddq $48, %rdi
	iaddq $48, %rsi
	iaddq $-6, %rdx
	jge Loop
	jmp router
move1:
	mrmovq (%rdi), %r10
	jmp move_check10
move2:
	mrmovq (%rdi), %r10
	mrmovq 8(%rdi), %r11
	jmp move_check11
move3:
	mrmovq (%rdi), %r10
	mrmovq 8(%rdi), %r11
	mrmovq 16(%rdi), %r12
	jmp move_check12
move4:
	mrmovq (%rdi), %r10
	mrmovq 8(%rdi), %r11
	mrmovq 16(%rdi), %r12
	mrmovq 24(%rdi), %r13
	jmp move_check13
move5:
	mrmovq (%rdi), %r10
	mrmovq 8(%rdi), %r11
	mrmovq 16(%rdi), %r12
	mrmovq 24(%rdi), %r13
	mrmovq 32(%rdi), %r14
move_check14:
	andq %r14, %r14
	rmmovq %r14, 32(%rsi)
	jle move_check13
	iaddq $1, %rax
move_check13:
	andq %r13, %r13
	rmmovq %r13, 24(%rsi)
	jle move_check12
	iaddq $1, %rax
move_check12:
	andq %r12, %r12
	rmmovq %r12, 16(%rsi)
	jle move_check11
	iaddq $1, %rax
move_check11:
	andq %r11, %r11
	rmmovq %r11, 8(%rsi)
	jle move_check10
	iaddq $1, %rax
move_check10:
	andq %r10, %r10
	rmmovq %r10, (%rsi)
	jle Done
	iaddq $1, %rax
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;7.73정도까지 줄였는데.. 진짜 더는 못하겠다. 멀 해도 안줄어든다 ㅠ.ㅠ 여기서 포기&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="질문-사항"&gt;&lt;a href="#%ec%a7%88%eb%ac%b8-%ec%82%ac%ed%95%ad" class="header-anchor"&gt;&lt;/a&gt;❔질문 사항
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-참고-자료"&gt;&lt;a href="#-%ec%b0%b8%ea%b3%a0-%ec%9e%90%eb%a3%8c" class="header-anchor"&gt;&lt;/a&gt;🔗 참고 자료
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>