Professional Documents
Culture Documents
Short 06 Machine Control Part2.1
Short 06 Machine Control Part2.1
Short 06 Machine Control Part2.1
1
Today
⬛ Control: Condition codes
⬛ Conditional branches
⬛ Loops
⬛ Switch Statements
Label_1:
x = x + 1;
goto Label_2; • Indicates a location in the
x = x - 1; code (line number)
Label_2: • Not a statement
y = y + 1;
goto Label_1;
y = y - 1;
}
Practice
C Code Goto Version
long inc() long inc_goto()
{ {
long x = 0; long x = 0;
do { loop:
x += 1; x += 1;
} while (x < 100); if(x < 100) goto loop;
return x; return x;
} }
While version
while (Test)
Any ideas?
Body
⬛ “Jump-to-middle” translation
⬛ Used with -Og Goto Version
goto test;
loop:
While version Body
while (Test) test:
Body if (Test)
goto loop;
done:
10
11
Goto Version
Do-While Version if (!Test)
if (!Test) goto done;
goto done; loop:
do Body
Body if (Test)
while(Test); goto loop;
done: done:
12
13
15
While Version
Init;
while (Test ) {
Body
Update;
} 16
For-While Conversion
long pcount_for_while
Init (unsigned long x)
{
i = 0 size_t i;
long result = 0;
Test i = 0;
i < WSIZE while (i < WSIZE)
{
unsigned bit =
Update (x >> i) & 0x1;
result += bit;
i++
i++;
}
Body return result;
{ }
unsigned bit =
(x >> i) & 0x1;
result += bit;
}
17
Practice
⬛ Write the goto version
For-loop Version
int reduce(int *A, int size)
{
int i;
int result = 0;
return result;
}
18
Practice
⬛ Write the goto version
19
Practice
⬛ Write the goto version
While Version Do-While Version
int reduce(int *A, int size) int reduce(int *A, int size)
{ {
int i; int i;
int result = 0; int result = 0;
i = 0; i = 0;
if !(i < size) goto done;
while (i < size) do
{ {
result += A[i]; result += A[i];
i++; i++;
} } while (i < size)
done:
return result; return result;
} }
20
Practice
⬛ Write the goto version
Do-While Version GoTo Version
int reduce(int *A, int size) int reduce(int *A, int size)
{ {
int i; int i;
int result = 0; int result = 0;
i = 0; i = 0;
if !(i < size) goto done; if !(i < size) goto done;
do Loop
{ {
result += A[i]; result += A[i];
i++; i++;
} while (i < size) } if (i < size) goto Loop;
done: done:
return result; return result;
} }
21