Code Generation/Exercise 13

From Wiki**3

< Code Generation

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 ao código C++ é o seguinte (agradece-se a comunicação de questões relativas a este código).

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 -4
LDINT ; i

LOCAL +8
LDINT ; v
JZ op3else
INT 8192 ; sizeof(g)
INT 8
DIV
JMP op3end
LABEL op3else
INT 0
LABEL op2end

LT ; i < ...

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 8

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 8

LABEL ifend

LABEL forincr

LOCAL -4
LDINT ; i
DUP32
INT 1
ADD
LOCAL -4
STINT ; i++
TRASH 4

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