06 Loops

background image

University  of  Washington  

Compiling  Loops  

¢

How  to  compile  other  loops  should  be  straigh<orward  

§

The  only  slightly  tricky  part  is  to  be  sure  where  the  condi6onal  branch  

occurs:  top  or  bo8om  of  the  loop  

¢

How  would  for(i=0;  i<100;  i++)  be  implemented?  

while ( sum != 0 ) {

<loop body>
}

loopTop: cmpl $0, %eax

je loopDone

<loop body code>

jmp loopTop
loopDone:

Machine  code:  

C/Java  code:  

x86  

background image

University  of  Washington  

C  Code  

 

int fact_do(int x)
{
int result = 1;
do {
result *= x;
x = x-1;
} while (x > 1);
return result;
}

Goto  Version  

 

int fact_goto(int x)
{
int result = 1;
loop:

result *= x;
x = x-1;
if (x > 1) goto loop
;
return result;
}

“Do-­‐While”  Loop  Example  

¢

Use  backward  branch  to  conUnue  looping  

¢

Only  take  branch  when  “while”  condiUon  holds  

x86  

background image

University  of  Washington  

Goto  Version  

int
fact_goto(int x)
{
int result = 1;


loop:

result *= x;
x = x-1;
if (x > 1)
goto loop
;

return result;
}

“Do-­‐While”  Loop  CompilaUon  

Registers:  

%edx

x

%eax

result

fact_goto:

pushl %ebp

# Setup

movl %esp,%ebp

# Setup

movl $1,%eax

# eax = 1

movl 8(%ebp),%edx

# edx = x


.L11:

imull %edx,%eax

# result *= x

decl %edx

# x--

cmpl $1,%edx

# Compare x : 1

jg .L11

# if > goto loop

movl %ebp,%esp

# Finish

popl %ebp

# Finish

ret

# Finish

Assembly  

 

x86  

background image

University  of  Washington  

C  Code  

do
Body  
while (Test);

Goto  Version  

loop:
Body  
if (Test)
goto loop

General  “Do-­‐While”  TranslaUon  

¢

Body:  

 
 
 

 

¢

Test  returns  integer  

=  0  interpreted  as  false

   

≠  0  interpreted  as  true  

{
Statement

1

;  

Statement

2

;  

…  
Statement

n

;  

}

x86  

background image

University  of  Washington  

C  Code  

 

int fact_while(int x)
{
int result = 1;
while (x > 1) {
result *= x;
x = x-1;
};
return result;
}

Goto  Version  

int fact_while_goto(int x)
{
int result = 1;
goto middle
;
loop:
result *= x;
x = x-1;
middle:
if (x > 1)
goto loop
;
return result;
}

“While”  Loop  TranslaUon  

¢

Used  by  GCC  for  both  IA32  &  x86-­‐64  

¢

First  iteraUon  jumps  over  body  computaUon  within  loop  straight  to  test  

x86  

background image

University  of  Washington  

int fact_while(int x)
{
int result = 1;
while (x > 1) {
result *= x;
x--;
};
return result;
}

# x in %edx, result in %eax
jmp .L34 # goto Middle
.L35: # Loop:
imull %edx, %eax # result *= x
decl %edx # x--
.L34: # Middle:
cmpl $1, %edx # x:1
jg .L35 # if >, goto
# Loop

“While”  Loop  Example  

x86  

background image

University  of  Washington  

“For”  Loop  Example:  Square-­‐and-­‐MulUply  

¢

Algorithm  

§

Exploit  bit  representa6on:  p = p

0

+ 2p

1

+ 2

2

p

2

+ … 2

n–1

p

n–1

 

§

Gives:  x

p

= z

0

· z

1

2

· (z

2

2

)

2

· … · (…((z

n –1

2

)

2

)…)

2

z

i

= 1

   when  p

i

= 0

z

i

= x

when  p

i

= 1

 

§

Complexity  O(log p)

/* Compute x raised to nonnegative power p */
int ipwr_for(int x, unsigned int p)
{

int result;
for (result = 1; p != 0; p = p>>1) {
if (p & 0x1)
result *= x;
x = x*x;

}

return result;

}

n–1    Umes  

Example  
3

10

 =  3

2

 *  3

8  

 =  3

2

 *  ((3

2

)

2

)

2

 

x86  

background image

University  of  Washington  

ipwr  ComputaUon  

/* Compute x raised to nonnegative power p */
int ipwr_for(int x, unsigned int p)
{

int result;
for (result = 1; p != 0; p = p>>1) {
if (p & 0x1)
result *= x;
x = x*x;
}
return result;

}

before  iteraUon  

result

x=3

p=10

1  

1

3

10=1010

2

2  

1

9

5= 101

2

3  

9

81

2= 10

2

4  

9

6561

1= 1

2

5  

59049

43046721

0

2

x86  

background image

University  of  Washington  

“For”  Loop  Example  

for (Init; Test; Update)
Body  

int result;
for (result = 1; p != 0; p = p>>1)
{
if (p & 0x1)
result *= x;
x = x*x;
}

General  Form  

 

Init  

result = 1

Test  

p != 0

Update  

p = p >> 1

Body  

{
if (p & 0x1)
result *= x;
x = x*x;
}

x86  

background image

University  of  Washington  

“For”  “While”  

for (Init; Test; Update  )

Body  

Init;
while (Test  
) {
Body  
Update  ;  
}

Init;
goto middle
;
loop:
Body

Update  
;
middle:
if (Test
)
goto loop
;
done:

While  Version  

 

For  Version  

 

Goto  Version  

 

x86  

background image

University  of  Washington  

For-­‐Loop:  CompilaUon  

for (Init; Test; Update  )

Body  

Init;
goto middle
;
loop:
Body

Update  
;
middle:
if (Test
)
goto loop
;
done:

For  Version  

 

Goto  Version  

 

for (result = 1; p != 0; p = p>>1)
{
if (p & 0x1)
result *= x;
x = x*x;
}

result = 1;
goto middle
;
loop
:
if (p & 0x1)
result *= x;
x = x*x;
p = p >> 1;
middle:
if (p != 0)
goto loop
;
done
:

x86  


Wyszukiwarka

Podobne podstrony:
06 Loops
MT st w 06
Kosci, kregoslup 28[1][1][1] 10 06 dla studentow
06 Kwestia potencjalności Aid 6191 ppt
06 Podstawy syntezy polimerówid 6357 ppt
06
06 Psych zaburz z somatoformiczne i dysocjacyjne
GbpUsd analysis for July 06 Part 1
Probl inter i kard 06'03
06 K6Z4
06 pamięć proceduralna schematy, skrypty, ramyid 6150 ppt
Sys Inf 03 Manning w 06
Ustawa z dnia 25 06 1999 r o świadcz pien z ubezp społ w razie choroby i macierz
06 ZPIU org prod

więcej podobnych podstron