Optimization Topics/Exercise 08: Difference between revisions
From Wiki**3
No edit summary |
|||
| Line 6: | Line 6: | ||
# Traduza-a para Postfix optimizado. | # Traduza-a para Postfix optimizado. | ||
< | <syntaxhighlight lang="c"> | ||
double *fun(double *a, double *b) { | double *fun(double *a, double *b) { | ||
double *c = (double *)malloc(2 * 8); | double *c = (double *)malloc(2 * 8); | ||
| Line 14: | Line 14: | ||
return c; | return c; | ||
} | } | ||
</ | </syntaxhighlight> | ||
== Código Postfix (não optimizado) == | == Código Postfix (não optimizado) == | ||
| Line 21: | Line 21: | ||
{{CollapsedCode|Código Postfix| | {{CollapsedCode|Código Postfix| | ||
< | <syntaxhighlight lang="asm"> | ||
;; BB1 START | ;; BB1 START | ||
TEXT | TEXT | ||
| Line 134: | Line 134: | ||
LOCAL -4 | LOCAL -4 | ||
LDINT | LDINT | ||
STFVAL32I | |||
LEAVE | LEAVE | ||
RET | RET | ||
;; BB9 END | ;; BB9 END | ||
</ | </syntaxhighlight> | ||
}} | }} | ||
Revision as of 21:05, 1 June 2026
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(2 * 8);
int i;
for (i = 0; i < (len < 2 ? len : 2); i++)
c[i] = a[i] + b[i];
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 8 ; c@-4 i@-8 a@+8 b@+12 len@+16
INT 2
INT 8
MUL
CALL malloc
;; BB1 END
;; BB2 START
TRASH 4
LDFVAL32 ; malloc result (no conversion necessary)
LOCAL -4 ; &c
STINT ; c = ...
INT 0
DUP32
LOCAL -8 ; &i
STINT
TRASH 4
;; BB2 END
;; BB3 START
ALIGN
LABEL fortest
LOCAL +16
LDINT ; len
INT 2
LT
JZ op3else
;; BB3 END
;; BB4 START
LOCAL +16
LDINT ; len
JMP op3end
;; BB4 END
;; BB5 START
ALIGN
LABEL op3else
INT 2
;; BB5 END
;; BB6 START
ALIGN
LABEL op3end
LT
JZ forend
;; BB6 END
;; BB7 START
LOCAL +8
LDINT ; a
LOCAL -8
LDINT ; i
INT 8 ; sizeof(double)
MUL
ADD ; &a[i]
LDDOUBLE ; a[i]
LOCAL +12
LDINT ; b
LOCAL -8
LDINT ; i
INT 8 ; sizeof(double)
MUL
ADD ; &b[i]
LDDOUBLE ; b[i]
DADD ; a[i] + b[i]
DUP64
LOCAL -4
LDINT ; c
LOCAL -8
LDINT ; i
INT 8 ; sizeof(double)
MUL
ADD ; &c[i]
STDOUBLE
TRASH 8
;; BB7 END
;; BB8 START
ALIGN
LABEL forincr
LOCAL -8
LDINT ; i
DUP32
INT 1
ADD
LOCAL -8
STINT
TRASH 4
JMP fortest
;; BB8 END
;; BB9 START
ALIGN
LABEL forend
LOCAL -4
LDINT
STFVAL32I
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