leehyeon-dv 님의 블로그

2.7 Instructions for Making Desicions 본문

컴퓨터구조 및 설계/2장. language of the computer

2.7 Instructions for Making Desicions

leehyeon-dv 2024. 11. 16. 16:08

🔑Table of Contents

  1. Conditional Operations                  - 조건
  2. Compiling If Statements                - if문 컴파일
  3. Compiling Loop Statements          - 반복 구문 컴파일
  4. Basic Blocks
  5. More Conditional Operations        - 더 조건적인 것
  6. Branch Instruction Design            - 분기 명령 설계
  7. Signed vs Unsigned                      - 부호 있는 vs 부호 없는

📌Conditional Operations

만약 조건이 true면, label된 instruction으로 향하게 하는 branch(아닐경우->false, contunue sequentially)

 

beq rs,rt, L1

만약 rs == rt 면, L1인 instruction으로 이동

bne rs,rt, L1

만약 rs != rt 면, L1인 instruction으로 이동

J L1

무조건 L1이라고 표시된 instruction으로 이동


📌
Compiling If Statements

 

*C code:

 if (i == j) f = g + h;

 else f = g - h;

 ㆍf는 $s0에, g는 $s1에, h는 $s2에, i는 $s3에, j는 $s4에.

 

*컴파일된 MIPS code:

   bne $s3, $s4, Else

   add $s0, $s1, $s2

    j   Exit

 Else: sub $s0, $s1, $s2

 Exit: ... ← 어셈블러가 계산한 주소

 

📋Quiz! 

C코드를 컴파일된 MIPS코드로 바꿔라 (필요시 임시레지스터 최소한으로 사용가능)

if (i != j) f = a[10]-g;
else f = k+g;
//i,j,f,g,k -> $s0, $s1, $s2, $s3, $s4
//a의 기본주소 -> $s5

 

 beg $s0, $s1, Else

 lw   $t0, 40($s5)

 sub $s2, $t0, $s3

  j Exit

  Else : add $s2, $s4, $s3

  Exit: ...

 

📌Compiling Loop Statements

 

*C code:

 while (save[i] == k) i += 1;

 ㆍi는 $s3에, k는 $s5에, 배열 save의 시작 주소는 $s6에.

 

*컴파일된 MIPS code:

 Loop: sll  $t1, $s3, 2  (처음 주어질 i index만큼의 주소(4byte)를 위해 2^2=4를 곱해둠)

    add $t1, $t1, $s6 (offset(위에서 구해둔 i*4)에 시작 주소 더하면 save[i]의 주소)

    lw  $t0, 0($t1)

    bne $t0, $s5, Exit

    addi $s3, $s3, 1

    j   Loop

 Exit: ...

 

📋Quiz! 

C코드를 컴파일된 MIPS코드로 바꿔라 (필요시 임시레지스터 최소한으로 사용가능)

while (test[i] != f)
  i -= 1
//i,f ->  $s2, $s3
//test의 기본주소 -> $s1, label은 Loop, Exit사용

 

 Loop: sll  $t0, $s2, 2  (i*4)

    add $t0, $t0, $s1  (기본주소 + i)

    lw  $t1, 0($t0)       (해당위치값 적재)

    beq $t1, $s3, Exit    (같으면 분기)

    addi $s2, $s2, -1

    j   Loop

 Exit: ...

 

📌Basic Blocks

basic block = instruction들의 순서대로 모인 집합

  • embedded branch(일체형분기)는 없다(단, 끝부분에는 있을수있음)
  • branch target(분기 대상, labeled)은 없다 (첫부분엔 있을수있음)
  • 중간에는 branch도없고, labeled된(점프할 곳으로 지정된) 곳도 없다, 분기가 없는 작업덩어리

  • 컴파일러는 최적화를 위해 이런 basic block들을 찾아낸다
  • 진보된(고성능) 프로세서는 basic block들의 수행을 가속시킬 수 있다

📌More Conditional Operations

조건이 true -> 결과 1로 설정(아니면, 0)

 

slt rd, rs,rt

만약 rs < rt 면, rd =1 ( else rt =0)

slti rt, ts, constant

만약 rs < constant, rt =1( else rt =0)

 

*beq와 bne의 혼합으로 사용됨

slt   $t0, #s1, $s2 # if ($s1 < $s2)

bne $t0, $zero, L # 0이 아니면(=1) L로 이동

 

📌Branch Instruction Design

blt(branch less than), bge(branch greater or equal)가 없는 이유 

= 하드웨어 입장에서는 <같은 연산이 =보다 느리기에 좋은 설계를 위한 타협이다 

  • 모든 분기를 지원하면 한 instruction마다 기존보다 더 많은 일을 수행해 클럭속도가 느려진다
  • 모든 instruction 전체가 불이익을 받음(느려진 클럭속도로)

📌Signed vs Unsigned

 

부호 있는 비교 : slt, slti

부호 없는 비교 : sltu, sltiu (절댓값비교)

 

📝 예제

$s0 = 1111 1111 1111 1111 1111 1111 1111 1111
$s1 = 0000 0000 0000 0000 0000 0000 0000 0001

slt $t0, $s0, $s1     #-1 < 1 →$t0 = 1( else $t0 =0)
sltu $t0, $s0, $s1    #4,294,967,295 < 1 → $t0 = 1( else $t0 =0)