Professional Documents
Culture Documents
Mellon
Carnegie
Mellon
Instructors:
Randal
E.
Bryant
and
David
R.
OHallaron
Carnegie Mellon
Today
Control:
Condi;on
codes
Condi;onal
branches
Loops
Switch
Statements
Carnegie Mellon
Informa;on
about
currently
execu;ng
program
Registers
%rax
%r8
Temporary data
%rbx
%r9
%rcx
%r10
%rdx
%r11
%rsi
%r12
%rdi
%r13
%rsp
%r14
%rbp
%r15
%rip
Instruc;on pointer
(
%rax,
)
Loca;on
of
run;me
stack
(
%rsp
)
Loca;on
of
current
code
control
point
(
%rip,
)
Status
of
recent
tests
(
CF,
ZF,
SF,
OF
)
Current
stack
top
CF
Bryant
and
OHallaron,
Computer
Systems:
A
Programmers
Perspec;ve,
Third
Edi;on
ZF
SF
OF
Condi;on
codes
3
Carnegie Mellon
Carnegie Mellon
Carnegie Mellon
Carnegie Mellon
SetX
Instruc;ons
Set
low-order
byte
of
des;na;on
to
0
or
1
based
on
combina;ons
of
condi;on
codes
Does
not
alter
remaining
7
bytes
SetX
sete
setne
sets
setns
setg
setge
setl
setle
seta
setb
Condi;on
ZF
~ZF
SF
~SF
~(SF^OF)&~ZF
~(SF^OF)
(SF^OF)
(SF^OF)|ZF
~CF&~ZF
CF
Descrip;on
Equal
/
Zero
Not
Equal
/
Not
Zero
Nega;ve
Nonnega;ve
Greater
(Signed)
Greater
or
Equal
(Signed)
Less
(Signed)
Less
or
Equal
(Signed)
Above
(unsigned)
Below
(unsigned)
7
%al
%r8
%r8b
%rbx
%bl
%r9
%r9b
%rcx
%cl
%r10
%r10b
%rdx
%dl
%r11
%r11b
%rsi
%sil
%r12
%r12b
%rdi
%dil
%r13
%r13b
%rsp
%spl
%r14
%r14b
%rbp
%bpl
%r15
%r15b
Carnegie Mellon
SetX
Instruc;ons:
Set
single
byte
based
on
combina;on
of
condi;on
codes
cmpq
Register
Use(s)
%rdi
Argument x
%rsi
Argument y
%rax
Return value
%rsi, %rdi
# Compare x:y
setg
%al
# Set when >
movzbl %al, %eax # Zero rest of %rax
ret
Carnegie Mellon
Today
Control:
Condi;on
codes
Condi;onal
branches
Loops
Switch
Statements
10
Carnegie Mellon
Jumping
jX
Instruc;ons
Jump
to
dierent
part
of
code
depending
on
condi;on
codes
jX
Condi;on
Descrip;on
jmp
Uncondi;onal
je
ZF
Equal / Zero
jne
~ZF
js
SF
Nega;ve
jns
~SF
Nonnega;ve
jg
~(SF^OF)&~ZF
Greater (Signed)
jge
~(SF^OF)
jl
(SF^OF)
Less (Signed)
jle
(SF^OF)|ZF
ja
~CF&~ZF
Above (unsigned)
jb
CF
Below (unsigned)
11
Carnegie Mellon
Genera;on
absdiff:
cmpq
jle
movq
subq
ret
.L4:
movq
subq
ret
%rsi, %rdi
.L4
%rdi, %rax
%rsi, %rax
# x:y
# x <= y
%rsi, %rax
%rdi, %rax
Register
Use(s)
%rdi
Argument x
%rsi
Argument y
%rax
Return
value
12
Carnegie Mellon
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;
}
13
Carnegie Mellon
Goto
Version
ntest = !Test;
if (ntest) goto Else;
val = Then_Expr;
goto Done;
Else:
val = Else_Expr;
Done:
. . .
14
Carnegie Mellon
Why?
Branches
are
very
disrup;ve
to
C
Code
val = Test
? Then_Expr
: Else_Expr;
Goto
Version
result = Then_Expr;
eval = Else_Expr;
nt = !Test;
if (nt) result = eval;
return result;
15
Carnegie Mellon
%rdi,
%rsi,
%rsi,
%rdi,
%rsi,
%rdx,
Register
Use(s)
%rdi
Argument x
%rsi
Argument y
%rax
Return value
%rax
%rax
%rdx
%rdx
%rdi
%rax
# x
# result = x-y
# eval = y-x
# x:y
# if <=, result = eval
16
Carnegie Mellon
Risky
Computa;ons
val = p ? *p : 0;
17
Carnegie Mellon
Today
Control:
Condi;on
codes
Condi;onal
branches
Loops
Switch
Statements
18
Carnegie Mellon
Goto
Version
long pcount_goto
(unsigned long x) {
long result = 0;
loop:
result += x & 0x1;
x >>= 1;
if(x) goto loop;
return result;
}
19
Carnegie Mellon
Goto Version
long pcount_goto
(unsigned long x) {
long result = 0;
loop:
result += x & 0x1;
x >>= 1;
if(x) goto loop;
return result;
}
Register
Use(s)
%rdi
Argument x
%rax
result
movl
$0, %eax
.L2:
movq
%rdi, %rdx
andl
$1, %edx
addq
%rdx, %rax
shrq
%rdi
jne
.L2
rep; ret
Bryant
and
OHallaron,
Computer
Systems:
A
Programmers
Perspec;ve,
Third
Edi;on
# result = 0
# loop:
#
#
#
#
t = x & 0x1
result += t
x >>= 1
if (x) goto loop
20
Carnegie Mellon
Body: {
Goto
Version
loop:
Body
if (Test)
goto loop
Statement1;
Statement2;
Statementn;
}
21
Carnegie Mellon
Jump-to-middle
transla;on
Used
with
-Og
While
version
while (Test)
Body
Goto
Version
goto test;
loop:
Body
test:
if (Test)
goto loop;
done:
22
Carnegie Mellon
Jump
to
Middle
long
pcount_goto_jtm
Version
(unsigned long x) {
long result = 0;
goto test;
loop:
result += x & 0x1;
x >>= 1;
test:
if(x) goto loop;
return result;
}
23
Carnegie Mellon
while (Test)
Body
Do-While
Version
if (!Test)
goto done;
do
Body
while(Test);
done:
Bryant
and
OHallaron,
Computer
Systems:
A
Programmers
Perspec;ve,
Third
Edi;on
Do-while
conversion
Used
with
O1
Goto
Version
if (!Test)
goto done;
loop:
Body
if (Test)
goto loop;
done:
24
Carnegie Mellon
Do-While
Version
long pcount_goto_dw
(unsigned long x) {
long result = 0;
if (!x) goto done;
loop:
result += x & 0x1;
x >>= 1;
if(x) goto loop;
done:
return result;
}
25
Carnegie Mellon
Init
i
= 0
General
Form
for (Init; Test; Update )
Test
i
< WSIZE
Body
#define WSIZE 8*sizeof(int)
long pcount_for
(unsigned long x)
{
size_t i;
long result = 0;
for (i = 0; i < WSIZE; i++)
{
unsigned bit =
(x >> i) & 0x1;
result += bit;
}
return result;
}
Bryant
and
OHallaron,
Computer
Systems:
A
Programmers
Perspec;ve,
Third
Edi;on
Update
i++
{
Body
unsigned bit =
(x >> i) & 0x1;
result += bit;
26
Carnegie Mellon
While
Version
Init;
while (Test
) {
Body
Update;
}
Bryant
and
OHallaron,
Computer
Systems:
A
Programmers
Perspec;ve,
Third
Edi;on
27
Carnegie Mellon
For-While
Conversion
Init
i
= 0
Test
i
< WSIZE
Update
i++
Body
unsigned bit =
(x >> i) & 0x1;
result += bit;
long pcount_for_while
(unsigned long x)
{
size_t i;
long result = 0;
i = 0;
while (i < WSIZE)
{
unsigned bit =
(x >> i) & 0x1;
result += bit;
i++;
}
return result;
}
}
Bryant
and
OHallaron,
Computer
Systems:
A
Programmers
Perspec;ve,
Third
Edi;on
28
Carnegie Mellon
Goto Version
long pcount_for
(unsigned long x)
{
size_t i;
long result = 0;
for (i = 0; i < WSIZE; i++)
{
unsigned bit =
(x >> i) & 0x1;
result += bit;
}
return result;
}
long pcount_for_goto_dw
(unsigned long x) {
size_t i;
long result = 0;
i = 0;
Init
if (!(i < WSIZE))
!Test
goto done;
loop:
{
unsigned bit =
(x >> i) & 0x1; Body
result += bit;
}
i++; Update
if (i < WSIZE)
Test
goto loop;
done:
return result;
}
29
Carnegie Mellon
Today
30
Carnegie Mellon
long switch_eg
(long x, long y, long z)
{
long w = 1;
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;
}
Bryant
and
OHallaron,
Computer
Systems:
A
Programmers
Perspec;ve,
Third
Edi;on
Switch
Statement
Example
Missing
cases
Here:
4
31
Carnegie Mellon
Jump
Table
jtab:
Targ0
Jump
Targets
Targ0: Code
Block
0
Targ1
Targ2
Targ1:
Code
Block
1
Targ2:
Code
Block
2
Targn-1
Transla;on
(Extended
C)
goto *JTab[x];
Targn-1:
Code
Block
n1
32
Carnegie Mellon
Setup:
switch_eg:
movq
cmpq
ja
jmp
%rdx, %rcx
$6, %rdi
# x:6
.L8
*.L4(,%rdi,8)
Register
Use(s)
%rdi
Argument x
%rsi
Argument y
%rdx
Argument z
%rax
Return value
33
Carnegie Mellon
Setup:
switch_eg:
movq
cmpq
ja
Indirect
jmp
jump
Jump
table
.section
.rodata
.align 8
.L4:
.quad
.L8 # x = 0
.quad
.L3 # x = 1
.quad
.L5 # x = 2
.quad
.L9 # x = 3
.quad
.L8 # x = 4
.quad
.L7 # x = 5
.quad
.L7 # x = 6
%rdx, %rcx
$6, %rdi
# x:6
.L8
# Use default
*.L4(,%rdi,8) # goto *JTab[x]
34
Carnegie Mellon
Table
Structure
Each
target
requires
8
bytes
Base
address
at
.L4
Jumping
Direct:
jmp .L8
Jump
target
is
denoted
by
label
.L8
Jump
table
.section
.rodata
.align 8
.L4:
.quad
.L8 # x = 0
.quad
.L3 # x = 1
.quad
.L5 # x = 2
.quad
.L9 # x = 3
.quad
.L8 # x = 4
.quad
.L7 # x = 5
.quad
.L7 # x = 6
35
Carnegie Mellon
Jump
Table
Jump
table
.section
.rodata
.align 8
.L4:
.quad
.L8 # x = 0
.quad
.L3 # x = 1
.quad
.L5 # x = 2
.quad
.L9 # x = 3
.quad
.L8 # x = 4
.quad
.L7 # x = 5
.quad
.L7 # x = 6
switch(x) {
case 1:
// .L3
w = y*z;
break;
case 2:
// .L5
w = y/z;
/* Fall Through */
case 3:
// .L9
w += z;
break;
case 5:
case 6:
// .L7
w -= z;
break;
default:
// .L8
w = 2;
}
36
Carnegie Mellon
Code
Blocks
(x
==
1)
switch(x) {
case 1:
// .L3
w = y*z;
break;
. . .
.L3:
movq
imulq
ret
%rsi, %rax
%rdx, %rax
# y
# y*z
Register
Use(s)
%rdi
Argument x
%rsi
Argument y
%rdx
Argument z
%rax
Return value
37
Carnegie Mellon
Handling
Fall-Through
long w = 1;
. . .
switch(x) {
. . .
case 2:
w = y/z;
/* Fall Through */
case 3:
w += z;
break;
. . .
}
case 2:
w = y/z;
goto merge;
case 3:
w = 1;
merge:
w += z;
38
Carnegie Mellon
Code
Blocks
(x
==
2,
x
==
3)
.L5:
movq
cqto
idivq
jmp
.L9:
movl
.L6:
addq
ret
long w = 1;
. . .
switch(x) {
. . .
case 2:
w = y/z;
/* Fall Through */
case 3:
w += z;
break;
. . .
}
Register
# Case 2
%rsi, %rax
%rcx
.L6
# y/z
# goto merge
# Case 3
$1, %eax
# w = 1
# merge:
%rcx, %rax # w += z
Use(s)
%rdi
Argument x
%rsi
Argument y
%rdx
Argument z
%rax
Return value
39
Carnegie Mellon
.L7:
movl
subq
ret
.L8:
movl
ret
# Case 5,6
$1, %eax
# w = 1
%rdx, %rax # w -= z
$2, %eax
# Default:
# 2
Register
Use(s)
%rdi
Argument x
%rsi
Argument y
%rdx
Argument z
%rax
Return value
40
Carnegie Mellon
Summarizing
C Control
Assembler Control
if-then-else
do-while
while,
for
switch
Condi;onal
jump
Condi;onal
move
Indirect
jump
(via
jump
tables)
Compiler
generates
code
sequence
to
implement
more
complex
control
Standard
Techniques
Loops
converted
to
do-while
or
jump-to-middle
form
Large
switch
statements
use
jump
tables
Sparse
switch
statements
may
use
decision
trees
(if-elseif-elseif-else)
41
Carnegie Mellon
Summary
Today
Control:
Condi;on
codes
Condi;onal
branches
&
condi;onal
moves
Loops
Switch
statements
Next
Time
Stack
Call
/
return
Procedure
call
discipline
42