Optimization Topics/Exercise 09: Difference between revisions
From Wiki**3
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..." |
No edit summary |
||
| 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> | ||
}} | }} | ||
Latest revision as of 14:05, 12 June 2023
Problema
Considere a seguinte função em C:
- Que optimizações independentes da máquina são possíveis?
- Traduza-a para Postfix optimizado.
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;
}
Código Postfix (não optimizado)
O código Postfix correspondente ao código C é o seguinte (agradece-se a comunicação de questões relativas a este código).
| Código Postfix |
|---|
;; 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
|
Compiling and Running
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