Presentation is loading. Please wait.

Presentation is loading. Please wait.

Carnegie Mellon Ithaca College

Similar presentations


Presentation on theme: "Carnegie Mellon Ithaca College"— Presentation transcript:

1 Carnegie Mellon Ithaca College Machine-Level Programming IV Control Comp 21000: Introduction to Computer Organization & Systems Systems book chapter 3*

2 Today Control: Condition codes Conditional branches Loops
Ithaca College Today Control: Condition codes Conditional branches If-then-else statements Conditional moves Loops Switch Statements

3 Conditional Branch Example (Old Style)
Ithaca College Conditional Branch Example (Old Style) Generation barr> gcc –Og -S –fno-if-conversion control.c absdiff: cmpq %rsi, %rdi # x:y jle .L4 movq %rdi, %rax subq %rsi, %rax ret .L4: # x <= y movq %rsi, %rax subq %rdi, %rax long absdiff (long x, long y) { long result; if (x > y) result = x-y; else result = y-x; return result; } Register Use(s) %rdi Argument x %rsi Argument y %rax Return value

4 Expressing with Goto Code
Ithaca College Expressing with Goto Code C allows goto statement Jump to position designated by label long absdiff (long x, long y) { long result; if (x > y) result = x-y; else result = y-x; return result; } long absdiff_j (long x, long y) { long result; int ntest = (x <= y); if (ntest) goto else; result = x-y; goto Done; else: result = y-x; Done: return result; } Generally considered bad coding style

5 Expressing with Goto Code
Ithaca College Expressing with Goto Code C allows goto statement Jump to position designated by label absdiff: cmpq %rsi, %rdi # x:y jle .L4 movq %rdi, %rax subq %rsi, %rax ret .L4: # x <= y movq %rsi, %rax subq %rdi, %rax long absdiff_j (long x, long y) { long result; int ntest = (x <= y); if (ntest) goto else; result = x-y; goto Done; else: result = y-x; Done: return result; } Register Use(s) %rdi Argument x %rsi Argument y %rax Return value

6 Expressing with Goto Code
Ithaca College Expressing with Goto Code C allows goto statement Jump to position designated by label absdiff: cmpq %rsi, %rdi # x:y jle .L4 movq %rdi, %rax subq %rsi, %rax ret .L4: # x <= y movq %rsi, %rax subq %rdi, %rax long absdiff_j (long x, long y) { long result; int ntest = (x <= y); if (ntest) goto else; result = x-y; goto Done; else: result = y-x; Done: return result; } Register Use(s) %rdi Argument x %rsi Argument y %rax Return value

7 Expressing with Goto Code
Ithaca College Expressing with Goto Code C allows goto statement Jump to position designated by label absdiff: cmpq %rsi, %rdi # x:y jle .L4 movq %rdi, %rax subq %rsi, %rax ret .L4: # x <= y movq %rsi, %rax subq %rdi, %rax long absdiff_j (long x, long y) { long result; int ntest = (x <= y); if (ntest) goto else; result = x-y; goto Done; else: result = y-x; Done: return result; } Register Use(s) %rdi Argument x %rsi Argument y %rax Return value

8 Expressing with Goto Code
Ithaca College Expressing with Goto Code C allows goto statement Jump to position designated by label absdiff: cmpq %rsi, %rdi # x:y jle .L4 movq %rdi, %rax subq %rsi, %rax ret .L4: # x <= y movq %rsi, %rax subq %rdi, %rax long absdiff_j (long x, long y) { long result; int ntest = (x <= y); if (ntest) goto else; result = x-y; goto Done; else: result = y-x; Done: return result; } Register Use(s) %rdi Argument x %rsi Argument y %rax Return value

9 Example 2 Copy ifStmt.c from home/barr/Student/comp210/examples/
gcc –O0 –o ifStmt –fno-if-conversion ifStmt.c gdb ifStmt In gdb: disass testIf1 int testIf1(int x, int y) { int result; int ntest = (x >= y); if (ntest) goto else; result = x * 4; goto Done; else: result = y * 4; Done: return result; } int testIf1(int x, int y) { int result; if (x < y) result = x * 4; else result = y * 4; return result; }

10 Example 2 continued… Register Use(s) %rdi Argument x %rsi Argument y
%rax Return value pushq %rbp movq %rsp, %rbp movq %rdi, -18(%rbp) movq %rsi, -20(%rbp) movq -18(%rbp), %rax cmpq -20(%rbp), %rax jge LBBO_2 shlq $2, %rax movq %rax, -8(%rbp) jmp LBB0_3 LBB0_2: movq -20(%rbp), %rax LBB0_3: movq -8(%rbp), %rax popq %rbp retq int testIf1 (int x, int y) { int result; int ntest = (x >= y); if (ntest) goto else; result = x * 4; goto Done; else: result = y * 4; Done: return result; } LBBO_2 is 0x40054a <testIf1+36> LBBO_3 is 0x <testIf1+48>

11 Setting up the runtime stack
Example 2 continued… Register Use(s) %rdi Argument x %rsi Argument y %rax Return value pushq %rbp movq %rsp, %rbp movq %rdi, -18(%rbp) movq %rsi, -20(%rbp) movq -18(%rbp), %rax cmpq -20(%rbp), %rax jge LBBO_2 shlq $2, %rax movq %rax, -8(%rbp) jmp LBB0_3 LBB0_2: movq -20(%rbp), %rax LBB0_3: movq -8(%rbp), %rax popq %rbp retq Setting up the runtime stack int testIf1 (int x, int y) { int result; int ntest = (x >= y); if (ntest) goto else; result = x * 4; goto Done; else: result = y * 4; Done: return result; } if x - y >= 0 jump calculate x=x*4 and jump Calculate y=y*4 LBBO_2 is 0x40054a <testIf1+36> LBBO_3 is 0x <testIf1+48> Set up the return value

12 General Conditional Expression Translation (Using Branches)
Ithaca College General Conditional Expression Translation (Using Branches) C Code val = Test ? Then_Expr : Else_Expr; val = x>y ? x-y : y-x; Test Is an expression returning an integer = 0 interpreted as false ≠ 0 interpreted as true Create separate code regions for then & else expressions Execute appropriate one Goto Version ntest = !Test; if (ntest) goto Else; val = Then_Expr; goto Done; Else: val = Else_Expr; Done: . . .


Download ppt "Carnegie Mellon Ithaca College"

Similar presentations


Ads by Google