(Created page with "{{TOCright}} == Problema == Considere a seguinte função em C: # Que optimizações independentes da máquina são possíveis? # Traduza-a para Postfix optimizado. <source...") |
|||
Line 23: | Line 23: | ||
{{CollapsedCode|Código Postfix| | {{CollapsedCode|Código Postfix| | ||
<source lang="asm"> | <source lang="asm"> | ||
+ | ;; BB1 START | ||
+ | TEXT | ||
+ | ALIGN | ||
+ | GLOBAL fun, FUNC | ||
+ | LABEL fun | ||
+ | ENTER 12 ; c@-4 i@-8 j@-12 a@+8 b@+12 | ||
+ | INT 160 | ||
+ | INT 4 | ||
+ | MUL | ||
+ | CALL malloc | ||
+ | ;; BB1 END | ||
+ | |||
+ | ;; BB2 START | ||
+ | TRASH 4 | ||
+ | LDFVAL32 ; malloc result (no conversion necessary) | ||
+ | LOCAL -4 ; &c | ||
+ | STINT ; c = ... | ||
+ | |||
+ | INT 0 | ||
+ | DUP32 | ||
+ | LOCAL -12 ; &j | ||
+ | STINT ; j = 0 | ||
+ | TRASH 4 | ||
+ | ;; BB2 END | ||
+ | |||
+ | ;; BB3 START | ||
+ | ALIGN | ||
+ | LABEL for1test | ||
+ | |||
+ | LOCAL -12 | ||
+ | LDINT ; j | ||
+ | INT 40 | ||
+ | LT ; j < 40 | ||
+ | JZ for1end | ||
+ | ;; BB3 END | ||
+ | |||
+ | ;; BB4 START | ||
+ | INT 0 | ||
+ | DUP32 | ||
+ | LOCAL -8 ; &i | ||
+ | STINT ; i = 0 | ||
+ | TRASH 4 | ||
+ | ;; BB4 END | ||
+ | |||
+ | ;; BB5 START | ||
+ | ALIGN | ||
+ | LABEL for2test | ||
+ | |||
+ | LOCAL -8 | ||
+ | LDINT ; i | ||
+ | INT 4 | ||
+ | LT ; i < 4 | ||
+ | JZ for2end | ||
+ | ;; BB5 END | ||
+ | |||
+ | ;; BB6 START | ||
+ | LOCAL +8 | ||
+ | LDINT ; a | ||
+ | |||
+ | LOCAL -8 | ||
+ | LDINT ; i | ||
+ | LOCAL -12 | ||
+ | LDINT ; j | ||
+ | INT 4 | ||
+ | MUL | ||
+ | ADD ; i+j*4 | ||
+ | |||
+ | INT 8 ; sizeof(double) | ||
+ | MUL | ||
+ | ADD ; &a[...] | ||
+ | LDDOUBLE ; a[...] | ||
+ | |||
+ | LOCAL +12 | ||
+ | LDINT ; b | ||
+ | |||
+ | LOCAL -8 | ||
+ | LDINT ; i | ||
+ | INT 40 | ||
+ | MUL | ||
+ | LOCAL -12 | ||
+ | LDINT ; j | ||
+ | ADD ; i*40+j | ||
+ | |||
+ | INT 8 ; sizeof(double) | ||
+ | MUL | ||
+ | ADD ; &b[...] | ||
+ | LDDOUBLE ; b[...] | ||
+ | |||
+ | DADD | ||
+ | |||
+ | INT 100 | ||
+ | LOCAL -12 | ||
+ | LDINT ; j | ||
+ | MUL ; 100*j | ||
+ | I2D | ||
+ | |||
+ | DADD | ||
+ | DUP64 | ||
+ | |||
+ | LOCAL -4 | ||
+ | LDINT ; c | ||
+ | |||
+ | LOCAL -8 | ||
+ | LDINT ; i | ||
+ | LOCAL -12 | ||
+ | LDINT ; j | ||
+ | INT 4 | ||
+ | MUL | ||
+ | ADD ; i+j*4 | ||
+ | |||
+ | INT 8 ; sizeof(double) | ||
+ | MUL | ||
+ | ADD ; &c[...] | ||
+ | |||
+ | STDOUBLE | ||
+ | TRASH 8 | ||
+ | ;; BB6 END | ||
+ | |||
+ | ;; BB7 START | ||
+ | ALIGN | ||
+ | LABEL for2incr | ||
+ | |||
+ | LOCAL -8 | ||
+ | LDINT | ||
+ | INT 1 | ||
+ | ADD | ||
+ | DUP32 | ||
+ | LOCAL -8 | ||
+ | STINT ; ++i | ||
+ | TRASH 4 | ||
+ | |||
+ | JMP for2test | ||
+ | ;; BB7 END | ||
+ | |||
+ | ;; BB8 START | ||
+ | ALIGN | ||
+ | LABEL for2end | ||
+ | |||
+ | ALIGN | ||
+ | LABEL for1incr | ||
+ | |||
+ | LOCAL -12 | ||
+ | LDINT | ||
+ | INT 1 | ||
+ | ADD | ||
+ | DUP32 | ||
+ | LOCAL -12 | ||
+ | STINT ; ++j | ||
+ | TRASH 4 | ||
+ | |||
+ | JMP for1test | ||
+ | ;; BB8 END | ||
+ | |||
+ | ;; BB9 START | ||
+ | ALIGN | ||
+ | LABEL for1end | ||
+ | |||
+ | LOCAL -4 | ||
+ | LDINT ; c | ||
+ | STFVAL32 | ||
+ | LEAVE | ||
+ | RET | ||
+ | ;; BB9 END | ||
</source> | </source> | ||
}} | }} |
Considere a seguinte função em C:
double *fun(double *a, double *b) {
double *c = (double *)malloc(160 * 4);
int i, j;
for (j = 0; j < 40; ++j)
for (i = 0; i < 4; ++i)
c[i+j*4] = a[i+j*4] + b[i*40+j] + 100*j;
return c;
}
O código Postfix correspondente ao código C é o seguinte (agradece-se a comunicação de questões relativas a este código).
[Expand] Código Postfix |
---|
Para compilar o código Postfix directamente, pode ser utilizada a ferramenta pf2asm (assumindo uma arquitectura Intel de 32 bits -- ix86):
pf2asm code.pf yasm -felf32 code.asm