Professional Documents
Culture Documents
Short 06 Machine Control Part2.2
Short 06 Machine Control Part2.2
1
Today
case 0:
⬛ Problem: not efficient
val = x*13; break;
case 2:
⬛ Solution: use a jump table
val = x+10; /*Fall through*/
case 3:
val = x+11; break;
case 4:
case 6:
val = x*x; break;
default:
val=0;
}
*dest = val;
} 3
void foo(long x, long n, long *dest) void foo(long x, long n, long *dest)
{ {
long val; long val;
case 4:
case 6: loc_D: /* Cases 4, 6 */
val = x*x; break; val = x*x; goto done;
•
Translation (Extended C) •
goto *JTab[x]; •
long switch_eg
(long x, long y, long z)
Switch Statement
{
long w = 1; Example
switch(x) {
case 1:
w = y*z;
break;
case 2:
w = y/z;
/* Fall Through */
case 3:
w += z;
break;
case 5:
case 6:
w -= z;
break;
default:
w = 2;
}
return w;
}
Setup:
Register Use(s)
switch_eg:
movq %rdx, %rcx %rdi Argument x
cmpq $6, %rdi # x:6
ja .L8 %rsi Argument y
jmp *.L4(,%rdi,8) %rdx Argument z
%rax Return value
Jump Table
Jump table
switch(x) {
.section .rodata case 1: // .L3
.align 8 w = y*z;
.L4:
.quad .L8 # x = 0 break;
.quad .L3 # x = 1 case 2: // .L5
.quad .L5 # x = 2 w = y/z;
.quad .L9 # x = 3 /* Fall Through */
.quad .L8 # x = 4
.quad .L7 # x = 5 case 3: // .L9
.quad .L7 # x = 6 w += z;
break;
case 5:
case 6: // .L7
w -= z;
break;
default: // .L8
w = 2;
}
Code Blocks (x == 1)
case 1: // .L3 .L3:
w = y*z; movq %rsi, %rax # y
break; imulq %rdx, %rax # y*z
. . . ret
Register Use(s)
%rdi Argument x
%rsi Argument y
%rdx Argument z
%rax Return value
11
Code Blocks (x == 2, x == 3)
.L5: # Case 2
long w = 1; movq %rsi, %rax
. . . cqto
switch(x) { idivq %rcx # y/z
. . . jmp .L6 # goto merge
case 2: .L9: # Case 3
w = y/z; movl $1, %eax # w = 1
/* Fall Through */ .L6: # merge:
case 3: addq %rcx, %rax # w += z
w += z; ret
break;
. . .
}
Register Use(s)
%rdi Argument x
%rsi Argument y
%rdx Argument z
%rax Return value
12
Register Use(s)
%rdi Argument x
%rsi Argument y
%rdx Argument z
%rax Return value
13