Problema
Considere o seguinte código C++ (assuma que ponteiros e int ocupam 32 bits e que double ocupa 64 bits).
double g[1024];
double *repeat(double *v) {
for (int i = 0; i < (v ? sizeof(g) / 8 : 0); i++) {
if (v[i] > 2 * i) v[i] = i;
else v[i] = 0;
}
return v;
}
Código Postfix (não optimizado)
O código Postfix correspondente às funções é o seguinte (agradece-se a comunicação de questões relativas a este código).
No código Postfix, BB# significa "bloco básico número".
[Expand] Código Postfix
|
BSS
ALIGN
GLOBAL g, OBJ
LABEL g
SALLOC 8192
TEXT
ALIGN
GLOBAL repeat, FUNC
LABEL repeat
ENTER 4 ; i@-4 v@+8
INT 0
LOCAL -4
STINT
LABEL fortest
LOCAL +8
LDINT ; v
JZ op3else
INT 8192 ; sizeof(g)
INT 8
DIV
JMP op3end
LABEL op3else
INT 0
LABEL op2end
JZ forend
LOCAL +8
LDINT
LOCAL -4
LDINT
INT 8
MUL
ADD
LDDOUBLE ; v[i]
INT 2
LOCAL -4
LDINT
MUL
I2D ; 2*i
DCMP
INT 0
GT ; v[i] > 2*i
JZ ifelse
LOCAL -4
LDINT ; i
I2D
DUP64
LOCAL +8
LDINT
LOCAL -4
LDINT
INT 8
MUL
ADD ; &v[i]
STDOUBLE ; v[i] = 2*i
TRASH 64
JMP ifend
LABEL ifelse
INT 0
I2D
DUP64
LOCAL +8
LDINT
LOCAL -4
LDINT
INT 8
MUL
ADD ; &v[i]
STDOUBLE ; v[i] = 0
TRASH 64
LABEL ifend
LABEL forincr
LOCAL -4
LDINT ; i
DUP32
INT 1
ADD
LOCAL -4
STINT ; i++
TRASH 64
JMP fortest
LABEL forend
LOCAL +8
LDINT ; v
STFVAL32
LEAVE
RET
|
Compiling and Running
Para compilar o código Postfix directamente, pode ser utilizada a ferramenta pf2asm (assumindo uma arquitectura de 32 bits):
pf2asm code.pf
yasm -felf32 code.asm